即將到來:簡單化節點收集UTXO的方法
經過四年的努力,詹姆斯·奧貝恩的"assumeutxo"選項,用於允許比特幣節點的即時UTXO集引導,已經合併到Bitcoin Core中。
十月初標誌著將近四年的工作即將完成。Assumeutxo 被 Andrew Chow 合併到了比特幣核心的主分支。這是相當長一段時間以來對於比特幣一個重大非共識性的更新,是對於啟動新節點的用戶將帶來許多有趣的影響。
為了提供有關這項功能的背景資料,我認為提供一點歷史課程將是有用的。當比特幣核心節點首次啟動並開始同步區塊鏈時,實際上不會驗證整個歷史鏈。它可以這樣做,但默認情況下不會,原因是為了節省啟動時的時間和資源。它驗證整套區塊鏈標頭(block header),以確保工作量證明(Proof of Work)是有效的,但實際上不驗證過去非常老的區塊的簽名或其他證人數據(witness data)。軟體的邏輯是對於非常老的區塊,比如五年前的區塊,實際上驗證並運行這些區塊的簽名和其他證人檢查是過度的。如果有人能夠五年前挖掘出一個無效的區塊,花費未經有效簽名的幣,那麼比特幣基本上就已經被破壞了
比特幣軟體(Bitcoin Core)以前會使用預定的編碼的檢查點(checkpoint)來跳過對這些舊區塊的驗證,也就是說,開發人員實際上只需將過去已知有效區塊的區塊雜湊直接包含在驗證代碼中,Bitcoin Core將不對該區塊之前的任何證人數據進行檢查。這是一個非常粗糙的解決方案,而且用戶無法在不實際修改客戶端源代碼的情況下更改這種行為。在2017年,Greg Maxwell引入了"assumevalid"功能來處理這些問題。與源代碼中的硬編碼值不同,"assumevalid"是一個可以在啟動時修改的設置,用戶可以手動傳遞區塊雜湊並決定從哪個區塊開始驗證證人數據。Bitcoin Core仍然在此功能中預定的編碼了一個默認區塊,但關鍵區別在於現在用戶可以輕松覆蓋該值而無需修改源代碼。只需運行"bitcoind –assumevalid=[區塊雜湊/blockhash]",用戶可以自行決定要驗證或不驗證的內容。您可以運行它以"assumevalid=0"來驗證從創始區塊(genesis block)以來的每個區塊
Assumeutxo 帶來了一個處理未花費交易輸出(UTXO)集的非常相似的功能。節點在驗證歷史區塊鏈時所做的一切都是為了構建UTXO集。除非您知道那顆比特幣(utxo)以前是否已被花費,否則您無法確定交易是否有效,而UTXO集是節點建立起來以跟蹤未花費的所有幣的緩存。在過去幾年中,用戶已經開發了許多粗糙的工具,以簡單地跳過並從某個時間點的已知有效UTXO集開始,其中以BTCPay Server最為著名。然而,這些都是非常不雅的處理方式,基本上歸結為複製和粘貼保存UTXO集的文件目錄。現在,這種功能將在Bitcoin Core中得到正式支持。
詹姆斯·奥贝恩(James O'Beirne)所完成的實現已經包含了導入和開始使用UTXO快照(snapshot)的所有邏輯,以及創建UTXO快照的工具。就像"assumevalid"一樣,"assumeutxo"將簡單地接受一個現有的快照文件作為參數,將其加載到用戶的節點中,並從那裡開始運行。這將為節點運營者增加了大量的靈活性,無論是對最終用戶還是企業用戶而言
用戶可以創建當前的UTXO集快照並將其存儲在某個地方;如果他們的節點崩潰或任何數據庫損壞,他們只需取出該UTXO快照,並從該區塊高度(blockheight)重新啟動節點,而不必從創世區塊(genesis block)重新啟動。彼此有互信關係的用戶可以相互幫助從當前區塊高度啟動節點。完全不再需要同步區塊鏈。如果您信任我,我可以給您我節點的當前UTXO集,並在僅僅幾小時的區塊範圍內,您可以很快啟動節點。出於不同原因必須運行多個節點的企業可以更快、更簡單地使用UTXO快照來啟動它們
目前,這還不完全準備好用於下一個Bitcoin Core版本的正式發布,但正如詹姆斯在Twitter上所說,要達到那一點的障礙實際上只需要修改五行代碼。所有Bitcoin Core邏輯和實現都已合併,所需做的只是更改一些標誌,以便使比特幣核心允許用戶在主網運行節點時使用"assumeutxo"。
因此,恭喜詹姆斯成功合併此功能。許多比特幣愛好者都期待著更多彈性和對自己節點的控制
原文:Shinobi