2022 年 9 月 6 日,以太坊历史性转身,正式完成从 PoW 到 PoS 的升级。
我们常说,“天下没有免费的午餐”,讲的是没有完美的解决方案。也就是说,在某些方面的优势,总会带来其他方面的劣势。
以太坊做了自己的权衡。升级到 PoS ,让以太坊社区如愿以偿,终于摆脱掉了“无谓”的挖矿能耗;然后也正是这一选择,让以太坊的攻守形势,在看似平静的水面下,发生了质的改变。
本文要点:
PoW 高耗能的安全意义
PoS 低耗能带来的安全风险
如何兼具 PoW 的安全性与 PoS 的低耗能
对低能耗的执念
低能耗是 PoS 的优势,但是低能耗带来的安全 trade-off 也不能被忽视。
推动以太坊很早就将 PoS 写入路线图的重要原因之一,便是对传统观念 PoW 高额能耗的不认同——消耗如此多的电能,最终产出却没有带来实际价值。
在 2017 年的牛市周期中,大家也普遍认为,PoW 未来会被 PoS 取代。
然而真的如此吗?并不是,至少并不一定。
PoW 的高能耗并非无意义
首先,通过以下几点,驳斥关于 PoW 高能耗毫无意义的谬误观点:
PoW 的高能耗不仅不是无意义的,还是 PoW 网络的“国防开支”。它让攻击者必须付出极高的代价才能攻击成功,从而使攻击在理性人(国家除外)看来是不经济的。
PoW 支撑的网络(如比特币网络)有实际应用价值,比如让第三世界国家的 unbanked 人群,通过一部手机就能享受到基础的银行服务,而这些服务开箱即用,不需要开设线下网点,不需要招募员工,不需要搭建服务器。
PoW 的能耗,以比特币为例,相比黄金开采和银行业实在是太少了;而且算力竞争会促使矿工寻找廉价甚至免费的电力供应,例如电力的供需本身是波动的,如果电力供应超过需求,盈余部分不仅无法保存,还会对电网产生不良影响,而矿机正好可以承接。
不能因为 PoW 的能耗易于量化,就对 PoW 有偏见。事实上,如果认为 PoW 能耗无意义,应该消灭的话,电吹风、装饰用电是否也应该被消灭?什么该用电、什么不该,由特定的人群,而非市场说了算,是很难有说服力的。
低能耗固然好,但看到高能耗,不深究上下文,就心生杀意,着实不大合适。
类似的,在 6 年后的今天,笔者常常反思,比特币的“冥顽不化”“不近人情”是否反而更像是 feature,而非 bug;而以太坊追求的 Upgradability,是否有可能是固有思维模式在区块链上的误用。这里只蜻蜓点水,结论还是留给大家自己来下。
PoS 的低能耗并非毫无风险
以太坊社区对去中心化和安全性的坚持,自然是不可否认的。然而,在让 Layer 1 升级到 PoS,从而降低能耗,并为扩容做准备的这个选择上,以太坊可能低估了它带来的安全风险。
这并非埋汰以太坊,也不是泼冷水。事实上,如果以太坊能在拿到 PoS 收益的基础上,消除 PoS 的攻击面,当然更好,但这无疑又会让 Layer 1 进一步复杂化,而复杂系统大概率是有问题的;并且,Layer 1 还会让这些问题的影响扩大化。
PoS 的安全问题和其低能耗是一对双生子。
PoW 中,大家需要用实打实的算力来竞争挖矿权。在 PoS 中,挖矿权按照 Validator 质押(stake)的 ETH 的权重,随机分配挖矿权。只要你被选为下一个区块的 Proposer,产出区块的难度为 0。PoS 就好像在说:“大家都别抢,一个一个来。”
这意味着,分叉主链,重写历史的难度大大降低了。当然,PoS 自然是有针对性方案的,这个方案的核心就是经济惩罚(slash)。如果你以权谋私,被其他人举报,那么你就会受到经济制裁,你质押的 ETH 会被部分罚没。
这种方案达到的安全,叫做 Slashable Security。只要能将作恶的人绳之以法,理论上就能避免理性人来干坏事。不幸的是,这套机制也有鞭长莫及的时候。
下面举个具体的例子。
为了方便说明,假设以太坊上只有 A、B、C 三个 Validator,他们仨都质押了 32 ETH,不多不少,那么正常情况下,他们被选来 Propose 下一个区块的概率都是 1/3,而以太坊的主链(记作 Chain)应该长这样:
某一天,A 黑化了,想干坏事。A 这天买了一辆车,给人家 20 ETH。车到手了,但 A 想不认账。A 于是在主链之外,悄悄分叉出来一条链(记作 Chain'),在这条链里,20 ETH 还躺在 A 的账户上,并没有付给人家。
如果 A 这时把 Chain' 公布出来,B、C 马上就会发现 A 这家伙不认账,改了账本,然后把 A 质押的 ETH 给罚没掉。所以,A 不能打草惊蛇,A 需要先把自己的 32 ETH 取出来。
A 把 32 ETH 取出来后,终于可以放心大胆地干坏事了。A 这时公布自己篡改的 Chain'。B、C 知道 A 的真面目,可是拿 A 毫无办法。但有主链在此,A 如何才能混淆视听,让其他人,尤其是新加入的人相信,他刚刚公布的 Chain',才是正统的主链呢?
这就要求 Chain’ 在以太坊分叉选择(Fork choice)算法的眼中,必须优于 Chain。简单来说,以太坊的分叉选择算法(LMD-GHOST)在每次遇到分叉时,就会选择大家用脚投票最多的那条路。主链 Chain 上有 B、C 作为 Validator 投票,而 Chain' 上只有 A 能投票,B、C 能投的票数肯定比 A 一个人多,那是不是 A 就不可能让 Chain' 成为主链了呢?答案是很难,但并不是不可能。
在 Chain' 中,A、B、C 依然都是 Validator,但 A 藏着掖着 Chain',B、C 被选为 Proposer,也无法 Propose 区块,也无法给别人 Propose 的区块投票。正是因为这样,B、C 会被认为离线,而受到惩罚,其质押的 ETH 会越来越少,被选为 Proposer 的概率也越来越小;直到最后,B、C 质押的 ETH 被扣光,并被踢出 Validator,A 完全掌控 Chain’。
将 Chain' 大差不差伪装成主链,需要的时间很长,要偷偷分叉很久才能成功——所以这种攻击叫做远距离攻击(Long Range Attack)。但是,A 还有一些方法,能加快这一进程。比如,假设 B 在主链上取回了自己质押的 ETH,金盆洗手,不干 Validator 了,A 就有可能花钱买到 B 的私钥,从而在 Chain' 上,控制 A、B 两个 Validator 席位。
当然,以太坊也是设想过类似情况的,见招拆招,采用了社会共识(Social Consensus)的方式来避免 A 取钱后干坏事跑路。什么是社会共识呢?这个机制在很多地方都有用到,比如状态通道(State Channel),但这里我们不妨举一个生活中的例子。
比如学校发奖学金,奖励品学兼优的好学生。学校并不能百分百保证,奖学金候选人品学一定兼优。所以,学校往往会公示一段时间(Challenge Period)。在这段时间内,如果有人带着候选人的黑料(比如校园霸凌或考试作弊)来举报,证实候选人品学有问题,那么候选人的奖学金资格就会被取消。
类似的,A 提交取钱申请后,以太坊会公示 21 天,如果这 21 天内没人举报 A,21 天后 A 就能把钱取走(unstake)。
这种解决方式的劣势很明显:
效率低,要等待很久。
对于一些用户活跃度不高的 PoS 网络(比如刚上线的),有可能会监控不到位,A 干了坏事,但没被人监控到,或着没被及时举报,导致 A 最终逍遥法外。
最根本的是,即便有 21 天的公示期,A 依然可以等 21 天取到钱后,再干坏事。B、C 知道 A 黑化了,但由于不再有 A 的把柄(stake),一点办法没有;新来的人不了解情况,看到 A 公布的 Chain',很有可能就相信它是主链了。
所以,社会共识既牺牲了效率,安全性也没保住。
本质原因是,社会共识属于外生的安全机制,并不可靠。
那什么是内生的安全机制呢?兜兜转转,还是又得说到 PoW 的“唯算力论”了。但这次,与其选边站队,无脑吹 PoW 或 PoS,不妨建设性地想想,我们有没有可能,让 PoS 在不怎么额外耗能的前提下,像 PoW 那样安全呢?
以太坊先生,您的免费午餐到了
好消息是,还真有这样的免费午餐。
我们只需加入 3 个神奇的要素,便可获得 PoW 队友的神助攻。
要素 1:时间戳存档
PoS 网络的区块历史被篡改的门槛,相对于 PoW 来说低很多。这也就意味着 PoS 的时间线其实是不稳定的。初来乍到的人很难分辨 Chain 和 Chain' 哪条是主链,因为在 PoS 中,时间的相对性和模糊性很强。两条分叉,第 2 条分叉中高度为 1000 的块未必比第 1 条分叉中高度为 1010 的块的出块时间早。那怎么办?
PoW 网络的出块成本更高,时间线稳定性因而更强。如果将 PoS 时间线上关键节点的区块信息(如 Hash),写入到 PoW 区块中——类似于游戏中的存档(Checkpoint),然后在分叉选择时,参考 PoW 链上的记录,这样就能让 PoS 时间线(即便是刚上线的 PoS 网络)的稳定性大大增强。这时,攻击者 A 想要重写 PoS 网络的区块历史,就需要重写 PoS + PoW 的历史,其中 PoW 要重写可就难度倍增了。
要素 2:可用性检查
A 思前想后,发现光有时间戳,并不等于 PoS 有了铜墙铁壁;他仍然可以偷挖一条分叉,然后把分叉中的区块信息不断写入 PoW 区块中。
所以,为了应对这种策略,我们还需要增加可用性检查环节。说人话就是,PoW 的矿工在收到 Checkpoint 申请时,不能闭着眼睛照单执行,还应该去对应的 PoS 上找找,看要写入的 Checkpoint 信息,在 PoS 上是否能访问到,内容匹不匹配。
要素 3:合并挖矿
说到这里,你可能要问了,PoW 好是好,可也要能耗投入呀,这不等于又走回 PoW 的老路了吗?非也非也。最大的 PoW 网络不是已经摆在大家面前了吗,那就是比特币网络。只要让比特币矿工来承担“时间戳存档”和“可用性检查”的职能,不就搭便车,不费一分钱,就买到了免费午餐吗?这样,比特币一条 PoW 区块链的能耗,可以用于提升 N 多条 PoS 区块链的安全性。到时候,还能说比特币网络高耗能没有意义吗?都给你降本增效到这个地步了。
不过,这个思路在实操起来还是会有些问题:
每条 PoS 都去找比特币的众多矿池对接,要求在区块打包时加入自己链的标记,这对 PoS 和比特币矿池而言都是头疼的事;
每条 PoS 链都往比特币区块里加标记的话,Footprint 太大了,而且有上限;
和比特币网络交互起来很复杂,PoS 链要实现这套逻辑很难,每条 PoS 链都去实现可能意味着重复造轮子。
所以,本着分工专业化的原则,我们可以新起一个 PoW 链,每条 PoS 链与新起的 PoW 链交互,把区块信息写到后者的区块中,然后由后者统一打包再托比特币矿池写到比特币区块中,这样问题就解决了:
新起的 PoW 链一边聚合了每条 PoS 链,另一边聚合了比特币矿池,两边只用和这条链打交道就行;
每条 PoS 链的 Checkpoint 可以完整地写入到新起的 PoW 链的区块中,再有后者压缩(如借助 Merkle Tree)写入到比特币区块中,这样给比特币带来的 Footprint 就很小,可容纳的 PoS 链就很大了;
新起的 PoW 链可以封装与比特币网络交互的复杂性,然后为每条 PoS 链提供简易的接口。
上述问题确实解决了,可新起一条 PoW 链不又得投入新的算力吗?到这里就不得不提合并挖矿(Merge Mining)了。
合并挖矿的历史,可以追溯到 2010 年,是一项和比特币差不多老的技术。众所周知,PoW 的核心是要暴力解算一个 nonce,让 nonce 所在的区块头(Block Header)的 Hash 小于一个特定的目标值。比如比特币网络要求 Hash 开头有 6 个 0,而我们新起的 PoW 网络要求开头有 3 个 0 就行,难度低于比特币。那么比特币矿工算出的符合要求的 nonce,后者一定也能用;除此之外,比特币矿工酸楚的没达标的 nonce,有可能达到了后者的标准,那后者也能用。(新起的 PoW 链在校验时,会去看对应的比特币区块的区块头,所以其实结构更合理的设计应该是将区块头单独抽出来作为一条链,但这种想法因为变动太大很难实施。)这样一来,新起的 nonce 就搭上比特币算力的便车了。
值得一提的是,即便不是所有比特币矿工都支持,新起的 PoW 链的安全性也能逼近比特币网络的安全性,原因是前者在后者的区块中有 Checkpoint;反之,如果只是共享算力,而前者在后者中没有 Checkpoint,那前者的安全性其实只受到支持它的那部分算力的保护,并没有分享到比特币的安全性。
总结一下:
PoS 链通过 Checkpoint 挂钩新起的 PoW 链,新起的 PoW 链通过 Checkpoint 挂钩比特币网络;并且为了避免悄悄分叉的问题,新起的 PoW 链的矿工在给 PoS 链 Checkpoint 时,还会检查数据的可用性。上述条件具备后,PoS 链的安全性就受到了比特币网络的保障,PoS 对善良 Validator 的规模要求(Honest Majority)便可从 2/3 放松到比特币的 51%。
以上思路其实源自 Babylon 项目。目前该项目还处于早期 MVP 阶段,关注度似乎也不高,但不得不说很是巧妙;此外,合并挖矿,作为一项 10 多年历史的古早技术,其潜力很有可能被大家低估了。