引介 ethrex - 以太坊 L1 和 L2 Rust 执行客户端

ethrex 是一个支持以太坊 L1 和 L2 的 Rust 执行客户端。它采用了简洁和高效的设计哲学,以减少复杂性并提高可维护性。该项目提供详细的本地网络设置、开发环境搭建和测试方式,并包含对安全问题的重视。

ethrex 是一个 用于以太坊 L1 和 L2 Rust 实现的执行客户端, 以下是 Readme 介绍

ethrex

以太坊 Rust 执行 L1 和 L2 客户端。

L1 和 L2 支持

该客户端支持两种不同的模式运行:

  • 作为常规以太坊执行客户端
  • 作为 ZK-Rollup,其区块执行经过证明,且证明发送到 L1 网络进行验证,从而继承了 L1 的安全性。

我们称第一个模式为 ethrex L1,第二个模式为 ethrex L2。

哲学

许多历史悠久的客户端随着时间的推移积累了臃肿。这通常是由于需要支持现有用户的遗留功能,或尝试实现过于庞大的软件而引起的。结果往往是复杂、难以维护且易出错的系统。

相反,我们的哲学植根于简单性。我们努力编写最小化的代码,优先考虑清晰度,并在设计中接受简单性。我们相信这种方法是构建既快速又可靠的客户端的最佳方式。通过坚持这些原则,我们将能够快速迭代,尽早探索下一代特性,无论是源自以太坊路线图还是来自 L2 的创新。

在这里阅读更多关于我们的工程哲学的内容 这里

设计原则

  • 确保在所有目标环境中轻松设置和执行。
  • 进行垂直集成。依赖项尽可能少。
  • 结构化程度要使其易于在其之上构建,即 rollups、vms 等。
  • 有一个简单的类型系统。避免泛型多处泄漏到代码库中。
  • 抽象层次要少。不要在绝对需要之前进行泛化。重复两到三次的代码是可以接受的。
  • 优先考虑代码的可读性和可维护性,而不是过早的优化。
  • 避免在整个代码库中出现并发分裂。并发增加了复杂性。仅在严格必要的情况下使用。

ethrex L1

快速开始 (L1 本地网络)

先决条件

这个 make 目标将会:

  1. 在 Docker 镜像内构建我们的节点。
  2. 获取我们的分叉 ethereum package,这是一个多个以太坊客户端可以交互的私有测试网络。
  3. 使用 kurtosis 启动本地网络。

如果一切顺利,你将看到我们的客户端日志(使用 ctrl-c 退出)。

要停止所有操作,只需运行:

make stop-localnet

开发设置

构建

Rust

要构建节点,你需要 Rust 工具链。请使用 rustup 按照 此链接 进行操作。

数据库

目前,数据库使用 libmdbx,在你启动客户端时将会创建。数据库文件的位置将取决于你的操作系统:

  • Mac: ~/Library/Application Support/ethrex
  • Linux: ~/.config/ethrex

你可以通过以下方式删除数据库:

cargo run --bin ethrex -- removedb

开发模式

为了以 InMemory 引擎运行 ethrex,不使用共识客户端,并在每次启动时从头开始,可以使用以下 make 目标:

make dev
  • RPC 端点: localhost:8545
  • 创世文件: ./test_data/genesis-l1.json

测试

我们使用三种类型的测试。

以太坊基金会测试

这些是官方执行规范测试,你可以通过以下方式执行它们:

make test

这将从 官方执行规范测试库 下载测试用例,并使用我们的胶水代码在 cmd/ef_tests/tests 下运行它们。

crate 特定测试

第二种类型是每个 crate 的测试,你可以这样运行它们:

make test CRATE=<crate>

例如:

make test CRATE="ethrex-blockchain"
Hive 测试

最后,我们还有使用 hive 的端到端测试。 Hive 是一个系统,简单地将 RPC 命令发送到我们的节点,并期望得到某种响应。你可以在 这里 阅读更多内容。

####### 先决条件 首次运行 hive 时,我们需要安装 go,一种简单的方法是添加 asdf go 插件:

asdf plugin add golang https://github.com/asdf-community/asdf-golang.git

## 如果你需要设置 GOROOT 请遵循: https://github.com/asdf-community/asdf-golang?tab=readme-ov-file#goroot

并在 asdf 的 .tool-versions 文件中取消对 golang 行的注释:

rust 1.82.0
golang 1.23.2

####### 运行仿真 Hive 测试被分类为“仿真”,测试实例可以按正则表达式过滤:

make run-hive-debug SIMULATION=<simulation> TEST_PATTERN=<test-regex>

这是一个名为 ethereum/rpc-compat 的 Hive 仿真的示例,它会特别运行链 ID 和通过哈希的交易 RPC 测试:

make run-hive SIMULATION=ethereum/rpc-compat TEST_PATTERN="/eth_chainId|eth_getTransactionByHash"

如果你想从 hive 获取调试输出,请使用 run-hive-debug:

make run-hive-debug SIMULATION=ethereum/rpc-compat TEST_PATTERN="*"

这个例子会运行 每一个 RPC 下的测试,并带有调试输出。

####### Assertoor

我们在 CI 上运行一些 assertoot 检查,如需在本地执行它们,可以运行以下命令:

make localnet-assertoor-tx
## 或者
make localnet-assertoor-blob

这两组 assertoor 检查的细节如下:

assertoor-tx

assertoor-blob

有关每个单独检查的参考,请查看 assertoor-wiki

运行

示例运行:

cargo run --bin ethrex -- --network test_data/genesis-kurtosis.json

network 参数是强制性的,因为它定义了链的参数。 有关不同 CLI 参数的更多信息,请查看下一个部分。

CLI 命令

<!-- BEGIN_CLI_HELP -->

ethrex 执行客户端

用法: ethrex [OPTIONS] [COMMAND]

命令:
  removedb  删除数据库
  import    将区块导入数据库
  help      打印此消息或给定子命令的帮助

选项:
  -h, --help
          打印帮助(使用 '-h' 查看摘要)

  -V, --version
          打印版本

节点选项:
      --network &lt;GENESIS_FILE_PATH>
          也可以提供已知网络的名称,以便使用其预设创世文件并包含其预设引导节点。当前支持的网络包括 holesky、sepolia 和 hoodi。

      --datadir &lt;DATABASE_DIRECTORY>
          如果 datadir 是单词 `memory`,ethrex 将使用 `InMemory Engine`。

          [默认: ethrex]

      --metrics.addr &lt;ADDRESS>
          [默认: 0.0.0.0]

      --metrics.port &lt;PROMETHEUS_METRICS_PORT>
          [默认: 9090]

      --dev
          如果设置,将被视为 `true`。二进制文件必须使用启用 `dev` 功能进行构建。

      --evm &lt;EVM_BACKEND>
          必须是 `levm` 或 `revm`

          [默认: revm]

      --log.level &lt;LOG_LEVEL>
          可能的值: info, debug, trace, warn, error

          [默认: INFO]

P2P 选项:
      --bootnodes &lt;BOOTNODE_LIST>...
          用于 P2P 发现引导的以逗号分隔的 enode URLs。

      --syncmode &lt;SYNC_MODE>
          可以是 "full" 或 "snap",默认值为 "full"。

          [默认: full]

      --p2p.enabled

      --p2p.addr &lt;ADDRESS>
          [默认: 0.0.0.0]

      --p2p.port &lt;PORT>
          [默认: 30303]

      --discovery.addr &lt;ADDRESS>
          P2P 发现的 UDP 地址。

          [默认: 0.0.0.0]

      --discovery.port &lt;PORT>
          P2P 发现的 UDP 端口。

          [默认: 30303]

RPC 选项:
      --http.addr &lt;ADDRESS>
          http rpc 服务器的监听地址。

          [默认: localhost]

      --http.port &lt;PORT>
          http rpc 服务器的监听端口。

          [默认: 8545]

      --authrpc.addr &lt;ADDRESS>
          认证 rpc 服务器的监听地址。

          [默认: localhost]

      --authrpc.port &lt;PORT>
          认证 rpc 服务器的监听端口。

          [默认: 8551]

      --authrpc.jwtsecret &lt;JWTSECRET_PATH>
          接收用于认证 rpc 请求的 jwt 秘钥。

          [默认: jwt.hex]

<!-- END_CLI_HELP -->

ethrex L2

在此模式下,ethrex 代码被重新用于运行一个在以太坊作为 L1 上结算的 rollup。

此模式与常规 ethrex 之间的主要区别如下:

  • 没有共识,节点变成提出区块的排序器。
  • 使用 RISC-V zkVM 证明区块执行,其证明发送到 L1 进行验证。
  • 一组将在 L1 部署的 Solidity 合约作为网络初始化的一部分被包含。
  • 包含两种新类型的交易:存款(本地Token铸造)和取款。

在高水平上,节点被添加以下新部分:

  • 一个 proposer 组件,负责持续从内存池交易中创建新区块。这取代了以太坊 L1 节点的常规流程,在该流程中,新区块来自共识层,通过 forkChoiceUpdate -> getPayload -> NewPayload 引擎 API 流程与共识层进行通信。
  • 一个 prover 子系统,分为两个部分:
    • 一个 proverClient,从节点获取新区块,证明它们,然后将证明发送回节点以发送到 L1。这是一个运行在节点外部的独立二进制文件,因为证明的硬件要求与排序器截然不同(且更高)。
    • 一个节点内部的 proverServer 组件,与证明者通信,发送证明所需的证据数据,并接收 L1 上结算的证明。
  • L1 合约具有承诺新状态并验证状态转换函数的功能,只有在证明验证通过的情况下,L2 的状态才会推进。它还具有处理 L2 的存款和取款的功能。
  • EVM 略有修改,新增功能以相应地处理存款和取款。

先决条件

如何运行

初始化网络

[!重要] 在此步骤之前:

  1. 确保你在 crates/l2 目录内。
  2. 确保 Docker 守护进程正在运行。
  3. 确保你按照 sequencer_config_example.toml 文件创建了 sequencer_config.toml 文件。
make init

这将设置一个原生以太坊网络作为 L1,部署所有必要的合约,然后启动一个指向它的 ethrex L2 节点。

重新启动网络

[!警告] 此命令将清除你正在运行的 L1 和 L2 节点。

make restart

本地 L1 富钱包

大部分都在 这里,但还有一个额外的:

{
    "address": "0x3d1e15a1a55578f7c920884a9943b3b35d0d885b",
    "private_key": "0x385c546456b6a603a1cfcaa9ec9494ba4832da08dd6bcf4de9a71e4a01b74924"
}

ethrex L2 文档

📚 参考文献与致谢

以下链接、库、公司和项目在该库的开发过程中非常重要,我们从中学到了很多,想对他们表示感谢和致敬。

如果我们忘记包含任何人,请提交问题,以便我们添加你。我们始终努力引用我们使用的灵感和代码,但由于我们是一个由多个人组成的组织,错误可能会发生,某些人可能会忘记包括引用。

安全

我们非常重视安全性。如果你发现该项目中的漏洞,请负责任地报告。

有关更多详细信息,请参阅我们的 安全政策

  • 原文链接: github.com/lambdaclass/e...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
lambdaclass
lambdaclass
LambdaClass是一家风险投资工作室,致力于解决与分布式系统、机器学习、编译器和密码学相关的难题。