Nerthus是一個基于DAG技術的通用的區(qū)塊鏈編程平臺,一個去中心化分布式區(qū)塊鏈操作系統(tǒng)。Nerthus內(nèi)置圖靈完備的編程語言,用戶可以用之來建構和定義他自己的各種特性,可以開發(fā)自己的應用與區(qū)塊鏈系統(tǒng),可以發(fā)行自己的貨幣。
背景
DAG,英文全稱是 Directed Acyclic Graph(有向無環(huán)圖)。在圖論中,如果一個有向圖無法從某個頂點出發(fā)經(jīng)過若干條邊回到該點,這個圖則叫有向無環(huán)圖。下圖便是一個典型的有向無環(huán)圖。圓代表頂點,線叫邊,代表頂點與頂點之間的關系。
DAG 結構由 IOTA 團隊率先使用,之后 Byteball 借鑒 IOTA 的 DAG 結構,并加以改進。在 IOTA 中,要驗證新的交易前,必須直接驗證之前的兩個交易,這也使得在這兩個交易之前所有被驗證過的交易得到間接驗證。在 DAG 中,頂點代表交易,帶箭頭的線代表交易的驗證關系。在 IOTA 中,有一個權重積分的概念,所謂權重積分是指它自身的權重與它驗證過的所有交易的自身權重之和。在DAG 結構中,交易總是自己創(chuàng)建并發(fā)布。從理論上看,攻擊者總是可以建構比它要推翻掉的那個交易權重更高的交易用以雙花。Byteball 在 IOTA 的基礎上,做了改進,引入主鏈與見證人概念,并鼓勵驗證多個父輩交易單元。但是它在每個交易單元都有一個見證人列表,除了會造成單元數(shù)據(jù)變大之外,還會在惡意攻擊者嘗試雙花時,故意發(fā)布不同見證人列表的雙花單元引起混亂。同時他的確認機制是沿著一條 MC 前行的,一路遇到多少見證人,這都將增加交易證驗的復雜度與不確定性。雖然交易最終會達到一個穩(wěn)定的確定性,但是交易確認的時間是不確定的。NERTHUS 在 Byteball 的基礎上,做了進一步的改進——維護用戶級別的見證人列表。并受 DPOS 機制的啟發(fā),交易單元一旦發(fā)布且經(jīng)所有見證人共同簽署的見證單元驗證后,該交易單元就是最終確認的。具體情況,將在后面詳細介紹。
單元
Nerthus 底層數(shù)據(jù)結構采用的不是像比特幣、以太坊那種傳統(tǒng)的鏈式結構模式。而是采用一種 DAG(有向無環(huán)圖)結構模式。
上圖是 DAG 的結構模型,圓表示頂點,線條表示頂點與頂點的關系,箭頭表示從子單元到父輩單元的方向,G 是創(chuàng)世單元,每個單元,通過其箭頭所指的父輩單元,一直追溯,可達創(chuàng)世單元。對應于 Nerthus,圓表示一個單元。Nerthus中的單元包含引用之前一個和多個單元作為其的父輩單元,以此建立單元次序。單元可以包含多條不同類型的數(shù)據(jù),如支付,文本消息,智能合約等等。
DAG 中的每個新單元,驗證并確認其父輩單元,父輩單元的父輩單元,可達創(chuàng)世單元,并將其父輩單元的哈希包含到自己的單元里面。如果有人篡改數(shù)據(jù),其單元的哈希必將改變,那就會使得它與直接或間接驗證確認它的子單元中引用它的哈希不一致。如果要成功篡改單元數(shù)據(jù),需要與它的所有的子單元合作,子單元修改它引用的 Hash,這又會導致子單元的 Hash 發(fā)生改變,那么子單元又要與子單元的所有子單元合作,直到最后的子單元。所以,如果一個單元被廣播到網(wǎng)絡中,被其它單元驗證確認并建構在其上后,篡改數(shù)據(jù)需要協(xié)調(diào)的人數(shù)便會呈指數(shù)級增長。傳統(tǒng)的單線鏈式結構,理論上它們要修改數(shù)據(jù),只需和后面幾個區(qū)塊達成一致,就可以達到篡改數(shù)據(jù)的目的(51%攻擊,通過算力快速產(chǎn)生幾個區(qū)塊,這些區(qū)塊都是自己控制的,相互合作,就可以篡改數(shù)據(jù)了)。DAG 這個模式相比來說,篡改數(shù)據(jù)的復雜度更高,更難以篡改。
雙花與地址順序單元系列鏈
在去中心化系統(tǒng)里面,有效防止雙花,是必要條件,更是基礎。如果不能有效防止雙花,整個系統(tǒng)就不成立了。DAG 通過下面協(xié)議規(guī)則解決雙花問題。
1、 一個單元不能引用它的其它父單元直接或間接引用過的單元做父單元。
2、 一個地址如果創(chuàng)建發(fā)布超過一個單元,后發(fā)布的單元必須直接或間接地包含引用其之前發(fā)布的所有單元,形成這個地址的順序單元系列。
3、 如果一個地址發(fā)布的單元,違反規(guī)則二,發(fā)布一個或多個,沒有順序引用關系的單元或單元系列,都會視為雙花,不論是否存在實質(zhì)性雙花行為。
4、 在遵守規(guī)則二的情況下,出現(xiàn)雙花問題,順序單元系列里,發(fā)布較早的有效,發(fā)布晚的無效。如果不遵守規(guī)則二,發(fā)布多個非順序引用關系的單元或單元系列,根據(jù)最優(yōu)順序單元系列算法,只有一個單元或順序單元系列有效,其余單元或順序單元系列無效。
5、 如果一個地址的單元間接或直接包含引用兩個或以上的自己發(fā)布的沒有順序的單元,該單元無效,不論是否存在實質(zhì)性雙花行為。
圖二中,橙色實心圓點代表了是同一個地址所發(fā)布的所有單元。后面的直接或間接地包含前面的單元,形成一個有序的單元序列。
圖三中,橙色實心圓點與藍色實心圓點都是同一個地址所發(fā)布的單元??梢钥闯鏊{色實心圓點與橙色實心圓點之間沒有順序包含引用關系。這種情況下,只有一個順序單元系列被承認。其它順序單元的所有交易都會被視為無效的。
圖四中,橙色實心圓點與藍色實心圓點都是同一個地址所發(fā)布的單元。藍色單元 D,間接包含引用了沒有順序關系的橙色單元與藍色單元。根據(jù)規(guī)則四,因此,單元 D 是不被承認的無效單元。建構在 D 之上的由該地址發(fā)布的后續(xù)單元,由于 D 引用了沒有順序關系的多個同地址單元,所以 D 的后續(xù)單元也間接地引用了它們,因而也都是無效的。
在圖二、圖三與圖四中,可以看到,從右到左,從一個單元出發(fā),用粗箭頭線指向它的一個父單元,它的這個父單元又用粗箭頭線指向這個父單元的一個父單元,直到創(chuàng)世塊,形成了一個鏈條,我們稱其為地址順序單元系列鏈。
地址順序單元系列鏈是指,從一個子單元開始,選出其最佳父單元,其最佳父單元又選出這個父單元的最佳父單元,直至創(chuàng)世塊。最佳父單元由單元高度、包含的見證單元數(shù),時間戳,包含該子單元的順序單元數(shù)量及路徑,共同計算一個權重而獲得。
根據(jù)規(guī)則五,兩條開始相互獨立,而在后面的某一點上又相互交叉的地址順序單元系列,我們簡化了其引起的不必要的復雜性。因而,如果出現(xiàn)兩條或多條地址順序單元系列鏈(為了簡化表述,我們把同一地址發(fā)布的沒有包含引用關系的相互獨立單元,即使只有一個獨立的單元構不成順序單元系列,稱為地址順序單元系列鏈),根據(jù)規(guī)則四,相互獨立的地址順序單元序列,只有一條被認為有效。用下面原則,選定一條地址順序單元系列鏈為有效,其余的皆為無效而不被承認。
1、 如果出發(fā)點是無效的,那么其后續(xù)的所有都是無效的。在同一地址的多個不同地址順序單元系列中,如果在這些地址順序單元系列鏈中,第一個地址單元無效,那么這個地址順序單元系列鏈都無效。
2、 根據(jù)規(guī)則一,我們把問題簡化為,當同一地址出現(xiàn)多個不同的地址順序單元系列時,只需比較這些順序單元系列中的第一個地址單元,并選擇出一個最優(yōu)的地址單元,那么這個最優(yōu)地址單元所在的地址順序單元系列鏈就是有效的,其余的都是無效的。
見證人
單個地址順序單元中,每個單元都會有先后次序關系。當出現(xiàn)雙花問題時,根據(jù)先后次序關系,判定早的單元有效,后的單元無效。這就很容易就解決了雙花問題。但是,如果攻擊者發(fā)布故意多個沒有順序關系的單元或單元系列,那么情況就變得復雜了。因為在 DAG 中,單元是可以自己創(chuàng)建并發(fā)布的,他可以選擇自己的父單元,可選擇自己的高度,偽造時間戳,他可以根據(jù)規(guī)則偽造出比他想要推翻的單元權重更高的單元,可以創(chuàng)建更多的單元來確認這個雙花單元,用來進行雙花。而且他可能會創(chuàng)建一個隱藏的單元系列鏈,然后在某一時刻公布這個單元系列鏈,把之前所有的單元全都推翻,更致命的是,你不知道他會在什么時候公布這條隱藏的鏈。為此,我們引入了見證人機制來解決這個問題。
見證人機制是受傳統(tǒng)區(qū)塊鏈的委托權益證明(DPOS)啟發(fā)而設計的。見證人通過選舉產(chǎn)生,用戶可以提交競選,并繳納一筆保證金后,就成為候選見證人。
系統(tǒng)根據(jù)候選見證人的得票數(shù),保證金,聲譽以及是否有實名信息,以及平時表現(xiàn)等,計算出一個指數(shù),并根據(jù)指數(shù),為其分配它的見證用戶。作為報酬,他會與其被見證用戶的所有其它見證人分享被見證用戶的所有單元的交易費,但見證者的報酬,會凍結三個月,三個月后方可領取。如果見證人長時間不履行其職責,不發(fā)布見證單元,將會被取消見證人資格,并在一定時間內(nèi)不得參選見證人。如果見證人不遵守見證規(guī)則,發(fā)布無效惡意見證區(qū)塊,將會被沒收保證金,并永遠不得參選見證人。
每個用戶都有其見證人列表,這個見證人列表的數(shù)量為奇數(shù)。在用戶創(chuàng)建第一個單元之前,系統(tǒng)會為它分配一個見證人列表,并公布到網(wǎng)絡。網(wǎng)絡會維護每一個用戶的見證人列表。為了防止用戶與見證人串通,用戶無法選擇見證人,而見證人也無法選擇用戶,并且會每間隔一定的時間,更新一次見證人列表,全網(wǎng)也會記錄所有的更新,并記錄見證人成為該用戶見證人的起止時間。
用戶發(fā)布單元后,其見證人列表中的見證人將給單元進行見證確認,其過程如下:
1、 用戶發(fā)布單元到網(wǎng)絡(同時也直接發(fā)送給他的見證人)。
2、 見證人接收到單元,并與該被見證人的其他所有見證人通信,以確定所有見證人收到的單元是一致的。這是必要的步驟。如果一個惡意的用戶,想攻擊網(wǎng)絡,他可能會給不同的見證人發(fā)送不同的無序單元。如果見證人之間不進行通信確認的話,每個見證人將會對不同的無序單元進行確認,這樣系統(tǒng)將會進入混亂狀態(tài)。舉個極端例子,某用戶擁有一個 21 人的見證人列表,在還沒形成單元系列時,他同時發(fā)布出 21 個不同的無順序關系的單元,并分別給每個見證人發(fā)送一個不相同的單元。在見證人之間不進行相互通信的情況下,都對收到的單元進行確認驗證。那么就有 21 個獨立的單元同時有效,這肯定是不可接受的。
3、 如果所有在場見證人收到的單元是一致的,經(jīng)由所有在場見證人校驗,如果沒有錯誤,則所有在場見證人共同簽署見證單元,并發(fā)布到網(wǎng)絡。在場見證人一定要超過該用戶見證人列表里所有見證人的 50%。用戶的見證人列表有 21 個見證人,那么需要的在場見證人至少要有 11個。之所以有在場見證人這個概念是因為,可能存在網(wǎng)絡問題、有時有些見證人離線,或者有些見證人可能有惡意,留有 49%的冗余,以確保系統(tǒng)的健壯。
4、 如果所有在場見證人獲得的用戶單元是不一致的,他們將相互交換單元,并檢查這些單元是否存在有效包含關系,如果存在有效包含關系,以最后的子單元為準。如果單元中在惡意含包關系(惡意包含關系指單元直接或間接包含引用了自己兩個非序順單元系列),則此單元被拋棄。如果多個單元間是相互獨立,沒有順序關系的,所有在場見證人根據(jù)最小哈希原則選擇其中一個單元作為有效單元,共同簽署見證單元,發(fā)布到網(wǎng)絡。
5、 見證單元一經(jīng)發(fā)布,該用戶被驗證的單元及其引用自身的前輩單元皆被確認,并具有最終性。
見證規(guī)則:
1、 在同一分叉點,同一驗證者只能對其中的一個單元或單元系列投票,來作有效驗證。
2、 如果用戶單元或單元系列已經(jīng)存在了驗證單元,其后的驗證單元只能在這條已有的驗證單元的地址順序單元系列鏈上進行,并且驗證單元間也要建立次序關系。
3、 如果見證者違反上規(guī)則一和二,則其保證金及凍結的三個月交易手續(xù)費都將被沒收,并且將永遠不能成為見證人。
圖五中,橙色與藍色是同一地址發(fā)布的兩個獨立的順序單元序列,在它們的第一個單元之前,都沒有自己的單元,那么我們把沒有包含自己任何單元的單元稱為 0 點單元。在這里分叉我們稱為 0 點分叉。紫色的 V 單元是見證人簽署的驗證單元,它確認的是橙色地址順序單元系列。
圖六中,橙色地址序順單元系列在第一個驗證單元后出現(xiàn)了 B 與 C 兩個分叉單元,驗證單元選擇了 B,那么 B 就是有效的,C 是無效的。我們以橙色單元為出發(fā)點,排除與地址無關的節(jié)點單元計數(shù),B 與 C 處于第四層的位置。我們稱為 4 分叉點。
在 0 分叉點上,見證單元支持了橙色,在 4 分叉點上它支持了 B,根據(jù)見證規(guī)則一,在 0 分叉點上與 4 分叉點上任何現(xiàn)有或后來可能偽造的其它地址順序單元系列或單元都是無效的。根據(jù)見證規(guī)則二,如果用戶單元或單元系列已經(jīng)存在了驗證單元,其后的驗證單元只能在這條已有驗證單元的地址順序單元系列鏈上進行,并且驗證單元間也要建立次序關系。那就可以確保任何用戶地址,都只有一條明確清晰的被認可的順序單元系列。
最終性
比特幣與以太坊,有一個最大的問題就是沒有一個確定的不可更改的最終狀態(tài)。理論是,如果有足夠的算力,足夠的出塊速度,產(chǎn)生一條更長的隱藏鏈,就可以把之前的區(qū)塊推翻。Nerthus 單元經(jīng)過見證人發(fā)布見證區(qū)塊后,就已是最終確定的狀態(tài),無法推翻。
確認時間
確認時間取決于見證者發(fā)布見證區(qū)塊的時間。我們把見證者發(fā)布見證區(qū)塊的時間分為加急,急,快,普通,慢五個等級,每個等級需要支付的驗證費用不同,以平衡見證者的負載及被見證者的時間需求。最快的加急,在不考慮網(wǎng)絡狀況的情況下,一秒內(nèi)完成。
NERTHUS 的五大突破
1、 更徹底去中心化
傳統(tǒng)的區(qū)塊+鏈式結構,需要有一個類中心化的操作,即需要一個記賬人,將當前所有交易進行驗證處理,然后打包到一個區(qū)塊,再發(fā)布到網(wǎng)絡。而 Nerthus系統(tǒng),如上所述,采用的是單元+DAG 結構,沒有區(qū)塊這一概念。所有單元由用戶自己創(chuàng)建與發(fā)布。其驗證與確認由引用其作為先輩單元的后輩單元來承擔。無需傳統(tǒng)區(qū)塊+鏈式結構那樣,需要一個記賬人,將當前所有交易打包到區(qū)塊這一中心化的操作,因而是一種更徹底的去中心化系統(tǒng)。
2、 無吞吐量瓶頸
因為傳統(tǒng)區(qū)塊+鏈式結構存在著中心化的操作過程,即需要記賬人將交易打包到區(qū)塊。那么區(qū)塊鏈系統(tǒng)處理交易能力的大小,必定受制于以下三點:(1)記賬人節(jié)點機器的性能;(2)記賬人節(jié)點的網(wǎng)絡帶寬;(3)區(qū)塊的大小。因為存在這一中心化色彩的操作,無論怎樣優(yōu)化,始終都會存在著一個處理能力的瓶頸點。如上所述,Nerthus 系統(tǒng),采用的是單元+DAG 結構,沒有記賬人打包區(qū)塊這一中心化的操作,因此也不存在區(qū)塊這一概念。單元由用戶創(chuàng)建發(fā)布,并由其它單元驗證確認,因而不存在吞吐量瓶頸。
3、 無區(qū)塊擴容與數(shù)據(jù)膨脹的悖論性兩難
傳統(tǒng)區(qū)塊+鏈式結構需要所有交易要打包到區(qū)塊才有效。若區(qū)塊的容量設置小,當交易量大時,很多交易無法及時打包進區(qū)塊。若區(qū)塊容量設置大,則會使區(qū)塊鏈數(shù)據(jù)迅速膨脹,普通個人電腦無法運行全節(jié)點,只有少數(shù)人才可能運行全節(jié)點,會造成中心化的結果。這也是比特幣擴容之爭的根本矛盾點。如上所述,Nerthus 沒有區(qū)塊這一概念,所以對于傳統(tǒng)區(qū)塊+鏈式結構先天性的悖論兩難問題,在 Nerthus 中就根本不存在。
4、 明確可預期的最終性
傳統(tǒng)區(qū)塊+鏈式結構,不排除可能同時產(chǎn)生兩個甚至多個區(qū)塊,由此導致分叉。對于出現(xiàn)分叉的情況,傳統(tǒng)區(qū)塊鏈將以最長鏈作為有效鏈。該機制在理論上會將無法確定最終性,因為無法保證是否存在一條隱藏長鏈。而 nerthus 通過見證人機制,只要通過見證人發(fā)布的見證單元驗證確認,即具最終性,無法推翻。
5、 可選交易確認速度
見證人發(fā)布見證區(qū)塊分為加急、急、快、普通、慢五個等級。用戶可根據(jù)自身需求,選擇交易確認速度。
NERTHUS 的生態(tài)系統(tǒng)與三層架構
Nerthus 是一個通用的智能合約平臺與區(qū)塊鏈操作系統(tǒng)。同時也致力于打造一個基于 Nerthus 的生態(tài)系統(tǒng)。
Nerthus 在底層采用單元+DAG 結構,無需記賬者打包,打造了一個更為徹底的去中心化區(qū)塊鏈系統(tǒng)。一個沒有吞吐量瓶頸限制的區(qū)塊鏈系統(tǒng),是 Nerthus的核心部分,也是 Nerthus 提供的基礎設施。在整個 Nerthus 系統(tǒng)中,它處于底層,是基礎層。
在 Nerthus 基礎層之上,我們還引入了服務層,以供基于 Nerthus 開發(fā)的開發(fā)者快速開發(fā)各種應用。在服務層中,我們除了封裝好核心層的各種 API 之外,還提供了區(qū)塊鏈翻譯系統(tǒng)與側鏈系統(tǒng)。區(qū)塊鏈翻譯系統(tǒng)主要是指,使兩個相互獨立的區(qū)塊鏈,能夠相互讀懂對方,能夠無障礙通迅。側鏈系統(tǒng)是指企業(yè)用戶,可以快速生成基于 Nerthus 的私有鏈和聯(lián)盟鏈,并鏈結在 Nerthus 主鏈上,可以利用 Nerthus 翻譯系統(tǒng)與其它鏈相互通信與交易。建立一個良好的生態(tài)系統(tǒng),除了擁有先進性技術之外,還應該能夠整合各種資源。區(qū)塊鏈翻譯系統(tǒng),主要目的在于整合現(xiàn)有的各種區(qū)塊鏈資源,讓現(xiàn)有的各個區(qū)塊鏈項目,通過 Nerthus 能夠相互通訊,并且能夠相互交互,成為 Nerthus 生態(tài)圈的一環(huán)。而基于 Nerthus 的應用開發(fā)者,能開發(fā)出跨越各種鏈的應用。而側鏈系統(tǒng)則為建立聯(lián)盟鏈與私有鏈的企業(yè)與機構,提供一個快速、低成本的方式。雖然這些企業(yè)與機構因為各種原因,只能建立聯(lián)盟鏈或私有鏈,但他們依然有與其它公有鏈用戶的通訊交易需求,Nerthus 的側鏈系統(tǒng)正好為它們提供這樣的功能接口。
在服務層之上,是 Nerthus 的應用層。Nerthus 應用層是指,基于 Nerthus 上開發(fā)的各種區(qū)塊鏈應用,這些應用主要由第三方開發(fā)者開發(fā)。目前,區(qū)塊鏈的各種應用,最典型的比如錢包,用戶體驗還不是很好。區(qū)塊鏈開發(fā)者更多的還是注重于功能的實現(xiàn),對于用戶體驗關注度不是很高。一項技術,一個系統(tǒng),一項應用,如果想要大家都使用,用戶體驗是非常重要的一環(huán)。Nerthus 非常關注用戶體驗,借鑒 IOS 的經(jīng)驗,將建立一套 Nerthus 應用層的規(guī)范與標準。
Nerthus 核心基礎層是 Nerthus 生態(tài)系統(tǒng)的根基。Nerthus 上的開發(fā)者以及基于各區(qū)塊鏈系統(tǒng),是 Nerthus 生態(tài)中的上游參與者,我們在服務層為他們提供各種便利的服務接口。普通用戶則是 Nerthus 生態(tài)中的消費者,我們制定一套用戶友好的應用層規(guī)范標準,方便普通用戶體驗。
Witstone 與 OVM
智能合約編程語言與運行環(huán)境是實現(xiàn)可編程的區(qū)塊鏈操作系統(tǒng)的基礎設施。OVM 是專門為 Nerthus 區(qū)塊鏈系統(tǒng)研發(fā)的虛擬機,為 Nerthus 智能合約提供安全可靠高性能的運行環(huán)境。
同時,我們還提供了一門編寫 Nerthus 智能合約的語言——Witstone。Witstone 是一種類似于 Javascript 的腳本語言,從語言層面上加入了對 Nerthus一些特性的支持。Witstone 是一門簡單易用、易上手的智能合約編程語言,開發(fā)者無需多大學習成本,在短時間內(nèi)就能編寫出 Nerthus 智能合約。
NERTHUS 代幣
NERTHUS 將提供 NERTHUS 代幣。NERTHUS 代幣是維護 NERTHUS 系統(tǒng)的血液與燃料。用戶創(chuàng)建發(fā)布單元需要支付給見證人見證費,運行智能合約需要支付計步費。NERTHUS 代幣總量為 100 億。
總結
Nerthus 系統(tǒng)與以太坊一樣,致力于打造一個通用的智能合約編程平臺與區(qū)塊鏈操作系統(tǒng)。Nerthus 有自己的圖靈完備的編程語言 Witstone,以及運行環(huán)境OVM。與以太坊不同的是,我們在底層使用 DAG 技術,有效地解決了傳統(tǒng)區(qū)塊鏈系統(tǒng)面臨的低吞吐量,交易確認延時,區(qū)塊膨脹等區(qū)塊鏈式結構先天性的悖論問題。在智能合約方面,為了使其更具實用性,Nerthus 系統(tǒng)設計了一套鏈外數(shù)據(jù)驗證確認共識的機制,使之前智能合約難以實現(xiàn)的場景,變成了可由智能合約實現(xiàn)的領域。Nerthus 將推動智能合約在現(xiàn)實世界的普及應用。
評論
查看更多