Skip to content

Commit b60b945

Browse files
committed
2025.02.15 note
完成打卡 ✅
1 parent 0e3d11b commit b60b945

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed

.starrydeserts_image/tries.png

142 KB
Loading

StarryDeserts.md

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,4 +769,145 @@ func applyTransaction(tx *Transaction, state *StateDB) error {
769769
3. **状态快照**:使用`StateDB`的快照功能快速回滚
770770
4. **并行执行**:实验性支持多交易并行执行
771771

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

0 commit comments

Comments
 (0)