以太坊地址0x09每年消耗的gas不到1000笔交易,却藏着一条专为Zcash铺好的路。2019年12月伊斯坦布尔硬分叉上线时,没人想到这个BLAKE2b压缩函数预编译合约,会把跨链验证的成本从"不可能"变成"一顿饭钱"。
280倍差距:从6.4M到22,800 gas
EIP-152的动机很直白:让以太坊能验证Zcash状态,且不用破产。Tjaden Hess和以太坊基金会团队提出的方案,是把BLAKE2b的F压缩函数硬编码进地址0x09,每轮1 gas。标准调用跑12轮,总价12 gas。
没这个预编译时,用纯Solidity算一遍BLAKE2b要烧掉约20万gas。有了它,完整哈希712 gas搞定。Zcash的Sapling和NU5默克尔树全建在这上面,每棵树的每个节点都依赖这个函数。
一个32层深的Sapling默克尔证明,需要32次BLAKE2b压缩。纯Solidity路线:32 × 20万 = 640万gas,直接超过区块上限。走0x09路线:32 × 712 ≈ 2.28万gas,轻松塞进任何区块。
「没有预编译,链上验证Zcash在物理上不可行。」这是ZAP1Verifier合约注释里的原话,没夸张。
213字节的精密协议
0x09不跟你讲礼貌。它要213字节裸数据塞进去,64字节吐出来,没有ABI编码,没有函数选择器。ZAP1Verifier.sol里的调用长这样:
staticcall到0x09,原始字节进,原始字节出。输入格式焊死在协议里:4字节轮数、64字节状态向量h、8字节低位计数器、8字节高位计数器、1字节结束标志。任何偏移都 revert。
Zcash的域名分离(domain separation)靠XOR实现:16字节个性化字符串怼进h的第32-47字节。每个协议上下文有自己的常量——ZcashPedersenHash给票据承诺树,ZTxIdHeadersHash给交易ID。预编译不管这些,你的合约得自己把h算对。
算错 personalization,哈希就对不上,验证就失败。0x09只是个计算器,不负责理解Zcash协议。
为什么偏偏是BLAKE2b
比特币用SHA-256,以太坊用Keccak-256,Zcash选BLAKE2b不是随机抽签。它快,在硬件和软件上都快,而且支持个性化字符串——这对零知识证明系统的安全边界至关重要。
但快在链上没用,如果每次调用都要跑几千条EVM指令。预编译的本质是绕过EVM,直接在客户端层面执行特定计算。0x09不是"优化过的Solidity",是原生代码。
EIP-152的动机段落写得像外交辞令:「启用Zcash轻客户端验证,避免荒谬的gas成本」。翻译一下:没有这玩意儿,跨链桥接Zcash和DeFi就是空谈。
ZAP1Verifier现已部署在主网。它证明了一件事:以太坊的预编译合约是功能开关,不是性能补丁。0x09从2019年等到现在,等的是有人真的去验证Zcash。
现在 gas 成本解决了,下一个瓶颈在哪?ZK证明的生成时间,还是Zcash协议本身的升级节奏?
热门跟贴