公有鏈的七大超級難題之兼得安全性的高 TPS

Dapp 技術 BlockchangeCommons 2018-07-24

TPS 真的越高越好嗎?

對於區塊鏈處理速度無法滿足商用這個難點,業內早已達成共識, 大家也都因為以太坊虛擬貓造成的以太坊擁堵事件是耳熟能詳。Sharding 成為了 2017-2018 最火的技術。

但是要知道,區塊鏈的誕生並不是為了盲目的高性能,有太多人走向極端,過度宣揚 TPS 的重要性,動輒上萬,甚至十萬百萬。這就走向了另外一個極端,好比在一個小村鎮建一個 16 車道,且不論可行性,即便造出來,也沒有這麼多車來開。

以下是一些主流公鏈或者項目的

TPS 與用戶量的指標

我們能看出,用戶量和 TPS 並沒有特別大的關係,而是和市場需求有關。

首先,技術發展和基礎設施(節點等)需要一定的時間。不單單是 TPS 一項指標,區塊鏈的其他技術也有待突破。系統的吞吐量和 TPS 其實是兩碼事。區塊鏈作為一個系統,最終量化性能的其實是吞吐量,也即單位時間內成功傳輸數據的數量,對 CPU 的消耗、外部接口、IO 等等緊密關聯。區塊鏈的網絡節點更為分散,性能不如中心化服務器的帶寬,區塊鏈的 TPS 很可能不是速度處理的瓶頸。

以網速來舉一個例子, 一般個人用戶的網絡速度為數千 KB 每秒,(很少可以達到帶寬上限),假設一個交易記錄所用容量為 0.5 - 1 KB,加上不同節點所需的傳輸步驟,千級別的 TPS 基本就不是效率的瓶頸。

其次,從使用量角度分析:假設有 x 為每天的交易記錄數,所需的 TPS 是 y。我們以簡單的二八原則來考慮:x 筆交易記錄 80% 在 20% 的時間完成,y 需要滿足高峰期的要求。那麼:

y1 = x80% /(24 h20%)* 3600 ) = x / 21600

如果節點完備,用戶發展良好,可以進一步假設用戶平均分佈,那麼:

y2 = x / (24 h*3600) = x / 86400

由上表可見,即便是公鏈每天進行 1 億次交易,千級別的 TPS 也足以應對。目前區塊鏈從發展到猛增階段過渡,我們拿以太坊做一個參考,目前峰值大約為每天 1250k 筆交易,即 1.25 million,下一階段的工作為做好百級別的 TPS,以及探索千級別的解決方案。

當然,如果公鏈需要支撐 DAPP 的集中市場營銷就另當別論了,例如雙十一搶購,全天完成 14.8 億筆交易,峰值 18 萬 / 秒。除非你認為區塊鏈上面的用戶可以持續保持雙十一搶購的狂熱,不然不需要進行十萬級別的處理速度。而話又說回來,真正的點對點經濟模型如果可以建立,是不太可能出現如此集中的交易的。

需要注意的是,上述是對於交易記錄數量的分析,是指使用區塊鏈進行 token transafer 或者部署智能合約的用戶 。

可以粗略估算一下,假設一個公鏈有很多 DAPP,共有千萬級別用戶,每個用戶每天使用不同的 DAPP 消費 10 次(大部分人平均每天沒這麼多消費,實際使用中,並不是每個 DAPP 的用戶的每項操作都需要進行 Token Transfer。假設有一個基於區塊鏈的淘寶,用戶平常更多的是瀏覽商品,編輯購物車,與買家討價還價等操作,真正下單的操作佔比很少。

事實上,不同的應用的用戶數,PV (page view) 與 TPS 都存在 一定的函數關係。這需要根據市場需求來具體建模),系統 TPS 達到千級別也是足夠承載的。2C 用戶突然大規模來使用區塊鏈產品並不現實,真正從可轉化為的用戶量全球保守估計為一千萬。

最後,需要注意的是單機測試的 TPS 並不是最終的 TPS,有的項目方為了刷高 TPS,購買數百萬的設備在一個實驗室內進行測試只是起到 PR 效果或者自娛自樂,沒有大規模被使用的公鏈討論 TPS 是沒有意義的。

所以,在公鏈性能上,並不是 TPS 越高越好,它是根據市場需求而定的。按照現在的情況,TPS 過千,已經能滿足大部分商業需求。過高的 TPS,必然會降低安全性,也可能會導致性能過剩,所以,TPS 的速度,並不是一個公鏈最終的目的。

TPS 的概念

TPS:Transactions Per Section,系統每秒鐘處理的事務。根據定義,TPS 計算方法是:TPS = 併發數 / 平均響應時間

對於區塊鏈系統而言,TPS 就是每秒鐘新產生的交易記錄。礦工將區塊打包提交到網絡,每個區塊鏈包含一定數量的交易記錄,這個「一定數量」就是是併發數(為了增加一定程度的併發,提高 TPS,中本聰創造 BTC 的時候,使用的是“區塊鏈”的數據結構,來代替「鏈」式數據結構,)。所以在區塊鏈系統中我們也可以這樣計算 TPS:TPS = 一個區塊內包含的交易數量 / 區塊產生時間

以中本聰設計的比特幣為例,一個區塊大小為 1 mb,每筆交易記錄平均大小為 495bytes (數據來源:https://www.bitcoinplus.org/blog/block-size-and-transactions-second):

那麼平均每個區塊的交易數量 = 110241024 bytes / 495 = 2118

區塊產生時間約為 10 min,那麼 TPS = 2118 /(10*60) = 3.53

對以太坊來講,以太坊每個區塊包含的交易記錄數量不固定,而是根據 gas limit 來決定。區塊交易數量波動較大,從幾十到一兩百不等,區塊產生時間也波動較大。我們在 etherscan 粗略統計 ETH 平均每秒交易記錄,計算得出每秒產生約十餘個交易記錄。

那麼,區塊是如何產生的呢:

Step1: 節點運行共識 : 節點不斷監聽系統,並開始運行共識算法,例如 PoW 共識算法是根據區塊頭 和 nonce 進行哈希運算。

Step2: 廣播並驗證的時間:當一個節點完成計算後,提交給網絡中的 peers,驗證後加入到區塊鏈上,繼續廣播,直到網絡中的節點均達成共識。比如一個班的人想達成共識,老師率先作出答案,把答案傳遞給第一排的同學,第一排的同學驗證完畢傳遞給第二排的同學…. 直到最後一排的同學也驗證完畢才算達成共識。

Step3: x 個 confirmation 之後被認為是安全的:為了防止區塊鏈被攻擊,通常在數個甚至數十個 confirmation 之後才可以動用轉入的 token,例如一些交易所要求 12 個 confirmation。這裡的 x,confirmation 數量是指從包含目標交易的區塊開始往後數,相繼有 x 個區塊依次掛到區塊鏈上。x 越大,表明區塊鏈越長,越難被攻擊者更改。

這三步是有前後次序的,不能併發。事實上,區塊產生的時間僅為第一步與第二步,第三步是前兩步的循環往復,用於確認系統的安全。所以,TPS 的計算公式為:

TPS = 一個區塊內包含的交易數量 / 區塊產生時間
= 一個區塊內包含的交易數量 / (共識算法運行的時間 + 廣播並驗證的時間 )

提升區塊鏈 TPS 的方法

根據上述推論和公式,我們認為提升區塊鏈 TPS,可以從以下幾方面入手:

1. 增大一個區塊內包含的交易數量(或連續出塊)

前文講過,區塊容量相當於是併發數,區塊容量越大, 越容易形成中心化的系統,一旦系統被惡意攻擊,受到的損傷也越大。

所以可以適當的增加容量,但不能為了追求 TPS 而盲目擴容。因為這相當於少數節點埋頭計算,間隔很久才和其他節點交流一次,不安全。

典型代表:比特幣擴容和 Genaro 的混合共識機制。但比特幣的擴容,更多是不是技術層面,而是應用層面的爭論。

而 Genaro 的 SPoR+PoS 混合共識機制,利用 SPoR 來篩選可信節點,這些可信節點可以同時處理更多的交易,讓被選舉的共識節點連續出塊來提升 Genaro 公鏈的性能。

2. 減少共識算法的複雜度

算法時間複雜度越低,相同硬件條件完成算法的時間越短。

典型代表:Genaro 使用 SPoR 來代替 PoW。SPoR 是數據可檢索性證明,並不需要消耗大量算力,且不隨時間而遞增。詳情見第一篇文章《設計可持續發展的共識算法》中對 SPoR 的介紹。

「在 Genaro 系統中每天都會對存儲節點進行 challenge」,存儲節點通過運行 SPoR 算法表明數據是可被取回的。

這種證明的難度不會隨著時間的推移而增加。證明一個文件可取回,今天的計算量和明年是幾乎一致的。且 SPoR 是雲存儲領域中本身就被驗證為可靠的算法,不會對系統帶來隱患,同時是在做有價值的計算。

3. 減少廣播的目標節點

以太坊是全節點達成共識,目前以太坊的節點數量為 16750 個。全節點達成共識,不僅受最慢節點的短板效應的影響,也因為不斷的廣播,在網絡傳播中耗費大量時間。

而如果只選取部分節點,僅在這部分節點中廣播,相當於只讓班裡最聰明的人來計算並相互驗證即可,可以有效減少傳播節點和廣播時間。

典型代表:EOS 的 DPoS 通過 21 個超級節點完成驗證,EOS 採用的是 DPoS (委託權益證明)共識機制,它是由被社區選舉的可信帳戶(受託人,得票數排行前 21 位)來創建區塊。 21 個超級節點相比於以太坊現有的 16750 個節點,21 個節點在速度上將有更大的優勢。減少廣播時間,極大的提高 TPS,讓 EOS 對外的宣傳上,敢對標 ETH,說自己最高達到百萬 TPS。

但問題在於,只選取部分節點達成共識,更容易被攻擊。黑客不需要進行 51% 攻擊,只需攻擊那些特定的節點。此外,選取制度不完善或有漏洞,系統很容易被操控,例如賄選,這也是 EOS 選舉超級節點的一個爭論。

Genaro 的部分 PoS ,也減少了廣播的目標節點,來提高 TPS。Genaro 採用混合共識機制,先由 SPoR 進行信用篩選,然後選取 101 個節點出塊,既保證安全性,又增加了速度。

4. 取消驗證步驟

一個節點運行完共識算法後,提交區塊,其他節點不加思考,即可同意,這種方法會節約大量時間,因為相當於無條件信任運行共識算法的節點,若想避免被攻擊,只能中心化管理服務器。

5. 減少區塊鏈產生時間:Sharding

Sharding 是數據庫中的常見方法,也即並行運算。區塊鏈本質上也是存儲數據的一種方式,所以用數據庫的優化方法是個好主意。

互聯網數據庫的分片是指,將一個數據庫(可以想象為一個 excel 表單)切成多個片,每當運行一些查找等基本操作時,可以在多個片併發進行,從而把鏈式查找的時間複雜度從 o(n) 減少到樹式查找的 o(logn)。

典型代表:Zilliqa,公有鏈,為高吞吐量的應用程序提供運行平臺。在最新的實驗中,測試網絡達到每秒處理 2,400 個交易以上。比目前的主流區塊鏈平臺快了 200 多倍。Zilliqa 區塊鏈平臺致力於支持高吞吐量和數據驅動的分佈式應用程序,以滿足諸如電子廣告、支付、共享經濟和產權管理等業務必要的擴容需求。而他的核心是分片技術 Sharding。

假設網絡存在 6000 個節點,Zilliqa 將自動把網絡劃分成 10 組分片(每分片共 600 節點)。各分片能同時進行交易驗證。若 1 組分片能在一定時間內驗證 400 筆交易,那 10 組分片便能在同樣時間內驗證 4000 筆交易。

還有其他很多火熱的項目也都是踩到了 Sharding 的點,例如夸克 Quarkchain、ETH、MOCA 等。

Sharding 只是分片(並行)的一個技術名詞,不同項目可能是對區塊鏈的不同部分進行 Sharding,例如交易 Sharding,共識 Sharding,智能合約 Sharding 等。

然而區塊鏈中的 Sharding 卻比普通數據庫難的多。互聯網數據庫大多為無序狀態,而區塊鏈是高度有序的狀態:新區塊一定要在老區塊之後誕生。所以無論如何 Sharding,都只能是考慮一個區塊內的併發,無法做到整個鏈的併發。

6. 此外,還可以跳出框框來考慮問題:off chain solutions,鏈外處理方案

鏈下解決方案將部分交易放到鏈外,並將這部分的總賬與系統結算。比方你經營一家咖啡店,所有的交易都發生在你的咖啡店裡,咖啡店的賬只跟你結算,但最後你的賬會跟全球的金融系統來結算。

典型代表:比較典型的代表有以太坊的 Raiden Network (雷電網絡),團隊宣稱已經成功在去中心化應用網絡上完成了第一筆鏈外交易。雷電網絡增加了以太坊的可拓展性,同時使代幣的鏈外轉移速度更快,費用更加低廉。我們可以形象地以升級遊戲舉例,遊戲中的所有出牌得分都是鏈外進行,只有最後的結果被記錄在了區塊鏈上。

同理,比特幣的外鏈 Lighting Network (閃電網絡)相當於在比特幣主鏈外設立點對點支付通道,實現多次、高頻得實現瞬間確認的支付形式,所有用戶的交易可以在這個通道內進行而不被記錄在比特幣主鏈上,主鏈記錄的是用戶之間最終結算的數據,通過鏈外處理方式,實現 Visa 級別的支付速度。

還有我們熟悉的 Plasma,所有數據計算可以在鏈下發生,但最終可在鏈上強制執行小量的更新。與閃電網絡類似,Plasma 是一系列的運行於現存區塊鏈之上的智能合約,來強制保證大家可以可以在一個合約狀態中持有資金,且能在後面的某個時間在網絡上進行清算、取款,以此來增加網絡的拓展性。

鏈下處理內部交易,DAPP 的需求非常大。試想這樣一種場景,每個 DAPP 和每個用戶部署單筆交易的結算合約,又和公鏈合理的批量結算,兩邊通過合理設定保證金、交易規則等來確保系統獨立運行。那麼公鏈只需要承載直接用戶與各個 DAPP 即可,DAPP 的海量用戶均可以鏈下完成交易。

Genaro 團隊也在進行跨鏈 / 鏈上鍊下協議的研發,我們會在後續文章中進行跟多的分享。

不可能三角

通過對於以上提升 TPS 方法論的研究,我們會發現:提升 TPS 的就是靠放寬 Verify,犧牲安全性或者去中心化程度。如果盲目增加 TPS,會使得區塊鏈完全犧牲了去中心化,同時對礦工的機器配置要求極高,如果跟不上上傳的交易,越多沒有被驗證的交易,後面的隱患越大 。EOS 雖然使用 21 個超級節點達到高效,但同時犧牲了去中心化與安全,引入了 ddos 等潛在風險。這就是著名的不可能三角:效率,安全性與去中心化不可兼得。請記住,提升任意一個指標,必然會犧牲其他兩個指標,如果有一個項目聲稱打破了不可能三角,那 99.9% 是不靠譜的。

如果選擇去中心化和高效低能耗,則要犧牲安全性,在金融領域,這個方案几乎可以一票否決;如果選擇去中心化和安全,捨棄高效低能耗,必然導致交易模式和場景的極大壓縮,幾乎是在所有商業主流業務上的全面撤退;最後,如果選擇高效低能耗與安全性,又破壞了「去中心化」的願景。為了走出這個困局,其實每個項目需要思考的不是如何盲目兼顧三個點,而是其面臨的市場需求可以允許犧牲哪個點。

本文的標題是「兼得安全性的高 TPS」。筆者認為,在當前公有鏈的技術體系與應用場景中結合來看,三個因素當中可以一定程度犧牲的是「去中心化」。

這個結論可能令人一下難以接受,畢竟區塊鏈在人們心中就等於去中心化。比特幣作為第一個區塊鏈應用,去中心化的設計目的在於:不需要信任任何一個節點,通過共識機制的巧妙設計來信任整個系統,同時防止被攻擊。總結一下,去中心化的目的在於:讓系統可信且安全。

所以,去中心化不是目的,而是手段,高效低能耗和安全才是目的。

Genaro 通過把存儲網絡引入共識機制來達到同樣的目的。雖然不是全節點共識,但 Genaro 的存儲網絡+公有鏈的雙底層結構,是對全節點進行篩選,前 101 名貢獻最大的節點作為委員會節點進行出塊,整個網絡都參與進了全程的不同階段。

在比特幣的 PoW 共識中,歷史表現不能代表未來對於網絡的貢獻,每次出塊時所有節點都必須在同一起跑線進行 PoW 運算,而 Genaro 增加了一個存儲的維度,存儲貢獻是一個對網絡連貫的貢獻,可以根據歷史表現來「預判」其未來的可信度。首先,Genaro 存儲網絡中設立了極為嚴格的懲罰措施,如果經常掉線,其 Stake 的 GNX 將被減扣,從而確保大節點的可信度;此外,Genaro 公鏈是不會被分叉的,因為分叉鏈無論如何都掌握不到存儲網絡的全部數據,除非有一個人攻佔了全部存儲節點。從而,可以在一定程度犧牲去中心化的情況下,依然保持了系統的安全性、可信度,同時提升了效率。

最後補充一點,不可能三角雖然不能被打破,但是可以隨著技術日新月異的進步對於系統整體提升。打個比方,短跑與長跑不可兼得,短跑運動員都很強壯,長跑運動員都很纖瘦,一個運動員短跑越強,長跑一定會變弱。但普通上班族和博爾特比長跑,大概率是贏不了的,就是因為博爾特整體能力都相比普通人類進行了提升。現在的互聯網技術無論是安全性還是效率都遠高於 90 年代,有理由相信隨著軟硬件的不斷提升,不可能三角限制將逐漸弱化,行業將迎來總體性能的提升。

我預計 2018 年 TPS 的問題即可被解決,而另外的一些難題則要更為困難。