|今日推荐 | 以太坊五周年:从涅槃中苏醒( 三 )


加文在很大程度上使以太坊的愿景发生了十分微妙的变化:从一个用于构建可编程货币的平台——平台拥有基于区块链的合约 , 合约能够持有数字资产并且按照预先设置的规则进行转账——到一个通用的计算平台 。 这种变化从以太坊的着重点和术语的细微变化开始 , 后来随着我们对Web 3集成(它将以太坊视为去中心化技术套件的一部分 , 另外两部分是耳语协议和蜂群协议 , 图1)的日益强调 , 这一影响也在不断地增强 。
|今日推荐 | 以太坊五周年:从涅槃中苏醒
本文插图

图1
2014年初前后 , 我们还根据其他人的建议作了一些修改 。 在安德鲁·米勒(Andrew Miller)等人提出回到基于栈的架构这一想法以后 , 我们最终还是回去了(图2) 。
|今日推荐 | 以太坊五周年:从涅槃中苏醒
本文插图

图2
查尔斯·霍斯金森(Charles Hoskinson)建议我们从比特币的SHA256转换为更新的SHA3(或者更准确地说 , 是keccak256) 。 尽管有过一段时间争议 , 但通过与加文、安德鲁以及其他人进行讨论 , 我们还是确立了栈中的值的大小应该被限制在32 Byte 。 而另一种替代方案——无限制整数——则仍在考虑当中 , 因为该方案存在一个问题 , 即我们很难计算出执行家加法、乘法以及其他操作到底需要多少燃料 。
回到2014年1月 , 我们最初想到的挖矿算法是一个叫匕首 (Dagger) 的东西:
https://github.com/
匕首是根据有向无环图 (Directed Acyclic Graph, DAG) 命名的 。 DAG是一种用在算法中的数学结构 , 其思想是每隔N个区块 , 就会有一个新的DAG由种子伪随机生成 。 并且 , DAG的底层将会是一个需要用几十亿字节来存储的节点的集合 。 然而 , 在DAG中 , 生成任意一个独立的值只需要计算计算几千个条目 。 一次匕首计算包含在这种底层的数据集中的任意位置获得一定数量的值 , 然后将这些值一起进行哈希运算 。 这意味着存在一种快速的方式可以进行匕首计算——已经将数据存储在内存中 , 然后以一种缓慢但不会导致内存紧张的方式——重新从DAG中生成你需要从头开始获取的每一个值 。
这个算法的目的就是和当时流行的算法一样拥有相同的内存受限属性 , 就像Scrypt算法 , 但是仍然对轻客户端友好 。 矿工会使用快速的方法 , 所以他们的挖矿将受限于内存带宽 (理论上 , 消费者级别内存的优化程度已经足够高了 , 因此用ASIC对其进行进一步优化十分困难) , 但轻客户端可以使用内存宽松且缓慢的方式进行验证 。 快速方法可能只需几微秒 , 而慢速且内存宽松的方法可能需要几毫秒 , 所以这对轻客户端依然是可行的 。
从这里开始 , 这个算法伴随着以太坊的发展历程发生了几次变化 。 接下来的想法是自适应工作量证明 。 在这个方案中 , 工作量证明将会涉及执行被随机选出的以太坊合约 , 并且这里面包含了一个很巧妙的做法去抵抗ASIC:如果ASIC被开发出来了 , 那么竞争矿工就会有动机去创建并发布该ASIC不擅长执行的合约 。 没有一种ASIC能够用于通用计算 , 因为它仅仅是一个CPU 。 因此 , 我们可以利用这类对抗激励机制来实现本质上在执行通用计算的工作量证明 。
由于一个简单的原因 , 这个想法后来破碎了 。 这个原因是长程攻击 。 攻击者可以从区块 1 开始构建一条链 , 并且只用简单的合约对这条链进行填充 。 需要注意的是 , 攻击者可以为这种简单的合约设计出专门的硬件 , 从而使攻击链迅速赶超主链 。 所以......又回到了原点 。
下一个算法被称为“随机电路” , 具体的描述可以查看其Google文件 。 这个算法是我和弗拉德·赞菲尔 (Vlad Zamfir) 提出的 , 并由马修·万普勒·多蒂 (Matthew Wampler-Doty) 和其他人进行分析 。 这个算法的思路是通过执行伪随机生成电路来模拟挖矿算法中的通用计算 。 这一次 , 没有任何确凿的证据表明基于这些原则的东西是行不通的 。 但我们在2014年接触的计算机硬件专家都对此表示非常悲观 。 马修·万普勒·多蒂提出了一种基于SAT解决方案的工作量证明 , 但最终也被拒绝了 。


推荐阅读