以太坊上的诸多进展

本文的目的是集中介绍以太坊网络的研究和实践进展,展现以太坊生态参与者此刻的想象力

本文的目的,是集中介绍以太坊网络在不同方向上的研究和实践进展,展现以太坊生态参与者此刻的想象力之所投射。因此,此处的 “进展” 不仅限于在协议层的改进,也包括在应用上的努力。

一. 以太坊 1.x

在以太坊 2.0 路线图刚刚公布的时候,不少关心以太坊的人都有一个疑问,如果大家的重心都放在以太坊 2.0 上,那这条 PoW 链怎么办呢?谁来维护呢?

早在 2018 年 Devcon4 期间,就有开发者已经意识到了这个问题。当时备选的有两种方向:1)对 PoW 链仅做基本的维护,放弃大的更新;2)坚持对 PoW 链推进重大变革,把 2.0 的研究及开发交给别的团队。后者就是所谓的 “以太坊 1.x” 方向。这个方向是有其道理的,因为以太坊 2.0 的发布时间并不确定,在发布以前,仍必须保证 PoW 的链的长期可持续发展。后来,有更多人接受了以太坊 1.x 方向,这个路线也就确定下来。

基本上,以太坊 1.x 是希望解决以太坊 PoW 链面临的一些根本性问题。其中一个就是众所周知的 “状态爆炸问题”。

在以太坊协议的运行中,哪个账户有多少钱、合约里面存储的数据,都会不断更新,也会不断有新合约产生。这些内容(账户余额、合约代码、合约存储内容)我们称为“状态”,它们是以太坊区块链处理一些区块后的结果,表示处理完区块后该时刻的以太坊网络全局状态,也必然随新区块的产生而不断更新。为实现快速的区块验证(也是区块执行,因为验证的方式就是把所有交易重新执行一遍),节点本地会把关于状态的数据(简称“状态数据”)专门保存起来,并随着区块的产生而不断更新。那么,从理论上来说,这部分数据的体量会随着账户数量的增加而不断上升,而且,每次访问的状态及输出的状态的存储位置都是不确定的。

状态数据爆发式增长会带来两个问题:1)因为访问及输出的状态的存储位置不确定,就会使运行以太坊客户端的节点产生大量的硬盘随机读写需求(这就是为什么需要用固态硬盘来运行以太坊客户端),而且这部分需求会越来越高,不断提高参与验证以太坊网络的硬件成本,造成网络节点数量的减少及集中化;2)使得新节点加入网络变得越来越难,因为新节点在刚加入网络时需要向其它节点请求的状态数据会变得越来越多。

而以太坊 1.x 的解决思路就是 “无状态以太坊”,让验证交易所需的状态证明(叫做 “witness”)随区块一起传播。收到交易及 witness 的节点可以通过本地储存的状态根(以太坊状态是用默克尔-帕特里夏树来表达的,所谓状态根就是默克尔树的根值,是一个哈希值)来校验 witness 的有效性,并进一步检验交易的有效性。如此一来,节点就不用在本地大量访问状态数据并写入状态数据(这就是为什么它叫做 “无状态”)。

无状态模式有很多好处,首先是因为交易本身整合了验证交易所需的数据,验证交易会变得更快,能提高节点的处理速度;其次,无状态模式下,数据本身被拆解了,那么一些客户端就可以根据自己的数据需求做定向的优化,比如可以有仅提供 DeFi 应用的交易及 witness 的节点。

虽然听起来有这么多好处,在实践中它会遭遇很大的一个问题,就是它需要额外的带宽。在当前的实际运行中,以太坊区块的平均数据量大小是 20 多 KB。但是,目前的研究表明,即使我们对以太坊状态树的实现作一些改进,无状态客户端所需的 witness 大小仍然在 0.5MB 左右。对当前的以太坊网络来说,负担太大了。见证数据大小是无状态模式要克服的首要调整,如果大小降不下来,就几乎不可能实行。

不过,好消息是,无状态以太坊的研究(算是)已经产生出了一个成果,就是 Beam 同步方式。Beam 借鉴了 Fast 同步方法和无状态模式的优点,下载到最新区块之后便开始一边请求验证交易所需的状态数据,一边在本地尝试恢复完整的状态。这种方法对硬件有一定要求,而且当前实现的效果还不稳定。但是运行良好的情况下,能在下载完区块头数据后几分钟内转入完全验证模式,也是一大突破。

无状态以太坊的思虑是很深远的,要解决的问题也是根本性的,涉及到 PoW 链的长期稳定性。即使它当前不可行,这一方向的研究也会为以太坊协议的改进提供许多灵感。

参考文献:

  • 以太坊无状态客户端初探
  • 无状态以太坊:二进制状态树实验
  • Beam Sync:同步以太坊节点的新方法

二. Layer-2 扩展方案

Layer-2 扩展方案的提法也是由来已久。大概在 2017 年就有人提出这个概念了。所谓 Layer-2,就是把交易的执行放在链下,即不是由运行以太坊客户端的节点来执行,由另一些计算机来执行。比特币网络上的闪电网络,就是著名的 Layer-2 方案。

使用 Layer-2 方案的用意在于提高吞吐量:如果交易的执行不放在区块链上,自然就能组织多群计算机为无相关的交易做并行的执行(支付就是这样一种大多数时候都可以并行的场景),仅在资金需要用于与 Layer-1 的合约和用户交互时才让底层区块链来结算 Layer-2 上资金的状态并执行交易。

那么,作为一个大家已经提了一段时间的概念,是什么让 Layer-2 在去年年末出现观念上的爆发并获得新的关注?因为大家提出了一个比此前更为实用的架构。

Layer-2 的概念本身只提到了计算(执行)应该在链下进行,但没有提到 Layer-2 交易的原始数据应该放在哪里,用户应当如何维护并获取自己账户的最新状态;这也正是 Layer-2 方案的设计空间。此前的方案为了减轻 Layer-1 的存储负担,在链上是不存储 Layer-2 交易数据的,有些只定期在链上存储 Layer-2 状态的状态根(如某些 Plasma 方案),有些是什么都不存(如大部分状态通道方案)。

但是问题来了。当用户的资金从 Layer-2 退出到 Layer-1 的时候,可能会发生争议,比如我觉得我的账户里应该还有 10 块钱,但怎么取款只取出了 5 块,那我要怎么证明我的账户里实际上有 10 块钱呢。要求用户来保存相关的数据并在此时提交,首先用户体验就很差,其次还未必能获得良好的证明效果。

于是有开发者在这个点上迈出了大胆的一步:把交易数据直接发布到 Layer-1 上。因为数据是编码过的,体积不是太大的问题。这就转变了 Layer-2 的范式:要么交易数据有问题,要么交易数据没问题,那么依据一定状态转换规则得到的结果自然就没有争议。这就是 Rollup 方案的核心。

在此基础上,我们所听到的不同 Rollup 方案,其区别在于保证状态转换正确性(correctness)的方式不同,比如所谓的 ZK-Rollup,是使用密码学证明系统(主要是零知识证明技术)来做计算完整性(computational integrity)的证明,简言之,如果相关证据能通过验证,就证明计算一定按照相关流程执行了。而比如 Optimistic-Rollup,则是使用经济激励和挑战期的方案来保证上链数据的有效性:如果你觉得另一个运营者提出的 rollup 区块中含有无效交易,就存入押金发起挑战。

综上,Rollup 的概念为 Layer-2 的发展再添一把新柴,有望为以太坊网络解决可扩展性问题提供强大的助力。虽然一个新概念并不能解决所有问题,工程问题远比概念的推导更复杂(这是我们所有人都应具有的基本认识),比如,Rollup 方案也要面临用户取款的时候到账时延问题,因此需要流动性供应商。但 Rollup 方案确实是吸收了前人的教训,显现出不错的前景。

ZK-Rollup 已经有上线的案例,就是使用 Loopring zk-Rollup 方案的 WeDEX 去中心化交易所;此外,Starkware 也在这个领域耕耘。Optimistic Rollup 的代表则有 Fuel,这是一个致力于稳定币支付的侧链项目。Rollup 概念的提出者 John Adler 也在这个项目里。

 

三. DeFi

DeFi 应用正变得越来越复杂,在我看来这是一个好事。一开始(包括到现在也是)DeFi 的主要应用就是借贷,在这里我主要提的就是 Compound(MakerDAO 和 DAI 实际上要更复杂一些,不是借贷二字能简单概括的,虽然其形式也是借贷)。后来延伸到了保证金交易,即杠杆交易,先行者应属 dYdX。现在很多去中心化交易所都有保证金交易功能了,包括 DDEX。

现在已经出现了合成资产交易功能,即非实物结算的衍生品交易。比如在 Synthetix 平台上,可以合成比特币价格的衍生品。甚至现在还有一种有趣的操作,你可以拿自己的 ETH 中的一部分换成 DAI ,存入 Uniswap 成为流动性提供者,获得 Uniswap 的手续费收益,另一部分拿到保证金交易平台上两倍看多 ETH,这样就既不会错过 ETH 的涨价收益(当然也会面临 ETH 的跌价损失),又能得到一些手续费收益。DeFiZap 就提供这样的复合式操作,免去了用户自主操作的麻烦。

这些新出现的产品,有一些是独出心裁的,比如 Synthetix,在其系统中,所有合成资产的用户都是其他用户的对手方;另一些则一再印证了 “可组合性” 的存在,比如 DeFiZap。不论如何,它们都展现了 DeFi 的生命力,而且丝毫没有减弱的势头。

在 3 月 12 号的 ETH 价格大跌中,链上清算压力极大,也出些了一些不尽如人意的情形,有一些朋友觉得有些幻灭,但我丝毫不这么觉得。出现挫折是必然的,因为无论产品设计还是工程,永远没有完美无缺的东西。永远有一些东西是必须在现实中经受压力测试才能发现的。现在并没有暴露出哪个问题是不可解决的,反而,它暴露出来的是,DeFi 已经成长了很多 —— 原来根本没有那么多清算需求,而现在已经有了。

 

四. 改善使用体验的应用和技术

以太坊生态很早就开始关注区块链的用户体验问题了。所谓的用户体验,总结起来就是入门用户刚上手以太坊时候的都会问出的问题:什么是 Gas?丢了助记词,钱就找不回来了,这么坑的吗?

关于第一个问题,现在已经有了一种叫做 “元交易(meta-transaction)” 的技术:用户先对一个有效的交易数据签名并将其发送给一个中继者,由中继者确认数据的有效性后作为实际交易发送者发出交易,该交易会触发一系列的合约操作,完成用户的交易目的并为中继者支付。在这个过程中,Gas 的实际支付者是中继者,因此,只要用户和中继者达成一致意见,用户就可以不用 ETH 来支付,甚至可以不用付费(也就是中继者或者 dApp 自己补贴了用户)。

关于第二个问题,一种解决思路是,这个问题本质上是由以太坊协议带来的,协议层的账户体系不支持用户使用比助记词和私钥更复杂的方式来管理自己的地址和资金。但是,智能合约的表达可能性是没有这些限制的。因此,用户可以使用一个自己能控制的智能合约来管理资金,这个智能合约可以支持一些预先定义的方案来更替该智能合约的控制权,这样,就可以支持比如社交恢复方案了(让多个你信任的人用地址可以集体帮助你更换合约的控制权,这样就算你丢了手机或者私钥,还是可以恢复对该合约和资金的控制权,换个地址就行)。

此外,另一个大家早已熟知的用户体验改进方案是 ENS,可以帮助用户用可读的 .eth 地址来表示自己的地址。这样转账时就不用瞪大眼睛不断比较收账地址了,输入那个 .eth 地址就可以了(ENS 也有别的后缀)。

这些方法,最近都集中在一种应用上爆发了:智能合约型钱包。用户用智能合约来管理自己的资金,该智能合约可以有 ENS 地址,也往往直接集成了元交易功能,甚至支持社交恢复、每日转账限额这样的高级功能。现在智能合约钱包领域风头正劲的项目有两个:Argent 和 Authereum。

 

五. 以太坊 2.0

以太坊 2.0 可能是大家最关注的领域,但可能也是信息最不普及的一个话题。这一方面是因为以太坊 2.0 本身比较复杂,它不像上面提到的比如 DeFi 那么切身可感,易于理解其中的逻辑。另一方面是因为许多设计也还没有完成,没有定论。

以太坊 2.0 的主体有两部分:权益证明共识机制 + 分片;主要分成 3 个阶段来部署:Phase 0(第一阶段,因为程序员数数都从 0 开始数)的部署目标是信标链,就是用 PoS 机制来运行的链,这条链也是以太坊 2.0 的核心,因为涉及到向全网提供随机性(相应关联着分片安全性)和分片间交互的任务。信标链本身不是用来执行交易的,所以它并不像以太坊 PoW 链具备用户转账、运行合约的功能。

Phase 1 的部署目标是分片链。即有关分片的各种设计开始部署, PoS 共识机制的参与者(“验证者”)开始要被分配到不同分片上出块并把分片的一些信息(“crosslink”)提交到信标链上。但是,在此阶段,分片仍不能执行交易,所以分片链上的区块只是一些单纯的数据,没有什么意义。这个阶段更像是在测试网络能不能满足分片的带宽需求。

Phase 2 是为分片链添加执行引擎。到了 Phase 2 阶段,分片就具有了执行交易的功能,到时候就可以像现在的以太坊一样部署合约了。做分片,是为了并行化处理交易,提高以太坊的交易处理吞吐量。

根据这个分阶段部署的路线图,可知网上流传着许多对以太坊 2.0 的误解:

(1)“以太坊 2.0 今年就要上线了”,这种说法是不够准确的。因为计划在今年部署的是 Phase 0,即信标链阶段,乐观估计会在今年夏季末上线。信标链上线之后,用户就可以在 PoW 链的保证金合约内存入 32 ETH 然后成为信标链上的验证者了。但是,这并不意味着以太坊 2.0 已经全面部署了。所以,说 “以太坊的 PoS 阶段将从信标链上线开始”,是没有问题的,但说 “这就意味着以太坊 2.0 完成了” 则是错误的。

(2)“以太坊 PoS 来了之后,矿机就不能再挖矿了” 也是误会。如上所述,信标链本身并无执行交易的功能,不可能一上线就完全取代 PoW 链。PoW 链和信标链会共存很长一段时间,并不是 PoS 一推出就完全废弃掉 PoW 链。两者的共存至少要等到 Phase 2 上线之后才会终止(如果分阶段部署的路线图以及各阶段的内容都无改动的话)。而 Phase 2 的推出时间,虽然没有明确的时间表,但在 Phase 0 上线之后乐观估计也要两年。

(3)以太坊 2.0 完全部署之后,Eth1 也会合并到 Eth2 系统中,可能的方式是变成 Eth2.0 中的一个分片,其已有的状态也会完全迁移过去。但具体怎么做,我没有深入了解。

那么,关于即将到来的信标链,还有哪些细节是希望参与的人需要了解的呢?

(1)迄今为止,关于 PoW 链与信标链的连接方式,主流意见还是单向链桥,即用户可通过在 PoW 链的保证金合约内存入 32 ETH 来获得信标链上的验证者资格和信标链 ETH(BETH),但在 BETH 不能发回到 PoW 链上来;

(2)在目前的设计中,BETH 持有者之间也是不能相互转账的,因为信标链没有执行交易的功能。但是这个功能可能在信标链稳定运行一段时间后加上,与后续的部署没有很强的先后依赖关系。

(3)如果你想自己运营验证者,那么除了存入 32ETH,你还需要一台能运行验证者客户端软件的电脑和稳定的网络连接(单台电脑可运行多个验证者客户端),还需要找到一个节点来为你提供必要的信息,否则就不能参与共识了,当然你也可以自己搭建信标链节点。运行验证者客户端的硬件要求并不高,但运行信标链节点的硬件要求会高一些。显然,到时候也会出现质押服务的提供商,但受以太坊协议本身的限制,这种质押服务应该做不到完全免信任,因此,你需要好好选择提供商。

这里要额外提一下的是,有些朋友可能混淆了验证者和信标链节点的概念。信标链节点是参与网络的基本单位,验证者是参与共识的基本单位。验证就像矿工,并不一定要自己部署节点,但一定要依靠节点才能参与共识;另一方面,节点部署者也不一定是验证者。从网络的去中心化角度看,不仅要关心验证者客户端的硬件需求,信标链节点的硬件需求其实更加关键。

(4)在充当验证者时,不仅有账户余额的概念,还有一个 “有效余额” 的概念。前者是你的账户里有多少 BETH,后者是你在参与共识时的权益权重(决定你所遭受的奖惩力度),它是有上限的,就是 32BETH。随着你在信标链上接受奖励和惩罚,你的余额会变动,有效余额也会跟着变动(在有效余额上升时会有一些滞后性),然而一旦有效余额达到 32ETH ,它就不会继续上升了。你的余额可能是 100 BETH,但你参与共识时,你所投出的票仍记为 32BETH 的权重。这就决定了,以太坊的 PoS 像是一个发放单利的系统,而不是一个发放复利的系统。

最后,关于分片,我得承认,我并不了解这个概念的全部内涵及其设计空间。在我看来,分片似乎是说,由不同群组的验证者并行地对一些交易达成共识,同时又要保证,这些分别只经过一些验证者共识的状态、并没有固定保存位置的状态,彼此之间是可以沟通的。因此,“跨分片通信” 才是真正的难题。

以我们现有的认识来看,可以把区块链当成一种追踪状态变更的方法,其关键是保证区块内容的可验证。对于以太坊协议而言,只要交易所改动的状态是由参与验证交易的人所共享的(或者说,只要想参与验证的人能获得交易所基于的状态),区块就是可验证的。甚至于,参与验证交易的人不断替换(如同在以太坊 2.0 设想中的 “验证者不断被分配到不同分片上”),也没有问题,因为无状态性(statelessness)可以让交易自身携带自己所改变的状态。在这一点上,我们即使算不上有经验,起码是能够想象的。真正难以想象的问题在于:如果各分片是并行运行的,这就意味着各分片的运行是异步的(如果我们想保留可扩展性的话),那么,怎么使得当 A 分片使用了 B 分片的状态并输出了结果时,让 B 分片的状态也随之改动呢?发生在 A 分片的交易想使用 B 分片的状态似乎并没有问题,仍是可验证的,但如何在执行完之后立即改变 B 分片的状态呢,如果处理该交易的验证者们并没有办法告诉大家 B 分片的状态已经被改变了?换种问法,B 分片上的验证者怎么知道不在 B 分片的状态变更历史中的某笔交易要求改变 B 分片的状态呢?(光靠跟踪状态根的变化似乎不行)(在可想象的情形中,似乎都要求某个各分片都必须同步的分片存在,即,该分片本身成了事实上的 Layer-1,而其它分片成了事实上的 Layer-2)。

去年末,分片领域的研究取得了不少成果,研究人员已经成功把研究的重点凝聚为两个关键问题:(1)因为验证者需要在不同分片间混洗,要求他们在短时间内下载分片交易历史、得出该分片的最新状态,是不现实的,也会破坏可扩展性;因此,分片要求无状态性;但这种无状态性也使得在发起交易时,必须有人能为这些交易提供 witness,这就是中继者网络问题;(2)在用户发起交易时,如何保证交易处理和手续费支付的原子性?这个问题勾连着 “分片如何分” 以及 “跨分片交易(支付)” 怎么做的问题。这就是手续费市场问题。

这两个问题已经很精准了,但我也仍然期待更好的问题定义。好的问题,才有好的答案。

申明:本站所发布文章仅代表个人观点,不代表链嗅网立场。

提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据