
零知识证明 – 一种新型的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。
附上,好朋友从现场发回的其他照片,也分享给小伙伴们(图片中有一些地方有错误,发现错误的小伙伴留言,有奖励~):
比推快讯
更多 >>- 某巨鲸从币安提取 3.3 万枚 SOL 并存入 HyperLiquid 出售
- Galaxy Digital 于过去 5 小时内再次购入 325,000 枚 SOL
- 本周 NFT 交易额回升 5.69%至 1.066 亿美元,买卖双方数量骤降近 70%
- 一用户做空 PUMP 浮亏 3500 万美元,总亏损超 4410 万美元
- 以太坊基金会公布端到端隐私路线图,涵盖写入、读取与证明
- 数据:ETH 当前全网 8 小时平均资金费率为 0.0074%
- Derive 联创提议将 DRV 代币供应量增加 50%,现有持有者权益预计稀释 33%
- Shibarium 跨链桥遭到闪电贷攻击,损失超 240 万美元
- SharpLink Gaming 以太坊财库未实现利润达 9.76 亿美元
- Pump.fun 联创:直播流数量已超 Rumble,正加速抢占市场份额
- 两年前建仓 ETH 的鲸鱼向 OKX 转入 3000 枚,累计浮盈超 3700 万美元
- PUMP 涨破 0.0072 美元创历史新高,日内涨幅超 13%
- 数据:过去 24h Binance 净流入 2.01 亿 USDT
- 以太坊提币放缓,过去 24 小时 CEX 净流入 7627.44 枚 ETH
- 巴西金融科技公司 Meliuz 推出新策略以增持其比特币储备
- CryptoQuant 分析师:ETH 正处于最强周期之一
- 美联储 9 月降息 50 个基点概率为 6.6%
- USDH 竞标战况:Native Markets 当前获 71.18%质押份额支持,获胜概率升至 98.1%
- Balaner:MKR 迁移至 SKY 拟于 9 月 18 日截止,逾期或将引发损失
- X Layer 过去 24 小时链上交易量达 7745 万美元,环比上涨 116%
- Binance Alpha 新一期 ZEUS 空投单号收益约 48 美元
- USAT 官网声明:非美国法定货币,不受任何政府机构的保险保障
- 美国国会预算办公室下调美国今年经济增长预测
- Tether 新稳定币 USAT 计划于年底前推出
- 央行数研所所长:应该对数字人民币的计量框架进行升级
- 网信办公开征求意见,鼓励金融机构探索使用数字人民币等新型支付方式开展跨境支付
- DDC 与 Wintermute 达成合作,以获取现货及衍生品领域场外流动性
- DefiLlama 创始人:因质疑 Figure 数据遭到施压,其大多贷款流程几乎找不到链上支付交易
- 下周宏观重要事件,周四 2:00 美联储 FOMC 将公布利率决议
- 数据:17 家实体 SOL 财库储备已超当前总供应量的 2%,持仓突破 1170 万枚
- 分析:Gemini 为散户投资者预留 30%IPO 份额或使其避免“首日暴涨但难以维持”市场风险
- Vitalik:以太坊计划明年扩展 10 倍,同时保持去中心化和安全性
- 下周宏观展望:“超级央行周”来临,美联储降息周期重启在即
- 某巨鲸高杠杆做多 BTC、DOGE 等代币,目前浮盈超 900 万美元
- Binance:今日 22 时起将有 Alpha 空投可领取,门槛 200 积分
- Circle 高管:USDC 锚定资产储备约 90%由贝莱德托管
- 美国前财长萨默斯:特朗普会意识到抨击美联储风险极高,稳定币不会让市场对美债净需求大增
- 香港投资推广署于外滩大会探讨数字资产与通证化发展
- 比特币市占率降至 57.35%,接近年内最低水平
- 赵长鹏:银行需要采用 BNB,愿意协助整合
- Kame Aggregator 今晨遭黑客攻击,后者已退还 185 枚 ETH
- SOL 中期目标价为 360 美元
- Galaxy Digital 研究主管:美国很有可能建立战略比特币储备
- 分析:已实现 BTC 矿工流入交易平台价值于 8 月 13 日达到历史峰值,预示潜在抛售压力
- Bitdeer 比特币总持仓量突破 1935 枚,本周挖矿产出 106.2 枚 BTC
- 某钱包斥资 1891 万枚 DAI 购入 3956 枚 ETH
- 萨尔瓦多近 7 日共增持 28 枚 BTC,总持仓达 6,317.18 枚
- 周六福战略投资高盈证券以探索香港数字资产市场
- ether.fi 基金会:本周使用协议收入购入 24.7 万枚 ETHFI,sETHFI 持有者分发量增至约 10.9 万枚
- WORLD 3 参投 Hash Global BNB 分红基金,建立长期战略储备
比推专栏
更多 >>观点
比推热门文章
- 某巨鲸从币安提取 3.3 万枚 SOL 并存入 HyperLiquid 出售
- Galaxy Digital 于过去 5 小时内再次购入 325,000 枚 SOL
- 本周 NFT 交易额回升 5.69%至 1.066 亿美元,买卖双方数量骤降近 70%
- 一用户做空 PUMP 浮亏 3500 万美元,总亏损超 4410 万美元
- 以太坊基金会公布端到端隐私路线图,涵盖写入、读取与证明
- 数据:ETH 当前全网 8 小时平均资金费率为 0.0074%
- Derive 联创提议将 DRV 代币供应量增加 50%,现有持有者权益预计稀释 33%
- Shibarium 跨链桥遭到闪电贷攻击,损失超 240 万美元
- SharpLink Gaming 以太坊财库未实现利润达 9.76 亿美元
- Pump.fun 联创:直播流数量已超 Rumble,正加速抢占市场份额