啥是以太坊的前身
发布于 3 年前 作者 qinxingyi 1034 次浏览 来自 问答

以太坊协议的史前史 2017年9月14日查看所有帖子

尽管当前以太坊协议背后的思想在很大程度上已经稳定了两年,但以太坊并没有立即全部涌现出来,以其目前的概念和形式已经形成。在区块链启动之前,该协议经历了许多重大的演变和设计决策。本文的目的是要从头到尾经历该协议经历的各种演变。故意在协议实现(如Geth,cppethereum,pyethereum和EthereumJ)上进行的无数工作以及以太坊生态系统中的应用程序和业务的历史超出了范围。

Casper和分片研究的历史也超出了范围。虽然我们当然可以写更多博客文章来谈论弗拉德,加文,我本人和其他人提出的所有各种想法,但都被丢弃了,包括“工作量证明”,轮辐框架,“超立方体”,影子链(可以说是等离子的前身),链纤维和Casper的各种迭代,以及弗拉德关于共识协议中的参与者激励及其属性的推理的迅速发展的思想,这也将是一个非常复杂的故事,无法经历在一篇文章中,所以我们暂时将其省略。

让我们首先以最早的版本开始,该版本最终成为以太坊,而在当时它甚至还没有被称为以太坊。2013年10月,当我访问以色列时,我在Mastercoin团队度过了很多时间,甚至为他们提出了一些功能。在花了好几次思考他们在做什么之后,我向团队发送了一个建议,使他们的协议更通用,并支持更多类型的合同,而无需添加同样庞大而复杂的功能集:

https://web.archive.org/web/20150627031414/http://vbuterin.com/ultimatescripting.html

请注意,这与以太坊的后来和更广阔的愿景相去甚远:它纯粹专注于Mastercoin试图专门研究的东西,即两方合同,其中甲方和乙方都投入资金,然后他们后来根据合同中指定的公式提取资金(例如,打赌会说“如果发生X,则将所有钱都交给A,否则将所有钱都交给B”)。脚本语言不是图灵完整的。

万事达币团队对此印象深刻,但他们对放弃为实现这一目标所做的一切不感兴趣,我越来越相信这是正确的选择。因此,大约在12月的版本2出现了:

https://web.archive.org/web/20131219030753/http://vitalik.ca/ethereum.html

在这里,您可以看到大量重新整理的结果,主要是我意识到有可能将智能合约全面推广之后,我于11月在旧金山进行的漫长跋涉。合同不是脚本语言仅是描述两方之间关系条款的一种方式,而是合同本身就是功能完备的帐户,并具有持有,发送和接收资产,甚至维护永久性存储的能力(那时,永久存储称为“内存”,唯一的临时“内存”是256个寄存器)。根据我自己的意愿,该语言已从基于堆栈的机器变为基于寄存器的机器。除了这似乎更复杂之外,我对此没有什么争论。

此外,请注意,现在有一个内置的收费机制:

在这一点上,以太实际上是气体。在每个计算步骤之后,交易调用的合同余额将略有下降,并且如果合同用完了钱,执行将停止。请注意,这种“接收方付款”机制意味着合同本身必须要求发送方支付费用,如果不存在此费用,则应立即退出。该协议分配了16个免费执行步骤的配额,以允许合同拒绝非付费交易。

那时,以太坊协议完全是我自己创建的。但是,从这里开始,新的参与者开始加入这一行列。到目前为止,协议方面最杰出的是加文·伍德(Gavin Wood),他在2013年12月的about.me邮件中与我联系:

Go客户端(当时称为“ ethereal”)的首席开发人员Jeffrey Wilcke也伸出援手并开始在同一时间进行编码,尽管他的贡献更多是在客户端开发而不是协议研究方面。

“嘿,杰里米,很高兴看到您对以太坊感兴趣…”

加文的最初贡献是双重的。首先,您可能会注意到初始设计中的合同调用模型是异步模型:尽管合同A可以创建与合同B的“内部交易”(“内部交易”是Etherscan的术语;起初它们仅被称为“交易”,然后再进行“消息调用”或“调用”),则内部事务的执行要等到第一个事务的执行完全完成后才能开始。这意味着交易不能使用内部交易作为从其他合同中获取信息的方式。唯一的方法是EXTRO操作码(类似于SLOAD,可以用来读取其他合同的存储),后来在Gavin和其他人的支持下也删除了它。

在实施我的初始规范时,加文自然地同步实现了内部事务,甚至没有意识到意图是不同的-也就是说,在加文的实现中,当合同调用另一个合同时,内部交易会立即执行,并且一旦执行完成, VM返回创建内部交易的合同,并继续执行下一个操作码。在我们两个人看来,这种方法都比较优越,因此我们决定将其纳入规范。

其次,他和我之间的讨论(在旧金山散步期间,因此确切的细节将永远遗忘于历史之风中,并且可能会在NSA的深厚档案中被复制一两本),导致对交易费用模型,从“合同付款”方式转变为“发送者付款”方式,并且还转换为“天然气”架构。交易发送者支付并分配了一些“ gas”(大致是计算步骤的计数器),而不是每个单独的交易步骤立即夺走了少量的以太币,而计算步骤则从这种gas余量中提取。如果交易用光了天然气,那么该天然气仍将被没收,但是整个执行将被还原;这似乎是最安全的做法,因为它删除了整个“

从以太坊视为构建可编程货币的平台,基于区块链的合同可以持有数字资产并根据预设规则将其转移到通用计算平台,从而将视野微妙的变化也可以归因于加文。首先是重点和术语上的细微变化,后来随着对“ Web 3”集成的日益重视,这种影响变得越来越强,该集成将以太坊视为一套分散式技术的一部分,另外两项是Whisper和Swarm。

其他人在2014年初也提出了一些建议。在安德鲁·米勒(Andrew Miller)和其他人提出这个想法之后,我们最终回到了基于堆栈的体系结构。

查尔斯·霍斯金森(Charles Hoskinson)建议从比特币的SHA256切换到较新的SHA3(或更准确地说,是keccak256)。尽管有一段时间存在争议,但与Gavin,Andrew和其他人的讨论导致人们确立了将堆栈上的值的大小限制为32个字节。正在考虑的另一种选择是无限制大小的整数,其问题在于,很难弄清楚要为加法,乘法和其他运算充电多少气体。

我们在2014年1月想到的最初的挖掘算法是一种叫做Dagger的装置:

https://github.com/ethereum/wiki/blob/master/Dagger.md

匕首以“有向无环图”(DAG)命名,DAG是算法中使用的数学结构。这个想法是,每N个块,就会从种子中伪随机生成一个新的DAG,而DAG的底层将是一个节点的集合,这些节点需要几个千兆字节来存储。但是,在DAG中生成任何单独的值将只需要计算几千个条目。“匕首计算”涉及在此底层数据集中的随机位置获取一定数量的值,然后将它们哈希在一起。这意味着有一种进行Dagger计算的快速方法-已经将数据存储在内存中,而一种缓慢但不占用内存的方法-从DAG重新生成您需要从头获取的每个值。

该算法的目的是要具有与当时流行的算法(如Scrypt)相同的“内存硬度”属性,但仍对轻客户端友好。矿工将使用快速方式,因此他们的挖掘将受到内存带宽的限制(理论上,消费者级RAM已经非常优化,因此很难通过ASIC对其进行进一步优化),但是轻型客户端可以使用无内存但速度较慢的版本进行验证。快速的方法可能需要几微秒,而缓慢的但不占用内存的方法可能需要几毫秒,因此对于轻型客户端而言仍然非常可行。

从这里开始,该算法将在以太坊开发过程中发生多次更改。我们经历的下一个想法是“自适应工作证明”;在这里,工作量证明将涉及执行随机选择的以太坊合约,并且有一个聪明的理由可以预期它会抵抗ASIC:如果开发了ASIC,竞争性矿工将有动力创建和发布许多合约, ASIC不擅长执行。故事说,因为没有用于通用计算的ASIC,因为它只是一个CPU,所以我们可以改用这种对抗性激励机制来证明本质上是在执行通用计算的工作量证明。

之所以崩溃,原因很简单:远程攻击。攻击者可以从第1块开始建立一条链,然后仅用简单的合同就可以填充,他们可以为其创建专用硬件并迅速超越主链。所以…回到画板。

下一个算法是一种称为“随机电路”的算法,在我自己和弗拉德·扎姆菲尔(Vlad Zamfir)的提议下,在此Google文档中进行了描述,并由Matthew Wampler-Doty等人进行了分析。这里的想法还在于在挖掘算法内部模拟通用计算,这一次是通过执行随机生成的电路。没有确凿的证据表明基于这些原理的某些方法行不通,但是我们在2014年接触的计算机硬件专家对它持相当悲观的态度。Matthew Wampler-Doty本人根据SAT解决方案提出了工作证明,但最终也遭到了拒绝。

最后,我们全面介绍了一种名为“ Dagger Hashimoto”的算法。有时简称为“ Dashimoto”,它借鉴了Thaddeus Dryja的工作量证明算法Hashimoto的许多想法,该算法证明了“ I / O绑定工作量证明”的概念,其中采矿速度的主要限制因素是不是每秒散列,而是每秒MB的RAM访问。但是,它结合了Dagger的DAG生成的轻客户端友好数据集的概念。经过我自己,Matthew,Tim和其他人的多轮调整之后,这些想法最终融合到了我们现在称为Ethash的算法中。

到2014年夏天,该协议已相当稳定,但主要的例外是工作量证明算法,该算法要到2015年初左右才能进入Ethash阶段,并且以Gavin的黄纸形式存在一个半正式的规范。

2014年8月,我开发并介绍了叔叔机制,该机制使以太坊的区块链具有更短的区块时间和更高的容量,同时减轻了集中化风险。这是PoC6的一部分。

与Bitshares团队的讨论使我们考虑将堆添加为一流的数据结构,尽管由于时间不足,我们最终没有这样做,后来的安全审核和DoS攻击将表明,这实际上比我们要难得多当时以为可以安全地执行此操作。

在9月,Gavin和我计划了协议设计的下两个主要更改。首先,除了状态树和事务树之外,每个块还将包含一个“接收树”。接收树将包含事务创建的日志的哈希值以及中间状态根。日志将允许交易创建“输出”,这些输出保存在区块链中,并且轻客户端可以访问,但将来的状态计算无法访问。这可用于允许分散的应用程序轻松查询事件,例如令牌转移,购买,正在创建和填写交换订单,正在开始拍卖等。

还考虑了其​​他想法,例如在事务的整个执行跟踪中制作一棵Merkle树,以证明一切。选择日志是因为它们是简单性和完整性之间的折衷。

第二个是“预编译”的思想,解决了允许在EVM中使用复杂的密码计算而不必处理EVM开销的问题。我们还经历了关于“本地合同”的更多雄心勃勃的想法“,如果矿工对某些合同进行了优化实施,他们可以“投票”降低这些合同的汽油价格,因此大多数矿工可以更快执行的合同自然会降低汽油价格;但是,所有这些想法都被拒绝了。因为我们无法提出一种实现这种事情的密码经济上安全的方法,所以攻击者总是可以创建一个执行陷阱门加密操作的合同,将陷阱门分发给自己和他们的朋友,以使他们更快地执行此合同,然后拒绝汽油价格并将其用于网络DoS,取而代之的是,我们选择了较少的雄心勃勃的方法,即针对哈希和签名方案之类的常见操作,使用协议中简单指定的少量预编译。

加文还是在开发“协议抽象”概念时的关键初始声音-将协议的许多部分(例如以太币余额,交易签名算法,随机数等)作为合同移入协议本身,其理论最终目标是达成协议在这种情况下,整个以太坊协议都可以描述为对具有某种预初始化状态的虚拟机进行函数调用。这些想法没有足够的时间进入Frontier的初始版本,但是通过一些君士坦丁堡的变更,Casper合同和分片规范,预计这些原理将开始慢慢整合。

所有这些都在PoC7中实现;在PoC7之后,该协议并没有真正改变,除了很小的例外,尽管在某些情况下很重要,但细节将通过安全审核得出…

在2015年初,Jutta Steiner等组织了发布前的安全审核,其中包括软件代码审核和学术审核。软件审计主要针对分别由Gavin Wood和Jeffrey Wilcke领导的C ++和Go实现,尽管对我的pyethereum实现也进行了较小的审计。在这两次学术审核中,一项是由Ittay Eyal(具有“自私采矿”的声誉)进行的,另一项是由Andrew Miller和其他最低权力机构进行的。进行Eyal审核后,对协议进行了较小的更改:链条的总难度将不包括叔叔。在最权威的审计更侧重于智能合约和天然气经济学,以及Patricia树。这次审核导致了一些协议的更改。一个小小的方法是使用sha3(addr)和sha3(key)作为Trie密钥,而不是直接使用地址和密钥。这将使在Trie上执行最坏情况的攻击变得更加困难。

而且警告可能比它的时间提前了太多……

我们讨论的另一重要事项是气体限制投票机制。当时,我们已经对比特币区块规模辩论中缺乏进展感到担忧,并希望在以太坊中拥有一种更灵活的设计,可以根据需要随时间进行调整。但是挑战是:最佳极限是多少?我最初的想法是动态限制 实际天然气使用量的长期指数移动平均值,因此从长远来看,平均区块将是

满的。但是,安德鲁(Andrew)指出,这在某些方面是可以利用的-特别是,想要提高限额的矿工只会将交易包含在自己的区块中,这些交易消耗大量的瓦斯,但处理时间却很少,因此总是完整块不花钱自己。因此,该安全模型至少在向上方向上相当于使矿工简单地对瓦斯限制进行投票。

我们没有设法提出一个不太可能突破的气体限制策略,因此,安德鲁(Andrew)推荐的解决方案是简单地让矿工明确地对气体限制进行投票,而默认的投票策略是 EMA规则。原因是我们距离设置最大气体限制的正确方法还差得很远,任何特定方法失败的风险似乎都大于矿工滥用投票权的风险。因此,我们也可以简单地让矿工对瓦斯限额进行表决,并接受限额可能过高或过低的风险,以换取灵活性和矿工共同协作以迅速调整的能力的好处。上限根据需要向上或向下。

在Gavin,Jeff和我之间举行了一次迷你黑客马拉松之后,PoC9于3月发布,旨在成为概念发布的最终证明。一个使用奥林匹克网络的测试网运行了四个月,使用的是原本打算用于实时网的协议,以太坊的长期计划得以制定。Vinay Gupta在博客文章“以太坊启动过程”中描述了以太坊livenet开发的四个预期阶段,并为其指定了当前名称:Frontier,Homestead,Metropolis和Serenity。

奥运跑了四个月。在最初的两个月中,各种实现中发现了许多错误,发生了共识失败等问题,但是在6月前后,网络明显趋于稳定。7月,决定冻结代码,然后发布版本,并于7月30日发布版本。

欢迎使用OKX交易所
3 回复

你字多你赢了,我以为你不知道以太经典,想进来解答一下,牛批哄哄的进来,歪歪扭扭的出去

感謝老鐵的分享,內容非常受用,讓我又學習了

谢谢楼主的分享 关于以太坊 确实有很多值得学习的地方

回到顶部