主页 > imtoken最新版客户端 > 什么是区块链以太坊三重态根交易r

什么是区块链以太坊三重态根交易r

imtoken最新版客户端 2023-02-12 05:06:40

1、块状结构

在各种区块链项目(如以太坊)中,节点往往需要维护三个Trie Roots,记录在每个区块头中

区块链 以太坊 三元组是什么 state root  transaction root receipt root_执行顺序

代码:

区块链 以太坊 三元组是什么 state root  transaction root receipt root_以太坊_02

2.交易根

TransactionsRoot 存储区块中交易组成的 Trie 树的 Root

TransactionsRoot 的作用是最简单的,它被接收方用来检查区块中交易的完整性。

以太坊区块链每天产币多少_siteethfans.org 以太坊区块浏览_以太坊区块结构

3.收据根

ReceiptsRoot 存放交易收据内容

区块链 以太坊 三元组是什么 state root  transaction root receipt root_以太坊_03

收据本身记录了交易是否在区块中成功执行。

代码:

receipts, logs, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig)

区块链 以太坊 三元组是什么 state root  transaction root receipt root_以太坊_04

以太坊区块结构_siteethfans.org 以太坊区块浏览_以太坊区块链每天产币多少

4.状态根

StateRoot 记录交易执行结束后的世界状态。

if root := statedb.IntermediateRoot(v.config.IsEIP158(header.Number)); header.Root != root {
return fmt.Errorf("invalid merkle root (remote: %x local: %x)", header.Root, root)
}

但是这个StateRoot和ReceiptRoot的作用好像差不多。

检查状态变化结果是否正确。

5.ReceiptsRoot和StateRoot的区别

功能很相似,都是检查交易的执行结果是否正确。

以太坊区块链每天产币多少_以太坊区块结构_siteethfans.org 以太坊区块浏览

为什么要执行两次? 是否可以通过比较StateRoot和header的一致性来保证交易内容正确,执行顺序正确?

仔细看看收据的内容

收据根

代码:

区块链 以太坊 三元组是什么 state root  transaction root receipt root_执行顺序_05

我们发现除了result.Failed()记录交易执行是否成功之外,还有一个receipt.GasUsed字段值得关注。

该字段表示当前交易执行后,区块已经消耗了多少Gas。

以太坊区块链每天产币多少_以太坊区块结构_siteethfans.org 以太坊区块浏览

可见receiptsRoot也具有交易执行顺序的一致性。

但是顺序是一致的,还是可以通过stateRoot的一致性来检查。

状态根

代码:

区块链 以太坊 三元组是什么 state root  transaction root receipt root_执行顺序_06

我们看一下stateRoot的内容和Account的内容。 StateRoot 更像是世界环境的根。 所以更多的是表达交易执行后的世界。

总结

以太坊区块结构_以太坊区块链每天产币多少_siteethfans.org 以太坊区块浏览

receiptRoot和StateRoot的作用是检查交易执行是否正确可靠。

不同的是receiptRoot只表示交易执行成功与否和执行顺序。

StateRoot 的作用是记录事务执行结束后的世界状态。

请注意以太坊区块结构,以太坊允许存在孤儿块,例如叔块。

BP节点本身在非主流分叉上时,其生成的StateRoot与receiver执行后的StateRoot不同

简单地比较不同的StateRoots而盲目地认为BP节点是邪恶节点是不公平的。

无论执行环境是否相同以太坊区块结构,我们都可以通过比较 receiptsRoot 来确定交易的执行正确性。

这样一来,以太坊对叔块就更加友好了。