高級
Chain Params
了解比特幣的鏈參數配置,包括共識規則、網路設置和創世區塊定義。
12 分鐘
鏈參數(Chain Parameters)定義了比特幣網路的核心配置,包括共識規則、 地址格式、創世區塊、軟分叉啟用高度等。不同網路(Mainnet、Testnet、Regtest) 有不同的參數配置。
參數類別
鏈參數主要分類:
1. 共識參數 (Consensus)
- 區塊大小限制
- 難度調整週期
- 區塊獎勵減半間隔
- 軟分叉啟用高度
2. 網路參數 (Network)
- P2P 端口
- 網路魔數
- DNS Seeds
- 協議版本
3. 地址參數 (Address)
- 地址前綴
- Bech32 HRP
- 私鑰版本號
4. 創世區塊 (Genesis)
- 區塊雜湊
- Merkle Root
- 時間戳
- nBits / nNonce Mainnet 參數
// 主網核心參數
共識參數:
nSubsidyHalvingInterval = 210000 // 減半週期(區塊)
powLimit = 0x00000000ffffffff... // 最小難度
nPowTargetTimespan = 14 * 24 * 60 * 60 // 2 週
nPowTargetSpacing = 10 * 60 // 10 分鐘目標間隔
fPowAllowMinDifficultyBlocks = false
fPowNoRetargeting = false
軟分叉啟用高度:
BIP34Height = 227931 // Coinbase 高度
BIP65Height = 388381 // OP_CLTV
BIP66Height = 363725 // 嚴格 DER 簽名
CSVHeight = 419328 // OP_CSV + BIP-68
SegwitHeight = 481824 // SegWit
TaprootHeight = 709632 // Taproot
網路參數:
pchMessageStart = {0xf9, 0xbe, 0xb4, 0xd9}
nDefaultPort = 8333
nPruneAfterHeight = 100000
地址前綴:
base58Prefixes[PUBKEY_ADDRESS] = 0 // 1...
base58Prefixes[SCRIPT_ADDRESS] = 5 // 3...
base58Prefixes[SECRET_KEY] = 128 // 5, K, L
bech32_hrp = "bc" // bc1... Testnet 參數
// Testnet3 參數(與主網的差異)
共識差異:
fPowAllowMinDifficultyBlocks = true // 允許最小難度區塊
// 20 分鐘無區塊後可使用最小難度
軟分叉啟用高度:
BIP34Height = 21111
BIP65Height = 581885
BIP66Height = 330776
CSVHeight = 770112
SegwitHeight = 834624
網路參數:
pchMessageStart = {0x0b, 0x11, 0x09, 0x07}
nDefaultPort = 18333
地址前綴:
base58Prefixes[PUBKEY_ADDRESS] = 111 // m 或 n
base58Prefixes[SCRIPT_ADDRESS] = 196 // 2...
base58Prefixes[SECRET_KEY] = 239 // 9 或 c
bech32_hrp = "tb" // tb1...
創世區塊:
hashGenesisBlock = 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943 Signet 參數
// Signet 特殊設計
Signet 特點:
- 需要授權簽名才能出塊
- 可預測的區塊生產
- 適合測試閃電網路等應用
共識參數:
fPowAllowMinDifficultyBlocks = false
// 使用簽名而非 PoW
簽名驗證:
challenge = OP_TRUE // 默認 Signet
// 自定義 Signet 可設置不同的 challenge
網路參數:
pchMessageStart = {0x0a, 0x03, 0xcf, 0x40}
nDefaultPort = 38333
bech32_hrp = "tb" // 與 Testnet 相同
啟動 Signet:
bitcoin-cli -signet getblockchaininfo
自定義 Signet:
signetchallenge=5121... # 自定義 challenge 腳本 Regtest 參數
// Regtest (Regression Test) 參數
特點:
- 本地測試網路
- 可以即時生成區塊
- 難度始終最低
- 完全本地控制
共識參數:
nSubsidyHalvingInterval = 150 // 快速減半(測試用)
powLimit = 0x7fffffff... // 極低難度
fPowAllowMinDifficultyBlocks = true
fPowNoRetargeting = true // 不調整難度
軟分叉:
// Regtest 中所有軟分叉從創世區塊啟用
BIP34Height = 1
SegwitHeight = 0
// 這允許立即測試所有功能
網路參數:
pchMessageStart = {0xfa, 0xbf, 0xb5, 0xda}
nDefaultPort = 18444
bech32_hrp = "bcrt" // bcrt1...
使用:
bitcoin-cli -regtest generatetoaddress 101 <address> 創世區塊
// 主網創世區塊
區塊頭:
Version: 1
hashPrevBlock: 0000000000000000000000000000000000000000000000000000000000000000
hashMerkleRoot: 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
Time: 1231006505 (2009-01-03 18:15:05 UTC)
Bits: 0x1d00ffff
Nonce: 2083236893
區塊雜湊:
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
Coinbase 消息:
"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"
特點:
- 第一個區塊,沒有父區塊
- Coinbase 輸出無法花費(特殊情況)
- 包含著名的報紙標題
- 時間戳證明創建時間 難度調整參數
// 難度調整算法參數
主網:
nPowTargetTimespan = 14 * 24 * 60 * 60 // 2 週 = 1209600 秒
nPowTargetSpacing = 10 * 60 // 10 分鐘 = 600 秒
計算:
調整週期 = nPowTargetTimespan / nPowTargetSpacing
= 1209600 / 600
= 2016 區塊
難度調整公式:
new_target = old_target * actual_time / nPowTargetTimespan
限制:
- 最大增加 4 倍
- 最大減少 4 倍
- 防止難度劇烈波動
// Testnet 特殊規則
如果 20 分鐘沒有新區塊:
- 允許使用最小難度
- 下一個正常區塊恢復難度 地址版本字節
| 類型 | Mainnet | Testnet | 前綴 |
|---|---|---|---|
| P2PKH | 0x00 | 0x6F | 1... / m,n... |
| P2SH | 0x05 | 0xC4 | 3... / 2... |
| WIF | 0x80 | 0xEF | 5,K,L / 9,c |
| BIP32 xpub | 0x0488B21E | 0x043587CF | xpub / tpub |
| BIP32 xprv | 0x0488ADE4 | 0x04358394 | xprv / tprv |
| Bech32 | bc | tb | bc1... / tb1... |
DNS Seeds
// 節點發現的 DNS Seeds
主網 DNS Seeds:
seed.bitcoin.sipa.be // Pieter Wuille
dnsseed.bluematt.me // Matt Corallo
dnsseed.bitcoin.dashjr.org // Luke-Jr
seed.bitcoinstats.com // Christian Decker
seed.bitcoin.jonasschnelli.ch // Jonas Schnelli
seed.btc.petertodd.org // Peter Todd
seed.bitcoin.sprovoost.nl // Sjors Provoost
dnsseed.emzy.de // Emzy
seed.bitcoin.wiz.biz // Jason Maurice
工作原理:
1. 新節點查詢 DNS Seeds
2. 獲取活躍節點的 IP 地址列表
3. 連接到這些節點
4. 通過 addr 消息發現更多節點
# 測試 DNS Seed
nslookup seed.bitcoin.sipa.be 在代碼中訪問
// Bitcoin Core C++ 代碼
#include "chainparams.h"
// 獲取當前鏈參數
const CChainParams& params = Params();
// 訪問共識參數
int halving = params.GetConsensus().nSubsidyHalvingInterval;
int64_t spacing = params.GetConsensus().nPowTargetSpacing;
// 訪問網路參數
uint16_t port = params.GetDefaultPort();
CMessageHeader::MessageStartChars magic = params.MessageStart();
// 訪問地址參數
std::string hrp = params.Bech32HRP();
std::vector prefix = params.Base58Prefix(PUBKEY_ADDRESS);
// 選擇網路
SelectParams(CBaseChainParams::MAIN); // 主網
SelectParams(CBaseChainParams::TESTNET); // 測試網
SelectParams(CBaseChainParams::SIGNET); // Signet
SelectParams(CBaseChainParams::REGTEST); // Regtest 自定義參數(Signet/Regtest)
# 創建自定義 Signet
# 1. 生成簽名密鑰
bitcoin-cli -regtest getnewaddress
# 2. 創建 challenge 腳本
# OP_1
signetchallenge=5121...
# 3. 啟動自定義 Signet
bitcoind -signet -signetchallenge=5121...
# Regtest 自定義區塊獎勵
# 在 chainparams.cpp 中修改
# 自定義難度
# 修改 powLimit 和相關參數
// 自定義鏈的使用場景:
// - 私有測試環境
// - 企業內部鏈
// - 特定研究目的 參數檢查
# 查看當前網路參數
bitcoin-cli getblockchaininfo
{
"chain": "main",
"blocks": 850000,
"headers": 850000,
"bestblockhash": "...",
"difficulty": 83148355189239.77,
"time": 1719360000,
"mediantime": 1719356789,
"softforks": {
"bip34": {"type": "buried", "active": true, "height": 227931},
"bip66": {"type": "buried", "active": true, "height": 363725},
"bip65": {"type": "buried", "active": true, "height": 388381},
"csv": {"type": "buried", "active": true, "height": 419328},
"segwit": {"type": "buried", "active": true, "height": 481824},
"taproot": {"type": "buried", "active": true, "height": 709632}
}
}
# 驗證地址屬於哪個網路
bitcoin-cli validateaddress bc1q... # 主網
bitcoin-cli -testnet validateaddress tb1q... # 測試網 相關概念
- Network Magic:網路識別魔數
- Genesis Block:創世區塊
- Test Networks:測試網路
- Soft Fork Activation:軟分叉啟用
- Difficulty Adjustment:難度調整
已複製連結