實現比特幣的1萬倍擴容,MIT與斯坦福打造的新協議Prism是什么?

Lei Yang 2020-02-22 13:59 4289
分享

注:本文是斯坦福區塊鏈周的演講實錄,為來自麻省理工的Lei Yang發表的演講,題為《Prism:比特幣的1萬倍擴容》。

大家好。我很高興能在這里談談我們對Prism共識協議的實施和評估,該協議的性能比比特幣高出1萬倍。這是麻省理工學院,斯坦福大學和其他幾所大學之間合作的結果。我要感謝我的合作者,包括我的導師和其他相關參與者。

我們都知道比特幣有很好的安全性,但就性能而言,卻不是。它每秒只能處理7筆交易,每一個都需要幾個小時來確認。比特幣將性能與安全連接在一起。比特幣將這些參數與一個設計參數聯系在一起:挖礦率。

如果我們想要提高性能,那么將在安全性方面遭受很多損失,反之亦然。Prism要做的就是打破這種聯系。

我們對中本聰共識協議進行了自然延伸。我們對其進行解構,并對每個部分進行擴展。prism協議是一個非常自然和漂亮的協議。它非常簡單,我們在短短6個月的時間里就將它應用到10000行Rust代碼中。

就在演講開始之前,我在AWS上啟動了100個虛擬機實例。我將在每一個虛擬機上發布一個Prism實例。代碼在github上是開源的。

在這次演講中,我將討論Prism共識協議,然后我將討論系統部署,然后我們將進行評估。

讓我們快速回顧一下比特幣共識協議,它使用了最長鏈規則,每個礦工都會嘗試擴展和挖最長的鏈。當出現一個分叉時,當兩個區塊意外地連接到同一個父塊時,礦工將選擇最長的分叉。他們總是選擇最長鏈。

這里涉及了一個名為挖礦率的參數,它定義了礦工挖出新塊的平均速度。在比特幣中,這個速度是每10分鐘1個區塊。

比特幣協議的一個重要部分是交易的確認。一筆交易出現,我們可以立即確認,但有一個問題。攻擊者有可能在挖一條私有的鏈,因為挖礦過程是隨機的,是一個泊松過程(poisson process)。有可能這個礦工很幸運,可以在頭幾個區塊挖礦速度較快,當這種情況發生時攻擊者會釋放自己的私有鏈,突然我們的交易就不再來自真正的最長鏈。

中本聰提出了一個解決方案,與其立即確認交易,不如等到確認其已經在最長鏈里。即使攻擊者能夠幸運地獲得最初的幾個塊,從長遠來看攻擊者也不太可能獲勝。中本聰在他的白皮書中進行了計算。所以你必須等待一定數量的區塊才能獲得不可篡改的可能。

吞吐量是比特幣確認交易的平均速度,以及在一段時間內可以確認多少交易,計算方法是乘以區塊大小、每個區塊有多少交易、以及挖礦速率(我們挖這些區塊的速度有多快)。然后是延時,也就是確認一個交易需要多長時間。這個計算可以通過確定深度和挖掘速率的除法來完成。

為了提高性能,我們可以提高挖礦速率來獲得更高的吞吐量和更低的延時。我們還可以增加區塊大小以獲得更高的吞吐量。然而,因為分叉,這是行不通的,如果我們提高挖礦速率或增加區塊大小,我們只能得到更多的分叉。這是因為當網絡上的兩個節點不能足夠快地相互傳播消息時,就會發生分叉,這樣它們就會意外地在同一個父塊上進行挖礦。如果我們提高挖礦速率,兩個節點更有可能在短時間內意外地挖出新塊。如果我們增加區塊的大小,那么區塊在整個網絡中傳播的時間會更長,這將導致分叉率的增加。分叉不是好事,因為會損害安全性。分叉降低了誠實挖礦的能力。

解構Prism

現在我們來談談Prism。我們解除性能和安全的聯系是為了提高性能。在比特幣中,一個區塊實際上有兩種作用:第一種是新區塊會將一些交易添加到賬本中,第二種是更含蓄的,新區塊也會對其所有間接和直接區塊進行認證。這就好比說,證明某條鏈是最長鏈。

因此,第一種作用直接與吞吐量相關。交易提交得越快,賬本能包含的交易就越多。第二個角色與確認延時相關:我們投票的速度越快,你對交易的信心就越高。

1. 吞吐量

在比特幣中,我們已經看到了由于分叉而導致的吞吐量有限。如果存在一個根本就沒有分叉概念的結構,會怎么樣呢?這就是我們引入“交易區塊”(transaction block)的原因。

“交易區塊”由礦工以較高的挖礦速率挖出,但是交易區塊之間沒有任何鏈結構。所以我們可以非常快地挖出它們,而不用導致分叉,因為在這個設計中根本不存在分叉。

然后我們將這些“交易區塊”帶到“申請人區塊”(proposer blocks)。這些是輕量級區塊,只包含指向這些交易區塊的哈希指示。“申請人區塊”將以比特幣的速度開采,并以比特幣最長鏈連接在一起。因為我們挖礦的速度很慢,而且這些區塊很小,所以不管你怎樣提高吞吐量,都不會導致分叉增加。

這就是為什么Prism可以在不犧牲安全性的情況下實現底層網絡的物理限制。Prism同時基于最長鏈和工作量證明。

礦工將同時挖出兩種類型的區塊。他們將使用區塊的哈希值來決定其會變成什么類型的區塊:交易或申請人。

2. 延時

為了處理延時,我們首先注意到,即使我們引入了申請人鏈,投票率也不會增加,因為只有一個申請人鏈在進行投票。所以讓我們再做一次解構,把投票和申請人區塊分開。

我們把申請人區塊分成了兩部分。一個包含指向交易區塊的哈希指示,另一個是投票者區塊(voter block),它只包含對申請人區塊投票的指示。我們不再在申請人區塊中采用最長鏈結構。相反,我們假設在投票區塊中有一個像比特幣一樣的最長鏈結構。

到目前為止,我們還沒有改善確認延時,因為我們仍然只有一個投票者鏈,而且這個投票者鏈是安全的是非常重要的,所以我們仍然需要等待25個確認,否則攻擊者可以像攻擊比特幣一樣攻擊投票者鏈。

現在我們已經把申請人和投票工作分開了,我們可以引入許多投票者鏈,比如1000個投票者鏈。一個有趣的發現是,現在我們有1000個投票者鏈,我們不需要每一個都是安全的。即使攻擊者能夠攻擊一個投票鏈的概率為30%,但是攻擊者同時攻擊500個投票鏈的概率仍然很低。這就是為什么我們可以在不犧牲安全性的情況下降低Prism中的確認延時。

3. 性能

在我們于2019年發表的一篇論文中,我們從數學上證明,只要對手的算力低于50%,Prism就能像比特幣一樣,保證安全性、活躍度和一致性。對于吞吐量,Prism提供1 -beta乘以c,其中beta是對手的能力,c是底層網絡吞吐量。對于確認延時,Prism的確認延時與底層網絡延時d成正比,與確認可靠性成正比,與投票者鏈的數量成反比。

這看起來很有希望,但我們來看看它在現實世界中的表現。這是理論不能告訴我們的。首先,我們必須承認這個協議比比特幣稍微復雜一點。其次,在理論上,我們假設了一個簡化的網絡模型。還記得嗎,當我們描述Prism的確認延遲時,我們使用了大O符號,所以它是成比例的,我們不知道這里的常數;最后,網絡中一定還有其他瓶頸,那么這些瓶頸是什么呢?

這就是我們做系統部署的原因。

部署Prism

我們通過10000行Rust代碼實現了Prism的部署,其基于UTXO模型,并pay-to-pubkey交易。代碼是開源的。

Prism可以實現每秒70000交易和10秒的延遲。

區塊鏈客戶端的作用是:1)參與共識。它接收新的區塊,將它們連接成一條鏈,并挖出新的區塊。2)同樣重要的是,其可以獲取區塊并生成交易的順序。

Prism共識協議的核心角色是對交易進行排序。與比特幣不同,我們允許雙花交易。只要每個人都同意這個順序,那么他們就可以計算UTXO集并自行刪除無效的或重復花費的交易。這是賬本記錄模塊的工作,它按交易的順序依次執行,以生成最終更新的UTXO集。

在部署之后,我們了解到Prism能夠將區塊鏈的瓶頸從共識轉移到賬本記錄。這個瓶頸在于UTXO集的存儲。為了實現高吞吐量,你必須并行處理共識和記賬。

我們做了一些優化。我們做了“計分板”(Scoreboarding)來平行記賬。我們做的賬本保持異步一致,以便我們可以并行共識。我們還在客戶端引入了一個功能設計模式,并禁用了交易廣播,以獲得較高的網絡效率。

記分板在現代CPU設計中被用來執行并行指令。假設我們有兩個CPU,希望一次執行兩筆交易。如果第二筆交易開始,那么第二筆交易就會通過,但是第一筆會失敗,因為那是違反交易順序的,是不正確的。

計分板技術引入了一種很簡單的表格,在我們執行交易之前,我們會記錄下這個交易將會接觸到什么幣,將會使用什么幣,將會產生什么幣。在執行另一筆交易之前,我們將查看記分板,看看是否有我們將要生產或使用的幣已經存在于記分板中。在開始第一筆交易之前,我們會在記分板上標注a和c,假如我們在隨后的交易中再次碰到了a幣,就會產生沖突。然后執行一筆不同的交易,我們發現他們可以同時完成。對于其余的交易,我們發現它們之間沒有沖突,所以它們也可以一起執行,我們得到了正確的結果。

在優化之后,客戶端在CPU內核上實現了幾乎線性的擴展,即擴展到8個內核,并且在此基礎上,SSD和數據庫為性能設置了上限。

另一個重要的優化是我們根據共識進行異步賬。我們注意到,在Prism中,賬本更新的頻率與區塊挖出的速度相比非常低,因為我們有1000個投票者鏈。每一個投票者鏈和每一個單獨的投票者區塊非常不可能觸發一些新的交易被確認,不像比特幣,每一個新的區塊觸發一些交易被確認。因此,我們不會在每次接收到區塊時都進行記錄,而是將其放入一個來自共識邏輯的異步循環中,這樣它就可以在自己的循環中運行。我們能夠在共識邏輯中刪除很多鎖,并且我們的共識邏輯是無全局鎖的,所以它可以使用多個線程和多個CPU內核并行地處理即將到來的區塊,這樣就可以保持較高的區塊速率。

部署評估

最后,我將介紹我的評估結果。我們使用了100到1000個AWS EC2實例,這些都是輕量級實例,不如我現在用的筆記本電腦。我們將節點連接到拓撲結構中——每個節點連接到4個隨機節點。我們在每個節點之間引入了一個120ms的傳播延時。對于每個節點,我們設置了400mbps的入口和出口帶寬限制器來模擬真實的互聯網。

我們將我們的部署與比特幣和bitcoin-ng進行了比較,并測試了Pism是否可以擴展到更多的節點(比如這里的1000個節點),并評估了我們的部署在CPU或帶寬利用率方面是否有效。最后,我們評估了“Prism”在不同類型攻擊下的表現。

Prism每秒有7萬筆交易。我們可以看到,最長鏈協議將性能與安全性結合在一起,因此如果你想要增加區塊大小以獲得更高的吞吐量,那么必須降低挖礦速率,從而獲得更高的延時。這是一個權衡曲線,如果你增加延時,那么你也可以增加吞吐量,但如果你想要低延時,那么你必須付出吞吐量的代價。

我們的參數在最長鏈協議,所以它比今天的比特幣快得多。但是,我們的確認延時仍然無法少于100秒,并且吞吐量不能超過每秒10000筆交易。

我們通過修改我們的代碼在bitcoin-ng進行了部署,我們看到bitcoin-ng實現了更好的吞吐量,但延時仍然像比特幣或最長鏈協議,因為它本質上使用最長鏈協議進行投票和確認。

最后,我們與Algorand進行了比較。我們在相同的AWS拓撲設置中運行公開的Algorand代碼,我們發現其吞吐量極限為每秒1000筆交易。

然后我們評估了不同安全設置下的協議。我們發現,在Prism的確認延時方面,我們只付出了一點代價,而且我們沒有損失任何吞吐量,因為在Prism中,我們將吞吐量與安全性解耦了。

最后,我們還測試了具有更高安全設置的prism。

我們的部署非常高效。超過75%的CPU功率用于必要的任務,如檢查簽名和更新UTXO集。對于帶寬,由于我們使用了1000個投票者鏈,它可能看起來效率很低,但實際上超過99.5%的數據是實際有用的數據,少于0.4%的是投票者區塊。

Prism的解構方式是將比特幣中的區塊解構為一個申請人和一個投票者,并將每個部分進行擴容以接近性能的極限。我們發現,為了獲得高吞吐量,我們必須并行化一切——共識和記賬客戶端。

我們發現prism能夠將瓶頸從共識轉移到記賬、SSD和數據庫。而且,Prism是中本聰共識的自然延伸。

本文來源:巴比特資訊 原文作者:Lei Yang 責任編輯:yuele
聲明:奔跑財經登載此文出于傳遞更多信息之目的,并不意味著贊同其觀點或證實其描述。文章內容僅供參考,不構成投資建議。投資者據此操作,風險自擔。

評論

還沒有人評論,快來評論吧

相關新聞

區塊鏈行業北漂的SOHO日記No.1:媒體之責,何德何能

2020-02-04 17:49
在這個特殊時期,讓我們一起努力吧!>
好野的狗 11777

區塊鏈行業北漂SOHO日記NO.2:致敬抗疫英雄

2020-02-07 18:58
2月7日,陰。一邊踉蹌前行,一邊重振旗鼓。>
明曦 11998

以太坊2.0存儲合約UI將在EthCC上亮相,有望于4月上線

2020-02-24 11:41
該界面的早期版本此前已被泄露。>
巴比特 3205
股票配资系统