關於BCH,黑粉們討論最多的就是BCH區塊過大形成的節點存儲問題,部分比特幣的支持者認爲,BCH大區塊會加劇全節點的運行成本,使得人人皆節點變的再也不可能,有悖去中心化本意。對此,BCH社區已經羅列出了大量的事實和證據來代表BCH大區塊並不會形成存儲困難,也不會影響去中心化的設計,並且即便是比特幣的節點運行,也早就超過了普通電腦可以接受的範圍。因此,大區塊撐爆屌絲電腦是一個針對BCH的謊話。node
不過,隨着區塊中交易的增多,帳本數據的持續增加,BCH全節點的運行成本愈來愈高是一個不爭的事實。如何解決這個問題,是社區始終在思考的一個方向。近日,UTXO Commitment技術爲了這一問題提供了一種解決思路。算法
UTXO是什麼?bootstrap
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,這不只須要新節點擁有高速穩定的寬帶以及較大的硬盤空間,並且其他節點也會由於初始塊下載而承受網絡壓力,再加上區塊鏈是不斷延伸的,帳本的長度還在不斷增長。ui
即便這個帳本數據過於龐大,目前來看咱們仍是須要下載運行,由於這個帳本里面的所有數據都是爲了給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上。