时间:2023-06-24|浏览:185
在比特币系统中,用户想要发起一笔转账,首先要把转账信息组装好,就像填写银行支票一样,写好付款方账户,收款方账户,转账金额,然后使用加密技术对转账信息签名,我们把这种签名好的转账请求叫作交易。交易被比特币系统处理以后,付款方的账户就会被扣除指定金额,收款方的账户就会增加指定金额。
用户的交易会被发送给比特币系统中的节点,节点收到交易后将其放在一个新的区块中,然后对这个区块进行哈希计算,也就是之前文章所说的计算数学题。哪一个节点优先计算出了这个区块的数学题答案,就获得了这个区块的打包权,被这个节点打包进区块的交易就相当于成交了,然后所有的节点会在新区块的基础上开始计算下一个区块的数学题。
知道了比特币的转账原理,下面我们就来看一下比特币的漏洞到底在哪里!
系统漏洞:最长链原则: 刚才我们说谁先算出答案谁负责打包区块,那如果有两个节点同时做出了同一个区块的答案该怎么办呢?为了解决这个问题,比特币系统设计了一个特殊的机制,叫作最长链原则。
现在假设有两个节点A和B同时计算出了区块N的答案,那么他们就会同时把自己的答案向外广播。由于网络传输的问题,离节点A比较近的节点就会先收到A的答案,验证后发现A的结果是正确的,然后就会在A的基础上继续计算区块N+1的答案。离节点B比较近的节点会优先收到B的答案,验证后发现B的结果也是正确的,然后就会在B的基础上继续计算区块N+1的答案。
此时区块链有两个尾巴,分别是A打包的区块和B打包的区块,我们把这种情况叫作区块链分叉。但是由于区块答案的计算量很大,下一个区块几乎不会同时被计算出来。此时如果区块N+1的答案是在A的基础上计算出来的,那么A的这个分叉就要长一些,在B的基础上计算区块N+1答案的节点就会停止作答,而是在新区块的基础上开始计算区块N+2的答案。此时所有节点都回到了A的那个分叉上继续向下计算,B之前计算出来的区块N就被废弃了。
通过上面的描述我们可以看出,比特币的这条链是有可能分叉的,分叉以后会以最长的链为准,那么在较短的分叉上的区块就被废弃了。这不正为我们攻击比特币系统带来了可能性吗!
对比特币发起攻击: 你可能已经想到了,既然比特币系统只认最长的那条链,我们是不是可以通过这样的方式对比特币进行双花攻击:
首先发起一笔正常的比特币转账交易,用来和对方交换其他的东西。交易在区块N中被打包后,对方就收到了你的转账,然后将东西给你。
你在得到自己想要的东西后,开始收买节点重新创造一个区块N,把你之前发的转账交易删除掉,此时你成功地将比特币进行了分叉。
由于比特币系统只认最长链,所以你收买节点一直在你的分叉上继续工作,直到让你的分叉的区块长度超过正常区块的长度,那么系统中所有节点就会在你的分叉上继续工作。
包含你转账的区块N及其后面一直到N+n的区块都被你的新分叉废弃了,你的分叉成为了主链,在这条链上没有你的转账记录。
至此,你之前转出的比特币还在你的账户上,并且得到了你想要的东西,所以你的攻击成功了。
比特币中的博弈论: 对比特币的攻击真的这么简单吗?答案当然是否定的!虽然我们说可以通过上述方法对比特币发起攻击,但是攻击是要付出代价的。
首先,无论你是在主链上工作还是自己创建一个分叉去工作,区块答案的计算难度都是一样的,所以你仍然需要计算10分钟左右才能生产出一个区块。
其次,难题的计算是随机的,只和节点的计算能力有关,计算能力越强,优先计算出答案的概率就越大,并且还只是概率。
所以,如果你想要创建一个新的分叉,并且超过主链的区块长度,那么你需要比主链上所有节点的计算速度加在一起都要快。要想实现这样的结果,唯一的做法就是你要收买比特币系统中超过51%的节点算力,这就是比特币的51%攻击原理。
想要攻击比特币系统并不是不可能,但是需要付出的代