据说比特币的创世区块不是挖出来的,而是写死在代码里的。
在好奇心的驱使下,抱着耳听为虚眼见为实的死脑筋观念。我看了一下比特币的源代码,发现创世块真的是写死在代码里。
代码路径:https://github.com/bitcoin/bitcoin/blob/master/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);
}
为什么知道这确实是创世区块的内容,因为创世区块的coinbase里有个著名的tag,就是上面那个泰晤士报头条内容:
The Times 03/Jan/2009 Chancellor on brink of second bailout for banks
但是这还不够,这只是构造coinbase交易的内容,挖矿其实是要确定nonce这个参数,也就是说要把这个nonce值写死在代码里,才说明这个区块不是“挖”出来的,而是“写”出来的。继续在该文件找CreateGenesisBlock函数的引用。于是发现下面这段代码
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
这才确定创世区块确实是写死在代码里,而不是挖出来的。
(全文完)