OG(Annchain.OG)高效能去中心化可信通用平臺

買賣虛擬貨幣

OG 是一個擁有智慧合約的 DAG 高效能區塊鏈。OG 底層採用了有向無環圖(DAG)的賬本構型,解決了現有塊鏈區塊鏈架構去中心化、安全、擴充套件性三角平衡問題。同時 OG 解決了 DAG 型區塊鏈與智慧合約的相容性問題,能夠確保在 DAG 結構下智慧合約交易的有序性。

OG 具有如下特性:

效率:算力越大,效率越高。整個網路的交易吞吐量隨著網路中全節點的加入而增加,交易的確認時間也隨著全節點數量的增加而縮短,從而達到高擴充套件性。

公平:OG 中沒有專門的節點負責網路狀態共識,OG 網路中交易即共識,任何參與者既是網路使用者,又是維護者,地位平等。

安全:每一個交易的參與方都是前序交易的驗證方並且被持續地以一種收斂的方式進行驗證,要製造雙花交易難度很大且成本非常高。

智慧合約:OG 透過獨有的共識排序機制解決了普通 DAG 賬本無法有序執行智慧合約的問題。OG 將無序的合約交易進行共識排序並上鏈,使得網路中每個節點上的虛擬機器都有相同的執行結果和合約狀態。

分片:OG 考慮到今後規模可能會快速增長,支援基於應用的分片,實現系統的高擴充套件性。

預言機:OG 透過有序的智慧合約,支援線上賬本與外部世界的溝通和資料呼叫。


DAG 形態

DAG,作為 OG 的底層協議和網路構型,同時滿足了去中心化和高效能的雙重需求。我們基於此,提出了能夠滿足高效能智慧合約執行的構架。這章主要介紹 DAG 構架。

1. DAG

DAG,英文全稱是 Directed Acyclic Graph,中文意為“有向無環圖”。如果一個有向圖無法從某個定點出發經過若干條邊回到該點,這個有向圖叫做有向無環圖。


在 DAG 模型中,方框表示單元,線條表示關係,箭頭表示從子單元到創世單元的方向,每個單元指向它的父單元。

與傳統區塊鏈不同,在 DAG 中,沒有將交易封裝成區塊的概念,全網在同一時刻也不用對同一區塊進行共識。DAG 中的每個單元為一筆交易,交易單元組成 DAG 網。由於大部分交易之間並沒有很強的因果關係,因此可以非同步併發寫入交易,極大提高了併發量,同時將交易確認時間降低到最低,解決了傳統區塊鏈的擴充套件性問題,吞吐量可以達到超大規模,並且可以水平擴充套件。

2. Sequencer

在傳統的 DAG 模型中,交易之間的非同步釋出和驗證保證了整個系統的高吞吐量,但是同時也使得各交易間的時間順序不可靠且不可驗證,這使得 DAG 結構上使用智慧合約成為難點。IOTA 尚未支援智慧合約,Byteball 僅支援宣告式非圖靈完備合約。由於交易確認的不確定性、節點同步的不確定性、網路延遲的不確定性等原因,交易的插入順序不能保證。對於普通交易來說,順序的前後對最終結果不會有影響,因為 DAG 能保證整個網路交易結果的最終一致。但是對於智慧合約,順序的混亂會導致節點間的世界狀態無法達成共識。

分散式系統中,實現智慧合約的普遍做法便是維持節點間的狀態一致。傳統的單鏈區塊鏈如以太坊,所有的針對智慧合約的操作都會以交易的形式釋出到鏈上並被礦工記錄到區塊中。出塊節點決定了當前塊中交易的順序,工作量證明決定了不會有太多的分叉結果,即使分叉也能保證大部分節點的選擇是正確的。各個節點在經過共識後能保證自己的區塊鏈賬本內容(交易)和其它節
點一致。在這個前提下,因為智慧合約的操作順序也被記錄在賬本上,所以各個節點在執行這些操作的時候會產生相同的結果,從而保證了合約狀態的一致。

在 DAG 模型中,沒有礦工統一打包交易這一步驟,每個節點對於網路的理解在每一時刻都有可能不同,這導致所有的交易呈現一個無序的狀態。而無序的交易與狀態一致性是互相矛盾的。這個矛盾點是制約 DAG 上智慧合約實現的關鍵點。

為了解決無序操作造成的狀態不一致問題,在繼承了 DAG 中的交易單元與連線的模型後,我們創造性地提出了第二種單元的型別:Sequencer,這樣我們的 OG 的組成元素即為:交易(Tx)單元、Sequencer 單元、有向連線(驗證)。Sequencer 單元和 Tx 單元在 DAG 圖中的作用是一樣的,都可以去引用以及被引用,都需要被足夠多的後繼單元驗證才能固定下來。其本質的區別在於提交人的不同以及承載的內容的不同。Sequencer 的主要作用是幫助 DAG 網路進行交易的共識排序。除此之外,下文也會提到 Sequencer 會作為一個公信單元,定期進行網路狀態確定化的工作。


如上圖所示,Sequencer 單元和普通的 Tx 單元在構建 DAG 的過程中的形態要求是一致的,都需要對之前的未經驗證的單元(Tip1)進行驗證。兩者不同的是它們的內容:

Trunk Hash 和 Branch Hash 分別代表當前 Tx(或者 Sequencer)驗證的兩個Tip 的雜湊。普通 Tx 的主要內容是轉賬雙方的地址(From 和 To)以及轉賬的金額(Value)。Sequencer 不會有普通的交易轉賬資訊,它的主要內容是合約相關的 Tx 的雜湊值(TxSequencer 欄位)。為了減少系統的冗餘,TxSequencer 欄位只會記錄這些 Tx 的順序和索引,不會記錄 Tx 的完整內容。Sequencer 保證了這一批 Tx 的執行順序。當任意節點收到 Sequencer 繼而執行合約時,合約相關的Tx 執行順序就依照 Sequencer 的內容來決定。


3. 狀態確定化(Fanality)

Sequencer 除了確定智慧合約交易的執行順序外,還兼任定期將網路狀態確定化的工作,防止網路被寄生鏈回滾。經過 Sequencer 驗證的父單元,以及所有祖先單元的狀態將被即刻確定,不能被推翻(即 Finality)。


Ivy

Ivy 是區塊鏈中的賬本,OG 中每一個節點的 Ivy 沒有絕對的一致性,每個節點 Ivy 可能不太一樣,但總體趨勢是相同的,經 Sequencer 序列化後,也會確定下來一個主賬本。因此 OG 的安全性也面臨著艱鉅的挑戰,但 OG 改進了構造DAG 的要求和流程,杜絕 DAG 構型中存在的安全隱患。

1. 網路構建

OG 網路中一個單元需要驗證前序的單元,應選擇幾個單元為最佳,本文給出建議是 2 個(見後證明)。這樣才能被廣播到網路上成為 DAG 網路的一部分。為了維護這個網路的安全、公平、高效,OG 綜合考量了效能、安全、去中心化等因素,制定瞭如下前序單元的選擇規則(A 系列):

1. 在滿足以下規則的前提下,隨機選擇當前網路中未被確認的兩個單元(Tip),無需考慮權重因素,雖然理論上允許,但不鼓勵選擇已被其它單元確認的單元。
2. 一個單元不能直接引用父單元直接或間接引用過的單元。

3. 一個地址如果建立釋出超過一個單元,後釋出的單元必須直接或間接地包含引用其之前釋出的所有單元,形成這個地址的順序單元系列。

Sequencer 同樣需要遵守此條,即後一個 Sequencer 塊必須直接或間接確認前一個Sequencer。

4. 如果一個地址釋出的單元違反規則 A3,釋出一個或多個沒有順序引用關係的單元或單元系列,都視為雙花,無論是否存在實質性雙花行為。

5. 在遵守規則 A3 的情況下,出現雙花問題,根據順序單元 Sequencer 確認時間,判定釋出較早的有效,釋出晚的無效。如果不遵守規則 A3,釋出多個非順序引用關係的單元或單元系列,根據最優順序單元系列演算法,只有一個單元或順序單元系列有效,其餘單元或順序單元系列無效。

6. 如果一個地址的單元間接或直接引用兩個或以上的同一人傳送的沒有順序的單元,該單元無效,不論是否存在實質性雙花行為。


A 系列規則主要防止惡意節點的雙重支付攻擊。任何有衝突的交易終將會被後繼的收斂交易發現並孤立,最終作廢。

如後文指出的,為了對自始至終只驗證某幾條交易的懶惰節點進行約束,我們制定額外的前序單元的選擇規則(B 系列):

1. 長週期限制:新的單元不能驗證古老的、已經被 N 個 Sequencer 塊覆蓋的單元。例如下圖,令 N=2,則白色區域的新單元將無法以 Sequencer1 終結過的祖先單元作為父單元。這避免了懶惰節點永遠選擇某一個早就被驗證的單元作為父單元的可能性。


2. 短週期限制:在長週期允許的範圍內,為了避免懶惰節點選擇某幾個固定的存在於短週期內的已驗證單元作為父單元、為了避免大量懶惰節點合謀作惡選取同一父節點,也為了對單個節點短時間內傳送交易數量的限制,在選取父單元的過程中需要對父單元的雜湊值進行限定,具體方法為:

a) 預先制定雜湊函式 H string −> 64 bit heximal。

b) 節點選取父單元前需要進行一個難度不大的工作量證明,遍歷出滿足條件的 nonce,使得H tx,nonce ≤ a

c) 節點在廣播單元前需要進行一個難度比 b)顯著小的另一個工作量證明,遍歷出滿足條件的父單元 txA, txB,使得H H txA ,H txB ,nonce ≤ b

其中, a ≪ b. d) 如果無法從當前 Tip 池中選出滿足條件的父單元 txA, txB,則該節點針對該筆交易,可選擇:1,重新計算 b)中的另一個 nonce;2,選擇更多或更少的父單元做驗證;3,等待滿足條件的父單元出現。


隨機父單元選取方式

採用可變難度係數法則,定義難度係數X ,當交易被驗證時,校驗者呼叫難度公式,計算得到與之匹配的原始難度。


F 為總計算量,由父單元校驗開銷和本地挖礦開銷組成。交易傳送者可選擇校驗父單元個數 k,本地挖礦難度係數X與 k 存在反比例關係,如圖 10。為了取 F 最小值,建議選取父單元校驗個數為 2,如圖 11,滿足交易傳送方效能最優原則,以及全網 TIP 收斂要求。

2. 隨機選擇原則

目前常見的 DAG 網路都依賴權重進行父單元的選擇。如 IOTA 會根據馬爾科夫蒙特卡洛演繹方法選擇前序單元,使得選出某一個單元的概率分佈與其路徑上所有父單元權重造成的影響成正向關係。又例如 Byteball 設定中心化的Witness 來引導單元選擇可信度高的前序單元。從效果上來看,任何企圖引導單元、透過演算法影響單元選擇某些所謂的“主鏈單元”的策略都是低效且不必要的。事實上,這會造成大量單元採用雷同的策略進行交易選擇,在交易量上升之後會造成大量交易由於不在偏好列表裡,而無法被後續單元驗證的情況。

以目前採用了馬爾科夫蒙特卡洛演繹方法的 IOTA 網路為例,在 TPS 僅僅為11 的環境下,Tip 單元佔比達到 39%,被至少一個單元驗證過的單元比例僅為61%,其中最終被網路承認的單元比例僅為 18%.新生單元隨大流,偏愛權重較高的主路徑,跟隨同一個節點後被後繼單元的馬爾科夫蒙特卡洛演繹方法淘汰,得不到任何確認的機會。


在 OG 中,單元在選擇前序單元時不作任何路徑上的假設和計算,完全隨機選擇在單元池中尚未被驗證的新單元,只要該單元能夠被合法連結(見下文描述)。完全隨機的過程保證了每一筆在網路中的單元都能夠有相同的機率被驗證,而與區塊所在位置無關。經過模擬,在同樣的引數下,隨機選擇的策略保證了只要 TPS 規模不以幾何級速度增長,該網路無論交易量大小,都能最終收斂。

智慧合約

智慧合約交易的執行是需要網路中所有節點共識順序的,否則會造成執行結果的不統一。Sequencer 的到來使得 OG 網路中的所有節點對於智慧合約交易的順序有了共識。

1. Sequencer 的生成

和 一 般 的 DAG Tx 不 同 , 我 們 使 用 PoS (Proof-of-Stake) 共 識 生 成 每 個Sequencer。在系統中,有一部分節點在抵押了部分資產後會擁有 Senator 身份。擁有這個身份的節點將獲得打包生成 Sequencer 的權利。Senator 的主要職責是將部分符合權重要求且與合約相關的 Tx 以權重為第一參考要素按順序打包進Sequencer 中。在一輪 Sequencer 生成周期中同一時間只會有一個 Senator 進行打包工作,剩餘的 Senator 會對新生成的 Sequencer 進行校驗,只有透過其它Senator 校驗的 Sequencer 才會被整個 DAG 網路承認。所有的 Sequencer 都會有先後的編號,Sequencer 與 Sequencer 之間始終保持著有序的狀態。

2. 執行合約

在圖 14 的場景中,節點需要執行合約時,首先它會從 DAG 中獲取自己沒執行過的最早(根據編號判斷最早)的 Sequencer 也就是 Sequencer1。然後依據 Sequencer1 的 TxSequencer 欄位儲存的 Tx 雜湊找到 DAG 中對應的 Tx 並逐條執行 Tx 的內容。最後將執行完的結果儲存到自己本地的 DB 中。由於所有正常的節點在執行合約的時候都以 Sequencer1 中標註的 Tx 順序執行,且所有人的Sequencer1 都是保證一致的,所以最後正常節點間的合約狀態也會保持一致。執行完 Sequencer1 後下一輪執行 Sequencer2,如此往下迴圈下去。

安全

不管是塊鏈架構的區塊鏈還是基於 DAG 架構的區塊鏈都必須解決雙花、交易確定性、DOS 問題。本節將重點介紹 OG 如何透過自身結構上的安全機制免疫這些攻擊 。

1. 針對 DAG 可能的攻擊方式

目前影響 DAG 賬本的安全性和高效性的嘗試主要有以下幾點:


1.1.寄生鏈雙重支付

攻擊者進行一筆雙重支付,可以在原交易取得實質性結果(如貨物交割,合約執行)後取消該交易,使交易對手方遭受損失,其具體步驟為:

● 攻擊者在正常的網路中傳送一筆交易並得到了足夠的後繼交易的確認
● 與此同時攻擊者在一條不為人所知的本地鏈中傳送雙重支付交易
● 攻擊者持續在本地鏈中傳送大量交易,這些交易用於確認該雙重支付交易,並且不確認正常網路上的原始交易。
● 這些交易既可以透過大量身份產生(女巫攻擊),也可以不定期地確認正常網路上的交易(寄生在正常網路上的寄生鏈),從而達到增加自身權重、混淆視聽的目的。
● 當攻擊者認為自身的寄生鏈已經超過主鏈,從而使得大部分主鏈上的後繼交易在面臨雙花選擇時傾向於選擇寄生鏈而非主鏈時,將這條寄生鏈公佈於眾。
● 一旦成功,主鏈上之前已經確認過的交易,連同它前後的交易都面臨被拋棄的風險。

OG 的設計杜絕了寄生鏈存在的可能性。寄生鏈成功的關鍵在於攻擊者能夠以更快的速度在不為人知的本地 DAG 網路上構建出比主網權重更大的 DAG 分支。該行為決定了這些私有交易不能被廣播,否則網路上任何一個單元都有可能在第一時間發現該雙花交易而將之隔離。

OG 引入的 Sequencer,同時也是交易終結性的確定者。被 Sequencer 直接或間接驗證的交易直接進入終結狀態。寄生鏈由於不能廣播自己,因此無法被Sequencer 看到,也會遠比正常單元晚進入網路。正如規則 B1 所述,任何一個誠實節點在驗證既往交易的時候,都不會用這些突如其來沒有被 Sequencer 終結過的交易去覆蓋已經被終結過的原始交易。Sequencer 的存在加速了交易的確認速度,同時防止了惡意攻擊企圖推翻較長曆史的嘗試。

1.2.懶惰節點

一筆新的交易需要驗證之前未被驗證的交易。但由於網路延遲的因素存在,無法避免一筆過往的交易同時被多筆交易驗證。一般而言,新的交易應當隨機選擇在交易池中未被驗證的交易,從而使得交易池中的交易能夠被快速消耗。

然而一個懶惰節點會傾向於驗證某一個固定的早已被驗證的遠古交易(例如一個在核心路徑上的老交易)。這樣對於該懶惰節點而言,只需驗證一次,就可以廣播無數交易,並且其它誠實節點同樣會確認該筆交易。這種懶惰的行為雖然不會對整個網路的安全性造成影響,但是它們提高自己效率的代價是降低整個網路的效能。因此在 DAG 賬本中,無論該類節點是出於何種目的(程式碼實現錯誤、純粹利己節點、寄生鏈節點等),均需要對這種行為進行約束或懲罰。

OG 透過獨特的父節點選擇演算法保證了單個節點不可能每次都選擇固定的一個或幾個父節點,也保證了多個節點無法串通選擇某一個或幾個父節點。正如B2 所述,單元需要先遍歷出一個與交易資訊相關的本地 nonce,使得該單元Hash 小於某個難度值 a。這個過程(PoW1)需要被設計成佔用 90%以上的挖礦時間。一旦 nonce 確立,單元需要將該 nonce 與潛在的兩個父單元的 Hash 進行合併,計算 Hash,使得該掛鉤 Hash 小於某個難度值 b。這個過程(PoW2)需要被設計成佔用 10%不到的挖礦時間。

我們的目的在於讓節點在每次選擇未確認單元的時候都傾向於選擇不同的單元而非同一個。影響最終單元有效性的因素有兩個:父單元的 Hash 和本地的nonce。之所以設計 PoW1 難度遠大於 PoW2,是因為我們要讓節點在進行 PoW遍歷的時候,更換父單元的難度要遠遠小於更換 nonce 的難度。這樣如果一個懶惰節點執意要跟隨某一個固定交易,那麼它無法享受演算法給他帶來的優惠(換父單元,PoW2),必須每次都要換 nonce,而換 nonce(需要進行 PoW1)又是一件非常困難的事情。

父節點選擇演算法同樣限制了多個節點合謀跟隨同一個交易的企圖,原理與限制單個節點跟隨同一個交易一致。

1.3.DoS

作為一個全節點,既是網路的使用者又是網路的維護者,因此傳送交易無需手續費。然而無手續費可能會誘使惡意節點傳送大量微小單元進行對網路的“合法”的或“非法”的 DoS。

對於合法的 DoS,其交易格式正確,則 PoW 必須要能夠透過驗證,而計算PoW 對於一筆正常交易來說時間微不足道,但要形成足以影響 DAG 網路的量級的 DoS,需要攻擊方付出大量的算力成本。

對於非法的 DoS,其交易格式不正確,則收到該交易的節點不會中繼這筆交易。攻擊者最多影響該單個節點,而幾乎無法影響整個 OG 網路,也無法透過攻擊 OG 網路的一部分而對整個 OG 網路進行有效攻擊。

2. 安全的虛擬機器

作為以太坊最核心的功能之一,智慧合約及其語言 Solidity 在近年來得到了廣泛的應用。以太坊虛擬機器 EVM 及智慧合約雖然滿足了圖靈完備的功能要求,但是在安全性方面已經被證實存在較多缺陷,這對於一個執行著經濟模型的區塊鏈系統而言是有非常大風險的。例如,基於以太坊發行的虛擬幣 SMT、EDU、BEC 均由於未使用 SafeMath,導致在代幣數量計算過程中整數溢位,導致貨幣超額增發;又例如,Fomo3D 所採用的隨機數演算法在同一區塊中能夠被複現,同一區塊裡的其它交易能夠預測該隨機數,從而導致抽獎演算法存在不公,間接導致了該團隊其他專案的失敗。對智慧合約的安全性審查過於複雜,需要考慮多方面因素,嚴重影響了其公開透明的特性,使得普通使用者難以驗證該合約是否存在漏洞。

與其讓開發者在每個合約中都對合約的安全性反覆斟酌,OG 從源頭上,即智慧合約語法和虛擬機器本身去解決安全問題。

數值安全:傳統的 EVM 對於溢位採取的是容忍的態度,而 OG 的虛擬機器則完全不允許溢位,從根源上避免了大量非預期的行為。

型別安全:EVM 對於代幣的實現與普通整數無異,導致貨幣可能被簡單增發。而 OG 原生提供 Coin 型別,對於代幣的操作都有一套獨立的、區分於普通數值計算的方式。

許可權安全:從語言層面上強制智慧合約編寫者顯式指定所有函式的許可權要求,避免了由於疏忽導致的高危函式被越權呼叫的問題。

OG 的智慧合約語言和虛擬機器旨在對目前常見的 Solidity 漏洞進行根源上的避免,令智慧合約不再危險。

總結

OG 提出一種基於 DAG 通用區塊鏈架構,主要解決現有區塊鏈中去中心化、擴充套件性、安全三者平衡難題及 DAG 如何結合智慧合約。我們很高興看到我們所做的探索及一些成果,但其中有些問題本文中還沒給出很好的解決,如安全性,強一致性及最終性。


更多區塊鏈資訊:http://www.qukuaiwang.com.cn/news

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;