区块验证必须满足以上公式才能证明区块内容是合法有效的,如果你使用了全节点的Ehereum Wallet,在同步数据的时候,你的机器会嗡嗡作响,这是他们在将同步下来的数据进行有效性检验:

如果你把网络切换到测试网络之后就不会有这个情况,因为测试网络下并不对数据的有效性做严格的校验,所以我一直建议大家一定要使用以太坊的官方钱包体验一下同步数据。

公式1是以太坊当前的全局状态,公式2新打包的区块B,公式3在当前状态的基础上以区块B的数据作为输入,进行新状态的计算,在获取新状态之后使用状态函数并将结果用Merkle 树存储,树根即为当前区块头信息的Hr字段,如果经过计算后发现当前区块的Hr与计算结果相同,则数据校验的第一步就算通过。公式6是数据检验的条件之一。

公式7是对叔叔节点的区块头信息展开进行LH函数运算,LH函数的定义是公式14,加星表示对多元组的数据项分别使用函数f,如公式16定义。如果当前区块的Ho与公式8中运算的结果一致,则第二个条件检查成功。

公式9和10是分别对交易和交易收据用Merkle树存储,并保留其树根,然后用树根的hash值与区块头的Ht,He比较,如果相同,则检验通过。需要注意的是公式9和10里面的表达式的数学含义,以公式9为例,其意义为,对于所有的区块中的交易,每个交易的序号和交易内容通过RLP进行封装,然后将封装后的数据2个一对计算hash值,然后将hash值再2个一对计算hash值,直到最后只保留一个Merkle树根。公式10同理,其过程如下图:

公式12大家应该很熟悉,我们之前已经讲解过这个公式的含义,对未进行最新区块运算前的状态的存储表示,得到的Merkle树根应该是父区块节点的Hr字段。这个过程我再贴一遍:

如果大家对区块的验证代码感兴趣,可以参考下图:

相关文章