

比特币如何使用点对点计算机网络来执行人类参与者商定的规则?
“... Hardware is soft, a transient expression of ideas, and those ideas are more durable than the hardware itself.”
—Edward Ashford Lee
在最后一节中,我们讨论了黑客是如何组织起来,创建了比特币这样的系统,同时,我们确定,网络中的机器是用来对参与者执行规则的。但是,也可以说,机器们是互相执行规则,从而保证其不被人类参与者所更改。. 本节将讨论如何使用计算机来保持人类参与者的诚实性。
到目前为止,我们认为比特币所解决并不是什么抽象的“问题”(即“中央银行”或“软货币”),而是在指挥控制型结构之外协调专门人力的具体挑战。我们确定,避免指挥控制型结构的动机来自三个方面:

1. 尽量减少系统管理者欺骗或骚扰参与者的机会和动机
2. 吸引熟练的技术人员来构建系统,而不对其进行直接补偿(即FOSS和开放式分配)。
3. 消除监管,允许任何人在未经许可的情况下使用系统;这可以让软件实现最大增长和成功。

接下来,我们将讨论比特币如何在不丧失这三个理想品质的情况下完成这项机器合作的壮举。
机器如何就共享交易历史达成一致
回顾第一节,关于中本聪在创世区块上留下的信息的讨论。大约每隔10分钟,系统就会整理、验证和打包新的交易。这些数据包称为区块。区块生产者被称为矿工。
每个区块都包含上一个区块数据的哈希值。哈希函数是一种单向算法,它可以任意大小的数据映射到固定大小的位输出字符串,称为哈希值。一旦输入到哈希函数的数据被更改,结果哈希值也会随之改变。之所以说哈希函数是单向的,因为在给定哈希值和哈希函数的情况下,无法得知原始数据。因此,如果一个区块包含前一个区块的哈希值,那么它一定是在前一个区块已经存在后生成的。由于改变一串区块中的任何一个都会使所有后续区块中的哈希值无效,因此概念上,这些区块相当是被链接在了一起。新的区块只能被添加到链的末端。
这种通过创建新的区块并以连续的方式将之前区块的哈希值包含在新的区块中而产生的数据结构称为区块链。在基于区块链的系统中,所有参与者在更新其分类账的状态之前都要验证新生成的区块的哈希值。
如何选择区块生成者
本质上来说,所有在比特币网络上挖矿的机器的工作都是打包自上一个区块生成以来产生的的所有交易。如果他们是第一个报告新区块的人,他们就有机会获得coinbase的奖励(目前为12.5比特币)。
但是,由于大部分诚实的矿工都会报告同一串交易,所以网络中会存在许多“正确”的区块,但只有一个人能获得奖励。系统究竟是如何选择最后的赢家?又是如何防止聪明的矿工赢得每一个区块奖励呢?
比特币的共识设计通过要求获胜区块满足某些难以预测的特征,即其所有区块的哈希值开头必须包含一定数量的零,从而在众多潜在的矿工中随机地选择获胜者。这就是比特币矿工被描述为在玩“猜谜游戏”时的含义。[189]
以下屏幕截图来自blockchain explorer, 一个允许任何人查看所有比特币交易的免费公共服务网站。请注意,在挖掘此区块时,当时的难度系数要求其哈希值前面包含18个零:
0000000000000000001fb8f591a114473c582cea6057afd97488cf4f532fc33f

图9:在撰写本章时生成的最新区块。请注意区块哈希值(如上所述)和区块高度(指的是中本聪创建创世区块以来总共生成的区块数量。
(来自:Blockchain.info)
中本聪将平均区块生成时间设定成了一个常数,即10分钟。这个平均值是通过在有效区块的哈希值中添加或减少所需的预加零的数量来维持的。因此,虽然比特币系统没有“地球时间”的概念,但它知道什么时候区块生成的太快或太慢,从而将难度做相应地调整。例如,如果大量的哈希率离开网络,使得区块生成的速度太慢,那么寻找有效区块所需的预加零的数量就会减少,从而使验证条件更容易满足,区块生成速度加快。
与上面的区块544937不同,下面的区块0只有10个预加的零。当中本聪是网络上唯一的矿工时,难度要低得多。
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
一旦满足验证标准,有效区块会在网络中进行传播并被所有完整节点接受,然后添加到所有之前的区块组成的区块链的结尾;此时,获胜矿工也将获得报酬。

明日预告:矿工奖励得币是哪里来的?