為什麼我們需要「解耦狀態」?

買賣虛擬貨幣
在上一篇「三分鐘入門Neo3」中,我們針對Neo2中的一個問題——缺乏全域性狀態以及它對輕客戶端的一些影響,提出了「在區塊頭中包含狀態根」的解決方案。 

尤其是對於輕量級客戶端(例如使用者錢包)和跨鏈交易而言,「在區塊頭中包含狀態根」可以為資料儲存提供有價值的信任保證。但是,這種方案將捆綁起區塊永續性和狀態永續性,這一特徵可能會導致效能嚴重損失。

本篇所介紹的初步解決方案是希望能夠改善這一缺陷,並將介紹Neo的bug修復功能。

狀態根可能帶來的隱患

核心開發者Igor Coelho認為,將最新狀態根新增到區塊頭中的前提,是必須在提議該區塊之前由共識節點充當發言人來計算當前狀態。

在花費時間排序並驗證事務以構造一個塊之後,共識節點需要處理那些事務中包含的所有狀態更改,才能確定最終狀態。只有在計算完狀態根後才能將其包含在區塊頭中,因此所有計算都必須在區塊建立到向其他節點提議之間進行。

在某些情況下,這可能會耗盡規定範圍裡共識輪次中的所有可用時間,導致其他共識節點確認更改的時間變少,並影響下一個區塊的確認時間。延遲會降低網路的總體吞吐量,因為對於每個失敗的共識輪次,阻塞時間都會增加一倍。

核心開發者Shargon提出了一個可行的解決方案,他指出新塊頭可以包含以前的狀態。這可以消除潛在的效能缺陷,因為在達成共識時,節點無需花費資源來計算狀態。此過程可以隨後完成,新塊狀態將保留到下一個區塊頭中。

儘管這種方法可以更好地利用節點資源,並有助於確保區塊的優先生成,但也會削弱Neo的獨有優勢——在不影響區塊鏈的不可篡改特性前提下修復協議bug。

解耦狀態

Neo2的一個典型特徵是,可以在不影響區塊歷史的情況下修復程式碼中的bug。Neo創始人張錚文首先提到了這點,並由Igor Coelho總結道:

“Neo有一個特點,可以不斷修補程式中的bug,而狀態與協議規範本身(而不是程式碼)相關聯。因此,如果程式碼存在bug,並且我們將“狀態”鎖定在塊上,那麼我們將永遠無法解決問題。”

張錚文提供了這種bug修復功能的示例,他演示了NeoVM若產生出錯誤的合約結果,可能導致對合約儲存的bug修改。諸如資產丟失或由於此類漏洞而引起的駭客入侵等事件,可以在大多數經過分叉程式的PoW / PoS區塊鏈上解決,但是分叉本質上是兩極分化的事件,可能涉及“回滾”區塊。

這威脅了網路交易的最終確定性,質疑了賬本的不可篡改性,並可能導致破壞或分裂生態系統,就像過去比特幣和以太坊所發生的那樣。

如果Neo2發生類似問題,可以透過更新修復NeoVM程式碼中的bug並將其推廣到網路上的節點。每個更新的節點像以前一樣重新同步相同的區塊鏈,以保留交易的不可篡改,但是錯誤的合約執行將不再發生。這將更改狀態根,但不會影響網路,因為當前尚未保留全域性狀態。

從本質上講,在不影響網路的前提下將狀態與協議規範關聯,為Neo提供了獨特的bug修復能力,既保持了區塊鏈的不可篡改性,也不會在常規分叉過程中造成大量的開銷。但是,當前它是以沒有達成一致的全球狀態為前提的。除了效能優勢外,獨特的bug修復能力也是解耦狀態下的另一個優勢。

- 解耦狀態 -

解耦旨在讓資料模型、業務邏輯、檢視顯示三層之間彼此降低耦合,把關聯度降到最低,不至於牽一髮而動全身。

這種考慮是反對將狀態根寫入區塊頭的主要論點。一旦狀態在一個區塊中完成,它將始終是該區塊的一部分。如果協議的更新修復了過去發生的bug,則更新和重播的鏈節點將可能不匹配過去區塊頭中記錄的狀態。

對單一全球狀態的共識是Neo保持可靠性和適用性兩種特性的重要一步。

免責聲明:

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

推荐阅读

;