导言
自 2015 年创世以来,以太坊区块链已历经五个寒暑。五年的时间不只把作为一种理念的以太坊协议 1 变成实际、使这套协议变得愈加成熟、愈加详细,也使这样一套规划的特性和权衡关系露出出来。这些权衡关系,作为规划上的挑战,自然也招引了并继续招引着很多聪明才智,测验提升以太坊的可用性;其间汇聚了最多努力和想象力的,当属为进步 “可扩展性” 而提出的一系列计划。
本文想指出的是,就像以太坊范式面对着规划上的取舍,一切这些可扩展性计划也面对着取舍;而点评这些取舍的值得与不值得,需求咱们回到以太坊本身,回到以太坊节点和以太坊用户的实在问题和实在需求。而 “状况” 视角,作为了解以太坊本身的视角,正好能协助咱们澄清这些计划的规划,并提醒咱们的所得和所失。
本文将从解说 “状况” 的含义开端,提醒以太坊的终极之矛和阿喀琉斯之踵,然后探讨各种改善方向。“富状况性” 是以太坊智能合约 “可组合性” 的来历,但也是以太坊网络最大的弱点。由此,咱们能够见出现在常被人提起的哪些计划会影响 “可组合性”,哪些 “可扩展性” 的意义更明显。
以太坊作为一种范式
富状况性与可组合性
什么是 “状况”?状况便是一个体系在某一个时间的详细情形。以完结密码学钱银的区块链为例,一个区块链在某一个时间的状况便是该时间,该区块链上一切地址的财物分布(A 地址有 10 个 币,B 地址有 100 个币,等等)(究其实,咱们具有的,只不过是一些状况,是咱们的脑筋和社会一致,将这些状况解读为 “财物”)。
在此视角下,每一套区块链协议都能够粗略地分红两个部分,一部分是一致机制,另一部分是状况转化规矩(有时也被称为 “一致规矩”);前者界说了出块规矩,它指明晰一切参加该区块链的节点在什么时候需求在本地更新区块链数据库的状况(例如,作为一个以太坊区块链的节点,每逢收到一个顺便了契合难度要求的工作量证明的区块,该节点就更新本地的区块链数据库的最新状况);而状况转化规矩,则界说了什么买卖是有用的(“一个账户不能花用超出自己余额的钱”),也界说了节点在处理买卖时,应当怎样更新状况(“这笔买卖表示 A 账户转了 5 个币给 B 账户,那么 A 账户余额就减去 5,B 账户余额的加上 5”)。
对比特币来说,其一致机制是 “PoW + 中本聪一致”,而其状况转化规矩根据 UTXO。对以太坊来说,其出块机制是 “PoW + Ghost 规矩”,其状况转化规矩根据账户。
那么,到底是什么东西让以太坊变成一个有突破性的立异呢?
咱们经常听说,以太坊之所以特别,在于其 “引入了图灵完备的编程言语,支持可编程性” 等等。实际上这种说法并不精确 2。由于答应运用更杂乱的编程言语并不意味着什么,其实比特币也能够编程;答应比特币运用 solidity 编程言语并不能得到一个以太坊。以太坊真实特殊的当地在于 “富状况性(rich statefulness)”3 :它答应一个合约调用另一个合约,并且,除了区块容量本身,不对这种调用的层级数量施加任何的限制。
B 合约能够根据 A 合约揭露的代码来调用 A 合约、改动 A 合约的状况;调用 B 合约的 C 合约也能够间接地调用 A 合约、改动 A 合约的状况 …… 由此,一个状况,虽然保存在 A 合约里,但其操控逻辑,能够如此重重叠叠不断累加;假如把状况了解为财物,这等于是让财物的运用权(运用条件)能够不断得到更严格、更杂乱的操控;这意味着,从理论上来说,一个状况的更新逻辑能够无限接近于实际生活中的金融合约(由于一切的金融合约都能够经过简略的逻辑叠加、组合出来)。这种答应累加任意多层的操控的特点,才是最要害的,而怎样编程这种操控,反而是次要的。
此外,以太坊还答运用户给区块链写入状况,使这些状况成为大局状况的一部分,并要求节点依照合约自界说的逻辑来更新状况。由此,一个合约能够把本身的状况向以太坊上的一切其它账户揭露,前述的富状况性真实有了用武之地。
没错,现在咱们现已像收集龙珠那样集齐了三种特点:
(1)链上核算范式:合约能够要求节点按自己界说的逻辑来履行核算;
(2)大局状况:合约的状况能够成为大局状况的一部分,向一切其他账户揭露;
(3)富状况性:合约之间能够互相调用,且栈层数量没有限制,因而操控逻辑能够层层累加;
现在咱们能够召唤出以太坊的最强之矛了:“可组合性”(钱银乐高)!
链上核算办法使咱们能够具有各式各样的合约;大局状况让这些合约能够互相拜访互相的状况;富状况性让合约的组合办法能够无限多样。所以咱们不只能够具有安稳币 DAI,还能够具有假贷商场,还能够具有菜票运用,还能够具有把菜票的收益主动捐献的运用,还能够具有在不同的假贷商场间主动再平衡储蓄比例的运用 ……
状况数据爆炸问题
“可组合性”太美好了,以至于不像是真的,对吗?没错,上述三种特点的三位一体,实际上是一把双刃剑。
以太坊的状况转化过程能够笼统为:状况转化函数以旧的状况和事务(transaction)列表为输入,输出新的状况。这意味着,以太坊的全验证节点有必要在本地保护着以太坊区块链的最新状况,以便能履行状况函数并以成果来验证一个区块的有用性(一起 也是与其他的以太坊节点到达一致)。
对立之处在于:关于合约及开发者来说,合约的状况作为以太坊大局状况的一部分,保存在以太坊的节点上,合约的状况更新由以太坊节点来核算(并且仍是由建议核算恳求的用户来付费的),这种 “无服务器” 的架构十分舒畅;可是,这些状况只要一次付费就会永久保存在以太坊的全验证节点中,虽然每次更新都需求付费,但无法避免节点本地保存的状况数据会不断累积、胀大。
状况数据的胀大之所所以一个问题,在于它会为全验证节点带来越来越高的硬盘(随机)读写担负。状况数据不像区块数据,区块数据是静态的,持久化保存后并不需求频繁读写;但状况数据每多一个区块就要读写许屡次;而跟着状况数据量的增大,读写的担负也会越来越重。在曩昔几年中,咱们经常听到有人说以太坊的全节点难以布置,一大原因即在于此。前一段时间 Infura 的免费以太坊节点服务溃散 4,导致许多依赖 Infura 的服务溃散,算是给咱们鸣响了一个警钟 —— 本来以太坊的节点保护如此不易,让咱们甘愿挑选信任他人。
这个问题也并不简单处理。在曩昔几年中,以太坊的屡次硬分叉升级都进步了拜访状况的操作码的 Gas 消耗量,正是为了以经济价值遏止合约创建新的状况。但这明显只是治标的办法,由于底子上逻辑并没有变,状况数据要继续存留在以太坊节点处,但发明状况数据的用户只需付一次费。也有人提出,为改动这一点,需求引入某种 “状况租金” 机制,要求保存了状况的合约不断付出租金,不然就停止该合约的可用性。可是,这种机制存在难以想象的杂乱度,一方面,难以确认合理的收取租金的办法,另一方面,也难以确认合理的付出对象。所以状况租金机制的研讨在 2019 年也阻滞了 5。还有项目(如 Nervos)测验以持币量的多少来界定可用的状况空间巨细,因而状况数据的巨细将总是有上限的,这就避免了状况胀大问题,但这也改动了原生财物的经济特点。
到目前为止,除了 “无状况性”,我没有看到令人满意的、从底子上处理这个问题的办法,而 “无状况性”,咱们实际地说,也面对许多挑战。这个咱们后文再说。
总而言之,大局状况、链上核算和富状况性,既使以太坊上的合约获得了可组合性,也使以太坊的网络有陷于中心化的危险;就像小说《指环王》中的魔戒,既能召唤强壮的力气,也或许吞噬运用者自己。我担心以太坊还要接受这样的重负好久。
接下来,咱们以 “状况” 视角,来了解诸种可扩展性计划的规划和权衡。
以太坊的发展方向
在此章节中,咱们会分析四种以太坊的发展方向:Layer-2 计划、分片、无状况性和 Rollup 计划。这个分类是彻底不合理的,由于 rollup 是 Layer-2 计划的子集;而无状况性是分片的前置技能;甚至于,将它们并列也是不合理的,由于 Layer-2 计划简直不需求改动以太坊的底层,而分片和无状况性则有这样的要求。这样做只是为了叙说和认识的便利。
Layer-2 计划
Layer-2 计划背面的理念来历于一种简略但十分精准的直觉:以太坊之所以会面对吞吐量的瓶颈,是由于组成以太坊网络的节点的带宽、核算才能和保护状况数据的才能都是有限的,并且很难进步;单纯要求整个网络的节点在单位时间内处理更多的买卖,节点的运行要求必定上升,这就损及了去中心化;可是,从运用的角度看,并不需求让一切的状况都放在以太坊上,也不需求让一切的状况核算都在以太坊上发生;咱们能够把一个合约的中间状况(或许一切状况)都保存在别的当地,用户的交互(也即状况的更新)也不在以太坊区块链上发生;仅当用户以为有必要结算某个状况时,再将该状况发送到以太坊上 ,由以太坊来加以确认。
一句话:假如咱们无法让网络在单位时间内对更多的事务到达一致,那就进步单笔事务的内在。
经典的 Layer-2 计划 “状况通道” 最彻底地表现了这种思想:当参加一个通道的两个用户将资金锁入合约后,此后两人之间的买卖都不会发到链上,他们互相之间运用其他通讯工具来沟通签名音讯,并以此到达互相对通道内状况的一致(因而无论他们之间收发多少音讯、形成多少状况数据,都不会成为以太坊的担负);直到两人以为不再需求交互了(或许有必要暂时结算一次了),就把共同认可的状况及两人的签名发送到以太坊上,以太坊这才更新该合约的状况,并根据此状况为两人结算资金。
假如你把 Layer-2 计划当成合约的一种规划模式,你会更清楚地看到 —— Layer-2 计划挑选了不去运用大局状况。另一个合约并不能实时地知道某个 Layer-2 合约内部到底是什么状况(用户 A\B\C 都各有多少钱),由于这些状况并不在链上,也因而,一个 Layer-2 合约就无法与其它合约相组合了。
虽然如此,Layer-2 计划也换来了极有价值的东西:更快的买卖速度(虽然被确认的中间状况没有主链状况这么安全)、更低的手续费、更小的主链节点担负。
但 Layer-2 计划为什么在曩昔几年中都没有结出果实呢?由于在 Rollup 计划出现曾经,其他计划,包含状况通道和 Plasma,都无法证明锁入自己合约的资金与锁入带状况合约中的相同安全(既不会被冻住,也不会被盗走)。在状况通道计划中,假如你没有时间监控区块链,你的买卖对手能够经过向主链提交旧的状况,来 “盗” 走你的钱;在 Plasma 计划中,往往你需求依赖于运营者来为你供给自己状况的证明,因而它对运营者本身是很难设防的。
这跟以太坊主网带状况合约的运用体会彻底不同。除掉合约的代码危险,你存入合约的钱,如非有人发动 51% 进犯撤销你的所得买卖,不然不会被盗;除非有人一直经过 51% 进犯来检查你的买卖,不然你必定能够将自己的资金取出。(在后文中,咱们会看到 Rollup 计划是怎样处理这个问题的。)
分片
另一种改善以太坊、进步以太坊吞吐量的直觉是:以太坊的吞吐量有限,源于每个全节点都有必要处理一切链上买卖;假如咱们能够让每个节点只处理一部分买卖,不同组的节点别离(并行化地)处理不同的买卖,那么整个体系在单位时间内的吞吐量就等于这几组节点的单组处理量的总和;即,单个节点的担负并没有添加,但整个体系的吞吐量进步了(并且分组越细,吞吐量的乘数越大)。这便是所谓的 “分片”。
关于分片化架构,一个有趣的问题是其确切界说。在经典的、非分片化的区块链架构中,全节点有必要(1)重复一切核算;(2)保护一切状况;(3)传达一切区块/买卖。有人以为,只需打破一者,就算是分片化的了;但从更严格的视角看,有必要打破一切三者,才干到达理论所推导的吞吐量提升作用 6。取不同的界说,带来的作用也很不同。此处,我所采取的界说是,一个节点至少无需保护整个体系一切的状况。
但另一个更有趣的问题是,倘若分片架构所要求的前置技能都能完结,这一架构能有多大的意义。
在以太坊基金会的研讨团队所构想的分片架构中,整个体系的状况被分割成了几个部分,各部分是并行更新的,也便是说,一个分片并不能实时地了解另一个分片的内部状况。当坐落分片 A 的合约 A' 测验调用分片 B 上的合约 B' 时,并不能假定处理者具有分片 B 的状况,也因而,处理的成果有必要等候分片 B 完结状况更新后才干回来。由此,跨分片的买卖有必要忍耐事务处理中最难以忍耐的价值:时延。要害在于,此种时延是不能用钱银价值来加以笼统的。由于分片 B 也并不知道分片 A 上发生了一笔需求调用本身的买卖,因而只能等候一个可信的通信层为自己播报这条买卖。
单位时间内能够发明的价值越高,时延越不可忍耐;而这意味着,假定有某个 DeFi 运用会集的分片,这些运用底子不会经过跨分片的买卖来调度其它分片上的处理才能,由于这底子没有意义,满意不了 DeFi 运用对时延的要求。相同,这也意味着,这个 DeFi 运用集聚的分片,其单分片处理才能便是其处理才能上限(与单条区块链没有差异)。在深山老林里造房子和筑路,处理不了大都市里人们的生活空间问题。
(有人以为,这些 “搁置” 的分片吞吐量能够为更小众的运用所用。我以为,Layer-2 计划能到达相同的作用,并且对底层的改动更少,更安全。)
无状况性(statelessness)
无状况性是唯一直面了状况数据胀大问题的升级方向 7。
在当时的以太坊协议中,买卖本身并不携带本身所拜访的状况的信息,正是因而,处理买卖的节点才有必要保护状况数据,作为履行状况转化函数的前置条件。也正因而,状况数据的胀大才是一个问题(进步节点担负)。
而无状况性的要害,正是让 买卖/区块 本身顺便所拜访状况的信息,因而,一个区块仅凭本身便是可验证的,无需处理买卖的节点具有状况。
实际上,无状况性是经过改动以太坊区块的结构,改动以太坊区块的验证办法。无需保护状况数据,也就免去了读写硬盘的需求,区块验证的速度也能够更快。此外,各节点既能够彻底不保护状况数据,也能够根据自己的需求,保护某些合约的状况数据。
可是,诚实地说,无状况性目前还面对许许多多的规划挑战。详细来说:(1)无状况性要求为 区块/买卖 附加所拜访状况的证明(witness),这部分数据的规划或许十分大,以太坊当时的区块数据巨细大概是 20~40 KB,但 witness 数据的巨细或许在 MB 级别(视所拜访状况量的巨细而定);(2)只要保护了一切状况的节点才干组装出 witness,那么谁来为普通用户供给状况呢?(实际上,能够把这个视为以太坊运作假定的一个转变:本来一切的全节点都能参加挖矿;但无状况性完结之后就不是了);(3)怎样为买卖的 gas 消耗量定价?尤其由于 witness 有时效性,并不能根据操作码来确认组装 witness 耗费了多少核算量。
正是由于这些困难,以太坊的全节点或许还有必要在这种保护一切状况的模式中运行好久。可是,无状况性肯定是当时对以太坊协议的改善中,最激动人心的方向。由于它直面了以太坊的中心问题,并测验釜底抽薪地处理这个问题。别的,对状况数据在以太坊协议中的运用的研讨,也滋养着其他的研讨方向,如同步办法 8。
我有偏见地相信,以太坊的未来即使不是无状况性,也是得到无状况性启示的某种计划。
Rollup 计划
Rollup 计划是一种 Layer-2 计划,其特殊之处在于,它会将每一次状况更新所用到的买卖,都在以太坊区块链上发布出来。
与其他 Layer-2 计划相同,Rollup 计划也把状况存在链下,也不要求以太坊的节点来核算合约的新状况;可是,把会更改这个合约状况的买卖,都作为数据发布出来,这意味着,任意第三方,都能够凭借这些揭露的数据和揭露的规矩,核算出该合约的状况(虽然一个以太坊上的合约无法运用这些状况)。
前面说到,当 Lyaer-2 合约挑选了把状况核算移到以太坊链外,并遮盖了自己的合约状况,它就给用户引入了危险:用户并不知道,Layer-2 合约的运营者会不会把一个无效的状况发到链上交由区块链来敲定,假如运营者能够这样做,那就等于是能直接盗取用户的资金;此外,用户也不知道 Layer-2 合约的运营者会不是检查自己的买卖,然后冻住自己的资金。
资金被盗问题有两种处理思路,一是确保每一次状况转化都是有用的,也即是每一次要更新合约的状况根时,都让以太坊来履行一次对核算完整性的验证程序,只要验证经过了,才答应合约更新状况根,这便是 zk-rollup 的思路;另一种思路是,要求人们在恳求更新合约状况根时,都顺便押金,假如所提交的状况根是无效的,检举此状况根的人能够获得原提交者的押金,这便是 optimistic-rollup。但后边这种思路有个前提条件:检举人有必要有办法获得该次状况转化前的状况,不然无以生成该次转化的过错性证明。
资金被锁问题的处理思路只要一种:尽或许弱化 “运营者” 的概念,使得谁都能向以太坊提交买卖来更新该 Layer-2 合约的状况。但这又回到了那个问题:假如提交者没有该合约的状况,怎样证明自己的状况拜访的有用性,让合约放行呢?
终于,Rollup 计划用 “在每一次状况转化时都发表匹配的买卖数据” 处理了这个问题。由此,Rollup 合约虽然没有把状况揭露在链上,可是任何人 —— 也包含 rollup 合约的用户 —— 都能根据这些揭露的买卖包重建出一个 rollup 合约的内部状况。这意味着,倘若规划妥当,rollup 合约内的资金,与以太坊区块链上保存了状况的合约(也即是咱们现在常用的合约),可所以相同安全的!
以 zk-rollup 为例,链上验证程序确保了一个 rollup 合约不或许更新一个过错的状况根,就像假如没有你的答应,Maker DAO 也不能没收你的 DAI;一起,假定它也揭露了核算完整性的结构办法,则你随时能够在链上直接向合约建议状况转化,来取出自己的钱。这就跟普通的、带状况的合约彻底相同了:假如没有 51% 进犯,就无法回滚 rollup 合约的状况;假如没有继续的 51% 进犯,就无法阻挠你取回自己的钱。
Optimistic-rollup 依赖于一些密码经济学的假定,因而稍弱一些:除了 51% 进犯回滚状况以外,进犯者还能够经过继续一段时间的 51% 检查进犯来给合约注入过错状况根;或许能够赌一把,赌一切核算出了该合约最新状况的人都不会观察到过错(概率极小)。但 Optimistic-rollup 相同能供给很强的免托管性,你也能随时取回自己的钱。
换言之,假如用户愿意把钱存进一个有状况的合约(例如 compound、maker dao、uniswap),那就没有理由不愿意存进 rollup 合约(假如非要加限定词,那便是 zk-rollup 合约)。有了 zk-rollup,layer-2 计划现已能为用户供给以太坊区块链上合约所能供给的最大程度的资金安全了。明显,也只要做到这份上,才有或许获得大规划采用。
一切的 Layer-2 计划都能够视为一种趋向无状况性的折衷:Layer-2 计划本身是无状况的(对其它合约来说,Layer-2 合约的内部状况是不可拜访的),其内部状况再杂乱,都不会添加以太坊节点的担负;一起,更新 Layer-2 合约(的状况根)时,以太坊扮演的角色更多是验证,即验证状况根更新是有用的,而不是自己去核算出这个状况根。可是,到了 rollup 时代,Layer-2 计划才证明晰自己能够和带状况的合约相同安全,其许诺这才有或许化为实际。
结语
综上,在本文中,我解说了以太坊的 “可组合性” 的来历,以及各种受到热议的可扩展性计划是否献身了这种可组合性,又换来了什么。读者或许会注意到,我在推理和点评的时候,相当注重 “咱们现已完结了什么/得到了什么” “人们的行为表明他们需求什么”。不错,我正是从这个角度出发,来解说 rollup 计划的魅力的(事实上,这或许是我写这篇文章的中心动力之一)。在我看来,这样一种思维倾向,能使咱们的考虑的起点愈加牢靠,免于臆测用户的需求,亦免于投入建造空中楼阁。
在前史的流转中,我看到人们在可选的东西中选了某些东西,这就使我不得不以为,这些东西是重要的;而假如某些技能,既没有添加人们可选的东西,又献身了人们实际上挑选了的东西,那就没有理由对这些技能怀有信心。
注
注 1:以太坊白皮书,https://ethfans.org/posts/ethereum-whitepaper
注 2:Vitaik 的推特,https://twitter.com/vitalikbuterin/status/854271590804140033?lang=en
注 3:Vitalik:基础层和功能性的逃逸速度,https://ethfans.org/posts/vitalik-base-layers-and-funtionality-escape-velocity
注 4:怎样看待 Infura 服务溃散,https://ethfans.org/posts/38028
注 5:论状况租金和 Stateless Ethereum,https://ethfans.org/posts/on-the-state-rent-and-pivot-to-stateless-ethereum
注 6:根据委员会的分片区块链中的安全性和可扩展性,https://ethfans.org/posts/security-and-scalability-in-committee-based-blockchain-sharding
注 7:以太坊无状况客户端初探,https://ethfans.org/posts/data-from-the-ethereum-stateless-prototype
注 8:Beam Sync:同步以太坊节点的新办法,https://ethfans.org/posts/intro-to-beam-sync
视野开拓
有这么一个笑话,说的是在斯大林时期的苏联,有一位乐队指挥坐火车前往下一个演出地点,正在车上翻看当晚将要指挥演奏的作品的乐谱。两名克格勃军官看见他在读着什么,错把乐谱当成某种密码,立即将他作为间谍速捕了。他争辩说那只是柴可夫斯基的小提琴协奏曲,却无济于事。在他被投入牢房的第二天,审问者自鸣得意地走进来,说:“我看你最好还是老实招了吧。我们已经抓住你的朋友柴可夫斯基了,他这会儿正向我们招供呢。” 这个笑话成了介绍囚徒困境的开场白,而囚徒困境可能是最广为人知的博弈。现在我们就来看看它如何导出符合逻辑的结果:假设克格勃真的逮捕了某人,而此人的唯一罪名就是取了“柴可夫斯基”这么一个名字,而且克格勃将乐队指挥和他分开进行审问。如果这两名 无辜者否认克格勃指控的罪名,那么,他们将分别被判处3年徒刑。①如果乐队指挥昧着良心承认罪名,其中还牵涉到那位素不相识的所谓“同谋”,柴可夫斯基却仍然否认罪名,那么,乐队指挥可以在1年之后获得自由(以及克格勃的赞赏之情),而柴可夫斯基则会因拒不认罪而遭到严厉惩罚,被判处25年徒刑。当然了,假如乐队指挥与柴可夫斯基调换一下,乐队指挥拒不认罪,柴可夫斯基不但屈从认罪,还把他供了出来,那么,两人的下场也会发生相应的变化假如两人同时认罪,那么,他们都将被判处这一罪名的标准刑罚 10年徒刑。② 现在设想乐队指挥的思路。他知道柴可夫斯基要么招供,要么拒 不认罪。假如柴可夫斯基招供,乐队指挥若是拒不认罪或招供,与之 对应,他会被判处25年或10年徒刑,相比之下,对他来说招供的下 场显然略胜一筹。假如柴可夫斯基拒不认罪,乐队指挥若是同样拒不 认罪或招供,与之对应,他会被判处3年或1年徒刑,相比之下,对 他来说招供的下场仍然略胜一筹。由此可见,招供显然是乐队指挥的 最佳做法。 而在捷尔任斯基广场(...-《策略思维》