Buri Memo:

アイデアや気づきとかが雑に書き殴られる

非同期なオンライン上で安全に振れる冪等なサイコロを作ってみた

idempotent dice の画面

非同期なオンラインで平等に当番を決めたいというときありませんか?

リモートワークで面倒だけどやらないといけない単純作業が発生した際に、最初に気づいた人がやるのだと偏りが出て不平等じゃない?という声があってサイコロを降ってみたらどうか?となった。

オンラインの場合は適当なサイコロを振るサイトを開いて結果をスクショすれば十分ではあるが、プログラマーというものそんなの何回も振り直せばインチキができるじゃないかという発想になる。(別に同僚を信頼してないわけじゃないんだけども)

そうであれば非同期でもオンライン上でもインチキができない仕組みのサイコロを用意すればいいじゃない。ということで生まれたのがハッシュ関数を利用した冪等なサイコロ Idempotent Dice である。1

idempotent-dice.burion.net

使い方はシンプル。Choices にメンバーの名前を入れて、Entropy には「当番が必要になったきっかけのイベント」の情報を入れてボタンを押すだけ。Entropy に入れる情報は、例えば slack や GitHub の URL、メッセージの送信時刻など何でもよく、改ざんが難しい程よい。これだけでオンラインでも平等にサイコロを振ることが可能になる。他のメンバーは結果の Entropy が適切であることをレビューすることで、ダイスロールの正当性が保証される。

Choices の順番を変更することで結果を操作するという攻撃も考えられる。そこで簡易的な checksum を導入した。順番を入れ替えた際には checksum が変わるためここの数字を見ておくことで不正に気づくことができる。2

選択肢を入れ替えると checksum が変わる

非同期・ダイスロール・プロトコル

この Idenpotent Dice を利用したオンライン上での正しいサイコロの振り方は以下のような流れになる。この手続きを踏むことによってオンライン上で平等にサイコロを振ることができる。

  1. Choices にメンバー全員の名前を入れて「Roll Dice」をクリックする
  2. checksum を各自メモを取る
  3. Entropy に入力する、イベント識別子を決め同意する。この説明では例として「メッセージの送信時刻」を用いる。
    • 全員が確認可能で、改ざんの難易度が高いものであればあるほど望ましい
  4. YYYY-MM-DD HH:MM:SS に slack 上で何かサイコロを振りたいイベントを発生させるメッセージが投稿された
  5. Entropy にイベント識別子 YYYY-MM-DD HH:MM:SS を入れ「Roll Dice」をクリックする
  6. 結果の URL を slack 上で共有する
  7. 他のメンバーは URL を開いて、 Entropy が適切かつ checksum が正しいことを確認する
  8. 問題ない場合はその結果は正当なものとする。誤りがある場合はダイスの振り直しを要求できる。


  1. オフラインであればみんなが集まってサイコロ振ればいいのでこんなもんいらない
  2. チェックサムは0~9999(1万通り)しかないため大量に試行が可能な場合攻撃に気づけない可能性がある。選択肢を多くするほど攻撃の難易度が下がっていくため注意が必要です。