Neo區(qū)塊鏈如何實現(xiàn)終局性?|Neo專欄

不知道小伙伴們有沒有注意到,我們在往交易所進行轉(zhuǎn)入的時候,幾乎所有的交易所都會在區(qū)塊鏈上監(jiān)測到交易數(shù)據(jù)之后,還需要我們等待幾個區(qū)塊鏈周期來進行確認,比如比特幣通常需要6個確認周期,按照十分鐘一個周期來算,我們往交易所轉(zhuǎn)賬,則需要等待大概一個小時才能對我們轉(zhuǎn)入的資金進行操作,XRP大概需要12個周期,NEO大概需要5個周期。這件事是很煩人的,因為這樣的確認其實數(shù)倍的增加了我們轉(zhuǎn)賬操作的時間成本。
所以這篇文章里,我們就首先一起來討論下這個確認周期的由來,之后我們再一起聊聊關于NEO的確認周期的問題。當然,對這塊比較熟悉的小伙伴可以直接跳到第二部分來看關于NEO確認周期的專題討論。
什么是網(wǎng)絡確認(Network Confirmation)
網(wǎng)絡確認這個概念來源于區(qū)塊鏈這種數(shù)據(jù)組織結構里的新區(qū)塊生成這種行為,最開始是出現(xiàn)在中本聰大神的那個開天辟地的《比特幣:一種點對點的電子貨幣系統(tǒng)》論文里。單數(shù)的網(wǎng)絡確認的意思是交易在經(jīng)過共識后被打包進新區(qū)塊的過程,或者說是交易被寫入?yún)^(qū)塊鏈的過程,復數(shù)的網(wǎng)絡確認指的是在交易被寫入?yún)^(qū)塊鏈后,從包含了那筆交易的區(qū)塊在內(nèi)新生成的區(qū)塊的個數(shù)。所以6個比特幣網(wǎng)絡確認的意思就是交易被打包進比特幣的鏈上之后,又在此基礎上生成了5個新的區(qū)塊。
為什么需要網(wǎng)絡確認
網(wǎng)絡確認其實是比特幣這個支付系統(tǒng)可靠性的一個重要組成部分。為了解釋這個問題,我們首先來回顧下比特幣里使用的PoW算力證明共識算法。在PoW里,所有的礦工獨自(礦池除外)的去解一道數(shù)學難題,第一個解出這道題的人則優(yōu)先獲取生成新區(qū)塊的權力,然后把他生成的區(qū)塊廣播給整個網(wǎng)絡??墒菃栴}在于由于整個網(wǎng)絡的礦工都是獨立工作的,有可能在同一時間可能會有多個礦工同時解出了問題的答案,然后分別廣播出了自己的新區(qū)塊,就好像是班里兩個跑步成績不相伯仲的人同時沖向了終點線。但是區(qū)塊鏈本身只能有一條主鏈,就好像比賽只能有一個第一名,那怎么去從兩個新的區(qū)塊中選擇一個加入主鏈呢?中本聰給出的答案是,不選擇,兩個新區(qū)塊都保留,就像是在一棵樹上分出了兩個小枝丫,一個比賽中出現(xiàn)了并列第一??墒沁@樣就在一個原本需要是一條光溜溜的鏈上引入了分叉,如果這樣的情況不停的發(fā)生,那么我們最終擁有的將不再是一條區(qū)塊鏈,而是一顆區(qū)塊樹,一顆毫無用處存在大量冗余數(shù)據(jù)的樹。
為了解決這個分叉問題,比特幣提出了網(wǎng)絡確認的概念。具體來說就是,如果比特幣網(wǎng)絡上出現(xiàn)了分叉,那么就保留所有的分叉,但是在任何時候,比特幣只承認最長的那個分叉為主鏈。就好比原本跑步存在了并列第一,但是現(xiàn)在我們不以一輪跑步的結果作為依據(jù)了,我們要跑接力賽,如果你們并列第一,那也沒有任何意義,因為最終的結果將是看好幾輪下來之后的最終成績,即使期間有一次兩個人水平差不多,那么幾次下來也將會產(chǎn)生很大的差距。尤其是在所有礦工相互博弈的情況下,礦工都會選擇在更長的鏈上去生成新區(qū)塊,就好像比賽的時候如果對方比你跑得快,那你下面將沒有人為你接力,你跟別人的差距肯定會越拉越大。
那么為什么對于比特幣,這個確認周期會是6呢?這里的分析方案是假設在一個正常的比特幣網(wǎng)絡里的出現(xiàn)了跟正常算力和另一股攻擊算力,如果攻擊者的算力只有正常算力的九分之一,也就是攻擊者擁有全網(wǎng)算力的10%,那么攻擊者能夠在落后當前主鏈1個區(qū)塊的基礎上將分支的高度拉到超越主鏈的概率是0.2045873(數(shù)據(jù)來源于中本聰區(qū)塊鏈論文),如果落后3個的話,追上的概率是0.0131722,落后6個區(qū)塊的情況下攻擊者能把支鏈變成主鏈的概率則變成了0.0002428,算是達到了一個相對安全的位置,這意味著如果攻擊者掌握著10%的全網(wǎng)算力,那么攻擊者想要在交易已經(jīng)確認了6個周期的基礎上再修改包含那筆交易的區(qū)塊的概率是0.0002428。這是啥概念呢,我們?nèi)棵蓙碜?道四選一的單項選擇題的全對概率是0.000244。
因此在引入了網(wǎng)絡確認這個概念之后,比特幣就可以保證整個鏈也許過程中會出現(xiàn)一些短時間的分叉,但是最終都會只有一條主鏈。這里多提一句,我們常說的51%攻擊的意思是當攻擊者擁有了超過50%的全網(wǎng)算力之后幾乎肯定可以任意高度的修改當前的主鏈,但是并不是說只有攻擊者擁有51%算力之后才能對區(qū)塊鏈發(fā)動攻擊。按照概率來說,哪怕攻擊者只擁有1%-49%的算力,他也是可以對主鏈發(fā)動攻擊的,只不過成功的概率大小不等。
Neo的迷之網(wǎng)絡確認
對Neo的共識算法有了解的小伙伴應該知道,Neo用的是一種叫做委托拜占庭容錯(dBFT)的共識算法,按照Neo官方文檔的介紹,dBFT具有終局性,也就是說,這個共識算法維護的區(qū)塊鏈不會產(chǎn)生分叉,不會像比特幣那樣同一時間產(chǎn)生兩個或者多個區(qū)塊。這個終局性的原因在于不同于比特幣世界里每個礦工都在撅著屁股去挖掘新的區(qū)塊,Neo的世界里在每一個共識周期(不考慮視圖)里,只有一個節(jié)點有權利去生成新的區(qū)塊,而且其他議員節(jié)點都是圍繞著這個節(jié)點生成的新區(qū)塊進行表決驗證,也就是說哪怕是這個節(jié)點單次生成多個有效區(qū)塊,那么最終在一個周期里也只會有一個有效區(qū)塊被表決通過。換句話說,任何情況下,任何時候,Neo的世界里都只有一個話事人,這個話事人會變,但是在任何一個共識周期里都只有一個聲音,產(chǎn)生一個區(qū)塊。
所以這件事就很奇怪,明明Neo不可能產(chǎn)生分叉,為了PoW設計的多個網(wǎng)絡確認的機制為何也用在了Neo的系統(tǒng)中呢?仔細考慮之后我認為有可能是以下幾個原因:
第一就是交易所本身為了自己的安全,對于任何幣種的所有的deposit交易都進行了冗余的確認,以避免意外情況,無論這種意外是否存在,對于交易所來說額外的確認都是更安全的。
第二就是針對于Neo歷史上確實存在的幾次分叉事件。哦,不好意思,雖然理論上來說Neo的共識協(xié)議是不會產(chǎn)生分叉的,但是實際上在運行的過程中,Neo之前的共識協(xié)議確實也因為存儲以及節(jié)點問題出現(xiàn)過一些分叉情況,如果大家去同步Neo的主鏈,大概率會經(jīng)歷幾次同步過程終止等等問題。當然,Neo的共識協(xié)議已經(jīng)升級到了2.0,以往的問題已經(jīng)得到了妥善的解決。畢竟區(qū)塊鏈還是一種處于研究階段的技術,各種新的概念都還沒有充分經(jīng)過時間的檢驗,出現(xiàn)問題也是在所難免,無論是龍頭比特幣還是任何其他區(qū)塊鏈項目都被發(fā)現(xiàn)過或多或少的問題。
第三就是可能存在的驗證問題,因為我們知道雖然Neo整個共識協(xié)議是完整的,但是交易所用來同步Neo區(qū)塊鏈數(shù)據(jù)的卻僅僅是一個單獨的沒有任何特殊權益的普通節(jié)點,它能做的無非就是跟別的Neo節(jié)點相互連接然后進行數(shù)據(jù)同步,而數(shù)據(jù)的真實性有效性則完全需要交易所節(jié)點自己來驗證,在這個過程中,也有可能存在潛在的攻擊,比如之前對EOS交易成功與否的判斷失效問題,以及針對區(qū)塊鏈網(wǎng)絡的日蝕攻擊等等都可以專門針對交易所的區(qū)塊鏈節(jié)點進行單獨的攻擊,因此交易所無差別的引入多個交易確認在一定程度上可以增加攻擊者的攻擊成本或者難度降低交易所的風險。
結論
本文通過分析交易所的交易確認,介紹了區(qū)塊鏈需要交易確認的原因以及沒有交易確認會導致的后果,并從Neo的共識算法角度來分析為什么Neo區(qū)塊鏈具有終局性,以及為什么交易所不需要對NEO的存入進行多輪交易確認。本文純粹從技術角度看待問題,不足之處敬請諒解。
