跳至主要內容
入門

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 代碼中定義
已複製連結
已複製到剪貼簿