AERGO 技術白皮書

Terry Huang
fracdoor
Published in
18 min readOct 12, 2018

寫在前頭

本篇文章為「Aergo Technical Whitepaer」的中文翻譯,原始檔案網址為:

筆者翻譯能力有限,一切以官方內容為準,如有任何建議,請不吝指正。

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

摘要

AERGO 為新一代的區塊鏈協議,旨在促進公有與私有區塊鏈的快速部署。奠基於 Blocko Inc. 針對知名企業客戶提供的量產層級的私有區塊鏈上的經驗,AERGO 打算結合新一代的技術來建立具拓展性的分散式資料庫系統,從而實現企業級別的基礎設施。

背景

Blocko 已經協助 20 餘家企業級客戶運用「Coinstack」建置其專屬的私有區塊鏈。Coinstack 是奠基於改良過的比特幣架構以及以太坊虛擬機 (Ethereum Virtual Machine, EVM) 的智能合約技術,類似於 QTUM 與 RSK 所採用的技術。即使是在大規模的使用場景下 Coinstack 仍然能夠良好運作,例如為信用卡提供商的數百萬日常用戶群進行身份認證的過程。在這些大規模的使用場景中,Blocko 洞察到比特幣協議的性能上限,以及以太坊虛擬機與企業級結構不兼容的具體細節。

為了更完善地支援現實生活中的使用場景,Blocko 著手開發 AERGOSQL 與 AERGO。AERGOSQL 是一種新型態的智能合約引擎,能夠運用關聯式資料模型,並透過傳統企業開發者已熟悉的軟體工具來開發智能合約。

本文章旨在描述部署商用區塊鏈所需面臨的挑戰,及克服這些挑戰所導入的新需求與架構。

企業級區塊鏈需求

我們相信企業級區塊鏈是在公有區塊鏈上依據不同的前提與環境運行的。隨著 Coinstack 的部署,Blocko 獲得真實使用場景中企業級區塊鏈運行的第一手資訊回饋。我們在下方羅列出公鏈與私有鏈的前提假設:

  • 公有鏈上的使用者通常採用中低規格的硬體來運行節點,然而商用區塊鏈傾向於採用具備龐大算力與儲存空間的硬體。
  • 商用區塊鏈不單只在公有雲上運行,也在私有雲與裸機上。私有雲與裸機環境所提供的功能與公有雲服務有明顯地差異。
  • 相對於公鏈運行少數的節點,商用區塊鏈基於水平擴展的好處,傾向於運行大量的節點。
  • 相對於公鏈使用者,商用區塊鏈的管理員需要更多的控制權與操作功能。
  • 在公鏈上運行的應用程式最多只需要該鏈上的相關資料 (例如資產),然而在商用區塊鏈上,應用程式需要連結眾多外部的或內部的系統,例如電子信箱、SMS、資料庫、LDAP 與公開資料等等。

我們於下方條列一系列企業級區塊鏈不可或缺的特性。

可擴展性

由於商用區塊鏈的用戶普遍擁有大量高性能的硬體,因此其在運作上需要同時滿足水平與垂直擴展。

互操作性

企業軟體的運作環境包含經年累積的繁雜技術,所以商用區塊鏈需要能夠在當代標準的操作介面如 OAth 與老舊但穩妥的介面如 Active Directory 上運行。

開發環境

由於企業開發大多為專案導向,沒有多少空間能夠讓開發者嘗試並學習新的程式語言。與其強迫開發者學習新的語言來建置智能合約,商用區塊鏈必須允許開發者運用他們早已熟練的工具與經驗進行開發。

與此同時,網頁開發者認為理所當然的資源,例如沒有權限限制的網路存取,是不見於企業內的開發者。所以,商用區塊鏈的建置需要比公鏈更全面的開發環境 (IDEs 與 SDKs)。

資料隱私性

企業方在確保機密資訊與客戶/員工的個人資料的安全性上承受很大的壓力。通常而言,企業對於資料安全性的需求,遠大於區塊鏈所能提供的資料完整性與不變性。雖然公鏈在實現資料安全性的方法之一是在應用層併入加密與解密層,但對商用區塊鏈的建置而言,則需要提供更穩靠且全面的保護資料的方法。

配置與管理

網路開發工程師樂於在他們的筆記型電腦上運用 Vagrant、Docker 工作,而企業裡的 IT 部門則使用更高等級的軟體工具如 Tivoli Provisioning Manager、OpenStack 或 Kubernetes。商用區塊鏈的建置需要整合現存的技術,並在管理上擁有更豐富的功能組合。在公鏈的部署中,匯出/匯入、備份資料、監控、日誌紀錄與資料遷移等功能經常被忽略,然而對商用區塊鏈而言都是高優先性的。

結構化與非結構化資料儲存

智能合約提供公鏈與商用區塊鏈的基礎功能。部署在公鏈上的 dApps 會存取雲端資料庫或連線至 CDN 提供者,在商用區塊鏈上的 dApps 則需自給自足 ,而且在儲存上需要同時考慮結構化與非結構化型態的資料類型。

核心架構

AERGO 基礎架構

AERGO 是被定位為扮演公有鏈與私有鏈間的橋樑。為了服務數百萬用戶同時存取一群節點集,AERGO 將結合傳統的資料庫設計理念與分散式運算的技術。

分散式目錄

分散式目錄 (Distributed Directory, DD) 是在區塊鏈部署中建立區塊的工具,為 AERGO 的核心功能。儲存庫 (repository) 中每一個 DD 管理特定的命名空間 (namespace)。每個命名空間包含儲存庫中不同的分支 (branch) 與標籤註記 (tag residing),與區塊鏈上不同的識別符 (identifier) 的有效性。

每個 DD 本身便是一條區塊鏈,擁有自己的創世區塊與根區塊 (root blocks)。與傳統的區塊鏈不同, DD 區塊容量有限,且區塊生成時間相對較長。究其角色與功能而言,DD 類似於傳統資料庫中的資料目錄、Hadoop 的 Zookeeper 或 CoreOS 的 etcd。

a. 生命之樹 (Tree of Life, ToL)

ToL 為 DD 中的一種命名空間;一個 DD 的 ToL 包含儲存庫裡所有分支、標籤、創世區塊與根區塊的資訊。

b. 分散式目錄服務 (Distributed Directory Service, DDS)

DDS 命名空間包含區塊鏈上不同實體(entitiy) 的記錄,例如他們的公鑰與有效性,與其扮演的角色與權限。 DDS 命名空間的設計目的是扮演 AERGO 儲存庫存取控制的基礎。

每個實體能夠扮演客戶端角色或伺服器憑證。若擁有伺服器憑證的實體,DDS 將能夠提供「憑證註銷列表」(Certificate Revocation List) 與包含路由器資訊的 DNS 的服務。

AERGOFS ,意指 AERGO 的分散式檔案系統,能夠在儲存庫中紀錄不同分支的區塊與指標。

DDS 命名空間同時也組成核心共識演算法中節點認證的根本角色。

共識演算法

a. 核心共識

核心共識演算法的目的在於建構 DDS;由於核心共識演算法需要存取 DD 內的 DDS 來挖掘新的區塊,所以兩者密切相關。

AERGO 所採用的核心共識演算法為委任權益證明 (Delegated Proof of Stake, DPOS),其原因主要為下列二者:

  • 該算法能夠提供可擴展性與運作上的簡約風格。
  • DPOS 是在允許區塊能夠重整的前提下運作,這對 AERGO 現行的基礎設施而言便是最好的演算法。

b. 使用者定義的共識

根據預設,每個儲存庫使用核心共識演算法。雖然如此,AERGO 也會提供彈性的更換功能,能夠使用不同的共識演算法來運行。值得一提的是 RAFT 與 PBFT 兩種演算法對於開發與運行不同的服務而言相當管用。

即使運用相同的工具集來建置智能合約,使用者也能夠在每個儲存庫中使用自訂的共識演算法。使用者自訂的邏輯能夠管理下列事項的運作流程:

  • 區塊的創建與其權限。
  • 區塊的傳播與優先性。

由於區塊的分岔與合併能夠理解為區塊的重整,對於區塊重整的相同政策也被拿來在分散式的版本控制中使用。從版本控制的角度來看的話,區塊重整的政策可被稱作「一致性合併」(Consistent Merging)。

智能合約

AERGO 支援多種範本與可插拔式的智能合約基礎設施。每個智能合約都能夠被客戶端或另一份合約執行或查詢,由於 AERGO 在智能合約間提供友善的操作介面,允許高階的互操作性,所以兼容於以太坊虛擬機、Fabric 的 Chaincode 或 AERGOSQL 撰寫的智能合約。

  1. AERGOSQL

在 AERGO 上撰寫智能合約的正規做法是運用 AERGOSQL。AERGOSQL 為存取資料提供了一種關聯式資料模型,並為智能合約的撰寫提供類 SQL 的腳本語言。

開發者可以採用 AERGOSQL 撰寫類似於 SQL 文法的智能合約。

AERGOSQL 撰寫風格

為了效能最大化,AERGOSQL 利用 LLVM 等的技術來實作資料儲存。

2. 互操作性

憑藉其可插拔式的架構,AERGO 能支援不同智能合約的部署。AERGO 由 Blocko Coinstack 繼承了以太坊虛擬機的兼容性,而透過如 Docker 等的輕量級虛擬機也能支援 Fabric Chaincode。

AERGO 的初代版本將會是 Go 語言版本的以太坊虛擬機,未來也將運用 evmjit 來提高效能。

智能預言機

AERGO 允許在區塊鏈內部整合智能合約,同時讓智能合約透過智能預言機來獲取外部的資訊。智能預言機想要做到的功能如下:

  • 允許智能合約從代理系統 (如 Active Directory) 讀取資料。
  • 允許智能合約啟動外部的事件,如發送電子郵件或 SMS。

從智能合約的角度來看,智能預言機是與一特定智能合約相呼應的外部因子;當相呼應的智能合約改變時,其智能預言機將做出相應的行為,並以匯入資料到智能合約為最終反應。在某些例子中,智能預言機能夠自發地啟動智能合約。

從 dApp 的角度來看,智能預言機將運行 dApp 所需要的外部功能。由於智能預言機與 dApp 能夠在鏈下溝通,所以智能預言機提供的微服務 (micro-service) 能夠執行智能合約需要的即時溝通。一個常見的使用場景是預言機與 dApp 間交換代幣。

同構合約 (Isomorphic Contracts)

AERGO 開發的工具箱旨在透過程式碼自動生成器來支援智能合約的同構執行。由智能合約產生的同構程式碼能夠由智能預言機與 dApp 存取,智能合約與底下的資料架構的存取透明化。智能合約的同構執行對於開發智能合約、dApp 與奠基其上的服務的生產力至關重大。

並非所有的智能合約語言均支援同構合約,目前僅限制 AERGOSQL 語言。

架構比較: 傳統 dApp vs. 同構 dApp

分散式檔案系統

AERGOFS 提供分散式檔案系統的功能,為 AERGO 平台的核心組成。

AERGOFS 依賴 DD 來管理相關檔案的元資料;每個檔案的元資料 (包含其位置)、哈希值與各種統計資訊則儲存在 DD 之中。

雖然智能合約為結構化資料提供了資料綱要 (data schema) 與索引來加快搜尋速度,AERGOFS 打算提供非結構化資料儲存的能力。

AERGOFS 也提供了一個簡單的 HTTP 操作介面,讓伺服器上的智能合約與網頁瀏覽器上的 dApps 能夠藉此存取。

分散式版本控制

與傳統的區塊鏈系統不同,AERGO 將鏈的分叉與區塊重整視為區塊鏈的核心特性。藉著採取 git-like 的資料模型與命令列結構,AERGO 打算讓資料的協作如同源代碼協作般容易。

儲存庫

公有與私有儲存庫的架構

AERGO 支援公有與私有儲存庫的創建,不論是否有無命名。一個命名的儲存庫在 AERGO 公有網絡的分散式目錄中有一個相關聯的公開實體,而未命名的儲存庫則無。

與公開的 Git 儲存庫相似,一個公開的 AERGO 儲存庫將開放讀寫權限,或選擇性地允許不同的權限給匿名用戶,通常的操作是創建一個唯讀權限的公共 AERGO 儲存庫給大眾。

公有或私有儲存庫可視為與 AERGO 公共網絡獨立存在的一條私有鏈。因此,AERGO 代幣在公有或私有儲存庫中不具備任何效用。

分支

區塊的分叉與合併

在每個儲存庫中,用戶可以創建區塊鏈的不同分支。而在 AERGO 中,最佳鏈 (best chain) 等同於主要分支 (master branch)。

文法與語意

AERGO 旨在為習慣於 Git 的使用者提供友善的文法與語意的版本控制系統。該類功能可以透過 AERGO 的 CLI 客戶端或 RPC API 來取得。

a. 基礎命令

下面列出 AERGO 針對分散式版本控制的基礎用法:

aergo branch <new branch> [ — block = <block hash>]

上面的語法創建了一條新的分支。若沒有隱含區塊的哈希值當作輸入參數,則當前分支的最佳區塊會被用來當作新分支的根區塊。新的分支看起來就像是一條獨立的鏈,具備獲取新區塊的能力。如果用戶沒有生成新的分支,則預設以主分支的形式存在。

aergo tag <block hash> [ — block = <block hash>]

上列命令會創造一個命名標籤。如果沒有隱含區塊哈希值當作輸入參數,則當前分支的最佳區塊會被用來當作新標籤的根區塊。與分支不同,一個標籤是不具備獲取新區塊能力。

aergo checkout <branch | tag>

上列命令確認一個存在的分支或標籤以進行檢查或操作。

aergo pull <repository: branch>

上列命令將遠端分支中的修改合併到本地端儲存庫的分支。因此,遠端的事務也會新增進本地端的儲存庫。在此過程中,命名標籤也會進行同步。

aergo push <repository: branch>

上列命令將本地端分支中的修改合併到遠端分儲存庫的分支。因此,本地端的事務也會新增進遠端的儲存庫。在該過程中,命名標籤同樣會進行同步。

b. 分叉與合併

在分散式版本控制中,最複雜的概念之一是將分支合併的過程。對於存有實時資料的區塊鏈而言,合併甚至更難實現。由於不具破壞性,分叉是一個相對簡單與直接的過程。儘管如此,合併需要兩種不同的方法。

自動化合併

在默認情況下,兩個分支的合併會採用自動化合併。自動化合併類似於區塊鏈中的區塊重整的過程。在這樣的例子中,打算合併的分支區塊會被拆解成一筆一筆的事務,並被標的分支的合併池吸收。最終,合併池中的事務會生成新的區塊附加到標的分支的最佳區塊後頭。在這樣的過程中,與標的分支不符合的事務將會從新產生的區塊中排除掉。

一致性合併

只有在運用特定的一致性合併邏輯來創建分支時才會發生一致性合併。一致性合併類似於 Git 等的版本控制系統中的合併功能。與自動化合併會捨棄不相符的事務不同,一致性合併仰賴預定義的矛盾解除邏輯 (conflict resolution logic) 管理不相符的事務。矛盾解除邏輯是在系統層的智能合約中執行。

可擴展性

AERGO 採用三種不同的手段來處理可擴展性的議題:

  • 域名分割 (Domain partitioning)
  • 縱向擴展 (Scale up)
  • 橫向擴展 (Scale out)

基於域名的分割 (Doman-based partitioning)

該方法是 AERGO 最根本的擴展策略。AERGO 透過分散式版本控制 (distributed version control, DVC) 的功能來達到基於域名的分割處理。

與傳統區塊鏈的建置不同,AERGO 能夠自由地通過分支手段來分岔與合併資料。所以我們可以在不同的儲存庫裡將分散式帳本進行邏輯上與物理上的分割。

這類做法已透過 Git 與 Mercurial 等的分散式版本控制實現,如 GitHub 規模如此龐大的服務能夠維運數千座儲存庫的底層技術便是在此。

然而,域名分割的有效性仰賴於資料的結構與用途。單個儲存庫需要處理規模無限擴展的資料集時,透過分岔來對資料進行分割的策略將會碰到阻礙。所以 AERGO 額外提供兩種擴展性方案來針對單一儲存庫處理龐大資料量的場景。

橫向擴展

AERGO 橫向擴展的策略依賴於 AERGOFS 的功能。AERGOFS 透過兩種角色達到可擴展性:

a. AERGOFS 能被視為是每個節點區塊與索引的儲存層。AERGOFS 在 AERGO 中所扮演的角色如同 HDFS 之於 HBase。憑藉著 AERGOFS 的協助,每個節點便可以儲存數量無限的區塊與索引,運作起來像是龐大卻有效率的節點。

b. AERGOFS 也能夠扮演 AWS S3 物件儲存的角色。在這樣的配置中,AERGOFS 提供對二元資料持久不變的存取權限。另一方面,AERGO 的智能合約需在 AERGOFS 上儲存存取檔案的定位器。

縱向擴展

AERGOFS 尋求的最直接且簡單的擴展方式是將單一節點最佳化。

儘管水平擴展在處理龐大資料量的場景下運作良好,但在進一步考量真實情況的條件後仍舊遭遇阻礙。隨著廉價記憶體的誕生、如 SSD 般的快速儲存設備,與有存取極限的真實網絡狀況,對於日常使用的系統而言優化單一節點是非常有利的。Blocko 從在企業界中部署區塊鏈的經歷學到這寶貴的一課,而 AERGO 將從其中搬借經驗與技術來往前邁進。

為了讓各個節點盡可能地有效率,AERGO 將會提高存取效能而配備高效的網絡堆疊 (Networking Stack) 與經過有優化的儲存引擎。

  • AERGO 網絡堆疊提供一個無序且高度平行化的網絡架構,能夠在裸機與雲端環境為龐大數量的節點提供複雜的拓墣。
  • AERGOSQL 形成高效儲存引擎的基礎架構。
  • AERGO 節點採用多線程框架來獲得多核環境的優勢。

並發控制 (Concurrency Control)

AERGO 旨在為交易串型 (transaction serialization) 提供兩種機制。

區塊階層串行

AERGO 的目標是依據區塊高度來發展多版本並發控制 (Multi Version Concurrency Control, MVCC)。在指名特定的分支與區塊高度後,是有可能在儲存庫中橫跨不同的節點開發 MVCC。

AERGO 的 MVCC 功能旨在為一致性讀取提供一種快照讀取 (snapshot isolation)。然而, MVCC 僅能在區塊層級串行上運作。

礦池階層串行

客戶存取 AERGO 節點時能夠得益於 DPOS 與核心演算法的特色,在確保交易的完成度的前提下同時執行多筆交易。

由於每個委任節點可以在記憶池中針對新交易安排一個串行序列並生成新的區塊,客戶不必等待區塊區間來擷取交易結果,這使得執行交易的等待時間縮減至數秒至數毫秒。

礦池階層串行示意圖

儘管如此,由於允許區塊重整與鏈的分割功能,同時也存在懷有惡意的客戶端,礦池階層串行僅提供機率層級的一致性。

隱私性

資料隔離

AERGO 只允許擁有足夠權限的用戶存取私有儲存庫中的帳本資料。根據遠端母系分支所創建的新分支,使用者能夠在該私有分支中擁有最新的生成區塊,也因此與外界隔離開來。唯有具備該分支特定儲存庫的權限者才能存取這些區塊。

資料分享

一特定分支能夠透過與遠端儲存庫同步,來進行資料交換。在該例子中,儲存庫中的私有分支能夠運用 cherry-pick 指令挑選相關的更新,或者是自動合併所有的更動。

平行化

區塊鏈的效能主要取決於兩個因素:(I) 區塊的生成與傳播的效率;(II) 每個節點驗證新區塊所花費的時間。

區塊的生成過程牽涉到整體的分散式共識協議的考量,現行各種主鏈中的區塊驗證過程中,有些分散式共識機制存在設計層面上或實作層面上的缺陷。

雖然消費者規格的區塊鏈如比特幣或以太坊能夠接受效能不佳的節點,但對於企業規格的區塊鏈如 AERGO 則需要更為堅穩的效能;其每個節點的運行效能需要與共識協議一樣水準。因此,AERGO 打算在區塊生成的不同階段中引入平行化的概念,以最大化效能。

平行化牽涉到兩者間的關聯分析:每個區塊中的交易,與從階段事件驅動架構 (Staged Event-Driven Architecture, SEDA) 獲得靈感的基礎設施。

相依性分析

為了保證各節點間的一致性,區塊鏈通常採用將所有交易與區塊序列化執行的策略。所以,區塊生成速率取決於處理每筆交易的時間,而與硬體規格 — 有多少運算能力或記憶體 — 無關。

為了實現交易與區塊的平行化驗證,AERGO 將進行區塊與交易間的相依性分析,並創建一種稱作決定性交易樹 (Deterministic Transaction Tree, DTT) 的資料結構。

決定性交易樹

我們可以將 DTT 視為交易執行順序的正式表達。就一堆交易而言,可以存在多個正確可行的 DTT。

一個典型的 DTT 會有好幾個不同高度的分支。

決定性交易樹示意圖

依據區塊大小的不同,每個 DTT 可以有幾筆交易到數千筆交易的分支。另一方面,一個 DTT 也能夠擁有不同數量的分支。

為了在實時框架中針對一群交易創建 DTT,AERGO 將會部署一種新穎的方法來分析交易。更精巧的方法目前正在測試中,AERGO 將會不久的將來發布。

--

--