區塊鏈分片技術相關資料收集

區塊鏈分片技術相關資料收集html

分片要提升的就是每秒交易量tps
目標是很明確的,比特幣的tps是7,以太坊的tps是15,eos如今的tps是三千多,理論上能夠達到10k須要不少dapp來實現,但現實生活中visa信用卡的tps是2萬,淘寶的tps是20萬。程序員

分片的基本思想是,將網絡中的節點分紅不一樣的碎片,各分片能夠並行處理不一樣交易,這樣能夠並行處理相互之間未創建鏈接的交易,以提升網絡併發量。分片方案的特色是,隨着節點數目的增長,網絡吞吐量也隨之增長。算法

--------------數據庫

被看作公鏈將來的分片技術,究竟離咱們還有多遠?_36氪
https://36kr.com/p/5139981.html
最近V神總說的以太坊分片技術是什麼? _鳳凰財經
https://finance.ifeng.com/a/20180503/16233643_0.shtml編程

分片技術(sharding)——區塊鏈擴容問題的良方
http://www.cocoachina.com/blockchain/20180326/22770.htmlapi

zilliqa如何用分片技術把7筆/秒的區塊鏈交易提高到2488筆/秒的?區塊鏈大本營
https://mp.weixin.qq.com/s?__biz=MzU2MTE1NDk2Mg==&mid=2247485314&idx=1&sn=607b95ca6d9b9051f3a8d272423a26cd&chksm=fc7c597fcb0bd069c30b248486b9268c149b327a64cf5a34077f06b67b29dfd629622f04d1ea#%23瀏覽器

======================安全

擴容,本意是能夠經過數據庫拆開成小段,改變網絡內部各步驟之間的驗證方式實現分片,增長吞吐量。因而可知,分片是一項複雜的工做,如今不少項目爲了實現擴容,採用分片技術。性能優化

分片是一種基於數據庫分紅若干片斷的傳統概念擴容技術,它將數據庫分割成多個碎片並將這些碎片放置在不一樣的服務器上,在底層公有鏈的系統內,網絡上的交易將被分紅不一樣的碎片,其由網絡上的不一樣節點組成。所以,只須要處理一小部分輸入的交易,而且經過與網絡上的其餘節點並行處理就能完成大量的驗證工做。將網絡分割爲碎片會使得更多的交易同時被處理和驗證,所以,隨着網絡的增加,區塊鏈處理愈來愈多的交易將成爲可能。但這極其具備挑戰。服務器

其基本思想是,將網絡中的節點分紅不一樣的碎片,各分片能夠並行處理不一樣交易,這樣能夠並行處理相互之間未創建鏈接的交易,以提升網絡併發量。分片方案的特色是,隨着節點數目的增長,網絡吞吐量也隨之增長。

然而,該技術具備必定的複雜性,在具體落地上有諸多問題須要解決,鮮有項目真正將分片方案落地。來自新加坡的公鏈項目Zilliqa但是說是第一個將分片技術落地的項目,目前項目代碼已經開源,他們所以受到了業內的關注。

======================
分片技術(Sharding)是以太坊網絡的一種加強自己性能的改進方案,你能夠把它理解爲比特幣中的「擴容」,目的很直接就是提高交易速度,只是二者實現的途徑不太相同。

相對來講,比特幣的擴容的邏輯很是直接,你不是交易速度慢嗎,那麼我直接增大區塊容量,讓每一個週期(約10分鐘)記錄到區塊的交易記錄數量變多,那麼交易吞吐量天然就上去了,簡單而粗暴。

而Vitalik Buterin認爲當前主流區塊鏈網絡之因此慢,是由於每個節點(礦工)要處理全網的每一筆交易,這種低效率的方式必然會形成低下的性能。分片技術的構想是,一筆交易沒必要發動全網都去處理,只要讓網絡中的一部分節點(礦工)處理就行了。因而,以太坊網絡被劃分紅不少片,同一時間每一分片均可以處理不一樣的交易,這樣性能將直線提高。

有一點值得注意的是,區塊鏈技術的重要思想是多中心化,全網都去見證(處理)同一交易,這才具備最高的公信力。而以太坊分片技術,則是犧牲掉必定的多中心化特性來達到高性能的目的。其餘主打性能的公有鏈,好比EOS,本質上都是犧牲必定的多中心化特性。

這下你們明白以太坊分片技術是什麼,秉持一種怎麼樣的邏輯了吧。關於分片技術具體的實現方案,其實截稿時Vitalik Buterin也尚未最終敲定,還處在構想與探討中。不過度片並非什麼新技術,實現並不難,主要是須要肯定一種最合理、最穩妥的方式。Vitalik Buterin在最新的推文中表示以太坊分片技術最重要的原則是「最大限度地接近與單一區塊鏈相同的性質」。

=======================
Zilliqa的白皮書提出:「在以太坊現有的3萬名礦工的網絡規模中,Zilliqa交易速度有望達到以太坊交易速度的1000倍。」目前在測試鏈上,Zilliqa的交易速度達到了每秒2488次,擁有6個碎片模塊,3600個節點。

Zilliqa是來自新加坡的底層公鏈項目,能夠實現高吞吐量。該項目經過分片技術解決區塊鏈擴展性低的問題,爲用戶提供平臺使用權,用於支付、交易、處理或運行智能合同。

通常來講,每一個節點和區塊鏈網絡都包含區塊鏈的完整副本,分片的概念則涉及將區塊鏈分割成多個以並行方式處理交易的較小部分,從而加快交易吞吐量和容量,下降交易成本。分片技術先於比特幣,但一直未被證實在開放式無需受權網絡中的可行性。

Zilliqa所採用的分片技術是將區塊鏈工做進行拆解,先造成頭部的Boss區塊,以後在主鏈上造成多個依附於Boss區塊的分片區塊,Boss區塊和分片區塊各自擁有獨立的礦工,能夠獨立地執行上鍊消息(交易)的記帳和共識指令。

事實上,以太坊也計劃在將來引入分片技術。V神在其twitter裏曾說:「分片即將到來。」他認爲,分片將大幅度提升以太坊現有的限制,實現擴容。

相比以太坊以前提出的分片擴容方案的設計,Zilliqa加了一個最終區塊回傳信息的步驟,使得全部的節點也保存其餘節點處理的信息。

====================
被看作公鏈將來的分片技術,究竟離咱們還有多遠?_36氪
https://36kr.com/p/5139981.html

PC時代,微軟成爲行業霸主。移動互聯網時代,谷歌穩居市值首位。也許咱們沒法預測將來哪些場景搬上鍊會有將來,甚至沒法預測區塊鏈是否有將來。但咱們能夠確定的是,若是區塊鏈真的能帶來價值互聯網,必然須要能承載如此使命的公鏈。

然而現實是,這樣的一條公鏈仍未出現。

EOS被寄予厚望,但如今主網剛上線,判斷格局言之過早。從目前來看,可擴展性、安全性、去中心化這區塊鏈的「不可能三角」,依然沒有獲得完美的解決。大體來講,目前常見的方法有以下幾種:一是改變共識機制,好比Hyperledger的PBFT、EOS的DPoS,這也每每也犧牲了部分去中心化;二是改變了網絡結構,好比IOTA、byteball就使用了不一樣於區塊鏈的DAG(有向無環圖)的數據結構;三是直接利用鏈外方式解決,好比鏈下的子鏈/側鏈、狀態通道,甚至是跨鏈中間件等;第四種,則是分片。

V神最近來中國演講,講的就是分片。做爲以太坊採起的將來擴容方案的一部分,分片可謂萬衆期待。

其基本思想是,將網絡中的節點分紅不一樣的碎片,各分片能夠並行處理不一樣交易,這樣能夠並行處理相互之間未創建鏈接的交易,以提升網絡併發量。分片方案的特色是,隨着節點數目的增長,網絡吞吐量也隨之增長。

然而,該技術具備必定的複雜性,在具體落地上有諸多問題須要解決,鮮有項目真正將分片方案落地。來自新加坡的公鏈項目Zilliqa但是說是第一個將分片技術落地的項目,目前項目代碼已經開源,他們所以受到了業內的關注。其市值一度漲至加密貨幣21位。

最近,Odaily星球日報採訪了Zilliqa的聯合創始人兼技術總監賈瑤琪,後者分享了Zilliqa的進展、將來的規劃,對各類區塊鏈擴容方案的優劣,以及對行業的見解。

分片技術最先被用於數據庫中,它將數據庫分割成多個片並將這些片放置在不一樣的存儲設備(分區)中,這樣每一個分區的數據量相對就會小不少,從而知足系統的性能需求。業內人士認爲,分片加強了系統性能和可擴展性(Scalability),但與此同時也使系統的開發變得更爲複雜。例如,有兩條記錄分別處在不一樣的服務器上,若須要創建關聯,那麼極可能表示「關聯」的記錄就必須在兩個分區內各放一條。此外,一旦某事務須要跨數據分區處理,將大大下降性能。瞭解這個以後,咱們也許就更能理解分片落地到區塊鏈領域須要解決的問題。

Zilliqa對區塊鏈分片的研究始於2015年,當時新加坡國立大學師生Prateek Saxena和Loi Luu在國際頂級安全會議CCS上發表了關於分片的論文《A Secure Sharding Protocol For Open Blockchains(公有區塊鏈的安全分片協議)》,這也是有人在區塊鏈領域首次提出使用分片技術。此後,Prateek參與創立的新加坡Anquan Capital公司開始了區塊鏈分片技術研究。通過兩年的研發,團隊於2017年7月成立了Zilliqa公司。

根據專訪內容,咱們以問答形式將內容整理以下:

1、Zilliqa特色:分片技術、PoW+PBFT混合共識機制

Odaily星球日報:Zilliqa使用的分片策略是什麼?分片技術落地狀況如何?

賈瑤琪:Zilliqa的分片技術能夠這樣簡單地去理解:假設咱們有一個包含1000個節點的網絡, Zilliqa將自動地把該網絡分紅10個、每一個包含100個節點的分片,且全部分片可並行地處理交易。若是每一個分片每秒能處理n個不一樣交易,則全部分片每秒可一併處理10n個交易。這是一種水平的擴容方式,即網絡吞吐量隨着節點數量增長而呈線性增加,這是其餘擴容方式所不具有的特色。

咱們目前在作的分片包括網絡分片(network sharding)、交易分片(transaction sharding)和智能合約分片或計算分片(computational sharding)。

其中最重要的是網絡分片,由於其餘分片機制都創建在網絡分片之上。簡單來理解,網絡分片就是將整個網絡分組,每一個小組叫作一個分片(shard),全部分片同時處理不一樣的交易。在這個過程當中,咱們經過不斷刷新網絡和分片來保證安全性。與此同時,根據咱們發表在CCS安全會議上的論文,當每一個分片的節點數量不低於600個時,其中三分之一的節點是惡意的機率爲百萬分之一。

每當一筆交易進入網絡時,咱們會根據交易發送者的地址,進行必定的運算,隨機分配到不一樣的分片中,這一過程被稱爲交易分片。值得注意的是,這些交易是沒法自主選擇進入某個分片,由於每一個分片裏面的節點會拒絕執行不屬於本身分片的交易,這樣也保證了處理交易的安全性。

目前,咱們已成功落地了網絡分片和交易分片,將於本月底發佈2.0版公測網,這一版本的公測網將容許普通用戶做爲節點加入網絡成爲礦工。

Odaily星球日報:咱們知道,單純的分片技術自己是沒法保證交易的高吞吐量的,由於吞吐量也取決於每一個分片的單次時間以及出塊速度。Zilliqa使用的共識機制是什麼?

賈瑤琪:Zilliqa採用的是PoW+PBFT混合機制。

在公有鏈中,惡意節點可能會試圖經過操縱多個節點來破壞系統,並影響任何基於多數節點的決策過程。這就是一般所說的女巫攻擊(Sybil Attacks)。有幾種可能的方式可以使女巫攻擊代價高昂或難以進行。例如,經過要求節點存入至關多的金錢(或代幣)做爲抵押,或要求他們執行一些計算密集型任務如PoW。

爲了保證Zilliqa網絡的安全性,咱們要求全部加入Zilliqa的節點都必須作PoW。與此同時,咱們也知道,計算密集型的PoW須要大量的時間進行計算而且可能減慢共識協議,並且消耗能源較高。因此,在Zilliqa上,PoW是在更大的間隔上運行的,即全部節點在加入網絡以及每隔一段時間作一次PoW。在其他時間,爲了達成共識,Zilliqa用的是pBFT公式機制。

Odaily星球日報:你們常說,PBFT共識協議通常在更小的共識組中實現,好比少於50個節點時,因此它更適用於聯盟鏈。Zilliqa怎麼以爲這個問題?

賈瑤琪:咱們剛剛提到,Zilliqa經過分片技術和PoW保證了網絡的安全性。可是PoW耗時長、確認慢、耗能大等弱點。因此,Zilliqa選擇了pBFT來作共識,主要考慮是:1.它不是計算資源密集型的,比PoW耗能少;2.效率更高,由於它能夠利用一個小的共識組;3.它不須要反覆確認,賦予了交易最終性。換句話說,不像基於PoW的中本聰共識機制,一般須要多個確認區塊如比特幣須要至少6個確認,pBFT因爲它的共識協議確保不會發生臨時分叉,因此不須要確認。

在不少人的觀念中,pBFT主要用於聯盟鏈的一個很大緣由是,pBFT共識中節點之間通信成本高昂。好比,在n個節點的網絡中,使用pBFT達成共識須要的總通信次數爲n(n-1)/2,即n的二次方級,當節點數量超過50的時候這就是一個很大的數字了,且n越大通信成本上升速度越快。爲了解決這個問題,Zilliqa採用了多重簽名算法和一些其餘性能優化方法,減小pBFT花費的通信成本。

2、分片技術的難點和落地狀況

Odaily星球日報:你認爲分片在實踐過程當中可能有哪些須要解決的問題,或者難點?

賈瑤琪:分片技術原理聽起來很簡單,但在實際落地過程當中要注意如下幾個關鍵問題:

一、對女巫攻擊的防護。這個問題上邊已經提到了,即便用PoW來預防,在這裏我就不過多贅述。

二、建立分片、給分片分配節點和任務。如每一個節點如何選擇它去哪個分片;過一段時間,整個網絡確定也有舊節點要離開,新節點要加入,怎麼實現這些新舊節點的動態交換;以及每一個分片裏的節點處理交易,還要實現協議控制,這要如何作到高效等。每一個節點分配到哪固然不能由某特定我的或團體控制,由於若是這些人決定做惡,那麼他們能夠將全部惡意節點集中在一個分片中來損害網絡的安全性。正如以前提到的,Zilliqa採用的是隨機分片和動態洗牌的方式來保證網絡的流動性及安全性。

三、分片大小。分片裏的節點數量越少那麼達成共識也會也越快,效率也會越高。但同時,若是分片中的節點數目過少,那麼攻擊者就會更容易控制它。且每過一段時間,若是一個分片裏面的節點掉線或長時間聯繫不上,那麼該分片裏的總節點數就會進一步減小,那麼安全性也得不到保證。正如方纔提到,咱們經過論文證實當每一個分片的節點數量不低於600個時,安全性和效率可以獲得較好平衡。

四、跨片交易。區塊鏈領域的技術專家和工程師們廣泛認爲,由於跨片交易須要鎖協議,所以其開銷成本很高,當跨片交易數量上升時,會影響整個網絡的吞吐量和經濟效益。

咱們目前主要經過兩方面來應對這個問題:一方面,在分片設計之初就儘可能避免跨片交易的產生;另外一方面,咱們在最開始的Zilliqa分片論文中也提到了atomic commit protocol技術方案,這也是咱們這幾年來在研究的方向之一。除此以外咱們還在研究了多個其餘備選方案,咱們將在實現相對優秀的方案之後,將細節分享給你們。

Odaily星球日報:目前有很多區塊鏈項目也在考慮使用分片技術,你認爲分片技術在行業內的落地狀況如何?

賈瑤琪:現在分片技術「遍地開花」,這顯示出分片技術已經愈來愈成爲解決區塊鏈擴容的一種主流技術。另外一方面,隨着分片技術聲音的不斷提升,愈來愈多的社區成員也開始關注和支持分片技術。

不得不說的是,分片技術確實是一項很是難的技術,這也是爲何目前市場上宣稱作分片的項目多,但真正作出來的少的根本緣由。究其緣由,就是分片技術對安全性要求極高。我認爲目前這個市場上仍是有必定亂象:

一是陷入TPS競爭陷阱,忽視了最重要的安全性。你們都知道,去年淘寶雙十一交易的TPS峯值是25.6萬/秒,這是發展了這麼多年的中心化系統的處理速度。區塊鏈是一個新興技術,發展程度遠不如中心化系統成熟先進,目前熟知的比特和以太的TPS都不超過30。所以不少項目在現階段宣稱鏈上數十萬、百萬甚至千萬TPS,主要是爲了吸引了大衆眼球,但卻忽視了去中心化和安全性這些根本要素。

二是沒有數學運算或發表的論文支撐,前提和論斷草率不嚴謹。分片又被稱爲「分而治之」,其重點不只在於「分」,更在於「治」,即在切分的同時保證安全性。分片技術在傳統領域由來已久,但在區塊鏈中倒是新興技術,二者在概念上有些類似,但在操做上卻大相徑庭。所以,若是對區塊鏈的分片技術想固然,認爲在每一個分片裏放置幾個節點就算處理完成,那麼在實際上卻會致使惡意節點輕易地經過雙花交易等惡意操做而帶來一系列漏洞,而系統後期很難驗證或者回滾來減小這些惡意交易帶來的問題。

三是在沒有通過大規模測試的狀況下就輕易下結論,不夠專業。當計算機帶寬不是限制條件時,以太坊使用一個節點或不多的節點也能跑出成千上萬甚至百萬 TPS,但以太坊並在現實生活並無達到如此高的TPS,其緣由就是現實網絡不是由幾十個或者數百個節點組成,而是數萬個。僅用數十個或者一兩百個節點測試,跑出任何數據都是可能的,但這樣的數據是沒有說服力的。

四是一些方式可能不算真正的分片。目前,分片確實是一個很是熱點的話題,我我的認爲一些項目真正在作的更像是子鏈、狀態通道、或者分層而不是分片。

若是沒有通過科學的數學計算或者已發表的論文支撐,想固然地處理分片,並錯誤地把在理想狀態下少許節點跑出的數據當作主網實現的數據,可能會帶來一些嚴重的安全後果。相對較輕的狀況是,網絡屢次硬分叉,嚴重則會給投資者帶來巨大損失,這對投資者我的仍是區塊鏈自身的發展都是十分不幸的。

被看作公鏈將來的分片技術,究竟離咱們還有多遠?

Odaily星球日報:目前聲稱本身使用了分片的項目很多,你認爲剛剛提到的子鏈、側鏈以及狀態通道的解決方案,跟分片有什麼不一樣?

賈瑤琪:子鏈、側鏈以及狀態通道都屬於鏈下擴容,我認爲其核心思路是類似的,即每一個鏈能夠獨立自主地處理交易或者事物,相互之間不須要交流,最終把結算信息放在主鏈上。打個簡單的比方,在這些鏈中A鏈能夠作廣告、B鏈作遊戲、C鏈作交易等。他們跟分片最本質的區別是,分片是鏈上擴容,是對整個區塊鏈網絡的一個重構,節點也是相互關聯的。

我認爲鏈下擴容和鏈上擴容是互不衝突的,反而是相互補充的,將來能夠相互結合的,由於相互之間的應用範圍和側重點不一樣,都爲區塊鏈擴展提供了重要技術支撐。

Odaily星球日報:換言之,分片必須是對同一主鏈中的節點或交易作分片。既然是在同一主鏈,必然當中的節點都參與共識或者驗證全網交易。那麼,Zilliqa如何保證全部節點在參與自身分片共識的同時,也參與確認或驗證全網的交易記錄?

賈瑤琪:咱們有一個單獨的分片即DS委員會去整合每一個分片的結果,收集不一樣分片裏面交易哈希,進行一個共識協議,造成哈希的哈希,而後廣播,其餘節點驗證簽名。咱們的交易確認是分幾個階段的,若是你的交易在單獨一個分片裏面進行確認,那麼你的交易就有很高的機率被寫入區塊鏈,這樣的話咱們以後會作一個提示,告知交易已經初步確認,若是最終確認下來的話會再給你發一個通知,就是最終確認了。

另外,我想要說起的是,由於咱們目前作的不是狀態分片,因此有些人可能會產生Zilliqa網絡中每一個節點都是全節點的誤解,誤覺得這會致使過一段時間信息存儲會爆炸。但實際上,Zilliqa網絡中每一個節點要保存的是全網的最新狀態,而不是全部交易的歷史。固然,節點也能夠自發去做爲一個全節點,存儲全部的這樣一個歷史。這樣的全節點有一個好處,就是能夠去作本身的服務,例如像EtherScan,提供一個區塊瀏覽器,經過廣告來賺錢。何況,即使將來把狀態切成裝在不一樣的分片,那麼也是常量級別存儲量減小,其實差異沒那麼大。與此同時,咱們已經和Bluzelle、Genaro兩個作去中心化存儲的企業和項目合做,來支持智能合約去中心化的存儲。

Odaily星球日報:每個節點它都要同步最新的狀態,將來隨着節點數量增長,這會影響整個網絡的確認速度嗎?

賈瑤琪:在理論上,Zilliqa吞吐量隨着節點數量增長而增長。但在實際上,節點數量存在一個最佳點,規模增大到這個點以前,吞吐量都是線性增加的。

舉個例子,若是兩萬個節點就帶來了帶寬限制,從而致使了系統吞吐量已經沒法再增長,那麼整個網絡可能就會限制在兩萬個節點這樣的狀況。根據最新公佈的數據,以太坊目前有16000個節點,而咱們仍然在經過實驗獲知這個最佳點。

Odaily星球日報:Zilliqa最新測試網絡的TPS是多少?

賈瑤琪:咱們這個數據在不斷更新。在已公佈出的數據中,咱們使用1400個節點、6個分片,跑出了大約2800TPS的數據。理想狀態下每一個分片是600個節點,咱們目前選擇用每一個分片200個節點作測試主要是考慮到成本,由於咱們目前租用的節點是AWS、EC2,每一年須要上百萬美圓的費用作測試。

被看作公鏈將來的分片技術,究竟離咱們還有多遠?

Odaily星球日報:Zilliqa在智能合約方面有什麼規劃,主網上線時會有智能合約系統嗎?另外有觀點認爲,Zilliqa的智能合約語言Scilla不是圖靈完備的,爲何?

賈瑤琪:就像咱們路線規劃那樣,目前已發佈的1.0版公測網是不帶智能合約層的;本月底將上線2.0版公測網,從這個版本起,Zilliqa會支持部分智能合約了;第三季度上線主網;第四季度將上線一些實用的去中心化應用。

Zilliqa除了作安全分片外,還設計了新的智能合約語言Scilla,也發表了論文來論證。Scilla是一種攜帶證實的、中間的智能合約語言,其基礎計算模型基於通訊自動機。咱們但願經過使用Scilla,在區塊鏈平臺上編寫智能合約更加便捷簡單、安全可靠、擁有更高性能。

這幾年的DAO攻擊和Parity漏洞等都形成了數額巨大的資金被盜和凍結,一個很重要的緣由就是Solidity沒有形式化驗證,在溝通和計算上劃分不夠清晰。而Scilla爲智能合約的通訊和操做提供了多種分離層,是支持形式化驗證的,經過使用COQ等證實助理,能夠使開發者寫的代碼符合其想要的邏輯。

Scilla非圖靈完備更多的考慮是智能合約的安全性。以太坊的智能合約語言Solidity雖然圖靈完備,可是由於燃料費的存在,實際部署的智能合約是沒法無限循環的,因此也作不到圖靈完備。咱們發現以太坊上的智能合約有成千上萬個的漏洞。Scilla就是爲了不已有的智能合約中的漏洞,因此去掉了一些比較危險的API接口和功能;並且咱們發現目前全部智能合約不太須要圖靈完備。

咱們目前正在開發Scilla語言的編譯器,目的是使將來全部用Solidity編寫的合約均可以經過編譯器輕鬆轉移到Scilla上。與此同時,咱們也發佈了Zilliqa生態構建資助計劃,花費500萬美圓,資助爲Zilliqa搭建工具和應用的優秀項目、團隊和我的,也建設Zilliqa生態。

3、國內區塊鏈行業的三大問題

Odaily星球日報:你目前在市場上有比較看好和關注的公鏈嗎?

賈瑤琪:市場上的項目各有亮點和特點,我我的更喜歡的仍是以太坊。

Odaily星球日報:若是不是這麼成熟和主流的呢?多是一些創業團隊作的。

賈瑤琪:對於項目標準,我我的比較看重創新性和嚴謹性。嚴謹性指的就是要有已發表的學術論文驗證,在理論上能經過。若是沒有嚴謹的論文來證實,系統最起碼要有一千個節點以上的測試網絡,代碼也是公開的,這樣纔會比較有說服力。

Odaily星球日報:從總體行業上來講,你認爲目前國內外區塊鏈領域,或說公鏈項目最大的問題是什麼?

賈瑤琪:問題主要有三個:第一大問題是在保證去中心化和安全的狀況下實現可擴展性和高吞吐量;第二大問題就是隱私問題;第三大問題就是技術人員尤爲是開發者數量太少了。

在第一個問題上,目前業界不少項目都在單純追求高tps,我認爲這違背了區塊鏈的初衷、本質和最大特性,那就是去中心化。一旦網絡節點太少,那它就不算區塊鏈了。所以,咱們追求的更應該是如何在保證去中心化和安全的前提下提升吞吐量。

==========================
zilliqa如何用分片技術把7筆/秒的區塊鏈交易提高到2488筆/秒的?區塊鏈大本營
https://mp.weixin.qq.com/s?__biz=MzU2MTE1NDk2Mg==&mid=2247485314&idx=1&sn=607b95ca6d9b9051f3a8d272423a26cd&chksm=fc7c597fcb0bd069c30b248486b9268c149b327a64cf5a34077f06b67b29dfd629622f04d1ea#%23

咱們是如何用分片技術把7筆/秒的區塊鏈交易提高到2488筆/秒的?
原創: 賈瑤琪 區塊鏈大本營 4月12日 Zilliqa技術總監、聯合創始人

衆所周知,吞吐量一直是區塊鏈的一個痛點。比特幣的底層設計僅支持每秒7筆交易,還不及傳統支付工具Visa每秒8000筆交易的一個零頭,更別說支付寶在去年雙十一創造的每秒25.6萬筆的記錄。這嚴重製約了去中心化應用的發展。去年以太貓風靡全球,形成了以太坊的大堵塞,以致於人們戲稱用是否形成區塊鏈堵塞來評價去中心化應用的熱度。

針對如何提升區塊鏈的吞吐量,業界也在不斷嘗試。爲改善比特幣網絡的吞吐量,去年比特幣硬分叉出了比特幣現金。

近期,Zilliqa技術總監、聯合創始人賈瑤琪談到了這一問題的解決方案。

賈瑤琪來自Zilliqa團隊,以前在新加坡國立大學讀博士,博士期間主要研究偏底層的網絡協議,以及點對點協議的隱私保護,還有可擴展性問題。2017年,跟師兄還有導師一塊兒建立了Zilliqa團隊,主要就是用分片技術,來提升整個公有鏈的可擴展性,以及實現高吞吐量。

說到分片技術,裏面包含不少種不一樣的技術。好比以太坊的分片技術,還有Zilliqa的分片技術。

公有鏈的吞吐量問題

你們可能都瞭解比特幣、以太坊,以及其餘的公有鏈。區塊鏈技術爲你們提供了不少好的特性,好比去中心化、透明性、以及不可篡改性。但若是你們把區塊鏈做爲一個記帳或者賬本系統,這其中有一個很大的問題,就是關於吞吐量的問題。

比特幣每秒最多隻能處理7筆的交易,若是用搭火車的例子來說,比特幣就對應着手工檢票,每秒只能檢7我的。而傳統的記賬系統,例如信用卡、VISA或者MasterCard,他們平均的處理效率超過每秒8000筆交易,就相似於如今咱們高速公路上使用的ETC,或者檢票中刷臉進站的系統,能夠迅速地處理大量的交易。

低吞吐量的弊端

因而可知,目前公有鏈的低吞吐量會帶來不少問題,例如你們都會見到的高手續費問題。在去年有一段時間,若是你在比特幣上面進行一些交易,好比A轉比特幣給B,手續費可能就高達50美圓。另外一個方面,像以太坊去年作ICO,或者作這種代幣募資,不少人爲了搶資格,就會花費很高很高的手續費,來競爭去加入一個代幣募集。

其實,雖然你設置了這麼高的手續費,有時候也是搶不到這個資格的。高手續費會限制不少功能,從而致使咱們如今沒有一個很好的殺手級的應用。你們可能都知道,去年在以太坊上面最火的兩個應用,一個就是ICO,另外一個就是風靡全網的以太貓。但以太貓在以太坊上比較火的時候,佔據了以太坊上超過30%的流量,致使整個以太坊有不少的擁塞。在那個時候,若是你想作一筆簡單的轉賬,必須支付更高的手續費才能完成這筆交易。

所以,這個低吞吐量致使了目前尚未殺手級應用。咱們能夠聯想到在互聯網初期,你們用的整個底層系統可能尚未搭好,同時網絡費用又特別得高,咱們只能瀏覽一些簡單的網頁。但隨着整個互聯網系統生態的發展,你們慢慢也會看到一些很偉大的公司。例如像Google、Facebook、Twitter,以及國內的百度、阿里巴巴、騰訊,他們的崛起就是由於這個底層生態系統建好了。有了這樣的高吞吐量,才使得更多的企業以及程序員參與進來,建立許多殺手級的應用。

公有鏈的可拓展性

那麼如何來解決低吞吐量問題,咱們須要公有鏈有「可擴展性」,但可拓展性其實並不等同於高吞吐量。

不少場景下只須要高吞吐量,不須要可擴展性,因此你只須要一個很強大的服務器來提供一個很高的吞吐量。可是對於可擴展性,就要求你隨着節點數的增長,你的吞吐量也得相應地增長(由於可擴展性更多地是指隨着節點數目的增長,吞吐量或者性能也增長,因此不少時候你們實際上是要求的高吞吐量而不是可擴展性)。

已有的解決方案

目前來看,比特幣處理交易的速度小於每秒10筆,以太坊小於每秒20筆,但傳統的記賬系統,例如信用卡,交易速度超過每秒8000筆交易。咱們如何去解決這個可擴展性,或者說低吞吐量的問題呢?目前有幾種方案。

方案一,增長區塊的大小。例如比特幣,咱們如今一個區塊的大小可能只有1MB的存儲空間。若是要進行交易的話,只能把交易加到這1MB裏面。若是你們也作比特幣交易,可能都知道去年末的SegWit2x,將區塊大小從1MB提升到2MB。可是出於對安全性和其餘因素的考慮,最終Bitcoin Core取消了這個SegWit2x硬分叉。致使了當時大量的資金都投向了以太坊的ICO項目。

當你把區塊大小從1MB升級到2MB,或者10MB,甚至1GB,但這個方案是否能達到提升100倍吞吐量的效果呢?不必定,由於你雖然能夠把區塊大小升級到1GB,但因爲你的計算性能以及帶寬的限制,致使整個網絡不能正常運行。像比特幣或以太坊,都是要經過工做量證實達成共識,工做量證實以後還要在整個網絡進行廣播,若是是1MB可能還好,若是1GB的話,要進行這個廣播,基本上不可能在10分鐘之內通知每個礦工。因此這裏面有一個很大的限制。

方案二,鏈下交易。對應比特幣的閃電網絡(Lightning Network)和以太坊的Raiden Network。他們給出的解決方案大體是這樣的,你提早支付一些以太坊或比特幣做爲押金,以後你能夠在鏈下經過一些手段,來跟其餘人進行交易。這就相似於你提早在鏈上存了一些押金,而後其餘的終端用戶能夠在咖啡店裏和你進行交易。交易結束後,你要把這個結算放在區塊鏈上面,這樣一個鏈下的方案。由於你鏈下處理這些交易的話,能夠用一個十分強大的服務器來進行處理。這樣就能夠大幅度提高系統的吞吐量,能夠作到每秒上萬,甚至是幾十萬的交易量,相似於淘寶。

可是你們能夠看到,這裏有一些問題,就是你一旦用鏈下的話,雖然可以達到高吞吐量,可是交易失去了開放性、透明性的優點,至關於作了客戶端服務器的一個終端。同時因爲你用鏈下交易,就沒有那麼多節點去進行行爲監督,那麼也就少了去中心化的優點。

方案三,代理人共識協議解決方案。如何選出這些代理人,你能夠用權益證實,也能夠經過一些官方的驗證。例如我有一個公司,這個公司有相應的資質,那麼官方就會給我發一張牌照,我就能夠做爲一個代理人。

無論是7個代理人仍是21個代理人,甚至多是幾十個代理人,你們會造成一個小團體。例如咱們如今這些人,均可以去作一個代理人。以後咱們去運行一些共識協議或者相似功能的協議,來達成一個共識,產生區塊,而後再將這個區塊廣播給整個網絡,從而達成整個網絡的共識。這樣作的好處就是,這個機制能夠保證在一個很小的團體內部,很快就達成共識。這樣作很簡單,只要使用一些已有的共識協議,你就能夠很快達成共識。

不過,代理人共識協議也會帶來一些問題,咱們剛剛也有提到你們對於去中心化的擔心。由於像比特幣或以太坊都有成千上萬的節點來作共識決策。代理人共識協議目前只有一個小團體的代理人來作共識,不免會被你們質疑你是否去中心化,以及你的安全性。由於這一小部分的節點可能都是一些利益團體選出來的,他們是否能表明絕大多數人的利益呢?這些都是有待考證的。

不過以上這三個解決方案都是很好的解決方案,你們若是從不一樣維度,不一樣場景出發,這幾個方案都是有很大的用處。而今天我要跟你們分享一下,咱們Zilliqa是如何用另一種解決方案,咱們叫作分片技術,來實現這樣一個高吞吐量的。咱們的方案跟前面的幾個方案不在同一個維度,可是幾種方案實際上是能夠共生的。

一種新的解決方案

在講分片技術前,你們能夠先看看總體的結果和運行效果。這些數據都是在亞馬遜的EC2上面測試獲得的,經過搭測1800個節點、2400個節點以及3600個節點運行咱們的算法,獲得了下面的數據。直觀上看,隨着節點數以及分片數的提高,咱們的測試數據,能夠從每秒1218筆交易,達到每秒2488筆交易。

這樣咱們能夠得出一個結論,相對於比特幣或以太坊咱們能夠得到一個很高的吞吐量。另外一點也頗有意思,從圖中咱們能夠看到隨着節點數目的增長,吞吐量也是在增長的,咱們真的實現了這種可擴展性。

講了這麼多,那麼這個技術究竟是怎樣的呢?

分片技術概覽

網絡分片,簡而言之就是並行化的分而治之。例如咱們整個網絡有1萬個節點,咱們能夠把1萬節點,分紅不一樣的小組,每個小組,能夠有很多於600個節點,這樣來叫作一個劃分。劃分以後,咱們在每個分片裏,處理不一樣的交易。以後先在每一個分片裏面達成共識,而後會有一個單獨的分片將共識的結果進行彙總,廣播給整個網絡。

在這個系統的初始化階段,咱們會將整個網絡劃分紅不一樣的分片,每一個分片很多於600個節點。過了一段時間,可能有一些新的節點想要加入,也可能有一些舊的節點由於自身網絡的問題,或者系統的問題,想要離開。這種狀況下,咱們該如何將這些新的節點加入網絡,將那些舊的節點從網絡中剔除。

每過一段時間,咱們都須要作一次工做量證實。工做量證實部分跟以太坊基本上是同樣的,這要求你將上一個區塊的哈希值、節點的IP地址和你的公鑰一塊兒進行哈希計算。你們都知道,哈希計算就是工做量證實,最終你要知足哈希值的閾值。對應的難度是相匹配的,例如哈希值的前100位都是0,若是你算出來的哈希值知足這個條件,就說明你完成了工做量證實。

以後你就能夠產生這樣的一個結果:咱們會得出你的ID,之因此要你的ID就是由於咱們會根據你ID的最後幾位,來決定你應該被分到哪個分片上。這樣的話,對於一個新的節點來講,是沒法經過本身的意志去加入某一個分片的,只能經過工做量證實,而工做量證實難度較高,所以能夠避免出現新節點本身選擇分片的狀況。所以工做量證實的最後幾位,就能夠從數學上保證你的隨機性是足夠的。

若是一個節點想要加入咱們的系統,他加入的方法就是作工做量證實,而後被隨機分配到一個分片裏面。這樣作的好處就是,咱們能夠保證一些惡意節點不能直接加入到某一個分片,由於全部的節點都是被隨機分配到不一樣的分片裏面的。

有了這些分片,每一個分片裏面都有不少的節點,咱們要怎樣進行交易處理呢?咱們在這裏也作了一個交易分片,就是用來處理不一樣的交易,不一樣交易會被分到不一樣的片裏面。那麼每筆交易是根據什麼來分到不一樣片裏面?咱們作了一個簡單的分片處理,就是根據發送者的地址分片。那樣的話,若是A把錢發給B和C,那麼這兩個交易應該是在同一個分片裏面處理的,這樣保證沒有雙重支付問題。

若是A發給B和C,可是你把A發給C的交易分到另外一個分片裏面,這個分片裏面的節點,會很容易檢測出來,而後把這筆交易拒絕掉。經過這種很簡單的方式,咱們達到一個交易分片的效果。所以你在不一樣分片裏能夠處理不一樣的交易,以後能夠在每一個分片裏面,驗證你的交易是不是正確的。驗證過程很簡單,例如A發給B了10塊錢,分片會檢查A的餘額是不是足夠的,若是A發給B了10塊錢而後A又發給C了10塊錢,那麼分片就檢查有沒有雙重支付的問題。

在每一個分片內,每一個節點都會進行這樣的一個對交易的處理,以後經過運行一個協議達成共識,最終附上本身的簽名,生成一個叫作MicroBlock的微小區塊,提交給目錄委員會,目錄委員會會運行另外一個共識協議,從而造成了一個共識。最終生成一個區塊,並向不一樣的分片進行廣播。

在這個過程當中,每個節點均可以收到最終的區塊,這個區塊的內容是很小的。同時,不一樣區塊之間也會進行交換數據,從而分享最終區塊內的這些交易。整個系統有三層結構:
第一層,是哈希的哈希;
第二層,交易的哈希;
第三層,真正的交易內容。

經過這種三層結構來保證整個系統在每一步進行廣播的時候,內容量都是相對比較小的。所以過了一段時間以後,你的不一樣分片裏面,你們均可以得到這一段時間以來交易處理以後的一個共同狀態。

剛剛提到了,在每一個分片裏面,咱們都會運行共識協議。那麼咱們是如何來保證每一個分片裏面,超過100個的節點可以頗有效並且安全地運行共識協議。這裏咱們用到了在2000年以前學術界很出名的容錯協議,叫作:實用拜占庭容錯協議——PBFT。

這樣一個容錯協議能夠保證在一個小範圍內,例如幾十個節點,或者上百個節點,你們同時運行這個協議,最終造成一個共識。共識就是A發給B了多少錢,C發給D了多少錢,你們有這樣一個共識以後,就能夠去完成剛剛提到的協議。

咱們還用了一個叫作「集體簽名」,或「多重簽名」的方案,從而減小拜占庭協議裏對不一樣節點簽名的要求。由於若是有600或者800個節點,都對同一個信息進行簽名的話,就會有600、800這麼多的簽名數據,這個數據是很大的。因此咱們用多重簽名來減小集體簽名數據量的大小。

最終經過結合PBFT和集體簽名,咱們實現了所要求的安全、高效的共識協議。在共識協議部分,若是你們只是把它當作一個黑盒的話,其實咱們還有不少種選擇的。

第一種,像比特幣或者以太坊裏面的共識協議,學術界把它叫作Nakamoto Consensus,用中文講就是「中本聰協議」。可能有時候你們會把這個協議理解爲只能作工做量證實,這種理解實際上是不完整的。比特幣的共識協議其實分兩部分:第一部分,你們都在作工做量證實,過了十分鐘,會有一個成功得到結果的人,他會生成一個新的區塊。

這樣是不夠達成一個共識的,由於你以後還要再繼續作工做量證實,在後面,要生成超過6個的確認區塊,才能保證你在第一個區塊裏面那些交易被整個網絡接收。因此比特幣的共識協議分兩部分,第一部分是工做量證實,第二部分還要有超過6個確認區塊,才能保證你的共識結果是有效的。

但問題是這樣的共識協議消耗的時間是很大的,例如在比特幣裏面,一個共識中運行一輪工做量證實要花費10分鐘,再加上6個確認的區塊時間,超過1個小時。那麼你總體算下來,有可能會超過一個半小時才能確認你的交易。這樣就致使比特幣的吞吐量低,同時時間消耗高。

咱們是否有其餘選擇呢?在學術界,只要使用PBFT或者相似的共識協議就能夠相對高效地去實現多個節點之間的共識。舉個例子,在一個房間裏,A要給B發10塊錢,A要給C發20塊錢,B要給D發50塊錢,那麼咱們這個屋子要造成一個共識,最終有哪些交易要加入到區塊鏈裏面?可能初期的話,會有一個領導者把你們的建議都收集起來,而後再分發給每個人,說我如今收集到這麼多交易,你們就跟隨我把這些交易收集起來加入到區塊鏈裏面。這樣每一個節點都會收到一個請求,對於節點該如何決策呢?我做爲一個節點,我怎麼肯定其餘人也收到一樣一個請求,或者一樣一個區塊呢?

那我就全網廣播我收到的信息,廣播給全部人,其餘人也會廣播給我。這樣經過預準備,達到了初步共識的效果,即每一個人都肯定我收到這樣一個區塊,或者對應一系列的交易。最終再經過這樣一個廣播,來保證我知道超過三分之二的人也收到一樣一個區塊,或者一樣一系列的交易信息。這樣才能保證整個網絡裏面,你們都在同一個狀態下面,每一個人都知道,全部人收到了一樣一個區塊,你們能夠繼續往下一步走了。

這個共識協議很高效,運行幾十個節點達成一個共識,大概只須要幾十秒的時間。同時也很節能,不用作工做量證實。你的電腦不用無時無刻都在作哈希運算才能得到最終性。咱們都知道,在下一個區塊裏面,這些交易是會被加進去的。

可是有一個問題,這中間有好多輪的廣播。我收到交易以後,要廣播給你們,你們也要廣播給我,這樣的話,信息的交換量是很大的,致使整個網絡的擁塞程度是很高的。若是咱們只用一個簡單的數字簽名來作,好比你把你的信息發給我,其餘人廣播也把他們的信息發給我,同時附上他們的簽名。這樣的話,若是600我的用傳統數字簽名,可能就會產生600條數字簽名信息。這會致使整個網絡很是擁塞,網絡會很慢。因此咱們以後就採用了多重簽名技術。這個技術不算是新的密碼學技術。好處就是能夠把600個簽名壓縮成一個簽名,你們能夠想象,若是以前廣播600個簽名,如今換成一個簽名,整個網絡的擁塞程度會減輕不少。經過使用多重簽名,整個網絡的消息規模會減小,同時溝通成本會下降。

作一個簡要的總結,就是每個分片首先收到了多條交易,接着會運行拜占庭容錯協議,你們先達成一個共識,有哪些交易要被寫到區塊裏面。以後由於要記錄下來,咱們整個屋子N我的都贊成把N個交易寫在區塊鏈上,咱們就會採用多重簽名,從而減小簽名的大小,使得整個協議消耗比較小。

智能合約

當咱們知道了分片技術帶來的好處,以及分片技術給整個系統帶來的高吞吐量以後,至關於咱們有了一條高速跑道,還應該有一個相對安全,同時能夠支撐高速性能的一輛跑車。因此咱們就要開發對應的智能合約。

對於已有的智能合約,你們若是做爲開發者可能都知道以太坊上的Solidity,在過去的兩年裏,以太坊上面的智能合約遇到了不少的漏洞和攻擊。例如兩年前,其中的The DAO漏洞致使價值6000萬美金的以太坊被盜,去年Parity多重簽名錢包的漏洞,致使超過3億美金的賬戶被凍結。

究其緣由的話,首先是由於智能合約是一個很年輕,同時也是很複雜的編程框架。不少程序員寫的一些邏輯,複雜性是很難想象的。咱們知道編程時不少時候咱們都是隨着邏輯寫代碼,可是問題是咱們寫出來的代碼,可能會有不少的不可預知性,好比那些邊邊角角的漏洞。還有就是目前的智能合約,沒有一個形式化證實。在學術界如今有不少語言,它們都是支持形式化證實。形式化證實的意思很簡單,就是我寫出來了一系列的代碼,我能夠保證我寫的代碼就是我想要的邏輯,沒有越出我想要的邏輯的框架。

基於這些緣由,咱們團隊設計開發了一個基於自動機的智能合約語言,叫作SCILLA。

對於一個程序,例如開關燈的操做,你能夠有不一樣的狀態,例如關閉、暗光、明亮,同時你也有不少行爲來去觸發使一個狀態跳到另外一個狀態。例如短按一下、按一秒、以及長按。若是你在關閉狀態,簡單地按一下,就會切換到暗光狀態,再按一下,切換到明亮狀態。在智能合約裏面,你能夠很清楚地把這些狀態互相進行切換的行爲定義清楚。

這樣咱們就能夠提供一個形式化的證實。同時對於程序員來講,也能夠很清晰地得出本身想要執行的邏輯。目前SCILLA是非圖靈完備的。之因此我強調非圖靈完備,是由於咱們發現像以太坊的Solidity,雖然是圖靈完備的,但有時候是不須要的。你若是寫以太坊智能合約,應該知道它的燃料限制,所以不少時候智能合約是不須要作無限循環的,同時燃料的限制也支持不了無限循環。雖然支持圖靈完備,但更多的時候對於程序來講,非圖靈完備能夠保證一個更加安全的邏輯執行,並且非圖靈完備其實大多時候也能夠實現不少你想要的功能。

上圖是一個SCILLA提供的衆籌智能合約。你們能夠看到,相似於以太坊上智能合約的這些不可變參數,以及可變的狀態。不一樣於智能合約裏面,咱們這裏用的是一個狀態轉換來實現每一個人要貢獻多少錢,以及退款是如何進行的。

下圖是模擬的一個兩年前的攻擊,你們能夠看到,智能公約要進行一個退款行爲。最開始智能合約會檢查發起人當時有沒有給我打錢。若是給我打錢了,我在退款的時候就會按一樣的數目退款給你,最終把智能合約針對投資人部分,設置爲0。但問題是在攻擊的時候,不是最終直接把這個狀態設置爲0,而是在最終設置爲0。中間的部分,進行了一個跨智能合約的調用。結果是,若是智能合約碰到一個惡意的程序能夠退回重來,再執行一遍這部分邏輯。這部分邏輯就會致使這個投資人的錢數,能夠循環地進行增長。例如你運行一次代碼,能夠使得投資人的錢數增長一倍,反過來惡意的程序再運行回來,進行一個回調,又能夠使得把投資人的錢數再增長一倍。這樣無限地運行下去,致使他損失了超過6000萬美圓。

那麼咱們如何去作安全補救?很簡單,若是程序員當心一點的話,能夠去遵循這樣一個模式。先去檢查這個投資人是否當初投資了我,以後進行執行:若是你投資了我,我先把你這部分的數目在我這裏設置爲0(反正我後面要轉賬的),以後再進行交互。交互時把那部分錢轉賬給以前的投資人。

提及來很簡單,但不少時候,做爲程序員,咱們可能會忽略掉這些安全檢查。在SCILLA這裏,咱們能夠用本身的編譯器,作一個自動的檢查。就是你若是在寫相似代碼的時候,必需要符合安全規範。就像剛纔說的,先去檢查,而後再去進行交互。若是你不遵循這個規範的話,咱們的編譯器是不會經過的,或者會給你提供一些對應的提示。

去中心化應用的落地場景

將來的話,由於咱們有了這樣一個相對高吞吐量的區塊鏈平臺系統,共享經濟,例如OfO、Uber,這樣的共享經濟公司均可以將主要的業務邏輯放在區塊鏈上,運用智能合約來處理不一樣的用戶請求。目前你們都是經過一個服務器來進行這種中心化交易,但以後若是用區塊鏈進行去中心化的交易,就能夠省去不少中間的費用,以及中間的一些可能比較灰色的花銷。固然區塊鏈也能夠用做支付網絡,支付網絡目前的痛點就是手續費很高,可是若是能實現高吞吐量,你們能夠用相對低廉的手續費去作一些支付。

另外一個方面,由於有了分片技術,咱們以後能夠作一些分片的並行計算,即相似於MapReduce的一些計算。包括深度學習,在不一樣分片裏面,能夠放不一樣的神經元(neuron)來進行科學計算。咱們目前仍是在作更多的測試,以及其餘功能例如智能合約的開發。在上個月,咱們已經放出了咱們的測試網絡,以及數字錢包。

你們能夠經過https://explorer.zilliqa.com,去訪問Zilliqa的測試網絡。目前咱們在其中加入了不少本身的交易,對這個網絡進行壓力測試。錢包的話,你能夠經過https://wallet.zilliqa.com去訪問,來生成本身的賬戶,以後咱們還會將一些測試代幣放到你錢包裏,你能夠在咱們的測試網絡中進行一些簡單的測試,包括對交易的測試。

====================
分片技術(sharding)——區塊鏈擴容問題的良方
https://www.8btc.com/article/179733

任何一個曾經開發過DApp的程序員都必須考慮到當前公共區塊鏈的侷限性,其中區塊鏈侷限性的最重要和最明顯的問題就是有限的吞吐量,好比,每秒處理的交易量過少。爲了運行一個可以處理實際吞吐量需求的DApp,區塊鏈就必須具備可擴展性。

進行區塊鏈擴容的一個答案就是分片技術(Sharding)。分片技術承諾經過改變網絡驗證的方式來增長吞吐量。分片技術獨特於其餘解決擴容的鏈上技術的關鍵特性,就是它能夠進行水平擴容,也就是說,網絡的吞吐量隨着挖礦網絡的擴展而增長。這種特殊的特性可能使它成爲推進區塊鏈技術被快速採用的理想技術。

本文將簡要地討論現有區塊鏈平臺的擴容問題,由於大多數讀者都必需要熟悉這一問題。而後咱們將進一步討論分片技術和它的不一樣形式將如何成爲一個有但願解決擴容問題的方案。這篇文章還將涉及到實現分片技術的一些理論基礎和其所面臨的實際挑戰,以及咱們如何能克服這些挑戰。

現有區塊鏈的擴容問題

公共區塊鏈平臺今天面臨的最大問題之一就是可擴展性。全部主流的平臺都在努力提升每秒的交易量。事實上,當今的公共以太坊網絡和比特幣網絡平均每秒能夠處理7-10筆交易。這一數字遠低於像Visa這樣的集中支付處理器,後者平均每秒能處理約8000筆交易。

緩慢的交易處理形成了一個主要問題,由於大量的未完成交易阻塞了網絡,使得那些諸如實時支付這樣的應用程序很難在區塊鏈上一展身手。隨着確認支付的時間拉長,最終就會給用戶帶來諸多不便;這也是爲何像PayPal和Visa這樣的信用卡支付方式仍然更具吸引力的主要緣由之一。隨着更多更復雜的DApps開始依賴於相同的一個區塊鏈網絡,遲緩的交易速度所致使的問題只會變得更加複雜。

從技術角度來看,全部區塊鏈的共識協議都有一個具備挑戰性的限制:網絡中的每個徹底參與的節點都必需要驗證每一筆交易,而且這些節點必須和它的其餘節點保持一致,這是區塊鏈技術的組成部分,它經過建立分佈式的帳原本保證區塊鏈的安全。

在大多數像比特幣和以太坊這樣的區塊鏈上,節點都是由公衆進行運行的。雖然去中心化的共識機制提供了一些重要的優點,好比容錯性、安全性、政治中立和真實性,可是這種驗證鏈的方法是以下降可擴展性爲代價的。當這些公共區塊鏈變得更大時,它將須要愈來愈多的處理能力來驗證這些公共區塊鏈,這可能會在這些區塊鏈的網絡中形成瓶頸,從而減慢那些建立新應用程序的速度。

分片技術:分而治之

分片技術是一種基於數據庫分片傳統概念的擴容技術,它將數據庫分割成多個碎片並將這些碎片放置在不一樣的服務器上。在公共區塊鏈的情境中,網絡上的交易將被分紅不一樣的碎片,其由網絡上的不一樣節點組成。所以,每一個節點只需處理一小部分傳入的交易,而且經過與網絡上的其餘節點並行處理就能完成大量的驗證工做。將網絡分割爲碎片會使得更多的交易同時被處理和驗證。所以,隨着網絡的增加,區塊鏈處理愈來愈多的交易將成爲可能。這種屬性也稱爲水平擴容。

咱們能夠想象一下,現有的區塊鏈就像一條繁忙的高速公路,這條高速公路的收費站只有一個收費口。這種佈局的結果將是致使交通堵塞,由於人們將排着長隊等待經過這惟一的收費站。實現一個基於分片技術的區塊鏈就像在高速公路上增長15或20個收費口。它將極大地提升汽車經過收費站的速度。所以,分片技術將帶來巨大的差別,並顯著提升區塊鏈的交易速度。

基於分片技術的區塊鏈的實現對公共區塊鏈有着不一樣的好處。首先,區塊鏈上處理交易的速度變成了每秒上千筆甚至更多,這改變了人們對加密貨幣做爲支付方式效率的見解。改善交易吞吐量將會給去中心化的系統帶來使愈來愈多的用戶和應用程序,而這將反過來促進區塊鏈的進一步採用,也使挖礦變得更有利可圖,同時也能吸引更多加入到公共網絡上的節點,從而造成一個良性循環。

此外,分片技術能夠幫助下降交易費用,由於驗證單筆交易的處理量減小了;節點能夠在依然盈利運營的同時收取較小的費用。在現實世界中,咱們將低費用與高交易處理能力結合起來,會使公共鏈將變得愈來愈有吸引力。這些積極的趨勢所持續的時間越長,咱們就會越能看到更多的主流的加密技術和區塊鏈應用程序的出現。

分片技術的策略

這部分主要講的是相關的基本概念,可是咱們有更細分的方法來實現分片策略,如網絡分片和交易分片,以及狀態分片等。經過網絡和交易分片,區塊鏈節點的網絡被分割成不一樣的碎片,每一個碎片都能造成獨立的處理過程並在不一樣的交易子集上達成共識。經過這種方式,咱們能夠並行處理相互之間未創建鏈接的交易子集,經過提升數量級顯著提升交易的吞吐量。

另外一方面,在當今的主流公共區塊鏈上,全部公共節點都承擔着存儲交易、智能合約和各類狀態的負擔,這可能使其在爲了得到更大的存儲空間而進行巨大的花費,以維持其在區塊鏈上的正常運轉。

爲了解決這一問題,有一種可被稱爲狀態分片的可行方法已被提出。這一技術的關鍵是將整個存儲區分開,讓不一樣的碎片存儲不一樣的部分;所以,每一個節點只負責託管本身的分片數據,而不是存儲完整的區塊鏈狀態。

分片技術的複雜性

儘管全部不一樣形式的分片技術均可能很是直觀,但經過對技術細節的解讀,咱們能夠看到這一方法的複雜性和潛在的挑戰。分片技術的其中一些挑戰是很容易克服的,而另外一些則否則。通常來講,網絡和交易分片更容易實現,而狀態分片則要複雜得多。下面,對於不一樣的分片機制,咱們會明確地討論它們所面臨的一些挑戰,以及它們的可行性。

網絡分片

分片的第一個也是最重要的挑戰是建立碎片。開發者須要開發一種機制來肯定哪些節點能夠按照安全的方式保留在哪些碎片中,這樣就能避免那些控制大量特定碎片的人所發起的攻擊 。

戰勝攻擊者的最佳方法(至少在大多數狀況下)就是創建隨機性。經過利用隨機性,網絡能夠隨機抽取節點造成碎片。這樣一種隨機抽樣的方式能夠防止惡意節點過分填充單個碎片。

可是,咱們如何創建隨機性呢?最容易得到公共隨機性的來源是區塊,例如,交易的Merkle tree root。在區塊中所提供的隨機性是可被公開驗證的,而且能夠經過隨機提取器中提取統一的隨機比特。

然而,簡單地使用隨機機制將節點分配給碎片還是不夠的。咱們還必需要確保網絡的一個碎片中不一樣成員意見的一致性。這能夠經過像工做量證實這樣的共識協議來實現。

交易分片

交易分片可聽起來那麼簡單。考慮到在一個相似於比特幣的系統中引入交易分片(沒有智能合同),系統的狀態是用UTXOs來進行定義的。咱們假設網絡已經由碎片所組成,用戶發送一筆交易,每一筆交易有兩個輸入和一個輸出。那麼,該筆交易將如何分配給一個碎片呢?

最直觀的方法是根據交易哈希值的最後幾位來決定碎片。例如,若是哈希值的最後一個比特是0的話,那麼交易將被分配給第一個碎片,不然它被分配給第二個碎片(假設咱們只有兩個碎片)。這容許咱們在單個碎片中驗證交易。可是,若是用戶是惡意的,他可能會建立另外一筆具備兩個相同輸入但不一樣輸出的交易——是的,就是一個雙花交易。第二筆交易將有一個不一樣的哈希值,所以,這兩筆交易就可能造成不一樣的碎片。而後,每一個碎片將分別驗證接收到的交易,同時忽略在另外一個碎片中驗證的雙花交易。

爲了防止雙花問題,在驗證過程當中,碎片將不得不進行相互通訊。事實上,因爲雙花交易可能會在任何碎片中出現,所以特定碎片所接收到的交易將不得不與其它的碎片進行通訊。而實際上,這種相互之間的通訊可能會破壞交易分片的整個目的。

另外一方面,當咱們有一個基於帳戶的系統(沒有智能合約)時,問題就簡單得多了。每一筆交易將會有一個發送者的地址,而後系統能夠根據發送者的地址分配一個碎片。這確保了兩筆雙花交易將在相同的碎片中獲得驗證,所以系統能夠很容易地檢測到雙花交易,而不須要進行任何跨碎片的通訊。

狀態分片

狀態分片帶來了新的挑戰。事實上,狀態分片是迄今爲止最具挑戰性的分片技術提案。

繼續使用咱們的基於帳戶的模型(咱們暫時不在咱們的例子中引入智能合約),在一個狀態分片的區塊鏈中,一個特定的碎片只會保留一部分狀態。例如,若是咱們有兩個碎片和兩個用戶賬戶,分別爲Alice和Bob,那麼每一個碎片將保留一個用戶的餘額。

假設Alice建立了一筆交易,她將支付Bob一筆錢。這筆交易將由第一個碎片進行處理,一旦該筆交易被驗證,關於Bob的新餘額的信息就必須與他所在的碎片進行共享。若是兩個受歡迎的賬戶由不一樣的碎片進行處理,那麼這可能須要進行頻繁的跨碎片通訊和狀態交換。確保跨碎片通訊不會超過狀態分片的性能收益仍然是一個值得公開的研究問題。

減小跨碎片通訊開銷的一種可能方法,是限制用戶進行跨碎片交易。以咱們上面的例子來講,這就意味着系統不容許Alice直接與Bob進行交易。若是Alice必須與Bob交易的話,她將不得不在那塊碎片中佔有一個賬戶。雖然這確實消除了任何跨碎片通訊,但它可能會限制平臺的可用性。

狀態分片的第二個挑戰是數據的可用性。咱們能夠考慮這樣一個場景,因爲某種緣由,一些特定的碎片遭到了攻擊而致使其脫機。因爲碎片並無複製系統的所有狀態,因此網絡不能再驗證那些依賴於脫機碎片的交易。所以,在這樣的狀況下區塊鏈基本上是沒法使用的。解決此問題的方法是維護存檔或進行節點備份,這樣就能幫助系統進行故障修復以及恢復那些不可用的數據。可是,這樣就使得節點將不得不存儲系統的整個狀態,所以這還可能會引起一些中心化的風險。

咱們在任何分片機制(固然不是特定於狀態分片)中須要考慮的另外一個要點是,確保碎片在抵禦攻擊和失敗時是具備彈性的; 網絡必須接受新的節點並以隨機的方式將這些分配給不一樣的碎片。換句話說,網絡必須在一段時間內進行節點的從新分配。

然而,在狀態分片的狀況下,從新分配節點是很是棘手的。因爲每一個碎片只保留了狀態的一部分,因此在一次從新調整網絡的過程當中,在同步完成前可能會出現致使使整個系統失效的問題。爲了防止系統的中斷,咱們必須對網絡進行逐步調整,以確保每一個碎片在全部節點被清空前仍有足夠多的舊節點。

相似地,一旦一個新節點加入了一個碎片中,系統就必須確保該節點有足夠的時間與碎片狀態進行同步;不然,傳入節點將徹底拒絕每一筆交易。

結論
綜上所述,分片技術是區塊鏈的一個使人興奮的技術,他讓咱們看到了但願,它能夠在不影響去中心化和透明度的狀況下解決擴容問題。然而,毫無疑問的是,分片技術,尤爲是狀態分片,在設計層面和實現層面都是很是困難的。

咱們應該當心的處理分片技術。此外,開發者們還須要作更多的研究來肯定狀態分片的可行性,由於它可能不是解決存儲問題的法寶。研究人員和開發者們正在積極尋找那些可替代的解決方案。也許,答案就在咱們眼前。

===================
TPS 是一種糟糕的評價標準
http://www.meirijinrong.com/wechatarticle-62830.html
在評估整個價值轉移系統時,至少要考慮三個重要變量,而交易吞吐量只是其中之一:
交易吞吐量( tps)
通常交易特性(交易大小)
清結算保證

交易吞吐量和平均交易大小共同決定了系統的經濟生產力,用於衡量系統在每一個單位時間的流轉過的財務流量;清結算保證則告訴咱們該系統屬於什麼 類型 :包括你可否肯定不會遇到交易失敗、詐欺?交易是否如現金交易同樣及時結算?仍是像信用卡通常,有 90 天的退款期?

雖說比特幣是虛擬的,但它更像是實體的清結算系統,而非如信用卡這類的推遲結算系統。比特幣是一種虛擬的價值承載工具:若是你持有未花費輸出(UTXO)的私鑰,那麼你就是這筆錢的全部者,而且有權對其進行任何操做;這種資產也不是某個實體的負債。從這個角度來看,比特幣更像實體現金或是黃金。若是你弄丟了比特幣或是發送到錯誤地址,這筆錢也沒有討回來的方法。固然,在某些狀況下,系統能追討回誤操做的錢是件好事;而信貸費用之因此存在,正是爲了處理這些反悔的交易或是詐欺行爲。這些處理信貸詐欺和補救行爲帶來的成本,最終會以手續費的形式轉嫁到終端用戶身上,這也是爲何一般咱們沒法用信用卡支付少於 1 或 2 美圓交易的緣由。

那麼,咱們該如何用一致的標準來比較不一樣的價值轉移系統,如比特幣、 Paypal、Visa、SWIFT、和現金?我但願大家能將注意力擴展到除了交易吞吐量以外的特性,由於這只是構成系統的經濟生產力的其中一項因素而已。=======================

相關文章
相關標籤/搜索