Intro to Script
A Script
How a Script Works
When executing a Script, CKB takes the executables and runs them in a virtual machine environment called CKB-VM
When you submit a transaction to CKB, it executes all the Scripts from the transaction to ensure that each Script succeeds. If any Script fails, the transaction will not be included on-chain.
In this way, we can allow the Cell to carry different Scripts to perform various validations for the current transaction, similar to how smart contracts work in other blockchains.
Script Types
A Script can be one of two types:
- Lock Script - Used to control ownership and access to a Cell.
- Type Script - Used to control how a Cell is used in a transaction.
In most cases, Lock Script and Type Script function similarly. The only key difference is that, the output Cells' Lock Scripts will NOT be executed in a transaction, whereas the input Cells' Lock Scripts, the input Cells' Type Scripts, and the output Cells' Type Scripts will be executed.
This difference has led to the different usecases of Lock Script and Type Script as we have mentioned above. Lock Script is often used to control owner ship of a Cell while Type Script defines what kinds of changes of a Cell is valid for the transaction.
Script Structure
Script has the following structure:
pub struct Script {
pub code_hash: H256,
pub hash_type: ScriptHashType,
pub args: JsonBytes,
}
The code_hash
serves to identify a Script code, allowing the CKB-VM
to load the binary code of the Script correctly.
A Script also includes the args
part, which differentiates one Script from another using the same Script code. The args
can provide additional arguments for a CKB Script; for example, while multiple users might utilize the same default Lock Script code, each user can have their own public key hash stored in args
. This setup allows each user to have a unique Lock Script while sharing the same Lock Script code.
hash_type
indicates the method CKB-VM uses to locate the Script code for a Script. Possible values include type
, data
, data1
, and data2
. Each specifies a different way of referencing the required Script code.