以太坊硬分叉后,出现了两条链。 所谓跨链重放攻击,说的是把合约中的交易从一条链挪到另条链再来一次。
这个话题开始是在社交媒体上唠起来的,有位叫Peter Vessenes的盆友在自己的博文
Hard Fork And Replay Concernsvessenes.com
中愉快的讨论了诸如重放攻击、跨链交易所爱出毛病的地方还有跨链玩耍时随机数的玩法等topic。
但是,这位盆友似乎是没掐住要点。
跳链的合约输入(Chain Hopping Contract Inputs)
跨链攻击最大的问题涉及智能合约。
好比,A链上正进行着一场正经的多人纸牌游戏。 分叉后,A链上的每个动作在B链上也视为合法,那么同样的动作序列可以在B链上实例化并重放。就是说,每个玩家的动作只能按顺序进行。说白了,既不能重新排列单个玩家的交易; 也不能为玩家编出个虚假交易来。但是,由玩家挨个提交输入的回合制游戏中,攻击者在B链上按顺序的方式重放这些输入时,自己的反应是可以变的。
这种游戏中,结果依赖于玩家的动作顺序,那么,鸡贼点的A链玩家可以根据A链的结果,设计出某种交易(顺序),然后在B链上舞弊获胜。
照这么说,啥游戏也不安全了?
也不是,井字棋这种,舞弊真就有点low惹。
这里关注的终点不是游戏,而是:像多玩家扑克这种,若编写时允许漏掉玩家输入,黑起来可能比较容易。
攻击后果
一种后果是:跳链肯定会让参与者以后很难从A链转到B链。 A链上得来的coin可能B链上就是没有。这一点实际上也算正常:A链上的交易历史没必有在B链上完整重放,因为交易往往取决于区块编号。 所以问题没有看起来那么可怕,因为没有修改到隐式合约。
另一种严重点的后果是:生事者可能从一条链中窃取价值。 跨链重放攻击者能够选择性的重放事件,借此从B链上获利,好比建了个泵,在A链上发现交易,然后在B链上榨取价值,直到榨干这些可重放交易中的(分叉前就有的)ETH。也就是说持有大量分叉前coin的场所一般是攻击者偏爱的宝地。
实际后果
跨链重放攻击下,人们要么主动防御,要么选择一条链一直走到黑。意思是建议被动防御的盆友们,只跟自己认为是多数链(也就是说经济量比较多)上的智能合约交互。 虽说少数链易受跳链的影响是真的,但是反过来也为迅速生成一条统一的新链提供了(群众)基础。这种聚少成多并非坏事,也就是所谓的“谢林点”,为众人的行为提供了一个焦点(focal point)。
最简单的重放攻击防御是执行依赖区块哈希的分叉,能将自己的coins发送至两条链上的不同钱包。 这里,有些代码能把coins随机分给两条链上的不同钱包地址,进而阻止后续重放(注意:有鉴于这个方案是概率性的,调用需谨慎,并确保两条链上的结果不同)。
分叉后,改主意了,换地方行不?
理论上说可以,想去哪条链真是个人选择,只要不参与那些易受跨链攻击分叉上的活动,其实okay的。 若采用分发coins到两条链的方案,相当于给自己以后换地方留了条后路。 但是,但是,切换链也意味着将一些东西(交易)留在身后。
然而。
考虑下这个问题:分叉是围城么?
没看爽的盆友,推荐这篇文章:
网友评论