51%攻击或双重攻击是区块链中的矿工或矿工群体试图在该区块链上花费两次数字加密货币。他们试图“双重花费”,所以得名。这样作的目的并不老是加倍花费数字加密货币,但更常见的是经过影响其完整性来对某个加密数字货币或区块链进行攻击。php
这是一个简单的例子:假设我在豪华车上花了10比特币。几天后汽车交付,个人比特币从个人帐户转帐到汽车公司。经过对比特币区块链进行51%的攻击,我如今能够尝试撤销这种比特币转帐。若是我成功了,我将拥有豪华车和比特币,我还能够再次使用这些比特币。从自治的民主区块链的角度来看,51%攻击的概念彷佛是显而易见的,但对其运做方式存在一种常见的误解。这篇简短的文章将尝试对51%的攻击如何更详细地进行清晰的解释。若是你不知道矿工们如何向区块链添加交易,我建议你先阅读矿工如何经过七个步骤向区块链添加交易,由于只须要五分钟的就能够了。若是你不知道区块链是如何工做的,我建议你从这里开始。java
在详细了解51%的攻击以前,重要的是要了解区块链协议基本上是一种治理形式。区块链管理数据的分类账,例如交易数据。因为区块链协议能够为咱们管理,咱们再也不须要第三方来执行此操做,例如政府或银行。这就是(大多数)区块链去中心化的缘由。比特币区块链的协议基于民主自治制度,这意味着网络上的大多数参与者(矿工)将决定哪一种版本的区块链表明真相。node
当比特币全部者在交易中签字时,它会被放入未经证明的交易的本地池中。矿工从这些池中选择交易以造成交易块。为了将这个交易块添加到区块链中,他们须要找到解决很是困难的数学问题的方法。他们试图使用计算能力找到这个解决方案。这称为哈希( 在此处阅读有关哈希算法的更多信息 )。矿工的计算能力越强,在其余矿工找到解决方案以前找到解决方案的机会就越大。当矿工找到解决方案时,它将与其余矿工一块儿广播(连同他们的区块),而且只有当区块内的全部交易根据区块链上的现有交易记录有效时,他们才会验证它。请注意,即便是恶意的矿工也永远不会为其余人建立交易,由于他们须要该人的数字签名才能这样作(他们的私钥)。所以,若是不访问相应的私钥,就没法从其余人的账户发送比特币。python
如今要注意了。然而,恶意矿工能够尝试逆转现有交易。当一个矿工找到一个解决方案,它应该被广播给全部其余矿工,以便他们能够在块被添加到区块链以后进行验证(矿工达成共识)。然而,恶意矿工能够经过不将其块的解决方案广播到网络的其他部分来建立区块链的后代。如今有两个版本区块链。android
如今有两种版本的区块链。红色区块链能够被认为是“偷挖”模式。程序员
一个版本正在被无瑕疵的矿工跟随,一个被恶意的矿工跟随。恶意矿工如今正在研究他本身的区块链版本,而不是将其广播到网络的其余部分。网络的其他部分没有接受这个链,由于毕竟它尚未被广播。它与网络的其余部分隔离。恶意矿工如今能够把他全部的比特币花在区块链的真实版本上,这是全部其余矿工正在研究的版本。比方说,他把它花在兰博基尼身上。在真实的区块链上,他的比特币如今已经用完了。同时,他没有将这些交易包含在他的隔离版区块链中。在他的孤立版区块链上,他仍然拥有那些比特币。web
与此同时,他仍在挑选区块,他在隔离版的区块链上自行验证了全部这些。这就是全部麻烦开始的地方......区块链被编程为遵循民主治理模式,即大多数。区块链经过始终跟随最长的(实际上最重的,但不要让事情太复杂化)链来实现这一点,毕竟,大多数矿工比其余网络更快地将块添加到他们的区块链版本中( 因此最长链=多数 )。这就是区块链肯定其链条的哪一个版本是真实的,以及钱包的全部余额所依据的。一场比赛如今开始了。拥有最多哈希能力的人将更快地为他们的连接版本添加块。算法
恶意矿工如今会尝试将块添加到他的隔离区块链中,比其余矿工更快地将块添加到他们的区块链(真实的)。一旦恶意矿工建立了更长的区块链,他就会忽然将此版本的区块链广播到网络的其余部分。网络的其他部分如今将检测到区块链的这个(恶意)版本实际上比他们正在处理的版本更长,而且根据协议强制它们切换到这个链。mongodb
恶意区块链如今被视为真实的区块链,而且此链中未包含的全部交易将当即被撤销。攻击者以前已经将他的比特币用在了兰博基尼上,但这笔交易并无包含在他的隐形链中,这条链如今已经被掌控,因此他如今又一次控制着那些比特币。他可以再次花费它们。编程
这就是一次双重攻击。它一般被称为51%攻击,由于恶意矿工将须要比网络其他部分组合更多的哈希能力(所以具备51%的哈希能力),以便更快地将块添加到他的版块的区块链中,最终容许他要创建一个更长的链条。
实际上,这些攻击很是难以执行。如前所述,矿工将须要比网络其余部分更多的哈希能力来实现这一目标。考虑到比特币区块链上甚至可能有成千上万的矿工,恶意矿工将不得不花费大量资金在采矿硬件上与网络的其余部分竞争。即便是地球上最强大的计算机也没法与该网络上的总计算能力直接竞争。还有无数其余反对进行51%攻击的论点。例如,被捕和被起诉的风险,以及电费,租用全部采矿硬件的空间和存储,覆盖你的轨道和洗钱。像这样的操做只是为了给攻击者的回报须要付出太多努力,至少在比特币区块链的状况是这样的。
另外一个有趣的故事是,不管执行此类攻击的难度如何,过去实际上已经发生了屡次51%的攻击。事实上,最近(2018年4月)在Verge(XVG)区块链上进行了攻击。在这种特定状况下,攻击者在边缘区块链协议的代码中发现了一个错误,该错误容许他以极快的速度生成新的块,使他可以在短期内建立更长版本的Verge区块链。此示例说明了一个能够触发51%攻击的事件,尽管很是罕见,而且一般归功于协议代码中的错误。一个可靠的区块链开发人员团队可能会注意到这样的错误,并防止它被滥用。
在检查这个“工做证实量”POW算法(挖掘算法)时,它告诉咱们更多的主动哈希/计算能力能够提升51%攻击的安全性。尽管像小型山寨币同样操做这种算法的较小区块链可能会更容易受到这种攻击,由于攻击者没有那么多的计算能力来竞争。这就是为何51%的攻击一般发生在小型区块链(例如比特币黄金)上,若是它们发生的话。比特币区块链之前从未成为51%攻击的牺牲品。
这也带给咱们最近关于区块链的最新热门话题之一:ASIC挖掘。ASIC采矿是一种由各类早期比特币矿业公司开发的采矿技术,用于加强采矿硬件,使其更增强大。如今不少业内人士都在争论ASIC矿工是否会使某些采矿我的或集团过于强大。Monero(XMR)区块链最近实施了一项协议更新,阻止了ASIC挖掘在其区块链上的使用。结果,网络上的总哈希功率降低了惊人的80% (见下文)!
在ASIC挖掘被阻止后,XMR网络的计算能力降低了80%!
这代表Monero网络的功率掌握在ASIC矿工手中。若是网络上的全部参与者都使用ASIC挖掘硬件,那么这也不必定是个问题。但问题是,像Bitmain这样的大型矿业公司被怀疑控制着大量的ASIC采矿业务。即便这些组织也将此技术分发给我的,但他们可能只是在本身长期使用它以后才这样作。区块链中的一些人争论这是否会使他们太强大。理想状况下,区块链应由尽量多的个体矿工管理。这就是让它更加去中心化的缘由。
看看Bitmain位于中国内蒙古的采矿设施。
另外一个大型采矿设施。
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:
- java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
- python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
- php以太坊,主要是介绍使用php进行智能合约开发交互,进行帐号建立、交易、转帐、代币开发以及过滤器和交易等内容。
- 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
- 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括帐户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
- EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、帐户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
- java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如建立地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如建立地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
- tendermint区块链开发详解,本课程适合但愿使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。
汇智网原创翻译,转载请标明出处。这里是原文黑客如何进行区块链51%攻击(双重攻击)