分片技術能否破解以太坊寒冬之危?
“以太坊之年”駁議
有人認為今年以太坊的分散式應用 DApps 將主要解決擴充套件規模障礙,2018年將是“以太坊”之年。但醉心以太坊技術的“老程式員”楊鎮表示並不同意這種說法:
以太坊目前的版本拜占庭(BYZANTIUM)在 2017 年 9 月就已經上線。2018 年裡以太坊沒有任何大的修改或者增強,Solidity 編譯器有小版本升級,但沒有太大區別。
以太坊從誕生開始就可以認為是一個理想主義的實驗性的平臺:不過多地人為干預,讓生態中的參與者自發地去進化;重大決策過程也會考慮普通參與者的意見;以太坊社群對理想的堅持,應該得到尊重和讚許。以太坊是世界上第一個智慧合約平臺,也是目前對開發者最友好的、生態最健全的智慧合約平臺,所以它的地位,短時間內依然不會被撼動。
不過以太坊團隊自身工程能力的欠缺也已經不是什麼祕密了;從 2016 年 Gavin Wood 博士的離開開始,以太坊早期的核心開發團隊絕大多數已經離開了以太坊社群。而把所有計算都放到一個單執行緒(單程序)的“世界計算機”上是不是一個正確的、有效的方法,恐怕也已經早有定論(從軟硬體工程的角度,分層架構是必然選擇,這也已經是業內共識)。只是以太坊已經成為一個成熟的生態,要修改它,代價過高,所以需要格外謹慎。
楊鎮認為 V 神對於以太坊的堅守大概是外界看好它的最主要的原因,而以太坊的 research 團隊的水平也是可以期待的。這也讓我們有理由相信以太坊社群在未來一兩年之內能拿出真正革命性的主鏈擴容方案,但工程實踐上的表現仍然有待觀察。
以太坊的問題及解決方案
以太坊發展至今,已經暴露出一系列的問題和矛盾,主要存在著效能不足、治理結構不全面、儲存空間劇增等方面的問題,對此楊鎮基於對以太坊的深入研究給我們做出瞭解答。
(1)效能方面的不足,是基礎技術決定的。一個分散式全球共識系統,一個單執行緒的“世界計算機”,效能當然不可能與成熟的中心化技術相比;但就目前的整體計算量和應用普及程度來講,大概也還並不是致命傷。不過這個效能問題也是目前以太坊社群在主要解決的 layer1 擴容問題,具體地說,就是指正在設計中的 Shasper(Casper+Sharding)協議的實施。
(2)治理方面,一般可以分為鏈上治理(on-chain governance)和鏈外治理(off-chain governance)。以太坊社群的風格是不過多地人為干預,除了 EIP(Ethereum Improvement Proposal)之外,並沒有成體系鏈外治理設計。而鏈上治理,目前以太坊是沒有這樣的技術機制的;未來基於 PoS 的共識協議(Shasper)實施之後,就可能有一些相應的技術方案來支援所謂的鏈上治理,但目前這還是未知數。區塊鏈治理的問題也可以看作是一種權衡,我們要選擇更相信技術還是更相信人性。
(3)節點資料儲存方面。基於區塊鏈系統本身的技術特性,像以太坊這樣基於賬戶模型所構建的基礎資料結構,所有賬戶狀態和合約狀態都必須要儲存在所有礦工節點和全節點上,並通過在網路間傳輸的區塊資料進行驗證以達成全網共識,這種設計造成的極度冗餘的資料儲存方式是必然的,也是必須的;其中確實存在全節點的儲存壓力問題,而這在最新的輕節點協議中已有相關設計。
未來以太坊在處理大量的歷史資料時,會採取一種混合方案。一方面,允許全節點對歷史資料(超過 1 年以上的交易/區塊資料)進行隨機丟棄,具體的演算法將保證時間越近的資料被丟棄的機率越低;從全網狀態來看,時間越久遠的資料才有更大的機率在所有節點上都找不到;以此來降低全節點儲存的壓力,同時會給予全節點一定的獎勵以鼓勵它們保留歷史資料(這個設計在目前是沒有的)。
另一方面,也允許使用者向全節點“租用”儲存空間以儲存與使用者指定的賬戶相關的歷史資料;即使用者可以定期向全節點支付資料儲存費用以保證自己賬戶的歷史資料不被丟棄,這可以很簡單的通過智慧合約實現。通過這樣的一種混合方案,以太坊網路將可以逐漸降低/穩定全節點的儲存壓力。這個方案目前也還只是 draft 階段,計劃中它將會根據 Shasper(Casper+Sharding)協議的實施情況具體排定上線時間。
以太坊社群始終在致力於解決這些已知的問題,但實際進展確實不盡如人意;對此,楊鎮也認為應該對社群保持信心和耐心,改進方案的最終結果也值得我們共同期待。
“分片時代到來”,分片技術原理
以太坊效能問題一直為人所詬病,而就在2018年4月,V神釋出了一個新的概念驗證,演示瞭如何把分片擴充套件解決方案“栓在”以太坊主鏈上,並在Twitter發帖稱“分片即將到來”,將大幅提升以太坊交易處理能力。以太坊分片技術意味著區塊鏈技術現在發展得更加多元,其可擴充套件性頻寬問題可以在2020年之前得到解決。
有人稱“分片”是智慧合約發明以來的最大突破。對此,楊鎮也做了技術性的解讀。
所謂分片,是指以太坊主網擴容的技術方案,英文是 Sharding。請注意這是主網擴容,也就是 layer1 擴容。
目前的以太坊主網,其實是相當於一個單執行緒(單程序)的在所有礦工和全節點上都會執行來達成共識的一個“世界計算機”,它目前的平均 TPS(Transactions Per Second)大概是在 10 這個量級。
分片(sharding)就是把這個單執行緒的計算機,擴充套件為多執行緒(目前的設定為 1024 個執行緒)計算機,也就是同時可以有 1024 個 shard 鏈來處理交易;當然,地址/賬戶狀態也就將會分別儲存在這 1024 個 shard 鏈上。
這樣做之後,就會產生一個很明顯的問題:因為地址/賬戶已經分散到不同的 shard 鏈上了,那麼不同的 shard 鏈上的地址之間如何進行交易呢?(這裡需要理解的是:Sharding 方案中的某一個使用者的賬戶/地址僅會存在於某一個 shard 鏈上,而並不是把目前的所有賬戶/地址拷貝 1024 份)。
目前是設計了一種叫做 CrossLink(可以譯為“交叉連結”)的資料結構來把 shard 鏈的狀態變動通知 PoS 主鏈 beacon 鏈(大概可以譯為“信標鏈”)。Beacon 鏈是所有 shard 鏈的公共主鏈,同時也是一個基於 PoS 演算法的與目前的 PoW 主鏈協同工作的新主鏈;而 beacon 鏈,就是基於大名鼎鼎的 Casper 協議設計實現的。
Casper 有兩個版本,一個是 V 神和 Virgil Griffith 做的 Casper the Friendly Finality Gadget,簡稱 Casper FFG,它是一個 PoW+PoS 的混合共識演算法,也是從目前的 PoW 主鏈向 PoS 主鏈的過渡時期會採用的技術方案;另一個是 Vlad Zamfir 做的 Casper the Friendly GHOST: Correct-by-Construction,簡稱 Casper CBC,這大概是未來以太坊最終會實施的鏈上治理方案(包含了經濟模型的重新設計)。
Casper 和 Sharing(分片)在很長一段時間內都是兩個獨立的專案,由不同的團隊在進行研究。在今年 7 月份,以太坊社群做了一個重大決定:將 Casper 和 Sharding 專案合二為一。這是因為在研究的過程中,開發者們逐漸發現它們的相關性其實是非常強的,很多技術細節需要一併考慮設計,所以最終做出了這個決定。這樣,以太坊的 layer1 擴容方案,就變成了所謂的 Shasper(Sharding+Casper)協議。
Shasper 協議是一個非常大的改進(創新),本身的技術難度也非常高。目前,其協議設計僅完成了大概 70% 左右,很多技術細節也還沒有最終確定。
Shasper 協議目前的設計,已經與原始的 Casper FFG 協議有了一些差別;對此,楊鎮也做了概念性的解讀。
首先要介紹的是在 Shasper 協議中的一些關鍵角色和術語,比如validator(驗證者)、active validator set(活躍驗證者集合)、committee(委員會、活躍驗證者集合的一個偽隨機子集)、proposer(提案者、生成區塊的 validator)、attester(證明人、簽發區塊的 validator)以及 slot(一個 8 秒的時間週期,供提案者和證明人簽發一個區塊)、dynasty transition(朝代更迭、即更新驗證者集合)、dynasty(朝代、自創世區塊開始的朝代更迭次數、也就是朝代序號)、cycle(週期、所有驗證者都有機會做出一個證明的的區塊跨度)、finalized(定稿)、justified(確定)等等。
Shasper 協議需要在目前的 PoW 主鏈上建立一個用於鎖定 validator 的權益和管理 validator(比如挑選 committee、進行 dynasty transition 等等)的 casper 合約,這是唯一必須的對目前既有主鏈的修改。
然後,希望成為 validator 的使用者,可以從自己的賬戶向這個 Casper 合約傳送 32 Eth 來“註冊”,這是個相對民主化的設計(也就是每個地址僅允許、且最多允許用 32 Eth 來進行註冊,而不是像最初的設計那樣不限制這個權益數額,會使某些擁有大量 Eth 的地址有過大的收益)。之後 Casper 合約會把這些“註冊的”地址作為備選 validator 儲存,作為當前 dynasty 的驗證者集合。當然,Casper 合約裡鎖定的這部分權益,也可能會基於一定的規則進行扣減,也就是協議級的懲罰機制,比如被證明在“作惡/造假”或者長時間“離線/不做簽名”等等。
Casper 合約會為每個 shard 鏈選擇一個 committee 用來在這個 shard 鏈上籤發區塊,由 shard 鏈上的區塊所導致的狀態變動會通過 crossLink 記錄到 beacon 鏈上。
顯然,因為所有 shard 鏈是並行工作的,它們會各自生成自己的區塊來記錄交易資料和狀態變動;當交易雙方的地址不在同一個shard 鏈上的時候,這個交易就將影響兩個 shard 鏈的狀態,而因為它們是並行處理的,交易的打包順序並不確定,所以與它們關聯的 beacon 鏈上的區塊就一定會“分叉”(即在同一時間產生多個 parentHash 一樣的區塊)。
這裡可能不太容易理解,不過我們可以參考目前的 PoW 主鏈末端的抖動問題:在 PoW 演算法裡,因為所有礦工是並行進行挖礦運算的,那麼由於網路延遲的原因,在一個區塊時間(16 秒)內就很有可能會產生多個 parentHash 相同的“合法區塊”;在分片的情況下也是類似的,1024 個 shard 鏈是並行進行交易執行/打包的,目前設定的 slot(也就是區塊時間)是 8 秒,所以因為網路延遲的原因,必然會在它們的公共主鏈 beacon 鏈上產生 parentHash 相同的合法區塊。
Casper 協議,本質上是一個“提案演算法(proposal mechanism)”,是用來在同時發生的多個提案所組成的區塊樹中選擇主分支或者“權威鏈(canoncial chain)”的一種共識演算法,它也是一種對 BFT(拜占庭容錯)演算法的改進。當然,實際的演算法比這裡描述的要複雜的多,其中的技術細節同樣也非常多。
總體來看,Shasper(Sharding+Casper)方案的實現難度是很高的,目前也還有很多的技術細節沒有最終確定,可能會有一些變數,包括經濟模型的設計(各個參與方的獎勵比例、具體的懲罰機制、PoW 鏈獎勵的削減方案等等)。按照目前的計劃,該方案將於 2020 年上主網,但兩年的時間可能會發生很多事情,社群的工程能力也是令人擔心的。另外這個方案本身的實際效果如何,大概也只能等到上線之後才能進行評估。
(作者:矩陣數字經濟智庫,內容來自鏈得得內容開放平臺“得得號”;本文僅代表作者觀點,不代表鏈得得官方立場)