這是一篇關於防彈協定(Bulletproofs)的進度簡述與其在Monero上的應用介紹。簡單來說: 這協定令人驚艷,有效地降低了手續費,且已準備好要在測試網路(testnet)上開始測試。
現行的保密交易技術(confidential transactions, CT)可將Monero的交易金額隱藏,但為了確保所有人都可以驗證交易輸入和輸出的總和為零,我們使用具有代數性質的承諾協議(commitment),此外,我們還需要確保所有數值為正值以免造成溢位(overflow)的風險,此時範圍保護(range proofs)就發揮了作用。範圍保護可以讓每個人得以將承諾協議限制在一個特定的範圍內進行驗證,並完全不洩漏其他的交易資訊。我們現行的範圍保護協定會因交易輸出增加與範圍長度(目前為64bit)而使得容量大小呈現線性成長,這就造成了肥大的交易容量。不僅如此,若是交易中有多筆輸出,每筆輸出都需要分別有各自獨立的範圍保護,更會大幅增加交易容量,這並不是一件好事。
感謝Bünz、Bootle 與其他作者近期發表的一篇論文 (原文在此),他們在論文中提出了一個更有效率的範圍保護協定,稱為防彈協定。該協定的範圍保護容量僅在範圍大小與輸出數量同時增加時才會對數成長。因此防彈協定就分為兩種方案: 單筆輸出與多筆輸出的交易。多筆輸出的交易可以是多個單筆輸出或是一個多筆的輸出組成(這會比各自獨立的範圍保護來的省容量)。
讓我們來看看一個標準的雙筆輸出交易,也就是一筆傳送出去和一筆找零回自己錢包的輸出。以Monero現行的範圍保護協定下,這樣的交易容量約為13.2kB。若改用單筆輸出的防彈協定後,容量將只需要2.5kB,節省了將近80%的容量,等於節省了80%交易使用區塊的容量,也連帶地降低了80%的交易手續費。若使用多筆輸出的方案甚至可以節省更多的容量。另外,在我們的初步測試中,防彈協定認證所需的時間也比現行協定來得更快,也就是可以加速區塊鏈的驗證速度。
我們已完成了可運作的防彈協定JAVA測試程式碼(GitHub repo在此),單筆輸出與多筆輸出方案皆有。而單筆輸出的方案已經被moneromooo改寫成C++的版本(PR在此),並且會在近期放上測試網路,正在徹底的檢查與測試程式碼。
而多筆輸出的防彈方案還需要多點時間進行確認,因為防彈協定的驗證所需的運算是與輸出數呈線性正相關(容量為對數相關),攻擊者可能會利用這點打包一筆巨大數量輸出的交易,這可能讓攻擊者得以用小額的手續費來耗費巨大的驗證運算資源,讓交易網路壟罩在著阻斷服務攻擊(denial-of-service attack, DoS)的風險下。因此我們必須調整手續費的架構,必須額外考慮到所耗費的運算資源來計算手續費,這不代表手續費會被提高,而是讓手續費在因應輸出增加時的計算方式能夠更加適當且安全。
為了避免產生任何預期外的問題,我們將會以兩階段的方式來啟用防彈協定,你會先看到單筆輸出的方案上線,常見的雙筆輸出交易將會暫時以兩筆分別單筆輸出的方案的方式使用,即便如此也比現行的方案節省了可觀的容量,你將會發現交易手續費變低和錢包驗證速度加快。我們將會繼續研究多筆輸出防彈方案和其手續費架構的微調,最後將會在第二階段將之啟用,我們希望礦工是在手續費計算架構安全的情況下才使用多筆輸出的防彈方案。
總而言之,防彈協定給Monero交易帶來了巨大的進步,可觀的容量節省,更快的錢包驗證速度,以及更低的手續費。如果你有在使用測試網路,千萬別錯過近期就會投入測試的防彈協定!
翻譯原文來源: https://getmonero.org/2017/12/07/Monero-Compatible-Bulletproofs.html