入門
Genesis Block
深入了解比特幣創世區塊的結構、歷史意義和技術細節。
8 分鐘
創世區塊概覽
創世區塊(Genesis Block)是比特幣區塊鏈的第一個區塊,由中本聰在 2009 年 1 月 3 日創建。 它是整個比特幣網路的基礎,所有後續區塊都直接或間接連接到它。
基本信息
區塊信息
- • 高度:0
- • 時間:2009-01-03 18:15:05 UTC
- • 難度:1
- • 交易數:1(Coinbase)
獎勵
- • 區塊獎勵:50 BTC
- • 但此獎勵無法花費
- • 可能是故意設計
區塊哈希
創世區塊哈希:
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
特點:
├── 開頭有 10 個零(十六進制)
├── 滿足當時的難度目標
└── 這個哈希是硬編碼在 Bitcoin Core 中的
在代碼中(chainparams.cpp):
consensus.hashGenesisBlock = uint256S(
"0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
); 區塊頭
創世區塊頭(80 bytes):
┌─────────────────────────────────────────────────────────────┐
│ 字段 │ 值 │
├─────────────────────────────────────────────────────────────┤
│ Version │ 1 │
│ Previous Block │ 0000...0000(64 個零) │
│ Merkle Root │ 4a5e1e4baab89f3a32518a88c31bc87f618f... │
│ Timestamp │ 1231006505 (2009-01-03 18:15:05 UTC) │
│ Bits (Difficulty) │ 0x1d00ffff (難度 = 1) │
│ Nonce │ 2083236893 │
└─────────────────────────────────────────────────────────────┘
Previous Block 為全零:
├── 創世區塊沒有前一個區塊
├── 這是區塊鏈的起點
└── 唯一一個 prevhash 為零的區塊 # 查看創世區塊
bitcoin-cli getblockhash 0
# 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
bitcoin-cli getblock "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
# 輸出
{
"hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
"confirmations": 800000,
"height": 0,
"version": 1,
"merkleroot": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"time": 1231006505,
"nonce": 2083236893,
"bits": "1d00ffff",
"difficulty": 1,
"nTx": 1,
"nextblockhash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"
} Coinbase 交易
創世區塊的 Coinbase 交易:
交易哈希:
4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
ScriptSig(輸入腳本)包含的數據:
04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e
63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420
666f722062616e6b73
解碼後:
├── 04ffff001d01 - 難度 bits
├── 04 - 長度前綴
└── "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"
這是《泰晤士報》2009年1月3日的頭條新聞標題。 # 查看創世區塊的 Coinbase 交易
bitcoin-cli getrawtransaction \
"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b" \
true \
"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
# 解碼 ScriptSig 中的消息
echo "5468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73" | xxd -r -p
# The Times 03/Jan/2009 Chancellor on brink of second bailout for banks 嵌入的消息
"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"
這條消息的意義:
1. 時間戳證明
├── 證明區塊不可能在 2009-01-03 之前創建
└── 使用當天報紙標題作為不可偽造的時間證明
2. 對金融危機的評論
├── 2008 年金融危機期間
├── 政府對銀行的緊急救助
└── 暗示比特幣的創建動機
3. 歷史記錄
├── 永久記錄在區塊鏈中
├── 任何人都可以驗證
└── 成為比特幣文化的一部分
《泰晤士報》原文:
┌─────────────────────────────────────────────────────────────┐
│ Chancellor Alistair Darling on brink of second bailout │
│ for banks │
│ │
│ 財政大臣阿利斯泰爾·達林正處於對銀行進行第二次紓困的邊緣 │
└─────────────────────────────────────────────────────────────┘ 無法花費的獎勵
創世區塊的 50 BTC 獎勵無法花費:
原因(技術層面):
├── 創世區塊的 Coinbase 交易不在 UTXO 集中
├── Bitcoin Core 代碼中特殊處理
└── 創世區塊是硬編碼的,不是從網路同步的
可能的原因(推測):
├── 代碼缺陷(意外)
├── 故意設計(象徵意義)
└── 中本聰不希望自己獲得這些幣
結果:
├── 50 BTC 永久鎖定
├── 實際流通量減少 50 BTC
└── 成為比特幣歷史的一部分
注意:
├── 後續區塊的 Coinbase 可以正常花費
└── 只有創世區塊有這個特性 // Bitcoin Core 中的創世區塊處理
// 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";
// 創建 Coinbase 交易
CMutableTransaction txNew;
txNew.nVersion = 1;
txNew.vin.resize(1);
txNew.vout.resize(1);
// ScriptSig 包含報紙標題
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4)
<< std::vector<unsigned char>((const unsigned char*)pszTimestamp,
(const unsigned char*)pszTimestamp + strlen(pszTimestamp));
// 輸出到中本聰的公鑰
txNew.vout[0].nValue = genesisReward; // 50 BTC
txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678a...") << OP_CHECKSIG;
// 創建區塊
CBlock genesis;
genesis.nTime = nTime;
genesis.nBits = nBits;
genesis.nNonce = nNonce;
genesis.nVersion = nVersion;
genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
genesis.hashPrevBlock.SetNull(); // 沒有前一個區塊
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
return genesis;
} 測試網創世區塊
不同網路的創世區塊:
主網(Mainnet):
├── 哈希:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
├── 時間:2009-01-03 18:15:05 UTC
└── 消息:The Times 03/Jan/2009...
測試網3(Testnet3):
├── 哈希:000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
├── 時間:2011-02-02
└── Nonce:414098458
Signet:
├── 哈希:00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6
└── 使用不同的共識規則
Regtest:
├── 哈希:0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206
└── 難度 = 1,用於本地測試 驗證創世區塊
import hashlib
import struct
def double_sha256(data):
return hashlib.sha256(hashlib.sha256(data).digest()).digest()
# 創世區塊頭(小端序)
version = struct.pack('<I', 1)
prev_block = bytes(32) # 全零
merkle_root = bytes.fromhex(
'3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a'
)[::-1] # 反轉為小端序
timestamp = struct.pack('<I', 1231006505)
bits = struct.pack('<I', 0x1d00ffff)
nonce = struct.pack('<I', 2083236893)
header = version + prev_block + merkle_root + timestamp + bits + nonce
# 計算區塊哈希
block_hash = double_sha256(header)[::-1].hex()
print(f"區塊哈希: {block_hash}")
# 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f 總結
- ✓ 起點:區塊高度 0,所有區塊的祖先
- ✓ 消息:包含《泰晤士報》標題作為時間戳
- ✓ 獎勵:50 BTC 永久無法花費
- ⚠ 硬編碼:在 Bitcoin Core 代碼中定義
已複製連結