比特幣如何讀取/寫入 LevelDB
我知道 Bitcoin Core 從 0.8 版本開始使用 LevelDB。但是,我找不到關於比特幣如何從 LevelDB 儲存和檢索的詳細解釋。例如,如果 B 交易使用先前交易 A 的輸出作為輸入,比特幣如何查找該交易並查看它是否已被花費?交易 B 用完後,這筆交易如何更新?
在您詢問的具體範例中,它通過查詢位於
./bitcoin/chainstate
(UTXO
儲存集合的位置)的 LevelDB 來實現。
UTXO
s 由txid
由 a 引導的(小尾數表示)標識c
。例子
交易
246c5a81b6ad0dfc0dbc0b2ff5bde65ee1913f75a47d409b8ff8074a27ec1000
在 LevelDB 中通過以下方式標識:
c0010ec274a07f88f9b407da4753f91e15ee6bdf52f0bbc0dfc0dadb6815a6c24
或者是什麼相同的:
630010ec274a07f88f9b407da4753f91e15ee6bdf52f0bbc0dfc0dadb6815a6c24
因為小寫 ASCII 字元“c”的十六進製表示是 63。請注意,當您查詢數據庫時,您不應該使用值的字元串表示,而是使用字節數組 1。
LevelDB 中的每個條目都包含兩個值,
identifier
(解釋為 avobe 並用於查詢數據)和value
.每個
value
條目 ( theUTXO
)的
- 序列化格式
VARINT (nVersion)
VARINT (nCode)
unspentness 位向量,用於 vout
[2]
等;最低有效字節優先未使用的 CTxOuts(通過 CTxOutCompressor)
VARINT (nHight)
nCode 值包括:
- 位 1:IsCoinBase()
- 位 2:
[0]
未使用 vout- 位 4:vout
[1]
未使用- 較高位編碼 N,即後續位向量中的非零字節數。
- 如果第 2 位和第 4 位都未設置,它們將編碼 N-1,因為必須至少有一個未使用的輸出)。
您可以在提供的連結的原始碼中找到格式更好的解釋和範例。
請注意,由於鏈狀態數據庫用於觸發防病毒軟體,如您可以在此問題和此問題中檢查,鏈狀態的第一行包含
obfuscation key
,由它標識的 64 位值0e00obfuscation_key
應與每個數據值進行異或從數據庫。為此,密鑰與自身連接,直到達到混淆值的長度。例子
讓我們
o_k = '27c78118b7316105'
成為我們的混淆密鑰,並且
{"key": "63000002f414665fb03389dd19776732bf90883bcb399d23323747596e98dd1801", "value": "26c326d7353661dc7005d274976f458691f24f0f05d141335f4ad5927e41"}
是數據庫中的一個條目。如您所見,
value
不遵循上面介紹的格式,因為它被混淆了。value
是 60 個字元長,所以如果我們擴展混淆密鑰,因為它達到相同的長度,我們得到:27c78118b731610527c78118b731610527c78118b731610527c78118b731
現在,如果我們在值和鍵之間執行異或:
26c326d7353661dc7005d274976f458691f24f0f05d141335f4ad5927e41 XOR 27c78118b731610527c78118b731610527c78118b731610527c78118b731
我們獲得:
0104a7cf820700d957c2536c205e2483b635ce17b2e02036788d548ac970
這與之前聲明的格式相匹配,並且確實是.
UTXO
標識的值63000002f414665fb03389dd19776732bf90883bcb399d23323747596e98dd1801
。