本文主要介绍了 LambdaClass 团队正在使用 Elixir 语言构建一个全新的以太坊共识客户端。该项目旨在通过技术和地域多样性来增强以太坊生态系统的健壮性,并创建一个高质量、易于理解的代码库作为学习和贡献以太坊协议的教育工具。文章详细阐述了项目目标、架构设计、技术细节、开发路线图以及面临的挑战。
以太坊生态系统的优势在于其通过多样性实现的可靠性,包括技术和人为因素两个方面。 然而,迄今为止,以太坊客户端的开发主要由欧洲和北美团队带头。 这在无意中集中了知识、贡献和维护,这与以太坊去中心化的基本精神背道而驰。 认识到客户端多样性的关键性——这不时面临挑战——我们深信我们的 LambdaClass Consensus 客户端可以产生重大影响。 我们的目标不仅仅是构建,而是以不同的方式构建,从而促进一个真正的全球以太坊社区。
在未来几个月内,我们的目标是开发一个完全开源的客户端,由来自拉丁美洲的一个充满激情的团队领导——在拉丁美洲,此类技术的相关性和需求因当地的不稳定性而更加突出。 增强多样性不仅邀请更广泛地参与以太坊,而且还增强了协议的弹性。 这是通过纳入协议核心贡献者所在地区的各种背景和法律框架来实现的,从而减轻了潜在的监管挑战。 我们强调培养社区参与。
从技术角度来看,我们已决定使用 Elixir 编程语言构建新的共识客户端。 Elixir 以其对并发性、可用性、容错性和稳定性的关注而闻名,它是一种由 Erlang VM 驱动的函数式语言。 这些属性使其成为实现以太坊共识客户端的理想选择。
我们对 Elixir 的深刻赞赏推动了我们培养一个充满活力的以太坊 Elixir 社区的雄心,让人想起我们近年来见证并积极贡献的蓬勃发展的 Rust 以太坊社区。 Elixir 强调代码可读性及其简单的实现策略,使我们能够设定一个明确的目标:使我们的客户端不仅成为一个堪称典范的技术作品,而且成为一个有价值的教育工具。 我们的目标是使其成为学习协议规范、了解以太坊内部机制、为核心协议做出贡献以及实施这些规范的综合资源。
与以太坊对开源协作的奉献精神相一致,我们设想我们的客户端可以作为广泛协议贡献的启动平台,真正体现“为了人民,为了人民”的精神。
该项目背后的理念依赖于:
团队专业知识: 我们致力于组建一支精通整个共识规范的强大团队。 我们的目标是让该团队成为整个社区的知识灯塔和可靠参考点。
透明的开源方法: 我们的项目就像一本开放的书。 从我们的日常进展、路线图和问题日志的方方面面都将对公众开放,从而促进开放协作、贡献和反馈。 这种透明性为从一开始就进行外部参与铺平了道路,我们很自豪能够在早期阶段就实现这一目标。
从第一天起就可用于生产: 我们设想我们的首次发布即可立即使用。 只需执行 make run
即可使一个功能正常的节点启动并运行,该节点可以接收和存储区块。 它将与执行层无缝集成,并且信标 API 将可用于基本的信标状态查询。 这种方法促使我们快速迭代,专注于切实的解决方案,并对潜在的错误和集成挑战保持警惕。
代码清晰: 我们的目标是精简、易懂且功能强大的代码库。 我们优先考虑一种设计,其中主动处理预期的错误,而不仅仅是“捕获”。 Elixir 的固有能力有助于在进程和可能表现出不同负载的请求之间进行高效调度。 此外,它的架构确保各个组件可以独立崩溃和恢复,同时保持整体系统弹性 [1]。
这是该解决方案的高级架构图。
graph TB
subgraph "Consensus Node"
engine[Engine API Client]
BAPI[Beacon API]
TICK[Slot processor]
STORE[Local Storage]
CACHE[State Cache]
PRT[State transition server]
BAPI -->|Beacon state queries| CACHE
PRT -->|beacon state transition, fork-choice queries| CACHE
PRT --> |payload validation, execution, reorgs| engine
TICK --> |on_tick| PRT
CACHE <--> STORE
end
GOS[Gossip Protocols]
exec[Execution Client]
VALIDATOR[Validator]
engine <--> exec
GOS -->|blocks, attestations| PRT
VALIDATOR --> BAPI
API 框架:
存储:
Gossip 消息处理:
状态转换服务器:
1. 区块订阅 - 9 月中旬
on_block
回调:将最新区块保存在 分叉选择 存储中,进行基本检查。 GetHead 返回最新获得的区块。GET /beacon/states/{state_id}/root
)2. 检查点同步 - 10 月
3. 证明 - 10 月中旬
on_attestation
回调GET /beacon/states/head/root
)4. 存款 - 11 月
process_eth1_data
)process_deposit
)verify_block_signature
)5. 插槽和 分叉选择 - 11 月中旬
on_tick
/process_slot
; 定期调用此 GenServeron_block
:添加与插槽相关的检查和 epoch 计算(不包括最终确定)6. 最终性和削减 - 11 月中旬
on_block
:修剪 分叉选择 存储; 拒绝最终确定之前的区块7. 奖励、洗牌 - 12 月
on_epoch
8. 验证者功能 - 12 月中旬/2024 年 1 月
特定于语言的支持: 与其他语言相比,Elixir 在 BLS、密码原语、libp2p 和 SSZ 等关键组件中可能直接支持有限。 虽然我们打算为某些功能开发本机绑定,但其他功能将要求我们从头开始编写代码(这是最终目标,以进一步推动实现多样性)。
负载测试限制: 彻底的负载测试,同时考虑标准计算机硬件的限制,可能会带来挑战。
最佳存储解决方案: 信标状态和 分叉选择 存储的存储设计在规范中没有明确详细说明。 从无数选项中识别和验证最有效的存储解决方案至关重要。
交叉测试兼容性: 必须通过使用所有现有执行客户端交叉测试我们的客户端来确保兼容性。
技能提升: 使团队适应以太坊规范的复杂细节绝非易事。 这需要持续的努力和耐心。 如果这种陡峭的学习曲线妨碍了一些外部协作者快速参与问题,则可能会阻止他们。
区分功能: 为了确保更广泛的采用,我们需要确定独特的特性,这些特性将使我们的客户端更具吸引力。 这可能包括增强的可观察性或其他突出特性,以增强我们客户端的价值主张。
培养有弹性的社区: 建立一个不仅持久,而且充分了解即将到来的协议变更并积极渴望进一步促进以太坊协议的增长和创新的社区至关重要。
我们衡量成功的标准是明确而雄心勃勃的。 在研究金结束时,我们希望拥有一个与当前信标状态无缝同步并正确计算 分叉选择 的节点。 虽然对奖励计算和验证者的支持将在研究金结束后纳入,但我们在此过程中的目标是奠定坚实的基础。
按 github 用户名首字母排序。
Lambdaclass 以太坊共识客户端 Github 存储库
书籍:
视频:
博客:
论文:
规范:
[1] https://ferd.ca/the-hitchhiker-s-guide-to-the-unexpected.html
- 原文链接: github.com/eth-protocol-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!