Blockchain

比特幣如何讀取/寫入 LevelDB

  • February 12, 2021

我知道 Bitcoin Core 從 0.8 版本開始使用 LevelDB。但是,我找不到關於比特幣如何從 LevelDB 儲存和檢索的詳細解釋。例如,如果 B 交易使用先前交易 A 的輸出作為輸入,比特幣如何查找該交易並查看它是否已被花費?交易 B 用完後,這筆交易如何更新?

在您詢問的具體範例中,它通過查詢位於./bitcoin/chainstateUTXO儲存集合的位置)的 LevelDB 來實現。

UTXOs 由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

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