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 將推動智能合約在現實世界的普及應用。
評論
查看更多