比特币没你想的这么“去中心化” | 拆解数字货币与区块链 (4)

学习

体验

蜂群

拼拼

LeanCode

比特币没你想的这么“去中心化” | 拆解数字货币与区块链 (4)

我们看了很多区块链的文章,但是发现大部分文章的作者可能都不懂技术,看不懂代码,对区块链和数字货币的理解只停留在“人云亦云”。数字货币和区块链是当初是技术极客所发明。本文我们荣幸的请到群蜂社CTO刁伟鸿,真正能读懂代码的人给我们通俗易懂的讲一讲数字货币与区块链,比特币也许没有你想象的这么“去中心化”,“攻不可破”。
点击标题作者姓名,可进一步了解作者。


回顾


一系列拆解文章最终的目的是为了回答我们的研究设下的问题:数字货币和区块链有没有投资价值,如何判断其投资价值?


拆解1:《最通俗易懂的比特币原理讲解》以及 拆解1补充《比特币的基础技术原理》我们讨论之前必须要理解比特币的机制和理念以及底层的区块链技术;


拆解2:《比特币对我等良民基本没啥毛用》,我们讨论了比特币的目前在我们普通人现实生活中的使用价值,结论是比特币没有解决我等良民什么痛点,但比特币底层的区块链网络未来会有一些实实在在的应用,有使用价值!


拆解3:《比特币要成为真正的货币,你有生之年看不到》探讨比特币的货币属性,我们讨论前先清晰的定义了目前信用货币时代的货币的定义,而不是在不同定义框架下进行“鸡同鸭讲”般的讨论。


首先说点无关技术的。很多人讨论比特币的货币性质,但当下比特币的价格波动如此之大,要作为货币这样一种经济活动的协调工具、价值的刻度,我觉得它并不称职。不过,比特币在某些情况下也许是最有效的支付手段。因此当我在文中谈论比特币的可信度时,主要指的是它作为支付手段的可信度。


要看懂下面的内容,你需要具备一些比特币网络的基本原理。可以看我们拆解1:《最通俗易懂的比特币原理讲解》以及《拆解1补充:比特币的基础技术原理》


根据前文(《比特币的基础技术原理》),我们知道组成比特币网络的节点,都从自己的利益出发,在没有任何中心化组织协调的情况下,是如何共同记账的。


由于比特币网络是一个公开的网络,没有进入门槛,没有人能保证参与其中的节点都是诚实、没有恶意的。如果有节点想要做坏事,它们能做哪些坏事?做坏事需要多大的成本,能够得到什么收益?这些坏事,会对比特币网络造成多大的破坏?


对这些问题的回答,也就是对比特币网络可信度的考察。


比特币网络中的坏人能做些什么


如果比特币网络是存在于纯净的环境中、由一个可靠组织管理的网络,那就没讨论的必要,因为我们是把信任交给了这个组织,类似于使用所有传统金融机构的互联网服务一样。


但是,比特币是一个开放的网络,任何人都可以参与,只要他有一台能够接入互联网的电脑。所有参与的人,在比特币网络协议看来,都是平等的。他们都可以创建交易,都可以进行挖矿(竞争记账)。


在这种开放的环境中,我们不能保证网络上的节点都是诚实的。它们可能会不遵循前文所叙述的行事方式。


一个坏节点,如果要做坏事,它首先要争取到记账权,也就是说它要能成功挖到区块。我们假定它的运气比较好,挖到了一个新区块。我们看看它能在这个区块上做什么坏事。


它能把别人的比特币据为己有吗?并不能。因为理论上目前的计算能力不能攻破比特币使用的非对称加密算法,它不能伪造别人的数字签名。


如果它硬着头皮把一个无效数字签名塞进一笔新交易,将新交易放进自己的候选区块,并成功挖出来。这个新区块不会被比特币网络上的其他诚实节点认可,因为它们会验证新区块上的所有交易,确保交易都是有效的。这个坏区块被发送到网络上去之后,接收到它的诚实节点,都将直接无视它。因此,坏节点不能窃取其他人的比特币


同样地,坏节点也不能在新区块中,给自己添加超出规则指定数额的奖励,因为这种区块也会被其他诚实节点认为是无效区块。坏节点不能随意给自己增加比特币


既然不能伪造交易,那坏节点可不可以拒绝特定的交易?假设,坏节点的主人不喜欢大雄,它可不可以把大雄的某些地址的交易全部拒绝?因为在挖矿时,选择交易组成区块的策略由节点自行决定,所以它可以做到这一点。坏节点可以拒绝任意的交易


然而,即使坏节点在自己的新区块中拒绝了某笔交易,由于这笔交易被扩散到了整个比特币网络,只要它的性价比满足要求(交易费足够高),其他诚实节点仍然会在下一轮的挖矿中,把这笔交易放入候选区块。


除了“拒绝服务“这种看起来并非有利可图的坏事,坏节点还可以进行双重支付。双重支付这种行为,正如上文提到过,是有利可图的。


我们来看看坏节点可以怎么完成双重支付:


假设小福从小静那里购买了一套珍贵的艺术品,通过 100 比特币来支付。小静在交易得到 1 个确认时,便把艺术品交给了小福。


如果小福控制了某个坏节点,他可以在支付 100 比特币给小静后,马上在坏节点中创建一笔新的交易,把同样的 100 比特币,转回给自己。这个坏节点并不扩散这笔交易,而是立即使用这笔交易进行挖矿,忽略原先支付给小静的交易。


原先支付给小静的交易,已经扩散到网络,当某个诚实节点挖出新区块,确认了这笔交易之后,小静便把艺术品交给了小福。


但是小福的坏节点,将会忽略其他节点挖出来的、确认了支付给小静的交易的区块链,继续在原先的自己工作的区块上挖矿:


图解:含有双重支付的区块链


如上图,H1 里面包含支付给小静的交易,而 A1 中包含小福进行双重攻击的那笔交易。即使 A1 先于 H1 被挖出来,坏节点也不会发布这个新区块。它等待 H1 被发布,这样小静才能看到那笔交易获得了确认。


如果小福的坏节点,运气够好,抢先在其他诚实节点之前,挖到更长的链,那它就可以把自己所私自挖的区块,发布出去,让网络上的诚实节点,都转而认可它的那条链。


图解:成功双重支付


但是,我们都知道,挖矿是一个不确定性很大的事情,一个坏节点想要在下一轮成功挖到一个区块,概率有多大?这个概率等于它掌握的算力除于整个网络的算力。


我们来看看现在的比特币网络预计的总算力是多少,根据(https://blockchain.info/charts/hash-rate),至少是超过 20,000,000 TH/s。一个主流的最新矿机算力为 13 TH/s。一个坏节点如果使用单个矿机进行挖矿,在下一轮挖矿中胜出的概率大概为 0.00000065,几乎可以忽略不计,而这样一个矿机成本一万多人民币,即使投入一千万买几百台矿机,也只是把小数点往后挪了两三位而已。


如果读者想了解这个概率为什么这么计算,我可以通过简化的例子解释一下。
正如前文所述,挖矿是要计算出一个满足特定取值要求的哈希值,而这个哈希值计算的结果,是随机的而且均匀分布的。
假设哈希值取值范围是 0 到 1024,目标值为小于 16。长度为 1024 的区间可以分成 64 节长度为 16 的子区间,因为计算结果完全随机且均匀分布,它们落入这些子区间的机会是均等的。因此我们可以预期,平均要进行 64 次的尝试,便有一次尝试会落入第一个区间。这个尝试次数是不确定的,有可能 1 次就中目标,也有可能需要 1009 次。
我们现在有 8 台电脑,每台电脑在十分钟之内,都能进行 8 次哈希计算。综合起来,平均每十分钟总共能进行 64 次尝试。可以预期,这里面会有一次成功的尝试。
那么,其中某一台的电脑,成功求得目标值的概率是多少?特定的一台电脑,在这个时间内求得 8 个值,它们又是均匀分布在总共的 64 个当中,因此它们中有一个落在 0 到 15 的区间的概率为 8 / 64 等于 0.125。
我们可以把这 8 台电脑的总算力理解为比特币网络的总算力,其中某一台电脑,理解为某个人拥有的节点。所以,根据同样的逻辑,一个节点能够在十分钟内挖到区块的可能性,大概等于节点自身的算力除于比特币网络的总算力。
上面这些数字只是打比方,SHA256 的哈希值取值范围从0 到 2 的 256 次方,是非常大的范围。


如果想提升自己做坏事的成功率,坏人只能抱团取暖:很多个节点合谋,或者一个节点结合很多台机器以大幅提升自己的算力。


要取得多大的算力,才能保证成功?因为竞争记账权是一个概率游戏,我们可以直观地估计,只要有超过一半的算力就能保证取得长期的成功。这就是人们常说的 51% 攻击。


回到上面小福的例子。他控制的坏节点,其实就是在跟全网的其他诚实节点竞争挖矿。只要坏节点在每一轮的概率都高于其他全网的诚实节点,它构造的恶意链,就能在长期竞争中胜出。


理论上,如果合谋的坏节点足够多,甚至可以通过把一些诚实的矿工节点围起来(也就是说,切断这些节点与网络上其他诚实节点的通信),让这些被围住的节点,只能在坏节点建立的恶意链上挖矿。在这种情况下,坏节点不需要完全依赖于自己的算力来竞争。这种攻击被称为“月食攻击”。


所以,当坏节点拥有一半以上的算力时,比特币支付将是不安全的。坏节点可以随意取消掉某个拥有多个确认的新交易。


不过,即使坏节点达到了这样的算力比例,它们也只会攻击未来的交易。比如我们所说的双重支付,它应该在攻击发起之时,就开始悄悄地进行分叉链的构造,展开竞争。如果它想要对一笔存在于区块链很久的交易进行双重支付,需要重挖许多区块,并且挖矿的速度要大大超过诚实链才行,这些计算支出对于它来说往往无利可图。


另外,由于比特币本来就有存在网络延迟,会造成自然的分叉,对于坏节点来说,它们并不需要超过一半的算力,也能在双重支付攻击中获利。


研究表明,对于拥有接近 30% 算力的坏节点,只要被攻击的交易金额大于一个新区块的奖励( 当前为 12.5 个比特币),即使允许交易获得 1 个确认,进行双重支付也是有利可图的;而只要被攻击交易金额大于 13 个区块的奖励(162.5 个比特币),即使允许交易获得 6 个确认,纯粹逐利的坏节点也可能会选择进行双重支付攻击。


Arthur Gervais 在他关于 POW 区块链的安全和性能的论文中,详细分析了在使用不同参数设置的基于 POW 共识的区块链上,拥有一定比例算力的坏节点,进行双重支付获利的可能性。


至此我们了解到,在比特币网络中,即使有坏节点,它能做的坏事,也仅仅是通过双重支付攻击使自己获利,它不能盗窃其他人已有的比特币,也不能无中生有地给自己创造比特币。进行双重支付需要足够的算力。如果坏节点拥有了一半以上的算力比例,它将可以随意地进行双重支付。即使只有接近 30% 的算力,坏节点也可以选择性地进行双重支付获利。


在如今全网总算力非常高的情况下,有没有节点拥有这么大比例的算力?要讨论这个问题,我们先来了解矿池。


矿池:“去中性化”中的“中性化”趋势


比特币设计的初衷,是创造一个去中心化的市场机制。在这个“激励相容”的机制下,每个独立的个体根据自己的利益和偏好行事,以达到整个网络的价值最大化 - 更多分布节点,更难以被攻击,更安全,更有价值。


但是正如前文所述,挖矿激励的获得是非常不确定的。这种不确定性导致了挖矿力量的中心化。


假设你投入巨资,获得万分之一比例的算力,预期在七十天左右挖到一个区块,一年五个,收益六十多万美元,而你的设备和电费成本是四十万美元(纯属举例),则预期收益为 50%,是一个可观的数字。但是由于巨大的不确定性,在这一年里,你可能挖到二十个区块,大赚一笔,也可能一个区块都没有挖到,血本无归。从投资的角度来说,这不是一个好主意。


对于远小于这个比例的算力,挖矿就几乎无异于持续买彩票,虽然中奖时能够大赚,但更可能是长期没有任何收益。


因此在现今的比特币网络,大部分矿工选择抱团取暖,加入矿池。


矿池的典型运作方式,可以简单描述如下:


一个矿池的服务器在比特币网络中,可以被看做一个节点。我们把这个节点当成大矿工。这个大矿工日常验证和转发接收到的交易和区块,挑选交易组成候选区块以进行挖矿。但是它不直接对这个候选区块进行挖矿计算,而是把候选区块分发给所有参与矿池的小矿工。


小矿工们并不是比特币网络中的节点。它们只跟矿池的服务器,也就是这里所说的大矿工,相连接。


这些小矿工既不做交易的验证,也不创建区块,它们只是基于大矿工发过来的候选区块,进行哈希计算。任何一个小矿工,只要成功找到了满足要求的数值,便会立即发给大矿工,由大矿工把这个新区块发送到比特币网络中。


图解:矿池参与者在比特币网络中的位置


因为候选区块是大矿工决定的,新区块的奖励自然是发送到大矿工指定的地址。大矿工根据各个小矿工的贡献值,定时分配相应的奖励给它们。


因为小矿工之间的算力千差万别,它们为挖矿付出的努力也是大相径庭。为了判断小矿工们的贡献值,大矿工会设定一个较轻松的目标值 ,每个小矿工在挖矿尝试中,只要满足了这个小目标,就会把结果发给大矿工。大矿工根据小矿工达成小目标的次数,来判断这些小矿工的贡献值。


我们还是看个具体例子,来理解这个贡献值的概念。


再次使用前文中 0 到 1024 哈希值的简化例子,目标值仍然是小于 16。现在有两个小矿工共同努力尝试求得目标值。而它们分别能在十分钟之内尝试 16 次 和 48 次。它们的计算能力合起来,预期在十分钟之内可以成功一次:因为只要有 64 个随机值平均分布在 0 到 1024 区间中,便有一个能落入 0 到 16 的子区间。


大矿工,也就是矿池的组织者,给它们设定了一个较为轻松的小目标 - 小于 128。因此较弱的矿工有望在十分钟之内达成这个小目标 2 次,而较强的矿工能够达成 6 次。我们可以预期,在这总共 8 次达成小目标的尝试当中,有一次能够达成整体的大目标 - 小于 16。这次成功尝试是由哪个矿工完成的并不重要。


这两个小矿工都把它们达成小目标的结果提交给大矿工,大矿工便可以根据小目标结果的比例,来区分它们的贡献值。 在这个例子中,一比三是一个合理的判定。


这种根据贡献值的分配方法,让矿池参与者的预期回报率与独立挖矿时几乎相等。


以上就是矿池运作模式的极简化描述。


通过这种抱团取暖的方式,每个参与挖矿的投资者,它们预期回报率不变(也许变少了一点点,因为矿池运营者要收费),但是风险大幅降低。市场上任何理性的矿工,都倾向于加入到矿池中。矿池会自然地越变越大,因为越大的矿池,不确定性就越低。


在比特币网络的历史上,矿池 GHash.IO 曾在 2014 年 7 月超过了 50% 的全网算力。比特币社区对此并没有有效的解决方案。出于维护比特币可信度的考虑,GHash.IO 自愿降低了自己的算力份额。对于通常持有许多比特币的矿池运营者来说,这也是符合自身利益的决策。


如今,在比特币网络上,算力的中心化仍然严重,下图是当今各个矿池所占的算力比例:

图解:比特币网络算力分布 https://blockchain.info/pools


所以威胁仍然是存在的。


关于矿池的这段描述,主要是想表达两个点:

  • 比特币网路算力由于矿池的存在,中心化比较严重;
  • 根据矿池的运作方式,矿池的运营者,拥有矿池算力的决策权。这个决策权是指决定在比特币网络中如何行为的权力,这些行为包括验证和转发交易、区块,选择交易进行挖矿,投票决定有效区块链等等。

必须指出的是,这些矿池的运营者,并不必然是比特币的持有者。他们出于自己利益的决策,并不一定要符合比特币网络的整体利益。


对于比特币网络的信任,其实是“信任”了这些中心化的矿池。


总结一下本文提到的事实:

  1. 由于比特币网络是公开的,不能保证全部节点都诚实,有些节点可能是恶意的坏节点。
  2. 这些坏节点要做坏事的前提,是抢得记账权,换句话说,它需要成功挖到新区块,并让自己的新区块成为共识的区块链中的一部分。
  3. 即使坏节点抢得记账权,它也没有能力窃取他人的比特币,或者无中生有地给自己创造比特币。它只能尝试进行双重支付。
  4. 在进行双重支付时,如果要保证抢得记账权,坏节点需要拥有大于 50% 以上的全网算力比例。这被称作 51% 攻击。
  5. 即使没有 51%,只要有接近 30% 的算力,当被交易金额足够大时,坏节点也能够通过双重支付获利。
  6. 在现实的比特币网络中,由于挖矿的巨大不确定性,理性的矿工倾向于抱团取暖,形成矿池。
  7. 大矿池的总算力有可能会超过 50%。比特币网络的安全性,依赖于这些矿池的主人自愿降低份额。


如果要回到比特币可信度的问题,我的看法是,从技术上来说,比特币是可信的,但是也没有那么可信。也许没有一个在任何情况、任何刻度下都适用的答案。


对于许多支付场景,由于金额较小,大可以信任比特币网络上的矿工会如实为我们记账。如果涉及到很大金额,则必须慎重判断至少有多少个确认时交易才可信。


但把时间拉长,比特币网络的安全性是受到很多挑战的:由于算力的中心化,我们对比特币的信任依赖于对矿池运营者的信任,而这种信任是脆弱的;当比特币区块的奖励持续减半,直到完全没有时,坏节点作恶的机会成本将大幅降低(见上面关于 30% 算力坏节点的讨论);量子计算的出现和成熟,有可能会攻破比特币使用的非对称加密算法;等等。


不过,比特币网络的规则并非恒久不变,面对这些挑战,比特币社区也会做出应对,对规则进行修改。只是这些应对能做到什么程度,是否能成功,成功的应对会不会在其他数字货币而不是比特币中做出,仍然是个问号。


因此,如果哪位大佬说未来的一切价值都将以比特币来衡量,也许不是蠢就是坏吧。


不管怎么说,区块链技术将带来深远的影响,整个领域的研究和发展还处在非常活跃的阶段,值得我们持续参与。接下来我们会从不同角度写一些关于其他公有区块链技术以及应用的文章,欢迎加入群蜂社,共同讨论和学习。