主页 > imtoken钱包下载 > 观点:从“状态”的角度理解以太坊及其未来

观点:从“状态”的角度理解以太坊及其未来

imtoken钱包下载 2024-01-26 05:10:45

编者按:本文来自以太坊爱好者(ID:ethfa​​ns),Odaily星球日报经授权转载。

一、简介

自2015年创建以来,以太坊区块链已经经历了五个冬天和夏天。 五年时间,不仅将以太坊协议1作为一个概念变成了现实,使这个协议更加成熟和具体,也暴露了这样一套设计的特点和取舍。 这些权衡作为一种设计挑战,自然会吸引并继续吸引无数人才来尝试提高以太坊的可用性; 其中,汇集了最多心血和想象力的是提高“可扩展性”系列计划。 本文想指出的是,正如以太坊范式面临设计权衡一样,所有这些可扩展性解决方案也面临着权衡; 而要评估这些权衡是否值得,我们需要回到以太坊本身,回到以太坊节点和以太坊用户的真实问题和真实需求。 “状态”视角作为理解以太坊本身的视角,恰好可以帮助我们理清这些方案的设计,揭示我们的得失。 本文将从解释“状态”的含义入手,揭示以太坊的终极长矛和阿喀琉斯之踵,进而探讨各种改进方向。 “富态”是以太坊智能合约中“可组合性”的来源,但也是以太坊网络最大的软肋。 由此,我们可以看出哪些经常被提及的解决方案会影响“可组合性”,哪些“可扩展性”的含义更为明显。

2. 以太坊作为范式 (1) 丰富的状态和可组合性

什么是“状态”? 状态是系统在某一时刻的具体情况。 以实现加密货币的区块链为例,某个时刻区块链的状态就是该时刻区块链上所有地址的资产分布(地址A有10个币,地址B有100个币等)(事实上,我们拥有的只是一些状态,这些状态被我们的思想和社会共识解释为“资产”)。 从这个角度来看,每套区块链协议大致可以分为两部分,一是共识机制,二是状态转换规则(有时也称为“共识规则”); 前者定义了区块生成规则,它表示参与区块链的所有节点何时需要在本地更新区块链数据库的状态(例如,作为以太坊区块链的节点,每当它收到满足难度要求的工作时)节点将更新本地区块链数据库的最新状态); 并且状态转换规则定义了哪些交易是有效的(“一个账户不能花费超过其自身余额的钱”),还定义了节点在处理交易时应该如何更新状态(“这个交易意味着账户 A 转账 5币到B账户,则A账户余额减5,B账户余额增加5")。 对于比特币来说,它的共识机制是“PoW+中本聪共识”,它的状态转移规则是基于UTXO的。 对于以太坊来说,它的出块机制是“PoW+幽灵规则”,它的状态转移规则是基于账户的。

那么,是什么让以太坊成为如此具有开创性的创新呢? 我们经常听说以太坊之所以特别,是因为它“引入了一种支持可编程性的图灵完备编程语言”等等。 其实这个说法是不准确的 2. 因为允许更复杂的编程语言并不意味着什么,因为比特币是可以编程的; 允许比特币使用 solidity 编程语言不会让你成为以太坊。 以太坊真正与众不同的是它的“丰富的状态”3:它允许一个合约调用另一个合约,并且除了块大小本身之外,对此类调用的级别数没有限制。 合约B可以调用合约A,根据合约A公开的代码改变合约A的状态; 调用合约B的合约C也可以间接调用合约A,改变合约A的状态,但其控制逻辑可以如此重叠,不断积累; 如果把国家理解为一种资产,这就相当于允许对资产的使用权(使用条件)进行更严格、更复杂的持续控制; 这意味着,从理论上讲,一个状态更新逻辑可以无限接近现实生活中的金融合约(因为所有的金融合约都可以通过简单的逻辑叠加组合)。 这个允许任意层级控件堆积的属性是最关键的,但是如何对这个控件进行编程是次要的。

此外,以太坊还允许用户将状态写入区块链,使这些状态成为全局状态的一部分,并要求节点根据合约定义的逻辑更新状态。 因此,合约可以向以太坊上的所有其他账户披露自己的状态,上述丰富的状态性真正发挥作用。 没错,现在我们像收集龙珠一样收集了三个属性: (1) 链上计算范式:合约可以要求节点按照自己定义的逻辑进行计算; (2) 全局状态:合约的状态可以成为全局状态的一部分,对所有其他账户开放; (3) 状态丰富:合约之间可以相互调用,堆栈层数没有限制,控制逻辑可以逐层堆积; 现在我们可以召唤出最强的以太坊长矛:“可组合性”(货币乐高)! 链上的计算方式让我们可以拥有多种合约; 全局状态允许这些合约访问彼此的状态; 富国允许合同的组合无限多样。 所以我们不仅可以有稳定币DAI,还可以有一个借贷市场,一个彩票应用,一个自动捐出彩票收益的应用,一个自动重新平衡不同借贷市场之间储蓄率的应用……

(2) 状态数据爆炸问题

“可组合性”好得令人难以置信,对吧? 是的,以上三种属性的三位一体其实是一把双刃剑。 以太坊的状态转移过程可以抽象为:状态转移函数以旧状态和交易列表为输入,输出新状态。 这意味着以太坊的全验证节点必须在本地维护以太坊区块链的最新状态,这样它们才能执行状态函数并使用结果来验证一个区块的有效性(同时也与其他以太坊节点达成共识)。 矛盾在于:对于合约和开发者来说,合约的状态作为以太坊全局状态的一部分存储在以太坊的节点上,合约的状态更新由以太坊的节点计算(并且还由发起计算请求的节点(用户付费),这种“无服务器”架构非常舒服; 但是,只要支付一次,这些状态就会永久保存在以太坊的全验证节点中,虽然每次更新都需要支付,但无法避免。 状态数据将不断积累和扩展。 状态数据的扩容之所以成为问题,是因为它会给全验证节点带来越来越高的硬盘(随机)读写负担。 状态数据不像块数据。 块数据是静态的,持久化存储后不需要频繁读写; 但是,每个额外的块都需要多次读取和写入状态数据。 ,读书和写作的负担会越来越重。 在过去的几年里,我们经常听到有人说以太坊的全节点很难部署,这是主要原因之一。

前段时间,Infura的免费以太坊节点服务崩溃4,导致很多依赖Infura的服务崩溃。 这个问题不容易解决。 过去几年,以太​​坊的多次硬分叉升级,增加了访问状态的操作码的gas消耗,正是为了以经济成本遏制合约创建新状态。 但这显然只是治标不治本的方案,因为逻辑并没有发生根本性的改变,状态数据必须继续存储在以太坊节点上,而创建状态数据的用户只需要支付一次费用。 还有人建议,为了改变这一点,需要引入某种“状态租金”机制,要求保存状态的合约持续支付租金,否则合约的可用性将被终止。 然而,这种机制具有难以想象的复杂性。 一方面难以确定合理的收租方式以太坊有哪几种账户,另一方面也难以确定合理的支付对象。 因此,状态租机制的研究在20195年也停滞不前。也有项目(如Nervos)试图根据持币量来定义可用状态空间的大小,因此状态数据的大小会总是有一个上限,这样就避免了状态膨胀的问题,但是这也改变了原有的资产。 经济属性。 目前为止,除了“无国籍”之外,我还没有看到一个令人满意的根本解决方案,而“无国籍”实际上也面临着许多挑战。 这个我们稍后再说。 总而言之,全局状态、链上计算、丰富状态,不仅让以太坊上的合约可组合,也让以太坊网络面临中心化的危险; 就像小说《指环王》中的魔戒一样,不仅可以召唤出强大的力量,还可以吞噬使用者本人。 我担心以太坊会长期承担这个负担。 接下来,我们使用“状态”视角来理解各种可扩展性解决方案的设计和权衡。

三、以太坊的发展方向

本章我们将分析以太坊的四个发展方向:Layer-2方案、分片、无状态和Rollup方案。 这种分类是完全不合理的,因为 rollup 是 Layer-2 方案的一个子集; 无状态是一种预分片技术; 甚至,把它们并列起来也不合理,因为 Layer-2 方案几乎不需要改变以太坊底层,而分片和无状态都有这样的要求。 这样做只是为了描述和理解的方便。

(1) Layer-2方案

Layer-2 方案背后的想法来自一个简单但非常精确的直觉:以太坊之所以面临吞吐量瓶颈,是因为构成以太坊网络的节点的带宽、计算能力和维护状态数据的能力都是局限性,难以提升; 简单地要求全网节点在单位时间内处理更多的交易,必然会增加节点的运行要求,从而损害去中心化; 但是,从使用的角度来说,没有必要把所有的状态都放在以太坊上,也没有必要让所有的状态计算都发生在以太坊上; 我们可以将合约的中间状态(或所有状态)保存在其他地方,用户的交互(即状态的更新)不会发生在以太坊区块链上; 只有当用户认为有必要对某个状态进行结算时,才会将该状态发送到以太坊进行确认。 一句话:如果我们不能让网络在单位时间内对更多的交易达成共识,那就提高单笔交易的内涵。 经典的 Layer-2 方案“状态通道”最彻底地体现了这种思想:当参与通道的两个用户将资金锁定到合约中时,之后两者之间的交易不会发送到链上,他们使用其他通信工具进行交换签署消息并就通道状态达成共识(因此无论他们发送和接收多少消息,形成多少状态数据,都不会成为以太坊的负担); 直到两个人认为不需要交互(或者需要暂时结算一次),于是将相互认可的状态和两个人的签名发送到以太坊,然后以太坊更新合约的状态,并且根据这个状态,两人结算资金。

如果将 Layer-2 方案看成是合约的一种设计模式,你会看得更清楚——Layer-2 方案选择不利用全局状态。 另一个合约无法实时知道一个 Layer-2 合约内部是什么状态(用户 A\B\C 有多少钱),因为这些状态不在链上,因此,一个 Layer-2 合约是不可能的结合其他合同。 即便如此,Layer-2 方案也换来了极其有价值的东西:更快的交易速度(虽然确认的中间状态不如主链状态安全)、更低的手续费、更小的主链节点负担. 但是为什么Layer-2方案这几年一直没有开花结果呢? 因为在 Rollup 方案出现之前,其他方案,包括 state channels 和 Plasma,都无法证明锁定在自己合约中的资金与锁定在有状态合约中的资金一样安全(既没有被冻结也没有被盗)。 在状态通道方案中,如果你没有时刻监控区块链,你的交易对手可以通过将旧状态提交给主链来“窃取”你的钱; 在 Plasma 方案中,你往往需要依赖运营商来为你提供自己身份的证明,因此运营商本身很难防御。 这与在以太坊主网上使用状态合约的体验完全不同。 排除合约的代码风险,你存入合约的钱不会被盗,除非有人发起51%攻击取消你的交易; 提取自己的资金。 (在后面的文章中,我们将看到 Rollup 方案是如何解决这个问题的。)

(2) 碎片化

另一个改进以太坊和增加以太坊吞吐量的直觉是:以太坊的吞吐量是有限的,因为每个全节点必须处理链上的所有交易; 如果我们可以让每个节点只处理一部分交易,不同组中的节点分别处理不同的交易(并行),那么整个系统单位时间内的吞吐量就等于单组的总和这些节点组的处理能力; 即单个节点的负担并没有增加,但是整个系统的吞吐量增加了(而且数据包越细,吞吐量倍数越大)。 这称为“分片”。 关于分片架构的一个有趣问题是它的确切定义。 在经典的非分片区块链架构中,全节点必须(1)重复所有计算; (2) 维护所有状态; (3) 传播所有区块/交易。 有些人认为,只要其中一个被打破,就被认为是碎片化的; 但从更严格的角度来看,必须打破这三者才能达到理论上推导的吞吐量提升效果6。 不同的定义有不同的效果。 在这里,我取的定义是一个节点至少不需要维护整个系统的所有状态。 但另一个更有趣的问题是,如果能够实现分片架构所需的所有前端技术,那么这种架构的意义有多大。 在以太坊基金会研究团队构想的分片架构中,将整个系统的状态分成若干部分,每一部分并行更新。 切片的内部状态。 当分片A中的合约A'试图调用分片B上的合约B'时,不能假定处理器拥有分片B的状态,因此处理结果必须等待分片B完成状态更新后返回。 因此,跨分片交易必须承受交易处理中最难以承受的成本:延迟。 关键是这种延迟不能用货币成本来抽象。 因为分片 B 并不知道分片 A 上已经发生了需要调用自己的交易,所以它只能等待一个可信的通信层为自己广播这个交易。 单位时间所能创造的价值越高,延迟就越难以忍受; 而这意味着,假设某个DeFi应用集中存在一个分片,这些应用将不会全力通过跨分片交易来调度其他分片上的处理,因为它根本没有意义,无法满足延迟的要求DeFi 应用程序。 同样,这也意味着这个DeFi应用聚合的分片中单个分片的处理能力是其处理能力的上限(与单个区块链没有区别)。 在深山老林中盖房修路,解决不了大都市人的生存空间问题。 (有人认为这些“空闲”的分片吞吐量可以被更多小众应用利用。我认为 Layer-2 解决方案可以达到相同的效果,但对底层的更改更少并且更安全。)

(3) 无国籍

无状态是唯一直接面临状态数据扩展问题的升级方向7。 在目前的以太坊协议中,交易本身并不携带其所访问状态的信息。 正因如此,处理交易的节点必须维护状态数据,作为执行状态转移功能的前提条件。 也正是因为如此,状态数据的膨胀是一个问题(增加节点的负担)。 无状态的关键是让交易/区块本身附上它所访问的状态的信息。 因此,一个区块本身是可验证的,处理交易的节点不需要有状态。 无状态其实就是通过改变以太坊区块的结构来改变以太坊区块的验证方式。 无需维护状态数据,无需读写硬盘,区块验证的速度也可以更快。 另外,每个节点可以完全不维护状态数据,也可以根据自己的需要维护部分合约的状态数据。 但是,说实话,无状态目前面临着很多很多的设计挑战。 具体来说:(1)无状态要求区块/交易附有访问状态的证明(witness)。 这部分数据的规模可能非常大。 以太坊目前的区块数据大小约为 20-40 KB。 但是见证数据的大小可能是MB级别的(取决于访问状态卷的大小); (2) 只有维护所有状态的节点才能组装见证人,那么谁来为普通用户提供状态呢? (实际上,这可以看作是以太坊运行假设的改变:所有全节点都可以参与挖矿;但实现无状态后就不能); (3) 交易的gas消耗如何定价? 特别是由于见证人的时效性,无法根据操作码来确定组装见证人需要多少计算量。 由于这些困难,以太坊的全节点可能不得不在这种保持所有状态的模式下运行很长时间。 然而,无状态绝对是当前以太坊协议改进最令人兴奋的方向。 因为它直接面对以太坊的核心问题,并试图自下而上地解决这个问题。 此外,对以太坊协议中状态数据使用的研究也滋养了其他研究方向,例如同步方法8。 我偏向于认为以太坊的未来是某种受无状态启发的方案,如果不是无状态的话。

(4) 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; 同时,假设它也公开了计算 Integrity 的构造方法,你可以随时直接向链上合约发起状态转换,提取你自己的钱。 这与普通的有状态合约完全一样:没有 51% 攻击就无法回滚汇总合约的状态,没有持续的 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 解决方案证明了它可以像有状态合约一样安全,它的承诺可以成为现实。

4。结论

综上所述,在本文​​中,我解释了以太坊“可组合性”的来源,以及各种热议的可扩展性方案是否牺牲了这种可组合性,以及换来了什么。 读者可能会注意到,我在推理和评估时非常强调“我们已经取得/得到了什么”和“人们的行为表明他们需要什么”。 是的,我正是从这个角度来阐述rollup方案的魅力(其实这可能是我写这篇文章的核心动机之一)。 在我看来,这样的思维倾向可以让我们的思维出发点更加可靠,避免猜测用户的需求,避免投资建造空中楼阁。 在历史的长河中,我看到人们在可有可无的东西中选择了某些东西,这让我觉得这些东西很重要; 而如果某些技术既不增加人们可选的东西,又以牺牲人们实际选择的东西为代价,就没有理由相信这些技术。