BTC.com手机客户端

以太坊硬分叉可能会因为这些问题而失败

隔夜的粥 发布在 竞争币 2 2553

译者注:原文作者Emin Gün Sirer是康奈尔大学的教授,在The DAO遭遇黑客攻击之前,他就指出了The DAO存在的多个漏洞,并呼吁临时性暂停The DAO。攻击发生之后,以太坊开发团队发布了紧急软、硬分叉应对方案,对此,Emin Gün Sirer教授又指出了软分叉存在的漏洞,而这一漏洞,也致使以太坊社区放弃了软分叉方案。现在,Emin Gün Sirer教授又提出了这次以太坊硬分叉方案所存在的问题。

Snip20160720_18
以太坊分叉很快就会发生了,我最近研究了一下,以下就是我所看到的关于这次分叉的一些担忧和问题,以及关于这次硬分叉的去中心化管理的一些尚不成熟的想法。我会把我所有考虑到的问题都摆到桌面上,但并不是每一个潜在的问题都会变成现实的问题。如果我们能够有条不紊地向自己证明,这些问题都不值得去担心了,那它们也就不再是问题了。然而,如果你大量持有了以太币,却无法冷静地处理可能的问题,那你最好不要看这篇文章。

好的,让我们深入研究可能出现的问题:

  1. 这次硬分叉包含了硬分叉策略(其确定了人们取回以太币的方式)、客户端代码(以太坊以不同的语言实现了多个版本的客户端)、以及退款合约。
  2. 社区本身通过一次讨论过程决定了这个硬分叉策略。我将其认定为是一个给定的策略。
  3. 硬分叉策略的意图,于我来说是很合理的。群众只关心结果,而不是手段。
  4. 这个硬分叉策略,并没有解决那些在受托多重签名合约当中丢失的币的问题 , 所以他们的期望具体到wei(以太币单位),这是有必要的。
  5. 客户端代码的更改(geth 和 parity)似乎是非常简单的,这是一次干净硬分叉的优势之一。核心代码很容易去检查,我检查了一下geth客户端的代码,似乎是没有问题的。
  6. 接下来就是新的退款合约。它由三个部分组成,我想逐一来解释,它们分别是:退款引擎,代币机制,以及受影响子DAO的计数与分类。
  7. 我还没有查看这些计数和分类子DAO的代码。这项工作涉及到适量的区块链取证,以及用于解析以太坊区块链的一些手动验证。我的假设,是基于那些已测试的二手报告 。
  8. 用于跟踪账户余额的退款引擎,其脱离了代币机制,我觉得它还是ok的,但我觉得它的编写方式并不是最佳的,或者说不是深度防御的。

下面是当前的代码:

 



// Deployed on mainnet at 0xbf4ed7b27f1d666546e30d74d50d173d20bca754

contract DAO {
function balanceOf(address addr) returns (uint);
function transferFrom(address from, address to, uint balance) returns (bool);
uint public totalSupply;
}

contract WithdrawDAO {
DAO constant public mainDAO = DAO(0xbb9bc244d798123fde783fcc1c72d3bb8c189413);
address public trustee = 0xda4a4626d3e16e094de3225a751aab7128e96526;

function withdraw(){
uint balance = mainDAO.balanceOf(msg.sender);

if (!mainDAO.transferFrom(msg.sender, this, balance) || !msg.sender.send(balance))
throw;
}

function trusteeWithdraw() {
trustee.send((this.balance + mainDAO.balanceOf(this)) - mainDAO.totalSupply());
}
}

而下面这些问题,是我最为担心的:

  1. 我不明白为什么受托人地址并没有被标明为“恒定的”。我认识到,没有任何代码可以更变受托人的地址。但为何the DAO地址却被标明为恒定的?如果还是这个样子,从the DAO灾难当中,我们就什么都没有学到。把所有的意图和假设记录在代码当中,这才是正确的姿势。
  2. 这个trusteeWithdraw() 函数似乎是单独为受托人的多重签名的使用而设的。因此,它应该是有一个拒绝调用的功能修改器,除非它们是来自受托人的地址。而缺乏这种修改器,让我回想起我在读研期间的一件事,那个时候我卖掉了自己的摩托车,然后买来了一辆二手车。我注意到那辆车的进气口,就设在发动机缸体的的后面,因此只要有一个地方漏油,就会造成有毒气体进入车内。我想:”哇,这些德国工程师真棒,他们竟然如此自信,故意把进气口放置在了这个位置,为的就是向世人展示,他们确信这些密封垫是绝不会泄漏的。” 后来,我的发动机漏油了…… 最后,我只好把这俩车捐给了慈善机构。长话短说,这种傲慢的行为其实是愚蠢的。应该加入这种修改器。
  3. 退款引擎的关键弱点是,其对the DAO代币管理的不可侵犯的独立性,接下来,我会讨论这个问题。

 

  1. 当前的实现方法,依赖于旧DAO代币管理的完整性,我觉得这是相当危险的。从哲学上来说,如果我们仅仅是因为“黑客利用了一个小漏洞”,而展开这次硬分叉,那么依靠于旧的代币记账就是有意义的。毕竟,旧的DAO是完全正常的,我们将修复这个小故障。但是,这并不是真的,这也是我不主张这个硬分叉方案的原因。事实上,这种狭隘的思想会让我们陷入麻烦。我相信,这次硬分叉依赖于旧DAO,这在多层次上是错误的。因此,我假设,我们把旧的DAO全部认定为不值得信任的,那么就会激励出不同的策略。
  2. 其结果是,如果我设计了这次硬分叉,我会在某个确定的区块冻结DAO 代币余额,然后基于冻结余额建立退还地址的列表。在冻结点后的dao代币交易,将因为这个退款合约而拥有0的可兑换价值。
  3. 我曾向当前硬分叉的开发者提出了这个建议,但他们赞成目前的方案。公平地讲,目前的做法是简单的,它不需要信任方,但它容易遭受到攻击。我的建议并不依赖于旧的DAO,但其最简单的实现,可能会依赖于执行计算的受托人。
  4. 我并不是说想要让他们去采用我的方法,我做这个只是因为觉得有趣……
  5. 还有就是,价值约有1.15亿美元的币处在危险之中。这就创建了一个利润丰厚的漏洞赏金,尽管它是一种非法所得:任何人都会去查看它的代码,看能否发现它的缺陷。然而,没有人会有动力去揭示他们发现了什么。没有人可以为黑客提供1.15亿美元或者1150万美元的货币补偿。这应该是相当令人担忧的,而意识到缺陷的白帽黑客,可能会通过漏洞把钱收集起来,而不是等待别人去发现。
  6. 如果受托人正确地做好他们的本职工作, 任何影响计算子DAO代币的漏洞,都应该是无关紧要的。
  7. 那针对主DAO的代币记账的攻击,其可能性有多大?不太可能发生,但并不是说就是不可能的。
  8. 因为DAO的代币目前还在市场上交易,攻击可能已经浮出水面。倘若我是这名攻击者,我就会等待合约退还成以太币的那一刻发动攻击,那么我就可以提取更多的现金,而不是恶化这个消瘦的DAO 代币市场。
  9. 也有可能会出现字节码/ EVM级(bytecode/EVM-level)的攻击,可能会突袭这个退款合约。虽然其存在的可能性并不大,但我们不能排除掉。低级的漏洞可能会比退款合约的影响会更大。但由于退款合约所隐藏的漏洞赏金问题,我们可能会看到这种错误会随着这次硬分叉而浮出水面。
  10. 我还谈到了重放攻击( replay attacks)的问题。在分叉后,攻击者可以用一个智能合约在一条链上进行互动,然后在另一条链上重新进行。举例来说,我可以和你在一条链上进行井字游戏,并在其他的链上去重复你的动作,以改变我的对策,然后获得胜利。但这些攻击针对的,只是那些放在弱链上的钱,它会让弱链更快速地消亡。如果你正在编写,或已经编写了一个处理大量现金的合约,请咨询下专家,确保能够安全地应对重放攻击。
  11. 当然,如果大部分人都拧成了一股绳,那么我们会看到弱链很快就会死亡。然而,市场上有很多人将以太坊视为其他加密货币的威胁,巴不得它会失败。此外,也有部分人特别希望以太坊的硬分叉以失败告终。因此,这些人可能会在弱链上持续挖矿一段时间。如果发生了这种情况,不要惊慌,因为如果没有交易所支持交易弱链币,弱链也就成了一个无害的测试链。请记住,没有经济支持的矿工是没有威胁的。

 

以上是我对这次硬分叉的一些担忧,请记住,并不是每一个关心点都会成为一个真正的问题:分布式系统研究人员在本质上是偏执狂。我们关心的是揪出所有的漏洞,并确保一次有序的分叉。我希望我的大多数担忧都是多余的,如果真的是这样,我会很高兴。

目前,我还没有强有力的理由,能够证明这个硬分叉代码可能会遭受黑客攻击,但我希望能在分叉前找出它。

当然,我相信,硬分叉会是最简单的解决方案,它的风险是可控的,而且,最重要的是,我对以太坊社区充满了信心,我相信他们会通过技术讨论解决这些问题。

 

跟进

 

我把这篇文章的草稿发给了一些朋友,并收到了一些反馈意见,对此我很感激。

Christoph Jentsch对这篇文章的草稿提供了富有见地的评论,并指出了退款合约会涉及的功能列表。让我感到高兴的是,Vitalik也回应了一个经过深思熟虑的证明概述,如果他愿意的话,我会和他讨论这个问题。

巧合的是,以太坊社区今天还推出了一个硬分叉漏洞悬赏。Christoph也指出说,早已存在了另一个漏洞悬赏,这些都是伟大的发展。

发文时比特币标准价格 买价:¥4502.83 卖价:¥4500.48
原文:http://hackingdistributed.com/2016/07/19/how-ethereum-hard-fork-can-fail/
作者: Emin Gün Sirer
编译:隔夜的粥
稿源(译):巴比特资讯(http://www.8btc.com/how-ethereum-hard-fork-can-fail)
版权声明: by nc" sa 作者保留权利。文章为作者独立观点,不代表巴比特立场。

评论:2

您需要登录后才可以回复 登录|注册
    Author Image
    鼻涕彼 141 天前

    以太坊的漏洞看样子有很多哈,分叉发生后,估计又得出现什么好戏了

    +1
    +1
    我要点评
    巴比特资讯
    巴比特资讯 141 天前

    【以太坊硬分叉可能会因为这些问题而失败 】作者Emin Gün Sirer是康奈尔大学的教授,在The DAO遭遇黑客攻击之前,他就指出了The DAO存在的多个漏洞,并呼吁临时性暂停The DAO。攻击发生之后,Emin Gün Sirer教授又指出了软分叉存在的漏洞,而这一漏洞,也致使以太坊社区放弃……http://t.cn/RtZkDM9

    +1
    +1
    我要点评