以太坊扩容终极解决方案 - Danksharding与 MEV设计(二)
总览
相比于Sharding1.0 我们看到了Danksharding(DS)的极大进展,而Proto-danksharding 则是一种中间解决方案,相比于完整的Danksharding, Proto-dankshardinf(PDS)的功能特性被缩减了,同时PDS中节点仍然需要下载全部数据,所以无需数据采样,也并不是真正意义上分片解决方案(分片解决方案中,所有的节点并不需要下载全部数据,进行验证)。如果说PDS将一个区块中保存的数据量增加了一个数量级,那么DS在此基础上又增加了另一个数量级。
PDS (EIP-4884)
PDS是实施DS过程中必要的一种前向兼容的过渡解决步骤,致力于在上海硬分叉时提供数量级的扩展方案。Rollups将数据上传至以太坊L1,以太坊可以理解为Rollups的轻节点,而Rollups利用L1的调用数据(calldata) 在链上进行永久存储。而对于数据采样来说,Rollups只需要保证数据在某段时间可见,从而可以让别人有足够时间下载就可以了。所以EIP-4844引入了和调用数据不一样的一种交易格式,带有数据碎片的交易,从而进行存储。数据碎片可以承载125KB的数据,同时在和同等数据量的调用数据相比,便宜很多。这些数据碎片通常在一个月之后会被删除,从而降低了存储要求。而这一个月的时间足够让验证者去完成数据采样中的安全假设。
目前以太坊的区块带宽为90KB(其中调用数据 占到10KB),而PDS机制下的碎片数据在一个月之后会被清理掉,所以区块带宽大大提升了,目标值在1MB,最大值为2MB (EIP1559机制下区块大小为弹性的,最大化值为目标值的2倍)。1MB是怎么计算得来的呢?数据碎片的字段元素为4096,而每个字段元素为32字节(bytes), PD中每个区块最多有16个区块碎片,而在DS中这个数字为256个(上篇我们介绍过)。所以PDS中最大数据可见带宽为=4096*32*16=2MB,目标值为2/2=1MB。DS中的最大数据可见带宽为=4096*32*256=32MB,目标值为32/16= 16MB。所以如果说PDS将一个区块中保存的数据量增加了一个数量级,那么DS在此基础上又增加了另一个数量级。而PDS需要节点下载全部数据,所以本质上并不是分片,而DS则将数据碎片分配给到不同的验证节点。
上这些新的数据格式并不会给执行端带来额外要求,而EVM只会查看附加到这些数据碎片上的承诺。EIP4844中,执行层也会前向兼容至DS中的执行层,所以在PDS到DS的升级过程中,我们只需要进行共识层的变动。PDS中所有的数据都需要被下载,所以无需数据样本采样以及编码处理至信标链的区块Body, 而数据内容则以“sidecar”形式分别传输到不同区块。
除此以外,我们利用KZG承诺去验证数据是否被正确使用删除码技术,KZG本身是48字节。而EIP4844则使用了其哈希版本(0x01字节+ KZG中SHA256哈希中的最后31个字节组合而成)的32字节的格式。这主要是为了方便EVM兼容(32字节)和之后将KZG转换到其他技术(32字节)。
多维度的EIP1559
在Sharding1.0中,由于分片数据是单独确认的,所以数据市场相对分散,而这个问题在DS中得到了解决。所有的数据碎片拥有自己的费率市场,包括浮动的燃料费用和限制。比如如果以太坊上某时间内有NFT的售卖活动,那么只会对于rollups的交易结算费用有影响,而Rollups 数据成本不会改变(这里我认为应该是上传L1数据的费用,以及存储和带宽等成本,和Rollups在L1上的交易结算费用为独立概念)。
在以太坊DS设计中,我们看到数据碎片的费用是根据EIP1559进行调节的浮动费率。而在这个市场中,计算和数据可见的拍卖是同时进行的,大大提升了资源定价效率。我们之前介绍过,其实Rollups自身也采取了一些方式压缩数据,带宽存储成本下降,上传成本也会大大减少。比如Zk-rollups 相比Optimistic rollups而言,他们的压缩效率更高,所以成本会大大降低;同时我们也将在下文介绍,当以太坊扩展其数据可见协议(DA) 的时候,发布证明的摊销成本会占据整个成本的更大份额(尤其对于ZK-rollups来说),所以这部分成本不受到L1上经济活动的影响。当然这领域有些有趣的设计方向值得期待,比如将目前燃料和碎片定价机制从线性EIP1559变为指数级EIP1559的机制,优化相应数值。
成本和状态管理
历史数据通常用硬盘存储,因为一般历史数据无需快速获得。而存储是基于1/N诚实假设,只要有一个诚实机构存储相应数据就可以获得数据。
状态一般指账户余额,智能合约等。全节点需要状态信息才能验证相应交易。而用RAM存储,虽然数据传输快,但是成本高, 用硬盘存储,数据传输很慢,所以我们通常采用中间解决方案SSD(闪存),速度较快,也能存储一定数据量。通常情况下,对于高吞吐量的区块链来说,其状态增长是非常惊人的,所以如果对于个人用户而言,如果没无法承载这些数据,那么对于网络的去中心化实现是非常困难的,这就是著名的State Bloat问题,也就是为什么以太坊要自我设限,比如通过区块大小,燃料限制等限制状态增长,但这又给扩展性带来了瓶颈。
调用数据降低成本方案(EIP-4488)
相较于PDS来说,我们有一个更加快速的紧急解决方案EIP-4488。但是,他和最终的DS方案还是有一定出入,所以在向DS的转变过程进程中还是会有比较大的变动。EIP-4488相较于PDS的实施会很快,仅仅是几行代码的变动。
EIP-4488主要有两部分
1)调用数据成本从16燃料/byte下降到3燃料/byte
2) 每个区块增加1MB的限制,同时每笔交易增加300bytes(总上限在1.4MB)
EIP-4488的实施,会增加以太坊的平均数据容量,而最差情况下的数据容量会有所下降,这主要是因为区块1MB的限制,如果不加限制,那么调用数据成本下降后,单个区块的容量会达到18MB,大大超出以太坊现在可以处理的90KB的容量。
当然相比于PDS来说,EIP4488还是有一定不足的,EIP-4488仍然采用的是调用数据,而非PDS下的新型数据交易结构,同时数据碎片在1个月后也会被删除。在EIP-4488下,历史数据还是会快速增长(更高的平均数据容量), 所以我们需要同样的删除机制,以减缓历史数据的增长,那就是EIP4444 (不过删除机制在1年后才启动)。
将历史数据绑定在执行客户端- EIP-4444
EIP4444允许客户端将包含区块头,区块身体,收据等的超过1年的历史数据进行修剪。所以客户端也会停止在P2P层针对这些数据的相应服务,并且会减少用户的硬盘存储要求。同时在EIP4488实施后,这个方案尤为重要,通过将过期历史数据清除的方法限制历史数据的增长。当然这个方案的具体实施时间还未确定。
同样的,历史数据通常只有在完全同步的时候需要,而验证时候也并不需要,所以我们将引入一个轻量级同步策略,可以减少网络带宽使用量。同时,历史数据只有在明确通过JSON-RPC提交请求,或者当用户提交同步请求的时候,才会被恢复。所以在EIP-4444下,我们需要一个更好的解决方案。
这里客户端将无法像现在一样使用 devp2p 进行“完全同步”——他们将作为创世区块的弱主观性检查点“检查点同步”。我们需要弱主观性检查点同步主要是考虑到远程攻击的可能。这里的假设是客户端不会从无效的或者过期的弱主观性检查点同步,这个检查点必须在我们开始修建历史数据的时间段内进行(一年内),否则P2P层将无法提供所需数据。
恢复历史数据
当然这些数据被修建后(EIP-4444 1年后,PDS1个月后),这些数据去了哪里?以太坊的工作量需要减轻,存储历史数据的任务不应该由以太坊主链承担,缺少历史数据会对一些应用产生影响,而对以太坊链并不会。所以我们希望在一些第三方的帮助下,比如志愿者,比如一些区块浏览器(Etherscan.io), 数据索引协议The Graph, RPC服务网络Portal Network,特定应用(Rollups)等,实现历史数据的存储。
弱无状态
上文已经说过了,以太坊的State Bloat问题主要是由于以太坊自身对于状态增长的限制,因而对于TPS,扩展性产生了影响,状态限制主要是考虑到验证者的容量和资源限制。
全节点需要状态信息,才能够验证相应数据。因而以太坊考虑采用弱无状态”Weak Statelessness” ,这意味着验证节点验证区块时,不再需要状态信息,所以对于验证者来说,只要给到其完整单独的区块,他就能验证。而对于PBS下的区块创建者来说,创建区块时则需要状态信息,这成功地将部分验证节点的工作转移给了中心化的,高资源消耗的区块创建者。所以节点验证区块时,无需要整个状态信息,只需要交易带来影响的状态信息,而创建者需要将这些受到影响的状态信息以及准确性证明添加至区块。所以整个过程中,创建者将见证数据信息和准确性证明添加到区块之后,验证者收到区块,执行,验证。
所以对于验证者而言,无需再将大量的状态数据通过SSD存储,而这个也是以太坊扩展性瓶颈的关键;同时需要下载一些见证数据以及证明,所以带宽要求提高一些;尽管验证者仍然需要执行交易,但目前对于扩展性来说不会有影响。而对于以太坊协议来说,State bloat得到了缓解,区块限制/燃料限制提高了3倍。所以当数据可见层(DA) 扩展后,我们发现提交证明的成本占据了所有Rollups成本的更大比重(特别对于ZK-rollups来说)。
沃克尔树 (Verkle Trees)
目前以太坊将默尔克树用于状态,但是默克尔证明对于以上的弱无状态的实现来说太大了。所以以太坊选择了一种更有效的证明方法,沃克尔树。
上文提到过,默克尔树是一种有效的数据可见证明,在无需下载全部数据的情况下可以用于证明包含某些交易, 当然还得配合着欺诈证明来使用。比如当你从区块头信息中获得默克尔根H₁₂₃₄₅₆₇₈后,轻节点为了证明包含H₄,其需要在默克尔证明中输入H₁₂,H₃, H₅₆₇₈,因而向全节点获取这些哈希值,并且沿着树结构将他们哈希在一起。所以如果得到的数据的确为默克尔根H₁₂₃₄₅₆₇₈,那么我们就证明了包含H₄的交易。
一个理想的树形状也应该较浅较宽。而较深较窄的树,当你沿着树哈希时,需要的哈希值也会很多。但是较浅较宽的树,每个节点你也需要增加更多的孩子节点,让其变得更宽。但是你需要收到这些孩子节点的哈希,并且将他们哈希在一起,才能最终得到根数据。这样的默尔克证明是非常大的。所以我们采用了一种更有效的向量承诺。在无需获得所有这些孩子哈希的情况下验证,本质上是通过减少需要获取的信息,而获得有效的证明大小。沃科尔树和默克尔树相类似,但是其通过向量证明而非简单哈希,对孩子节点承诺。虽然每个节点有很多的孩子,但是我无需所有的孩子去验证证明。他是一个固定大小证明,和宽度无关。
实际上KZG承诺也可以被用于向量承诺。以太坊最初是准备采用他们的,目前他们采用了一种类似的方案,Pedersen 承诺解决这个问题。这个承诺将会基于椭圆曲线,而其可以承诺256个值(默克尔树下的哈希本质上也是向量承诺,不过他们只能承诺2个值)。
最后要提的一点是,因为考虑到实际因素,证明者需要计算证明,而如果树太宽,那么难度会越大,所以尽管一个深度为1,尽可能宽的树对于验证者来说是极其紧凑的有效证明,但我们并不会这么做。
状态过期
尽管弱无状态一定程度上缓解了State Bloat的限制,但是状态仍然存在。状态增长问题仍然严峻。所以我们引入了状态过期的机制,一段时间(1-2年)不活跃的状态将会从区块创建者中剔除出去。和历史数据类似,如果你需要复活这些过期的状态,你可以呈现这些证明并且再次激活他,这个长期也是基于1/N诚实假设,只要有人有全部数据,那么你就可以从他们那里获得。当然弱无状态从一定程度来讲削弱了状态过期的即时需求,但从长期来看,状态过期对于很多高吞吐量的L2是一个更为有用的工具,尤其当状态数量级增长,拖累了高性能的创建者的时候。
MEV设计
我们之前出过一篇MEV专题,有兴趣的朋友可以去看下。这里我们主要针对一些以太坊社区探索的方案,主要包括减少MEV的危害(单时隙确认,单秘密领导选举),民主化MEV(促进MEV,MEV平滑,PBS)。在合并之后,我们会确保MEV的价值被合理,容易的分配给不同的验证者,确保不会出现集中化的验证节点问题(当遇到聪明的搜索者,验证节点会集中起来与之竞争,这就是我们在POW中看到的几大矿池合作的原因,Oligopolgy寡占的市场)。在合并后,验证者的质押奖励将会被削弱(逐年递减,低于通胀),而MEV将成为他们最重要的收入来源。
在POW中,MEV 搜索者将不同交易进行捆绑,并且提交竞价,通过Flashbots提交给矿池,矿池运营者聚合整个区块并且将区块头移交给矿工。矿工利用POW验证,根据分叉选择规则赋予其权重。合并后,矿池这个角色将会消失,很多相关的利益既得者也会大失所望。所以最近以太坊的大跌很大一部分也来自于矿工的抛售。而MEV价值会以更公平的方式分配给不同验证节点。而矿池的角色将由一个更特别的创建者担任。相较于一些矿工,对冲基金而言,很多验证节点并不知道如何捕获MEV价值,所以会出现验证节点集中化的问题,延伸到验证节点与搜索者的合作或者竞争,所以我们需要引入一些设计,保证MEV可以公平地分发给质节点。
促进MEV
由于合并时,协议内PBS机制仍不能上线,Flashbot提出了促进MEV(MEV Boost)的过渡解决方案,或者你可以理解为协议外PBS机制(Out of protocol Proposer Builder Separation)。
验证节点的执行端会默认收到内存池中的交易,之后将他们打包发送到共识端,并且广播至网络。但对于大部分验证节点来说,并不知道如何获取MEV价值。所以Flashbot提供了促进MEV的解决方案。促进MEV会嵌入到共识端,将区块创建的过程外包出去,同时仍然享有执行端的使用权。
MEV搜索者负责发现各种套利机会,套利,三明治攻击,清算等,并通过竞价的形式将交易提交,创建者聚合所有的交易捆绑,以及一些私人交易,放入区块,然后将区块头通过中继节点(促进MEV)给到验证者。Flashbot就是通过促进MEV扮演了中继节点的角色,而创建者也计划能够更为去中心化 (在POW中,创建者的角色矿工池,寡占了整个市场,所以在合并后,通过各种设计,避免这些问题,上文提到的放审查交易列表就是其中一种方案。
同时,促进MEV 设计中需要验证节点信任中继节点,共识节点获取区块头,签名之后,区块身体才会展现出来。而中继节点则负责向提议者展示这个区块身体是有效的。所以验证节点无需直接信任创建者。所以该设计在明确了不同角色的分工外,还希望解决创建者的中心化问题,以及提议者对于创建者的信任问题。
社区驱动的MEV平滑
PBS机制下也催生了另一个有趣的方向,社区驱动的MEV平滑。这个本质上和我们之前介绍过的Osmosis 的共同提议有异曲同工之妙。获取MEV能力会让验证节点更为中心化,同时MEV的分发也是。每个区块的MEV奖励高可变性会让很多验证节点随着时间推移平滑你的回报(这个在POW的矿池中会见到)。
默认设置就是区块提议者才会从创建者那里收到钱。而MEV平滑则将这些费用分发给更多的验证节点。验证节点委员会会参与审核提议的区块并且验证其是否为竞价最高的区块。如果没问题,区块通过,那么收益会分给验证节点委员会和验证节点。
这个同时也解决了另一个问题带外贿赂。这些提议者经常会收到激励贿赂,提交非组竞价最高区块,而将费用隐藏,并不给到质押者。这个问题在POW中也存在,矿池和对冲基金进行私下交易,获取价值。POS, 创建者和提议者是两个角色(Builder 和Proposer, 而在POW中,创建者和提议者都是矿池)。而在OSMOSIS设计中,我们也介绍过共同提议(Joint Proposal),每个验证者都可以在他们的投票中添加交易,而下一个提议者可以将这些交易添加至区块,当然会有重叠的交易,但是仍然可以添加,至少需要添加其他验证者的一笔交易。这防止了区块提议者的垄断性,让所有的验证者都可以参与进来。这里我们将区块者生产者和验证者分开,我们希望能够在POS实现更多这样功能划分。目前我们已经看到了小范围的分类,比如作为矿池的矿工(POW),比如作为验证节点的矿工(ETH2.0), 还有通过Flashbot的将不同交易添加至捆绑包的矿工等等,我们希望未来能实现更多劳务的划分。
单时隙确认
确认时间非常重要,如果不能得到快速确认,会引发很多问题,比如UX,比如跨链沟通,比如MEV的Reorg问题。以太坊合并后,大量验证节点参与验证每个区块,而在POW中,矿工在无需验证的情况下,在同一个高度参与竞争。这个会让reorgs的问题变得不再可能发生。但是这还不是真正意义上的确认,如果最后一个区块有MEV价值,那么你可以引诱节点去reorg链并且为自己争取利益。所以单时隙的确认解决了这个问题,如果需要回滚最后一个区块,那么至少需要1/3的验证节点参与,同时他们质押的仓位也会被slashed掉。当然这个设计在以太坊的路径图中还比较远,仍然是一个开放的设计领域。
目前的以太坊设计中,每个时隙需要1/32的节点集参与认证,(38000*1/32=12000)。而如果要将这些验证拓展到带有BLS签名集合的整个节点集,并且在一个时隙内完成,那么我们需要将大量投票压缩至一个单一验证中。
单独秘密领导选举 (SSLE)
信标链的节点清单和领导选举清单都是公开的,所以如果有人要想将你去匿名化并且匹配相应IP地址,那么问题就来了。对于一些聪明的验证节点,他们有办法去匿名自己,但是对于一些小的验证节点,他们会遭遇DDOS,而且这个问题非常容易。比如你是区块N的异议者,那么区块N+1的提议者知道了你的IP地址后,可以很便宜的DDOS,所以你无法生产区块,而它获得了两个时隙的MEV奖励。而在EIP-1559机制下,这个问题更加明显,EIP-1559采用的是弹性区块大小设计,最大区块是目标区块的两倍,所以可以将两个区块的交易放入至一个区块,区块长度变为两倍。SSLE确保全网只有提议者知道该轮到它出块了,所以避免了这种攻击。
合并后的以太坊
客户端的变化
目前在单片链上,我们只需要通过Go Ethereum, Nethermind等运行一个客户端,全节点主要负责交易的执行验证,以及POW的共识,确保其跟随了高度最高(POW) 的,累计计算量最多(Nakamoto共识)的有效链上, 而他们不会接受任何无效交易。而目前信标链只运行了共识层,并没有执行层,最终的难度将会在目前以太坊执行区块合并到信标链区块中的时候决定。
而届时,将会有两个单独的客户端,执行客户端将会负责执行,比如处理区块,维护内存池,管理同步状态等。而共识客户端将会处理POS共识,负责跟踪区块头,完成验证并且获取相关收益等。客户端获取信标链区块,执行客户端负责运行交易,共识客户端则会跟随该链完成认证。你可以混合这两种可互操作性的客户端,同时新的API引擎的设计将负责客户端间的通讯。
共识的变化
POW中Nakamoto共识中,矿工创建新区块,并且将其添加至有效的最重(heaviest)链。而之后以太坊会转移到Gasper, 通过Casper FFG (确认工具)和LMD GHOST(分叉选择规则)实现共识。而这是一种相较于之前有利于安全的链,有利于活力在线的链。有利于安全设计的共识机制,比如Tendermint,当他们无法收到足够的投票数,那么网络就会停止出块 (Terra就是一个例子)。而有利于活性在线的链会继续创建优化账本,但是没有足够的投票,就不会实现最终确认。但以太坊通过定期检查点的方式实现确认。每32个以太坊是一个单独的验证节点,而信标链上有38000个节点。每个时段有32个时隙,每个时隙有12000验证节点负责认证,分叉选择规则会根据这些验证决定链的当前负责人。每个区块每个时隙添加,12秒,那么每个时段,32个时隙就是6.4分钟(12*32/60=6.4)。而确认通常在投票后两个时段发生(也就是64个时隙,最长为95个时隙)。
总结
至此,我们对以太坊扩容的终极解决方案进行了梳理,这里有很多前沿的技术,以及开放性的设计问题,我们觉得非常有价值,所以和大家进行分享。我们也持续看好合并后以太坊的核心价值,尽管和Celesita剥离执行,Polkadot状态分片等现有解决方案相比,其仍然会以一个单独执行的状态运行,但其核心的设计理念以及对于历史/状态等数据的处理方法,还有无论是货币溢价还是经济安全方面的考虑,都值得整个行业去学习。