我們都知道我們看到的比特幣現(xiàn)金的余額其實都來自于UTXO,即未花費(fèi)的交易輸出。正是因為采用了UTXO才讓我們的交易全部都記錄在區(qū)塊鏈上,保證了去中心化。
基于此,一個名為Tomas 的人提出了UTXO證明。他認(rèn)為使用UTXO證明可以允許完整節(jié)點的快速同步,因為完整節(jié)點可以下載UTXO集而不是歷史區(qū)塊,而且不會降低安全性。昨天,他在社交平臺上Yours上發(fā)布文章表示在BCH測試網(wǎng)上出現(xiàn)第一個UTXO證明。以下是此文的譯文。
如果你仔細(xì)檢查了BCH測試網(wǎng)上的每一個區(qū)塊,你可能會注意到一個奇怪的現(xiàn)象。在區(qū)塊1237565中,coinbase的交易包含一個額外的輸出:
OP_RETURN [5554583011007bc4426b03824ccca5912bb147bd9f6847b670a08f24b79a4b5ed0b36393]
這個元數(shù)據(jù)就是UTXO證明,它目前正在比特幣現(xiàn)金網(wǎng)絡(luò)中被開發(fā)。讓我們看看它是如何工作的。
快速同步節(jié)點
目前新的完整節(jié)點需要下載整個歷史區(qū)塊。這不僅會在初始設(shè)置中引起煩人的延遲,而且還會導(dǎo)致現(xiàn)有節(jié)點負(fù)擔(dān)過重,以至于需要花很大一部分帶寬來為這些舊的區(qū)塊服務(wù)。
為什么完整節(jié)點需要這些?他們并沒有實際驗證這些區(qū)塊。大多數(shù)implementations都包含一個名為“assumevalid”的參數(shù),其中包含一個硬編碼的默認(rèn)值:
這并沒有像聽起來那樣可信。當(dāng)你去驗證這些區(qū)塊的時候,你將會根據(jù)軟件中寫入的規(guī)則進(jìn)行驗證。所有這些被聲明的硬編碼值都是假定有效的,因此這些區(qū)塊都將遵循同樣軟件中編程的規(guī)則。這只是一個“預(yù)編譯驗證”,不會增加信任或降低安全性。
這些完整節(jié)點需要整個歷史區(qū)塊的唯一原因是啟動他們的記賬本。因為為了驗證傳入的交易和區(qū)塊,他們必須知道哪些交易的輸出目前未用完。他們必須創(chuàng)建一個未使用的交易輸出集或UTXO集。生成此集合需要他們?yōu)g覽所有的區(qū)塊收集所有的輸出,并去掉輸入所消耗的輸出。
如果完整節(jié)點能夠下載UTXO集(?2GB)而不是整個歷史記錄(?140GB),這將是一個巨大的改進(jìn)。
UTXO證明:第一次嘗試
數(shù)據(jù)集的證明是為該數(shù)據(jù)集確定性計算的值。
一個很好的例子是如何將交易提交到區(qū)塊中。當(dāng)我們通俗地說交易是在一個區(qū)塊中的時候,我們實際上是指交易提交給了的交易證明(“merkle root”)。這意味著只能使用該交易構(gòu)建證明。這允許節(jié)點下載交易并且和他們一起進(jìn)行驗證并構(gòu)建證明,從而確定交易是否在區(qū)塊中。
我們可以對UTXO集做同樣的事情。如果我們在區(qū)塊中的某處(在coinbase輸出中)創(chuàng)建整個UTXO證明,則新的完整節(jié)點可以下載UTXO集并根據(jù)此證明進(jìn)行驗證。
構(gòu)建證明的一個簡單方法是按某個鍵排列所UTXO,然后將它們整理在一起:
這種證明(24d0 …)將用于完整節(jié)點的同步。這個集合具有唯一確定性,所以新的完整節(jié)點可以下載UTXO集并根據(jù)此證明進(jìn)行驗證。
但它有一個主要缺陷:節(jié)點將需要從整個UTXO集的每個區(qū)塊中完全重構(gòu)它。這可能會花費(fèi)很長時間才能實現(xiàn)。
使其重復(fù)
我們需要構(gòu)建一個重復(fù)的證明:implementations應(yīng)該能夠從區(qū)塊的交易中更新證明,而不需要完全重構(gòu)它。
簡單的改變就可以實現(xiàn)這個目的。我們要做的是分別對每個UTXO進(jìn)行哈希處理,將這些哈希值作為數(shù)字處理,然后簡單地將它們加在一起:
新的同步節(jié)點就可以像以前一樣對其進(jìn)行驗證,但相同的證明還可以在每個區(qū)塊中更新。implementations可以簡單地減去花費(fèi)的輸出的散列,并添加新的輸出,并且結(jié)果證明與當(dāng)前集合構(gòu)造時相同。
新的同步節(jié)點就可以像以前一樣對其進(jìn)行驗證,但相同的證明還可以在每個區(qū)塊中更新。implementations可以簡單地減去花費(fèi)的輸出的散列,并添加新的輸出,并且結(jié)果證明與當(dāng)前集合構(gòu)造時相同。
然而,這也有一個缺陷:它不是獨(dú)一無二的。攻擊者可能構(gòu)造一個相同結(jié)構(gòu)的UTXO集從而導(dǎo)致相同的證明。雖然證明量太大而無法嘗試每種組合,但攻擊者可能會濫用這個事實,即我們使用簡單的加法應(yīng)用和巧妙的算法來輕松找到這樣的組合。
確保安全
幸運(yùn)的是,讓它迭代不需要我們使用加法。不過我們也可以使用像加法一樣的東西。只要我們有一個可交換的操作并且有一些方法可以將它反向應(yīng)用,它就可以工作。我們可以使用任何組,對于具有比加法更好的安全性的組來說,一個好的候選方法是secp256k1橢圓曲線及其組運(yùn)算。
我們可以將每個哈希值設(shè)定為x ,然后去找y ,使得y = x3 + 7 ,而不是簡單將哈希值加在一起。(x,y)則是曲線上的一個點,我們可以使用橢圓曲線組操作“⊕”組合這些點。(除了例外情況,A⊕B = C意味著找到C使得存在與A,B和C匹配的線性方程)。
這種結(jié)構(gòu)被稱為橢圓曲線多重散列哈希(ECMH)。
這種方法需要注意的一點是:對于許多x 值,曲線方程是沒有結(jié)果的。大概只有一半能夠找到結(jié)果。
為了解決這個問題,我們只需要在哈希中添加一個數(shù)字(一個“nonce”),然后再次哈希,只要算法失敗就增加數(shù)字:
現(xiàn)在我們有一個安全的證明,可以重復(fù)地更新每一個區(qū)塊,并且可以用于新的完整節(jié)點來檢查他們接收到的UTXO集合。這是證明,它可以在測試網(wǎng)絡(luò)的區(qū)塊中找到。
下一步的計劃
在進(jìn)行快速同步節(jié)點之前,還有一些工作要做。
主要是4個步驟:
1、維護(hù)并將一條信息性的UTXO證明列入到coinbase中。
2、實現(xiàn)utxo / getutxo P2P消息以允許傳輸U(kuò)TXO集。
3、將驗證UTXO證明作為塊驗證規(guī)則的一部分。
4、推出快速同步引導(dǎo)方法。
我們在區(qū)塊1237565中看到的是對于步驟1的代碼的初始測試,其目前正在由各種implementations進(jìn)行審查和討論。
未來的版本
UTXO證明將對全節(jié)點初始同步提供方便。但是它并未啟用UTXO包含或排除證明。雖然我們可以根據(jù)證明驗證整個集合,但無法以這種方式驗證單個UTXO。
UTXO包含和排除證明可能會讓有些人感興趣,可以允許一種新型的錢包不依賴追蹤區(qū)塊來查找離線時的交易,而且可以同步當(dāng)前的余額。
未來版本可能會使這成為可能。例如,可以將UTXO集分為區(qū)域,其中每個區(qū)域維護(hù)其自己的ECMH,并且這些區(qū)域散列在樹形中。
第一個版本的證明主要集中在主要目標(biāo)上:使整個節(jié)點的初始同步速度非常快,并減少向新節(jié)點提供舊塊的帶寬負(fù)擔(dān)。