QOMM: 依頼を見ない見積市場
依頼も、値付け規則も、市場の様子も明かさずに見積を出す。16 社のメイカーの値付け規則を、誰も見ない依頼に対して適用する。それを行うのは、honest majority(過半数は正直)を仮定する 7 ノードの秘密計算である。開かれるのはキー(比較に使う値)一つだけ、つまり勝者とその commitment 済みの価格である。それが提示された中の最小値だったことは、あとから誰でも検証できる。
出典: qomm/README.md, AUDIT.md, DEPLOYMENT.md, BINDING.md, POSITION.md · MP-SPDZ malicious-shamir, N=7, T=2
取り除く問題
ある投資家が 1 万株を売りたくて、16 社のマーケットメイカーに価格を尋ねる。15 社は負ける。しかし負けた 15 社も、誰が、何を、どちら向きに、どれだけ、いつ欲しがったかを知ってしまう。これは実装の欠陥ではない。尋ねることが教えることになる仕組みでは、価格を尋ねるだけでこの代価を払う。QOMM では、尋ねても教えることにならない。
何をするか
flowchart TB
U["利用者の依頼
銘柄、数量、売買の向き"]
subgraph transport["一定間隔、加法シェア、中継段"]
REL["全利用者が毎スロット同じバイト列を送る
依頼の有無にかかわらず"]
end
subgraph mpc["計算ノード 7 台、malicious 安全な Shamir"]
direction TB
PRICE["全メイカーの値付けを同時に行う
回路の幅で済み、追加コストはない"]
GATE["資格判定
比較 1 層"]
TOUR["二分トーナメント
比較 log2(M) 層"]
PRICE --> GATE --> TOUR
end
OUT["開かれるキーは一つ:
勝った価格と勝者"]
U --> REL --> PRICE
TOUR --> OUT
NOTE["痕跡は同一
誰かが依頼したかどうかにかかわらず"]
REL -.- NOTE
mpc -.- NOTE
classDef secret stroke:#f2b880,stroke-width:2px
classDef mech stroke:#9bb0ff,stroke-width:2px
classDef ok stroke:#5ee0c1,stroke-width:2px
class U,REL secret
class PRICE,GATE,TOUR mech
class OUT ok
転送
注文があってもなくても、毎スロット、各ノードへ同じ長さのメッセージを一通送る。必要なときだけ発言する設計では、発言そのものが「依頼があった」という告知になるからである。依頼は端末を出る前に、ノードごとの加法シェアに分割される。シェア一つだけを見ても、一様な雑音にしか見えない。中継段はスロットの境界まで保持してから順序を混ぜる。回路の中では秘密の is_real ビットが、メイカーの状態を動かすかどうかだけを決める。実際の依頼があるスロットと、見せかけのスロットは、ラウンド数(286)も参加者あたりのバイト数(22.2045 MB)も同一である。壁時計時間の差は 0.01 s で、繰り返し計測のばらつき 0.085 s の内側にある。
値付け規則
メイカーの規則は小さな式言語で書く。検査器はその規則から、回路に必要なビット幅、出力範囲が有界であること、監査上の義務を、証明なしに導く。その上で MP-SPDZ コンパイラ向けの .mpc プログラムを生成する。qomm-mpc crate はエンジンをリンクし、自身のカウンタを読む。だからラウンド数は推定ではなく、通信チャネルごとの内訳として得られる。
監査
quote proof(qomm-proofs/src/quote_proof.rs)は、Baum–Damgård–Orlandi の構成を具体化したものである。入力を提供する者は Pedersen commitment を公開する。SPDZ のオンライン段階は線形演算だけなので、監査人はそれを commitment の上で再生できる。監査するのは「回路が正しく評価された」ことではなく、市場についての言明である。すなわち、各メイカー i について key_i は commitment 済みの規則を commitment 済みの依頼に適用した値であり、開かれた勝者はそれらのキーの最小値である。最小であることと、その中の一つであることが合わされば、それが最良執行である。メイカー 4 社で証明 152 ms、検証 173 ms。8 社で 307 と 350。
C_winner − g·value について、値が 0 であることを固定した開封証明を検査する。詳細は暗号技術の使い方と現状ページにある。ノードの不正は受領証で捕まえる。各ノードは毎スロット一通の受領証を出すので、「応答しなかった」ことを第三者に示せる。7 ノード、6 スロットにわたる障害注入では、二重の発言(equivocation)、メイカーの脱落、古い状態、受領証の欠落を捕捉した。取り逃がしはゼロ、正直なノードへの誤った告発もゼロだった。罰として没収する預り金は、障害の性質に応じて決めた。二重署名はそれ自体で証拠として完結するので最も重い。受領証の欠落は正直なノードにも起こるので最も軽い。
監査可能にするコスト
この系統の研究はどれも、結果を検証できるようにするために何かを払っている。それを計測したのは 6 件のうち 2 件だけである。
| 得られるもの | 計測したコスト | |
|---|---|---|
| Rivinius et al. 2022 | 公開検証可能性 + 説明責任 + 頑健性 | 素の SPDZ に対してオンライン段階が 11× から 20× |
| QOMM | 公開検証可能性 | 壁時計時間 1.07×、通信量 2.00×、ラウンド 1.00× |
差が出るのは、監査をどこに取り付けるかである。Rivinius はすべてのワイヤのすべてのシェアに commitment を置く。だから commitment の方式が乗算の内側に入る。ここでは commitment をメイカーの規則に対して置き、機構がその規則に適用されたことを事後に一つの証明で示す。だから MPC はより大きい体で走らせるだけでよい。16 バイトの要素が 32 バイトになり、それが 2.00× のすべてである。Rivinius の構成は責任の特定と頑健性も提供する。こちらは配備しているエンジンではどちらも提供しない。比較にはこの両面を含めるべきである。
ノードをどこに置くかが暗号より大きく効く
ラウンド数は 70 で一定で、メイカー数にも銘柄数にも依存しない。したがって壁時計時間には、最も遅いリンクでの 70 × RTT 分の純粋な待ち時間が含まれる。
| ノード配置(M=16、31 ビット) | 片方向遅延 | 見積 1 件 |
|---|---|---|
| 同一ラック | 0 ms | 0.166 s |
| 同一都市圏 | 1 ms | 0.617 s |
| 国内広域 | 5 ms | 1.619 s |
| 東京・シンガポール間 | 15 ms | 3.876 s |
| 近接 6 台、遠隔 1 台(120 ms) | 120 ms | 22.998 s |
| 全台遠隔(120 ms) | 120 ms | 26.148 s |
artifact(計測の出力ファイル): placement.json, sites.json · 1 台の機械上での遅延の模擬。往復時間は再現するが、ジッタ、損失、クロックのずれは再現しない
7 ノードを一つの都市圏に置くことは、暗号面の改良をどれだけ積み重ねるより 6 倍効く。その一方で共謀の相関を高めるが、これは技術ではなく統治の問題である。妥当に見える妥協案として、近接 6 台と遠隔 1 台がある。しかしこの配置には、7 台すべてを遠隔に置く場合の 86% のコストがかかる。委員会の中で、独立性を 1 台ずつ買い足すことはできない。線形モデルは 120 ms で 18 s と予測したが、実測は 23 s だった。検証済みの距離の 8 倍の地点で、28% の過小予測である。この外れは記録してある。
26 s が問題になるかどうかは別の問いで、UniswapX の約定に照らして答えた。Ethereum の 2 ブロックにまたがる価格の変動(3.6 から 8.6 bp)は、単一ブロックの中で市場が示すばらつき(4.8 から 7.5 bp)と同じ大きさである。26 s かかった見積は、瞬時の見積と区別できない。価格がそこまで精密に定まったことが、そもそもないからである。これは入手できる中で最も厳しい比較対象である。
公開する値には雑音を乗せる
市場が勝った見積を正確な値で公開すると、繰り返しを通じて値付け規則が漏れる。そのため見積は差分プライバシーの予算の下で開示する。本番用の公開経路は、7 つの MP-SPDZ プロセスの中で雑音を引く。そして結果、法人単位の予算の遷移、3-of-7 の証明書を、一つの不可分な操作で束縛する。この機構の雑音は、取りうる値の範囲(support)が有限である。だから自らを純粋な DP と言い換えず、計測した (ε, δ) を明示する(範囲 8 で δ 2.5e-4)。雑音がラウンドの 92.9% を占める。機構なしでは 2 ラウンドと 0.0022 MB、機構ありでは 28 ラウンドと 63.9 MB である。より安い構成も知られている(各参加者が手元で Pólya 分布のシェアを引く。2 ラウンド、標準偏差 1.18×)。これは意図して実装していない。
雑音を乗せないのは、決済済み取引の件数である。これはチェーン上で既に正確に公開されている。秘密なのは依頼の件数である。何も決済しなかった依頼は痕跡を残さない。そしてこの件数は、メイカーが他の手段では得られない分母である。BlockRangeQuery は、ブロック範囲の中の法人の異なり数を、感度 1 で売る。150,000 件の UniswapX 約定では、公開されている約定件数がその R² 0.95 から 0.97 を説明する。残差、つまり注文の流れの集中度こそが、ε で実際に買えるものである。活動量は無料で、集中度が売り物である。
まだ開いている隙間
メイカーは自分の規則を 7 ノードに配るが、自身はその一つではない。転送層は、ノードが commitment 済みのシェアを受け取ったことを証明する。しかしそのシェアをノードが MP-SPDZ に投入したことは、何も証明しない。参加者ごとの入力検査は今では、配られた値と異なる値を投入したノードを、回路の中で名指しする。コストは追加 1 ラウンドと通信量 0.39% 増、健全性は 2⁻²⁴⁵ である。この検査の以前の版は、その証明を書いている途中で健全でないことが分かった。ノードが、自分に読める係数の核の中から誤差を選べたのである。チャレンジは今では入力段階の後に引く。判定は修復ではない。どちらの機構も名指しはするが、防ぐことはしない。安全性のページが、各機構を説明責任の段階の上に位置づけている。
デモは席で分ける
すべてを一画面に映す見せ方では、誰が何を知っているかについて何も主張できない。そこでデモは席を配る。ブラウザ一つが一つの役割を受け持ち、その役割が見るはずのものだけが送られる。開発者コンソールに映るのも、席を持たない人に見えるものと同じである。価格を受け取るのはテイカーの席だけである。メイカーの席は注文を見ることがなく、約定後に自分の約定分だけを受け取る。ノードの席はシェアを持ち、不正もできる。不正したときに何が起きるかは三通りに分かれる。観察者の席はすべてを映すが、これはどの配備にも存在しない眺めであることを毎フレーム表示する。
cargo run -j 4 --release --manifest-path rust/Cargo.toml -p qomm-harness --bin serve_demo
http://<host>:8800/?seat=node:3&label=Rin
http://<host>:8800/?seat=maker:1&label=Ann
http://<host>:8800/?seat=observer
QOMM が主張しないこと
- Prime Match より速いとは言わない。見積 1 件は RTT 15 ms で 3.6 s、大陸間では 23 s(メイカー 16 社、4 銘柄)。Prime Match は J.P. Morgan で 30 分ごとに動き、semi-honest(手順は守るが中身は覗く)なハブを持つ。単位が異なるので、比を一つの数字に縮めるべきではない。しかしどう読んでも、ここに速いものはない。
- MPC を公開監査可能にしたのは QOMM ではない。Baum、Damgård、Orlandi が 2014 年に行った。ここでは彼らの構成を具体化している。
- プライバシーは 3 ノードの共謀に耐えない。quote proof の正しさは、7 ノードすべてが共謀しても保たれる。
- 7 拠点での配備は一度も行っていない。地域間の数値は、1 台の機械上で遅延を模擬したものである。
- 古さ(staleness)の計測には選択の偏りがある。UniswapX の約定は、成立した取引だけを含むからである。
仕組みの詳細は監査のページ、体の問題は束縛のページ、何を選ぶかは配置のページにある。
技術スライドから実装へ
37項目の暗号技術カタログで用途・数式・証明者・制約を確認し、予約から決済・回収までで状態遷移をたどれます。暫定結果とchallengeは、両デモの検証方式とnative決済の境界を説明します。