ethrex 是一个支持以太坊 L1 和 L2 的 Rust 执行客户端。它采用了简洁和高效的设计哲学,以减少复杂性并提高可维护性。该项目提供详细的本地网络设置、开发环境搭建和测试方式,并包含对安全问题的重视。
ethrex 是一个 用于以太坊 L1 和 L2 Rust 实现的执行客户端, 以下是 Readme 介绍
以太坊 Rust 执行 L1 和 L2 客户端。
该客户端支持两种不同的模式运行:
我们称第一个模式为 ethrex L1,第二个模式为 ethrex L2。
许多历史悠久的客户端随着时间的推移积累了臃肿。这通常是由于需要支持现有用户的遗留功能,或尝试实现过于庞大的软件而引起的。结果往往是复杂、难以维护且易出错的系统。
相反,我们的哲学植根于简单性。我们努力编写最小化的代码,优先考虑清晰度,并在设计中接受简单性。我们相信这种方法是构建既快速又可靠的客户端的最佳方式。通过坚持这些原则,我们将能够快速迭代,尽早探索下一代特性,无论是源自以太坊路线图还是来自 L2 的创新。
在这里阅读更多关于我们的工程哲学的内容 这里
这个 make 目标将会:
如果一切顺利,你将看到我们的客户端日志(使用 ctrl-c 退出)。
要停止所有操作,只需运行:
make stop-localnet
要构建节点,你需要 Rust 工具链。请使用 rustup
按照 此链接 进行操作。
目前,数据库使用 libmdbx
,在你启动客户端时将会创建。数据库文件的位置将取决于你的操作系统:
~/Library/Application Support/ethrex
~/.config/ethrex
你可以通过以下方式删除数据库:
cargo run --bin ethrex -- removedb
为了以 InMemory
引擎运行 ethrex
,不使用共识客户端,并在每次启动时从头开始,可以使用以下 make 目标:
make dev
我们使用三种类型的测试。
这些是官方执行规范测试,你可以通过以下方式执行它们:
make test
这将从 官方执行规范测试库 下载测试用例,并使用我们的胶水代码在 cmd/ef_tests/tests
下运行它们。
第二种类型是每个 crate 的测试,你可以这样运行它们:
make test CRATE=<crate>
例如:
make test CRATE="ethrex-blockchain"
最后,我们还有使用 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 参数的更多信息,请查看下一个部分。
<!-- BEGIN_CLI_HELP -->
ethrex 执行客户端
用法: ethrex [OPTIONS] [COMMAND]
命令:
removedb 删除数据库
import 将区块导入数据库
help 打印此消息或给定子命令的帮助
选项:
-h, --help
打印帮助(使用 '-h' 查看摘要)
-V, --version
打印版本
节点选项:
--network <GENESIS_FILE_PATH>
也可以提供已知网络的名称,以便使用其预设创世文件并包含其预设引导节点。当前支持的网络包括 holesky、sepolia 和 hoodi。
--datadir <DATABASE_DIRECTORY>
如果 datadir 是单词 `memory`,ethrex 将使用 `InMemory Engine`。
[默认: ethrex]
--metrics.addr <ADDRESS>
[默认: 0.0.0.0]
--metrics.port <PROMETHEUS_METRICS_PORT>
[默认: 9090]
--dev
如果设置,将被视为 `true`。二进制文件必须使用启用 `dev` 功能进行构建。
--evm <EVM_BACKEND>
必须是 `levm` 或 `revm`
[默认: revm]
--log.level <LOG_LEVEL>
可能的值: info, debug, trace, warn, error
[默认: INFO]
P2P 选项:
--bootnodes <BOOTNODE_LIST>...
用于 P2P 发现引导的以逗号分隔的 enode URLs。
--syncmode <SYNC_MODE>
可以是 "full" 或 "snap",默认值为 "full"。
[默认: full]
--p2p.enabled
--p2p.addr <ADDRESS>
[默认: 0.0.0.0]
--p2p.port <PORT>
[默认: 30303]
--discovery.addr <ADDRESS>
P2P 发现的 UDP 地址。
[默认: 0.0.0.0]
--discovery.port <PORT>
P2P 发现的 UDP 端口。
[默认: 30303]
RPC 选项:
--http.addr <ADDRESS>
http rpc 服务器的监听地址。
[默认: localhost]
--http.port <PORT>
http rpc 服务器的监听端口。
[默认: 8545]
--authrpc.addr <ADDRESS>
认证 rpc 服务器的监听地址。
[默认: localhost]
--authrpc.port <PORT>
认证 rpc 服务器的监听端口。
[默认: 8551]
--authrpc.jwtsecret <JWTSECRET_PATH>
接收用于认证 rpc 请求的 jwt 秘钥。
[默认: jwt.hex]
<!-- END_CLI_HELP -->
在此模式下,ethrex 代码被重新用于运行一个在以太坊作为 L1 上结算的 rollup。
此模式与常规 ethrex 之间的主要区别如下:
在高水平上,节点被添加以下新部分:
proposer
组件,负责持续从内存池交易中创建新区块。这取代了以太坊 L1 节点的常规流程,在该流程中,新区块来自共识层,通过 forkChoiceUpdate
-> getPayload
-> NewPayload
引擎 API 流程与共识层进行通信。prover
子系统,分为两个部分:
proverClient
,从节点获取新区块,证明它们,然后将证明发送回节点以发送到 L1。这是一个运行在节点外部的独立二进制文件,因为证明的硬件要求与排序器截然不同(且更高)。proverServer
组件,与证明者通信,发送证明所需的证据数据,并接收 L1 上结算的证明。[!重要] 在此步骤之前:
- 确保你在
crates/l2
目录内。- 确保 Docker 守护进程正在运行。
- 确保你按照
sequencer_config_example.toml
文件创建了sequencer_config.toml
文件。
make init
这将设置一个原生以太坊网络作为 L1,部署所有必要的合约,然后启动一个指向它的 ethrex L2 节点。
[!警告] 此命令将清除你正在运行的 L1 和 L2 节点。
make restart
大部分都在 这里,但还有一个额外的:
{
"address": "0x3d1e15a1a55578f7c920884a9943b3b35d0d885b",
"private_key": "0x385c546456b6a603a1cfcaa9ec9494ba4832da08dd6bcf4de9a71e4a01b74924"
}
以下链接、库、公司和项目在该库的开发过程中非常重要,我们从中学到了很多,想对他们表示感谢和致敬。
如果我们忘记包含任何人,请提交问题,以便我们添加你。我们始终努力引用我们使用的灵感和代码,但由于我们是一个由多个人组成的组织,错误可能会发生,某些人可能会忘记包括引用。
我们非常重视安全性。如果你发现该项目中的漏洞,请负责任地报告。
有关更多详细信息,请参阅我们的 安全政策。
- 原文链接: github.com/lambdaclass/e...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!