
零知识证明 – 一种新型的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。
附上,好朋友从现场发回的其他照片,也分享给小伙伴们(图片中有一些地方有错误,发现错误的小伙伴留言,有奖励~):
比推快讯
更多 >>- 白宫数字资产政策顾问:“加密周”将巩固美国的全球加密货币之都角色
- Tabi 旗下 TabiPay Alpha 测试启动,限量 1,000 名额
- 马耳他资管公司 Samara Asset Group 披露持有 525 枚 BTC,相当于其市值的 28%
- 0xSun 谈 pump.fun 发币参与策略:可根据公售速度制定不同的策略
- 挪威工业投资公司 Aker ASA 通过比特币寻求资本平衡配置,目前持仓达 754 枚
- BlockFi 破产管理人与美国司法部达成和解,驳回 3500 万美元诉讼
- Solana 区块链策略游戏 Honeyland 被 BRAVO READY 收购
- 数据:CoinUp 平台币 CP 现报 0.47 美元,较开盘价涨幅逾 15 倍
- 某地址向 Hyperliquid 存入 135 万 USDC 并做以 2 倍杠杆多 PUMP
- 某鲸鱼/机构归集休眠 2 年钱包,总计积累 51,431 枚 ETH,浮盈超 20 倍
- Sunriselayer:空投申领检查器已上线,申领练习将于北京时间 15 日 8 时结束,主网及 TGE 于 Q3 进行
- 数据:比特币 ETF 产生的需求近两日已达日产量的 20 倍左右
- 疑似质押服务商 Arthapala 过去一小时再次向 CEX 充值 4120 枚 ETH
- Arthur Hayes 过去一天通过多种渠道购买价值 150.5 万美元 ENA
- 继 Coinbase 之后,OpenSea、MoonPay、波卡等项目官方账号头像换为胖企鹅形象
- Aethir:节点许可证转移系统上线,系首个解锁节点二级市场的加密项目
- 某聪明钱加仓 40 倍比特币空单,入场均价达 11.77 万美元
- 美国比特币现货 ETF 首次连续两日净流入超 10 亿美元,该 ETF 推出以来仅 7 次日流入量超 10 亿
- 分析师:历史数据显示 7 月、10 月是比特币表现最稳定的增长月份
- 3A 区块链游戏 Seraph 启动紧急回购应对价格波动,链上地址透明公示
- 恺英网络香港子公司获 SFC 颁发 4 号及 9 号牌照,加速全球化布局
- PUMP 于 Hyperliquid 盘前市场未平仓量已达 1.52 亿美元,资金费率偏空
- Hyperliquid 未平仓合约达 10.6 亿美元,创历史新高
- 多个昨日热门代币出现“钓鱼线”走势,普遍下跌 10%-30%
- 某新建钱包地址买入 11.88 万枚 HYPE,均价 46.27 美元
- Crypto.com 探索在迪拜免税店引入加密货币支付
- 24 小时现货资金流入/流出榜:ETH 净流出 2.53 亿美元,BTC 净流出 2.23 亿美元
- Meta 收购语音初创公司 PlayAI,以增强音频技术
- Letsbonk 创始人:平台网站更新预计下周陆续推出
- 某鲸鱼昨晚 15 倍杠杆做空 ETH,仓位高达 3.7 万枚 ETH,名义价值 1.1 亿美元
- 路华证券拟申请香港虚拟资产交易牌照并引入稳定币支付结算业务
- Bitcoin Treasury Capital:以 500 万瑞典克朗增持 4.4 枚 BTC,当前持仓总量增至 152 枚
- 数据:过去 7 天 USDC 流通量约增加 7 亿枚
- Huma 2.0 存款将于 7 月 13 日开放,单个钱包额度 50 万美元
- RootData:QUAI 将于一周后解锁价值约 184 万美元的代币
- 某 Smart Money 地址清仓 141.7 枚 BTC,持币 1 个月获利 182 万美元
- 男子因 SIM 卡交换盗取 2200 万美元加密货币刑期增加至 12 年
- FTX/Alameda Staking 地址向 Bitgo Custody 转移 18.98 万枚 SOL,价值 3117 万美元
- Binance Alpha 昨日交易量报 4.24 亿美元,BR、KOGE、quq 分列前三
- 华尔街日报:谷歌耗资 24 亿美元获 Windsurf 技术授权并聘用部分员工
- Linea 项目负责人:本月发布的公告将与 TGE 相关
- CoinUp.io 平台币 CP 将于今日 15 点(UTC+8)全面开放交易
- 1inch 团队过去 16 小时疑似再次购买 1181 万枚 1INCH,价值 330 万美元
- “美联储传声筒”提及鲍威尔辞职报道:第一反应是无视它,鲍威尔已做出过坚决表态
- Clanker 已使用 GoPlus 安全代币发行标准 SafeToken Protocol 并获得代币安全认证
- 稳定币基础设施初创公司 Zerohash 计划以近 10 亿美元估值融资 1 亿美元,Interactive Brokers 领投
- 非营利开发组织 Argot 6 小时前出售 1206.6 枚 ETH 换取 361 万美元
- 某巨鲸昨日买入 3490 亿枚 PEPE,累计持仓价值 623 万美元
- 黄仁勋再度减持英伟达 22.5 万股,价值约 3640 万美元
- 某新建地址 2 小时前从 FalconX 提现 16,773 枚 ETH
比推专栏
更多 >>观点
比推热门文章
- 白宫数字资产政策顾问:“加密周”将巩固美国的全球加密货币之都角色
- Tabi 旗下 TabiPay Alpha 测试启动,限量 1,000 名额
- 马耳他资管公司 Samara Asset Group 披露持有 525 枚 BTC,相当于其市值的 28%
- 0xSun 谈 pump.fun 发币参与策略:可根据公售速度制定不同的策略
- 挪威工业投资公司 Aker ASA 通过比特币寻求资本平衡配置,目前持仓达 754 枚
- BlockFi 破产管理人与美国司法部达成和解,驳回 3500 万美元诉讼
- Solana 区块链策略游戏 Honeyland 被 BRAVO READY 收购
- 数据:CoinUp 平台币 CP 现报 0.47 美元,较开盘价涨幅逾 15 倍
- 某地址向 Hyperliquid 存入 135 万 USDC 并做以 2 倍杠杆多 PUMP
- 某鲸鱼/机构归集休眠 2 年钱包,总计积累 51,431 枚 ETH,浮盈超 20 倍