【在 Nervos CKB 上作開發】Nervos CKB 腳本編程簡介[1]:驗證模型

CKB 腳本編程簡介[1]: 驗證模型

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

截至目前,CKB 中的 Cell 驗證模型或多或少已經趨於穩定,所以我將在這裏開始寫一系列文章來介紹 CKB 腳本編程。個人目標是補充在閱讀白皮書後編寫 CKB 腳本所需的全部缺失的細節實現,這樣您就能夠開始探索 CKB 呈現的這個美麗的仙境。程序員

您可能會注意到我將在CKB上運行的代碼稱爲腳本,而不是智能合約。這是由於智能合約對我來講是一個使人困惑的術語,我在這裏想用另外一個詞來表示 CKB 獨特的可編程性。CKB 中的腳本不必定只是咱們在腳本語言中看到的腳本,例如 Ruby,JS,它其實是指在 CKB VM 上運行的 RISC-V 格式二進制文件。github

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

請注意,儘管我認爲 CKB 的編程模型如今很是穩定,但目前仍然在進行開發,所以可能會有變化。我會盡力確保這篇文章更新,但若是有什麼讓你感到困惑的話,這篇文章如今正在描述 CKB 的此次提交typescript

概述

下面一張圖片說明了 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,若是是程序員請備註,還會將您拉入開發者羣。

相關文章
相關標籤/搜索