Bitcoin-Core

節點如何首次從區塊鏈創建 UTXO?

  • October 9, 2020

假設我是一個新節點。

我嘗試與全節點同步以獲取整個區塊鏈。現在,我與它同步了。是時候讓我的節點創建 UTXO 數據庫了。

它是如何做到這一點的,以便知道將哪個放入 UTXO 數據庫?因為它需要知道哪一個是未使用的。通過查看區塊鏈,它無法快速確定哪個未使用,原因如下:第一個高度塊包含有 5btc 發送給我的輸出。我只在第 400,000 個區塊中使用這個。這種事情發生在所有其他輸出上。那麼比特幣是如何有效建構UTXO的呢?

如果可以有任何來自 bitcoind 的程式碼或其他東西,那也很棒,所以我可以看看。自己找不到。

每次區塊連接到鏈上時,UTXO 集都會更新。因此,如果您想像在初始同步期間,您下載塊 #1 並對其進行驗證,然後將一個 UTXO 添加到數據庫(coinbase 輸出)。塊 #2 被下載並驗證,然後你再添加一個 UTXO 到集合中,依此類推。最終,您下載了區塊 #1000,其中包含一個交易,該交易花費了區塊 #1 的 coinbase 輸出。如果一切都有效,則從 UTXO 集中刪除該塊 #1 coinbase 輸出,並將其替換為塊 #1000 中的交易創建的任何新代幣。

所以你假設“現在,我已經同步了。是時候讓我的節點創建 UTXO 數據庫了”是不正確的——從你啟動 bitcoind 的那一刻起,UTXO 數據庫就一直處於持續維護狀態。

要開始深入研究程式碼,請注意函式中的此呼叫UpdateCoins()``ConnectBlock()。這最終會呼叫AddCoins(),您可以看到 UTXO 實際上首先被添加到記憶體中(最終被刷新到磁碟)。但這是您正在尋找的機制。

您可以看到硬幣從 UTXO 記憶體中刪除的位置SpendCoin()

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