
零知识证明 – 一种新型的Merkle树(Shrubs)
这几天在日本大阪正在举办Devcon 5。议题中有个topic吸引我的眼球:
Shrubs – A New Gas Efficient Privacy Protocol
在以太坊上,传统的Merkle树(深度为33)添加一个叶子节点,除了计算33次Hash函数外,还需要更新33个节点(也就是需要读并且更新33个存储空间)。而更新一个节点的存储费用是昂贵的。更新33个256bit的存储,大约需要180w的GAS费用。
Shrubs就提出了一种Merkle树的变种,每次添加一个叶子节点,只需要O(1)次存储更新。这种变种的Merkle树,不只是用一个树根节点来“代表”整棵树。而是用一系列节点(个数等于深度)来”代表“整棵树,保证所有的叶子节点都能”索引“到这些节点。在变种的Merkle上,每一层选择一个节点。在添加叶子节点的时候,在不破坏其他“子树”的根的前提下,只要更新到离该叶子节点最近的子树根即可。
可以想象成,Shrubs的变种Merkle树,其实是由一棵棵的子树的树根组成。这些子树能覆盖所有的已经添加的叶子节点。这些子树的树根可以代表一棵完整的Merkle树(唯一性)。而且通过子树的路径证明,就能证明某个叶子节点在这颗完整的Merkle树上。因为每次只需要更新子树的树根,所以,每次添加叶子节点只需要一次节点数据的更新。
这些子树的树根,又能推导出整个merkle树最右边的path。这也是,Shrubs的说明中,用merkle树的最右边path代表merkle树的原因。
Shrubs的变种Merkle树的算法原型昨天更新到Github上,地址如下:
https://github.com/celo-org/shrubs
核心算法逻辑在contracts/MerkleTreeLib.sol中的insert和verify函数。
1. 插入节点
insert函数实现了叶子节点的插入逻辑。filled_subtrees就是每个选择的子树的根。insert函数的主要逻辑,就是选择子树,更新子树的根。
function insert(uint256 leaf) internal { uint32 leaf_index = next_index; uint32 current_index = next_index; next_index += 1; uint256 current_level_hash = leaf; uint256 left; uint256 right; bool all_were_right = true; for (uint8 i = 0; i < levels; i++) { if (current_index % 2 == 0) { left = current_level_hash; right = zeros[i]; filled_subtrees[i] = current_level_hash; break; } else { left = filled_subtrees[i]; right = current_level_hash; } current_level_hash = HashLeftRight(left, right); current_index /= 2; } tree_leaves.push(leaf); }
filled_subtrees采用空节点初始化。在新插入一个节点时,找到它最低的左节点作为选择的子树,并更新树根。current_index是每一层上节点的序号。选择左边节点是通过current_index%2==0实现。
以深度为4的Merkle树为例,添加第一个叶子节点后,各个子树的树根如下(青色节点是初始化的filled_subtrees节点,蓝色是更新的节点):
添加第二和三个叶子节点分别如下:
整个添加过程如下面动图效果(橙色连线代表hash计算):
1.2 验证节点
verify函数是验证某个叶子节点在Merkle树上的示例。只要能给定一条路径,能计算出一个子树根即可。
function verify(uint256 leaf, uint256[] memory path, uint32 leaf_index) internal { uint32 current_index = leaf_index; uint256 current_level_hash = leaf; uint256 left; uint256 right; for (uint8 i = 0; i < levels; i++) { if (mode == 0 && filled_subtrees[i] == current_level_hash) { emit LeafVerified(leaf, leaf_index, i, true); return; } if (current_index % 2 == 0) { left = current_level_hash; right = path[i]; } else { left = path[i]; right = current_level_hash; } current_level_hash = HashLeftRight(left, right); current_index /= 2; } } }
2.1 数据更新
Shrubs变种Merkle树,每次添加节点,只需要更新一个子树的树根。从数据更新角度,算法复杂度O(1)。
2.2 hash计算
从hash计算的角度,在添加左节点时,无需hash计算。在添加右节点时,hash计算和选择的子树深度相等。越靠右的节点,子树选择也高,hash计算也越多。即使这样,也比传统的Merkle树计算量小。
假设Merkle树的树高是n,则传统Merkle树添加所有的叶子节点,需要2^n*n次计算。Shrubs变种Merkle树添加所有的叶子节点,只需要(1+2+…+n) = (n*(n-1))/2次计算
在Devcon5上,Shrubs公开了变种Merkle树的测试结果。叶子插入的gas消耗,平均情况下,9.6w。
图中,Shrubs最坏情况下的GAS消耗应该不是168w,应该在40w左右。
如果使用Groth16零知识证明的话,大约需要不到50w的GAS(EIP1008情况下)。
值得一提的是,使用Groth16零知识证明,需要将所有的子树的树根作为public input。
总结:
为了解决以太坊智能合约中Merkle树更新存储开销较大的问题,Shrubs提出了一种新型的Merkle树变种。这种变种的Merkle树用多个子树的树根来代表一个Merkle树。每次添加一个叶子节点,只需要O(1)次存储更新,平均情况下,只需要9.6w的GAS。使用Groth16算法,证明叶子节点在树上,也只需要不到50w的GAS。
附上,好朋友从现场发回的其他照片,也分享给小伙伴们(图片中有一些地方有错误,发现错误的小伙伴留言,有奖励~):
比推快讯
更多 >>- 某鲸鱼向币安转入 541,108 枚 SOL,价值约 109,640,112 美元
- 美联储主席鲍威尔将于周三凌晨 00:20 发表讲话,或左右市场对降息节奏及整体货币政策的预期
- Solana 第三季度链上实际经济价值达 2.23 亿美元,Tron 以 1.6 亿美元位居第二
- Ju.com 将于今日 17:00 上线 LEO/USDT 交易对
- 韩国当局重启对币安收购 Gopax 的审查,或为重返韩国市场铺路
- Garrett Jin:市场仍偏空,当前反弹主要由过度杠杆推动
- 加州实施新法案,保护无人认领加密货币免于强制清算
- Solana 官方 x 与创始人 toly 转发有关 solana 中文名征集的推文
- Whales Market 盘前市场 ENSO 上涨至 5 美元
- 圆桌 Space 预告:链上“冰与火之歌”主题论坛即将开启
- 孙悟空已上线 AIA、COAI、STBL、AVNT 合约交易
- Farcaster 上线存款奖励活动,未来十周为用户提供 10%奖励
- 佳士得创投基金将投资重点调整为 Web3、金融科技、AI 和硬件四个领域
- 数据:当前加密恐慌贪婪指数为 39,处于恐慌状态
- 日经 225 指数日内跌幅达 2%
- 阿布扎比 ADI 基金会将发行阿联酋迪拉姆稳定币
- Scallop 锁仓量突破 5000 万枚 SCA,占代币流通供应量 40%
- 现货黄金站上 4160 美元/盎司,日内涨 1.18%
- Plasma 链上 DEX Lithos 将于明日 TGE
- 另有两位巨鲸大举做空市场,共持有约 1.82 亿美元主流币空头头寸
- JustLendDAO × TokenPocket 回购销毁共识季 3000 USDT 等你来赢
- 中文去中心化合约交易所孙悟空单日交易额达 1 亿 USDT
- 某用户因签署恶意授权损失价值 20.98 万美元的 WBTC 和 tBTC
- Arthur Hayes:美国或将开启“穷人版 QE4”,利好比特币上涨
- Binance 透露 ENSO 代币经济学:HODLer 空投奖励 175 万枚,TGE 时总供应量 1 亿枚
- Strata 主网已上线,为用户提供加密原生收益
- CZ 回应个人资产在 10.11 闪崩后增长 100 亿美元:该数据既不实时也不准确
- Hyperwave 宣布将开启 HWAVE 代币公售
- Project 0 整合 Solana 生态 DeFi 协议以增强流动性
- A 股稳定币数字货币板块拉升,东信和平涨停
- 数据:Coinbase 黑客均价 4,269 美元买回 9,240 枚 ETH,价值 39,450,000 美元
- 昨日美国比特币现货 ETF 净流出 3.2671 亿美元
- 币安 Alpha 已完成 Griffin AI(GAIN)合约置换并开放新代币交易
- Ethena Labs:USDtb 智能合约已转移至 Anchorage Digital
- 1kx 基金联创相关钱包仓位已实现翻倍,曾精准捕捉头肩底行情
- RWAfi 层协议 Novastro 将推迟 TGE 日期,仍将于本月进行
- 观点:Garrett Jin 或只是代理人,真正幕后人员或为两位 WLFI 联创
- Binance 2018 年向马耳他捐赠的癌症基金未被提取,现价值已达 3900 万美元
- Coinbase 黑客 3 小时前买入价值 2323 万美元 SOL
- 数据:Hyperliquid 平台鲸鱼当前持仓 61.34 亿美元,多空持仓比为 0.82
- 数据:某比特币 OG 增持空头头寸至 3,440 枚 BTC,价值约 3.92 亿美元
- 链上侦探 Eye:HL 巨鲸或与白宫消息内幕交易团体有关,涉案核心疑为 Zach Witkoff 与 Chase Herro
- 矿企 MARA Holdings 通过 FalconX 再度增持 200 枚 BTC
- Polymarket 上CZ 今年获特朗普赦免概率升至 55%
- 摩根大通高管:该行将参与加密货币交易业务,但仍不会进行托管
- OKX Star:X Layer 从不反对 Memecoin,反对的是交易平台放弃中立与客观的立场亲自下场、操控舆论等
- glassnode:暴跌后比特币市场结构依然完好,结构性资本和机构需求仍在
- Tether Treasury 凌晨在以太坊新增铸造 10 亿枚 USDT
- 某黑客地址今日买回 9240 枚 ETH,波段操作使其持币量增加 280 枚
- 美联储保尔森:力挺年内再降两次息,政策应当忽略关税短期影响
比推专栏
更多 >>观点
比推热门文章
- Ju.com 将于今日 17:00 上线 LEO/USDT 交易对
- 韩国当局重启对币安收购 Gopax 的审查,或为重返韩国市场铺路
- Garrett Jin:市场仍偏空,当前反弹主要由过度杠杆推动
- 加州实施新法案,保护无人认领加密货币免于强制清算
- Solana 官方 x 与创始人 toly 转发有关 solana 中文名征集的推文
- Whales Market 盘前市场 ENSO 上涨至 5 美元
- 圆桌 Space 预告:链上“冰与火之歌”主题论坛即将开启
- 孙悟空已上线 AIA、COAI、STBL、AVNT 合约交易
- Farcaster 上线存款奖励活动,未来十周为用户提供 10%奖励
- 佳士得创投基金将投资重点调整为 Web3、金融科技、AI 和硬件四个领域