Blockchain

獲取加密證明 UTXO 集

  • November 6, 2017

如何從本地文件中獲取未使用的交易輸出(UTXO)列表?

這些數據儲存在哪裡?這些數據完全存在於哪些文件中?

我了解此列表處於“鏈狀態”。但是可能有更安全的方法來獲得它嗎?

我嘗試從比特幣客戶端轉儲到磁碟上的本地文件中提取它。

我認為會有一個“加密證明的 UTXO 集”。

作為一個更大的比特幣工具 Python 2 庫的一部分,我一直在研究這個。你可以在github上找到它。

您可以在ldb_parser.py上執行程式碼,這將給出一個 txt,其中包含來自鏈狀態的所有 UTXO 解析為 json。(請注意,這是大量數據。)

然後您可以使用來自 json 的數據呼叫decode_utxo函式並將結果儲存在文件中以進行分析。(這個文件會更大!)。

這裡有一個例子(一旦你執行了 ldb_parser.py):

from bitcoin_tools.utils import load_conf_file, decode_utxo
from json import loads, dumps

fin_name = "utxos.txt"
fout_name = "parsed_utxos.txt"

# Load config file
cfg = load_conf_file()

fin = open(cfg.data_path + fin_name, 'r')
# Output file
fout = open(cfg.data_path + fout_name, 'w')

for line in fin:
   data = loads(line[:-1])
   utxo = decode_utxo(data["value"])

   fout.write(dumps(utxo) + '\n')

fout.close()

您將在 parsed_utxos.txt 中獲得的每一行如下所示:

{"coinbase": 0, "version": 1, "outs": [{"index": 1, "amount": 14250000, "out_type": 0, "data": "865e218ff25929eee880e0e3b6f95280b2d05443"}], "height": 468349}
{"coinbase": 0, "version": 1, "outs": [{"index": 0, "amount": 132000, "out_type": 1, "data": "0b2a00367244680f6da18acd861a08f0a89cb3b4"}], "height": 449294}
{"coinbase": 0, "version": 1, "outs": [{"index": 1, "amount": 2423800, "out_type": 1, "data": "7f172a63c49c5d03e3307d432bd6b784b69d0e0d"}, {"index": 2, "amount": 10000000, "out_type": 1, "data": "1d0c4b60e8270f9b6ca5f167f08a5466a0cee565"}], "height": 474328}
...

其中每個條目在outs一個輸出中,並且data對應於交易數據(P2PKH 交易地址的 hash160)。

現在,您必須考慮一些注意事項:

並非每個 UTXO 都是 P2PKH,因此您會在其中找到什麼data取決於該out_type領域。

out_types 0分別1對應 P2PKH 和 P2SH,將有 20 個字節的數據(P2PKH 為公鑰的 hash160,P2SH 為 scriptHash)。

out_types 2,3,4對應於 P2PK 輸出,5將包含 33 個字節的數據(1 個字節用於公鑰類型,32 個字節用於實際密鑰)。

最後,任何其他out_type都意味著 UTXO 持有的數據沒有被壓縮,該值將對應於數據大小 + 特殊腳本的數量(nSpecialScripts目前為 6)。這是 P2MS 事務和非標準事務的情況。

所有這些都是直接從比特幣核心原始碼中提取的。

最後,請注意,為了使用該庫,您需要在 requeriments.txt 中安裝 python 依賴項並創建一個 conf.py 文件來設置您的鏈狀態路徑和數據路徑(或修改程式碼以不使用配置文件)。

引用自:https://bitcoin.stackexchange.com/questions/56655