想开发一个最小 EVM 虚拟机

2025-05-11

我给这个项目命名为 echoevm.com,主要目标是从最简单的堆栈操作开始,逐步实现一个完整的以太坊字节码执行环境。

为什么选择这个方向?解析下以太坊客户端的技术模块:

  1. RPC:GRPC 套壳?重点在于协议设计而不是技术实现
  2. P2P:有现成的 libp2p 可用,无非是节点发现、路由表之类,比如深入下 Kademlia DHT?
  3. 账户体系:ECDSA?密码学?
  4. 交易池:交易分析、密封交易、MEV保护方向
  5. 共识机制:共识机制的设计属于研究级别,至少得是个博士发论文、实验室里做研究、出各种测试数据,然后证明在哪方面做出了业界前沿的优化、最后融资雇人做工程化的实现
  6. 储存:搞数据库底层的专家应该干什么都一样,哪里都有用武之地,跟区块链没关系
  7. 数据结构:去研究 Merkle Patricia Tree 的实现吗?
  8. 状态同步:轻节点方向,比如用 Celestia 的核心技术把执行和储存分开,或者 Archive 节点数据的 offload?

综合来看,我倾向于做一件侧重工程而不是学术、同时又有技术含量的事情,无论是从个人技术能力的提升,还是后续有可能带来的成果上,都要有意义。假如这个最小EVM开发出来了,是可以带来一系列成果的,后续也可以基于此延伸出很多更有价值的产品。

从 Solidity 语言到 bytecode 的转换过程,那是编译器专家干的事情,我要做的,是针对 bytecode 做执行,先从最简单的加法运算和 jump 开始,然后是 Gas 的计算、上下文环境的切换,直到能够执行全部以太坊历史交易。



v0.0.1(2025.05.27)

实现了一个非常简单的版本,现在可以用 solc 编译一个 Add.sol 合约,然后让 echoevm 读取生成的 Add.bin 部署代码,就会输出合约部署之后的运行时代码。

在实现这个版本的过程中,学习到的东西是部署代码和运行时代码的区别。我们一般会先部署一个合约到链上,然后再对这个合约产生调用,这实际上是两个不同的操作,但又都在使用相同的 EVM 执行,EVM 并不关心输入的 bytecode 是部署还是调用,只是对不同的操作码处理方式不同。一般部署代码会同时包含 CODECOPYRETURN 两个操作码,可以利用这一点来区分输入的类型。