原文链接:V神长文:我们能从以太坊的岔路口中学到什么?
盘点现下加密圈中最令人期待的事请,肯定会有以太坊合并的一席之地,根据谷歌趋势数据显示,“以太坊合并”(Ethereum Merge)搜索量创历史新高,此外,谷歌透露“权益证明”(PoS)、“以太坊2.0发布日期”等关键词搜索量最近也均出现大幅上涨。这些数据足以看出加密人士对以太坊此次转型道路的关注之高。当然这热度并不会令人意外,毕竟以太坊的每一次道路决策都会在加密圈中掀起一阵浪潮,这次自然也是一样。
以太坊发展至今仍旧屹立不倒,离不开每一个岔路口的合理决策。但有支持就会有质疑,就此次的以太坊合并而言,有些人就直接发出疑问:PoS机制出现在以太坊之前,为什么以太坊从一开始不选择PoS,而是到如今大费周章的进行转型呢?
为了更好的解释这一问题,V神带来了关于以太坊道路选择的解答,今天就让我们一起跟着V神来看一下选择不同道路的以太坊会是什么样子,以及我们可以从中学到些什么。
作者:Vitalik Buterin
编译:Corn
出品:鸵鸟区块链
以太坊开发社区在以太坊早期阶段做出了很多决定,这些决定对项目的发展轨迹产生了巨大的影响。在一些情况下,以太坊开发人员会有意识地在我们认为比特币可能犯错的地方进行改进。另外,我们正在创造全新的东西,我们需要想出一些东西来填补空白,当然有很多东西可以选择。此外,我们还需要在更复杂和更简单的东西之间进行权衡,有时候,我们会选择比较简单的东西,但有时候,我们也会选择比较复杂的东西。
本篇文章将着重于以太坊经历过的一些岔路口。以太坊的很多特征在核心开发圈内都被认真讨论过,当然也存在几乎没有考虑过但是确实应该考虑的一些特征。即便如此,我们还是有必要看看一个不同的以太坊会是什么样子,以及我们可以从中学到些什么。
我们是否应该使用更简单的PoS机制?
以太坊即将合并的Gasper PoS是一个复杂的系统,但也是一个非常强大的系统。它的一些属性包括:
非常强大的单区块确认——一旦交易被包含在一个区块中,通常在几秒内该块就会被最终确认,除非大部分节点不诚实或存在极端的网络延迟,否则是无法被逆转的。
经济上的确定性——一旦一个区块被最终确定就无法恢复,除非攻击者能够成熟数百万的ETH损失。
非常可预测的奖励——验证者在每个epoch(6.4分钟)都能获得奖励。
支持非常多的验证者数量——与具有上述功能的大多数其他链不同,以太坊信标链支持数十万验证者(例如,Tendermint提供比以太坊更快的最终确定性,但它只支持几百个验证者)。
但是创造一个具有这些特性的系统是困难的。这需要数年的研究,数年的失败实验,并且通常需要大量的努力,最终的输出相当复杂。
如果我们的研究人员不必花费如此大的精力在研究共识上,大脑可以有更多的空闲时间,那么也许,只是也许,Rollup可以在2016年被发明出来。这给我们带来了一个问题:我们真的一定要对PoS有这么高的标准吗?我们的PoS,即使是更简单和更弱的PoS版本也会比PoW现状有很大改进,不是吗?
许多人有一种误解,认为PoS本身就很复杂,但实际上有许多PoS算法几乎和中本聪PoW共识一样简单。我们本来可以从2017年开始,甚至从一开始就拥有一个运行良好的PoS。Gasper比这些算法更复杂的原因很简单,因为它试图比这些算法完成更多的工作,但如果我们一开始要谦虚,我们可以先专注于实现一组更有限的目标。
在我看来,从一开始就进行PoS是错误的决策。PoW有助于扩大最初发行的范围,使以太坊变得可访问,并鼓励爱好者社区。但如果在2017年甚至2020年换成一种更简单的PoS,可能会大大减少对环境的破坏(以及环境破坏导致的反加密心态),并有更多的研究人才可以自由地进行扩展。我们是否需要花费大量的资源来制作一个更好的PoS共识呢?是的。越来越多的迹象表明,我们最终一定会选择一个更好的PoS共识。
分片的简化
以太坊分片自2014年开始研究以来,一直在朝着越来越简便的方向发展。首先,我们有内置执行和跨分片交易的复杂分片。然后,我们通过将更多的责任转移给用户来简化协议(例如,在跨分片交易中,用户必须分别为两个分片支付gas费)。再然后,我们切换到以Rollup为中心的路线图,从协议的角度来看,分片只是数据块。最后,通过Danksharding,分片费用市场合二为一,最终的设计看起来就像一个非分片链,但在这里,一些数据可用性采样在幕后发生,以实现分片验证。
但如果我们走的是相反的道路呢?实际上有一些以太坊的研究人员,他们深入探索了一个更复杂的分片系统:分片将会是链,会有子链依赖于父链的分叉选择规则,跨分片消息会被协议路由,验证器将是在分片之间转换,甚至dapp也会在分片之间自动实现负载平衡!
这种方法的问题是:这些形式的分片在很大程度上只是思想和数学模型,而Danksharding是一个完整的、几乎可以随时实现的规范。因此,考虑到以太坊的环境和限制,在我看来,分片的简化和去歧义化绝对是正确的举措。也就是说,雄心勃勃的研究也有非常重要的作用:它确定了有前途的研究方向,即使是非常复杂的想法通常也有“相当简单”版本,这些想法仍然可以提供很多好处,而且它很有可能在未来几年对以太坊的协议开发(甚至是第二层协议)产生重大影响。
EVM中特性的选择
实际上,除了安全审计之外,EVM的规范基本上是可以在2014年年中推出的。然而,在当时接下来的几个月里,我们继续积极地探索我们认为对于去中心化应用程序区块链来说可能非常重要的新特性。有的没有考虑到,有的考虑到了。
我们考虑过添加POST操作码,但最终决定反对。POST操作码将进行异步调用,该调用将在交易的其余部分完成后执行。
我们曾考虑添加一个ALARM操作码,但最终决定反对。ALARM的功能与POST类似,只是在未来的某个块中执行异步调用,允许合约安排操作。
我们添加了日志(logs),它允许合约输出不涉及状态但可以被dapp接口和钱包解释的记录。值得注意的是,我们也考虑过让ETH转账产生日志,但最终决定反对——理由是“人们很快就会转向智能合约钱包”。
我们曾考虑扩展SSTORE以支持字节数组,但出于对复杂性和安全性的担忧,最终决定放弃。
我们添加了预编译,这是一种使用本地实现执行专用加密操作的合约,gas成本比在EVM中执行要低得多。
如今看来,大多数不添加更多功能的决定都已经被证明是非常好的决定。没有明显的理由添加POST操作码,ALARM操作码实际上很难安全实现:如果块1...99999中的每个人都设置一个在ALARM,在100000区块执行大量代码会发生什么?该块需要几个小时来处理吗?一些预定的操作会被推迟到后面的区块吗?但是如果发生这种情况,还有什么保证ALARM可以保留呢?SSTORE对于字节数组很难安全地完成,并且会大大扩展在最坏情况的见证大小。
状态租金问题更具挑战性:如果我们实际上从第一天开始实施某种状态租金,我们就不会让智能合约生态系统围绕持久状态的规范化假设发展。以太坊将会更难构建,但它本来可以有更好的可扩展性和可持续性。与此同时,我们当时的状态到期计划确实比现在的要糟糕得多。有时候,好的想法需要数年时间才能形成,而且没有更好的解决方法。
LOG的可选路径
LOG可以通过两种不同的方式来完成:
1、我们可以让ETH转账自动发布一个LOG。这将为交易和许多其他用户节省大量精力和软件漏洞问题,并将加快每个人依赖日志的速度,这将有助于智能合约钱包的采用。
2、我们完全可以不用LOG操作码,而是把它变成一个ERC:会有一个标准的合约,它有一个submitLog函数,并使用以太坊存款合约的技术来计算该区块中所有日志的Merkle根。无论是EIP-2929还是块范围的存储(相当于TSTORE,但在区块之后清除)都可以使其便宜。
我们认真考虑过第一种,但最终决定反对这个方式。主要原因是简单:日志只来自LOG操作码更容易。我们还非常错误的预计大多数用户能够快速迁移到智能合约钱包,这一过程可以直接地使用操作码记录转账。
第二种之前没有考虑过,但如今回想起来,这其实一直是一个选择。第二种的主要缺点是缺少用于快速扫描日志的Bloom过滤器机制。但事实证明,Bloom过滤机制太慢,对dapp来说不太友好,所以现在越来越多的人使用TheGraph进行查询。
总的来说,这两种方法中的任何一种都可能优于现状。保持LOG在协议之外会使事情变得更简单,但如果它在协议内部,自动记录所有ETH传输会使它更有用。
如今,我可能倾向于赞成最终从EVM中取消LOG操作码。
如果EVM选择了完全不同的路呢?
EVM可以采用两种完全不同的自然路径:
1、让EVM成为一种高级语言,使用内置的变量、if语句、循环等结构。
2、使EVM成为一些现有VM(LLVM,WASM等)的副本
人们从未真正考虑过第一条道路。这条路径的吸引力在于它可以使编译器更简单,并允许更多的开发人员直接在EVM中编码。它还可以简化ZK-EVM的构造。该路径的缺点是,它会使EVM代码在结构上更加复杂:它不是一行操作码的简单列表,而是一个需要以某种方式存储的更为复杂的数据结构。也就是说,我们错失了一个两全其美的机会:在保持基本EVM结构基本不变的情况下,一些EVM的更改可以给我们带来很多好处。
第二种方法被提出了很多次,也被拒绝了很多次。通常的说法是,它允许程序从现有的语言(C、Rust等)编译到EVM中。反对的理由一直是,考虑到以太坊的独特限制,它实际上不会提供任何好处:
来自高级语言的现有编译器往往不关心总代码大小,而区块链代码必须进行大量优化以减少每个字节的代码大小
我们需要VM的多个实现,并且有一个硬性要求,即两个实现绝不能以不同的方式处理相同的代码。在我们没有编写的代码上进行安全审计和验证会更加困难。
如果VM规范发生变化,以太坊要么一直随之更新,要么就会变得越来越不同步。
因此,对于EVM来说,可能永远不会出现一条可行的路径与我们今天所拥有的完全不同,尽管有很多小细节(跳转、64位 vs 256位等),但如果采用不同的方法,可能会产生更好的结果。
ETH的供应是否应该有不同的分配方式?
目前的ETH供应量大致可以用下图来表示:
目前大约有一半的ETH是在以太坊公募中出售的,任何人都可以将BTC发送到一个标准化的比特币地址,并且最初的ETH供应分配是通过一个开源脚本计算出来的,该脚本会扫描到比特币区块链的交易地址。其余的大部分都通过挖矿获得。黑色部分的1200万ETH标记为“Other”,这其实是“premine”(预挖部分)——是在以太坊基金会和大约100位以太坊协议的早期贡献者之间分配的额度。
对于这个过程有两个主要的批评:
预挖以及以太坊基金会掌控公募资金这两件事儿并不具备可信的中立性。一些收款人地址是通过一个封闭的过程人工挑选出来的,必须相信以太坊基金会并不会通过贷款来利用公募所得资金,以获得更多的ETH(我们没有,也没有人宣称我们有,但即使是完全信任的要求也会冒犯一些人)。
预挖过度奖励了早期贡献者,而奖励留给后来贡献者的太少。75%的预挖用于奖励发布前贡献者的工作,而在发布后,以太坊基金会只剩下300万个ETH。在6个月内,为了经济生存而出售的需求减少到了大约100万ETH。
在某种程度上,这些问题是相关的:尽量减少对中心化的举措促成了较小的预挖,而较小的预挖则被更快的耗尽。
这并不是唯一的解决方法。Zcash就采用了不同的方法:将区块奖励的20%固定分配给协议中硬编码的一组接收者,这组接收者每四年重新协商一次。这本来可以持续下去,但它会因为过于中心化而受到更严厉的批评(Zcash社区似乎比以太坊社区更能公开接受更多的技术专家领导)。
一种可能的替代路径类似于“从第一天开始就使用DAO”的路径,目前在一些DeFi项目中很流行。下面是一个可能的稻草人提案:
我们同意在2年内,每个区块的2个ETH的区块奖励将进入一个开发基金。
任何在以太坊销售中购买ETH的人都可以为他们喜欢的开发基金分配方式投票(例如“每个区块给以太坊基金会1个ETH,给Consensys研究团队0.4个ETH,给Vlad Zamfir 0.2个ETH……”)。
被投票支持的接受者从开发基金中获得的份额等于每个人投票的中位数,按比例计算,每个区块的总数就等于2个ETH(中位数是为了防止自我交易:如果你把票投给自己你将会什么也得不到,除非你能让至少一半人提到你)。
该交易可以由一个法律实体来运营,该实体承诺将在交易期间收到的比特币按照与ETH开发基金相同的比例进行分配(或者烧掉,如果我们真的想让比特币用户高兴的话)。这可能会导致以太坊基金会获得大量资金,非以太坊基金会的团体也获得大量资金(导致更多的生态系统去中心化),所有这些都不会破坏可信的中立性。主要的缺点当然是代币投票真的很糟糕,但实际上我们可以意识到2014年仍然是一个早期和理想主义的时期,代币投票最严重的缺点是在公募结束后很久才开始发挥作用。
这会是一个更好的主意并开创一个更好的先例吗?可能是!尽管实际上即使开发基金完全可信中立,但如今对以太坊的预挖大喊大叫的人很可能已经开始对DAO分叉加倍的大声疾呼。
我们能从这一切中学到什么?
总的来说,有时候我觉得以太坊最大的挑战来自于两种愿景之间的平衡——一个纯粹而简单的区块链,它重视安全性和简单性,另一个是用于构建高级应用程序的高性能和功能性平台。上面的许多例子只是一个方面:我们是拥有更少的功能,更像比特币,还是拥有更多的功能,更适合开发人员?我们是担心让开发资金变得更中立并且更像比特币,还是我们首先担心的是确保开发人员获得足够的奖励,让以太坊变得更好?
我个人的梦想是尝试同时实现这两个愿景——一个规范每年都比前一年更小的基础层,以及一个以第2层协议为中心的强大的、对开发人员友好的高级应用程序生态系统。也就是说,实现这样一个理想的世界需要很长时间,我们需要一步一步地思考路线图,这可能会对我们有很大帮助。
现下,有很多事情我们不能改变,但也有很多事情我们仍然可以改变,并且仍然有一条可靠的道路可以改善功能性和简单性。有时,这条路是曲折的:我们需要首先增加一些复杂性以启用分片,而这反过来又在上面实现了大量的第2层可扩展性。也就是说,降低复杂性是可能的,以太坊的历史已经证明了这一点:
EIP-150使调用堆栈深度限制不再相关,减少了合约开发人员的安全担忧。
EIP-161将“空账户”的概念作为与字段为零的账户分离开来。
EIP-3529删除了部分退款机制,并使gas代币不再可行。
此外,正在酝酿中的想法,比如Verkle树,可以进一步降低了复杂性。但未来如何更好地平衡这两种愿景是我们应该积极思考的问题。