本文做者: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 的真實交易過程:編程
這張圖中有不少內容,咱們將在稍後的文章中再次回到此圖。今天,咱們將只關注 Cell 數據結構中的 2 個實體:lock
和 type
。安全
pub struct CellOutput { pub capacity: Capacity, pub data: Bytes, pub lock: Script, #[serde(rename = "type")] pub type_: Option<Script>, }
從數據結構中咱們能夠看到 lock
和 type
共享相同的結構,稍後咱們能夠證實它們也是在同一個環境中執行的,它們之間的差別只是在幾個小細節中:微信
lock
是必選項, while 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 虛擬機的靈活性,我相信它將提供無限的開發潛能。
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 腳本的徹底自由。
如今讓咱們看看是何時執行 lock
和 type
腳本的。
這是咱們以前看到的交易:
在圖中,執行流程以下:
Lock Script 1
執行一次。Lock Script 2
執行一次。Type Script 1
執行一次。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 1
和 Type Script 2
。
有些 cell 沒有 type
腳本,在本例中咱們只是省略了執行。
如今咱們總結一下規則:
在 input cell 中的 lock
腳本會被收集和解壓,每一個單獨的 lock
腳本會被執行一次,而且只執行一次。
input 和 output cell 中的 type
腳本(若是存在的話)會被收集在一塊兒並解碼,每一個單獨的 type 腳本都會被執行一次,而且只執行一次。
任何腳本失敗,則整個交易驗證失敗。
如今已經介紹了 cell 模型,咱們將在下一篇文章中研究如何實際編寫 CKB VM 腳本。將驗證默認的 secp256k1 lock
腳本,來演示 CKB VM 腳本的使用週期。
Nervos Community 致力於成爲最好的 Nervos 社區,咱們將持續地推廣和普 及 Nervos 技術,深刻挖掘 Nervos 的內在價值,開拓 Nervos 的無限可能, 爲每一位想要深刻了解 Nervos Network 的人提供一個優質的平臺。
添加微信號:BitcoinDog 便可加入 Nervos Community,若是是程序員請備註,還會將您拉入開發者羣。