原文

WOTS-39: ビットコインとイーサリアムを横断するライブなポスト量子署名ウォレット


根本的な問題

今日の暗号通貨を保護するすべての署名スキーム(ECDSA、Schnorr、Ed25519)は、楕円曲線離散対数問題 (elliptic curve discrete logarithm problem) の困難性からそのセキュリティを導き出しています。ショアのアルゴリズム (Shor’s algorithm) は、十分に強力な量子コンピュータ上でこれを多項式時間で解きます。これは理論的な将来の懸念ではありません。NISTが2024年に最初のポスト量子標準を最終決定したのは、まさにそのタイムラインが現実のものであるためです。トランザクションをブロードキャストしたことのあるすべてのアドレスは、公開鍵が露出しています。これらのアドレスが攻撃対象となります。

ハッシュ関数はこの脆弱性を共有しません。ハッシュの原像計算は、量子コンピュータにとっても指数関数的に困難なままです。グローバーのアルゴリズム (Grover’s algorithm) は二次的な高速化しか提供せず、出力サイズを2倍にすることで完全に無効化されます。ハッシュ関数のみで構築された署名スキームは、今日から予見可能な将来にわたって量子安全です。


WOTSの仕組み

Winternitzワンタイム署名 (WOTS+) は、ハッシュベースの署名スキームです。その構築は単純です。

秘密鍵はランダムな値のセットです。公開鍵は、それらの各値をW回ハッシュチェーンでハッシュしたものです。WOTS-39では、SHA-256を使用してW=256とし、それぞれ256ステップのハッシュチェーンを34個生成します。メッセージに署名するには、秘密鍵の各要素を、メッセージダイジェストの対応するチャンクに比例するステップ数だけハッシュします。検証者は各チェーンの残りのステップを完了し、結果を公開鍵コミットメントと照合します。

このスキームは無条件にワンタイムです。同じ鍵で2つの異なるメッセージに署名すると、同じチェーン内の異なる位置で中間点が明らかになります。両方の署名を収集した攻撃者は、各チェーンに2つの参照点を持つことになります。明らかになった2つの位置のうち低い方から、公開鍵まで、そして明らかになった2つの点の間にある任意の位置まで、ハッシュを順方向に計算できます。

同じ鍵から十分な数の署名が得られれば、攻撃者は十分なチェーン素材を再構築して、任意の署名を偽造できます。セキュリティ保証は完全に崩壊します。

これが、WOTS+がワンタイム署名スキームと呼ばれる理由です。一度署名したら、その鍵は永久に破棄します。

WOTS+上に実用的なウォレットを構築する上での最大の課題は、たった一つの質問に答えることです。鍵を再利用することなく、生涯にわたって何千ものトランザクションに署名するにはどうすればよいか?

XMSS や SPHINCS+ のような従来のアプローチは、WOTS+鍵の大きなツリーを構築することでこれを解決します。ツリーの各リーフは、一度だけ使用される個別の鍵です。ツリー構造は、他の鍵を明らかにすることなく、各鍵が同じ所有者に属することを証明します。NIST標準化されたポスト量子署名スキームであるSPHINCS+は、そのような構造のハイパーツリーを使用し、約8,000バイトの署名を生成します。

WOTS-39は異なるアプローチを取ります。ブロックチェーン自体をツリーとして使用します。

ブロックチェーン上のすべてのトランザクションには、そのトランザクションハッシュ (TXID) と呼ばれる一意の識別子があります。この識別子は、送信者、受信者、金額、時間、その他多数の詳細情報など、トランザクションを定義するすべてのものから計算されます。同じチェーン上の有効なトランザクションで、同じTXIDを共有することはありません。

この一意性は単なる便利な特性ではありません。これは、ブロックチェーンプロトコルを実行する何千ものノードの集団的な合意によって強制されます。重複するTXIDを生成することは単に困難なだけでなく、完全に拒否されます。ブロックチェーンはそれを受け入れません。

WOTS-39は、TXIDを、各Winternitz鍵セットをワンタイムにするための一意の識別子として使用します。その方法は次のとおりです。

anchor = H("hybrid-wots-v1" || TXID)

sk[i] = PRF(mskWOTS, anchor || i) for each of 67 chains

マスターシークレット (mskWOTS) はブロックチェーン上に決して現れません。署名中にデバイスのメモリにのみ存在し、シードフレーズ (seed phrase) からオンデマンドで導出されます。各トランザクションについて、ドメインラベルとトランザクションの一意のIDをハッシュすることで、一意のアンカーが計算されます。次に、67個の独立した秘密鍵要素が、マスターシークレットとそのアンカーから導出されます。

TXIDはトランザクションごとに異なるため、アンカーも異なります。アンカーが異なるため、67個すべての秘密鍵も異なります。鍵が異なるため、署名で明らかになるチェーンの中間点は、互いに数学的な関係のない完全に独立したチェーンから引き出されます。

攻撃者があなたが生成するすべての署名を収集しても、将来の署名について有用な情報は何も得られません。各署名イベントは、一意のアンカーから導出された鍵を使用します。あるアンカーの鍵を知っても、他のアンカーの鍵については何もわかりません。これが擬似乱数関数 (pseudorandom function) のセキュリティ保証です。

SPHINCS+は、鍵の一意性を強制するために8,000バイトを費やして暗号ツリーを構築します。WOTS-39はこれに0バイトを費やします。ブロックチェーン自体がツリーだからです。古典層とポスト量子層の両方を含む署名全体は、約2,200バイトです。


鍵のアップロードを承認する: ラモートチェーン

Winternitz署名は問題の半分を解決します。特定のトランザクションを承認したことを証明することです。しかし、新たな課題を生み出します。各WOTS鍵は安全に1つのメッセージにしか署名できないため、ウォレットはトランザクションごとに新しい鍵をアップロードする必要があります。これにより、すぐに疑問が生じます。ブロックチェーンは、各新しい鍵をアップロードしているのがあなたであることをどのように知るのか?答えがなければ、攻撃者は独自の偽の鍵を登録し、資金をリダイレクトする可能性があります。

これがラモートチェーンが解決する問題であり、WOTS-39の核心的な洞察の後半部分です。

ウォレットのセットアップ時に、ラモートチェーンを構築します。これは、マスターシークレットから導出されたハッシュ値の長いシーケンスです。秘密を一度ハッシュして値#1を取得し、それをハッシュして値#2を取得し、これを何千ステップも繰り返すことを想像してください。あなたは最終値、つまりチェーンの先端のみを、ブロックチェーン上のジェネシスコミットメント (genesis commitment) として公開します。それ以前のすべての値はプライベートなままです。

最初の鍵のアップロードを承認するには、最後から2番目の値、つまり公開された先端の原像を明らかにします。ブロックチェーンは単一のSHA-256ハッシュを実行します。この値は保存された先端に順方向にハッシュされるか?もしそうなら、所有権が証明されます。ブロックチェーンは保存された値を更新し、その承認スロットを永久に消費します。次のアップロードでは、その前の原像を明らかにします。チェーンは元の秘密に向かって、一度に1ステップずつ逆方向に実行されます。

Genesis commitment → H(H(...H(secret)...))  オンチェーンに保存

アップロード1を承認 → 先端の原像を明らかにし、順方向にハッシュされることを証明

アップロード2を承認 → その原像を明らかにし、順方向にハッシュされることを証明

...以下同様

明らかになった原像を見た攻撃者は、次の原像を計算できません。そのためにはSHA-256を反転させる必要があり、量子コンピュータでも2^128回の操作が必要です。各スロットはワンタイムです。一度消費されると、永久に消費されます。リプレイも再利用もショートカットもありません。


核心的な発見: Winternitz + Lamport

この組み合わせがWOTS-39の中心的な洞察です。従来のECDSAは、単一の鍵ペアで2つのことを同時に行います。トランザクションを承認したことを証明すること(署名)と、アドレスを所有していることを証明すること(鍵バインディング)です。WOTS-39は、これら2つの責任を2つの量子安全なプリミティブに分離します。

Winternitzはメッセージ署名を処理します。各トランザクションは、マスターシークレットを保持するあなただけがその特定のトランザクションを承認したことを証明する、一意のWOTS+署名を運びます。秘密なしにそれを偽造するには、2^128回のハッシュ原像反転が必要です。

ラモートチェーンは鍵の承認を処理します。すべての新しいWOTS公開鍵には、正当なウォレット所有者によって提出されたことを証明するラモート原像が付属しています。偽の鍵を提出するには、チェーン内の次に未公開の原像を計算する必要があり、同じ2^128の障壁があります。

どちらのプリミティブも単独では不十分です。 ラモートチェーンなしのWinternitz署名では、鍵のアップロードが無防備になります。誰でも悪意のある鍵を入れ替えることができます。Winternitzなしのラモートチェーンは承認を提供しますが、署名は提供しません。署名自体がリプレイ可能になってしまいます。これらが一緒になることで、量子コンピュータがECDSAに対して開くすべての攻撃ベクトルを閉じ、楕円曲線署名の完全な代替品を、SHA-256操作のみで構築します。

これが、WOTS-39が単に1つの署名アルゴリズムを別のものに置き換えるだけの以前のポスト量子提案とは構造的に異なる点です。ウォレットはメッセージをポスト量子的に署名するだけでなく、所有権をポスト量子的に証明し、鍵の移行をポスト量子的に承認し、これらのすべての操作を楕円曲線数学を一切使用せずに連鎖させます。

ラモートチェーンのスロットがなくなると、ウォレットは新しいチェーンをロードします。各新しいチェーンは、マスターシークレットと一意のNonce(作成するすべてのチェーンに対して異なる番号)を組み合わせてルート化されます。

Chain 1 tip = H^N(mskWOTS || nonce_1)

Chain 2 tip = H^N(mskWOTS || nonce_2)

Chain 3 tip = H^N(mskWOTS || nonce_3)

各Nonceは一意であるため、各チェーンの先端は完全に独立しています。チェーン1からすべてのラモート原像を収集した観察者は、チェーン2について何も知りません。Nonceはマスターシークレットとカウンターから決定論的に (deterministically) 導出されます。それらを保存したり記憶したりする必要はありません。ウォレットはこれらすべてをサイレントに処理し、起動時に承認値を事前計算し、供給が少なくなると自動的に更新します。


Winternitzパラメータの調整

すべてのWOTS-39ウォレットは、単一の調整可能なパラメータ w を公開します。これは、署名サイズと検証コストのトレードオフを制御します。セキュリティレベルである128ビットのポスト量子耐性は、どこに設定しても変わりません。w は純粋にエンジニアリング上の選択です。

32バイトのメッセージハッシュに署名するために、WOTS-39はそれを数字グループのシーケンスに分割します。パラメータ w は各数字のサイズを設定します。w=16 の場合、各数字は4ビット(値0-15)であるため、メッセージは64グループに分割され、それぞれが独自のハッシュチェーンを必要とします。w=256 の場合、各数字は8ビット(値0-255)であるため、メッセージは32グループにしか分割されず、より小さな署名が生成されます。しかし、各チェーンは完全な数字範囲をカバーするためにより長くなる必要があり、検証者はチェーンごとに多くのハッシュステップを実行します。

w         L chains   Sig size    Avg verify steps

──────────────────────────────────────────────────

w=4 133 4,256 B ~200

w=8 90 2,880 B ~315

w=16 67 2,144 B ~503 (推奨デフォルト)

w=32 55 1,760 B ~806

w=64 45 1,440 B ~1,395

w=128 39 1,248 B ~2,476

w=256 34 1,088 B ~4,335

w=512 31 992 B ~7,936

w=1024 28 896 B ~14,364

w=2048 26 832 B ~26,598

w=4096 24 768 B ~49,152

すべての行は、正確に2^128のポスト量子セキュリティを提供します。セキュリティはSHA-256の原像耐性から来ており、これは使用されるチェーンの数や各チェーンの長さとは無関係です。グローバーのアルゴリズムを使用する量子攻撃者は、w が4であろうと4096であろうと、署名を偽造するために2^128回のハッシュ評価を必要とします。w はセキュリティパラメータではなく、パフォーマンスパラメータです。

EVMチェーンでは、2つのコストが直接競合します。カルデータ (Calldata) コストはトランザクション送信者が支払います。署名データの各バイトはガス (gas) を消費します。署名が小さいほど、送信者は各トランザクションで費用を節約できます。検証コストは実行ガス (execution gas) で支払われます。スマートコントラクトは各チェーン要素を正しいステップ数だけハッシュする必要があり、ステップ数が多いほど keccak256 の呼び出しが多くなります。

w=16 から w=256 に変更すると、1,056バイトのカルデータ(標準的なカルデータ価格で約16,000ガス)が節約されますが、検証ガスコストは約3倍になります。カルデータが高価なL1イーサリアム (L1 Ethereum) では、w が大きい方が有利です。カルデータが安価で実行負荷が高いチェーンでは、w が小さい方が有利です。

極端な例として、w=4096 は検証ごとに約49,000回のハッシュステップを必要とし、制約のあるチェーンではブロックガス制限を超える可能性があります。w=4 は4,256バイトの署名を生成し、積極的なカルデータ価格設定のチェーンではトランザクションが法外に高価になる可能性があります。実用的な安全範囲は w=8 から w=512 です。w で何をトレードオフしても、セキュリティをトレードオフすることはありません。


3層の保護

WOTS-39は古典的なセキュリティを置き換えるものではありません。それに加えて強化します。すべてのトランザクションは、それぞれ異なる数学に基づき、異なる脅威から保護する、3つの独立した承認証明を必要とします。

レイヤー1: 古典的なECDSA。 今日のすべてのイーサリアムウォレットが使用している標準的な楕円曲線署名です。高速でコンパクト、検証コストも安価です。今日の世界の攻撃者の圧倒的多数であるすべての古典的な攻撃者から保護します。その唯一の弱点は、量子コンピュータ上のショアのアルゴリズムです。

レイヤー2: WOTS+署名。 上記で説明したポスト量子署名で、w に応じて768〜4,256バイトのサイズです。ハッシュ関数のみから導出され、古典的および量子的な攻撃者の両方に対して安全です。そのセキュリティ証明は、SHA-256が単方向関数であることのみを必要とし、既知のアルゴリズム(古典的または量子的)で意味のある挑戦ができる特性ではありません。

レイヤー3: ラモートチェーン承認。 このトランザクションのWOTS鍵アップロードを、あなただけが承認したことを量子安全に証明します。これは最後のループを閉じます。ECDSAが量子コンピュータによって破られたとしても、ラモートチェーンは攻撃者が独自の鍵を置き換えることを確実に防ぎます。各チェーンは一意のNonceに根ざしており、各スロットは一度だけ消費されるため、過去の承認からの情報が将来の承認に漏れることはありません。

その結果、すべての重要な操作がハッシュ関数セキュリティによって保護されるウォレットが実現します。ECDSAは今日の防御の深さ (defense-in-depth) を提供しますが、ポスト量子保証はそれに依存しません。


シードフレーズ: 1つのバックアップ、完全なリカバリ

この複雑さのすべては、ユーザーには見えません。セットアップには、既存の暗号ウォレットのバックアップと同じように、12または24単語のシードフレーズ (seed phrase) を書き留めることが含まれます。これは、すべての主要なウォレットがすでにサポートしているBIP-39ワードリストを使用します。

内部では、そのフレーズは2つの独立した導出パスのシードとなります。1つ目はECDSA鍵の標準プロトコルに従います。あなたの古典的な秘密鍵、公開アドレス、および既存のウォレット体験は完全に変更されません。2つ目は異なるソルト(「mnemonic」の代わりに「WOTS Seed v1」)を使用し、同じフレーズから完全に独立したマスターシークレット (mskWOTS) を生成します。2つの導出は同じエントロピーを共有しますが、暗号学的に独立しています。一方を知っても他方について何も明らかになりません。

ECDSAを破る量子コンピュータは、公開鍵から古典的な秘密鍵を回復できる可能性があります。しかし、秘密鍵とシードフレーズの間にあるSHA-512ハッシュ関数を逆転させることはできず、導出境界を越えてmskWOTSに到達することもできません。シードフレーズは安全なままです。WOTS-39レイヤーは安全なままです。ラモートチェーンは安全なままです。

紙に保存された12または24単語のフレーズ1つで、どのデバイスでもウォレット全体を回復するのに十分です。2つ目のバックアップは不要です。余分な複雑さもありません。1つのフレーズで、完全なリカバリが可能です。


なぜ実装がチェーン間で異なるのか

ビットコインとイーサリアムは根本的に異なる実行モデルを持っているため、根本的に異なるアプローチが必要です。

ビットコインでは、トランザクションの有効性はスクリプト層で強制されます。スマートコントラクトランタイム (smart contract runtime) はありません。ビットコイン上のWOTS-39は、WOTSウィットネスを受け入れるコンセンサスルール (consensus rules) を持つ変更されたSignetにデプロイされたカスタムウィットネスタイプ (P2WOTS、ウィットネスバージョン3) を使用します。スクリプトはWOTS公開鍵のハッシュにコミットします。ウィットネスは署名(部分的に評価されたハッシュチェーン)を提供し、検証者はオンチェーンでチェーンを完了して、コミットされた公開鍵に解決されることを確認します。スロットの消費は、各コミットメントを参照する確認済み入力のスキャンによって追跡されます。プロトコルの観点からは完全にステートレスです。すべての状態はウォレットに存在します。

イーサリアムでは、アカウントモデルがすべてを変えます。スマートコントラクトはネイティブに状態を保持できるため、スロット消費、鍵コミットメント、リプレイ保護のすべてがアカウント自体の中にオンチェーンで存在できます。

ERC-4337 は、WOTS-39をスマートコントラクトウォレット (smart contract wallet) として実装します。アカウントの validateUserOp 関数は、WOTS+証明を直接検証し、ハッシュチェーンをたどり、保存された公開鍵コミットメントと結果を照合し、消費されたスロットをコントラクトストレージにマークします。これはイーサリアムのコンセンサスに変更を加える必要がなく、今日の既存のバンドラー (bundler) インフラストラクチャで動作します。

EIP-7702 は異なる角度からアプローチします。新しいコントラクトアカウントをデプロイするのではなく、7702は既存のEOA (Externally Owned Account) がトランザクションの期間中、または永続的に、その検証ロジックをスマートコントラクト実装に委任することを可能にします。2019年からECDSA鍵を使用しているウォレットは、資金を移動したりアドレスを放棄したりすることなく、WOTS-39検証にアップグレードできます。これは、やり直すことなく量子安全性を求める既存のイーサリアムユーザー向けの移行パスです。


ライブ実装の状況

3つの実装すべてが今日デプロイされ、機能しています。

Bitcoin Signet: カスタムSignet上で動作する完全なP2WOTSウォレット。HD導出、マルチアドレススキャン、UTXO管理 (UTXO management)、トランザクション構築とブロードキャスト、ファセット、ブロックエクスプローラーをサポートします。スロット追跡はローカルとオンチェーンの署名カウントの両方に対して実行されます。Arweaveパーマウェブ (Arweave permaweb) 上でホストされている block_opuslux.ar.io でライブ稼働中、APIはSignetノードからHTTPS経由で提供されます。

ERC-4337: テストネット上のWOTS-39スマートコントラクトウォレット。validateUserOp 検証者はSolidityで記述され、Foundryでテストされています。4337スタックに変更を加えることなく、バンドラー互換です。

EIP-7702: テストネット上のネイティブアカウントアップグレードパス。既存のEOAはWOTS-39検証コントラクトに委任でき、アドレス変更や資金移行なしにポスト量子署名検証を得られます。

リポジトリ: https://github.com/opus-lux/wots39

ウェブサイト: https://block\_opuslux.ar.io

ポスト量子アカウント抽象化 (account abstraction) について真剣に考えている方、特にERC-4337検証者のガスプロファイル、およびEIP-7702スタイルのアップグレードが既存のEOAにとって長期的な適切な移行プリミティブであるかどうかについて、フィードバックを歓迎します。


1投稿 - 1参加者

トピック全文を読む