值得信赖的区块链资讯!
零知识证明 – 一种新型的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。
附上,好朋友从现场发回的其他照片,也分享给小伙伴们(图片中有一些地方有错误,发现错误的小伙伴留言,有奖励~):
比推快讯
更多 >>- 欧委会:社交媒体 X 已就“蓝标认证”提交整改方案
- 以太坊基金会发布 “EF Mandate” 重申网络核心使命
- Ammalgam 上线主网,推出统一借贷交易协议与策略 Vault
- Robinhood:2 月加密交易量同比大增 74% 达 250 亿美元,事件合约交易量降至 24 亿份
- Binance 将下架 ALGOUSD、SANDUSD、ATOMUSD 永续合约
- 美国银行:油价飙升或推高美联储通胀预测
- 华尔街日报:五角大楼考虑增派军舰护航霍尔木兹海峡
- 美国 3 月密歇根大学消费者信心指数初值 55.5,预期 55,前值 56.6
- 美国 3 月一年期通胀率预期初值 3.4%,预期 3.7%,前值 3.40%
- 某巨鲸将 2270 万美元 XAUT 换仓 10242 枚 ETH
- WSJ:美国防部考虑派遣更多军舰前往中东,以护送油轮通过霍尔木兹海峡
- 纳斯达克 100 指数涨幅扩大至逾 1%
- 美国罗素 2000 指数涨幅超过 1%
- 美贸易代表:关税退款应以奖金形式发放给员工
- 某交易员 3.13 亿美元 BTC 及 ETH 多单浮盈 2596.8 万美元
- 以太坊短时拉升触及 2200 美元
- 美股高开,加密货币概念股大幅上涨,BMNR 涨 7.79%
- 美股三大股指高开,道指涨 0.47%,Adobe 大跌 7%
- 道琼斯指数开盘上涨 330.88 点,报 47,008.73 点
- 摩根大通:美股散户风险偏好降温,股票购买下降约 30%
- 波场 TRON 社区发起 v4.8.1 新功能讨论提案,推动网络兼容性进一步升级
- Trend Research 向 Binance 转入 1.5047 亿枚 USDC,或购入更多 ETH
- Trend Research 关联地址从币安提取 2.7 万枚 ETH 并存入 1.5 亿枚 USDC
- Nick Timiraos:核心 PCE 1 个月年化为 4.5%,整体个人消费支出 1 个月年化为 3.4%
- 数据:140.24 枚 BTC 从 Grayscale 转入 Coinbase Prime,价值约 1020 万美元
- 沙特据称减产 200 万桶/日应对霍尔木兹海峡封锁
- Trend Research 从币安提取 27,000 枚 ETH,价值约 5797 万美元
- 阿联酋再遭导弹与无人机袭击,部分中东资金考虑转移至新加坡
- 英媒:欧洲部分国家与伊朗磋商恢复霍尔木兹海峡航运
- 前摩根大通等机构交易员推出加密自营交易平台 Velotrade
- 某巨鲸抛售价值 1,170 万美元的 XAUT,换入 5,313 枚 ETH
- Kraken 旗下代币管理平台 Magna 集成 RootData,以发掘更多 BD 线索
- 上市公司 UTime 拟以 8000 万美元收购 Web3 数据平台“非小号”
- 市场分析:核心 PCE 连续增高对美联储鸽派不利
- 数据:9.68 万枚 SOL 转入 Binance,价值约 874 万美元
- 美国第四季度核心 PCE 物价指数年率修正值 2.9%
- 市场消息:交易员押注美联储将在 9 月前降息
- 美国核心 PCE 创近两年高位,符合预期
- 某巨鲸 10 天内从币安囤积 1.4 亿美元 BTC
- 美国国防部长赫格塞思:霍尔木兹海峡已开放通行,但伊朗仍在向船只开火
- 美银警告市场走势类似 2007 年危机前夕
- Solana Shanghai Builder Station 开幕仪式已被取消,官方已删推
- 美国防部长:伊朗新任最高领袖可能受伤
- 某巨鲸今日买入 968 万美元 TRUMP 浮盈 272 万美元,曾在 MELANIA 亏损 1568 万美元
- 今夜美国 PCE 数据或意外走高,为美联储降息前景增添不确定性
- Opinion 推出 50% Maker 返佣机制,做市商可获交易手续费分成
- Bitcoin Policy Institute:呼吁修改将所有 BTC 支付视为资本利得的美国税收规则
- 某巨鲸出售 13739 枚 ETH,价值 2896 万美元
- 观点:油价冲击下比特币短期难成避险资产,若油价维持高位或跌至 5 万–5.8 万美元
- RootData 发布加密交易所透明度榜单(股票类),Binance Alpha、Gate、Bybit 领先
比推专栏
更多 >>- 懂王:那就大家一起難受吧|0313亞盤後
- 当黄金被「困」在迪拜,是时候旗帜鲜明「唱多」香港了
- 東大、波斯、阿拉伯【第七次/進展/能源變量】|0310東3.5
- 从 HSK 到 USDGO:香港两大持牌机构,开始「脱钩」
- There is no new boss YET
- New situation and new games|0305 Asian
- B52 Were on the way to Iran|0304 Middle East
- 开放独角兽门票:从 Robinhood 到 MSX,一场 Pre-IPO 的链上平权实验
- Big player's 『Trigger moment』|0227Europe
- 简街有没有「操纵」BTC?拆解 AP 制度,读懂 ETF 申赎机制背后的定价权博弈
比推 APP



