BCH測試網上出現第一個UTXO證明

BCH測試網上出現第一個UTXO證明

我們都知道我們看到的比特幣現金的餘額其實都來自於UTXO,即未花費的交易輸出。正是因為採用了UTXO才讓我們的交易全部都記錄在區塊鏈上,保證了去中心化。

基於此,一個名為Tomas 的人提出了UTXO證明。他認為使用UTXO證明可以允許完整節點的快速同步,因為完整節點可以下載UTXO集而不是歷史區塊,而且不會降低安全性。昨天,他在社交平臺上Yours上發佈文章表示在BCH測試網上出現第一個UTXO證明。以下是此文的譯文。

如果你仔細檢查了BCH測試網上的每一個區塊,你可能會注意到一個奇怪的現象。在區塊1237565中,coinbase的交易包含一個額外的輸出:

OP_RETURN [5554583011007bc4426b03824ccca5912bb147bd9f6847b670a08f24b79a4b5ed0b36393]

這個元數據就是UTXO證明,它目前正在比特幣現金網絡中被開發。讓我們看看它是如何工作的。

快速同步節點

目前新的完整節點需要下載整個歷史區塊。這不僅會在初始設置中引起煩人的延遲,而且還會導致現有節點負擔過重,以至於需要花很大一部分帶寬來為這些舊的區塊服務。

為什麼完整節點需要這些?他們並沒有實際驗證這些區塊。大多數implementations都包含一個名為“assumevalid”的參數,其中包含一個硬編碼的默認值:

BCH測試網上出現第一個UTXO證明

這些完整節點需要整個歷史區塊的唯一原因是啟動他們的記賬本。因為為了驗證傳入的交易和區塊,他們必須知道哪些交易的輸出目前未用完。他們必須創建一個未使用的交易輸出集或UTXO集。生成此集合需要他們瀏覽所有的區塊收集所有的輸出,並去掉輸入所消耗的輸出。

如果完整節點能夠下載UTXO集(?2GB)而不是整個歷史記錄(?140GB),這將是一個巨大的改進。

UTXO證明:第一次嘗試

數據集的證明是為該數據集確定性計算的值。

一個很好的例子是如何將交易提交到區塊中。當我們通俗地說交易是在一個區塊中的時候,我們實際上是指交易提交給了的交易證明(“merkle root”)。這意味著只能使用該交易構建證明。這允許節點下載交易並且和他們一起進行驗證並構建證明,從而確定交易是否在區塊中。

我們可以對UTXO集做同樣的事情。如果我們在區塊中的某處(在coinbase輸出中)創建整個UTXO證明,則新的完整節點可以下載UTXO集並根據此證明進行驗證。

構建證明的一個簡單方法是按某個鍵排列所UTXO,然後將它們整理在一起:

BCH測試網上出現第一個UTXO證明

這種證明(24d0 ...)將用於完整節點的同步。這個集合具有唯一確定性,所以新的完整節點可以下載UTXO集並根據此證明進行驗證。

但它有一個主要缺陷:節點將需要從整個UTXO集的每個區塊中完全重構它。這可能會花費很長時間才能實現。

使其重複

我們需要構建一個重複的證明:implementations應該能夠從區塊的交易中更新證明,而不需要完全重構它。

簡單的改變就可以實現這個目的。我們要做的是分別對每個UTXO進行哈希處理,將這些哈希值作為數字處理,然後簡單地將它們加在一起:

BCH測試網上出現第一個UTXO證明

新的同步節點就可以像以前一樣對其進行驗證,但相同的證明還可以在每個區塊中更新。implementations可以簡單地減去花費的輸出的散列,並添加新的輸出,並且結果證明與當前集合構造時相同。

新的同步節點就可以像以前一樣對其進行驗證,但相同的證明還可以在每個區塊中更新。implementations可以簡單地減去花費的輸出的散列,並添加新的輸出,並且結果證明與當前集合構造時相同。

然而,這也有一個缺陷:它不是獨一無二的。攻擊者可能構造一個相同結構的UTXO集從而導致相同的證明。雖然證明量太大而無法嘗試每種組合,但攻擊者可能會濫用這個事實,即我們使用簡單的加法應用和巧妙的算法來輕鬆找到這樣的組合。

確保安全

幸運的是,讓它迭代不需要我們使用加法。不過我們也可以使用像加法一樣的東西。只要我們有一個可交換的操作並且有一些方法可以將它反向應用,它就可以工作。我們可以使用任何組,對於具有比加法更好的安全性的組來說,一個好的候選方法是secp256k1橢圓曲線及其組運算。

我們可以將每個哈希值設定為x ,然後去找y ,使得y = x3 + 7 ,而不是簡單將哈希值加在一起。(x,y)則是曲線上的一個點,我們可以使用橢圓曲線組操作“⊕”組合這些點。(除了例外情況,A⊕B = C意味著找到C使得存在與A,B和C匹配的線性方程)。

這種結構被稱為橢圓曲線多重散列哈希(ECMH)。

BCH測試網上出現第一個UTXO證明

這種方法需要注意的一點是:對於許多x 值,曲線方程是沒有結果的。大概只有一半能夠找到結果。

為了解決這個問題,我們只需要在哈希中添加一個數字(一個“nonce”),然後再次哈希,只要算法失敗就增加數字:

BCH測試網上出現第一個UTXO證明

現在我們有一個安全的證明,可以重複地更新每一個區塊,並且可以用於新的完整節點來檢查他們接收到的UTXO集合。這是證明,它可以在測試網絡的區塊中找到。

下一步的計劃

在進行快速同步節點之前,還有一些工作要做。

主要是4個步驟:

1、維護並將一條信息性的UTXO證明列入到coinbase中。

2、實現utxo / getutxo P2P消息以允許傳輸UTXO集。

3、將驗證UTXO證明作為塊驗證規則的一部分。

4、推出快速同步引導方法。

我們在區塊1237565中看到的是對於步驟1的代碼的初始測試,其目前正在由各種implementations進行審查和討論。

未來的版本

UTXO證明將對全節點初始同步提供方便。但是它並未啟用UTXO包含或排除證明。雖然我們可以根據證明驗證整個集合,但無法以這種方式驗證單個UTXO。

UTXO包含和排除證明可能會讓有些人感興趣,可以允許一種新型的錢包不依賴追蹤區塊來查找離線時的交易,而且可以同步當前的餘額。

未來版本可能會使這成為可能。例如,可以將UTXO集分為區域,其中每個區域維護其自己的ECMH,並且這些區域散列在樹形中。

第一個版本的證明主要集中在主要目標上:使整個節點的初始同步速度非常快,並減少向新節點提供舊塊的帶寬負擔。


分享到:


相關文章: