主页 > imtoken最新版客户端 > 什么是区块链以太坊三重态根交易r
什么是区块链以太坊三重态根交易r
1、块状结构
在各种区块链项目(如以太坊)中,节点往往需要维护三个Trie Roots,记录在每个区块头中
代码:
2.交易根
TransactionsRoot 存储区块中交易组成的 Trie 树的 Root
TransactionsRoot 的作用是最简单的,它被接收方用来检查区块中交易的完整性。
3.收据根
ReceiptsRoot 存放交易收据内容
收据本身记录了交易是否在区块中成功执行。
代码:
receipts, logs, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig)
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的区别
功能很相似,都是检查交易的执行结果是否正确。
为什么要执行两次? 是否可以通过比较StateRoot和header的一致性来保证交易内容正确,执行顺序正确?
仔细看看收据的内容
收据根
代码:
我们发现除了result.Failed()记录交易执行是否成功之外,还有一个receipt.GasUsed字段值得关注。
该字段表示当前交易执行后,区块已经消耗了多少Gas。
可见receiptsRoot也具有交易执行顺序的一致性。
但是顺序是一致的,还是可以通过stateRoot的一致性来检查。
状态根
代码:
我们看一下stateRoot的内容和Account的内容。 StateRoot 更像是世界环境的根。 所以更多的是表达交易执行后的世界。
总结
receiptRoot和StateRoot的作用是检查交易执行是否正确可靠。
不同的是receiptRoot只表示交易执行成功与否和执行顺序。
StateRoot 的作用是记录事务执行结束后的世界状态。
请注意以太坊区块结构,以太坊允许存在孤儿块,例如叔块。
BP节点本身在非主流分叉上时,其生成的StateRoot与receiver执行后的StateRoot不同
简单地比较不同的StateRoots而盲目地认为BP节点是邪恶节点是不公平的。
无论执行环境是否相同以太坊区块结构,我们都可以通过比较 receiptsRoot 来确定交易的执行正确性。
这样一来,以太坊对叔块就更加友好了。