中国专业家居装修装饰时尚门户网站
首页 >> 电子货币

以太坊全网算力查询欧易(从以太坊主网逐一收集区块)

来源:峰值财经 发布时间:2023-05-13 浏览量:

从以太坊主网逐一收集区块

对每一个区块分别抽取出交易需要访问的状态,以及被交易访问的智能合约字节码

(通过计算状态默克尔树根)选取出足以验证所提取状态确实属于状态的最少哈希值集合

添加一些结构信息,将上述证明(哈希值集合)和状态抽取物编码为树型结构。可能采用的编码方式不是最好的,不过结果表明编译出来的输出远小于其他部分,所以可接受。

将区块证明编码为字节数组。

将字节数组解码出区块证明(即那个树型结构的数据,一些节点来自于状态,一些则是无关状态部分的哈希值)。

再次执行区块,不过这回不访问当前状态,而是直接与区块证明进行交互。

验证状态根和所有存储根的正确性。

整个流程花了不少时间,但我希望得到的数据足够精确。如我所料,虽然这个原型已经能处理许多琐碎的问题(因为 hexary 的默克尔帕特里夏树包含叶节点、扩展节点、嵌入节点等等复杂的结构),还是有一些罕见情况导致我的原型报错(在区块 5340939、5361803、5480357、5480507、5480722、5632299、5707052、5769636 ...... );不过考虑到 670 万个区块中只出现数十个报错,我有信心这些小问题不会影响数据分析的结果(当然,我会尽快 debug)。

目前我的数据只采集至第 6757045 个区块,但我想很快就能超过这个数字。

第一张图表表示区块证明的总体量(注:所有图表都经过窗口 = 1024 的移动平均计算)。

在伪龙硬分叉(区块 2675000)之前,少量的 gas 消耗也可能产生非常大的区块证明, 这个缺陷已经在 2016 年秋天被修复。

下面我们只看伪龙硬分叉后至今的数据表现:

为了清除余额和 nounce 值为零的账户状态,伪龙硬分叉后进行 “状态清理”,导致图表最左侧 “峰值” 的出现。但 2017 年下半年,以及 2018 年的 “区块证明” 的规模已经超过了当时的水平。

分解

首先,我们将区块证明分解为三个部分:1)所有与 “主” 状态树有关的部分;2)所有与合约存储树有关的部分;3)智能合约字节码。

可能从图上有点看不清楚,不过可以看到 2016 年发生的垃圾攻击造成当时的字节码(红线)和 “主” 状态树的区块证明(黄线)激升。有些人还记得,当时对于智能合约的字节码大小并没有限制(现在限制小于 24k),造成当时能够部署超大的智能合约,并通过 EXTCODESIZE 之类的函数进行查询。

实施伪龙硬分叉后的图表表明,主默克尔树的区块证明在过去大部分时候体量占比较大,不过合约存储证明(蓝线)和字节码随后开始赶上。

分解状态树区块证明

这里我们会进一步将状态树区块证明分解为四个部分。前两部分是交易需要读取的键值对,或者是为了满足默克尔帕特里夏树的一些特殊需求所需的数据。

看起来状态清除操作对于读取键值对还是造成很大的影响。我们会发现键值对中值的大小(一般是 80 字节)通常比键要大得多( key 一般小于 64 字节,而我刚刚才意识到键可以被压缩,因为我把每个十六进制数都算为一个字节������)。

接下来,我们看看用来建构默克尔证明的哈希值,以及那些我称之为 “mask(掩码)” 的结构化信息:

可以轻易发现,相比于哈希值,结构化信息的大小是可以忽略不计的;也可以进一步说明哈希值占区块证明大小的主要组成部分(对于合约存储证明来说也是如此)。

分解合约存储证明

与前面相同,首先是键值对:

有意思的是,合约存储证明中键值对的值(最多占 32 字节)通常远小于键。

接着是哈希值和结构化信息:

可以看到,与状态树区块证明的表现相似。

从以太坊主网逐一收集区块

okex以太坊今日行情

#欧易OKEx##以太坊[超话]##数字货币#

友情链接