Skip to content

Commit 0184cfa

Browse files
Merge pull request #163 from StarryDeserts/main
昨天忘提交 PR 了
2 parents ae054a6 + b60b945 commit 0184cfa

File tree

3 files changed

+270
-0
lines changed

3 files changed

+270
-0
lines changed
Loading

.starrydeserts_image/tries.png

142 KB
Loading

StarryDeserts.md

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,4 +640,274 @@ type ConsensusEngine interface {
640640

641641

642642

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+
643913
<!-- Content_END -->

0 commit comments

Comments
 (0)