这几天在日本大阪正在举办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树的原因。
01
核心算法
Shrubs的变种Merkle树的算法原型昨天更新到Github上,地址如下:
https://github.com/celo-org/shrubs
核心算法逻辑在contracts/MerkleTreeLib.sol中的insert和verify函数。
- 插入节点

文章介绍了Shrubs提出的新型Merkle树变种,解决了以太坊上Merkle树更新存储开销大的问题。这种变种每次添加叶子节点只需O(1)次存储更新,平均9.6w GAS费用。同时讨论了Groth16零知识证明在其中的应用,证明叶子节点仅需不到50w GAS。
&spm=1001.2101.3001.5002&articleId=106458382&d=1&t=3&u=2ce8223e72404e34857eeaaa2bad724a)
1239

被折叠的 条评论
为什么被折叠?



