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 v0.14.0 中引入的全新驗證模型。這可能聽起來很無聊,但我保證這是最後一篇沒有實際例子的帖子 :P
請注意,儘管我認為 CKB 的程式設計模型現在非常穩定,但目前仍然在進行開發,因此可能會有變化。我會盡力確保這篇文章更新,但如果有什麼讓你感到困惑的話,這篇文章現在正在描述 CKB 的這次提交
概述
下面一張圖片說明了 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
是必選項, whiletype
是可選項- 通常,他們用於不同的例項
我們首先從 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 指令碼的完全自由。
執行模型
現在讓我們看看是什麼時候執行 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 Community 致力於成為最好的 Nervos 社群,我們將持續地推廣和普 及 Nervos 技術,深入挖掘 Nervos 的內在價值,開拓 Nervos 的無限可能, 為每一位想要深入瞭解 Nervos Network 的人提供一個優質的平臺。
新增微訊號:BitcoinDog 即可加入 Nervos Community,如果是程式設計師請備註,還會將您