购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.4.2
创世区块

比特币系统于2009年所产生第一个区块被称为“创世区块”(Genesis Block)。创世区块是所有区块的祖先,从任何一个比特币区块或其他从比特币区块链分叉出来的区块都可以回溯到创世区块。可以通过浏览器查看创始区块的内容:https://www.blockchain.com/btc/block/0,如图4-4所示。

040-1

图4-4 比特币系统第一个区块——创世区块

虽然用区块头部的哈希值可以定位到一个区块,但比特币区块链往往用区块的“高度”(Height)来定位一个区块,甚至用区块高度来代替时间点,比如在重大版本升级、社区投票以及区块链分叉时都会用区块高度来作为事件的触发点。

区块的高度从0开始计数,创世区块是第一个区块,因此区块链浏览器显示的Height值为0。我们看到区块高度值0后面的括号里显示“Main chain”,Main chain代表这是区块链的主链的区块,主链是相对于测试链(Testnet)和回归测试链(Regtest)来说的,Testnet和Regtest都是用于开发测试的比特币网络,Testnet用于公共测试网,Regtest主要用于本地的调试。这两条链虽然也都有各自的比特币,但这些测试链的比特币是没有价值的,也没有交易所可以交换交易。如果想体验比特币的转账,又不想使用或没有条件获得比特币,可以通过一些发放Testnet比特币的网站来免费获取,在Testnet客户端中体验真实的比特币转账。笔者在调试比特币系统时曾在以下网站申请过测试网比特币,感兴趣的读者可以尝试:

https://testnet.manu.backend.hamburg/faucet

https://coinfaucet.eu/en/btc-testnet/

Hash所对应的值是创世区块的头部哈希值:

000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

比特币区块的数据结构里并没有Hash这个字段,浏览器里显示这个值是为了方便用户而加进去的,当系统在验证区块合法性的时候会用到并计算这个值,但并不会将其存储在系统里。

Previous Block对应的是前一个区块的哈希值:

0000000000000000000000000000000000000000000000000000000000000000

我们看到了一段全零的值,这是因为创世区块是第一个区块,不存在前置区块,因此表示为全零。

Next Blocks对应的是下一个区块的哈希值:

00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048

这个字段其实也没有在区块的数据结构中定义,和当前区块的哈希值一样,都是为了方便用户而特意加入的。

Time对应的是时间戳,区块生成的时间,UNIX时间戳转换后为2009年01月03日。

Difficulty对应的是难度值,即挖矿的难易程度。这里的值为1,对应的难度目标值为:

0x00000000FFFF0000000000000000000000000000000000000000000000000000

这个难度值和区块头部所包含的nBits字段(难度目标值的Bits格式)不是一个概念,这个难度值是一个比例的概念,中本聪在把创世区块的难度目标值的难度比例规定为1。挖矿的难度值越大,所对应的难度目标值就越小,挖矿所需要的算力也就越大。

当前区块的难度值计算公式为:

创世区块难度目标值/当前区块难度目标值

Bits所对应的是区块头部定义的nBits字段,是难度目标值的压缩格式,由系数和指数组成。这里显示的是十进制数值486604799,其所对应的十六进制为0x1D00FFFF,其中0x1D为指数,0x00FFFF为系数,计算公式为

难度目标值=系数×2 (0x08×(指数-0x03))

即0x1D00FFFF的难度目标值=0xFFFF×2 (0x08×(0x1D-0x03))

Number Of Transactions表示有多少交易被记录在本区块中。创世区块只有一个Coinbase交易,是系统发行新的比特币奖励给矿工的交易,因此这个值为1。

Output Total表示区块所记录的总的交易输出额,只有一个Coinbase奖励交易,金额为50 BTC。比特币的奖励金额并不是一成不变的,基本上每隔4年奖励金额就会减半,在比特币系统上线的前4年中每个区块的奖励为50 BTC,而到了2013年奖励降为25 BTC,到了2020年就已经降为6.25 BTC了。照此下去,大约到2040年比特币总量2100万枚将被全部挖出。

Estimated Transaction Volume表示除去系统奖励和给自己找零外,有多少是真正用于转移支付的比特币,由于是系统奖励,因此值为0。

Size表示区块的大小,这里是0.285KB。

Version表示当前系统的版本号。

Merkle Root表示所有交易所构成的哈希二叉树根。

Nonce表示挖矿的结果。

Block Reward表示对矿工的奖励,当时的奖励是50个BTC。

Transaction Fees表示矿工收取的交易手续费。除了Coinbase交易之外没有其他交易,Coinbase交易是不需要付矿工费的,因此这个区块的手续费为0。

开头讲过,创世区块包含一个隐藏的信息,从源代码中可以看出创世区块的这个信息都被硬编码进比特币区块链系统中,src/chainparams.cpp中的代码如下:

static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
const CScript genesisOutputScript = CScript() << ParseHex ("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);

代码中显示Nonce的值2083236893也被硬编码进去了,所以严格来说创世区块不是被中本聪实时挖出来的,而是手工构造出来的。 4s0WP/ZjQ68xgmtquXMTkHvzK/3sMU7NNj/MPi6twy05Uzp21vCmYgTlfQLvWiKv

点击中间区域
呼出菜单
上一章
目录
下一章
×