Logo

site iconsmallyu

区块链行业的开发者。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

smallyu RSS 预览

RISC-V 虚拟机无法代替 EVM 虚拟机

2026-04-24 20:34:05

  1. RISC-V 太复杂,非常依赖于虚拟机沙盒环境的标准化,但是现在还没有统一的规范
  2. EVM 经过多年百亿级别金融生态的磨练,从开发到审计已经比较成熟,切换到 RISC-V 的成本很高
  3. RISC-V 虚拟机的冯诺伊曼税更高、确定性更脆弱

Gavin Wood 当年在设计 EVM 的时候,会面临两个问题:基于栈还是基于寄存器?显然实际上的 EVM 是基于栈的,也许是出于上线迭代等外部因素影响,也许是出于 Gavin 当时的历史局限性。后来 Gavin 离开了以太坊、创建了 Polkadot 之后,一开始把 Polkadot 的虚拟机设计为 基于 WASM 虚拟机,最近又转向了基于 RISC-V 指令集的、用于实现通用计算的虚拟机。也就是说,Gavin 抛弃了基于栈的 EVM 的老路,最终转向寄存器结构的 RISC-V。

EVM 底层是 256 位的无符号数字,每一条指令、每一个数据,都会拆解为 256 位的数字来表示。至于为什么是 256 位,可能因为以太坊是从比特币演变来的,而哈希算法 Keccak-256 和签名算法 secp256k1 等都沿用了比特币的设计,它们的输出都是 256 位,为了无缝适配这些加密算法,就采用了 256 位的字长。

我们平时使用的电脑 CPU,大都是 64 位的。CPU 经历过 32 位的时代,但是由于在地址寻址的方式下,32 位最多表示 2^32 Byte = 4 GB 的内存大小,已经跟不上使用需求,所以现在的 CPU 已经都是 64 位的。

这里有两个数字,EVM 是 256 位的,CPU 是 64 位的。这也就意味着,每一个 EVM 的指令操作,到了 CPU 上都至少需要 10 个指令来完成,模拟一个栈内存、计算低位、计算高位、把结果推回栈等,这一套动作下来,256 位的 EVM 指令在执行效率上,比使用 64 位 CPU 指令,慢大概 10 倍到 100 倍。

RISC-V 是一个精简的指令集架构标准,包含有 64 位的 RISC-V 虚拟机指令标准。这就意味着,通过 JIT 编译,RISC-V 的指令几乎可以 1:1 映射到现代 64 位的 CPU 上,执行效率接近于 CPU 本身的效率。

Arbitrum 有过一次叫 Stylus 的 版本升级,内容是用运行于 WASM 的虚拟机性能与 EVM 虚拟机的性能进行对比,官方的宣传口径是,一个简单的加法 ADD 运算,在 WASM 上的 Gas 消耗比在 EVM 上少 150 倍,而这 150 倍就是指令集转换带来的额外开销。WASM 的性能比 RISC-V 差,因为 WASM 从设计之初是在浏览器环境运行一个多编程语言的虚拟机,所以合理推测,基于 RISC-V 的指令,性能上也要好过 EVM 至少 100 倍。

从指令执行的效率方面来看,RISC-V 绝对要好过 EVM 太多。

另一方面,RISC-V 非常适合做通用计算,比如 cartesi 这个项目,相当于直接在每一个链上节点本地,运行一个小型的 Linux 系统,这个系统内能运行的,就不只是智能合约,而可以包括各种各样进程级别的程序,这能释放很大的想象空间。

很多 zkVM 也都是基于 RISC-V 在做,毕竟要给一个 256 位的虚拟机以及各种复杂的指令集开发 ZK 电路,心智负担太大了,而 RISC-V 是一个精简指令集,只有比较底层的指令,比 zkEVM 实现起来要更加容易并且通用。

至于 EVM 方面,也有在性能方面做出卓越突破的链比如 Monad,实现了真正的并行 EVM。只不过 Monad 提高性能的方式并不是从比较底层的指令集层面去做,而是乐观执行、有冲突再回滚的方式,以及实现了专用的数据库而不是通用的 KV 数据库来提高磁盘 IO 效率,整体结合下来,让 EVM 的执行速度有了显著提升。

那么至此可以看到的是,基于 RISC-V 指令集的虚拟机、智能合约语言,有着种种性能上的优点。

是不是意味着 RISC-V 是替代 EVM 的最佳趋势呢?显然也不是。

生态方面的护城河当然很重要,RISC-V 属于彻底抛弃了 EVM 体系、自成一套,支持各种编译型的编程语言。那也就意味着,包括开发者和审计公司,在 EVM 上踩过的坑,需要推倒重来。这是谁都不愿意看到的事情。EVM 的简单带来了性能上的劣势,也让安全风险和执行逻辑上的排查更加可控,因为是栈结构,Solidity 语言里连指针操作都没有,确定性非常高。而 RISC-V 的寄存器模式,合约的 ABI 不再是字节码而是 ecall ABI,里面涉及到内存分配、有堆内存、有垃圾回收,复杂度非常高。

而为了解决确定性的问题,一般的做法是在 RISC-V 支持的编程语言上,再阉割一层,用一个沙盒环境来执行合约逻辑,并且禁用一些语言特性,从沙盒外部能够看到一个确定性的结果。这当然就会牵扯到,每一个项目都在定义自己的沙盒标准,没有业界统一的方案。

再就是很多项目方宣传口径上的问题,放大了 RISC-V 的性能优势,刻意在忽略 RISC-V 模式带来的冯诺伊曼税的问题。在 EVM 上,修改余额就是一个 SSTORE 指令,EVM 天然知道什么是账户、什么是余额,要去数据库的什么位置寻找数据。而 RISC-V 过于通用,如果要修改余额,可能需要先分配内存、处理语言运行时的边界检查、写入数据、释放内存等,虽然单个指令的执行效率高了,但是反而在业务逻辑上消耗了更多的 CPU 周期。

总的来说,RISC-V 虚拟机还无法代替 EVM 虚拟机。

Polkadot 的 Existential Deposit 机制错在哪里

2026-04-22 17:50:48

Polkadot 有一个叫 Existential Deposit (ED) 的机制,含义是如果你的账户余额小于 1 DOT,区块链网络会直接删除你的账户以及余额。删除的意思是指,你的地址信息将不存在于链上,其他地址无法转账小于 1 DOT 给你,你的余额以及 Nonce 值会被直接抹除,整个网络的代币总供应量也会因此减少。

问题背景

我们先来理解一下为什么 ED 这样的设计会存在。Vitalik 要说代码和工程水平可能远不及他拥有的名气,Gavin Wood 是以太坊的实际开发者。Gavin 因为实际设计了以太坊的节点,所以很清楚以太坊存在状态数据会无限膨胀的问题。

以太坊节点会把整条链上所有有过交易记录的地址信息,都维护到世界状态中,用的是一种叫 MPT 的树结构,每个地址信息都是树上的一个叶子节点。那么就存在一个问题,我们平时使用以太坊钱包也会有体会,如果地址里有 0.00001 ETH 的余额,这种非常小额的余额,是永远无法被转出的,因为以太坊对于普通转账交易,固定要求 21000 Gas,无论 Gas Price 多低,以太坊账户的余额都不可能彻底清零。这种非常小的余额被称为粉尘余额,对于强迫症来说会是一种灾难。

对于以太坊节点来说,这些地址以及余额,就不仅只是视觉上强迫症的问题,而是意味着,节点需要维护的状态数据,永远都会只增加、不减少。每多一个新的地址有余额,服务器上的节点就需要多储存一份地址的键值对信息,哪怕对内存的占用量很小,也会持续累积和增加,给服务器持续带来压力。这种设计在工程上是很暴力、不负责也不合理的。

针对粉尘余额,存在两个问题,我们分别来对比:

  1. 用户视角的粉尘余额是否可以消除、让余额彻底清零
  2. 节点视角的粉尘余额是否会持续给服务器增加压力

用户视角

比特币是如何解决粉尘余额问题的?假如有一个 UTXO 地址里的余额非常小只有 1 sats,那么自己发起转账肯定是不行的,因为 1 sats 不够付矿工费。但是比特币的交易允许有多个 input,只要把小额的 UTXO 作为其中一个 input,再让其他有大额余额的 UTXO 作为另外的 input 来支付矿工费,整笔交易就可以成功,拥有 1 sats 的 UTXO 余额也会清零。所以是 UTXO 账户模型让比特币天然没有粉尘余额的问题。

以太坊是粉尘余额的起源地,所以目前始终无法解决。

Polkadot 为了解决粉尘余额的问题,把 Existential Deposit 作为 Day Zero 的核心设计写到了协议里。余额小于 1 DOT 就会被自动清除,自然不存在粉尘余额的问题。这种清除余额并不是指余额会转给矿工或者转给黑洞地址,而是凭空消失一样地清除。

节点视角

比特币节点也是需要 chainstate 的,会把所有有余额信息的地址信息都维护在节点的内存中。不过相比以太坊,由于比特币地址的粉尘余额是可以被清零的,而节点方面对于余额是 0 的地址不需要维护一份状态数据,如果一个地址的余额是 0,节点就可以把地址从状态数据中删掉,内存占用就可以减少一点点。所以对于比特币节点来说,状态数据并不会只增不减,而是可以根据实际情况有增有减。

以太坊节点呢,一方面因为用户余额本身就无法清零,余额再小节点也得维护状态。另一方面在于,以太坊其实有清理状态数据的机制,只是地址可以被清理的要求很苛刻,需要余额为 0,并且 Nonce 值为 0。Nonce 值这个东西,也是比特币没有的概念,以太坊为了账户-余额模型加的。也就是说,哪怕余额为 0 了,只要发出过交易,Nonce 值就不可能是 0。两方面原因叠加下来,以太坊的状态数据会只增不减,持续膨胀。

Polkadot 呢,同样是利用 Existential Deposit 的设计,会直接清理掉小于阈值的地址以及相关信息,相应的,链上节点维护状态数据的压力就会变小。

小结

所以 Polkadot 利用 Existential Deposit 这种机制,同时解决了粉尘余额对于用户以及对于节点的影响,在工程上是一种比较纯粹和现代化的设计。

错在哪里

回到标题,Polkadot 的这种设计有错吗?

  1. 太过纯粹的工程思维

程序员群体在解决现实问题的时候,往往会偏好工程化的解决方式,而忽略现实用户的体验。Polkadot 给人的感觉就是,小钱不是钱,我没钱就不配用。

加密货币作为一种资产,一种货币,一种钱,链上节点像是在回收垃圾一样,把我的余额给回收掉。是不是等同于在说,小的金额就是垃圾?用编程语言的垃圾回收机制,来针对加密资产做回收,这是比较错配的行为。内存中的无效资源、悬空对象可以是垃圾,但是用户的资金不是。在比特币网络,哪怕只有 1 sats,也会安安静静躺在那里。

  1. 违背了加密货币的原则

Polkadot 的 Existential Deposit,直接违背了加密货币的根本原则:只有持有私钥的人,才有资产的控制权。

我们常说 “Not your keys, not your coins”,但是到了 Polkadot 这里,只有你自己持有私钥对吧,但是链上的节点可以直接抹掉你的余额,在没有私钥的情况下让地址内的余额发生了变化。这是一种非常违背原则的做法。

在区块链中,唯一有效的、对余额产生影响的,应该来自于账本数据,以太坊尚且没有做得这么过分,但是 Polkadot 做了,直接改了状态数据里的余额,在没有交易行为的情况下,引入了节点层面的收割机制。

  1. 账户模型的原罪

如果说 AA 钱包 是以太坊为了解决账户模型而打出的一个补丁,那么 Existential Deposit 就是 Polkadot 为了填补账户模型打出的另外一个补丁,试图在以太坊的基础上向前多走一步,而做出的激进设计。

利息,套利,交易策略,金融市场

2026-03-02 13:52:16

资金费率套利

资金费率套利是一种没有风险、保本的套利方式。我一开始尝试自己写脚本来运行策略,后来发现 Binance 直接提供了 bot 来进行这种操作:

这里的 Arbitrage Bot 就是资金费率套利的 Bot,点开可以看到有很多币种可以选,包括按照资金费率来排序等。而且 Binance 的 Bot 做的很智能,如果资金费率是正的,就开正向的套利策略(使用 USDT),如果资金费率是负的,就开反向的策略(使用代币)。

资金费率套利的获利空间很小,尤其是 BTC 等主流币种,APR 在 1% 以下,当前低迷的市场环境下,大概持有 300 天以上才能磨平手续费损耗。实际上是很不划算的方式。而如果按照资金费率排序,选最高的一个代币,APR 能相对高一点,也许能达到 40% 甚至更多,当然高收益也就意味着高的波动和风险:

资金费率套利是 Detla 中性的,假如代币突然暴涨,把 2 倍的做多合约给爆仓了,会不会导致损失一半本金呢?不会,因为现货涨了 2 倍后卖掉正好抵消了爆仓的损失,所以本金没有变化,整个过程就是赚了这段时间的资金费率。

所以根据资金费率高的代币排序,然后开套利 Bot,是我唯一尝试过想赚点利息的方式。

保本赚币

Simple Earn 很简单,存到 Binance 里赚利息。问题在于 APR 并不高,USDC 也就 6%,而且有非常高的额度限制,只支持 200 USDC。几乎没什么用。

双币投资

双币投资(Dual Investment)的策略整体看下来,关键在于你心里要有一个预期的价位。比如 BTC 到 60000 就愿意买入,无论它以后会不会继续跌,都以 60000 的价格买入(卖出同理)。

双币投资更像是期货交割的逻辑,对于普通散户来说,同样没什么用。为什么双币投资的利息高呢?因为风险也高,有卖飞或者接刀子的风险。风险高,利息就高了。

如果双币投资设定一个非常离谱的价格呢,比如在 100000 的时候买入 BTC,岂不是可以达不到条件一直赚利息了?但实际上利息是由风险决定的,市场看到风险小,也就没有人愿意付高额利息,所以价格离谱的市场本身就不存在。

开合约、加杠杆

别作死。

Lido

这 2.3% 的 APR 实在是太低了。用某个人的话来说,对于普通人,低于 5% 的 APR 根本不需要考虑,得至少 20 年才能赚钱。

Aave

Aave 的 APR 也很低,甚至最高也低于 2%,几乎等于没有。

Uniswap

乍一看还挺吓人的,USDC/ETH 有 76% 的 APR。问题在于提供流动性是存在无常损失的,你投入 1000 ETH 和 1000 USDC,随着池子中不断进行交易,最终你提出来可能就剩 300 ETH 和 1700 USDC。代币的总量不变,但是 ETH 的价格在剧烈波动,你的投入就完全不划算了。而 Uniswap 上的稳定币交易对 USDT/USDC 这种池子的收益率自然很低,在 1% 左右。

BTC 5 分钟猜涨跌

Polymarket 上线了 BTC 5 分钟猜涨跌的玩法。那么在这种市场有获利的机会吗?结论是没有。这是一种负期望值的游戏,散户、低频等同于纯粹的赌博。甚至可以认为所有的事件预测市场都是赌博。别提什么稳定套利的机会了。

Polymarket 上的 free money

一方面,Polymarket 上有一些整活市场,比如 耶稣会不会在 2027 年回归?。这种市场的 no 价格大约 96.2c,意味着如果持仓一年等待事件结算后,持仓的年化收益大约 4%。非要和传统银行以及现金 APR 比的话这个收益率也还不错。

另一方面,Polymarket 有一个机制,对于某些 符合要求 的市场,只要 holding 就会一直分发年化 4% 的 shares。有一些市场是显然知道结局的,所以可以大胆买入,比如某个市场的 no 价格是 91.1c,当事件结算后会获得接近 9% 的年化收益,再累加上 4% 的持仓收益,实际上是一个还算不错的理财选择。

MEV 攻击、链上科学家、黑暗森林

快省省吧。

金融市场

经过这么多年的发展以及几年前的 DeFi Summer,无论是 Cex 利息还是 DeFi,随着 ETF 的推出、华尔街巨头的介入,只要市场上有低风险的套利机会,就会有几亿的资金以及高频低延迟的机器人入场。普通玩家的机会非常少。

在金融市场里怎么赚钱?

  1. 拿时间换空间(撸空投)
  2. 拿本金换利息(大额本金)
  3. 拿认知、精力换超额收益(现货定投、寻找 Alpha)

除此之外,别无他法。

散户之所以是韭菜,是因为:

  1. 没有无限的本金
  2. 缺乏顶级的认知
  3. 缺乏极度的耐心

反正什么都没有。有的只有无知,和赚钱的欲望。

定投策略

李笑来经历过那么多项目,最后总结出的终极交易策略是定投。《定投改变命运》这本书其实写的非常好,信息密度很高。当我们对于某些高频交易策略动心的时候,不妨回顾一下这本书里提到的要点,而定投正是需要极度耐心的一种策略。

当然定投策略以及李笑来的理论,也有让人觉得扯淡的地方。比如书里到最后,给大家的建议是提高 “场外赚钱的能力”。这基本上是非常正确的废话,谁不知道场外赚钱重要……

定投是一种与人性做对抗的策略,确实很难严格落实,尤其是对于从业者来说,天天会看到行情和市场情绪,不可能做到情绪高的时候还定投,也做不到情绪低的时候管得住手。

想要赚钱,还是得做出点别人做不到的事情才行。

Restaking

刚才提到了定投,那么假如坚持定投 BTC 的话,BTC Restaking 能不能在持有 BTC 的基础上再赚点利息?

Restaking 赛道唯一一个真正做 BTC Restaking 的项目 Babylon,提供的 APR 至高 0.87%,这确实是不值一提。毕竟 2B 的资金量压在协议里,APR 又不能凭空产生,项目收益再高,一分到 2B 的质押量上,APR 就不可能高了。所以 BTC Restaking 几乎不值得去操作。

场外赚钱

我在思考 “场外赚钱” 这个问题。我发现 “定投+持有” 的过程无聊至极。

金融市场里有一个很奇怪的逻辑,明明你就是场外赚钱能力有限,才想要到金融领域通过投资手段寻找高杠杆、高回报率的新机会。而投资界的大佬都会告诉你,场外赚钱的能力才是最重要的,你要有源源不断的现金流才行。

而事实上,金融领域从来只放大资金收益,而不负责基础资金的来源。在金融领域的不可能三角是:

  • 本金
  • 收益率
  • 时间

如果你有足够的本金,即使收益率低也有很好的回报,100 万美元年化 10% 一年下来就是 10 万美元。如果你愿意承担极度高的风险,土狗币百倍币就是高收益最直接的渠道,收益率是对承担风险的回报。

那么如果本金也不够大,风险也不愿意承担呢?剩下能投入的只有时间。

LayerZero 从来不挑战比特币的地位

2026-02-12 22:16:07

Zero 网络

2月10日,LayerZero 公布了 Layer 1 网络 Zero 的技术方案。有意思的指标有两个:

  1. 兼容 EVM
  2. TPS 达到 200万/秒

没错,号称每秒钟处理高达 200 万笔交易,是并行 EVM 链 Monad 的 200 倍,是 Solana 的 30 倍,是以太坊主网的 10 万倍,是比特币的 20 万倍。

LayerZero 的魔法在于优化了 Jolt,一个基于 RISC-V 指令集的 zkEVM,而且运行在 GPU 集群上,生成 ZK 证明的速度非常快。也就是说,当用户把大量交易提交给 Zero 网络的 Block Producers 之后,基于 GPU 集群的算力, Zero 网络可以非常快生成区块数据的证明。

Zero 网络出块的硬件要求大概是 96 核 GPU,768 GB RAM,这显然是算力中心级别的要求。那么整个网络岂不是非常中心化、被控制在少数华尔街头部公司的手里了?

由于 ZK 技术的特性,Zero 网络提供了另一个特性:验证 ZK 证明只需要非常轻量级的设备,家用电脑就可以完成对区块数据的验证。

这是一个有意思的点,为了提高 TPS,Zero 网络把出块的权力中心化,同时把验证区块的权力极度去中心化。那么 Zero 网络到底是中心化的,还是去中心化的?

比特币网络

去中心化网络唯一的标杆是比特币网络。虽然比特币在协议上是去中心化的,所有节点都是全节点,但事实上出块的算力基本被几大矿池垄断,比特币网络还算是去中心化的吗?

如果单从这个出块权力的集中程度分析,还真是有点难分伯仲,这也是 Zero 网络的诞生让人迷惑的点。

我们信任比特币的去中心化,是因为每一个节点都有全量账本数据,由于区块链逐个区块哈希的设计,我们可以重放所有交易历史,以此判断新产生的区块数据是否合法。PoW 共识则是所谓一 CPU 一票,哈希碰撞难但是验算简单,以此来验证出块权。所以总体来说,对于比特币,我们相信的是加密算法。

而对于 Zero 网络,其实我们相信的也是 ZK 加密算法。我们应该相信 Block Producers 会按照电路来生成证明,然后所有的成千上万的 Verifer 都可以去验证区块数据是否合法,这整个过程也完全是加密算法来保障的。

如果说 Zero 的源代码分发也许会有风险,比如生成 ZK 证明的电路逻辑出现 bug,或者验证 ZK 证明的逻辑有漏洞,给攻击者可乘之机。那么所有的区块链都面临源代码不安全的风险,包括比特币,你并不能保障比特币的源码就是绝对安全的。所以从这个角度无法区分 Zero 网络的优劣。

回到去中心化的角度,比特币网络交易重放可以保障区块数据可靠,而 Zero 网络虽然出块权被少数节点掌握,但是验证区块的权力借助 ZK 技术,能够轻易下放到任何轻量级设备上,这是比特币都无法比拟的 “去中心化”。假如 Zero 网络的 Block Producers 作恶,所有用户都可以知道,并且反馈给结算层,如果众多 Verifier 不同意,Block Producers 的出块权会被取消……

从这几个角度去对比,是不是恍惚间发现 Zero 网络竟然可以和比特币同台竞技,甚至 ZK 技术的出现给了 Zero 超越比特币的可能性?

共识

当然,刚才刻意弱化了核心问题所在。面对这种区块链架构上的疑惑,如果一时间没有思路,可以回到区块链技术的圣经 —— 比特币白皮书 找灵感。

比特币白皮书在摘要里就提到了比特币要解决的核心问题:双花(double-spending)。

Zero 网络引入 ZK 技术确实解决了区块链数据不可篡改这个问题,但是如何解决双花问题?答案是 Zero 网络用了 PoS 共识,引入了 Validator 的概念。别管他到底是哪种 PoS,反正都是 PoS。

参考以太坊的架构去理解,以太坊有两层,执行层和共识层,执行层负责执行交易,共识层负责验证节点出块的权力。

Zero 网络的架构和以太坊有点类似,分为出块层和结算层,出块层就是用大规模 GPU 执行区块和产生 ZK 证明的那一层,而结算层,则是 PoS 质押、验证节点是否有出块权力的一层。

你也许没跟上,不是说解决双花问题吗,怎么又在讨论节点出块权力的问题了。因为假如节点出块的权力被控制,或者可以做恶,那么恶意节点就可以允许区块数据,也就是交易历史被改写,上一秒看到交易成功了,下一秒发现交易回滚了。所以节点出块的权力得到保障,双花问题也可以得到解决。

那么这下就清晰了,Zero 引入了 ZK 技术把 TPS 提高了两个数量级,确实有很大的进步。但是在共识方面,依然用了 PoS。对于一些比特币的原宗旨教徒来说,PoS 共识甚至都是不入流、不能抗审查的。那么 ZK 再牛自然也就没有意义了。

EVM

所以,Zero 网络从一开始的竞争对手就不是比特币,根本不会动摇比特币的地位。回到 Zero 网络的 Manifesto。从标题 “Multi-Core World Computer” 就能看出是奔着以太坊去的,在 Manifesto 中也直接对比了以太坊、Solana 的性能问题。当然是不可能出现比特币的。

而实际上,Zero 网络连以太坊主网的地位都不会动摇,以太坊的去中心化程度是仅次于比特币的,全节点运行在民用级设备一直是 Vitalik 的愿景 —— “如果基金会不在了,以太坊还会存在吗?”

更进一步,Zero 网络连 Solana 的地位也不会动摇,因为 Solana 独特的生态,和一些名人以及政治叙事,轻易不会被取代。

总的来说,Zero 网络仅仅只能在 EVM 的生态里做竞争,可能会直接动摇发布不久的并行 EVM 网络 Monad 的前景。其他的更大的野心,明显还做不到。

默认参数引起的以太坊节点运行错误

2026-02-03 15:19:01

大概是两年前的事情了。在工作中,我们用以太坊节点搭建了一条网络,上线后发现网络中不能新增 Validator,也就是质押者的 32 ETH 没有生效。

原因是我们用了多种共识层客户端,包括 Prysm 和 Lighthouse 等。为什么会突然出问题呢?因为 Prysm 有一个叫 --contract-deployment-block 的命令行参数,其他客户端比如 Lighthouse 和 Teku,这个参数的默认值都是 0(参数名字在不同客户端可能不同,但是含义类似),而 Prysm 的这个参数默认值是 11184524,这个数字是以太坊从 PoW 转向 PoS 后质押机制开始生效的区块高度。

这个参数在干什么呢?它会从这个参数配置的区块高度开始,去扫描 Deposit Contract(主网是 0x00000000219ab540356cbb839cbe05303d7705fa )上质押者的存款记录。我们平时说的质押 32 ETH,就是质押到这个合约里了,或者说就是把 32 ETH 转账给这个合约。这个合约在收到你的 ETH 之后,Consensus Client 比如 Prysm,就能根据合约的记录知道某一个地址确实给合约转了 32 ETH,因此认可这个人成为出块节点。

以太坊整个网络可能有几千个节点,每一个节点都在执行同样的操作,就是从 Deposit Contract 上扫描质押者列表、然后维护到自己本地的数据库状态中。直到轮到自己出块的时候,就把这个一直在维护的质押者列表的数据,计算一个总数 Deposit Count 和哈希根 Deposit Root,作为 eth1_data 字段的值,提交到区块数据中:

这个截图来自以太坊主网的区块 24374562,意味着当前以太坊一共有 204 万个质押者。要注意质押者不等于物理服务器上运行的节点数量,一个节点可以运行几千个质押者(Staker / Validator),所以推测以太坊实际上的物理节点数量大概在几千个左右。

回到 Prysm 配置的问题,如果不配置 --contract-deployment-block 参数,默认值是 11184524,那么对于一条新启动的链来说(Chain ID 不是 1 那种),Prysm 就不去扫描 Deposit Contract 合约在块高度 11184524 之前的质押记录了,本地数据库里没有质押者的数据,在出块的时候自然也不会带上 eth1_data 的字段数据。

以太坊的 协议设计 中要求,eth1_data 的数据必须要超过半数节点一致才可以生效。(注意这里的比例是 1/2,和其他地方用到的魔法比例 2/3 不一样)。

所以如果你新启动的网络中有超过一半的节点用了 Prysm,同时这些 Prysm 节点没有可以设置 --contract-deployment-block 参数,网络就会异常、不能正确处理新加入的质押节点。

我们一般认为软件的默认参数是相对安全可靠的,如果刻意设置才表示我们有特殊需求。而在以太坊 Prysm 客户端的这种语境下,不刻意设置默认值反而是危险的。