当前位置:首页 > 物联网 > 区块链
[导读] 这几天在日本大阪正在举办Devcon 5。议题中有个topic吸引我的眼球: 在以太坊上,传统的Merkle树(深度为33)添加一个叶子节点,除了计算33次Hash函数外,还需

这几天在日本大阪正在举办Devcon 5。议题中有个topic吸引我的眼球:

在以太坊上,传统的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树的原因。

1. 核心算法

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. 性能分析

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次计算

3. 测试结果

在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。
来源: 星想法 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

北京2023年9月19日 /美通社/ -- 随着科技的快速发展,我们正处在一个数据爆炸的时代。超大规模数据中心作为数据的重要存储和处理场所,其数量在不断增长,与之而来的数据量也在呈指数级增长。这不仅包括原始数据,还包括分...

关键字: 分布式 节点 软件 数据中心

(全球TMT2023年9月5日讯)在2023年华为云沙特峰会上,华为宣布,华为云利雅得节点正式开服。本次开服后,利雅得节点将成为华为云服务中东、中亚和非洲的核心节点。华为云利雅得节点通过3AZ(可用区)架构,提供了高可...

关键字: 节点 华为云 云服务 GO

沙特阿拉伯利雅得2023年9月4日 /美通社/ -- 在2023年华为云沙特峰会上,华为宣布,华为云利雅得节点正式开服,推动该国数字经济增长。 本次开服后,利雅得节点将成为华为云服务中东、中亚和非洲的核心节点,可提供创...

关键字: 华为云 节点 AI 数字化

全闪存存储的历史性时刻到来! 北京2023年8月30日 /美通社/ -- Gartner最新数据显示,2023年第一季度全球外部存储市场同比增长0.5%;其中,全闪存阵列同比增长3.6%,市场规模超过非全闪存阵列,占整...

关键字: 数据中心 数据存储 节点 机械硬盘

广州2023年8月29日 /美通社/ --  8月28日,保健食品行业迎来新规,国家市场监管总局正式发布《保健食品新功能及产品技术评价实施细则(试行)》(简称《实施...

关键字: UI BSP JOURNAL 检测方法

杭州2023年8月25日 /美通社/ -- 8月17日,以"绿色永续制造"为主题,正泰新能常务副总裁、可持续发展官黄海燕在在近期的一次公开演讲中,公布了以2028年、2035年和2050年为主要时间节...

关键字: 可持续发展 光伏组件 ROM 节点

(全球TMT2023年8月11日讯)8月9日,杭州鄂达精密机电科技有限公司的德沃克智造MES项目全面启动。鄂达精密成立于2007年,是一家专业从事高精密机电零部件设计研发、制造、销售为一体的国家级高新技术企业。鄂达精密...

关键字: 机电 节点 零部件 仓储物流

北京2023年2月27日 /美通社/ -- 2月25日,由中企联合CHIRC主办的"第十七届中国雇主品牌年会暨年度颁奖盛典"在京举行。 第十七届中国雇主品牌年会暨年度颁奖盛典现场 经中国雇主品牌年...

关键字: 数字化 SAAS 节点 创始人

北京2023年2月23日 /美通社/ -- 晴空万里、群星璀璨的丽江高美古,在纳西语中的释义是"天气好、星星多、离天最近的地方"。这里的年平均晴天超200天,视宁度达到世界优良台址的水平,大气洁净透明...

关键字: 分布式 望远镜 节点 读写

EFFISAYIL™ 2临床试验显示,佩索利单抗能显著预防泛发性脓疱型银屑病(GPP)发作长达48周1,2 该研究结果建立在EFFISAYIL™ 1临床试验数据基础之上,EFFISAYIL™ 1临床试验表明使...

关键字: GP UI
关闭
关闭