本文深入探讨了比特币如何通过巧妙的机制防止双花问题。首先,通过时间戳为区块排序,确保同一笔比特币不能重复使用。其次,依赖最长链原则,使得全网矿工共同维护唯一有效的区块链。最后,分析了51%攻击的理论可能性与实际上难以实现的原因,总结出比特币的共识机制实则是算力竞争的结果,保障了区块链数据的安全性。
通常我们说 POW 机制是比特币系统达成共识的保证,但是深入到更微观层面,单纯的 POW 是不能保证共识的。其实早在比特币之前,就有很多人尝试用 POW 来做数字货币,但实际上 POW 只是个数字,是可以随意拷贝多次的,也就是说作为钱,同样一块钱可以花很多次,这就是数字货币领域的最大难题,双花问题。而比特币的革命性就凝结在一点上:那就是防止双花。
先来看看如何去花比特币,这涉及到时间戳的概念。
比特币创世论文上有一部分专门讲时间戳。每次我花自己的比特币,其实就是进行一次转账交易,然后把这个交易广播到全网。矿工会把十分钟之内收到的交易都保存到一个文件中,这个文件就是一个区块。每个区块上都有个时间戳,也就保证了区块是有先后顺序的。
这样的系统带来了两个自然的结果。
首先,任何人都只能动用自己持有私钥的地址上的资金,也就是任何人都只能花自己的钱。这一点的安全性是非对称加密机制保证的,这个角度的安全性不是本文要讨论的重点。因为防止双花,其实难点在于如何在一个无中心无老大的环境下判断哪些交易是诚实的,哪些是伪造的。而事实上对于一个没有权威的环境来说,诚实与不诚实都是伪命题。
第二点,如果我的一个 BTC 已经买了烧饼,我就不能稍后再用它来买火腿了。客观上来讲,如果我广播两条交易出去,一条是我用这个 BTC 买了烧饼,另一条是我又用同样一个 BTC 买了火腿。没有任何人能判断哪个交易是诚实的,因为这里根本就无所谓诚实不诚实。但是有了时间戳机制,区块是有明确的时间顺序的,所以先被打进区块中的交易,就被认为是合法的,而之后的交易就会被网络拒绝。
所以时间戳这个特性构筑起了防止双花的第一道屏障。
但最终的安全和共识,靠的是另外一道屏障,那就是“最长链原则”。
由于网络延迟的存在,相同的十分钟内,每个矿工接收到的交易是不同的,每次他们打包出来的区块也都各不相同。回到之前《工作量证明》那篇中的介绍,这似乎不是问题,因为各个矿工会竞争记账权,最终被系统接收的区块其实就是拿到记账权的那个区块。但同样是由于网络延时,如果 A 和 B 两个矿工运算出 POW 的时间相差无几,那么网络上就会形成这样的尴尬局面,一部分矿工的区块链上接收了 A 的区块,而另一部分矿工接收了 B 的区块。这就是区块链分叉了,也可以理解为网络上出现了两条不同的区块链。分叉是比特币系统上随时都会出现的正常现象,系统依然会正常运行,继续添加区块,那么最终不同的区块链中总有一条会变得相对比较长,而比特币系统的底层规则是,矿工会淘汰比较短的链,而都去使用最长链,这就是我们说的“最长链原则”。
通过最长链原则,系统上保证了真正有效的区块链只有一条。同时也因为最长链原则,我们理解了一个交易并不是在被矿工写到一个区块上时就生效了,而是要等这条链真正的成为了系统上的最长链之后,才认为交易真正不可逆了。这也就是为什么每次转账后,系统都建议用户等六次确认。基于该交易所在的区块,每多添加一个区块,就是一次确认,等待六次确认之后,基本上意味着网络上大部分矿工都承认这条链是最长链了。
最长链肯定是诞生在算力总和最强的矿工组成的随机群体中,所以就被认为是通过算力投票选出来的一条链,也就是大家达成共识的链。于是我们看到了,区块链之上,所谓的共识,所谓的诚实,其实都是在简单的数学规则下,通过算力比拼而达成的,这里面没有任何道德或者商业规则方面的因素。
了解了时间戳机制和最长链原则,那么系统的运行原理我们就明白了,那安全性如何呢?这就不得不说说 51% 攻击了。
如何攻击系统造成双花呢?如果我去买了一辆豪车,商家等待了六个确认后,我把车提走了。这时候我想,如果我把那次交易撤销了,这样钱又回到我手里,我就可以再用这些钱买个豪宅了。于是我要做的是,下载目前系统维护的最长链,找到有我交易的那个区块,把里面我的交易剔除掉。这样麻烦就来了,因为区块数据变了,而计算 POW 的时候,区块数据本身是个相关量,于是就导致我需要重新计算当前区块的 POW。当我算好这个区块的 POW 之后,却发现麻烦更大了,因为区块链的自身特点,每个区块中都包含着之前区块的哈希值。当前区块变了,意味着之后的所有区块都会变,于是所有的区块的 POW 都要重新运算一遍。这就意味着,我自己跟全网上其他所有的矿工正在进行算力的赛跑,直到我自己的链逐渐追上并超过网络上的最长链,这要求我必须拥有全网算力的一半以上才行,这个也就是51%攻击名字的由来了。
但是这么做真的可行么?首先第一点,我去哪里弄那么多钱,可以买比其他人硬件之和都要多的机器,和相应的电力呢?即使我凑够了钱,51%攻击发生了,那么其实我也不可以为所欲为,最多也就是可以把我之前的一笔交易撤销掉,但是如果想要无中生有的给自己转入大量资金,也是不可能的。反而,对我最有利的做法就是按照正常规则去参与挖矿,这样我可以获得大部分系统奖励的比特币,收益要比去攻击网络大得多。比特币系统的经济激励还能达成这样的效果,就是让算力大于50%的矿池自愿把自己的算力降低到能让大家满意的程度,以便保证比特币的价格,从而保证自身的挖矿收益,这在历史上的的确确发生过。
所以说51%攻击对于已经非常庞大的比特币系统,其实没有想象的那么可怕。这也就是为何多年来没有人能成功对比特币系统进行双花攻击的原因。
关于防范双花问题,我们就解释到这里。我们聊了比特币区块链通过时间戳标明了区块顺序,同一个比特币如果先后花两次,那么只有第一次的交易会被系统接受。接下来进入重点,聊了系统上所有无恶意的矿工是如何协同起来维护一条最长链的,而对系统进行攻击的实质,就是要求攻击者运算 POW 的速度,要超过其他所有无恶意矿工之和。因为只有跑赢了增长区块链的比赛,攻击者才能把自己私人维护的那条链,变成整个网络上的最长的链。最后多说几句:交易不可篡改,意味着整个区块链都不可篡改,数据的安全也就达成了。每次数据写入都是一次交易,而每次交易又都是如上所推理的不可逆的过程,于是就在宏观上形成的区块链的不可篡改性。而区块链就是一个数据库,就是一个账本,所以也就可以说区块链为人类带来了第一个公开的不可篡改的数据库。
发布于 2018-08-23
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!