跳至主要內容
入門

Transaction Index (txindex)

深入了解 Bitcoin Core 的交易索引功能,如何快速查詢任意歷史交易。

8 分鐘

什麼是 TxIndex?

Transaction Index(txindex)是 Bitcoin Core 的可選功能,建立一個從交易 ID (txid) 到區塊位置的索引。啟用後,你可以透過 txid 快速查詢區塊鏈中的任何歷史交易。

有無 TxIndex 的差異

無 TxIndex(預設)

  • • 只能查詢 UTXO 相關交易
  • • 只能查詢錢包交易
  • • 只能查詢 mempool 交易
  • • getrawtransaction 受限

有 TxIndex

  • • 可查詢任何歷史交易
  • • 支援區塊瀏覽器功能
  • • 完整的 getrawtransaction
  • • 需要額外磁碟空間

配置方式

啟用 TxIndex

# 方法 1: 命令行參數
bitcoind -txindex=1

# 方法 2: 配置文件 (~/.bitcoin/bitcoin.conf)
echo "txindex=1" >> ~/.bitcoin/bitcoin.conf

# 重新啟動節點
bitcoin-cli stop
bitcoind

# 檢查索引狀態
bitcoin-cli getindexinfo
# {
#   "txindex": {
#     "synced": true,
#     "best_block_height": 820000
#   }
# }

注意: 如果在已同步的節點上啟用 txindex,需要重新索引整個區塊鏈。 這可能需要幾個小時到一天,取決於硬體。

重新索引

# 如果已有區塊數據,需要重新索引
bitcoind -txindex=1 -reindex

# 或者只重建索引(不重新驗證區塊)
bitcoind -txindex=1 -reindex-chainstate

# 查看進度
bitcoin-cli getblockchaininfo | jq '{blocks, headers, verificationprogress}'

使用方式

getrawtransaction

# 查詢任意交易(需要 txindex)
bitcoin-cli getrawtransaction 

# 解碼交易
bitcoin-cli getrawtransaction  true

# 包含區塊資訊
bitcoin-cli getrawtransaction  true 

# 示例輸出
{
  "txid": "abc123...",
  "hash": "abc123...",
  "version": 2,
  "size": 225,
  "vsize": 144,
  "weight": 573,
  "locktime": 0,
  "vin": [...],
  "vout": [...],
  "blockhash": "000000000...",
  "confirmations": 12345,
  "time": 1234567890,
  "blocktime": 1234567890
}

gettxout(不需要 txindex)

# 查詢未花費輸出(不需要 txindex)
bitcoin-cli gettxout  

# 包含 mempool
bitcoin-cli gettxout   true

# 示例輸出
{
  "bestblock": "000000000...",
  "confirmations": 100,
  "value": 0.01000000,
  "scriptPubKey": {
    "asm": "0 abc123...",
    "hex": "0014abc123...",
    "type": "witness_v0_keyhash",
    "address": "bc1q..."
  },
  "coinbase": false
}

存儲需求

磁碟空間估算

組件 大小 說明
區塊數據 ~600 GB 完整區塊鏈
UTXO 集合 ~8 GB chainstate
TxIndex ~35 GB 交易索引
總計 ~643 GB 完整節點 + txindex

索引位置

~/.bitcoin/
├── blocks/           # 區塊數據
│   ├── blk00000.dat
│   └── ...
├── chainstate/       # UTXO 集合
├── indexes/          # 索引目錄
│   └── txindex/      # 交易索引 (LevelDB)
│       ├── 000001.log
│       ├── CURRENT
│       ├── LOCK
│       └── ...
└── ...

實現細節

索引結構

// TxIndex 條目結構
interface TxIndexEntry {
  txid: Buffer;        // 32 bytes - 交易 ID
  blockHash: Buffer;   // 32 bytes - 區塊雜湊
  blockHeight: number; // 4 bytes - 區塊高度
  txOffset: number;    // 4 bytes - 交易在區塊文件中的偏移
}

// LevelDB Key-Value
// Key: 't' + txid (33 bytes)
// Value: blockHash + blockHeight + txOffset

// 查詢流程
async function getTransaction(txid: string): Promise {
  // 1. 查詢索引
  const entry = await txindex.get(txid);
  if (!entry) {
    return null;
  }

  // 2. 從區塊文件讀取交易
  const blockFile = getBlockFile(entry.blockHash);
  const rawTx = await blockFile.read(entry.txOffset);

  // 3. 解碼交易
  return Transaction.decode(rawTx);
}

// 索引建立
async function indexBlock(block: Block): Promise {
  const batch = txindex.batch();

  for (let i = 0; i < block.transactions.length; i++) {
    const tx = block.transactions[i];
    batch.put(tx.txid, {
      blockHash: block.hash,
      blockHeight: block.height,
      txOffset: calculateOffset(block, i),
    });
  }

  await batch.commit();
}

使用場景

區塊瀏覽器

建立區塊瀏覽器需要 txindex 來快速查詢任意交易。

分析工具

鏈上分析需要追蹤交易歷史,txindex 提供快速查詢。

開發調試

開發者需要查詢交易細節來調試應用程式。

支付驗證

驗證歷史付款需要查詢交易詳情。

替代方案

不使用 TxIndex

# 如果知道區塊雜湊,可以不用 txindex
bitcoin-cli getrawtransaction  true 

# 查詢錢包交易(不需要 txindex)
bitcoin-cli gettransaction 

# 查詢 mempool 交易(不需要 txindex)
bitcoin-cli getmempoolentry 

其他索引

# 區塊過濾器索引(用於輕客戶端)
blockfilterindex=1

# Coinstats 索引(用於 UTXO 統計)
coinstatsindex=1

# 查看所有索引狀態
bitcoin-cli getindexinfo

兼容性

TxIndex 與 Pruning 不兼容

修剪節點會刪除舊區塊數據,而 txindex 需要完整的區塊數據來定位交易。 因此,txindex 和 pruning 不能同時使用。

# 這會報錯
bitcoind -txindex=1 -prune=550
# Error: -txindex is incompatible with -prune mode

最佳實踐

✓ 推薦使用 TxIndex

  • • 運行區塊瀏覽器
  • • 進行鏈上分析
  • • 開發和調試應用
  • • 需要查詢歷史交易

⚠ 可以不用 TxIndex

  • • 只運行個人錢包
  • • 只驗證區塊鏈
  • • 磁碟空間有限
  • • 使用修剪模式

總結

  • 快速查詢:TxIndex 允許透過 txid 快速查詢任何歷史交易
  • 可選功能:預設禁用,需要手動啟用並重建索引
  • 額外空間:需要約 35 GB 額外磁碟空間
  • 不兼容修剪:TxIndex 不能與 pruning 模式同時使用
已複製連結
已複製到剪貼簿