
このリポジトリには、Trail of Bitsのブログ記事で詳述されている、Googleが楕円曲線暗号解析用の高効率量子回路を持つというゼロ知識証明を我々がどう破ったかに関するリソースが含まれています。偽造した証明、検証手順、および未パッチのzkVMシミュレータコードの脆弱性を悪用する量子回路を生成するコードが含まれています。
完全な証明バイナリはこちらにあり、Googleの証明と我々の証明を比較した結果は以下の通りです。
| リソース種別 | GoogleのLow-Gate | GoogleのLow-Qubit | 我々の証明 |
|---|---|---|---|
| 総操作数 | 17,000,000 | 17,000,000 | 8,300,000 |
| 量子ビット数 | 1,425 | 1,175 | 1,164 |
| Toffoli数 | 2,100,000 | 2,700,000 | 0 |
証明の概要は以下の通りです。
Circuit SHA-256 Hash: 0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999
Groth16 Proof Bytes: 0x0e78f4db0000000000000000000000000000000000000000000000000000000000000000008cd56e10c2fe24795cff1e1d1f40d3a324528d315674da45d26afb376e8670000000000000000000000000000000000000000000000000000000000000000024ac7f8dd6b1de6279bcce54e8840d8eb20d522bf27dedd776046f6590f33add217db465201c63724e6b460641985543d2b79c3c54daeea688581676a786aafc1dba8604a361acdd9809e268b6d8bc73943a713bb0ed0d96221f73d26def6ea4041d05b077523d9351a48b2ecd984c686b6473df69d20a24296d0a1cba3cdbe92eb13a7cc0ecd92f27f7bf23f9ac859d4293e17216dcbd85d1c7f60a52f65a9d02faef077336acd39e845d534200b575b029d6e3f0afb4f90815557233eab70b0fe88919834dd9beb90d47241f1490dc202e0dce44e4894982b07073c8d4426513732d79e9af9913b254aa29471e1a98fa1b43a1886afb5dbd36988153217aa2
Verification Key: 0x00ca4af6cb15dbd83ec3eaab3a0664023828d90a98e650d2d340712f5f3eb0d4
GoogleはZenodoデータセットでZK証明を検証するスクリプトを提供しました。我々の攻撃はバージョン1を標的としており、バージョン2にはパッチが含まれています。依存関係のインストール手順はdocs/getting_started.mdにあります。環境にはRust、Go、およびオプションでDockerが必要です。検証コマンドはrun_proofs.shの末尾に記載されています。Googleの証明アーティファクトはproofs/ディレクトリにあり、我々の証明アーティファクトはproof_trailofbits.binにあります。
# Verify Google's proofs
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proofs/low_toffoli/proof_9024.bin
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proofs/low_qubits/proof_9024.bin
# Verify our proof
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proof_trailofbits.bin
最後のコマンドの出力には以下のものが含まれます。
Successfully verified Groth16 SNARK proof.
Circuit hash commitment: 0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999
Demanded Number of tests: 9024
Demanded Qubit count: 1164
Demanded Average non-Clifford count: 0
Demanded Total ops: 8300000
検証コマンドは、zkVMゲストプログラムの簡潔な暗号表現である検証キーに対してZK証明をチェックします。あるいは、--elf proofs/zkp_ecc-programを使用して、検証者にゲストプログラムのELFバイナリを提供することもできます。このフラグを完全に省略した場合、検証者はDockerコンテナを使用して、program/内のソースコードからゲストプログラムのバイナリを再構築します。
gen_secp256k1_tob.pyを実行すると、ec_secp256k1_add_into.kmxという名前の142MBのkickmixスクリプトが生成されます。0-Toffoli証明を達成するには、prove.rs.diffを使用してZenodoリポジトリ内のprover/prove.rsにパッチを適用します。これにより、zkVMの外部で実行される信頼されていないコードが変更され、kickmix回路のシリアライズが操作されます。
証明生成の手順はZenodoリポジトリにあります。我々は4つのNVIDIA H100 GPUを搭載したクラウドマシン上でdocs/sp1_cluster_deployment_guide.mdの手順に従い、以下のコマンドを実行して証明を生成しました。
./run_proofs.sh --num-tests 9024 --kmx "ec_secp256k1_add_into.kmx" --qubit-counts 1164 --toffoli-counts 0 --total-ops 8300000 --proving-mode "multi-gpu" > proofs/ec_secp256k1_add/log_run.out 2>&1 &
偽造証明の生成には約4時間かかりました。