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

微信圖片_20180606181915.jpg

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

基於此,一個名爲Tomas 的人提出了UTXO證實。他認爲使用UTXO證實能夠容許完整節點的快速同步,由於完整節點能夠下載UTXO集而不是歷史區塊,並且不會下降安全性。昨天,他在社交平臺上Yours上發佈文章表示在BCH測試網上出現第一個UTXO證實。如下是此文的譯文。編程

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

OP_RETURN [5554583011007bc4426b03824ccca5912bb147bd9f6847b670a08f24b79a4b5ed0b36393]微信

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

快速同步節點區塊鏈

目前新的完整節點須要下載整個歷史區塊。這不只會在初始設置中引發煩人的延遲,並且還會致使現有節點負擔太重,以致於須要花很大一部分帶寬來爲這些舊的區塊服務。測試

爲何完整節點須要這些?他們並無實際驗證這些區塊。大多數implementations都包含一個名爲「assumevalid」的參數,其中包含一個硬編碼的默認值:編碼

微信圖片_20180606181920.jpg

這並無像聽起來那樣可信。當你去驗證這些區塊的時候,你將會根據軟件中寫入的規則進行驗證。全部這些被聲明的硬編碼值都是假定有效的,所以這些區塊都將遵循一樣軟件中編程的規則。這只是一個「預編譯驗證」,不會增長信任或下降安全性。3d

這些完整節點須要整個歷史區塊的惟一緣由是啓動他們的記帳本。由於爲了驗證傳入的交易和區塊,他們必須知道哪些交易的輸出目前未用完。他們必須建立一個未使用的交易輸出集或UTXO集。生成此集合須要他們瀏覽全部的區塊收集全部的輸出,並去掉輸入所消耗的輸出。blog

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

UTXO證實:第一次嘗試

數據集的證實是爲該數據集肯定性計算的值。

一個很好的例子是如何將交易提交到區塊中。當咱們通俗地說交易是在一個區塊中的時候,咱們其實是指交易提交給了的交易證實(「merkle root」)。這意味着只能使用該交易構建證實。這容許節點下載交易而且和他們一塊兒進行驗證並構建證實,從而肯定交易是否在區塊中。

咱們能夠對UTXO集作一樣的事情。若是咱們在區塊中的某處(在coinbase輸出中)建立整個UTXO證實,則新的完整節點能夠下載UTXO集並根據此證實進行驗證。

構建證實的一個簡單方法是按某個鍵排列所UTXO,而後將它們整理在一塊兒:

微信圖片_20180606181923.jpg

 

這種證實(24d0 ...)將用於完整節點的同步。這個集合具備惟一肯定性,因此新的完整節點能夠下載UTXO集並根據此證實進行驗證。

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

使其重複

咱們須要構建一個重複的證實:implementations應該可以從區塊的交易中更新證實,而不須要徹底重構它。

簡單的改變就能夠實現這個目的。咱們要作的是分別對每一個UTXO進行哈希處理,將這些哈希值做爲數字處理,而後簡單地將它們加在一塊兒:微信圖片_20180606181930.jpg

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

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

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

確保安全

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

咱們能夠將每一個哈希值設定爲x ,而後去找y ,使得y = x3 + 7 ,而不是簡單將哈希值加在一塊兒。(x,y)則是曲線上的一個點,咱們可使用橢圓曲線組操做「⊕」組合這些點。(除了例外狀況,A⊕B = C意味着找到C使得存在與A,B和C匹配的線性方程)。

這種結構被稱爲橢圓曲線多重散列哈希(ECMH)。微信圖片_20180606181933.jpg

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

爲了解決這個問題,咱們只須要在哈希中添加一個數字(一個「nonce」),而後再次哈希,只要算法失敗就增長數字:

微信圖片_20180606181937.jpg

如今咱們有一個安全的證實,能夠重複地更新每個區塊,而且能夠用於新的完整節點來檢查他們接收到的UTXO集合。這是證實,它能夠在測試網絡的區塊中找到。

下一步的計劃

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

主要是4個步驟:

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

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

三、將驗證UTXO證實做爲塊驗證規則的一部分。

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

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

將來的版本

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

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

將來版本可能會使這成爲可能。例如,能夠將UTXO集分爲區域,其中每一個區域維護其本身的ECMH,而且這些區域散列在樹形中。

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

相關文章
相關標籤/搜索