跳转到内容

prysm — 用 Go 写的 Ethereum 共识层客户端

是什么

Prysm 是用 Go 写的以太坊共识层(Consensus Layer / CL)客户端——让你”参与以太坊网络投票、维护账本”的那个程序。日常类比:以太坊 PoS 升级后,整个网络从”矿工挖矿”变成了”验证者投票”。Prysm 就像投票系统的桌面客户端 app,谁想成为验证者,就装一份。

跑起来大致是两个进程并行:

Terminal window
./prysm.sh beacon-chain --mainnet --jwt-secret=jwt.hex \
--checkpoint-sync-url=https://beaconstate.info
./prysm.sh validator --wallet-dir=./wallet --mainnet \
--suggested-fee-recipient=0xabc...

第一行启信标节点(beacon node,听全网投票),第二行启验证者(validator,自己参与投票)。两者协作就能在主网做 staking。

为什么重要

不理解 Prysm 这类共识层客户端,下面几件事都说不清:

  • 为什么 2022 年 The Merge 之后,跑以太坊节点要装两个程序(一个 EL 比如 geth,一个 CL 比如 prysm),而不是 PoW 时代一个 geth 搞定
  • 为什么 staking 需要押 32 ETH、被罚(slashing)只罚一小部分——这套博弈规则全在 CL 客户端里实现
  • 为什么 Lighthouse / Teku / Nimbus / Lodestar / Prysm 五个客户端并存——以太坊鼓励”客户端多样性”,避免单一实现 bug 拖垮全网
  • 为什么 Solo staker 最大的学习成本不是写代码,而是调通 EL ↔ CL 之间的 JWT 握手——这一步出问题节点就不出块

核心要点

Prysm 整体可以拆成 三块

  1. beacon-chain(信标节点):听 P2P 网络上的区块和投票(attestation),维护共识状态、决定哪条链是规范链。类比:选举委员会的”开票机器”,自己不投票,但负责清点全网投票结果。

  2. validator(验证者客户端):保管你的 BLS 签名私钥,等到自己被分配 slot 时,调 beacon-chain 的 API 提交签名。类比:选民拿着选民证去投票,证件本身不开票,只是”我赞成 X”。把 validator 和 beacon 拆开,是为了一台 beacon 可以挂多个 validator。

  3. 跟 Execution Layer 用 Engine API + JWT 通信:beacon 不会自己执行交易,它通过 JWT 鉴权的本地 RPC 让 geth / nethermind / besu / reth 算交易、出 payload。类比:开票机器不识字,得请秘书(EL)念票面内容。

三者凑齐才是一个完整的 Ethereum 节点。

实践案例

案例 1:第一次本地起 beacon node

下载 wrapper 脚本,让它按你的 OS 自动拉二进制:

Terminal window
curl https://raw.githubusercontent.com/OffchainLabs/prysm/master/prysm.sh \
--output prysm.sh && chmod +x prysm.sh
./prysm.sh beacon-chain \
--mainnet \
--execution-endpoint=http://localhost:8551 \
--jwt-secret=/path/to/jwt.hex \
--checkpoint-sync-url=https://beaconstate.info

逐部分解释

  • prysm.sh 是 wrapper,会按 OS 下对应 release 并校验签名(不用自己 go build
  • --execution-endpoint=http://localhost:8551 是本机 geth 的 Engine API 端口(不是 JSON-RPC 的 8545)
  • --jwt-secret 指向 32 字节随机 hex 文件,CL 和 EL 必须读同一份才能握手
  • --checkpoint-sync-url 后面案例 3 解释

案例 2:起 validator 替你投票

先把 deposit 时下载到的密钥导入钱包:

Terminal window
./prysm.sh validator accounts import \
--keys-dir=./keystore \
--mainnet

然后启 validator 服务:

Terminal window
./prysm.sh validator \
--wallet-dir=./prysm-wallet \
--mainnet \
--suggested-fee-recipient=0xYourEthAddr

suggested-fee-recipient 是出块手续费(priority fee)打到的地址。validator 启动后会自己连本机 beacon-chain 的 gRPC 端口(默认 4000),轮询自己什么时候被分配 slot,时间到了再签。

案例 3:checkpoint sync——30 分钟同步而非 7 天

默认从 genesis 一路 replay 到当前,要 3-7 天。Prysm 支持从可信检查点起步:

Terminal window
./prysm.sh beacon-chain \
--mainnet \
--checkpoint-sync-url=https://beaconstate.info \
--genesis-beacon-api-url=https://beaconstate.info

效果:信任那个 URL 给的最近 finalized state 当起点,只补后面几个 epoch,30 分钟出块。代价是你信任了这个 URL;多用几个对照可以缓解。这是 Solo staker 入门门槛被打掉的关键一步。

踩过的坑

  1. JWT 文件 EL / CL 必须读同一份:geth 默认在 ~/.ethereum/geth/jwtsecret,Prysm 不会自动找,必须 --jwt-secret=<path> 指过去;不一致就一直 “Connection refused” 或 “auth failed”。

  2. 8545 不是 8551:JSON-RPC 端口(8545)和 Engine API 端口(8551)不一样。新人常把 --execution-endpoint 写成 8545,beacon 一直收不到 payload。

  3. Validator 多开 = 自杀(slashing):同一份私钥跑两份 validator,会被网络判定”双重签名”,押的 32 ETH 被罚一大截、强制退出。换机器一定先关旧的等 4-8 epoch 再开新的,或用 doppelganger-protection 选项。

  4. 磁盘 + IO 比想象吃:Prysm 自己 ~150GB,加上 EL 客户端再 1TB+,对随机读延迟敏感。HDD 跑会经常 missed attestation,必须 NVMe SSD。

适用 vs 不适用场景

适用

  • 想做 Solo staker 押 32 ETH、自己跑节点拿 staking 收益
  • 想跑全节点为 dApp 提供 RPC(CL+EL 配合 geth / nethermind)
  • 想研究 PoS 共识、attestation、slashing 机制——Prysm 用 Go 写,可读性比 Nimbus(Nim)好
  • 想学 Bazel + 大型 Go 项目的工程组织(cmd / beacon-chain / validator / consensus-types 分层)

不适用

  • 只想读链不想出块——直接连公共 RPC(Infura / Alchemy)即可
  • 资源极紧张的小机器——Nimbus 资源占用最低
  • 想为客户端多样性做贡献——光跑 Prysm 不够,至少要混搭一种少数派客户端
  • 不在以太坊生态——其他链的 PoS 客户端是另一套实现

历史小故事(可跳过)

  • 2018 年:Preston Van Loon、Raul Jordan 等人创立 Prysmatic Labs,瞄准当时还叫 ETH 2.0 的 PoS 升级,用 Go 实现 beacon chain 规范
  • 2020 年 12 月:Beacon Chain mainnet 上线,Prysm 是当时市占率最高的 CL 客户端(一度 > 70%,引发”客户端单一化”焦虑)
  • 2022 年 9 月:The Merge——以太坊主网从 PoW 切到 PoS,Prysm 配合 EL 共同维护链
  • 2023 年:Offchain Labs(Arbitrum 母公司)收购 Prysmatic Labs,团队继续维护

如今 Prysm 在 CL 客户端里的份额被 Lighthouse 反超到 30% 左右,“多样性”健康度反而好转。

学到什么

  1. 客户端多样性是网络韧性——不是技术洁癖,是真发生过单一客户端 bug 让链停摆的事故
  2. 共识 ≠ 执行:Merge 后以太坊把”谁出块”和”块里执行什么”彻底解耦,CL ↔ EL 通过 Engine API + JWT 对话——这种”两层节点”思路可以借鉴到其他需要解耦的协议
  3. checkpoint sync 是工程妥协:把”完美 trustless”换”用户能在一晚装好”,是现代区块链客户端可用性的关键妥协
  4. Solo staker 真正的难点是运维:写 dApp 不难,让节点持续 99.9% 在线、SSD 不挂、网络不抖才难

延伸阅读

  • 官方文档:Prysm Docs —— 最权威,但偏指令手册
  • 视频教程:Coincashew Prysm Guide —— 第一次跑节点跟着做
  • 共识规范:Ethereum Consensus Specs —— Prysm 实现的就是这份 Python 伪代码
  • besu —— Java 写的 EL 客户端,常作 Prysm 的 execution endpoint
  • bitcoin-core —— 对照看:BTC 是 PoW 单层节点,差异能帮你消化”两层”模型

关联

  • besu —— Besu 是 Hyperledger 的 Java EL 客户端,可作 Prysm 的 execution endpoint
  • bitcoin-core —— PoW 单层节点的代表,对照能看出 PoS 双层架构的设计动机
  • go —— Prysm 是 Go 大型项目的工程范例(Bazel + protobuf + 多 cmd 入口)
  • grpc —— validator ↔ beacon 之间的 RPC 用 gRPC,性能和可扩展性的基础
  • protobuf —— Prysm 内部数据结构(block / attestation / state)都用 protobuf 定义
  • bls-signatures —— validator 签名用 BLS 而非 ECDSA,能把上万签名聚合成一条
  • merkle-tree —— beacon state 用 SSZ + Merkle 化才能轻客户端验证,是 PoS 必备底座

反向链接

  • besu —— Hyperledger Besu — 用 Java 写的以太坊客户端
  • bitcoin-core —— Bitcoin Core — 比特币参考实现
  • foundry —— Foundry — Paradigm 出品的 Rust 合约工具链
  • lodestar —— Lodestar — ChainSafe 的 TypeScript 以太坊共识层客户端
  • teku —— Teku — 用 Java 写的以太坊共识层客户端