納爾圖(Nerthus)基於DAG技術的區塊鏈程式設計平臺

買賣虛擬貨幣
Nerthus 是一個基於 DAG 技術的通用的區塊鏈程式設計平臺,一個去中心化分散式區塊鏈作業系統。Nerthus 內建圖靈完備的程式語言,使用者可以用之來建構和定義他自己的各種特性,可以開發自己的應用與區塊鏈系統,可以發行自己的貨幣。背景

DAG,英文全稱是 Directed Acyclic Graph(有向無環圖)。在圖論中,如果一個有向圖無法從某個頂點出發經過若干條邊回到該點,這個圖則叫有向無環圖。下圖便是一個典型的有向無環圖。圓代表頂點,線叫邊,代表頂點與頂點之間的關係。

DAG 結構由 IOTA 團隊率先使用,之後 Byteball 借鑑 IOTA 的 DAG 結構,並加以改進。在 IOTA 中,要驗證新的交易前,必須直接驗證之前的兩個交易,這也使得在這兩個交易之前所有被驗證過的交易得到間接驗證。在 DAG 中,頂點代表交易,帶箭頭的線代表交易的驗證關係。在 IOTA 中,有一個權重積分的概念,所謂權重積分是指它自身的權重與它驗證過的所有交易的自身權重之和。在DAG 結構中,交易總是自己建立併發布。從理論上看,攻擊者總是可以建構比它要推翻掉的那個交易權重更高的交易用以雙花。Byteball 在 IOTA 的基礎上,做了改進,引入主鏈與見證人概念,並鼓勵驗證多個父輩交易單元。但是它在每個交易單元都有一個見證人列表,除了會造成單後設資料變大之外,還會在惡意攻擊者嘗試雙花時,故意釋出不同見證人列表的雙花單元引起混亂。同時他的確認機制是沿著一條 MC 前行的,一路遇到多少見證人,這都將增加交易證驗的複雜度與不確定性。雖然交易最終會達到一個穩定的確定性,但是交易確認的時間是不確定的。NERTHUS 在 Byteball 的基礎上,做了進一步的改進——維護使用者級別的見證人列表。並受 DPOS 機制的啟發,交易單元一旦釋出且經所有見證人共同簽署的見證單元驗證後,該交易單元就是最終確認的。具體情況,將在後面詳細介紹。

單元

Nerthus 底層資料結構採用的不是像比特幣、以太坊那種傳統的鏈式結構模式。而是採用一種 DAG(有向無環圖)結構模式。

上圖是 DAG 的結構模型,圓表示頂點,線條表示頂點與頂點的關係,箭頭表示從子單元到父輩單元的方向,G 是創世單元,每個單元,透過其箭頭所指的父輩單元,一直追溯,可達創世單元。對應於 Nerthus,圓表示一個單元。Nerthus中的單元包含引用之前一個和多個單元作為其的父輩單元,以此建立單元次序。單元可以包含多條不同型別的資料,如支付,文字訊息,智慧合約等等。

DAG 中的每個新單元,驗證並確認其父輩單元,父輩單元的父輩單元,可達創世單元,並將其父輩單元的雜湊包含到自己的單元裡面。如果有人篡改資料,其單元的雜湊必將改變,那就會使得它與直接或間接驗證確認它的子單元中引用它的雜湊不一致。如果要成功篡改單後設資料,需要與它的所有的子單元合作,子單元修改它引用的 Hash,這又會導致子單元的 Hash 發生改變,那麼子單元又要與子單元的所有子單元合作,直到最後的子單元。所以,如果一個單元被廣播到網路中,被其它單元驗證確認並建構在其上後,篡改資料需要協調的人數便會呈指數級增長。傳統的單線鏈式結構,理論上它們要修改資料,只需和後面幾個區塊達成一致,就可以達到篡改資料的目的(51%攻擊,透過算力快速產生幾個區塊,這些區塊都是自己控制的,相互合作,就可以篡改資料了)。DAG 這個模式相比來說,篡改資料的複雜度更高,更難以篡改。

雙花與地址順序單元系列鏈 

在去中心化系統裡面,有效防止雙花,是必要條件,更是基礎。如果不能有效防止雙花,整個系統就不成立了。DAG 透過下面協議規則解決雙花問題。

1、 一個單元不能引用它的其它父單元直接或間接引用過的單元做父單元。
2、 一個地址如果建立釋出超過一個單元,後釋出的單元必須直接或間接地包含引用其之前釋出的所有單元,形成這個地址的順序單元系列。
3、 如果一個地址釋出的單元,違反規則二,釋出一個或多個,沒有順序引用關係的單元或單元系列,都會視為雙花,不論是否存在實質性雙花行為。
4、 在遵守規則二的情況下,出現雙花問題,順序單元系列裡,釋出較早的有效,釋出晚的無效。如果不遵守規則二,釋出多個非順序引用關係的單元或單元系列,根據最優順序單元系列演算法,只有一個單元或順序單元系列有效,其餘單元或順序單元系列無效。
5、 如果一個地址的單元間接或直接包含引用兩個或以上的自己釋出的沒有順序的單元,該單元無效,不論是否存在實質性雙花行為。

圖二中,橙色實心圓點代表了是同一個地址所釋出的所有單元。後面的直接或間接地包含前面的單元,形成一個有序的單元序列。

圖三中,橙色實心圓點與藍色實心圓點都是同一個地址所釋出的單元。可以看出藍色實心圓點與橙色實心圓點之間沒有順序包含引用關係。這種情況下,只有一個順序單元系列被承認。其它順序單元的所有交易都會被視為無效的。

圖四中,橙色實心圓點與藍色實心圓點都是同一個地址所釋出的單元。藍色單元 D,間接包含引用了沒有順序關係的橙色單元與藍色單元。根據規則四,因此,單元 D 是不被承認的無效單元。建構在 D 之上的由該地址釋出的後續單元,由於 D 引用了沒有順序關係的多個同地址單元,所以 D 的後續單元也間接地引用了它們,因而也都是無效的。

在圖二、圖三與圖四中,可以看到,從右到左,從一個單元出發,用粗箭頭線指向它的一個父單元,它的這個父單元又用粗箭頭線指向這個父單元的一個父單元,直到創世塊,形成了一個鏈條,我們稱其為地址順序單元系列鏈。

地址順序單元系列鏈是指,從一個子單元開始,選出其最佳父單元,其最佳父單元又選出這個父單元的最佳父單元,直至創世塊。最佳父單元由單元高度、包含的見證單元數,時間戳,包含該子單元的順序單元數量及路徑,共同計算一個權重而獲得。

根據規則五,兩條開始相互獨立,而在後面的某一點上又相互交叉的地址順序單元系列,我們簡化了其引起的不必要的複雜性。因而,如果出現兩條或多條地址順序單元系列鏈(為了簡化表述,我們把同一地址釋出的沒有包含引用關係的相互獨立單元,即使只有一個獨立的單元構不成順序單元系列,稱為地址順序單元系列鏈),根據規則四,相互獨立的地址順序單元序列,只有一條被認為有效。用下面原則,選定一條地址順序單元系列鏈為有效,其餘的皆為無效而不被承認。

1、 如果出發點是無效的,那麼其後續的所有都是無效的。在同一地址的多個不同地址順序單元系列中,如果在這些地址順序單元系列鏈中,第一個地址單元無效,那麼這個地址順序單元系列鏈都無效。

2、 根據規則一,我們把問題簡化為,當同一地址出現多個不同的地址順序單元系列時,只需比較這些順序單元系列中的第一個地址單元,並選擇出一個最優的地址單元,那麼這個最優地址單元所在的地址順序單元系列鏈就是有效的,其餘的都是無效的。

見證人

單個地址順序單元中,每個單元都會有先後次序關係。當出現雙花問題時,根據先後次序關係,判定早的單元有效,後的單元無效。這就很容易就解決了雙花問題。但是,如果攻擊者釋出故意多個沒有順序關係的單元或單元系列,那麼情況就變得複雜了。因為在 DAG 中,單元是可以自己建立併發布的,他可以選擇自己的父單元,可選擇自己的高度,偽造時間戳,他可以根據規則偽造出比他想要推翻的單元權重更高的單元,可以建立更多的單元來確認這個雙花單元,用來進行雙花。而且他可能會建立一個隱藏的單元系列鏈,然後在某一時刻公佈這個單元系列鏈,把之前所有的單元全都推翻,更致命的是,你不知道他會在什麼時候公佈這條隱藏的鏈。為此,我們引入了見證人機制來解決這個問題。

見證人機制是受傳統區塊鏈的委託權益證明(DPOS)啟發而設計的。見證人透過選舉產生,使用者可以提交競選,並繳納一筆保證金後,就成為候選見證人。

系統根據候選見證人的得票數,保證金,聲譽以及是否有實名資訊,以及平時表現等,計算出一個指數,並根據指數,為其分配它的見證使用者。作為報酬,他會與其被見證使用者的所有其它見證人分享被見證使用者的所有單元的交易費,但見證者的報酬,會凍結三個月,三個月後方可領取。如果見證人長時間不履行其職責,不釋出見證單元,將會被取消見證人資格,並在一定時間內不得參選見證人。如果見證人不遵守見證規則,釋出無效惡意見證區塊,將會被沒收保證金,並永遠不得參選見證人。

每個使用者都有其見證人列表,這個見證人列表的數量為奇數。在使用者建立第一個單元之前,系統會為它分配一個見證人列表,並公佈到網路。網路會維護每一個使用者的見證人列表。為了防止使用者與見證人串通,使用者無法選擇見證人,而見證人也無法選擇使用者,並且會每間隔一定的時間,更新一次見證人列表,全網也會記錄所有的更新,並記錄見證人成為該使用者見證人的起止時間。

使用者釋出單元后,其見證人列表中的見證人將給單元進行見證確認,其過程如下:

1、 使用者釋出單元到網路(同時也直接傳送給他的見證人)。

2、 見證人接收到單元,並與該被見證人的其他所有見證人通訊,以確定所有見證人收到的單元是一致的。這是必要的步驟。如果一個惡意的使用者,想攻擊網路,他可能會給不同的見證人傳送不同的無序單元。如果見證人之間不進行通訊確認的話,每個見證人將會對不同的無序單元進行確認,這樣系統將會進入混亂狀態。舉個極端例子,某使用者擁有一個 21 人的見證人列表,在還沒形成單元系列時,他同時釋出出 21 個不同的無順序關係的單元,並分別給每個見證人傳送一個不相同的單元。在見證人之間不進行相互通訊的情況下,都對收到的單元進行確認驗證。那麼就有 21 個獨立的單元同時有效,這肯定是不可接受的。

3、 如果所有在場見證人收到的單元是一致的,經由所有在場見證人校驗,如果沒有錯誤,則所有在場見證人共同簽署見證單元,併發布到網路。在場見證人一定要超過該使用者見證人列表裡所有見證人的 50%。使用者的見證人列表有 21 個見證人,那麼需要的在場見證人至少要有 11個。之所以有在場見證人這個概念是因為,可能存在網路問題、有時有些見證人離線,或者有些見證人可能有惡意,留有 49%的冗餘,以確保系統的健壯。

4、 如果所有在場見證人獲得的使用者單元是不一致的,他們將相互交換單元,並檢查這些單元是否存在有效包含關係,如果存在有效包含關係,以最後的子單元為準。如果單元中在惡意含包關係(惡意包含關係指單元直接或間接包含引用了自己兩個非序順單元系列),則此單元被拋棄。如果多個單元間是相互獨立,沒有順序關係的,所有在場見證人根據最小雜湊原則選擇其中一個單元作為有效單元,共同簽署見證單元,釋出到網路。

5、 見證單元一經發布,該使用者被驗證的單元及其引用自身的前輩單元皆被確認,並具有最終性。

見證規則:

1、 在同一分叉點,同一驗證者只能對其中的一個單元或單元系列投票,來作有效驗證。
2、 如果使用者單元或單元系列已經存在了驗證單元,其後的驗證單元只能在這條已有的驗證單元的地址順序單元系列鏈上進行,並且驗證單元間也要建立次序關係。
3、 如果見證者違反上規則一和二,則其保證金及凍結的三個月交易手續費都將被沒收,並且將永遠不能成為見證人。

圖五中,橙色與藍色是同一地址釋出的兩個獨立的順序單元序列,在它們的第一個單元之前,都沒有自己的單元,那麼我們把沒有包含自己任何單元的單元稱為 0 點單元。在這裡分叉我們稱為 0 點分叉。紫色的 V 單元是見證人簽署的驗證單元,它確認的是橙色地址順序單元系列。

圖六中,橙色地址序順單元系列在第一個驗證單元后出現了 B 與 C 兩個分叉單元,驗證單元選擇了 B,那麼 B 就是有效的,C 是無效的。我們以橙色單元為出發點,排除與地址無關的節點單元計數,B 與 C 處於第四層的位置。我們稱為 4 分叉點。

在 0 分叉點上,見證單元支援了橙色,在 4 分叉點上它支援了 B,根據見證規則一,在 0 分叉點上與 4 分叉點上任何現有或後來可能偽造的其它地址順序單元系列或單元都是無效的。根據見證規則二,如果使用者單元或單元系列已經存在了驗證單元,其後的驗證單元只能在這條已有驗證單元的地址順序單元系列鏈上進行,並且驗證單元間也要建立次序關係。那就可以確保任何使用者地址,都只有一條明確清晰的被認可的順序單元系列。

最終性

比特幣與以太坊,有一個最大的問題就是沒有一個確定的不可更改的最終狀態。理論是,如果有足夠的算力,足夠的出塊速度,產生一條更長的隱藏鏈,就可以把之前的區塊推翻。Nerthus 單元經過見證人釋出見證區塊後,就已是最終確定的狀態,無法推翻。

確認時間

確認時間取決於見證者釋出見證區塊的時間。我們把見證者釋出見證區塊的時間分為加急,急,快,普通,慢五個等級,每個等級需要支付的驗證費用不同,以平衡見證者的負載及被見證者的時間需求。最快的加急,在不考慮網路狀況的情況下,一秒內完成。

NERTHUS 的五大突破

1、 更徹底去中心化

傳統的區塊+鏈式結構,需要有一個類中心化的操作,即需要一個記賬人,將當前所有交易進行驗證處理,然後打包到一個區塊,再發布到網路。而 Nerthus系統,如上所述,採用的是單元+DAG 結構,沒有區塊這一概念。所有單元由使用者自己建立與釋出。其驗證與確認由引用其作為先輩單元的後輩單元來承擔。無需傳統區塊+鏈式結構那樣,需要一個記賬人,將當前所有交易打包到區塊這一中心化的操作,因而是一種更徹底的去中心化系統。

2、 無吞吐量瓶頸

因為傳統區塊+鏈式結構存在著中心化的操作過程,即需要記賬人將交易打包到區塊。那麼區塊鏈系統處理交易能力的大小,必定受制於以下三點:(1)記賬人節點機器的效能;(2)記賬人節點的網路頻寬;(3)區塊的大小。因為存在這一中心化色彩的操作,無論怎樣最佳化,始終都會存在著一個處理能力的瓶頸點。如上所述,Nerthus 系統,採用的是單元+DAG 結構,沒有記賬人打包區塊這一中心化的操作,因此也不存在區塊這一概念。單元由使用者建立釋出,並由其它單元驗證確認,因而不存在吞吐量瓶頸。

3、 無區塊擴容與資料膨脹的悖論性兩難

傳統區塊+鏈式結構需要所有交易要打包到區塊才有效。若區塊的容量設定小,當交易量大時,很多交易無法及時打包進區塊。若區塊容量設定大,則會使區塊鏈資料迅速膨脹,普通個人電腦無法執行全節點,只有少數人才可能執行全節點,會造成中心化的結果。這也是比特幣擴容之爭的根本矛盾點。如上所述,Nerthus 沒有區塊這一概念,所以對於傳統區塊+鏈式結構先天性的悖論兩難問題,在 Nerthus 中就根本不存在。

4、 明確可預期的最終性

傳統區塊+鏈式結構,不排除可能同時產生兩個甚至多個區塊,由此導致分叉。對於出現分叉的情況,傳統區塊鏈將以最長鏈作為有效鏈。該機制在理論上會將無法確定最終性,因為無法保證是否存在一條隱藏長鏈。而 nerthus 透過見證人機制,只要透過見證人釋出的見證單元驗證確認,即具最終性,無法推翻。

5、 可選交易確認速度

見證人釋出見證區塊分為加急、急、快、普通、慢五個等級。使用者可根據自身需求,選擇交易確認速度。

NERTHUS 的生態系統與三層架構

Nerthus 是一個通用的智慧合約平臺與區塊鏈作業系統。同時也致力於打造一個基於 Nerthus 的生態系統。

Nerthus 在底層採用單元+DAG 結構,無需記賬者打包,打造了一個更為徹底的去中心化區塊鏈系統。一個沒有吞吐量瓶頸限制的區塊鏈系統,是 Nerthus的核心部分,也是 Nerthus 提供的基礎設施。在整個 Nerthus 系統中,它處於底層,是基礎層。

在 Nerthus 基礎層之上,我們還引入了服務層,以供基於 Nerthus 開發的開發者快速開發各種應用。在服務層中,我們除了封裝好核心層的各種 API 之外,還提供了區塊鏈翻譯系統與側鏈系統。區塊鏈翻譯系統主要是指,使兩個相互獨立的區塊鏈,能夠相互讀懂對方,能夠無障礙通迅。側鏈系統是指企業使用者,可以快速生成基於 Nerthus 的私有鏈和聯盟鏈,並鏈結在 Nerthus 主鏈上,可以利用 Nerthus 翻譯系統與其它鏈相互通訊與交易。建立一個良好的生態系統,除了擁有先進性技術之外,還應該能夠整合各種資源。區塊鏈翻譯系統,主要目的在於整合現有的各種區塊鏈資源,讓現有的各個區塊鏈專案,透過 Nerthus 能夠相互通訊,並且能夠相互互動,成為 Nerthus 生態圈的一環。而基於 Nerthus 的應用開發者,能開發出跨越各種鏈的應用。而側鏈系統則為建立聯盟鏈與私有鏈的企業與機構,提供一個快速、低成本的方式。雖然這些企業與機構因為各種原因,只能建立聯盟鏈或私有鏈,但他們依然有與其它公有鏈使用者的通訊交易需求,Nerthus 的側鏈系統正好為它們提供這樣的功能介面。

在服務層之上,是 Nerthus 的應用層。Nerthus 應用層是指,基於 Nerthus 上開發的各種區塊鏈應用,這些應用主要由第三方開發者開發。目前,區塊鏈的各種應用,最典型的比如錢包,使用者體驗還不是很好。區塊鏈開發者更多的還是注重於功能的實現,對於使用者體驗關注度不是很高。一項技術,一個系統,一項應用,如果想要大家都使用,使用者體驗是非常重要的一環。Nerthus 非常關注使用者體驗,借鑑 IOS 的經驗,將建立一套 Nerthus 應用層的規範與標準。

Nerthus 核心基礎層是 Nerthus 生態系統的根基。Nerthus 上的開發者以及基於各區塊鏈系統,是 Nerthus 生態中的上游參與者,我們在服務層為他們提供各種便利的服務介面。普通使用者則是 Nerthus 生態中的消費者,我們制定一套使用者友好的應用層規範標準,方便普通使用者體驗。

Witstone 與 OVM

智慧合約程式語言與執行環境是實現可程式設計的區塊鏈作業系統的基礎設施。OVM 是專門為 Nerthus 區塊鏈系統研發的虛擬機器,為 Nerthus 智慧合約提供安全可靠高效能的執行環境。

同時,我們還提供了一門編寫 Nerthus 智慧合約的語言——Witstone。Witstone 是一種類似於 Javascript 的指令碼語言,從語言層面上加入了對 Nerthus一些特性的支援。Witstone 是一門簡單易用、易上手的智慧合約程式語言,開發者無需多大學習成本,在短時間內就能編寫出 Nerthus 智慧合約。

NERTHUS 代幣

NERTHUS 將提供 NERTHUS 代幣。NERTHUS 代幣是維護 NERTHUS 系統的血液與燃料。使用者建立釋出單元需要支付給見證人見證費,執行智慧合約需要支付計步費。NERTHUS 代幣總量為 100 億。

總結

Nerthus 系統與以太坊一樣,致力於打造一個通用的智慧合約程式設計平臺與區塊鏈作業系統。Nerthus 有自己的圖靈完備的程式語言 Witstone,以及執行環境OVM。與以太坊不同的是,我們在底層使用 DAG 技術,有效地解決了傳統區塊鏈系統面臨的低吞吐量,交易確認延時,區塊膨脹等區塊鏈式結構先天性的悖論問題。在智慧合約方面,為了使其更具實用性,Nerthus 系統設計了一套鏈外資料驗證確認共識的機制,使之前智慧合約難以實現的場景,變成了可由智慧合約實現的領域。Nerthus 將推動智慧合約在現實世界的普及應用。

免責聲明:

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

推荐阅读

;