本文へ移動

Streaming Yao A/B

ロールを分割したEd25519の導出と署名に使う、承認済みStreaming Yaoライフサイクルを理解します。

Streaming Yao A/B ​

Streaming Yaoは、Router A/Bで承認されたEd25519のライフサイクルプロトコルです。 Deriver Aは、固定回路を暗号化テーブルへ符号化します。この処理をガーブリングと呼びます。 Deriver Bは、そのテーブルを評価します。回路は、標準鍵エクスポートに対応するEd25519導出を計算します。 どちらのDeriverも、完全なシード、スカラー、署名出力を知りません。

構成は、分離したDeriverロールでfree-XOR/half-gatesを使います。 現在の安全性の保証は、正しい実行を仮定し、参加者による中止を許容します。 共有Cloudflareアカウントのコントロールプレーンが正常である間、ロールの分離を維持します。 より強い能動的安全性と独立管理のDeriverアカウント構成は延期中です。 デプロイ済みベンチマークは、これらを保証しません。

ホスト構成は、WorkersとDurable Objects内で、WebAssemblyにコンパイルしたRust計算を実行します。 以下の7月のWorker・WebSocket計測は、過去の実装ベンチマークです。 値はWorker時計の差分であり、そのWorker自身のCPU時間を含みません。 実際の手順の所要時間、現在のウォレット全体の遅延、費用を示すものではありません。

Yaoを実行する操作 ​

Yaoは、Ed25519素材を作成、再現、再分配、エクスポートする、低頻度のライフサイクル手順で実行します。

操作Yaoを使うか理由
登録と初回の有効化はい本来のEd25519識別情報用に、クライアントとSigningWorkerのシェアを作る。
新しいデバイス・認証情報への復元はい登録済み公開鍵を維持し、受信者用シェアを再作成する。
署名シェア・SigningWorkerの更新はい新しい有効化エポックで、受信者用シェアを新たに生成する。
明示的な鍵エクスポートはい新たなエクスポート承認後、マスクしたシードシェアを解放する。
新しい署名レーンを用意するデバイス連携はい新しい受信者用の署名シェアを作る。
既存の封印済み素材を承認するだけのデバイス連携いいえ導出や再分配を行わない。
トランザクション、メッセージ、委任アクションの署名いいえ有効化済みしきい値シェアを使う。
ECDSAのライフサイクルまたは署名いいえ別の厳密なRouter A/Bしきい値PRF・加算シェアのプロトコルを使う。

委任アクションは通常の署名です。新しい委任署名レーンの準備は、ライフサイクルの手順です。 この違いが、Yaoの実行有無を決めます。

ライフサイクルのフロー ​

mermaid
flowchart TD
  Start["登録、復元、更新、<br/>シェアの準備、エクスポート"]
  Client["クライアントが入力を分割し<br/>小さなA/B HPKEエンベロープを作成"]
  Router["Routerが認証・承認し<br/>レート制限とリプレイ対策を適用"]
  A["Deriver A<br/>固定のガーブリング担当"]
  B["Deriver B<br/>固定の評価担当"]
  Stream["OTと制御<br/>認証付き回路チャンクを送信"]
  Output["AとBが個別に<br/>受信者宛て暗号化出力シェアを作成"]
  Verify["受信者が秘密シェア、公開関係、<br/>トランスクリプト記録を検証"]
  Activate["SigningWorkerが<br/>サーバー署名素材を有効化"]
  Ready["Ed25519レーンが署名準備完了"]

  Start --> Client --> Router
  Router --> A
  Router --> B
  A --> Stream
  B --> Stream
  Stream --> Output --> Verify
  Output --> Activate
  Verify --> Ready
  Activate --> Ready

大きなガーブルド回路ストリームは、AとB間を直接流れます。 クライアントとRouterが交換する要求と暗号化出力パッケージは、MiBではなくKiB単位の小さなものです。

サーバー側の処理順序 ​

mermaid
sequenceDiagram
  participant C as クライアント
  participant R as Router
  participant A as Deriver A / ガーブリング担当
  participant B as Deriver B / 評価担当
  participant SW as SigningWorker

  C->>R: ライフサイクル要求と小さなA/B HPKEエンベロープ
  par ロールへ並行して配送
    R->>A: Aのエンベロープと紐づく公開コンテキスト
  and
    R->>B: Bのエンベロープと紐づく公開コンテキスト
  end
  A->>B: 対になる1回限りのチケットを予約
  B-->>A: 予約の確認
  A->>B: OT、コミットメント、制御
  B-->>A: プロトコルの応答
  A->>B: 認証付きガーブルド回路チャンクを送信
  Note over A,B: Bは段階的に認証・評価<br/>Aはバックプレッシャーに従って生成
  B-->>A: Bのダイジェストと不透明なA出力ラベル
  A->>B: 出力パッケージ全体の署名済みダイジェスト集合
  B-->>A: 共同署名した最終記録
  par 受信者用パッケージの配送
    A-->>R: 暗号化Aパッケージと公開記録
  and
    B-->>R: 暗号化Bパッケージと公開記録
  end
  opt 有効化またはシェアの準備
    R->>SW: サーバー受信者用パッケージ一式
    SW-->>R: 有効化の記録
  end
  R-->>C: クライアント受信者用パッケージと最終記録

正確なA/Bリクエストのグラフは、選択したプロトコルアセットで固定します。 設計目標はA/B間1往復で、直列の2~4往復を許容します。 回路チャンクは1つのストリーミング要求に属し、チャンクごとに往復を増やしません。

クライアントから見ると、通常、1回のYao手順はRouterとの1往復に収まります。 非同期のデプロイでは、手順のハンドルを返し、認証付きポーリングを使えます。 製品の操作全体には、独立した認証、復元、有効化の段階も含む場合があります。

通常署名のフロー ​

Ed25519の通常署名は、Yao処理もDeriver呼び出しも行いません。

mermaid
sequenceDiagram
  participant C as クライアント
  participant R as Router
  participant SW as SigningWorker

  alt 事前署名プールに該当あり
    C->>R: POST /router-ab/ed25519/sign
    R->>SW: 受付済みの非公開署名要求
    SW-->>R: しきい値署名の応答
    R-->>C: 署名
  else 事前署名プールに該当なし
    C->>R: POST /router-ab/ed25519/sign/prepare
    R->>SW: 署名状態を予約
    SW-->>R: 準備の応答
    R-->>C: 紐づけ済みの準備応答
    C->>R: POST /router-ab/ed25519/sign
    R->>SW: 受付済みの最終処理要求
    SW-->>R: しきい値署名の応答
    R-->>C: 署名
  end
フロークライアントとRouterRouterとSigningWorkerA/BYao
Ed25519のライフサイクル手順通常1往復必要な場合、有効化に1回目標1、許容2~4あり
Ed25519署名、プールに該当あり1往復1往復0なし
Ed25519署名、プールに該当なし2往復2往復0なし
バックグラウンドの事前署名補充ユーザー操作の往復なしバックグラウンド処理0なし

計算と組み込みクライアント ​

Streaming Yaoは、AとBで計算量の多い処理を行います。 主な処理は、固定回路上の共通鍵ハッシュ、XOR、紛失通信(OT)、トランスクリプトの確認です。 ストリーミングは、ピークメモリーを制御し、ガーブリング、転送、評価を並行できます。 暗号処理の総量は減りません。

3段階を並行させると、実時間は次の値に近づきます。

text
max(ガーブリングのCPU時間、転送時間、評価のCPU時間)+ プロトコルの往復時間

Cloudflareでは、この式が成り立つのは、コミット6ec1c61d(2026年10月12日)以降のDeriver Aビルドだけです。 Worker WebSocketは、イベントループが進むまでメッセージをキューに保持します。 7月のベンチマークペアを含む以前のWebSocketビルドでは、Aが初めて待機する前に、全テーブルフレームを生成・キュー登録していました。 Bの評価は、ガーブリング完了後に始まりました。段階は直列に動き、実時間は次の値に近くなりました。

text
ガーブリングのCPU時間 + 評価のCPU時間 + プロトコルの往復時間

このコミット以降、Aは各テーブルフレームの後にイベントループを1回進めます。 次のフレームを生成する前に、現在のフレームを送信します。 プロトコルのメッセージ、順序、バイト列は同じです。

クライアントの処理量は、より小さくなります。

  1. 小さな入力を分割する。
  2. ハイブリッド公開鍵暗号(HPKE)のエンベロープを2つ作る。
  3. 小さな受信者パッケージを開く。
  4. コミットメントと公開鍵を検証する。
  5. 得られた署名素材を保存する。

クライアントは、回路の生成・評価、OT、数MBの転送、ガーブルドテーブルのバッファリングを行いません。

この分担は、クライアント側のHSS評価より、モバイルや組み込みクライアントに適しています。 デバイスには、安全な乱数生成、保護された鍵保存、一般的な曲線・AEADの処理、Routerへの通信が必要です。 通常署名は、デバイスのしきい値署名シェアを使い、Yaoから独立しています。

計測した転送量と遅延 ​

固定の有効化手順は、Deriver間で正確に2,222,584バイトを転送します。 AからBが2,185,420バイト、BからAが37,164バイトです。 符号化した最大エンベロープは131,180バイトです。 明示的なエクスポートは、A/B間で103,416バイトを転送します。通常署名のDeriver間通信はありません。

2026年7月:Worker時計の差分 ​

選択した同一アカウントのService Binding WebSocketを、2026年7月17日の2組のデプロイ済み計測で評価しました。 表の各値は、Deriver Aのプロトコル開始・終了時のDate.now()の差です。 デプロイ済みCloudflareのWorker時計は、その呼び出し自身のCPU時間を除外します。 したがって、時計の差分は待機時間だけを示します。これらは過去のデータで、手順の所要時間ではありません。

通信方式と計測時計の差分p50時計の差分p95時計の差分p99時計の差分平均失敗
Service Binding HTTPストリーム、対照60組234 ms258 ms318 ms232.5 ms0/60
Service Binding WebSocket、候補60組202 ms230 ms236 ms204.7 ms0/60
Service Binding WebSocket、対照40組198 ms222 ms232 ms200.8 ms0/40
Native Workers RPCストリーム、候補40組231 ms249 ms264 ms227.5 ms0/40
別アカウントの公開WebSocket、別時点203 ms315 ms424 ms219.4 ms0/30

後の本番アセットの計測では、21回が成功し、失敗はありませんでした。 ウォーム状態の20サンプルの時計差分は、p50が202 ms、p95が216 ms、p99が219 msでした。 昇格用計測のデプロイ直後の最初の群は、同じ時計で、p50が298 ms、p95が360 ms、p99が480 msでした。 次のウォーム群は、p50が196 ms、p95が224 ms、p99が296 msでした。 Cloudflareは、呼び出しが新しいisolateを作ったかを公開しません。 そのため、最初の観測値はウォームアップの動作を示し、コールドスタートの分布を示すものではありません。

時計差分は、AのCPU時間を含みません。本番アセットの計測では、その平均は手順ごとに226.3 msでした。 費用モデルを参照してください。

2026年10月:実時間 ​

2026年10月12日の計測で、同じベンチマークペアを再実行しました。 Worker時計の差分と、2つの実時間を記録しました。 1つはクライアントの経過時間、もう1つはwrangler tailが報告するAの呼び出しの経過時間です。 表は、単体の有効化手順について、各実行の中央値の範囲を示します。クライアントは東京にありました。

実行群Worker時計の差分Aの実時間クライアントの実時間AのCPUBのCPU
東京、フレーム後のyield導入前、3実行251–359 ms520–608 ms535–643 ms216–353 ms181–295 ms
東京、フレーム後のyieldあり、3実行94–106 ms292–333 ms318–353 ms195–231 ms184–191 ms
香港配置、yield導入前、3実行299–401 ms583–648 ms658–732 ms275–330 ms241–292 ms
香港配置、yieldあり、2実行103–184 ms455–485 ms528–573 ms321–323 ms186–295 ms
ローカルworkerd、Apple M4 Pro、1実行135 ms未記録139 ms未記録未記録

東京の各実行は21回、香港は31回、ローカルは6回の手順を含みます。

記録から、次の結果が分かります。

  • Worker時計の差分は、所要時間ではありません。 yield導入前は時計が250~400 msでも、Aの呼び出しは520~650 ms続きます。差はAのCPU時間に近くなります。時計差分とクライアントの実時間を比較しないでください。
  • yield導入前の単体手順は、実時間で520~640 msでした。 東京での結果です。生成と評価が直列だったため、実時間は両ロールのCPU時間の和に近くなりました。
  • フレーム後のyieldにより、東京の実時間は290~350 msになります。 香港配置では、Aの実時間が455~485 msです。yieldは、各フレーム後にイベントループを1回進める処理です。計算と組み込みクライアントを参照してください。
  • ローカルworkerdは異なります。 時計は実時間に従います。Worker時計の135 msに対し、クライアント実時間は139 msでした。

これらの数値には、次の制約があります。

  • ベンチマークペアは、ホストするウォレット構成全体ではありません。実際の構成には、受付、製品上の確認、封印、永続記録が加わります。
  • この記録は、ベンチマークペアでのyieldだけを計測し、ホストするウォレット経路でのyieldは計測していません。
  • 新しいisolateは、初回に400~1,000 msのCPUを使います。配置リージョンの指定時、31回中6~8回で新しいisolateに当たり、クライアント実時間のp90は1.3~1.6秒でした。
  • 香港への要求は、東京のエッジから入ります。クライアント実時間には、配置リージョンへの通信を含みます。

ローカルのリリースモードでのライフサイクル計測は、実装の基準値です。デプロイ先の遅延を示しません。

操作p50p95p99
登録94.070 ms100.068 ms102.040 ms
復元64.607 ms70.351 ms72.197 ms
更新64.205 ms72.893 ms74.966 ms
エクスポート19.035 ms23.780 ms24.566 ms
通常署名2.362 ms2.430 ms2.471 ms

正式なベンチマークのソースは、実装とともに保存しています。

Cloudflareへのデプロイ ​

対応する2つの構成で、クライアントプロトコルは同一です。 構成は起動前に選び、リクエストからは選択できません。

構成状況と用途A/B間の通信安全性の性質
Cloudflareアカウント1つ採用済みP0本番、ステージング、ローカルの同等構成、ベンチマークService Binding WebSocket共有の制御が正常である間、Workerランタイムとロール内の秘密を分離する。
独立したCloudflareアカウント2つより強い運用者分離の実験。延期中。計測時点では公開WebSocket再接続と遅い側の遅延条件を満たすと、独立管理で制御の境界を強化できる。

同一アカウント構成は、アカウント管理とデプロイの制御が正常である間、1つのWorker内に限定した侵害を封じ込めます。 アカウント管理者や共有デプロイ認証情報は、両Workerを置き換え、実質的なA+B共謀を作れます。 選択したP0の保証は、その脅威を含みません。 別アカウント実験は、正確なワイヤープロトコルを維持しました。 Worker時計差分のp95は315 msで、目標の250 msに達しませんでした。後に判明した再接続の不具合も未解決です。

安全性の性質 ​

選択したP0構成は、共有アカウントの制御が正常な間、受動的で正しい実行の下で、ロール分割の秘匿性を提供します。

  • Routerは、公開メタデータ、タイミング、暗号文、署名済み記録を見る。
  • Deriver Aは、Bの平文入力や結合した出力を受け取らない。
  • Deriver Bは、Aの平文入力や結合した出力を受け取らない。
  • 出力シェアを承認済みプロトコル内で生成し、クライアントとSigningWorkerへ別々に暗号化する。
  • 1回限りのチケットで、前処理、ラベル、マスク、トランスクリプトのノンスの再利用を防ぐ。
  • クライアントがシードを再構成できるのは、新たに承認したエクスポート中だけ。
  • 通常署名は、秘密鍵を再構成しない。

保証の対象には、悪意あるDeriver、A+Bの共謀、共有アカウント管理者の侵害、Cloudflare全体の侵害、公平性、 出力配送の保証、Deriverが中止した場合の可用性を含みません。 能動的安全性、不正者に対して安全なOT、入力の一貫性、認証付き秘密出力は、将来の強い構成の対象です。

費用モデル ​

次の見積もりは、過去のWorkerベンチマークに適用します。 現在のホスト費用には、Durable Object計算、リージョンD1、バックアップの保存・リクエストも含みます。 実際のデプロイで、別々に計測してください。

2026年7月10日のCloudflare Workers Standardの計画用基準は、次を仮定します。

  • 有料アカウントごとに、月額最低$5。
  • リクエストとCPUの利用枠を含む。
  • CPUの超過料金は、100万CPU-msあたり$0.02。
  • Workersのデータ転送・送出に追加料金なし。

料金やEnterprise契約は変わるため、デプロイの見積もりでは入力値を更新してください。

この基準では、大きなA→Bの転送量は遅延と任意の保存に影響しますが、Workersの帯域料金は$0です。 CPU、能動的プロトコルのラウンド、再試行、Durable Objects、事前配置した回路の保存が変動費を生みます。

本番アセットの計測では、平均CPU時間はAが226.3 ms、Bが167.0 ms、合計が手順ごとに393.2 msでした。 isolateのメモリーの標本p99は、Aが27.7 MB、Bが33.8 MBで、exceededMemoryはありませんでした。 7月17日の料金基準では、月間の含まれる利用枠を差し引く前の、100万回あたりのリクエストとCPUの総額は約$8.16です。 Service Bindingの呼び出しとWorker帯域に別料金はなく、ベンチマークWorkerはストレージバインディングを使いません。

過去の約300 msというリポジトリーのHSS計測は、シミュレーターとラッパーの経路を対象としました。 本来の簡潔なHSS構成の遅延、費用、安全性は証明しません。 完了した簡潔HSSの分析は、群演算の多い計算を予測し、増幅、能動的安全性、完全な通信量を未解決としました。 Ed25519の選択した経路は、Streaming Yaoです。上記の計測は、デプロイ済みP0構成を説明します。 より強い能動的安全性の構成には、独自の遅延、リソース、費用の証跡が必要です。