UTXO Commitment有望徹底解決大區塊存儲問題

UTXO Commitment有望徹底解決大區塊存儲問題

關於BCH,黑粉們討論最多的就是BCH區塊過大造成的節點存儲問題,部分比特幣的支持者認為,BCH大區塊會加重全節點的運行成本,使得人人皆節點變的不再可能,有悖去中心化本意。對此,BCH社區已經羅列出了大量的事實和證據來表明BCH大區塊並不會造成存儲困難,也不會影響去中心化的設計,而且即使是比特幣的節點運行,也早就超過了普通電腦能夠接受的範圍。所以,大區塊撐爆屌絲電腦是一個針對BCH的謊言。

不過,隨著區塊中交易的增多,賬本數據的持續增長,BCH全節點的運行成本越來越高是一個不爭的事實。如何解決這個問題,是社區始終在思考的一個方向。近日,UTXO Commitment技術為了這一問題提供了一種解決思路。

UTXO是什麼?

UTXO(Unspent Transaction Output)是指未花費的交易輸出,在現實世界中是沒有比特幣的,只有UTXO。比特幣的交易由交易輸入和交易輸出組成,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出(output),一個地址中出現了輸入而這筆輸入沒有輸出或者是完全輸出,剩餘的部分指的就是“未花費過的交易輸出”,也就是UTXO。

簡單統計一下 BCE 和BCH 主鏈截止到某個最近的區塊時的 UTXO 數據。BCH 的主鏈截止高度534637,UTXO集合有39922839個未花費的輸出;BCE主鏈截止高度527687,UTXO集合有51283037個為花費的輸出。

由此可得,UTXO集合較大,其中的unspent output的量級在4000萬到5000萬這個量級之間,需要的存儲也會超過2GB。同樣UTXO集合本身也會隨著新區塊的產生不斷變化,花費舊的output,生成新的unspent output。

另外某些 output 可能是無法花費的 output,這包括:1)第一個字節為 0x6a開頭的redeemScript(OP_RETURN);2)超過10k字節的 redeemScript。

如何降低全節點存儲成本?

在文章的前面,我提到說BCH全節點的運行成本越來越高是一個不爭的事實,舉一個簡單的例子來說,如果現在要設置一個新節點,需要從BCH網絡節點中下載區塊鏈的完整歷史數據,這個數據目前大約為160GB,這不僅需要新節點擁有高速穩定的寬帶以及較大的硬盤空間,而且其餘節點也會因為初始塊下載而承受網絡壓力,再加上區塊鏈是不斷延伸的,賬本的長度還在不斷增加。

即使這個賬本數據過於龐大,目前來看我們還是需要下載運行,因為這個賬本里面的全部數據都是為了給UTXO集合做擔保,保證每筆交易都是合法的,即每筆交易中的輸出地址中有足夠的UTXO來滿足交易條件。那麼我們有沒有可能不下載全部的歷史數據就達到目的呢?

全部歷史數據的存在是為了驗證新的區塊,也就是為驗證新的交易(transaction,tx)提供依據。但是現在的Bitcoin客戶端在實現驗證新tx時,是否真的會直接去整個區塊鏈上進行回溯來驗證tx的合法性?

答案是否定的。現在的Bitcoin客戶端在驗證tx時,利用的是UTXO(Unspent Transaction Output)集合進行檢查。所以為什麼一定需要全部的歷史數據構建UTXO集合?可以認為:完整的賬本數據的存在是為了給UTXO提供擔保。如果有其他的方式可以為UTXO集合提供擔保或者承諾(commitment),也許就不再需要存儲整個的賬本數據。

UTXO Commitment就是如此,該技術給出的解決思路是用基於橢圓曲線構造的Hash函數(承諾算法)Elliptic Curve Multiset Hash來對UTXO集合進行擔保,該算法將集合中的每一個數據都Hash到橢圓曲線中的每一個點,然後利用加法點群的運算來快速變換成雜湊值的變化,從而使得新地址同步的順序發生改變,節點運行時率先同步新區塊然後同步UTXO餘額,最後是選擇性同步舊數據,簡單來說就是對之前的冗餘數據在不影響網絡安全正確的前提下進行了適當的裁剪。

這樣一來,全節點在運行BCH區塊鏈時,可能只需要下載大小約為2GB的UTXO集,而不需要完整的下載160GB的歷史賬本數據,會大大降低全節點的運行成本,也為普通節點的運行提供了可能。

UTXO Commitment是什麼?

UTXO Commitment也叫UTXO證明或者是UTXO承諾,其大致思路利用ECMH 對某個區塊高度的UTXO集合做承諾,並將該承諾存儲到coinbase 交易的output中,完成這一步之後,後續根據新區塊的產生可以對UTXO Commitment進行更新,利用ECMH把花費的output從集合中去掉並添加新產生的output。通過這種方式就找到了構建並持續維持UTXO承諾的方式,也可以從這裡擺脫對完整賬本的依賴。

Utxo-commitment機制激活之後,網絡中的節點只需要為可能發生的區塊重組保持最近的幾百(幾千或者上萬個區塊)以及UTXO集合,就可以驗證tx的合法性,而UTXO集合的合法性可以對比驗證區塊中的存儲的commitment數據。當然,激活utxo-commitment機制時,例如在區塊中首次生成utxo承諾時,還是依賴全部的歷史數據來保證該UTXO集合的合法性,但是從此之後,就不再依賴完整的區塊數據。類似於歸納法證明:起點處的UTXO證明是正確的(全賬本數據支撐),每一次更新是對的(ECMH 的抗碰撞特性保證),則整個UTXO證明機制是沒有問題的。

在主鏈上開啟UTXO-commitment機制,大概需要以下四步:

1. 在coinbase中引入並維護UTXO承諾(這一步已經完成,在Bitcoin Cash Testnet的1237565高度的區塊的coinbase中有了UTXO承諾:5554583011007bc4426b03824ccca5912bb147bd9f6847b670a08f24b79a4b5ed0b36393)。

2. 為UTXO集合的網絡傳送添加P2P消息支持:utxo/getutxo。

3. 將UTXO承諾作為區塊驗證規則的一部分。

4. 實現fast-syncing bootstrap方法。

UTXO Commitment的優點是什麼?

UTXO承諾的優點,能夠減少存儲空間和帶寬使用。由於僅需要存儲UTXO集合和最新的幾百個(或者幾千或者上萬個區塊),而不需要存儲超過 100GB 的數據,對存儲空間的需求會減少(手動修剪也可以達到類似的效果)。

2017年2月的一則新聞中通告 https://news.bitcoin.com/cost-full-bitcoin-node/,Bitcoin節點通常每月使用200GB或者更多的上行帶寬和大約20GB的下行帶寬。而使用了UTXO承諾之後佔用更少的資源可以使更多的節點能夠以接近全節點的方式來運作,這能夠增強BCH網絡的去中心化程度和並且在一定程度上增強SPV錢包的安全性(可以通過存儲2GB的UTXO集合來驗證交易合法性)。

UTXO Commitment的安全性?

UTXO Commitment的安全取決於ECMH算法的安全性,而ECMH算法可以基於secp256k1橢圓曲線來構造,Core開發者Pieter Wuille等人開發的secp256k1庫上基本都添加了ECMH功能。另外,secp256k1已經被別的數字貨幣進行使用,所以其安全性是經過驗證的。

UTXO Commitment的缺點是什麼?

UTXO承諾也有缺點,如果沒有人願意當全節點存儲所有歷史數據如何處理?另外在Telegram上的UTXO-Commitment的工作組[WG]討論中,有人提出UTXO-Commitment機制可能會影響HD錢包的某些機制,這部分尚未完全弄明白。

引入UTXO包含/不包含證明對於輕錢包的增強也會有幫助,但是進一步的考慮會發現這是徒勞的,因為payment協議也在不斷改進。另外UTXO集合同步容易遭受惡意節點干擾,可能會因為僅僅一個output的錯誤而不斷從網絡重新獲取2GB 的數據。

目前UTXO-Commitment還是存在很多缺陷,但這不會影響UTXO-Commitment的政治正確性,為了實現保證全人類級的交易處理能力和去中心化全節點成本降低,UTXO-Commitment也是必須實現的技術。期待技術團隊在未來能夠徹底完善UTXO-Commitment,早日應用在BCH上。


分享到:


相關文章: