@@ -769,4 +769,145 @@ func applyTransaction(tx *Transaction, state *StateDB) error {
769
769
3 . ** 状态快照** :使用` StateDB ` 的快照功能快速回滚
770
770
4 . ** 并行执行** :实验性支持多交易并行执行
771
771
772
+
773
+
774
+ ### 2025.02.15
775
+
776
+ #### 以太坊执行层数据结构学习笔记
777
+
778
+ ------
779
+
780
+ ##### ** 核心数据结构概览**
781
+
782
+ ###### 默克尔树(Merkle Tree)
783
+
784
+ - ** 结构特性**
785
+
786
+ <img src =" .starrydeserts_image/tries.png " alt =" tries " />
787
+
788
+ - ** 核心机制** :
789
+
790
+ - 叶子节点存储数据哈希值
791
+ - 非叶子节点存储子节点哈希的拼接哈希
792
+ - 根哈希存储在区块头中
793
+
794
+ - ** 数据完整性验证** :
795
+
796
+ - $$ \text{篡改检测} \Rightarrow \Delta Data \rightarrow \Delta LeafHash \rightarrow \Delta RootHash $$
797
+
798
+ ###### 前缀树(Patricia Tree)
799
+
800
+ - ** 优化特性** :
801
+ - 共享前缀压缩(如` 0x12A ` 和` 0x12B ` 共享` 0x12 ` 路径)
802
+ - 节点类型精简(分支/扩展/叶子)
803
+ - ** 存储效率** :
804
+ - $$ \text{传统Trie空间复杂度} O(n) \rightarrow \text{Patricia空间复杂度} O(k) \quad (k为键长) $$
805
+
806
+ ###### 默克尔前缀树(MPT)
807
+
808
+ - ** 混合设计** :
809
+
810
+ - 继承Merkle的完整性验证
811
+ - 采用Patricia的存储优化
812
+
813
+ - ** 节点类型** :
814
+
815
+ | 节点类型 | 结构描述 | 示例场景 |
816
+ | -------- | --------------------------- | -------------- |
817
+ | 分支节点 | 17元素数组(16分支+值指针) | 路径分叉点 |
818
+ | 扩展节点 | [ 压缩路径, 子节点哈希] | 单一路径段压缩 |
819
+ | 叶子节点 | [ 剩余路径, 值数据] | 键值对存储终点 |
820
+
821
+ ------
822
+
823
+ ##### ** 以太坊中的MPT应用**
824
+
825
+ ###### 四大核心Trie结构
826
+
827
+ | Trie类型 | 存储内容 | 更新频率 | 根哈希位置 |
828
+ | ------------ | ---------------------------- | ------------ | ------------------------- |
829
+ | 交易Trie | 区块内所有交易 | 区块不可变 | BlockHeader.txRoot |
830
+ | 收据Trie | 交易执行结果(日志/Gas消耗) | 区块不可变 | BlockHeader.receiptRoot |
831
+ | 世界状态Trie | 所有账户的当前状态 | 区块可变 | BlockHeader.stateRoot |
832
+ | 账户存储Trie | 智能合约的持久化变量 | 合约调用可变 | 账户对象的storageRoot字段 |
833
+
834
+ ###### 交易Trie构建规则
835
+
836
+ - ** 键值编码** :
837
+ - $$ Key = RLP(交易索引) \quad Value = RLP(交易数据) $$
838
+
839
+ - ** 交易数据结构** :
840
+
841
+ ``` go
842
+ type Transaction struct {
843
+ Nonce uint64
844
+ GasLimit uint64
845
+ To common.Address
846
+ Value *big.Int
847
+ Data []byte
848
+ V , R , S *big.Int // 签名
849
+ }
850
+ ```
851
+
852
+ ------
853
+
854
+ ##### ** RLP编码规范**
855
+
856
+ ###### 编码规则
857
+
858
+ - ** 基本类型** :
859
+
860
+ - 字符串:直接编码为字节序列
861
+ - 整数:大端序无前缀零编码
862
+
863
+ - ** 嵌套结构** :
864
+
865
+ - $$ RLP([a, b, c]) = RLP(a) \oplus RLP(b) \oplus RLP(c) $$
866
+
867
+ - ** 长度标识** :
868
+
869
+ | 数据长度 | 前缀字节 |
870
+ | -------- | ---------------- |
871
+ | 0-55字节 | 0x80 + len |
872
+ | >55字节 | 0xB7 + len字节数 |
873
+
874
+ ###### 应用场景
875
+
876
+ - 交易/收据的序列化存储
877
+ - 状态树节点的键值编码
878
+ - 网络传输数据封装
879
+
880
+ ------
881
+
882
+ ##### ** MPT节点哈希机制**
883
+
884
+ ###### 哈希计算流程
885
+
886
+ 1 . ** 序列化节点** :使用RLP编码节点内容
887
+ 2 . ** Keccak-256哈希** :
888
+ - $$ nodeHash = \text{Keccak256}(RLP(nodeContent)) $$
889
+ 3 . ** 递归计算** :子节点哈希参与父节点哈希生成
890
+
891
+ ###### 安全特性
892
+
893
+ - ** 雪崩效应** :单字节修改导致根哈希完全变化
894
+ - ** 防碰撞保证** :
895
+ - $$ P(\text{哈希碰撞}) \approx \frac{1}{2^{256}} \approx 10^{-77} $$
896
+
897
+ ------
898
+
899
+ ##### ** MPT操作示例**
900
+
901
+ ###### 数据插入流程
902
+
903
+ 1 . 从根节点开始匹配键路径
904
+ 2 . 遇到扩展节点时展开共享前缀
905
+ 3 . 在分支节点处分叉
906
+ 4 . 创建新叶子节点存储值
907
+ 5 . 自底向上更新路径上的所有节点哈希
908
+
909
+
910
+
911
+
912
+
772
913
<!-- Content_END -->
0 commit comments