二维码

9.6 去中心化的自治组织 - 数据结构 - 机器学习

1433 人阅读 | 时间:2021年01月15日 01:19
9.6 去中心化的自治组织 - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

9.6 去中心化的自治组织

1273 人参与  2018年09月30日 14:06  分类 : 区块链精品文章  评论

9.6.1 去中心化的自治组织简介

去中心化的自治组织DAO(Decentralized Autonomous Organization)是随着数字加密货币和区块链技术的普及而流行起来的概念。去中心化的组织最早出现在美国作家奥里·布莱福曼(Ori Brafman)在2007年出版《海星和蜘蛛》一书中,描述如下:蜘蛛是中心化(细胞)组织的例子,如果把它的头切掉后(整个组织)就无法生存了。海星 则是由彼此对等(无中心)的一堆细胞组成的,海星撕下的每只触手都可成长为完整的海星。海星和蜘蛛分别代表现实世界中去中心化和中心化的两种组织。海星型 组织在遇到挫折和冲突被分解的时候,其组织将变成更小的去中心化组织,继续发挥作用;而蜘蛛型组织在首脑被割掉之后,将无法继续运作。相比之下,海星型去 中心化运作的组织将具有强大的生命力。

奥里的去中心化组织概念更多的是指人类组织的互相协作方式。近年来,由于去中心化的区块链技术发展,特别是智能合约的 出现,演变出以机器代替人类执行事务的去中心化的自治组织(DAO)。如果组织是商业公司的形式,有时候也称作去中心化的自治公司 DAC(Decentralized Autonomous Corporation)。DAO目前没有严格的定义,但通常是指一个去中心化组织用计算机程序来描述和实现所有业务规则,并且无需人类的管理和干预,也 能够自我运作。DAO之所以能成为现实并生根发芽,离不开它最重要的技术基础——区块链。

区块链本质上是去中心化的分布式数据库,数据复制到整个网络的所有节点上,靠多数节点间的共识来保持数据的一致性。只 要节点数目足够多、分布足够分散,就没有一个人或组织能够控制和决定所有节点的行为。有了区块链这个去中心化的基础平台,自治组织就可以定义各种组织规 则,然后用计算机程序来表述并且在区块链网络上运行,这种区块链上的程序通常称为“智能合约”(Smart Contract)。智能合约中的“合约”是指用计算机代码确定下来的逻辑规则,发布到区块链网络后,形成一种不可更改的公开契约,所有人都可以监督契约 的内容及其执行。而智能合约的“智能”,是指计算机程序能够根据各种不同的情况(即智能合约的调用参数以及节点的状态),做出不同的响应。综上所 述,DAO就是运行在区块链网络上的、体现组织规则的智能合约。区块链网络保证了其去中心化特性,并通过铁面无私的机器执行智能合约来确保其自治性。

DAO是人类史上前所未有的组织形式,成员甚至可以匿名参与并且不分国界。作为一个社会或经济实体,目前各国均无法界 定它的法律地位,甚至在某些国家可能会被认定为非法。另外,由于DAO所有的组织规则都蕴含在代码当中,所谓“代码即法律”(Code is Law),评判是非曲直完全依据代码所表达的意义,在很多场合,特别是与现实社会中的道德准则发生碰撞时,将难以辨析DAO所承担的社会责任。

目前已经有一些DAO创建出来了,如Dash、DigixDAO和The DAO。其中最具有代表性和争议性的是The DAO,前前后后发生了许多足以记入史册的事件,引发了区块链系统中的部分问题,如智能合约的漏洞处理、软分叉、硬分叉、重放攻击等。让我们一起来看看 The DAO事件引起的争议和带给人们的思考。

9.6.2 The DAO项目

The DAO是由Slock.it公司发起的一个众筹项目。Slock.it原先计划通过物联网和区块链技术,提供智能锁等设备,把人们之间的租赁关系用去中心 化的方式建立起来,如租房、租自行车等。他们打算采用DAO的模式来运作这套租赁系统,于是,几个创始人就开发了在以太坊平台上的智能合约,可以众筹到所 需的资金(以太币形式),并且可以按照一定的规则运作(如出租自行车等),在取得经营上的收益后,可以回馈众筹参与者。在开发的过程中,他们发现这个智能 合约的框架可以被其他类似的DAO项目重新使用,所以他们改变了主意,决定创建The DAO,意为“DAO之母”(The Mother of all DAOs)。创立The DAO的想法,由于思路独特新颖,前途光明,吸引了众多人的关注,众筹额一路攀升,在2016年5月结束的时候,筹集的资金竟达到了1.6亿美元,一举成 为史上最大的众筹项目。

那么,拥有万众瞩目的The DAO到底是怎么运作的呢?总体上说,The DAO有如下几个特点:

1)The DAO本质上是个风险投资基金(Venture Capital,VC),通过以太坊筹集到的资金会锁定在智能合约中,没有人能够单独动用这笔钱。更重要的是,该组织只存在于虚拟的数字世界中,不受任何 政府监管约束,无国界。且资金是加密数字货币的以太币(Ether)形式,其行为由智能合约中的代码来主导(因此称作“自治”)。

2)每个参与众筹的人按照出资数额,获得相应的DAO代币(token),具有审查项目和投票表决的权利。从这点上说,DAO代币有点像股票,众筹参与者是股东。代币还有另一个作用,就是持有人有权提出投资项目的议案,供The DAO审核。

3)投资议案由全体代币持有人投票表决,每个代币一票。如果议案得到需要的票数支持,相应的款项会划给该投资项目。在 传统基金中,投资策略是由经验丰富的基金经理等专业人士制定的。而在The DAO中,决策来自于“众智”(the wisdom of the crowd)。众智的概念最早可以溯源到亚里士多德关于政治的论述,其原理是:综合许多人的智慧,可以做出比某个专家更好的结论。现实生活中这类例子很 多,如陪审团、维基百科的编制、《百万富翁》游戏中的询问观众等。当然,这里抛开了纯粹的“众智”,而加入了出资额的权重。

4)投资项目的收益会按照一定规则回馈众筹参与人(股东)。当然,并不是每个项目都有收益,或者能够盈利,而且一般来说会是风险较高的项目,可以靠分散投资来降低风险。

需要指出的是,Slock.it即便是The DAO代码的缔造者,也无法从规则或控制权上获得先天优势,他们也需要向The DAO提出申请来获取资金。因为The DAO一旦启动运作,就由刚正不阿的机器和预设的程序代码不改初衷地执行,这也是人们信赖The DAO的原因。

本来The DAO筹集完资金就开始运作了,但却发生了一件惊天动地的事情——The DAO的智能合约出现了漏洞(即程序的bug),被黑客利用,并把超过30%资金的360多万个以太币(约5000万美元)转移到黑客控制的子DAO账号 中,并且在理论上黑客可以把所有资金偷光。既然已经知道被攻击了,为什么不能赶紧采取措施阻止剩余资金继续被盗呢?个中原理和The DAO的去中心化机制有直接关系。智能合约的代码一旦发布出去,就无法更改,除非事先留有可应急“刹车”的后门。但是The DAO的目标是完全自治的去中心化组织,绝对不允许有这样的后门。因此,即使发现了代码中的bug,却无法制止这种行为,所有人都只能眼睁睁地看着钱被偷 走而无能为力。

9.6.3 代码漏洞分析

本节分析The DAO代码的缺陷,完整的代码可在Github网站上下载(https://github.com/TheDAO/DAO-1.0 )。根据The DAO白皮书的设计,代码中splitDAO函数的运行可以分裂出一个小规模的DAO。这个函数的本意是要保护投票中处于弱势地位的少数派,防止他们被多 数派通过投票的方式合法剥削。通过分裂DAO,给予他们一个拒绝的机制,同时仍然确保他们可以获取分裂前进行的对外资助产生的可能收益。

splitDAO会创建childDAO(如果不存在的话),将分裂者拥有的以太币转入childDAO中,支付任何已产生的报酬(Reward),然后返回。攻击者利用了这一目前唯一可行的提取以太币的机制,创建childDAO并将以太币持续地转入给定的账户。

攻击者分析了DAO.sol代码,发现splitDAO函数在递归发送模式上存在漏洞:该函数只是在最后才修改用户的结余和交易总额,如果能够在返回splitDAO处理这些运算之前,进行多次以太币操作调用,就能通过多次递归来持续转移以太币到其他账户。

splitDAO函数中与漏洞相关的代码段如下,我们将逐一分析。


function splitDAO(
   uint _proposalID,
   address _newCurator
) noEther onlyTokenholders returns (bool _success) {
   ...
   // 转移以太币并赋予新的代币,注意,这是首先运行的代码
   uint fundsToBeMoved =
       (balances[msg.sender] * p.splitData[0].splitBalance) /
       p.splitData[0].totalSupply;
   if (p.splitData[0].newDAO.createTokenProxy.value(fundsToBeMoved)(msg.
       sender) == false) // 这是攻击者希望多次运行的代码
       throw;
   ...
   // 使用
DAO 代币
   Transfer(msg.sender, 0, balances[msg.sender]);
   withdrawRewardFor(msg.sender); // 好了,可以拿到他的报酬了
   // 注意在进行以下操作前,上一行的操作是致命的
   totalSupply -= balances[msg.sender]; // 而这在最后运行
   balances[msg.sender] = 0; // 这也在最后运行
   paidOut[msg.sender] = 0;
   return true;
}


先看看splitDAO函数的定义,函数的修饰符表示,其调用者不能为以太币(ether)账户,而应该为代币持有者(Tokenholder)账户。


function splitDAO(
uint _proposalID,
address _newCurator
) noEther onlyTokenholders returns (bool _success) {


再看下一段代码,可以用于以太币转账:计算向一个特定的调用者转账多少以太币,之后调用 createTokenProxy函数。createTokenProxy源代码在TokenCreation.sol中,它会将代币从待分裂的父DAO 转移到子DAO中。基本上攻击者就是重复调用createTokenProxy函数来获得更多的代币并转移到子DAO中。


// 转移以太币并赋予新的代币,注意,这是首先运行的代码uint fundsToBeMoved =
   (balances[msg.sender] * p.splitData[0].splitBalance) /
   p.splitData[0].totalSupply;
if (p.splitData[0].newDAO.createTokenProxy.value(fundsToBeMoved)(msg.
   sender) == false) // 这是攻击者希望多次运行的代码
   throw;


接着,最后发送以太币的代码出现了。


// 使用
DAO 代币
   Transfer(msg.sender, 0, balances[msg.sender]);
   withdrawRewardFor(msg.sender); // 好了,可以拿到他的报酬了

   // 注意在进行以下操作前,上一行的操作是致命的
   totalSupply -= balances[msg.sender]; // 而这在最后运行
   balances[msg.sender] = 0; // 这也在最后运行
   paidOut[msg.sender] = 0;
   return true;
}


上面这段代码中,先调用withdrawRewardFor函数,然后设置totalSupply、balances 以及paidOut变量。这使得合约中,为msg.sender记录的以太币余额归零、扣减以太币总量totalSupply等操作都发生在将以太币发给 msg.sender之后。很明显,这种方式会出现参数竞争(Race to Empty)攻击,如果设法在balances或paidOut变量更新前调用withdrawRewardFor多次(如利用递归方式),可能导致 withdrawRewardFor会不断地成功调用。实际上,withdrawRewardFor是有漏洞的。


function withdrawRewardFor(address _account) noEther internal returns (bool _
   success) {  
       if ((balanceOf(_account) * rewardAccount.accumulatedInput()) /
           totalSupply < paidOut[_account])
           throw;
       uint reward =
           (balanceOf(_account) * rewardAccount.accumulatedInput()) /
               totalSupply - paidOut[_account];
       if (!rewardAccount.payOut(_account, reward))
           throw;
       paidOut[_account] += reward;
       return true;
   }


这段withdrawRewardFor代码不长,一个判断加上一个payOut调用,payOut的值在rewardAccount.payOut调用之后设置,这不是良好的编程习惯。

当reward设置后,rewardAccount.payOut函数被调用,rewardAccount是Managed-Account类型的合约,其payOut函数定义如下:


function payOut(address _recipient, uint _amount) returns (bool) {  
       if (msg.sender != owner || msg.value > 0 || (payOwnerOnly && _
           recipient != owner))
           throw;
       if (_recipient.call.value(_amount)()) {
           PayOut(_recipient, _amount);
           return true;
       } else {
           return false;
       }
   }


_recipient.call.value()()调用时,没有gas数量要求。语句 recipient.call.value(_amount)()向_recipient账户转账_amount个Wei,调用默认会使用当前剩余的所有 gas,于是无论该语句调用多少次,gas限制只取决于攻击者当时可用的gas数量。

于是攻击开始了。

1)在以太坊区块链上创建一个钱包合约,包含默认的函数调用splitDAO若干次,但次数不要太多,以免gas不够。过程中还需要记录当前调用深度以控制堆栈使用情况。

2)使用钱包合约的接收人地址创建分裂申请。

3)等待若干时间让分裂完成。

4)调用splitDAO。

这时,调用栈类似如下(假设钱包仅调用两次,实际上次数更多)。


splitDao
   withdrawRewardFor
       payOut
           recipient.call.value()()
               splitDao
                   withdrawRewardFor
                       payOut
                           recipient.call.value()()


之后,攻击者就可以等待以太币源源不断地转入了。

从代码看,本次攻击成功的因素如下:

(1)应用代码顺序问题

以太币余额扣减和以太币转账这两步操作的顺序有误。应先扣减以太币的余额再转账以太币,因为以太币的余额检查作为转账 以太币的先决条件,要求以太币的余额状况必须能够及时反映最新状况。在问题代码实现中,尽管最深的递归返回并成功扣减黑客的以太币余额,但此时对黑客以太 币余额的扣减已经无济于事,因为其上各层递归调用中余额检查都已成功,不会再有机会判断最新余额了。

(2)不受限制地执行未知代码问题

虽然黑客当前利用了solidity提供的匿名fallback函数,但这种对未知代码的执行原则上可以发生在更多场 景下,因为合约之间的消息传递完全类似于面向对象程序开发中的方法调用,而提供接口等待回调是设计模式中常见的方法,所以完全有可能执行一个未知的普通函 数。

9.6.4 解决方案

由于The DAO的智能合约代码存在缺陷,发布后无法更改,因此,依靠The DAO自身去解决黑客的问题已经无望,唯一的办法是求助于The DAO的运行平台以太坊。由于问题影响巨大,甚至影响了以太坊的声誉和运作,包括创始人Vitalik在内的以太坊核心团队迅速行动,全力阻止黑客的攻 击。幸运的是,The DAO设计中有缓冲期,黑客控制的以太币要在27天后才可拿走,这留给了以太坊团队足够的应对时间。他们设计的方案分两步:

1)采用软分叉(soft fork)技术,锁定The DAO及其子DAO的账号,不允许发生任何交易,相当于冻结了黑客的以太币,使其无法出售获利。软分叉实际上是在以太坊软件中增加约束性的规则(例如不允 许某账号转账等),好处是不影响任何以太坊上已发生的交易,无需回滚区块链的数据。

2)在软分叉的基础上,实施硬分叉(hard fork),把The DAO智能合约中的以太币(包括黑客控制部分)转到一个新的智能合约当中,以便退回给众筹参与者。这种改动需要永久性改动以太坊的协议规则,相当于直接修 改The DAO和黑客的账户余额,有违区块链数据不可变更的原则。

尽管上述方案在技术上可以挽回的黑客造成的损失,却引起了社区激烈的争论,参与者有程序员、研究员、分析师、投资人、 律师等各方人士。辩论的焦点回到了老子《道德经》中的经典六字悖论:“道可道,非常道”,也就是求证天地万物最崇高的道应该如何描述。方案支持者认为,通 过更新以太坊代码,使得黑客的阴谋没有得逞,伸张了正义,维护了平台的公平性,也维护了“道”。虽然这次问题没出在以太坊平台本身,但The DAO若失败,对以太坊也是个很难抹去的污点。支持者绝大多数是The DAO或以太币的持有者。反对者则无法接受以太坊团队为单个应用(The DAO)买单而修改平台规则的行为,认为这样违反了区块链不可篡改数据、去中心化的根本原则,将大大损害以太坊的公信力和公正性,恰恰是失道之举,完全可 以说是得不偿失。两派争论的焦点是到底是保护The DAO用户的利益重要,还是维护以太坊的去中心化的公正性更重要?

从本质上看,人类发明的各种软件、工具、机器等系统都是为完成某个目标而设计的。区块链作为去中心化的系统,是为了实 现在没有中间人的情况下,保证数据的真实性和完成特定业务逻辑的方法。当区块链应用(如The DAO)出现故障,甚至造成投资人重大损失的时候,只为盲目地坚守去中心化和数据完整性而不做任何纠正,应该是舍本逐末的做法。此次修改规则,以太坊团队 只是提出建议,执行还需要多数参与者(主要是参与记账的矿工)认可才有效。由此看来,这提议还是个去中心化的决定,只不过达成共识的是理性的人类,而不是 麻木的机器。之前比特币就出现过类似故障,也是通过社区认同的方式,用硬分叉方式解决了问题。因此,从社区的反馈来看,大部分人还是支持分叉方案的实施 的。

9.6.5 软分叉和硬分叉的影响

区块链软件的升级并不是一件简单的事情,因为全网所有节点的软件更新有先有后,甚至有的节点不会更新,需要考虑不同版本软件之间互相协作的兼容性,特别是更改系统协议的软硬分叉升级,更要重视新旧协议切换带来的问题。

在软分叉升级中,因为新规则变得更严格了,新节点(升级后的节点)会拒绝某些交易的记账,而旧节点(未升级的节点)仍 认可这些交易。如果新节点占多数,那么产生的区块数据就是按照新规则的;此时,旧节点所生成的区块,由于算力小,区块高度小,而且是短链而最终被放弃。可 见,尽管在过渡期间有可能存在临时性的分叉,当多数节点都切换成新版本软件后,软分叉一般不会产生永久性分叉的链。

在硬分叉中,按照新规则产生的区块只被新节点认可,旧节点则不认为新区块合法,因此,旧节点一直用旧规则来组织自己的链,所以,无论新旧节点数目的比例如何,一定会产生两条链。若大多数节点都升级到新版本,旧链能否成活要看有多少算力的支持。

以太坊为解决The DAO的问题,首先实施了软分叉方案。简单地说,在软分叉升级后,对每个以太坊上的交易,验证节点(矿工)都会检查是否与The DAO智能合约及其子DAO的地址相关。如果是则拒绝这个交易,从而锁定The DAO(包括黑客在内)的所有资金。这个逻辑实现本身并没有问题,但是却没有收取执行交易的燃料费(gas)。当初以太坊设计的gas有两个作用:支付矿 工的交易费和增加潜在攻击者的成本。取消交易燃料费后,导致了非常严重的后果:以太坊网络成为了DoS(Denial of Service)的攻击目标(如同我国在法定节假日高速公路免费通行造成大塞车的情况一样),攻击者可以零成本发起大量无效交易,使得整个网络彻底瘫痪。 因为这个漏洞,各个节点被迫回滚了软件版本,软分叉方案宣告失败!

以太坊社区随后又设计和实施了硬分叉方案,在该方案中,软件会在第1880000区块把The DAO合约及其所有子DAO合约归入一个列表L中。在第1920000区块中,设计一个非常规的状态变更,强行把L中所有地址的余额都转到一个特定的退款 合约地址C,这个合约唯一的功能就是把众筹人的DAO币换回以太币。经过充分准备,硬分叉终于成功切换,以太坊上大部分算力都切换到了支持硬分叉的新版 本。

9.6 去中心化的自治组织 - 数据结构 - 机器学习

图9-7 硬分叉前后区块的情况

如图9-7所示是硬分叉前后时刻第1920000区块的情况,左侧数字为区块编号,右侧十六进制数代表区块的哈希值。 直线代表分叉后新链,大多数矿工都升级了软件并在这条链上记账(挖矿);曲线分支代表原(旧)链,少数没有升级的矿工,依然停留在旧链上记账。分叉后,新 链出块的速度大于旧链,说明大部分算力都已切换到新链上了。

之前在比特币等区块链上也出现过硬分叉的情况,当时绝大多数矿工都切换到新链上,旧链也就自动消亡了。可这次以太坊硬 分叉却不同,由于社区存在分歧,部分矿工还继续维护着旧链,因此旧链并未消失。后来有交易所介入并支持旧链上的以太币交易,使得旧链上的算力陡增,以太坊 由此分裂为新旧两条具有相同历史账本的区块链。

9.6.6 重放攻击

以太坊同时存在新旧两条链,为了区分,新链仍称为以太坊(货币代号:ETH),旧链则称为经典以太坊(货币代 号:ETC,Ethereum Classic)。两链的软件代码相同(除了涉及The DAO的部分),历史账本一样(分叉前),地址的私钥也一样,交易广播到两个网上都是合法的,这就引出了重放攻击(Replay Attack)的问题。如,在新链上发送货币的交易,同样会广播到旧链上,并且交易还能成功(下面一段会讲到交易失败的例外),可被利用来作为攻击手段。

假设分叉前地址A有10个ETH,地址B有50个ETH。分叉后在ETH链上从地址A转10个ETH到地址B上,再把 10个ETH从B转回A,地址A最终还是拥有10个ETH(扣除少量gas损耗),地址B的余额不变。上述交易在ETC链上也广播一次(重放),同样也会 执行从A转10个ETC到B,再从B转10个ETC到A,一切都还正常。但是,如果攻击者设法使得在ETH链上A的余额为10个ETH,在ETC链上余额 为0,上述交易在ETC链上重放时,从A转B操作会因余额不足失败;而因B的余额足够,从B转A成功,结果就是A从B取走了10个ETC。

这种重放攻击最典型的目标就是交易所,攻击者从自己的地址A向交易所地址B存币,然后发起提币请求,交易所在ETH链 上确认交易并把币转到A,殊不知这个交易在ETC链上同样执行,交易所的ETC就被人提走了。为什么目标是交易所呢?因为交易所的地址B一般存放多个客户 的ETC币,余额较大,这样攻击容易得手。

重放攻击还有一个前提,就是需要有个地址A在两条链中的余额不同,这是怎么做到的呢?最容易想到的就是The DAO的众筹人,他们在硬分叉后在ETH链上可取回自己投资The DAO的ETH币,可是这些ETH在对应的ETC链中依然存放在The DAO的合约中,因为分叉时,ETC和ETH的差别就是在The DAO合约的余额上,如图9-8所示。The DAO众筹人取回自己的ETH后,就拥有了这样一个地址,在新旧链中余额不同。下文还会介绍另一种错开地址在新旧链余额的方法。

9.6 去中心化的自治组织 - 数据结构 - 机器学习

图9-8 硬分叉前后区块数据对比

ETH和ETC同源的两条区块链并存,交易互相交错,一时之间带来使用上的混乱,在任何一条链上做交易,都要考虑在另 一条链上是否有重放影响。最好的办法还是把ETH和ETC存放在不同的地址上,从而互不影响。为了实现这个目标,可在分叉前部署一种叫作Oracle(预 言家)的智能合约,合约名称为AMIOnTheFork,代码如下:


contract AmIOnTheFork {
   bool public forked = false;
   address constant darkDAO = 0x304a554a310c7e546dfe434669c62820b7d83490;
   // 在分叉后的1920000~1920001区块之间检查分叉条件
   // 大约是在2016-07-20 12:00:00 UTC 到
2016-07-20 17:00:00 UTC之间

   // 此后,状态将锁定在变量forked中
   function update() {
       if (block.number >= 1920000 && block.number <= 1921200) {
           forked = darkDAO.balance < 3600000 ether;
       }
   }
   function() {
       throw;
   }
}


这个智能合约要在硬分叉后的第1920000区块和第1921200区块之间调用一个update()方法,该方法会 检查The DAO黑客的地址余额(darkDAO.balance)。这个调用会同时被新旧两链执行,如果是在新链的节点上执行,此时地址余额已经清零;如果在旧链 上执行,黑客地址余额必定大于3600000。这样,该合约把自己处于哪条链的状态区分出来,并记录在变量forked中,forked作为智能合约的状 态持久化到区块链上。需要注意的是,在新旧链中,forked的值是不同的,这样埋伏在区块链中的Oracle也就可作为其他合约判断新旧链的依据。

有了Oracle合约,我们就可编制一个错开账号的智能合约ReplaySafeSplit,把原来相同地址的ETH 和ETC发向不同的新地址。split()方法输入参数有新旧链中两个地址,利用Oracle提供的信息,判断合约运行在哪条链上,然后把ETH/ETC 分别转到不同的目标地址上。这个代码有点像操作系统进程fork调用之后,判断代码到底在子进程还是父进程运行。代码中用到了上述Oracle的合约,假 定它的地址是0x2bd2326c993dfaef84f696526064ff22eba5b362。通过这个防重放攻击的智能合约,在不同链上可以使 用不同的地址,从而避免了被重放的风险。代码如下:


contract ReplaySafeSplit {
   // 调用fork状态的oracle智能合约地址
   AmIOnTheFork amIOnTheFork = AmIOnTheFork(0x2bd2326c993dfaef84f69652606
       4ff22eba5b362);
   // 根据处于哪条区块链,判断以太币发向哪个账号
   function split(address targetFork, address targetNoFork) returns(bool) {
       if (amIOnTheFork.forked() && targetFork.send(msg.value)) {
           return true;
       } else if (!amIOnTheFork.forked() && targetNoFork.send(msg.value)) {
           return true;
       }
       throw;
   }
   // Reject value transfers.
   function() {
       throw;
   }
}


The DAO项目最终以失败告终,但仍是人类史上具有开拓意义的重要尝试,它试图建立完全由计算机程序控制的去中心化自治实体,实现公正、透明和开放的运作模式。当然,丰满的理想也会遇上骨感的现实,DAO超前的理念落地还需要面对很多实际问题。

首先,当自治的智能合约出现问题时,应该采用怎样的方式解决呢?一种方案是用另一个智能合约来解决产生的纠纷,但这样 又陷入一个死循环中,因为新的智能合约可能也存在问题。另外一种方案是采用众人表决的形式,这要求DAO预留解决纷争投票的接口,在需要的时候可以启用。 当然,此方案被认为自治性受到干预。

其次,区块链技术被主流社会体系认可的过程也许比较漫长,当DAO尚不能完全自治,特别是涉及金融、资产等关键业务 时,和现有法律道德体系还需要良好的衔接的方式。例如法律法规要能够适用于区块链上DAO等新生事物的行为,DAO也要定义好符合法律的规则,特别是在代 码无法自我纠正的时候,人工如何干预的方式。

通过The DAO的事件可以看到,基于区块链的去中心化自治组织依照事先编制的计算机程序来管理运作。同时,对于代码可能的出错,目前尚缺乏较为有效的恢复手段,在 一定程度上还需要人类的参与才能纠正。因此,在今后发展过程中,机器自治和人类辅助监管将很可能成为DAO系统的主要模式。

9.7 本章小结

本章描述了一些区块链和加密货币领域的常见问题,如怎样安全保存和使用数字加密货币,如何保持匿名性和隐私性,集中式 矿池带来的问题,以及去中心化自治组织DAO的运作原理和面临的挑战。可以看到,作为新生事物的区块链和加密货币,进入实用阶段还需要解决不少问题,这也 是留待今后区块链研究发展的课题。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=1000

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×