lambdaclass/ethlambda
GitHub: lambdaclass/ethlambda
ethlambda 是一个用 Rust 编写的极简、模块化 Lean Ethereum 共识客户端,旨在以简洁的代码实现提供高性能且易于理解和扩展的以太坊共识层节点。
Stars: 76 | Forks: 27
# ethlambda
使用 Rust 编写的 Lean Ethereum 客户端的极简、快速且模块化实现。
🌐 访问我们的网站 [**ethlambda.xyz**](https://ethlambda.xyz) 了解更多关于该项目的信息。
## 快速开始
### 前置条件
- [Rust](https://rust-lang.org/tools/install)
- [Git](https://git-scm.com/install)
- [Docker](https://www.docker.com/get-started)
- [yq](https://github.com/mikefarah/yq#install)
### 构建与测试
我们使用 `cargo` 作为构建系统,但更倾向于使用 `make` 作为常用任务的便捷包装器。以下是一些常用的目标:
```
# 格式化所有代码
make fmt
# 检查并 lint 代码
make lint
# 运行所有测试
make test
# 构建一个标记为 "ghcr.io/lambdaclass/ethlambda:local" 的 docker 镜像
make docker-build DOCKER_TAG=local
```
运行 `make help` 或查看我们的 [`Makefile`](./Makefile) 以获取其他有用的命令。
### 在 devnet 中运行
使用 [lean-quickstart](https://github.com/blockblaz/lean-quickstart) 运行一个包含多个客户端的本地 devnet:
```
# 这将克隆 lean-quickstart,构建 docker 镜像,并启动一个本地 devnet
make run-devnet
```
这将生成全新的创世文件,并启动所有已配置且开启了 metrics 的客户端。
按 `Ctrl+C` 停止所有节点。
对于自定义的 devnet 配置,请在运行上述命令之前转到 `lean-quickstart/local-devnet/genesis/validator-config.yaml` 并编辑该文件。有关如何配置 devnet 的更多详细信息,请参阅 `lean-quickstart` 的文档。
## 理念
相比之下,我们的理念扎根于简洁性。我们努力编写最少的代码,优先考虑清晰度,并在设计中拥抱极简主义。我们相信这种方法是构建既快速又具有弹性的客户端的最佳方式。通过坚持这些原则,我们将能够快速迭代并尽早探索下一代功能。
在我们的[博客的这篇文章中](https://blog.lambdaclass.com/lambdas-engineering-philosophy/)阅读更多关于我们工程理念的信息。
## 设计原则
- 确保在所有目标环境中都能轻松设置和执行。
- 垂直整合。具有最少的依赖项。
- 采用易于在其基础上进行构建的结构化设计。
- 拥有简单的类型系统。避免 generics 在整个代码库中泛滥。
- 抽象要少。在绝对需要之前不要进行泛化。重复两三次代码是可以接受的。
- 优先考虑代码的可读性和可维护性,而不是过早的优化。
- 避免在整个代码库中分散使用并发。并发会增加复杂性。仅在严格必要的地方使用。
## 📚 参考资料与致谢
以下链接、代码库、公司和项目对本代码库的开发非常重要,我们从中学到了很多东西,并在此表示感谢和致敬。
- [Ethereum](https://ethereum.org/en/)
- [LeanEthereum](https://github.com/leanEthereum)
- [Zeam](https://github.com/blockblaz/zeam)
- [Lantern](https://github.com/Pier-Two/lantern)
如果我们忘记包含任何人,请提交 issue 以便我们添加您。我们始终努力引用我们的灵感来源和使用的代码,但作为一个拥有多人的组织,可能会发生错误,有人可能会忘记添加引用。
## 当前状态
该客户端实现了 Lean Ethereum 共识客户端的核心功能:
- **网络** — libp2p 节点连接、STATUS 消息处理、用于区块和 attestation 的 gossipsub
- **状态管理** — 创世状态生成、状态转换函数、区块处理
- **分叉选择** — 实现带有基于 attestation 的 head 选择的 3SF-mini 分叉选择规则
- **验证者职责** — attestation 的生成与广播、区块构建
附加功能:
### Container 发布
Docker 镜像发布在 `ghcr.io/lambdaclass/ethlambda`,并带有以下标签:
| 标签 | 描述 |
|-----|-------------|
| `devnetX` | 用于特定 devnet 的稳定镜像(例如 `devnet4`) |
| `latest` | 当前正在运行的 devnet 的稳定镜像别名 |
| `unstable` | 开发构建版本;经过测试后将提升为 `devnetX`/`latest` |
| `sha-XXXXXXX` | 特定的提交 |
[`RELEASE.md`](./RELEASE.md) 包含了有关我们的发布流程以及如何标记新镜像的更多详细信息。
### pq-devnet-5
我们正在运行 `pq-devnet-5` 规范。该版本提供了一个 `devnet5` 的 Docker 标签。
### pq-devnet-6
`pq-devnet-6` 处于规划阶段;目前尚未指定任何功能。可能的候选方案是替换 [LMD-GHOST](docs/lmd_ghost.md) 和 [3SF-mini](docs/3sf_mini.md),或者是[执行层集成](https://github.com/lambdaclass/ethlambda/pull/367)。
### 旧版 devnet
每个 devnet 的 Docker 标签均已发布,格式为 `devnetX`(即 `devnet1`、`devnet2`、`devnet3`、`devnet4`)。
## 即将推出的功能 / 路线图
我们写了一篇[博客文章](https://blog.lambdaclass.com/ethlambda-devnet-5-and-beyond/),探讨了我们认为在不久的将来应该包含的内容。
我们计划在不久的将来按优先级顺序实现的一些功能:
- [优化区块构建](https://github.com/lambdaclass/ethlambda/issues/465)
- [使用 state-diffs 将状态存储在数据库中](https://github.com/lambdaclass/ethlambda/issues/238)
- [Goldfish + RLMD GHOST + BFT 原型开发 — devnet-6](https://github.com/lambdaclass/ethlambda/pull/434)
- [与执行客户端集成](https://github.com/lambdaclass/ethlambda/pull/367),特别是 [ethrex](https://github.com/lambdaclass/ethrex) — devnet-7
- 用实验性的 [ethp2p](https://github.com/ethp2p/ethp2p) 替换 libp2p,我们正在将其移植到 Rust
- [添加 guest 程序和 STF 的 ZK 证明](https://github.com/lambdaclass/ethlambda/issues/156)
- 使用具体的编程语言重写 STF,以实现形式化验证
### 实验性功能
我们在 PR [#269](https://github.com/lambdaclass/ethlambda/pull/269) 中提供了部分状态转换函数的 Lean4 形式化概念验证。
标签:Rust, 以太坊, 共识客户端, 分布式系统, 区块链, 可视化界面, 响应大小分析, 网络流量审计, 请求拦截, 通知系统