作者: Casey Detrio
翻译&校对: 闵敏 & 阿剑
编者注:这篇文章的原标题为 “Phase One and Done: eth2 as a data availability engine”,在发表其时(2019 年 4 月),作者意在为 Eth2.0 提出一种代替 Phase 2 的路线图,也便是,假如仅用分片来保证数据可得性,这样的体系是否有用,还需求增加哪些部分来使之变得有用。令人惊奇的是,在一年半曾经,作者就已经知道到,对 zk-rollup 这样的体系来说,底层有必要保证的是 “状况转化的履行和数据可得性有必要是原子化地绑定在一起的”,因而底层有必要具有履行能力,哪怕是十分简略的无状况履行;并且,(作者也经过层层推理指出)为保证用户体验,还短少的首要部分是数据怎么上分片的手续费付出协议(这两点知道,即便放到今日,也依然称得上是前沿,乃至是超前)。手续费协议在 Phase 2 的标准中,现在也依然是缺失的。
顺带说一句,本文作者是 Casey Detrio,他是 Ewasm 团队的一员,之前也为 Phase 2 供给过许多主意;他也以为,应该以 “保证 Eth1 的合约到了 Eth2 能够如常履行” 为核心来规划 Eth2.0。他是被低估的一个开发者。
现在,约束 Eth1 吞吐量的瓶颈是状况增长。因而,假如咱们想要扩展以太坊,从逻辑上来说,1000 个具有独立状况的分片能够将吞吐量进步 1000 倍。
可是,从 Eth1.x 的路线来看,Eth1.x 想要对两类资源的本钱进行重大调整:存储(storage)和买卖数据(tx data)。现在,存储的定价过低,而买卖数据的定价过高。这会鼓励 dApp 开发者在编写合约时更多运用存储而非买卖数据,然后导致存储成为吞吐量的瓶颈。针对这一问题提出的处理方案是增加存储的定价,并减少买卖数据的定价。经过这些本钱调整,开发者将遭到鼓励更多地运用买卖数据,而非存储(即,他们会编写更多无状况合约而非状况合约)。因而,在不久的将来(假如 Eth1.x 的路线图获得广泛选用),咱们预期 Eth1 的吞吐量会遭到买卖数据的约束,而非存储的约束。
假如咱们假定吞吐量遭到买卖数据的约束,那么为了扩展以太坊,Serenity 上的分片不需求有状况。假如吞吐量遭到来自无状况合约的买卖数据的约束,那么 1000 个无状况分片就会将吞吐量进步 1000 倍。
这听起来不错,可是需求经过分片来完成,按计划要比及 Phase 2。与此同时,咱们能够将 Phase 1 作为数据可得性引擎。数据可得性引擎一词好像逐步流行起来。咱们来考虑一下它是怎么运作的。
以 zk-rollup 为例,zk-rollup 遭到数据可得性的约束。Eth1 上的 zk-rollup 合约能否有效地将 Eth2 作为桥接式可用性保证供给方?假如在履行(即,验证 SNARK 证明并更新状况根)过程中无法同时保证数据可得性,你就会得到一个相似 plasma 的 zk-rollback 体系。这个体系虽然能够大幅进步 TPS,可是会引进复杂的权衡联系,需求处理像 plasma 那样的运营者挑战和退出机制。在可用性挑战中,任何人都能够供给数据来证明可用性,因而现在还不清楚将数据放入桥接的 Eth2 分片中能不能让工作变得更简略。
现在有了另一个版别的 zk-rollup,即,500 TPS 的 zk-rollup,一切都变得简略多了。不再需求指定的运营者,任何人随时都能充当中继者,并生成 SNARK 证明来更新状况。事实上,数据可得性保证始终伴跟着状况更新,也便是说不需求处理像 plasma 那样的运营者挑战和退出机制。可是这需求履行和数据可得性保证都产生在同一笔买卖中,而遗憾的是咱们无法运用桥接式可用性引擎做到这点。换言之,桥接关于 zk-rollback 这样的欺诈证明体系来说足够了,可是对 zk-rollup 这样的有效性证明体系来说还不够。结论是,为了将 Layer 2 上的有效性证明简略化,Layer 1 上的可用性引擎需求具有的一项重要功能是,能保证数据可得性与状况转化的履行是原子化地一起产生的。
或许咱们不应该对这一知道感到惊奇。假如单靠数据可得性(没有履行)就有用的话,就不会有人说 Phase 1 启动只是为了保证一堆非零 blob(二进制大型目标)的可用性,也就不会有人抱怨有必要要等 Eth2 进入下一阶段才能真实发挥作用了(除了 PoS 之外)。咱们正在尽力将 Phase 1 作为数据可得性引擎,可是它依然无法履行任何操作,因而令人感到失望。(哇,咱们能够构建 Mastercoin 2.0 了!)
那么,为什么 Phase 1 会与履行相冲突?好吧,假定是有状况履行,则每个分片都要保护一些本地状况。假如验证者需求保护许多本地状况,那么验证者混洗就会复杂得多。反之,假如没有履行,就不用担心本地状况。验证者混洗就会简略得多,咱们就能够专注于运用数据 blob 构建分片,然后更快地启动分片。
可是,咱们先不假定履行是有状况的。假如咱们测验运用十分简略的无状况虚拟机来履行操作会怎么样?
假定信标链状况中有 3 个新的验证者字段:code、stateRoot和deployedShardId。这儿还有一个函数process_deploy(就在 process_transfer 下方)。一旦代码布置完结,验证者有必要保证账户余额不低于某个阈值【至少确定 1 ETH。假如代码中没有自毁程序(SELFDESTRUCT),那么这部分 ETH 就等同于销毁了,代码也会永久布置】。
现在,咱们假定大局状况中已经有了一些带有代码的账户。
接下来,咱们测验将特定数据 blob 打包到分片上,可是该怎么做?据我所知,关于 phase 1 的分片验证者来说,怎么决议将哪些数据 blob 打包到分片区块中仍是个悬而未决的问题。假定 phase 1 标准中没有具体阐明这一点。那么,关于用户来说,假如他们想要将自己的数据 blob 打包到分片上,就只能经过两种办法:(1)联系验证者,并经过协议外的办法(例如,eth1 付出通道)向其付款;(2)自己成为验证者,就能够(在他们被随机选为分片的区块提议者时)将数据 blob 打包到分片上。这两种办法都是下策。
比较好的办法是,将工作摆到台面上,答应验证者经过一个买卖协议向当时区块提议者付出费用。作为交换,区块提议者要将验证者的数据 blob 打包到分片链上。可是,假如信标链区块操作(如验证者转账)有最小容量要求,这种办法就行不通了。假如没有一个能够让验证者决议数据 blob 打包优先级的买卖协议,那么“将 phase 1 作为数据可得性引擎” 的用例将无法完成(无论是经过桥梁连接到信标链的 eth1 合约,还是 Truebit、Mastercoin 2.0 或其它我之前听说过的数据可得性用例)。不管怎么说,咱们先假定,不管分片提议者在 “没有履行的数据可得性引擎” 形式中怎么打包数据 blob,都能够在 “简略无状况履行的数据可得性引擎” 中都同样能做到。
好了,那么假定特定的数据 blob能够打包进区块了。每个区块都将履行约束在一笔买卖中(例如,整个数据 blob 有必要作为一笔买卖)。咱们还未清晰买卖要用密钥签署(存在买卖协议),还是不需求签署(不存在买卖协议)。假定是后者,且代码完成了自己的签名检查(相似账户笼统;存在区块 gas 上限,可是没有费用转账机制,因而没有 gas 价格和 GASPAY 操作码)。假如 blob 能够作为买卖成功解码,则以数据和当时状况根作为输入履行目标账户代码。假如履行成功,则返回数据为新的状况根。
咱们怎么更新验证者账户的stateRoot(状况根)?咱们无法在每个分片区块的 BeaconState(信标链状况)中更新状况根(由于信标链操作在数量上有严厉约束)。可是,信标链的状况中的分片字段,会跟着交联(crosslink)而更新。取同一个分片上所有账户的已更新状况根,假定对它们进行哈希运算,得到shard_state_root(分片状况根)。shard_state_root好像与 phase 1规划中已有的crosslink_data_root差不多(二者都是取决于之前分片区块内容的哈希值)。
不可否认的是,不是每挖出一个信标链区块,所有分片状况根都会更新,因而存在一些本地状况。可是,假如账户是大局的,状况根数据便是最小化的。这就与混洗期间验证者之间需求搬运部分分片区块的数据差不多。
这儿当然疏忽了许多细节。我想要表达的是,无状况履行的大部分要求好像在 phase 1 就能满足。我以为,最大的问题在于,现在尚未清晰用户能够经过哪种办法将他们的 blob 打包上链(假如这个问题不处理,phase 1 就无法成为桥接式可用性引擎)。或许这只是第一个问题,还有其它严峻的问题被我疏忽了。我疏忽了什么?假如要在 phase 1 上答应用户经过某种办法将 blob 打包上链,那么最困难的部分是什么(假如你喜欢的话,也可称之为 phase 1.1)?
这个履行形式相比 phase 2 的提议更加简略,一大原因是合约账户是大局的,就像验证者账户相同。这就意味着,合约账户的数量有必要设有上限,并且布置代码的本钱与成为验证者的本钱相同高(也有或许低于后者)。可是,假如这能够让咱们更快地将履行引进 Eth2,咱们是否能够接受这种权衡?代码布置后,就无法更改合约存储,因而也能够说,咱们这是在测验不扩展合约存储而为 Phase 1 供给履行功能。这儿还有一大重要用例:具有数据可得性的超高吞吐量(将买卖吞吐量增加 1000 倍)。
即便有了根底的无状况履行,用户也能够经过将一个合约的状况证明作为买卖数据发送到另一个合约,然后完成跨分片合约调用。合约也能够完成自己的相似收据的功能(合约状况根中的收据就像区块头中的收据字段相同可验证)。开发者体验不是很好,由于协议不会供给任何协助。可是现有的 phase 2 提议好像缺少实际的功能来促进跨分片合约交互(这些费事都留给了 dApp 开发者,他们有必要完成从不同分片中获取收据的逻辑,保证收据没有双花等等)。因而,就开发者体验而言,根底的 phase 1 无状况履行听起来没有比 “简略的” phase 2 构想糟糕许多。根底的无状况履行也足以完成信标链上的 BETH 和主链上的 ETH 之间的双向锚定。
Phase 2 提议与咱们这儿的提议的最大区别在于,Phase 2 的目标是扩展合约的 storage。可是存储,以及相应而来的富状况履行(stateful execution),同样好像便是大多数复杂性的来源,也正是使咱们无望在 Phase1 引进履行的原因。
视野开拓
七月十四日冲入巴士底犹狱又洗劫了市政厅的巴黎群众,几乎全是落脚城的居民。史学家路德Geoge Rude)详细审阅逮捕记录之后指出,“烧毁围墙的那群男男女女主要都是住在首都市:郊的平民百姓”大的落脚城市当中的核换句话说,就是巴黎最核心居民,也就是那群仍未与乡村断绝关系且记录显示大部分都没有职业的居民。这些乡下移民正是所谓的无马裤汉(Sasculottes:法国大革命期间劳动阶级的激进分子,因为这些贫民不像贵族一样穿着时髦的马裤,而出现这样的称呼;)因此,法国大革命最主要就是一场落脚城市的起义。在接下来的几个月里,法国大革命仍然持续是落脚城市的重大事件“在革命初期,巴黎群众推动着革命运动前进,”一名观察家指出,“其中的抗议人群中有一大部分都来自刚从乡下移入城市的流动人口。”这些无马裤汉后来在1793年把雅各布宾党送上权力的宝座,也进一步强化了革命的效果; 不过,乡村移民虽是法国大革命的催化剂,却无从享受革命带来的果实,在往后十五年影响深远的动荡当中,革命运动完全没有采取任何措施以改善乡村移民的生活条件与社会地位造成反效果的措施倒是不少,例如固定面包价格),也没有改善他们聚居地区的本质及空间规划。恰恰相反的是,法国大革命却把注意力集中在如何让农民待在乡村,并且确保他们不会改变自己的农民身份。-《落脚城市》