1. 简单解释何为51%攻击
你可能会下意识认为加密货币是安全可靠的。怎么说呢,即使网络犯罪分子以不可思议的规律频繁攻击交易所和热钱包,但底层的区块链技术本身天然抗攻击,不是吗?
好吧,其实不然。区块链容易遭受所谓的“51%攻击”伤害。
当有一组矿工控制超过Token哈希算力(计算能力)的50%时,可能会发生51%的攻击(也称为“多数攻击”)。 实际上,“51%”其实用词不当; 一个成功的攻击实际上仅需要50%+ 1的哈希算力。
如果一个群体可以达到如此高水平的控制,就可以通过以下方式轻易毁掉相关币种。
不进行确认从而阻止产生新的区块
撤消当前块上已完成的事务
在网络上发起“双花”
50%+ 1是确保攻击成功所需的哈希算力。 但是,也有可能以较低的哈希算力成功进行攻击。 安全团队使用统计建模来表明当被控制的哈希算力达到约30%时,漏洞风险可能会开始增加。
比特币以及其他几个主流币种使用工作量证明机制来验证交易并将其广播到区块链上。
在白皮书中,比特币的创始人中本聪简明扼要地将这个过程概括为“一CPU,一票”:
“工作量证明“实质上是一CPU一票,最长的链条代表大多数判断,因为该链条拥有最大量“工作量证明”投入。如果CPU算力的大多数由诚实的节点控制,诚实的链条将以超过其他与之竞争链条的速度快速生长。
您可能已经注意到上述引文中的大问题:“如果大部分CPU功率由诚实节点控制......”
当不诚实的节点数量超过诚实节点时,问题就出现了。 在这些情况下,他们可以“投票孤立”合法的矿工,确保他们自己控制最长的链条,从而控制整个加密货币。
中本聪假定,即使矿工可以控制超过50%的节点,他仍然可能“遵守规则”来保护自己的财富:
如果一个贪婪的攻击者有能力比诚实矿工控制更多CPU算力,他将被迫进行选择,是通过欺诈以偷回其支付的款项(译者注:即双重支付攻击),还是通过(获取)生成的新货币。他应当会发现,按照规则行事更加有利可图,这样的规则有利于他比其他联合起来的每一个人获取更多的新货币,亦优于破坏系统以及损害自己拥有财富的有效性。
不幸的是,网络犯罪分子并不完全遵循规则。 自中本聪的白皮书发布以来,已有无数的51%攻击案例。
到目前为止,我们已经利用比特币来说明51%的攻击是如何发生的。
然而,虽然在技术层面上比特币易受攻击,但在更实际的层面上,由于三个原因,它不太可能成为这个受害者:
1、成本
比特币网络规模巨大,想要获得足够用于攻击的哈希算力,需要相当大量的资金投入。
据Crypto51称,对比特币进行长达一小时的黑客攻击需要花费237,941美元。 对以太坊进行攻击的成本同样令人望而却步 ——将花费74,837美元。
2、矿池
如今,最大的加密货币的矿池分布广泛。
情况并非总是如此;2014年,Ghash.io大概掌握量51%的比特币哈希算力。比特币当时显然远不如现在影响大,但仍然令人担忧。
不得不说Ghash.io贼靠谱,他们几乎立即放弃了10%算力,并要求社区自愿将自己的算力限制在40%内,以保护区块链的长期完整性。
现在最大的比特币矿池的哈希算力徘徊在20%左右。
3、NiceHash
NiceHash是世界上最大的加密货币挖矿算力市场。
据Crypto51估计,NiceHash可以产生的总功率不到比特币网络总功率的百分之一。 以太坊是5%,比特币现金是2%。 所有主流币的百分比都保持相似的低百分比。
因此,即使是武器化的NiceHash也没有足够的力量对主流币进行51%的攻击。
当你研究较小的币种时,事情开始发生巨大变化。
就像市值排名前十的币种,对其发动攻击基本都是天价,而排名再往后就不好说了。其对应的NiceHash百分比也开始增加。 也有一些较大币种的百分比令人担忧。 以太坊经典为82%,门罗币79%……
2018年5月比特币黄金遭遇51%的攻击时,小币种的脆弱性成为焦点。
比特黄金 ——来自2017年比特币的硬分叉 - 当时甚至出现不到六个月。
以至于该项目的发言人爱德华·伊斯克拉尔必须告知所有可以交易比特黄金的交易所,将确认数从5个增加到50个,并手动审查大额交易是否存在可疑活动。
“持续攻击的成本很高。 由于成本很高,攻击者只有从虚假存款中快速获得高价值的东西才能获利。 像交易所这样的场所,可以自动接受大额存款,允许用户快速交易另一个币种,然后自动撤离。 在清算交易资金之前,我们一直建议设置上限以防止此类攻击,并敦促人工审查BTG的大额存款。“
在很长是一段时间,我们几乎可以肯定的是,51%攻击的次数会不断增加。
但是会有一线希望吗? 很难说目前存在的数千种山寨币给最终用户带来了什么实实在在的好处。 如果由此加密世界能围绕一些较大的币种进行巩固,那么对于该行业的长期健康来说,51%攻击可能不是一件绝对的坏事。
2. 以太坊stratum协议原理
参照比特币的 stratum协议 和 NiceHash的stratum协议规范 编写了一版以太坊版本的stratum协议说明.
stratum协议是目前最常用的矿机和矿池之间的TCP通讯协议。
以太坊是一个去中心化的网络架构,通过安装Mist客户端的节点来转发新交易和新区块。而矿机、矿池也同时形成了另一个网络,我们称之为矿工网络。
矿工网络分成矿机、矿池、钱包等几个主要部分,有时矿池软件与钱包安装在一起,可合称为矿池。
矿机与矿池软件之间的通讯协议是 stratum ,而矿池软件与钱包之间的通讯是 bitcoinrpc 接口。
stratum是 JSON 为数据格式.
矿机启动,首先以 mining.subscribe 方法向矿池连接,用来订阅工作。
矿池以 mining.notify 返回订阅号、ExtraNonce1和ExtraNonce2_size。
Client:
Server:
其中:
是 订阅号 ;
080c是 extranonce ,Extranonce可能最大3字节;
矿机以 mining.authorize 方法,用某个帐号和密码登录到矿池,密码可空,矿池返回 true 登录成功。该方法必须是在初始化连接之后马上进行,否则矿机得不到矿池任务。
Client:
Server:
难度调整由矿池下发给矿机,以 mining.set_difficulty 方法调整难度, params 中是难度值。
Server:
矿机会在下一个任务时采用新难度,矿池有时会马上下发一个新任务并且把清理任务设为true,以便矿机马上以新难度工作。
该命令由矿池定期发给矿机,当矿机以 mining.subscribe 方法登记后,矿池应该马上以 mining.notify 返回该任务。
Server:
任务ID : bf0488aa ;
seedhash : 。每一个任务都发送一个seedhash来支持尽可能多的矿池,这可能会很快地在货币之间交换。
headerhash : 。
boolean cleanjobs : true 。如果设为true,那么矿工需要清理任务队列,并立即开始从事新提供的任务,因为所有旧的任务分享都将导致陈旧的分享错误。如果是 false 则等当前任务结束才开始新任务。
矿工使用seedhash识别DAG,然后带着headerhash,extranonce和自己的minernonce寻找低于目标的share(这是由提供的难度而产生的)。
矿机找到合法share时,就以” mining.submit “方法向矿池提交任务。矿池返回true即提交成功,如果失败则error中有具体原因。
Client:
任务ID : bf0488aa
minernonce : 6a909d9bbc0f 。注意minernonce是6个字节,因为提供的extranonce是2个字节。如果矿池提供3字节的extranonce,那么minernonce必须是5字节
Server:
一般的矿机与矿池通讯过程就如下所示: