1. 程式人生 > >Nervos CKB 指令碼程式設計簡介[1]:驗證模型

Nervos CKB 指令碼程式設計簡介[1]:驗證模型

CKB 指令碼程式設計簡介[1]: 驗證模型

本文作者:Xuejie 原文連結:Introduction to CKB Script Programming 1: Validation Model 本文譯者:Jason,Orange 譯文連結:https://talk.nervos.org/t/ckb-1/3462

截至目前,CKB 中的 Cell 驗證模型或多或少已經趨於穩定,因此我將在這裡開始寫一系列文章來介紹 CKB 指令碼程式設計。我的目標是補充在閱讀白皮書後編寫 CKB 指令碼所需的所有缺失的細節實現,這樣您就可以開始探索 CKB 呈現的這個美麗的仙境。

您可能會注意到我將在CKB上執行的程式碼稱為指令碼

,而不是智慧合約。這是因為智慧合約對我來說是一個令人困惑的術語,我在這裡想用另一個詞來表示 CKB 獨特的可程式設計性。CKB 中的指令碼不一定只是我們在指令碼語言中看到的指令碼,例如 Ruby,JS,它實際上是指在 CKB VM 上執行的 RISC-V 格式二進位制檔案。

這第一篇文章將專門介紹 CKB v0.14.0 中引入的全新驗證模型。這可能聽起來很無聊,但我保證這是最後一篇沒有實際例子的帖子 :P

請注意,儘管我認為 CKB 的程式設計模型現在非常穩定,但目前仍然在進行開發,因此可能會有變化。我會盡力確保這篇文章更新,但如果有什麼讓你感到困惑的話,這篇文章現在正在描述 CKB 的這次提交

概述

下面一張圖片說明了 CKB 的真實交易過程:

file

這張圖中有很多內容,我們將在稍後的文章中再次回到此圖。今天,我們將只關注 Cell 資料結構中的 2 個實體:locktype

pub struct CellOutput {
    pub capacity: Capacity,
    pub data: Bytes,
    pub lock: Script,
    #[serde(rename = "type")]
    pub type_: Option<Script>,
}

從資料結構中我們可以看到 locktype 共享相同的結構,稍後我們可以證明它們也是在同一個環境中執行的,它們之間的差異只是在幾個小細節中:

  • lock 是必選項, while type 是可選項
  • 通常,他們用於不同的例項

我們首先從 type 指令碼開始。

type 指令碼

請注意,注意這裡的名字只是一個幸運的意外,它與心愛的程式語言無關.

如果你考慮一下,CKB(或大多數基於 UTXO 的區塊鏈)上的交易只會將一組 Cell(或 UTXO )轉換為另一組 Cell。有趣的是,這裡的實際轉換過程。這就是我們開始設計CKB驗證模型的地方:我們如何構建模型以更好地驗證 Cell 轉換?

這就是 type 指令碼的用武之地:type 指令碼用於驗證 Cell 轉換階段的某些規則。這裡的一些例子包括:

  • 驗證 UDT(使用者定義的Token)餘額以確保不會無效地發出新 Token。

  • 確保每一個可能發生變化的 Cell 都擁有一個獨一無二的名字,注意一下,這是非常有趣的,未來的文章很多都將和這一點息息相關,敬請期待。

  • 實現經濟結構。事實上,NervosDAO 完全是作為一個 type 指令碼實現的,而不需要共識層的支援。

  • 比特幣的虛擬機器可以編譯成基於 RISC-V 二進位制檔案,這意味可以將 CKB 轉換成另一種實現形式的比特幣。

  • 請記住,除了資料之外,Cell 還可以用來儲存程式碼,因此 type 指令碼也可以用來對 Cell 中的程式碼進行測試,確保程式碼正確。

簡而言之,type 指令碼可以用來儲存 Cell 轉換中所需要的任何驗證邏輯,結合 CKB 虛擬機器的靈活性,我相信它將提供無限的開發潛能。

lock 指令碼

type 指令碼用來儲存 Cell 的邏輯轉換,但是還缺少一件事情:如何保護自己的 Cell 不受其他人的攻擊呢?換句話說,在這個瞬息萬變的世界裡,我如何才能確保我的 token 永遠屬於我呢?

這就是為什麼我們需要設計 lock 指令碼。只有當 lock 指令碼能夠成功執行時,才可以使用該 Cell。這與 type 指令碼不同,type 指令碼可能完全是可選的。而 lock 指令碼總是需要用來保護 Cell 的安全性的。

通常,你會期望一個 lock 指令碼包含一個簽名驗證,就像所有其他區塊鏈所做的那樣,當然 CKB 還將提供一些全新的解鎖用例:

  • 實際的簽名演算法完全由 lock 指令碼來決定,而您可以自由使用任何 lock 指令碼。這意味著您可以自由地選擇任何您需要的適合的簽名演算法。在官方發行的 CKB 版本中,我們將 secp256k1 作為預設的 lock 指令碼。如果您想使用這個,並且有人用 schnorr 簽名實現了一個 lock 指令碼,那麼我們非常歡迎您使用這個指令碼。

  • 除了簽名驗證之外,lock 指令碼還可以包含其他用於解鎖 Cell 的規則。比如,如果一筆交易包含了一個使用了我的 lock 指令碼的 output cell,但是它的容量大於我可以使用的 Cell,那麼我可以通過配置我的 lock 指令碼來進行容量傳遞。這樣的話,當有人向我傳送容量時,他們可以使用我現有的 Cell 為我建立一個新的 Cell。他們不需要像比特幣那樣為我再重新建立一個新的 Cell。

在我看來,CKB 最好的部分就是,社群建立的 lock 指令碼與官方預設指令碼的處理方式完全相同。官方指令碼沒有任何特權。與其他一些區塊鏈專案不同,CKB 為整個社群提供了開發 CKB 指令碼的完全自由。

執行模型

現在讓我們看看是什麼時候執行 locktype 指令碼的。

回到例子

這是我們之前看到的交易:

file

在圖中,執行流程如下:

  1. Lock Script 1 執行一次。
  2. Lock Script 2 執行一次。
  3. Type Script 1 執行一次。
  4. Type Script 2 執行一次。

在後面的文章中,我們可以看到 lock 和 type 指令碼都在相同的環境中執行,並且都可以訪問整個交易。如果任何一個指令碼失敗,整個交易就會失敗。只有當所有指令碼都成功時,交易才被認為是有效的。

有幾點值得一提:

  • 儘管有 2 個帶有 Lock Script 1 的 input cell,但它只執行一次,由實際的 lock 指令碼來定位具有相同 lock 指令碼的所有 input cell,並驗證兩個簽名。

  • 在這個交易中只執行 input cell 中的 lock 指令碼,例如:這裡不執行 Lock Script 3

  • 即使 input cell 和 output cell 都包含 Type Script 1,也只執行一次。

  • 在 input 和 output cell 中都會執行 type 指令碼,其中包括 Type Script 1Type Script 2

  • 有些 cell 沒有 type 指令碼,在本例中我們只是省略了執行。

規則

現在我們總結一下規則:

  • 在 input cell 中的 lock 指令碼會被收集和解壓,每個單獨的 lock 指令碼會被執行一次,並且只執行一次。

  • input 和 output cell 中的 type 指令碼(如果存在的話)會被收集在一起並解碼,每個單獨的 type 指令碼都會被執行一次,並且只執行一次。

  • 任何指令碼失敗,則整個交易驗證失敗。

下期預告

現在已經介紹了 cell 模型,我們將在下一篇文章中研究如何實際編寫 CKB VM 指令碼。將驗證預設的 secp256k1 lock 指令碼,來演示 CKB VM 指令碼的使用週期。

加入 Nervos Community

Nervos Community 致力於成為最好的 Nervos 社群,我們將持續地推廣和普 及 Nervos 技術,深入挖掘 Nervos 的內在價值,開拓 Nervos 的無限可能, 為每一位想要深入瞭解 Nervos Network 的人提供一個優質的平臺。

新增微訊號:BitcoinDog 即可加入 Nervos Community,如果是程式設計師請備註,還會將您