新版本与之前的版本有了一些变化, 我们基于之前的解析来再次分析一下这个版本.
1. crates
先看 crate 有哪些变化
- bytecode
- database
- ee-tests 略过
- precompile
- primitives
- state
- statetest-types
- context
- interpreter
- inspector
- handler
- revm
- op-revm
总体看来没有变化, 像 ee-tests 这些都略过.
我们按照顺序来看.
2. bytecode
逻辑结构没变
- 主要结构体 Bytecode, 以及 opcode
- Bytecode分为 legacy 和 eip7702,
去掉了 EOF
3. database
逻辑结构没变.
- 基本没有变化.分为 interface 和一些默认实现
可以参考之前的分析
4. precompile
逻辑结构没变.
- 总体上没有太大变化, 核心结构体还是 Precompiles 和 Precompile.
- 有了一些优化.
5. primitives
逻辑结构没变.
- 多了一些 eip 相关的常量
6. state
逻辑结构没变.
- 基本没变, 主要是 Account 和 AccountInfo
7. context
开始上难度了, 这里是分析的开始.
变化还挺大的.
- ContextTr 依赖于 Host
- Host 挪到了 context 这里, 之前是在 interpreter 那里, 而且方法有了变化
- ContextTr 变简单了, 只有 get Txn Block 这些接口
- 但是多了一个 Local 组件, 需要实现 LocalContextTr
- 其他的 Block, Transaction, Cfg, Db, Chain 没有太大变化
- JournalTr 也有变化, 跟随 Host 的变化
7.1 Host
在注释上分成了几大部分
- Block
- Transaction
- Config
- Database
- Journal
这个跟 ContextTr 是对应上的.
变化是多了一些 skip_cold_load, 意思是如果没有在缓存中, 就 skip 掉, 不要继续 load.
- sstore_skip_cold_load
- sload_skip_cold_load
- load_account_info_skip_cold_load
后面的 balance, load_account_delegated, load_account_code, load_account_code_hash 都依赖于此实现
7.2 Local
Local context used for caching initcode from Initcode transactions.
- Local 主要是 shared_memory 这个东西, 之前是在 frame (EthFrame)里面的
- local 文件包含了一个结构体 FrameStack, 之前是没有特定类型的, 而且是在 handler 的 run_exe_loop 里面.
这里放到了 Evm 里面了.
7.3 Journal
里面的方法比之前也多了不少.
8. interpreter
基本上也没太大变化,
- 新增一个结构体 InstructionContext 来包裹 Interpreter 和 Host
- 运行入口还是 run_plain
- 我看到新增了很多的 halt 方法, 但是没有看到 resume 方法, 所以这个还是没办法退出的
9. inspector
略过
10. handler
跟之前的流程非常类似,
- 还是分 4 步走, validation, pre, exe, post.
- 多了 system_call 相关的