聊聊 Nervos 的鏈下肯定性(Off-Chain Determinism)

在這裏插入圖片描述
Nervos 是個分層的多資產價值存儲公鏈,是一套與其餘公鏈徹底不一樣的首創設計。Layer 1 底層專一於安全以及系統的強健性,將使用體驗、性能等等交給 Layer 2 去處理。清晰的分工也造就了許多開發時不一樣的體驗以及權衡。在本文中,Nervos CKB 核心開發者 jjy 帶你們來看看 Nervos 底層的重要特性——鏈下肯定性,是如何讓整個系統更加安全並能夠減小資源消耗,以及其中有什麼樣的權衡。安全

如何獲取當前的區塊高度

我已經反覆的聽到開發者抱怨說爲何他們沒有辦法在他們的腳本(智能合約)中讀取當前的區塊高度這件事情了。網絡

如每位開發者所知,從智能合約讀取當前的區塊高度是個以太坊以及其餘使用 EVM 的區塊鏈上的基本功能。那若是 CKB 真如咱們所說,是下一代的區塊鏈,那爲何他沒辦法作到這件上一代公鏈就能作到的事情呢?架構

嗯,我猜應該沒啥人能夠回答這個問題,CKB 核心團隊也比較沒有常常解釋 CKB 的獨特設計,這點我以爲核心團隊應該要作的更好。函數

因此我決定要寫這篇文章來解釋這個設計的權衡之處:爲何咱們不能在智能合約(腳本)中讀取當前的區塊高度呢。性能

正確的方式

讓咱們從驗證 CKB 腳本如何讀取區塊高度的正確方式開始吧!區塊鏈

個人觀察是多數的開發者是透過請求區塊高度來計算兩個動做之間的區塊時間,抽象地用術語來講,一個用戶在區塊高度 X 時進行存款,而且在高度 Y 時取出。在取出這個動做發生以後,智能合約就須要去計算區塊 X 到區塊 Y 之間的區塊數,而且根據用戶的存款時間去發送獎勵(注:例如流動性挖礦便是如此)或者作其餘相似的事情。ui

以太坊上面能夠直接的讀取區塊高度以及計算獎勵。然而,在 CKB 中,咱們必須採用其餘方法而不是直接讀取區塊高度:spa

  1. 咱們可使用 transaction valid since 的功能來限制取款交易,以確保至少在存款完後的 Z 個區塊後,纔會發生取款交易。可是,這樣一來用戶能夠把取款的時間延長至區塊 Z 以後 ,這在某些狀況下可能不合適。

在這裏插入圖片描述

  1. 咱們能夠採起兩步取款來定位區塊高度。首先第一步是藉由 CKB syscalls 來讀取用戶存款的區塊高度 X ,而且記錄 X 這個高度在新的「準備取款 Cell」中;第二步就是咱們可使用 syscall 來讀取準備取款的 cell Y 以及從這個 cell 的 data 字段來讀取 X。

所以咱們同樣能夠計算出區塊時間是 Y-X。
(譯註:想一想 Nervos DAO 的設計就是如此)設計

鏈下肯定性

那麼這樣作的目的是什麼呢?開發者顯然更喜歡更簡單、更直觀的方法,那麼爲何 CKB 要使用如此困難的方法來完成簡單的工做?!3d

這都是由於鏈下肯定性。讓咱們先解釋兩個問題:以太坊合約的輸入是什麼?CKB 腳本的輸入是什麼?

若是咱們將合約(或腳本)視爲函數「f」,那麼咱們能夠將智能合約的計算表示爲如下形式:

在以太坊上:

output = f(tx, state tree, current blockchain)

在 CKB 上:

output = f(tx, deterministic blockchain)

在以太坊中,一個合約能夠從三個輸入中檢索信息:tx、賬戶狀態樹和當前區塊鏈狀態。

例如,智能合約能夠從區塊鏈中讀取當前區塊高度和區塊哈希。

在 CKB 中,咱們只容許腳本讀取肯定性的輸入。若是用戶想從區塊鏈讀取信息,那麼用戶首先必須在交易中包含區塊哈希。所以,腳本能夠讀取的全部信息都是肯定的。咱們稱之爲鏈下肯定性,這是CKB的一個基本特徵。

優勢

鏈下肯定性帶來了一些好處,最重要的一點是,一旦咱們驗證了一個交易,咱們就知道它會是有效的或無效的,由於輸入輸出都是肯定的,這個驗證結果不依賴於區塊鏈狀態。

這個肯定性在 CKB 中引入了一個驗證策略,就是在將交易推入內存池前咱們只驗證一次。當咱們將交易打包到一個區塊中時,咱們只須要檢查交易輸入是否仍然是未使用的,這和對交易進行完整的驗證相比成本很小。

交易的這種鏈下肯定性不只綁定到一個節點;咱們能夠保證一個交易是有效的,即便咱們經過 P2P 網絡發送它。由於若是一個交易有效,那麼它將永遠有效,因此 CKB 只廣播有效的交易到其餘節點。若是惡意節點試圖廣播無效的交易,那麼一旦沒法驗證惡意節點發送的交易,網絡中的其餘節點將當即禁止它。因爲無效的交易不能廣播到 CKB 網絡中,因此 CKB 只將有效的交易打包到區塊,我認爲這是 CKB 的一個主要優點。

注意哦,這件事在以太坊中是不可行的,由於以太坊的交易並非鏈下肯定性的,一個交易可能在區塊高度 42 上失敗,即便它在區塊高度 41 上是有效的。所以,咱們永遠不知道失敗的交易是惡意節點故意發送的,仍是由於區塊鏈當前狀態改變而失敗的。

因此以太坊選擇了另外一種方式,就是容許節點廣播無效的消息並將其打包到塊中。而後,該協議容許礦工經過向發送者的帳戶收取最高費用來對失敗的交易進行處罰。該機制旨在鼓勵用戶只發送有效的短信,以增強安全;但即便你是一個誠實的用戶,您也可能因爲意外地運行到一個無效的合約狀態而發送一個失敗的交易。( 當我試圖將錢存入 Curve 時,我在一次失敗的交易中損失了大約 50 美圓。)

在區塊中只包含有效的交易,仍是在區塊中包含失敗的交易並懲罰發送者,這兩種不一樣的設計思想來自於對一個簡單問題的不一樣回答:咱們應該容許腳本(智能合約)讀取當前區塊嗎?

Layer 1 強健性 vs 用戶體驗

根據個人理解,在 Layer 1 的強健性(魯棒性)和用戶體驗之間,CKB 的設計明顯選擇了前者。

我相信這是一個正確的選擇;Layer 1 區塊鏈惟一重要的事情是提供強健性性和安全的服務。這種權衡並不意味着 CKB 不關心用戶的體驗。記住 CKB 的口號——爲 Layer 2 建造 Layer 1。在這種狀況下,Layer 1 是爲了強健性,Layer 2 (以上)纔是爲了用戶體驗。

在分層架構中,大多數人會使用高層的技術,只有少數人須要從底層直接去訪問。例如,在互聯網中大多數用戶使用 HTTP 或 WebSocket;不多有人使用 TCP 或 UDP,幾乎沒有人直接使用 IP。
在這裏插入圖片描述
譯註:圖片爲譯者添加,便於不瞭解互聯網分層架構者參照這個互聯網的分層圖來了解做者所言。

Source:khan Academy
https://www.khanacademy.org/c...:the-internet/xcae6f4a7ff015e7d:the-internet-protocol-suite/a/the-internet-protocols

從智能合約開發者的角度來看,您可能會發現這種設計難以理解 ,可是若是你看一下分層的架構,你會發現 Nervos 的設計很是適合 Layer 1 區塊鏈。

一旦 Nervos 的 Layer 2 設施啓動,開發者將可以輕鬆訪問 Layer 2 提供的功能,不只能用Layer 2 讀取區塊高度(這很簡單),並且還可使用其餘 Layer 2 更強大的功能(這裏留給開發人員本身想象的空間)。

*原文連接:
https://talk.nervos.org/t/off...
原文做者:CKB 核心開發者 jjy
譯者:Williams*

在這裏插入圖片描述

// 若是你喜歡 Nervos 而且喜歡開發
// 你能夠關注並私信我哦~
if (you like Nervos && you like dev) {
    println("you can follow me and private letter for me~");
}
相關文章
相關標籤/搜索