编程加

比特币是什么?(中)

2021年3月23日

《比特币是什么?(上)》介绍了分布式网络是什么,比特币是怎么在分布式网络中记账的以及数字签名是怎么利用非对称性加密的特性证明「我是我」的。

简单归纳一下,比特币的每一笔交易会被广播到比特币的分布式网络中,付款人通过数字签名证明身份。每个币都能形成一条数字签名链,只要记录下这一条条链,就能追踪每个币的流通,从而实现了记账。

这篇文章将继续介绍比特币是用什么方式让人们(也就是比特币网络中的每个节点)参与记账的,人们又是怎么争取到记账的权利的。

挖矿与奖励 🔗

比特币的交易数据记录在一个个区块(block里,区块有大小限制,能够存储的交易数据也有限。根据最近 1 年的数据,每个区块大约存储 1000+ 笔交易。一个个区块连接起来,形成一条链,就是我们平时所说的区块链(blockchain

区块存储的交易数的均值(最近 1 年)
数据来源:blockchain.com

因为除了第 0 个区块之外,每个区块都是基于它上一个区块构造的,就像把箱子一个个堆叠起来那样,所以我们把第 n 个区块称为高度为 n 的区块,高度为 0 的区块也叫做创世区块(genesis block

「矿工」做的事就是收集比特币网络中被广播的交易,打包构造出一个新的区块,然后把这个区块广播到比特币网络中。一旦这个区块被大家接受,追加到比特币的区块链结尾,区块中的交易就会永久存储在区块链中,我们也就认为这些交易不可逆地被接受了。

每个区块中存储的第一笔交易比较特殊,没有付款人,而收款人是矿工本人。这些「凭空产生」的比特币是对矿工参与记账的奖励。这种奖励是确定的:目前每个区块的奖励是 6.25 BTC(写稿时约合人民币 235 万),每 210,000 个区块奖励减半。比特币会控制区块的产生速度在 10 分钟/个左右,所以大约每 4 年,区块奖励就会减半。

创世区块中记录的交易,当时的奖励为 50 BTC

另一种奖励来自交易费。在广播交易的时候,可以支付其中的一部分给矿工作为交易费。这样一来,矿工在打包交易的时候,会优先选择性价比(也就是交易费 ÷ 交易数据大小)更高的交易。试想,如果你愿意支付的交易费很低,而每个区块的大小是有限的,那么愿意打包这笔交易的矿工就会很少,这笔交易很可能迟迟不能上链。这也是为什么交易费更高的交易往往更快被确认。

比特币交易费在奖励中的占比
数据来源:bitinfocharts.com

目前比特币交易费在奖励中的占比大约是 6%。随着比特币本身流通性的增加(单位时间交易数变多)、区块的固定奖励一次次减半,交易费会取代区块的固定奖励,成为矿工的主要奖励来源。

共识机制 🔗

你可能会觉得,造出一个区块就能获得 235 万人民币,来钱也太容易了。但先不要急着辞职,我们来考虑一个问题:全网大约有一百多万个矿工,而比特币把产生区块的速度控制在 10 分钟/个。你一上头,在电脑上下载了挖矿软件,作为那百万分之一参与挖矿,在下一个 10 分钟内,有多大概率能挖到价值 235 万的 BTC?

这就涉及到一个问题:千千万万的人想获得记账的机会(也就是构造比特币区块链的下一个区块的机会),我们怎么在分布式网络中找到一种公平的、能够每 10 分钟从千千万万之中选出一名幸运人士的方法,并且这种方法可以在全网达成共识?

这个本质上是寻找一种共识机制。如果把比特币看成一个线性的世界,那么区块链上的每个区块就是这个世界的每一时刻,千千万万的矿工都在努力创造这个世界的下一时刻。不可避免地,矿工会创造出很多平行世界,在区块链上形成分叉。在分布式网络中,这种节点间的状态分叉(不一致)是不可避免的,而共识算法的目的是动态地修正这种不一致,使节点间的状态总是趋于一致。

既然我们无法避免区块链产生分叉,我们只能定义出一条主链(main chain,让它成为比特币网络中公认的时间线。你可以强行造出平行世界,但是比特币网络中的其他节点不会认可,因此也没法产生任何价值。

基于这种原因,区块链开发者会刻意利用不被承认的「侧链」来开发和测试一些新特性,避免影响主链。

主链(黑色)是由从创世区块(绿色)到当前区块的最长的那串区块组成的
图片来源 Wikipedia

分布式网络的共识机制有很多种。有些共识算法在分布式和云计算中被广泛使用,比如 Paxos 和它的变体 Raft。这些算法依赖于「选主」,也就是说,系统中的所有节点首先需要根据某些规则选出一个主节点(leader,其他节点作为跟随节点(followers,无条件信任主节点。这类共识算法通过引入主节点来实现一致性,当主节点离开或者不可用的时候重新选主。有两个明显的缺点:一个是当节点数量非常多的时候(比如比特币的分布式网络),选主可能是个非常耗时而且通信量极大(每个节点都要参与投票)的过程;另一个是无法解决拜占庭将军问题──我们无法确保选出的主节点是个「好人」。一旦选出的主节点心怀鬼胎,整个比特币网络的数据就会被它操控。

莱斯利·兰波特在其论文《The Byzantine Generals Problem》中描述了如下问题:

一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。

系统的问题在于,可能将军中出现叛徒,他们不仅可能向较为糟糕的策略投票,还可能选择性地发送投票信息。假设有9位将军投票,其中1名叛徒。8名忠诚的将军中出现了4人投进攻,4人投撤离的情况。这时候叛徒可能故意给4名投进攻的将领送信表示投票进攻,而给4名投撤离的将领送信表示投撤离。这样一来在4名投进攻的将领看来,投票结果是5人投进攻,从而发起进攻;而在4名投撤离的将军看来则是5人投撤离。这样各支军队的一致协同就遭到了破坏……

──Wikipedia

要解决比特币分布式网络中的拜占庭将军问题,就要找到一种方法,使得构造区块有一定的门槛。节点只有付出一定的代价,才有机会构造出合法的区块,而且这种代价是很难伪造的。有什么东西是难以伪造的?在网络中 IP 地址算是一个难以伪造的东西,但是 IP 地址的分布并不均匀:每个家用宽带可能只有一个 IP 地址,而大部分运营商手中却有非常多。

比特币选择的难以伪造的东西是算力,要想构造出合法的区块,就得完成一定工作量的计算任务,并且给出工作量证明(PoW, Proof of Work。算力是很难凭空产生的,要想获得算力就得生产或者购买芯片。有些公司专门研发和生产挖矿的芯片和矿机,而我们日常能够购买到的性价比最高的芯片就是 GPU 了,你也就能理解为什么如今显卡一卡难求。

后文我们将详细探讨工作量证明的原理。

编程加公众号