@@ -640,4 +640,274 @@ type ConsensusEngine interface {
640
640
641
641
642
642
643
+
644
+
645
+ ### 2025.02.14
646
+
647
+ #### 以太坊区块构建与交易处理学习笔记
648
+
649
+ ------
650
+
651
+ ##### ** 区块构建概览**
652
+
653
+ ###### 核心参与方
654
+
655
+ 1 . ** 共识层(CL)**
656
+ - 负责验证者选举
657
+ - 确定区块提案者
658
+ - 通过Engine API触发执行层构建区块
659
+ 2 . ** 执行层(EL)**
660
+ - 维护交易池(mempool)
661
+ - 执行交易并生成有效载荷(Payload)
662
+ - 实现状态转换函数
663
+
664
+ ###### 构建流程触发
665
+
666
+ - ** 触发条件** :验证者通过` engine_forkchoiceUpdatedV2 ` 接口接收构建指令
667
+
668
+ - ** 输入参数** :
669
+
670
+ $$ \text{PayloadAttributes} = \{ \text{timestamp}, \text{prev\_hash}, \text{base\_fee}, ... \} $$
671
+
672
+ ------
673
+
674
+ ##### ** 区块构建核心流程**
675
+
676
+ ###### 初始化空区块
677
+
678
+ ``` go
679
+ func buildPayload (env *Environment ) (*ExecutionPayload , error ) {
680
+ emptyBlock := createEmptyBlock (env) // 创建基准空区块
681
+ go asyncFillBlock (emptyBlock) // 异步填充交易
682
+ return emptyBlock, nil
683
+ }
684
+ ```
685
+
686
+ - ** 目的** :确保在时间窗口内至少有空区块可提议
687
+ - ** 异步优化** :后台继续完善区块内容
688
+
689
+ ###### 交易填充机制
690
+
691
+ <img src =" .starrydeserts_image/Transaction-filling-mechanism.png " alt =" Transaction-filling-mechanism " style =" zoom : 33% ;" />
692
+
693
+ - ** 排序规则** :优先选择gas费率高且nonce连续的交易
694
+
695
+ - ** Gas配额管理** :
696
+
697
+ $$ \sum(\text{tx.gasLimit}) \leq 30,000,000 \quad (\text{当前主网Gas上限}) $$
698
+
699
+ ###### 交易执行与状态转换
700
+
701
+ ``` go
702
+ func applyTransaction (tx *Transaction , state *StateDB ) error {
703
+ evm := NewEVM (Context{Block: env}, state)
704
+ result , err := evm.Run (tx) // 执行交易
705
+ if err != nil {
706
+ return err // 失败交易被丢弃
707
+ }
708
+ state.ApplyResult (result) // 更新状态
709
+ return nil
710
+ }
711
+ ```
712
+
713
+ - ** 原子性保证** :单笔交易失败不影响区块整体有效性
714
+
715
+ - ** 状态树更新** :
716
+
717
+ $$ \sigma_{new} = \Upsilon(\sigma_{old}, tx) $$
718
+
719
+ ------
720
+
721
+ ##### ** 关键组件解析**
722
+
723
+ ###### 交易池(TxPool)
724
+
725
+ - ** 数据结构** :
726
+ - ** Pending队列** :已验证待打包交易
727
+ - ** Queued队列** :nonce不连续交易
728
+ - ** 淘汰策略** :
729
+ - ** Legacy交易** :按gas价格大顶堆淘汰
730
+ - ** Blob交易** :按时间衰减窗口淘汰
731
+
732
+ ###### EVM执行环境
733
+
734
+ | 环境变量 | 来源 | 示例值 |
735
+ | ----------------- | ----------------- | ---------- |
736
+ | ` block.timestamp ` | PayloadAttributes | 1700000000 |
737
+ | ` block.number ` | 父区块高度+1 | 18923456 |
738
+ | ` block.basefee ` | EIP-1559动态计算 | 15 Gwei |
739
+
740
+ ------
741
+
742
+ ##### ** 错误处理机制**
743
+
744
+ ###### 交易级别错误
745
+
746
+ - ** 类型** :
747
+ - Gas不足(OutOfGas)
748
+ - 无效操作码(InvalidOpcode)
749
+ - 合约回滚(Revert)
750
+ - ** 处理方式** :
751
+ - 丢弃无效交易
752
+ - 继续尝试打包后续交易
753
+
754
+ 区块级别错误
755
+
756
+ - ** 类型** :
757
+ - GasLimit超标
758
+ - 时间戳不连续
759
+ - ** 处理方式** :
760
+ - 终止当前构建流程
761
+ - 触发CL重新选择提案者
762
+
763
+ ------
764
+
765
+ ##### ** 性能优化策略**
766
+
767
+ 1 . ** 异步填充** :先返回空区块再完善内容
768
+ 2 . ** 交易预验证** :维护已验证交易池
769
+ 3 . ** 状态快照** :使用` StateDB ` 的快照功能快速回滚
770
+ 4 . ** 并行执行** :实验性支持多交易并行执行
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
+
643
913
<!-- Content_END -->
0 commit comments