Skip to main content

ckb-std type-id

Type ID describes a way of using a special type script which can create a singleton type - there's only one live cell of this type. With Type ID nobody could create another code cell with the same type script hash, which makes it a useful companion to Type hash type.

By CKB RFC

The above RFC introduces the concept of Type ID. The ckb-std library provides a utility function, type_id::check_type_id, to validate whether a script conforms to the Type ID rules.

type_id::check_type_id

Validates that the script follows the Type ID rule.

(It requires "type-id" feature in ckb-std enabled.)

Syntax

pub fn check_type_id(offset: usize) -> Result<(), SysError>

Parameters

offset: The byte offset in the script's args where the Type ID starts.

Return

If the function succeeds, return ().

If the function fails, return SysError.

Remarks

The function classifies the validation logic based on the usage scenario of the Type ID:

  • Minting: GroupInput is empty, and GroupOutput only one cell.
  • Transfer: Both GroupInput and GroupOutput only one cell.
  • Burning: GroupInput only one cell, and GroupOutput is empty.

If there are multiple cells in either GroupInput or GroupOutput, the function returns SysError::TypeIDError.

For Transfer and Burning cases, the function immediately returns Ok(()).

In the Minting case, the following data is used to compute the Type ID (i.e., the hash):

  • The first CellInput of the transaction (retrieved via load_input(0, Source::Input)?);
  • The index of the current cell.

Since all input cells in the transaction are consumed and the index ensures that no other cell in the same transaction can compute the same hash, uniqueness of the Type ID is guaranteed.

Example

The rust-script-example project includes a contract named type-id demonstrating the use of Type ID.

  • The contract calls check_type_id(32), indicating that the Type ID starts at byte 33 (i.e., bytes 33–64) in the script's args.
  • The test case test_type_id_minting creates two transactions containing Type IDs to demonstrate the behavior of the contract.