1.ブロック構造
さまざまなブロックチェーンプロジェクト(イーサリアムなど)では、ノードは多くの場合、各ブロックヘッダーに記録される3つのトライルートを維持する必要があります
- stateRoot
- transactionRoot
- receiveRoot
コード:https://github.com/ethereum/go-ethereum/blob/053ed9cc847647a9b3ef707d0efe7104c4ab2a4c/core/types/block.go
二、TransactionsRoot
TransactionsRootは、ブロック内のトランザクションで構成されるTrieのルートを格納します。TransactionRoot
は最も単純な機能を備えており、受信者がブロック内のトランザクションの整合性をチェックするために使用します。
3、ReceiptsRoot
ReceiptsRootは、トランザクションの領収書の内容を保存します
レシート自体は、トランザクションがブロックで正常に実行されたかどうかを記録します。
コード:https://github.com/ethereum/go-ethereum/blob/ddadc3d27379a3326fd1b78278e5e5da44a91d94/core/blockchain.go
receipts, logs, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig)
4、StateRoot
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の違い
機能は非常に似ており、どちらもトランザクションの実行結果が正しいかどうかを確認します。
なぜ2回実装する必要があるのですか?StateRootをヘッダーと比較することで、トランザクションの内容が正しく、実行の順序が正しいことを確認できますか?
領収書の内容を詳しく見てみましょう
ReceiptsRoot
コード:https://github.com/ethereum/go-ethereum/blob/7770e41cb5fcc386a7d2329d1187174839122f24/core/state_processor.go
トランザクションが正常に実行されたかどうかを記録するresult.Failed()に加えて、注意が必要なreceipt.GasUsedフィールドもあることがわかりました。
このフィールドは、現在のトランザクションが実行された後、ブロックによって消費されたガスの量を示します。
したがって、receptionsRootには、トランザクションの実行順序の一貫性もあります。
ただし、順序は一貫しています。stateRootの一貫性によって確認できます。
StateRoot
コード:https: //github.com/ethereum/go-ethereum/blob/ddadc3d27379a3326fd1b78278e5e5da44a91d94/core/blockchain.go
stateRootのコンテンツを見ると、Accountのコンテンツがあります。StateRootは、より多くの世界環境のルートです。そのため、彼はトランザクション実行後の世界をより表現しています。
総括する
receiveRootとStateRootの機能は、トランザクションの実行が正しく信頼できるかどうかを確認することです。
違いは、recipientRootは、トランザクション実行の成功と失敗、および実行順序のみを示すことです。
StateRootの役割は、トランザクションの実行後の世界の状態を記録することです。
イーサリアムは、叔父ブロックなどの孤立したブロックの存在を許可することに注意してください。
BPノード自体が非メインストリームフォーク上にある場合、それが生成するStateRootは、レシーバーによって実行されるStateRootとは異なり
ます。StateRootを単純に比較して、BPノードが悪のノードであると盲目的に考えると、やや不公平になります。実行環境が同じであるかどうかに関係なく、receivesRootを比較することで、トランザクションの実行の正確性についてコンセンサス
を得ることができます。
このように、イーサリアムは叔父のブロックに対してより友好的です。
https://blog.csdn.net/cemao4548/article/details/105939491