区块的生成即通常所说的上链,并不算复杂。每个链结点的数据结构如下(仅包含头部):
区块的数据结构
struct header_structure{ //BYTES NAME
uint32_t nVersion; // 4 version
uint8_t hashPrevBlock[32]; // 32 previous block header hash
uint8_t hashMerkleRoot[32]; // 32 merkle root hash
uint32_t nTime; // 4 time
uint32_t nBits; // 4 target
uint32_t nNonce; // 4 nonce
};要理解整个链为什么无法被篡改,需要理解merket树,不过这里并没有什么难点。本节关注的是比特币的一些相关常数的设定,这是比较好玩的地方。
Difficulty和Target Bits
就像我们生存的宇宙被各种基本常数所左右一样[1],在比特币宇宙也有一些基本的常数,比如总的比特币数被设定为2100万个,每10分钟左右[2]可以生成一个比特币区块,从而矿工们可以获得一定量的比特币作为奖励—最初这个值是50个比特币(BTC),每挖出210,000个区块(约4年时间)后奖励减半,直到约2140年,系统不再生成新的比特币[3],所有的比特币都被投入到了流通中。下面这张表[9]说明了比特币的发行速度及衰减情况:
这里按每10分钟生成一个区块,每天可以生成144个区块计算。实际情况可能略有出入。第一次减半前,每生成一个区块,矿工将获得50个比特币的奖励。到了 2136年时,每次只能生成1聪的奖励(即全天0.00000144BTC)。
为了控制区块的生成速度—实际上也就等于控制了比特币发行的速度—系统使用了难度值来调控。在白皮书里,关于难度值的论述只有这样一句话,For our timestamp network, we
implement the proof-of-work by incrementing a nonce in the block until a value
is found that gives the block's hash the required zero bits.这里说的是,要确认一个区块,矿工需要找到一个随机数值加入到区块中,使得该区块的hash值表示能包含所要求个数的零(也意味着使得hash值小于某个数字)。在实现中,Bitcoin使用了target bits这个概念,即要求新生成的区块满足以下条件:区块头的双重SHA-256 hash值必须小于这个target bits所表示的值。
Target bits是一个256位数,用hex编码表示时,规定最大值为[0x00000000, 0xffff, {0x00..0x00}]其中{}包括了26字节的0x00。Target bits越大,则难度越小(意味着生成的hash串中需要出现的零越少)。这样说来,由于创世块5的难度值最小,target
bits应该最大。实际上,在创世块中,使用的就是上述target bits值,只不过使用了下面的压缩表示方法:
Bits: 0x1d00ffff
Bits的后三位0x00ffff是底,第一个字节0x1d是幂次,相当于十进制的29,因此这个值等于:
注意我们在计算幂次时,首先减去3,这是因为我们的底占了三个字节。由于我们使用了hex字节码表示,相当于256进制(即每一次进位相当于乘以256)。这种压缩表示法可以表示的最大的数是0xffffffff,相当于
是一个相当大的数字。
创世块中的target bits有时又被引用为difficulty_1_target。它的值为什么要被设置为0x1d00ffff?这是因为根据当时的算力7Mhashes/sec,设置成这个难度,则生成区块的时间刚好为10分钟[1]。
每隔2016个区块会重新设定target bits,以使区块生成的速度能适应网络算力的涨落。新设定的target bits往往会越来越小,从而使得挖矿的难度越来越高。具体地,这个difficulty值是由下面的公式计算的:
当前的target bits是0x176c2146,即:
则:
我这里使用的区块是height为507458的区块,你可以将上述计算值与之校对一下。
这时的全网算力是多少呢?可以通过以下公式计算:

将D = 2603077300218.5933代入,得到当前算力为:16549 PHashes/sec。关于全网算力,可以参考下图
[1] SHA-256
hash是一个256位的数字。当difficulty_1_target设置为2224时,意味着要计算232次Hash,才能确保hash被找到。当算力为7Mhashes/sec时,10分钟刚好可以完成大约这么多次计算:
7 x 220 x 600 = 4404019200,略大于232(4294967296),是232的1.025倍。
[1] 一些科学家认为我们生存的宇宙,其物理常数是为了生命出现而精确设定的—哪怕非常微小的变化也会导致生命无法出现,这个理论一般被称作人择原理。如果选择了另外的一些物理常数,则会出现完全不同的另外一些宇宙。
[2] 10分钟的设定主要是考虑网络传播速度及防止主链频繁分叉。
[3] 从数学上讲,仍然可以生成新的比特币,只不过它们越来越接近零而已。但从程序实现上讲,这个值不得小于计算机能处理的精度;从经济上讲它必须仍然有意义,比如不要少于1聪。因此,从这两个意义上讲,总会有一天将不再生成新的比特币。