中金网|贾瑶琪:攻击无处不在 区块链安全和隐私问题有点与众不同( 四 )


4、不要使用链上数据做随机数 , 因为攻击者很可能对未来区块里的信息做文章 , 导致随机数可以纵 。
5、在上线任何功能之前做第三方安全审计(至少两家) 。
6、当部署自己的链上逻辑后 , 需要对对应的智能合约进行链上监控 。 这样可以及时发现问题 , 尽早解决 。
上面提到的攻击 , 不管是重入攻击、溢出攻击、网络拥塞攻击 , 攻击者的意图是恶意的 。 然而 , 还有一些攻击是非恶意的 , 只是想把自己的利益最大化 。 这也是区块链系统本身特有的攻击发展方向 , 有点像传统经济学、金融学上的博弈论 。
理性攻击
下面我主要介绍一下区块扣押攻击、验证者两难攻击 。
区块扣押攻击
先从挖矿说起 , 大家都知道比特币本身是使用工作量证明挖矿的 。 通过计算哈希值 , 看前面有多少位是"0" , 如果前若干位是"0"那么矿工就挖出了新的区块 。 如果矿工想独自挖出新的区块 , 硬件投入是相当大的 , 可能要有超过上亿美金的投资去买矿机 。
不同的矿工由于不能确定自己能独立挖到区块 , 就会联合起来形成不同的矿池 。 矿池的优势是会把难度进行分解 , 把大问题分解成小问题 。
像Nonce , 可以把"11"开头的分给一个矿工 , 把"10"开头的分给另一个矿工 , 每个矿工完成对应的计算后 , 把对应的结果返回给矿池的管理人 。 目前超过90%的矿工加入矿池 , 矿池的存在使得矿工收入更加稳定 。 例如你这边有90个矿工 , 其中1个矿工挖到了最终区块 , 那其他90个矿工可以按照自己的算力拿到对应的奖励 。
比特币联合挖矿协议看起来特别合理 , 矿工的算力高 , 拿的奖励就高 。 对于矿工来说 , 遵守协议 , 直观来说收益应该是最高的 。
针对这样的协议有没有方式进行攻击呢?这里就要提到区块扣押攻击 。 在最初提出"区块扣押攻击"的时候 , 大家都不以为然 , 很多矿池运营人员都感觉不是一个大的问题 。 然而 , 之后却发生了矿池受到扣押攻击 , 造成了超过20万美元的损失 , 让大家意识到原来区块扣押攻击是真实存在的 。
图中大致介绍了矿工是可以参与到不同的矿池里 , 可以参加左边的矿池 , 也可以参加右边的矿池 , 不同的矿池有不同的收益 , 根据你的算力获得对应的奖励 。 矿工其实可以把自己的算力资源分配给不同矿池 , 最终想要达到的效果就是利益最大化 。 那么 , 如何将整个算力资源进行合理分配 , 然后利益最大化?
刚刚提到扣押攻击就是一个例子 。 作为一个正常矿工 , 只要按照矿池分发不同的任务进行运算 , 把结果提交给矿池就可以了 。 然而区块扣押攻击是即使挖到获得比特币的区块也不汇报给矿池 , 只是将之前算力算出来无效的结果给矿池进行汇报 。 由于矿工把之前算出来结果都给矿池进行分享 , 矿池还是按照矿工的算力支付对应的奖励 。

中金网|贾瑶琪:攻击无处不在 区块链安全和隐私问题有点与众不同
本文插图

比特币是零和游戏 , 这样做会不会让其他矿池获利更多 , 自己有损失呢?
现在请大家拿出纸和笔计算一个很简单的例子 , 攻击者拥有全网25%的算力 , 受害者矿池有75%的算力 , 对自己的算力进行分配 , 将5%的算力分配给矿池 , 剩下的20%自己挖矿 。 接下来开始区块扣押攻击 , 攻击者在矿池占了5%的算力 , 但是5%的算力其实是磨洋工 , 即使算到了对应的区块 , 也不告诉矿池 , 所以矿池拿到的结果都是无效的 。 由于按照目前的协议 , 矿工只要算出来对应的结果给矿池 , 就可以拿到对应的奖励 , 所以矿池还是会按照5%的算力分发奖励 。
但是由于这5%是磨洋工 , 全网的真实算力只有95% , 对应的攻击者占了21% , 矿池占了79% 。 按照协议 , 右边矿池拿79%奖励 , 其中79%*5%=4.9%会分发给磨洋工的攻击者 。 攻击者本身正常挖矿也获得了21%的奖励 , 加起来25.9% 。 总结起来 , 如果攻击者正常按照协议运行 , 25%的算力只能获得25%的奖励 , 但是如果实施区块扣押攻击 , 他就可以获得25.9%的奖励 。


推荐阅读