レッスン12 — EVM プライバシー(Tempo Zones を読む)
問い
「EVM プライバシー」は crypto が最も語り、エンジニアが最も出荷しないテーマ。多くのチュートリアルは shielded pool が なにか を説明する。production 水準の設計のひとつ — Tempo Zones — の Rust ソースを読み、将来の任意の EVM プライバシースタックを読むためのフレームワークは何か?
原理(最小モデル)
- 3 ダイヤルのトレードオフ空間. 信頼モデル(trustless ↔ オペレータ信頼)/ 暗号プリミティブ(古典暗号 ↔ 完全 ZK)/ DX 面(カスタム DSL ↔ 標準 EVM)。
- Tempo の賭け. シーケンサ信頼 + 古典暗号(Chaum-Pedersen + AES-GCM)+ 標準 EVM。機関投資家は暗号トラストレス性より、コンプライアンス + 低運用コスト + 標準ツーリング を必要とする。
- Privacy protects against public observers on Tempo, not against the sequencer. スタック全体で最も重要な設計選択。
- Chaum-Pedersen prover アドレスは
0x1C00...0100、~6,000 ガス. ECDH 共有秘密の正しい導出を証明(シーケンサ秘密鍵を明かさず)。Groth16(~150,000 ガス + trusted setup)の 25× 安。専用プリミティブ > 汎用 ZK when 主張が単純。 - AES-GCM precompile は速度が劇的に違う箇所のみ. HKDF は SHA256 precompile(
0x02)+ Solidity で実装、AES は EVM bytecode だと 100× 遅い → precompile 化。プリコンパイル面を最小化。 IVerifierインタフェースで証明系に依存しない settlement. ZKVM / TEE バックエンド差し替え可能。speed-of-change の異なる層を結合させない。- EVM レベル(RPC レベルではなく)でプライバシー実施.
balanceOfrevert / 固定 100k ガス transfer(タイミングサイドチャネル閉鎖)/CREATE無効化。 - コンプライアンス継承(TIP-403). Zone は Tempo のレジストリから ポリシーを読む → 発行者は Tempo 上で 1 回凍結 → 全 zone が次の
advanceTempoで継承。
具体例
3 設計の角:
| 設計 | 信頼 | 暗号 | DX |
|---|---|---|---|
| Aztec L2 | trustless | 完全 ZK (UltraHonk) | カスタム DSL (Noir) |
| Railgun | trustless | EVM 上の SNARKs | 標準コントラクト (shielded ERC-20 のみ) |
| Tempo Zones | シーケンサ信頼 | 古典暗号 (Chaum-Pedersen + AES-GCM) + 差し替え可能な証明 | 標準 EVM 実行 |
Chaum-Pedersen precompile(tempoxyz/zones の crates/precompiles/src/chaum_pedersen.rs):
//! Chaum-Pedersen DLOG equality proof verification precompile.
//!
//! Registered at [`CHAUM_PEDERSEN_VERIFY_ADDRESS`] (`0x1C00...0100`).
//!
//! Verifies that the sequencer correctly derived the ECDH shared secret
//! from the depositor's ephemeral public key, without revealing the
//! sequencer's private key to the EVM.
//!
//! Uses the NCC-audited [`k256`] crate (v0.13.4) for secp256k1 operations.
pub const CHAUM_PEDERSEN_VERIFY_ADDRESS: Address =
address!("0x1C00000000000000000000000000000000000100");
const CP_VERIFY_GAS: u64 = 6_000;
pub struct ChaumPedersenVerify;
impl Precompile for ChaumPedersenVerify {
fn precompile_id(&self) -> &PrecompileId { &CP_PRECOMPILE_ID }
fn call(&self, input: PrecompileInput<'_>) -> PrecompileResult {
// verifyProof セレクタをデコードし、検証し、bool を返す
}
}
AES-GCM precompile signature:
function decrypt(
bytes32 key,
bytes12 nonce,
bytes calldata ciphertext,
bytes calldata aad,
bytes16 tag
) external view returns (bytes memory plaintext, bool valid);
IVerifier:
interface IVerifier {
function verify(
uint64 tempoBlockNumber,
uint64 anchorBlockNumber,
bytes32 anchorBlockHash,
uint64 expectedWithdrawalBatchIndex,
address sequencer,
BlockTransition calldata blockTransition,
DepositQueueTransition calldata depositQueueTransition,
bytes32 withdrawalQueueHash,
bytes calldata verifierConfig,
bytes calldata proof
) external view returns (bool);
}
Zone node の依存(crates/tempo-zone/Cargo.toml):
[package]
name = "zone"
description = "Tempo Zone node - a lightweight L2 node built on reth"
# reth
reth-basic-payload-builder.workspace = true
reth-chainspec.workspace = true
reth-evm.workspace = true
reth-node-api.workspace = true
reth-node-builder.workspace = true
reth-payload-builder.workspace = true
reth-revm.workspace = true
reth-rpc.workspace = true
reth-rpc-builder.workspace = true
reth-storage-api.workspace = true
reth-tasks.workspace = true
reth-transaction-pool.workspace = true
no_std 宣言(crates/precompiles/src/lib.rs):
//! This crate is `no_std` compatible so these precompiles can run inside the
//! SP1 prover guest (RISC-V) as well as in the zone node.
失敗例(誤解)
「プライバシーは完全 ZK でなければ無意味」— 間違い。機関投資家の用途では「public observers から隠す」「シーケンサにはコンプライアンス目的で見せる」が合理。Tempo の賭けは market 問題、設計は一貫。
「Chaum-Pedersen は時代遅れ」— 間違い。1992 年プロトコルだが「DLOG 等価性」という特定主張だけを証明する道具として最適。汎用 ZK(Groth16)の 25× 安 + trusted setup なし + メンテすべき証明系なし。退屈な暗号 = 監査可能な暗号。
「balanceOf revert は RPC で十分」— 間違い。EVM レベル実施でないと eth_call シミュレーション + prover 再実行を含むすべてのコードパスで強制されない → 漏れる。
🛑 予測。 AES-GCM はプリコンパイル化したのに HKDF はしない、なぜ?(答え: HKDF は HMAC-SHA256 反復、SHA256 は既に EVM の
0x02precompile に存在 → Solidity で0x02を呼ぶ実装で十分速い + 専用 precompile とほぼ変わらない。AES は EVM bytecode だと 100× 遅い → precompile 必須。プリコンパイル面を最小化 = 本当に高コストなものだけ。Yellow Paper の precompile 集合(BN254 / BLS / modexp / ecrecover / identity / sha256 / ripemd160)と同じ規律。)
ステップで組み立てる
Step 1: 3 ダイヤルを即答
信頼 / 暗号 / DX。各設計(Aztec / Railgun / Tempo Zones)が空間の異なる角を占める。
Step 2: Tempo の信頼宣言を 1 文で
「Privacy protects against public observers on Tempo, not against the sequencer」。
Step 3: 2 precompile の役割分担
Chaum-Pedersen 0x1C00...0100 = ECDH 共有秘密導出証明 / AES-GCM 0x1C00...0101 = 対称復号。HKDF は Solidity + 0x02 で十分。
Step 4: IVerifier の意味
State transition function = pure no_std Rust function(prove_zone_batch(witness) -> BatchOutput)+ Tempo 側 verifier は interface → ZKVM(Risc0 / SP1 / Jolt)/ TEE(SGX / SEV-SNP / Nitro)どれでも差し替え可能。
Step 5: 暗号化デポジット 9 ステップ
Tempo 側: ① ECDH + ② HKDF + ③ AES-GCM 暗号化 + ④ portal depositEncrypted → Zone 側: ⑤ シーケンサが Chaum-Pedersen 証明生成 + ⑥ precompile で検証 + ⑦ HKDF + ⑧ AES-GCM 復号 + ⑨ TIP20.mint。
Step 6: EVM レベルプライバシー 3 修正
balanceOfrevert(所有者 + sequencer 以外)- transfer 固定 100k ガス(タイミングサイドチャネル閉鎖)
CREATE無効化(predeploy のみ)
Step 7: TIP-403 継承
Zone が Tempo のレジストリプロキシをデプロイ → isAuthorized を TempoState.readTempoStorageSlot 経由で Tempo から読む → 発行者は Tempo に 1 回凍結 → 全 zone が次 advanceTempo で継承。
答え合わせ
- Chaum-Pedersen が必要な理由(シーケンサ信用しない): 証明なしだとシーケンサが任意の共有秘密を提示できる → 暗号文を別の受取人に復号する偽 secret を主張 → 誰も検出不能 → 資金リダイレクト可能。証明は秘密をシーケンサ公開鍵に暗号的に結合 → すり替え検出可能。シーケンサは liveness + DA に信頼されるが、資金リダイレクトには信頼されない — 異なる懸念に異なる信頼仮定。
- 無効暗号文の扱い: Chaum-Pedersen 通過(シーケンサ正しく導出)+ GCM タグ失敗 → bounceback。証明が「シーケンサが嘘」と「ユーザが無効暗号文」を区別 — 観察者には同じに見えるが対応が違う。
IVerifierの柔軟性: portal 層に SP1 / Groth16 を焼き込むと SOTA 移行のたびに portal 再デプロイ → 中断。Interface 化 → 証明バックエンドを差し替え可能(ZKVM SOTA は 12-18 ヶ月でシフト + TEE もコンプライアンス文脈で有効)→ portal 不変。速く動く層(証明)を遅く動く層(settlement)から切り離す、Revm の Database trait と同じ規律。
合格基準
- 3 ダイヤルを即答できる。
- Tempo の信頼宣言を引用できる。
- 2 precompile の役割と「プリコンパイル面最小化」の理由を言える。
IVerifierインタフェース化の意味を言える。- EVM レベル 3 修正と TIP-403 継承の仕組みを言える。
Expert への接続
プライバシーはペイメントレール L1 の 1 つの surface。4 つの category shift(決済保証 / Fee 抽象化 / Identity hook / chain 非依存 surface)は レッスン23 — ペイメントレール工学 で扱う。Tempo Zones は「一部の支払いは default で confidential」とレールが commit したときに図に出てくるもの — L13 と L23 を同じスタックを 2 角度から見たものとして読む。
まとめ(3行)
- 3 ダイヤル(信頼 / 暗号 / DX)が EVM プライバシー設計空間、Tempo Zones は「シーケンサ信頼 + 古典暗号 + 標準 EVM」の角(機関投資家賭け)。
- Chaum-Pedersen + AES-GCM の特定プリミティブ precompile(25× 安 vs Groth16)+
IVerifierで証明系差し替え可能 + EVM レベルプライバシー実施。 - TIP-403 コンプライアンス継承(Tempo に 1 回書き、全 zone が次 advanceTempo で読む)が「プライバシー + コンプライアンス」を機関投資家にとって一貫したプロダクトに。