比特币(四):双花攻击
上一篇文章,我们讲了比特币的签名机制,即比特币利用不对称加密的方式来验证私钥持有者发布的消息。
这一次,我们讲一讲比特币的双花攻击——简单来说即将一笔钱花两次。不过在此之前,我们需要先了解比特币的账户体系。
严格来说,比特币并不存在账户体系,也没有余额的概念,跟我们现在银行的体系是完全不同的;比特币其实是一张一张的支票,而且全都是崭新的支票。
我们都知道比特币是通过挖矿得到的,比如说我拥有50个比特币,那系统就会发给我一张50个比特币的支票。
当我给张三转了20个比特币时,系统并不是在我50个比特币上扣掉20个比特币,而是给张三发一张崭新的20个比特币的支票;然后再给我发一张30个比特币的支票,把这把旧的支票输出链接到新的支票,旧支票即为已花费
比特币的账户体系,也叫未花费的支票,它不是我们传统的账户体系,相比较之下,以太坊更接近于我们现在银行的账户体系,因为它有支出和余额的概念;而比特币是没有这一概念的!正是由于比特币独特的账户体系,导致它不能支持虚拟机,也不能够开发智能合约。
这时,有的人就会认为比特币的钱包这种方式太落后了;然而事实恰恰相反,比特币的这种钱包的构架方式是非常先进的。
从某种程度上来说,这种钱包的工作方式比以太坊更加先进,而以太坊钱包方式只是能够支持智能合约而已。
至此,我相信大家已经知道了比特币的账户体系,所以比特币账户的余额其实是一张张未花费的支票累计起来的,这时候,如果我把所拥有的10个比特币同时花两次,那系统会怎么处理?
比如我给张三转10个比特币,同时我又给李四转10个比特币并将消息广播出去,这时候市场上的矿工,有的会接收到我给张三转账的消息,有的会率先接收到我给李四转账的消息。
这时候就看谁先算出正确答案,谁先取得出块权,那么就以最先取得出块权的矿工所收到的消息为正确消息。那至于我的第二条消息,我的余额就已经不足以支付了,所以说,正常状态下花两次是不可能实现的。
另一种双花攻击,主要涉及比特币的最长链原则。
比特币的交易记录都是通过区块连着区块往前推进,但是在某些特殊的时候,会有两个矿工几乎同时算出了正确答案。这时候他们都取得了打包权,比特币的一条链就会分成两条链,有的矿工就会跟着上面的那条链,而有的则跟着下面那条链。
那争议如何解决?关键就看两条链谁的矿工率先再次计算出正确答案,取得下一个打包权。比如说上第一条链率先有矿工取得了打包权,那么其他的矿工就会发现第一条链比第二条链多了区块,这时大家都会放弃第二条链,选择跟第一条链,这就是比特币的最长链原则。
一般情况下第二条链会被取消,不过也有特殊情况——当你拥有51%的算力时候。
假设你拥有全网超过51%的算力,同时并隐藏了起来,你在原有的链上给李四转1万个比特币,李四查看到自己收到了,这时候你开启了所隐藏的算力,那么你的条链很快就会变成最长链,而当你的链变成最长链之后,之前的链上的交易全部都会被取消,都以你的链条为准。
而在这条链上,你根本就没有给李四转账的消息,所以李四账上的比特币就会莫名其妙的消失了,而你的1万个比特币还在。这叫51%的算力攻击,即用51%算力攻击来实现双花的目的。
但是现实中很少有人能够控制51%的算力,即便控制51%的算力,他会更加细心呵护条链的安全,而不会随意去破坏它!