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 works the same with Type Script. The difference is that, only the Lock Script from the input Cells will be exeuted in the transaction, while the Type Script from both the input Cells and output Cells will be executed in the transaction.
This difference has lead 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.