深入解析以太坊设计理念与协议演化的创新与挑战

日期: 2025-03-27 18:09:27 |浏览: 5|编号: 85487

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

深入解析以太坊设计理念与协议演化的创新与挑战

编辑注:此翻译的第一个版本是在此重印中找到的,并且此重印已被校对。感谢原始翻译器Kim。

原始文本的写作时间尚不确定,但可以将其视为反思以太坊设计理念及其在过去几年中的发展的起点。这既是对其创新的反映,也是对其缺乏考虑的反映。

尽管以太坊的许多想法已经在较早的加密货币(例如比特币)上使用和测试了5年,但就某些协议功能的处理方式而言,以太坊仍然与常见方法有很多不同。此外,以太坊可用于开发全新的经济工具,因为它具有其他系统没有的许多功能。本文详细描述了以太坊的所有潜在优势以及建立以太坊协议的一些有争议的方面。此外,将指出我们的解决方案和替代方案的潜在风险。

原则

以太坊协议的设计遵循以下原则:

Sandwich复杂模型(也被翻译为“复杂性层次模型”):我们认为,以太坊的基本协议应该尽可能简单,并且界面设计应该易于理解(是否是开发人员的高级编程语言界面,还是以用户为导向的界面)。这些不可避免的复杂零件应放在中层。中层不是核心共识的一部分,最终用户看不到。它包括:高级语言编译器,参数序列化和避免脚本,存储数据结构模型,LevelDB存储接口和网络协议。当然,区别并不是绝对清晰,有时需要适当地进行调整。

自由:不应限制用户使用以太坊协议,也不应尝试优先或不支持某些以太坊合同或交易。这类似于“网络中立性”概念背后的指导原则。比特币交易方案不遵循以下原则:比特币交易方案不鼓励区块链的“外体目的”(例如,数据存储,元过程)(校对注:长期以来,外形意味着在其批准的适应症之外使用症状,例如在其批准的指示外,例如使用咳嗽药物来治疗头痛。有时,人们使用准合理层的变化(例如将OP_Return字段的长度限制为40个字节)来攻击以“未经授权”的方式使用区块链的应用程序(校对说明:这是一种讽刺性比特币社区的倾向于检查比特币的倾向,可以检查比特币比特币的趋势)。因此,在以太坊中,我们坚决支持交易费用以实现一般激励兼容的方法 - 用户在整个网络中消耗的资源越多,即使他承担成本本身(即Pigou税),其成本就越高。

概括:以太坊协议的特征和开孔应最大化低级(如基本粒子)的概念,以便可以随意合并它们,包括结合今天似乎毫无用处但在将来可能有用的事物。此外,通过剥离不需要的功能,低级概念可以更有效。遵循此原则的一个示例是,我们选择日志操作码作为向DAPP提供信息的一种方式,而不是像以前那样记录所有交易和消息。在早期,“消息”的概念是多个概念的完整集合,其中包含“功能调用”和“外部观察者感兴趣的事件信息”,两者完全分开。

没有最大的功能:为了遵循概括原则,我们拒绝将这些高级用例嵌入协议的一部分,即使经常使用,我们也永远不会这样做。如果人们真的想实施这些用例,他们可以在合同中创建子协议(例如,基于以太坊的子货币,比特币/litecoin/dogcoin Sidechains等)。例如,以太坊缺乏类似于比特币的“时锁”功能。但是,可以通过以下协议模拟此功能:用户将签名的数据包发送到特定的处理合同,并且如果数据包在特定合同中有效,则将执行相应的功能。

规避风险:如果风险增加带来可观的好处,我们愿意承担更高的风险(例如,一般状态过渡,块时间减少50倍,共识效率等)。

这些原则指导以太坊的发展,但不是绝对的。在某些情况下,为了减少开发时间或不一次进行更改,我们还将延迟进行某些修改,并将其留在将来的版本中进行修改。

区块链层协议

本节介绍了以太坊中区块链层协议的变化,包括块和交易的工作方式,数据的序列化和存储方式以及帐户背后的机制。

帐户,不是UTXO1

比特币和许多变体将用户平衡信息存储在UTXO结构中,并且系统的整个状态由一系列“无关紧要的输出”组成(可以将这些“未量输出”(可以想像为硬币)(校对说明:更好的隐喻可能是“检查”)。每个UTXO都有其自身的价值属性和自己的属性。交易消耗了几个UTXO,并生成了几个新的UTXO;交易应符合以下有效性要求:

1。每个引用的输入必须有效并且尚未使用; 2。交易的签名必须与每个输入的所有者签名匹配; 3。输入的总值必须等于或大于输出的总值。

因此,在比特币系统中,用户的“余额”是可以有效签名的所有UTXOS的总和。下图显示了比特币系统中的交易输入和输出过程:

- 比特币中使用的三型会计方法 -

但是,以太坊放弃了UTXO的解决方案,并使用了一种更简单的方法:使用状态概念存储一系列帐户,每个帐户都有自己的平衡以及以太坊独有的数据(代码和内部内存)。如果交易发起人的帐户余额足以支付交易费用,则交易是有效的,并且发起人的帐户将扣除相应的金额,并且接收帐户将包含在金额中。在某些情况下,如果需要在接收帐户中执行代码,则交易将触发代码的执行,并且帐户的内部内存可能会更改,并且可能会创建其他消息以发送到其他帐户,从而导致新的交易发生。

尽管以太坊不采用UTXO的概念,但UTXO具有一些优势:

较高的隐私保护程度:如果用户为每次交易使用新地址,则很难与帐户相关。这适用于需要高安全性但不适合任何DAPP的货币系统。因为DAPP通常需要跟踪用户的复杂绑定状态,并且DAPP的状态不能像货币系统中的状态那样简单地分割。

潜在的可伸缩性:从理论上讲,UTXO更符合某些类型的可伸缩性范式,因为只有持有人拥有默克尔的证明可以证明自己的货币所有权,即使每个人(包括ta本人)忘记了这些数据,该人也会受到真正的损害,而其他人也不会受到影响。在以太坊帐户系统中,如果每个人都丢失了帐户的默克尔树一部分,则该帐户将无法处理可能影响它的任何消息,包括发送到该消息的消息,并且将无法处理。但是,不仅UTXO可以扩展,而且还可以在不依赖UTXO的情况下进行扩展(在这里不扩展,Translator的注释)。

帐户的好处如下:

节省很多空间:如果一个帐户有5个UTXO,则从UTXO模式转换为帐户模式,所需的空间将从300个字节降至30个字节。特定的计算如下:300 =(20+32+8)* 5(20是地址字节的数量,32是Tx的ID字节数,8是该名称占据的字节数); 30 = 20 + 8 + 2(20是地址字节的数量,8是帐户余额值字节的数量,2是nonce 2字节的数量);但是,实际的节省并不是那么好,因为该帐户需要存储在Patricia树上。此外,以太坊中的交易也小于比特币中的交易(以太坊中的100个字节和比特币中的200-250字节),因为每个交易仅需要生成参考,签名和输出。

更可互换的:UTXO结构没有区块链层的概念,因此,通过基于这些“有效输出”的来源建立红色列表/黑名单来区分它们是不切实际的。

简单:以太坊编码更简单,更易于理解,尤其是在复杂的脚本方面。尽管可以(勉强)在UTXO方法中实现任何分散的应用程序,但该方法本质上是限制给定UTXO可以输出及其使用条件的UTXO类型的能力(例如,需要包括默克尔树以帮助相应的应用程序来帮助脚本对脚本的相应应用程序更改状态)。因此,UTXO实施比以太坊使用帐户的方式要复杂得多。

光线客户端:Light Client可以通过指定方向扫描状态树来随时访问与帐户有关的所有数据。在UTXO范式中,每次交易所需的参考文献不同,这无疑是长时间运行的DAPP应用程序的繁重,并使用上述UTXO根状态传播机制。

我们认为,帐户的好处远远超出了其他方式,尤其是对于我们要支持的DAPP应用程序,该应用程序可以包含任意状态和代码。此外,基于“无特征是最大特征”的指导原则,我们相信,如果用户真正关心隐私,他们可以建立一个加密的“混音器和共同Join”,以通过合同中的“签名数据包协议”混淆付款路径。

帐户方法的一个弱点是,为了防止重播攻击(重播攻击,指的是重复执行相同的交易),每个事务必须具有“ nonce”(重复号码)。因此,每个帐户必须具有实时更新的非CE值,并且每项新事务在帐户中的价值上被1递增为1,作为其自身的nonce(并根据处理交易后,根据此值更新帐户的非CE值)将被吸收的以太坊帐户的nonce随着交易的开始而增加,从而解决了这一问题)。这意味着即使是不再使用的帐户也无法从帐户状态中删除。解决此问题的一种简单方法是让交易包含一个块号,以便在一段时间后不再重播它们并偶尔重置Nonce。

要删除该州的帐户(例如长时间未使用的帐户),您必须首先“ ping”它们,并且以完整方式扫描区块链协议的开销非常高。我们不会在1.0上实施此机制,版本1.1及更高版本可以使用此机制。

校对注意:这是以太坊将来面临的“状态爆炸”问题的技术原因:所有状态数据必须完好无损,并且无法合理删除帐户。作为一个区块链协议,以太坊节点不仅需要就交易顺序达成共识(交易),而且还需要在全球状态上达成共识(表达式的形式是,块标头需要包括状态根。

校对注意:这种用NONCE标记帐户交易订单的做法也使用户的交易按顺序执行。如果无法处理交易,则无法处理使用后续NONCE的交易。请参阅发行交易的链接进度。

默克尔·帕特里夏树(MPT)

由Alan Reiner构思并在Ripple协议中实施的Merkle Patricia树/Trie是以太坊的主要数据结构,用于存储所有帐户状态,以及每个块中的交易和收据数据。 MPT是默克尔和帕特里夏树的结合。通过组合这两棵树创建的结构具有以下特性:

对应于任何一组键值对的根哈希值是唯一的。如果您想撒谎,即在某树上存在键值对,肯定会发现它(除非攻击者具有大约2^128的计算能力)。

添加,删除和修改键值对的时间复杂性是对数。

MPT为我们提供了有效,易于更新的效率,并代表整个状态树。关于MPT的更详细说明:。

MPT的特定设计决策如下:

节点有两种类型:KV节点和离散节点。 KV节点的存在提高了效率,因为如果树在特定区域中稀疏,KV节点可以用作“快捷方式”来压缩树的高度(请阅读MPT的详细说明以获取更多详细信息)。

离散节点是十六进制的,而不是二进制:这使搜索更有效。我们现在意识到,这种选择不是理想的选择,因为可以通过批处理节点在二进制中模拟十六进制树的搜索效率。但是,MPT树结构的实现非常容易出错,至少会导致状态根不匹配,因此我们决定放弃更改并等到版本1.1。

空值和非会员职位之间没有区别:这样做是为了简化以太坊默认值为0的逻辑,不启用帐户的值(平衡),并且空字符串也由0表示。但是,应该强调的是,这样做是这样的牺牲,可以使某些多功能性这样做,因此并不优化。

终止和非终止之间的差异:从技术上讲,不必确定一个节点“它是否是终结节点》,因为以太坊中的所有树木都用于存储固定长度的数据(即,即关键的长度),但是为了增加普遍性,我们仍将增加此识别以期待以太坊的实现。

使用SHA3(k)作为“安全树”(状态树和帐户存储树)中的密钥:使用SHA3(k),通过生成许多帐户(帐户可以使状态树最高64层!)并反复调用Sload和SSTORE OPCODES,将大大改进DOS攻击。请注意,这也使枚举树木更加困难。如果要使客户具有枚举功能,最简单的方法是维护映射SHA3(k) - > k的数据库。

校对注意:这里的含义是,如果K用作将数据存储在默克尔树中的关键,其分布可能很少,并且攻击者可以轻松地计划需要深层树路径的帐户,并反复在这些帐户上调用状态访问操作,从而导致网络中的节点运行超负荷。但是,哈希函数的结果是随机分布的,并且使用sha3(k)作为钥匙可以使钥匙分布更加均匀,而树高将较短)。

此功能还具有收益和损失。一方面,这意味着DOS攻击将变得更加困难。另一方面,它还使状态树访问交易的访问路径很少重叠,因此每个搜索都是最糟糕的复杂性。

此外,这也使MPT不适合实现“无状态”(该块本身带有验证所需的数据,并且验证者不需要具有全球状态),因为状态访问的路径不一致,并且证据的空间效率也是最糟糕的。当然,也可以说,默克尔树的空间效率本身还不够高

RLP

RLP(递归长度前缀):递归长度前缀。

RLP编码是以太坊中的主要序列化格式,其使用无处不在:块,交易,帐户状态和网络协议消息。有关详细信息,请参阅RLP的官方描述:

RLP设计为一种高度简化的序列化格式,其唯一目的是存储嵌套的字节阵列3。与Protobuf和Bson等现有解决方案不同,RLP并未定义任何指定的数据类型,例如Boolean,float,float,double或Integer。它只是以嵌套数组的形式存储结构,该协议确定了数组的含义。 RLP也不明确支持地图收集。半官方建议是使用[[K1,V1],[K2,V2],...]的嵌套阵列来表示按标准字符串排序的键值对集合,K1,K2 ...。

与RLP相同的功能是Protobuf或BSON,它们是一直使用的算法。但是,在以太坊中,我们更喜欢RLP,因为:(1)易于实现; (2)绝对保证字节的一致性。

许多语言中的钥匙值没有明确的集合,并且有许多特殊的浮点格式案例,这可能会导致相同的数据产生不同的编码和不同的哈希值。通过内部开发协议,我们可以确保其设计为这些目标(这是一般原则,也适用于代码的其他部分,例如虚拟机)。 Bittorrent使用的编码方法是Bencode,它可以代替RLP。但是,它使用了十进制编码,该编码略低于使用二进制的RLP。

压缩算法

网络协议和数据库都使用自定义压缩算法来存储数据。该算法可以描述为:使用0的中风代码并同时保留其他值(例如,除了某些特殊情况(例如SHA3('')),例如:

>>> compress('horse')'horse'>>> compress('donkey dragon 1231231243')'donkey dragon 1231231243'>>> compress('\xf8\xaf\xf8\xab\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe{b\xd5\xcd\x8d\x87\x97')'\xf8\xaf\xf8\xab\xa0\xfe\x9e\xbe{b\xd5\xcd\x8d\x87\x97'>>> compress("\xc5\xd2F\x01\x86\xf7#<\x92~}\xb2\xdc\xc7\x03\xc0\xe5\x00\xb6S\xca\x82';{\xfa\xd8\x04]\x85\xa4p")‘\xfe\x01'

在存在压缩算法之前,以太坊协议中的许多地方都有一些特殊情况。例如,经常重新定义sha3,以使得不需要在帐户中存储代码的sha3('')=''保存64个字节。但是,所有这些使以太坊数据结构肿的特殊情况最近都被删除了,而是将数据保存功能添加到区块链协议之外的一层中,即将其放入网络协议中并将其插入用户数据库实现。这增加了模块化功能,简化了共识层,并使部署压缩算法的连续更新相对简单(例如:可以通过网络协议的版本编号进行区分和部署它们。

使用一棵树

提醒:了解知识的这一部分要求读者了解Bloom过滤器5的原理。可以看到引言:

以太坊区块链中的每个块标头都包含一个指向三棵树的指针:状态树,事务树和收据树。

交易收据是RLP编码的数据结构:

[ medstate, gas_used, logbloom, logs ]

在:

块标头中还有一个Bloom滤波器,这是所有在块中交易的Bloom过滤器的或操作(或)的结果。这样的结构使以太坊协议对Light客户非常友好。

笔记:

UTXO:从字面上看未解决的交易输出:未解决的交易输出,即未经任何事务作为输入所引用的事务输出。它是比特币协议中用于存储价值(所有权)信息的数据结构。 - - 防线笔记

nonce,一次或数字一次使用的数字的缩写。在密码学中,NonCE是仅使用一次的任意或非重复的随机数值。它在加密技术中的初始向量和加密哈希功能中起着重要作用。它确保在各种验证协议的通信应用中不重复验证信息以对抗重播攻击(重播攻击)。 - Translator's Note

嵌套数组:创建一个数组并用其他数组填充。例如数组宠物:

var cats : String[] = ["Cat","Beansprout", "Pumpkin", "Max"];
var dogs : String[] = ["Dog","Oly","Sib"];
var pets : String = [cats, dogs];

- Translator's Note

运行长度编码:统计编码。主要技术是检测重复的位或字符序列,并用其出现数字替换它们。 (百度百科全书) - 翻译说明

Bloom Filter:霍华德·布鲁姆(Howard Bloom)在1970年提出的二进制矢量数据结构,该结构具有良好的空间和时间效率,用于检测元素是否是集合的成员。 (百度百科全书) - 翻译说明

(未完成)

(文章中有许多超链接,您可以单击左下方的“读取原始文本”以从Ethfans网站获取)

原始链接:

提醒:请联系我时一定说明是从铂牛网上看到的!