• 精选
  • 会员

比特币系统遭到51的攻击是怎么回事

2018年7月5日  来源:科学有故事汪诘 作者:汪诘 提供人:beibeicao0......

比特币系统遭到 51% 攻击是怎么回事?

汪诘为你长文解惑04:比特币系统遭到51%的攻击是怎么回事

请回忆一下我前面讲到的区块链临时分叉的知识,在很偶然的情况下,比特币网络中会同时产生两个(甚至多个)区块,这就会导致区块链出现临时分叉,当两个临时分支的长度出现了一长一短后,短的那个(少于 2 个区块)分支就会被放弃,短分支上的所有区块被判定无效,这些区块中的所有交易记录当然也就被判定为无效了。这是一个很巧妙的设计,但同时也成为了比特币系统中唯一的公开漏洞,有可能被大矿主利用来诈骗,但也仅仅是理论上的可能性,不过作为小说的反转素材来写倒是很合适。下面具体来讲解一下如何利用这个漏洞。

现在,假设我是一个掌握了全网 51% 算力(其本质是我的算力超过了全网其他算力的总和)的大矿主,当然,诈骗要成功,必须隐瞒这个身份,装作是一个普通的比特币持有人。下面的内容你可以当小说大纲来看:

我与黑帮在一个荒郊野外进行交易,事先谈好的价格是 100 比特币买一批白粉,当面交易,一手交钱一手交货。现在的黑市交易上,比特币是最受欢迎的支付货币,因为它天生就不存在洗钱的麻烦,又有完美的匿名性。

我和毒枭一起拿出手机,我在手机上从自己的账号转账 100 比特币给毒枭的账号,毒枭也密切关注着比特币网络上的交易记录。毒枭查到,最新的第 N 个区块生成了,里面包含了转账给自己 100 比特币的交易记录。毒枭当然也不是小白,他知道最好能再多等几个新区块生成,才交货走人比较保险。这种时候,总是感觉时间走的太慢,又等了 10 多分钟,一共 3 个新区块生成了。突然远处传来警笛声!不好,可能有麻烦。我立即表现出惊慌失措,取了货就想跑路。毒枭当然也慌,他想想 3 个新区块已生成,这笔交易差不多也够保险了,还是赶紧撤了吧。于是,我和毒枭达成默契,各自分头跑路。

当然,这就是我的计谋,警笛声是我的同伙制造的。

就在第 N 个区块生成的同一时刻,远在四川的深山中,我的同伙已经把矿厂的功率开到了最大,全速运行,我们在与时间赛跑。我们抢到了一个记账权,在交易记录中,我们把刚才那条 100 比特币的转账记录删除,再打包。然后,关键操作来了。如果按照"中本聪"定下的规矩,我必须老老实实地把我生成的新区块接到第 N 个区块上。但是,比特币的客户端软件是开源的,我可以修改自己的客户端程序,我偏把新区块接到第 N-1个区块上。我也不急着把这条新分支广播到比特币网络中,而是继续开足算力,每次新做的区块我都链到我自己伪造的那条分支上。因为我的算力是 51%,超过了全网其他算力的总和,所以,无论如何,我这条分支的生长速度从长远来看,一定超过比特币网络中的主链。一旦我的这条链比主链多了 2 个区块,我的同伙立即拉响警笛,我心领神会,马上跑路。说时迟那时快,我的同伙也敲下了回车键,伪造的支链被广播到了比特币网络中,其他节点老老实实地按照"中本聪"定下的规则,只承认最长的区块链,于是,我的那条链就成为了主链,原先的那条链被放弃。

当毒枭气喘吁吁地认为跑到了安全地带,打开手机一看,自己账户中的那 100 比特币已经消失了。与此同时,我也得意地看着手机中那回来的 100 比特币。大功告成。

所有比特币网络中第 N 个区块之后的交易都失效了,无数人看到自己的比特币要么消失要么再现,整个币圈发生了大震荡,史上第一次 51% 攻击惊现比特币网络,从此人心惶惶,比特币价格大跳水,币友们的信心跌入冰点。

其实,以上描写是带着演绎成分的,什么警笛之类的,那是为了戏剧效果。实际上,真正掌握了 51% 算力的大矿主完全可以利用人们普遍认为的 6 个新区块之后交易就安全的心理,就是让毒枭耐心地等到 6 个新区块生成,放心地走掉后,再从容地让同伙把伪造的支链广播到比特币网络中。因为我掌握的算力超过了一半,所以我总是能保持支链比主链长,什么时候抛出我的支链都可以。(但最长时间不能超过 2 小时,因为系统有一条规则:超过 2 小时的区块不被接受)。

以上仅仅是 51% 攻击的一个例子,实际上还可以设计出很多种不同的诈骗方式,网上有很多讨论,各种奇思妙想。但我们回到这个漏洞的本质,不难发现,因为抢夺记账权是一种概率,所以,即便是掌握了全网 49% 的算力,也是有可能攻击成功的,算力越低,成功的可能性就越低。只是说,理论上只要大于 50% 就可以保证攻击成功。

不过,这仅仅是理论上的可能性,实际操作可谓难于上青天。因为,如果是一位新矿主想要横空出世、一鸣惊人,按照本文截稿时比特币网络的全网算力(约8000 PH/s),以及平均每 1PH/s 约人民币 900 万元的矿机公开报价来算的话,想要掌握全网超过 50% 的算力,光是买矿机的投资就是720 亿元,还不包括电费等其他成本。况且,如果是为了比特币,掌握了这么大的算力,直接挖矿好了,何必去诈骗。我实在想不出一个合理的动机,可以让某团体以这种代价来发动攻击。(或许,等我想出来,就可以成为我下一部科幻小说的素材,事实上我已经想出来了,嘘!)如果是几大老矿厂联合起来呢,看上去是有可能的,因为目前全网超过 70% 的算力都在中国,前四大矿厂加起来的算力就可以超过 50%,大家都是中国人嘛,联合起来玩一票大的。事实上,几乎不可能。因为,发动 51% 攻击时,攻击者需要偷偷地打造私有链条,所以算力就会从比特币网络中突然消失,这么异常的情况肯定会立即引起整个比特币网络的警觉,全球的大矿主们必然马上采取行动,寻找原因。毕竟规则最终还是人定的,比特币网络的规则也不例外。

比特币系统的核心程序代码现在是谁在维护?

汪诘为你长文解惑04:比特币系统遭到51%的攻击是怎么回事

Gavin Anderson

最早的程序当然是由中本聪写的,后来交给了"比特币基金会"来维护,这个基金会的创始人叫加文·安德森(Gavin Anderson),他除了会写代码,也擅长营销。他于 2010 年推出了一个名叫"比特币龙头(Bitcoin Faucet)"的网站,向每个访问者发放五个免费的比特币。他也参与了代码的调整,并会把结果发送给中本聪,慢慢得到了中本聪的赏识。一组五人的核心开发团队渐渐浮出水面,安德森是其中最资深的人物。只有他们有权利改变比特币后面的核心代码。

虽然安德森后来成为了中本聪钦点的接班人,但两人的交往却并非一帆风顺。起源就是安德森对媒体的不断爆料。安德森说,他曾在 2010 年 6 月至 2011 年 4 月与中本聪密切合作过。他是这么描述的:"每个看过他代码的人都可能得到这个结论:中本聪是一个人在工作。从头算来,我们大概重写了 70% 的代码。它就像一个大的毛团,在初始层面看来非常紧凑、写法上乘,可是组合在一起却显得凌乱不堪。"在这将近一年的时间里,安德森与中本聪频繁通信,每周要花 40 个小时来修改比特币代码。但即使如此,安德森也从未听过中本聪的声音。好奇的安德森会询问中本聪一些私人问题,但中本聪只和他谈论代码。2011年,安德森和中本聪的交流变得不再频繁,他们之间产生了分歧。在一封中本聪于 4 月 26 日发给安德森的邮件中,这位"比特币之父"说:"我希望你不要再谈论我,说得我好像是个暗处的神秘人。媒体只会从'山寨货币'的角度看待比特币。"他劝安德森不要在公众面前讨论比特币,而应该给予开发人员更多信任。安德森回复道,他同样不满于外界对比特币的误解,但他将受邀参加一个演讲,希望通过面对面的交流,倾听外界的意见,来更好地完善它。自那以后,中本聪停止回复邮件,他的身影从比特币的世界中慢慢消失。但他把比特币客户端的源代码交给了安德森,安德森接过接力棒,成为了中本聪之后的代码"当家人"。

2012 年,安德森创立了"比特币基金会",专注于比特币的发展,之后一段时间,比特币客户端核心代码的维护都是由这个基金会完成的。2014 年,安德森从原来的工作离职,专注于基金会内部的工作。不过,从 2016 年 2 月份起,安德森就没有再参与过代码的开发了。在比特币的官网上,可以按照代码贡献量排名,查到每一位开发者的名字: 事实上,这是一个开源项目,任何人都可以参与开发,前提是你遵守他们制定的一套游戏规则,规则老复杂了,我没耐心仔细看了。

但是我想借着这个话题说一个很有趣的观点:从本质上来说,比特币系统并没有所谓的核心程序代码,哪怕是比特币基金会,也可以被比特币玩家炒了鱿鱼。

原因就在于"去中心化"这四个字,所有的比特币系统的节点都是对等的,账本是否合法,关键是看是不是每个节点都承认。我们试想一下,假如所有的矿主都拒绝升级比特币基金会发布的最新版本,那么这个升级就是个 Nothing,在比特币这个游戏中,矿主是负责记账的,他们有多重要,看到这里的读者一定是相当理解了。正因为这样,比特币基金会每次升级之前,必须要先公布自己的所有改动,在官网的论坛上征求意见,如果大多数矿主都表示认可,愿意升级,那么少数玩家也不得不跟着接受,因为不接受的话,意味着自己可能挖不了矿了。所以,比特币基金会不能随心所欲地修改程序,如果明显不合理的改动一旦遭到抵制,他们的信誉就破产了。换句话说,比特币基金会有点儿像全体业主聘用的物业公司,如果业主不满意了,完全可以集体决定重新聘用一个,由新的物业公司来维护程序代码。当然,所有业主要达成共识也并不是一件容易的事情。在这个比喻中,比特币的矿主们就相当于是业主。

在现实生活中,业主的利益与物业公司的利益发生冲突是常见的事情,在比特币这个游戏中,同样也会发生。下一个问题就是一个生动的例子,它是比特币江湖中除了创世区块的诞生外,到目前为止最大的事件。

区块链

如涉及版权,请著作权人与本网站联系,删除或支付费用事宜。

0000