Skip to main content

Object Model

The basic unit of storage in Sui is the object. In contrast to many other blockchains where storage is centered around accounts containing key-value stores, Sui's storage is centered around objects addressable on-chain by unique IDs. A smart contract is an object (called a Sui Move package), and these smart contracts manipulate objects on the Sui network:

  • Sui Move Package: a set of Sui Move bytecode modules. Each module has a name that's unique within the containing package. The combination of the package's on-chain ID and the name of a module uniquely identify the module. When you publish smart contracts to Sui, a package is the unit of publishing. After you publish a package object, it is immutable and can never be changed or removed. A package object can depend on other package objects that were previously published to Sui.
  • Sui Move Object: typed data governed by a particular Sui Move module from a Sui Move package. Each object value is a struct with fields that can contain primitive types (such as integers and addresses), other objects, and non-object structs.

Object metadata

Each Sui object has the following metadata:

  • A 32-byte globally unique ID. An object ID is derived from the digest of the transaction that created the object and from a counter encoding the number of IDs generated by the transaction.
  • An 8-byte unsigned integer version that monotonically increases with every transaction that modifies it (see Object and Package Versioning).
  • A 32-byte transaction digest indicating the last transaction that included this object as an output.
  • A 32-byte owner field that indicates how this object can be accessed. See Object Ownership for more information.

In addition to common metadata, objects have a category-specific, variable-sized contents field containing a Binary Canonical Serialization (BCS)-encoded payload.

  • Move Objects contain their Move type, whether the object can be transferred using public_transfer, and its fields, again encoded as BCS.
  • Move Packages contain the bytecode modules in the package, a table identifying which versions of a package introduced each of its types (the type origin table), and a table mapping each of its transitive dependencies to a specific version of that package to use (the linkage table).

Referring to objects

There are a few different ways to concisely refer to an object without specifying its entire contents and metadata, each with slightly different use cases:

  • ID: the globally unique ID of the object mentioned above. ID is a stable identifier for the object across time and is useful for querying the current state of an object or describing which object was transferred between two addresses.
  • Versioned ID: an (ID, version) pair. Versioned ID describes the state of the object at a particular point in the object's history and is useful for asking what the value of the object was at some point in the past or determining how fresh some view of an object is now.
  • Object Reference: an (ID, version, object digest) triple. The object digest is the hash of the object's contents and metadata. An object reference provides an authenticated view of the object at a particular point in the object's history. Transactions require object inputs to be specified via object references to ensure the transaction's sender and a validator processing the transaction agree on the contents and metadata of the object.

The transaction-object DAG: Relating objects and transactions

Transactions take objects as input, read/write/mutate these inputs, and produce mutated or freshly created objects as output. Each object knows the (hash of the) last transaction that produced it as an output. Thus, a natural way to represent the relationship between objects and transactions is a directed acyclic graph (DAG) where:

  • Nodes are transactions.
  • Directed edges go from transaction A to transaction B if an output object of A is an input object of B. They are labeled by the reference of the object in question (which specifies the exact version of the object created by A and used by B).

The root of this DAG is a genesis transaction that takes no inputs and produces the objects that exist in the system's initial state. The DAG can be extended by identifying mutable transaction outputs that have not yet been consumed by any committed transaction and sending a new transaction that takes these outputs (and optionally, immutable transaction outputs) as inputs.

The set of objects that are available to be taken as input by a transaction are the live objects, and the global state maintained by Sui consists of the totality of such objects. The live objects for a particular Sui address A are all objects owned by A, along with all shared and immutable objects in the system.

When this DAG contains all committed transactions in the system, it forms a complete (and cryptographically auditable) view of the system's state and history. In addition, you can use the scheme above to construct a DAG of the relevant history for a subset of transactions or objects (for example, the objects owned by a single address).

Limits on transactions, objects, and data

Sui has some limits on transactions and data used in transactions, such as a maximum size and number of objects used. For more information on limits, see Building against Limits in The Move Book.

The ProtocolConfig struct in the sui-protocol-config crate itemizes these limits. Expand the following code to see the ProtocolConfig struct and the comments that explain each parameter.

Click to open

lib.rs

/// Constants that change the behavior of the protocol.
///
/// The value of each constant here must be fixed for a given protocol version. To change the value
/// of a constant, advance the protocol version, and add support for it in `get_for_version` under
/// the new version number.
/// (below).
///
/// To add a new field to this struct, use the following procedure:
/// - Advance the protocol version.
/// - Add the field as a private `Option<T>` to the struct.
/// - Initialize the field to `None` in prior protocol versions.
/// - Initialize the field to `Some(val)` for your new protocol version.
/// - Add a public getter that simply unwraps the field.
/// - Two public getters of the form `field(&self) -> field_type`
/// and `field_as_option(&self) -> Option<field_type>` will be automatically generated for you.
/// Example for a field: `new_constant: Option<u64>`
/// ```rust,ignore
/// pub fn new_constant(&self) -> u64 {
/// self.new_constant.expect(Self::CONSTANT_ERR_MSG)
/// }
/// pub fn new_constant_as_option(&self) -> Option<u64> {
/// self.new_constant.expect(Self::CONSTANT_ERR_MSG)
/// }
/// ```
/// With `pub fn new_constant(&self) -> u64`, if the constant is accessed in a protocol version
/// in which it is not defined, the validator will crash. (Crashing is necessary because
/// this type of error would almost always result in forking if not prevented here).
/// If you don't want the validator to crash, you can use the
/// `pub fn new_constant_as_option(&self) -> Option<u64>` getter, which will
/// return `None` if the field is not defined at that version.
/// - If you want a customized getter, you can add a method in the impl.
#[skip_serializing_none]
#[derive(Clone, Serialize, Debug, ProtocolConfigAccessors, ProtocolConfigOverride)]
pub struct ProtocolConfig {
pub version: ProtocolVersion,

feature_flags: FeatureFlags,

// ==== Transaction input limits ====
/// Maximum serialized size of a transaction (in bytes).
max_tx_size_bytes: Option<u64>,

/// Maximum number of input objects to a transaction. Enforced by the transaction input checker
max_input_objects: Option<u64>,

/// Max size of objects a transaction can write to disk after completion. Enforce by the Sui adapter.
/// This is the sum of the serialized size of all objects written to disk.
/// The max size of individual objects on the other hand is `max_move_object_size`.
max_size_written_objects: Option<u64>,
/// Max size of objects a system transaction can write to disk after completion. Enforce by the Sui adapter.
/// Similar to `max_size_written_objects` but for system transactions.
max_size_written_objects_system_tx: Option<u64>,

/// Maximum size of serialized transaction effects.
max_serialized_tx_effects_size_bytes: Option<u64>,

/// Maximum size of serialized transaction effects for system transactions.
max_serialized_tx_effects_size_bytes_system_tx: Option<u64>,

/// Maximum number of gas payment objects for a transaction.
max_gas_payment_objects: Option<u32>,

/// Maximum number of modules in a Publish transaction.
max_modules_in_publish: Option<u32>,

/// Maximum number of transitive dependencies in a package when publishing.
max_package_dependencies: Option<u32>,

/// Maximum number of arguments in a move call or a ProgrammableTransaction's
/// TransferObjects command.
max_arguments: Option<u32>,

/// Maximum number of total type arguments, computed recursively.
max_type_arguments: Option<u32>,

/// Maximum depth of an individual type argument.
max_type_argument_depth: Option<u32>,

/// Maximum size of a Pure CallArg.
max_pure_argument_size: Option<u32>,

/// Maximum number of Commands in a ProgrammableTransaction.
max_programmable_tx_commands: Option<u32>,

// ==== Move VM, Move bytecode verifier, and execution limits ===
/// Maximum Move bytecode version the VM understands. All older versions are accepted.
move_binary_format_version: Option<u32>,
min_move_binary_format_version: Option<u32>,

/// Configuration controlling binary tables size.
binary_module_handles: Option<u16>,
binary_struct_handles: Option<u16>,
binary_function_handles: Option<u16>,
binary_function_instantiations: Option<u16>,
binary_signatures: Option<u16>,
binary_constant_pool: Option<u16>,
binary_identifiers: Option<u16>,
binary_address_identifiers: Option<u16>,
binary_struct_defs: Option<u16>,
binary_struct_def_instantiations: Option<u16>,
binary_function_defs: Option<u16>,
binary_field_handles: Option<u16>,
binary_field_instantiations: Option<u16>,
binary_friend_decls: Option<u16>,
binary_enum_defs: Option<u16>,
binary_enum_def_instantiations: Option<u16>,
binary_variant_handles: Option<u16>,
binary_variant_instantiation_handles: Option<u16>,

/// Maximum size of the `contents` part of an object, in bytes. Enforced by the Sui adapter when effects are produced.
max_move_object_size: Option<u64>,

// TODO: Option<increase to 500 KB. currently, publishing a package > 500 KB exceeds the max computation gas cost
/// Maximum size of a Move package object, in bytes. Enforced by the Sui adapter at the end of a publish transaction.
max_move_package_size: Option<u64>,

/// Max number of publish or upgrade commands allowed in a programmable transaction block.
max_publish_or_upgrade_per_ptb: Option<u64>,

/// Maximum gas budget in MIST that a transaction can use.
max_tx_gas: Option<u64>,

/// Maximum amount of the proposed gas price in MIST (defined in the transaction).
max_gas_price: Option<u64>,

/// The max computation bucket for gas. This is the max that can be charged for computation.
max_gas_computation_bucket: Option<u64>,

// Define the value used to round up computation gas charges
gas_rounding_step: Option<u64>,

/// Maximum number of nested loops. Enforced by the Move bytecode verifier.
max_loop_depth: Option<u64>,

/// Maximum number of type arguments that can be bound to generic type parameters. Enforced by the Move bytecode verifier.
max_generic_instantiation_length: Option<u64>,

/// Maximum number of parameters that a Move function can have. Enforced by the Move bytecode verifier.
max_function_parameters: Option<u64>,

/// Maximum number of basic blocks that a Move function can have. Enforced by the Move bytecode verifier.
max_basic_blocks: Option<u64>,

/// Maximum stack size value. Enforced by the Move bytecode verifier.
max_value_stack_size: Option<u64>,

/// Maximum number of "type nodes", a metric for how big a SignatureToken will be when expanded into a fully qualified type. Enforced by the Move bytecode verifier.
max_type_nodes: Option<u64>,

/// Maximum number of push instructions in one function. Enforced by the Move bytecode verifier.
max_push_size: Option<u64>,

/// Maximum number of struct definitions in a module. Enforced by the Move bytecode verifier.
max_struct_definitions: Option<u64>,

/// Maximum number of function definitions in a module. Enforced by the Move bytecode verifier.
max_function_definitions: Option<u64>,

/// Maximum number of fields allowed in a struct definition. Enforced by the Move bytecode verifier.
max_fields_in_struct: Option<u64>,

/// Maximum dependency depth. Enforced by the Move linker when loading dependent modules.
max_dependency_depth: Option<u64>,

/// Maximum number of Move events that a single transaction can emit. Enforced by the VM during execution.
max_num_event_emit: Option<u64>,

/// Maximum number of new IDs that a single transaction can create. Enforced by the VM during execution.
max_num_new_move_object_ids: Option<u64>,

/// Maximum number of new IDs that a single system transaction can create. Enforced by the VM during execution.
max_num_new_move_object_ids_system_tx: Option<u64>,

/// Maximum number of IDs that a single transaction can delete. Enforced by the VM during execution.
max_num_deleted_move_object_ids: Option<u64>,

/// Maximum number of IDs that a single system transaction can delete. Enforced by the VM during execution.
max_num_deleted_move_object_ids_system_tx: Option<u64>,

/// Maximum number of IDs that a single transaction can transfer. Enforced by the VM during execution.
max_num_transferred_move_object_ids: Option<u64>,

/// Maximum number of IDs that a single system transaction can transfer. Enforced by the VM during execution.
max_num_transferred_move_object_ids_system_tx: Option<u64>,

/// Maximum size of a Move user event. Enforced by the VM during execution.
max_event_emit_size: Option<u64>,

/// Maximum size of a Move user event. Enforced by the VM during execution.
max_event_emit_size_total: Option<u64>,

/// Maximum length of a vector in Move. Enforced by the VM during execution, and for constants, by the verifier.
max_move_vector_len: Option<u64>,

/// Maximum length of an `Identifier` in Move. Enforced by the bytecode verifier at signing.
max_move_identifier_len: Option<u64>,

/// Maximum depth of a Move value within the VM.
max_move_value_depth: Option<u64>,

/// Maximum number of variants in an enum. Enforced by the bytecode verifier at signing.
max_move_enum_variants: Option<u64>,

/// Maximum number of back edges in Move function. Enforced by the bytecode verifier at signing.
max_back_edges_per_function: Option<u64>,

/// Maximum number of back edges in Move module. Enforced by the bytecode verifier at signing.
max_back_edges_per_module: Option<u64>,

/// Maximum number of meter `ticks` spent verifying a Move function. Enforced by the bytecode verifier at signing.
max_verifier_meter_ticks_per_function: Option<u64>,

/// Maximum number of meter `ticks` spent verifying a Move module. Enforced by the bytecode verifier at signing.
max_meter_ticks_per_module: Option<u64>,

/// Maximum number of meter `ticks` spent verifying a Move package. Enforced by the bytecode verifier at signing.
max_meter_ticks_per_package: Option<u64>,

// === Object runtime internal operation limits ====
// These affect dynamic fields
/// Maximum number of cached objects in the object runtime ObjectStore. Enforced by object runtime during execution
object_runtime_max_num_cached_objects: Option<u64>,

/// Maximum number of cached objects in the object runtime ObjectStore in system transaction. Enforced by object runtime during execution
object_runtime_max_num_cached_objects_system_tx: Option<u64>,

/// Maximum number of stored objects accessed by object runtime ObjectStore. Enforced by object runtime during execution
object_runtime_max_num_store_entries: Option<u64>,

/// Maximum number of stored objects accessed by object runtime ObjectStore in system transaction. Enforced by object runtime during execution
object_runtime_max_num_store_entries_system_tx: Option<u64>,

// === Execution gas costs ====
/// Base cost for any Sui transaction
base_tx_cost_fixed: Option<u64>,

/// Additional cost for a transaction that publishes a package
/// i.e., the base cost of such a transaction is base_tx_cost_fixed + package_publish_cost_fixed
package_publish_cost_fixed: Option<u64>,

/// Cost per byte of a Move call transaction
/// i.e., the cost of such a transaction is base_cost + (base_tx_cost_per_byte * size)
base_tx_cost_per_byte: Option<u64>,

/// Cost per byte for a transaction that publishes a package
package_publish_cost_per_byte: Option<u64>,

// Per-byte cost of reading an object during transaction execution
obj_access_cost_read_per_byte: Option<u64>,

// Per-byte cost of writing an object during transaction execution
obj_access_cost_mutate_per_byte: Option<u64>,

// Per-byte cost of deleting an object during transaction execution
obj_access_cost_delete_per_byte: Option<u64>,

/// Per-byte cost charged for each input object to a transaction.
/// Meant to approximate the cost of checking locks for each object
// TODO: Option<I'm not sure that this cost makes sense. Checking locks is "free"
// in the sense that an invalid tx that can never be committed/pay gas can
// force validators to check an arbitrary number of locks. If those checks are
// "free" for invalid transactions, why charge for them in valid transactions
// TODO: Option<if we keep this, I think we probably want it to be a fixed cost rather
// than a per-byte cost. checking an object lock should not require loading an
// entire object, just consulting an ID -> tx digest map
obj_access_cost_verify_per_byte: Option<u64>,

// Maximal nodes which are allowed when converting to a type layout.
max_type_to_layout_nodes: Option<u64>,

/// === Gas version. gas model ===

/// Gas model version, what code we are using to charge gas
gas_model_version: Option<u64>,

/// === Storage gas costs ===

/// Per-byte cost of storing an object in the Sui global object store. Some of this cost may be refundable if the object is later freed
obj_data_cost_refundable: Option<u64>,

// Per-byte cost of storing an object in the Sui transaction log (e.g., in CertifiedTransactionEffects)
// This depends on the size of various fields including the effects
// TODO: Option<I don't fully understand this^ and more details would be useful
obj_metadata_cost_non_refundable: Option<u64>,

/// === Tokenomics ===

// TODO: Option<this should be changed to u64.
/// Sender of a txn that touches an object will get this percent of the storage rebate back.
/// In basis point.
storage_rebate_rate: Option<u64>,

/// 5% of the storage fund's share of rewards are reinvested into the storage fund.
/// In basis point.
storage_fund_reinvest_rate: Option<u64>,

/// The share of rewards that will be slashed and redistributed is 50%.
/// In basis point.
reward_slashing_rate: Option<u64>,

/// Unit gas price, Mist per internal gas unit.
storage_gas_price: Option<u64>,

/// === Core Protocol ===

/// Max number of transactions per checkpoint.
/// Note that this is a protocol constant and not a config as validators must have this set to
/// the same value, otherwise they *will* fork.
max_transactions_per_checkpoint: Option<u64>,

/// Max size of a checkpoint in bytes.
/// Note that this is a protocol constant and not a config as validators must have this set to
/// the same value, otherwise they *will* fork.
max_checkpoint_size_bytes: Option<u64>,

/// A protocol upgrade always requires 2f+1 stake to agree. We support a buffer of additional
/// stake (as a fraction of f, expressed in basis points) that is required before an upgrade
/// can happen automatically. 10000bps would indicate that complete unanimity is required (all
/// 3f+1 must vote), while 0bps would indicate that 2f+1 is sufficient.
buffer_stake_for_protocol_upgrade_bps: Option<u64>,

// === Native Function Costs ===

// `address` module
// Cost params for the Move native function `address::from_bytes(bytes: vector<u8>)`
address_from_bytes_cost_base: Option<u64>,
// Cost params for the Move native function `address::to_u256(address): u256`
address_to_u256_cost_base: Option<u64>,
// Cost params for the Move native function `address::from_u256(u256): address`
address_from_u256_cost_base: Option<u64>,

// `config` module
// Cost params for the Move native function `read_setting_impl<Name: copy + drop + store,
// SettingValue: key + store, SettingDataValue: store, Value: copy + drop + store,
// >(config: address, name: address, current_epoch: u64): Option<Value>`
config_read_setting_impl_cost_base: Option<u64>,
config_read_setting_impl_cost_per_byte: Option<u64>,

// `dynamic_field` module
// Cost params for the Move native function `hash_type_and_key<K: copy + drop + store>(parent: address, k: K): address`
dynamic_field_hash_type_and_key_cost_base: Option<u64>,
dynamic_field_hash_type_and_key_type_cost_per_byte: Option<u64>,
dynamic_field_hash_type_and_key_value_cost_per_byte: Option<u64>,
dynamic_field_hash_type_and_key_type_tag_cost_per_byte: Option<u64>,
// Cost params for the Move native function `add_child_object<Child: key>(parent: address, child: Child)`
dynamic_field_add_child_object_cost_base: Option<u64>,
dynamic_field_add_child_object_type_cost_per_byte: Option<u64>,
dynamic_field_add_child_object_value_cost_per_byte: Option<u64>,
dynamic_field_add_child_object_struct_tag_cost_per_byte: Option<u64>,
// Cost params for the Move native function `borrow_child_object_mut<Child: key>(parent: &mut UID, id: address): &mut Child`
dynamic_field_borrow_child_object_cost_base: Option<u64>,
dynamic_field_borrow_child_object_child_ref_cost_per_byte: Option<u64>,
dynamic_field_borrow_child_object_type_cost_per_byte: Option<u64>,
// Cost params for the Move native function `remove_child_object<Child: key>(parent: address, id: address): Child`
dynamic_field_remove_child_object_cost_base: Option<u64>,
dynamic_field_remove_child_object_child_cost_per_byte: Option<u64>,
dynamic_field_remove_child_object_type_cost_per_byte: Option<u64>,
// Cost params for the Move native function `has_child_object(parent: address, id: address): bool`
dynamic_field_has_child_object_cost_base: Option<u64>,
// Cost params for the Move native function `has_child_object_with_ty<Child: key>(parent: address, id: address): bool`
dynamic_field_has_child_object_with_ty_cost_base: Option<u64>,
dynamic_field_has_child_object_with_ty_type_cost_per_byte: Option<u64>,
dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: Option<u64>,

// `event` module
// Cost params for the Move native function `event::emit<T: copy + drop>(event: T)`
event_emit_cost_base: Option<u64>,
event_emit_value_size_derivation_cost_per_byte: Option<u64>,
event_emit_tag_size_derivation_cost_per_byte: Option<u64>,
event_emit_output_cost_per_byte: Option<u64>,

// `object` module
// Cost params for the Move native function `borrow_uid<T: key>(obj: &T): &UID`
object_borrow_uid_cost_base: Option<u64>,
// Cost params for the Move native function `delete_impl(id: address)`
object_delete_impl_cost_base: Option<u64>,
// Cost params for the Move native function `record_new_uid(id: address)`
object_record_new_uid_cost_base: Option<u64>,

// Transfer
// Cost params for the Move native function `transfer_impl<T: key>(obj: T, recipient: address)`
transfer_transfer_internal_cost_base: Option<u64>,
// Cost params for the Move native function `freeze_object<T: key>(obj: T)`
transfer_freeze_object_cost_base: Option<u64>,
// Cost params for the Move native function `share_object<T: key>(obj: T)`
transfer_share_object_cost_base: Option<u64>,
// Cost params for the Move native function
// `receive_object<T: key>(p: &mut UID, recv: Receiving<T>T)`
transfer_receive_object_cost_base: Option<u64>,

// TxContext
// Cost params for the Move native function `transfer_impl<T: key>(obj: T, recipient: address)`
tx_context_derive_id_cost_base: Option<u64>,

// Types
// Cost params for the Move native function `is_one_time_witness<T: drop>(_: &T): bool`
types_is_one_time_witness_cost_base: Option<u64>,
types_is_one_time_witness_type_tag_cost_per_byte: Option<u64>,
types_is_one_time_witness_type_cost_per_byte: Option<u64>,

// Validator
// Cost params for the Move native function `validate_metadata_bcs(metadata: vector<u8>)`
validator_validate_metadata_cost_base: Option<u64>,
validator_validate_metadata_data_cost_per_byte: Option<u64>,

// Crypto natives
crypto_invalid_arguments_cost: Option<u64>,
// bls12381::bls12381_min_sig_verify
bls12381_bls12381_min_sig_verify_cost_base: Option<u64>,
bls12381_bls12381_min_sig_verify_msg_cost_per_byte: Option<u64>,
bls12381_bls12381_min_sig_verify_msg_cost_per_block: Option<u64>,

// bls12381::bls12381_min_pk_verify
bls12381_bls12381_min_pk_verify_cost_base: Option<u64>,
bls12381_bls12381_min_pk_verify_msg_cost_per_byte: Option<u64>,
bls12381_bls12381_min_pk_verify_msg_cost_per_block: Option<u64>,

// ecdsa_k1::ecrecover
ecdsa_k1_ecrecover_keccak256_cost_base: Option<u64>,
ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: Option<u64>,
ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: Option<u64>,
ecdsa_k1_ecrecover_sha256_cost_base: Option<u64>,
ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: Option<u64>,
ecdsa_k1_ecrecover_sha256_msg_cost_per_block: Option<u64>,

// ecdsa_k1::decompress_pubkey
ecdsa_k1_decompress_pubkey_cost_base: Option<u64>,

// ecdsa_k1::secp256k1_verify
ecdsa_k1_secp256k1_verify_keccak256_cost_base: Option<u64>,
ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: Option<u64>,
ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: Option<u64>,
ecdsa_k1_secp256k1_verify_sha256_cost_base: Option<u64>,
ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: Option<u64>,
ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: Option<u64>,

// ecdsa_r1::ecrecover
ecdsa_r1_ecrecover_keccak256_cost_base: Option<u64>,
ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: Option<u64>,
ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: Option<u64>,
ecdsa_r1_ecrecover_sha256_cost_base: Option<u64>,
ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: Option<u64>,
ecdsa_r1_ecrecover_sha256_msg_cost_per_block: Option<u64>,

// ecdsa_r1::secp256k1_verify
ecdsa_r1_secp256r1_verify_keccak256_cost_base: Option<u64>,
ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: Option<u64>,
ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: Option<u64>,
ecdsa_r1_secp256r1_verify_sha256_cost_base: Option<u64>,
ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: Option<u64>,
ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: Option<u64>,

// ecvrf::verify
ecvrf_ecvrf_verify_cost_base: Option<u64>,
ecvrf_ecvrf_verify_alpha_string_cost_per_byte: Option<u64>,
ecvrf_ecvrf_verify_alpha_string_cost_per_block: Option<u64>,

// ed25519
ed25519_ed25519_verify_cost_base: Option<u64>,
ed25519_ed25519_verify_msg_cost_per_byte: Option<u64>,
ed25519_ed25519_verify_msg_cost_per_block: Option<u64>,

// groth16::prepare_verifying_key
groth16_prepare_verifying_key_bls12381_cost_base: Option<u64>,
groth16_prepare_verifying_key_bn254_cost_base: Option<u64>,

// groth16::verify_groth16_proof_internal
groth16_verify_groth16_proof_internal_bls12381_cost_base: Option<u64>,
groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: Option<u64>,
groth16_verify_groth16_proof_internal_bn254_cost_base: Option<u64>,
groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: Option<u64>,
groth16_verify_groth16_proof_internal_public_input_cost_per_byte: Option<u64>,

// hash::blake2b256
hash_blake2b256_cost_base: Option<u64>,
hash_blake2b256_data_cost_per_byte: Option<u64>,
hash_blake2b256_data_cost_per_block: Option<u64>,

// hash::keccak256
hash_keccak256_cost_base: Option<u64>,
hash_keccak256_data_cost_per_byte: Option<u64>,
hash_keccak256_data_cost_per_block: Option<u64>,

// poseidon::poseidon_bn254
poseidon_bn254_cost_base: Option<u64>,
poseidon_bn254_cost_per_block: Option<u64>,

// group_ops
group_ops_bls12381_decode_scalar_cost: Option<u64>,
group_ops_bls12381_decode_g1_cost: Option<u64>,
group_ops_bls12381_decode_g2_cost: Option<u64>,
group_ops_bls12381_decode_gt_cost: Option<u64>,
group_ops_bls12381_scalar_add_cost: Option<u64>,
group_ops_bls12381_g1_add_cost: Option<u64>,
group_ops_bls12381_g2_add_cost: Option<u64>,
group_ops_bls12381_gt_add_cost: Option<u64>,
group_ops_bls12381_scalar_sub_cost: Option<u64>,
group_ops_bls12381_g1_sub_cost: Option<u64>,
group_ops_bls12381_g2_sub_cost: Option<u64>,
group_ops_bls12381_gt_sub_cost: Option<u64>,
group_ops_bls12381_scalar_mul_cost: Option<u64>,
group_ops_bls12381_g1_mul_cost: Option<u64>,
group_ops_bls12381_g2_mul_cost: Option<u64>,
group_ops_bls12381_gt_mul_cost: Option<u64>,
group_ops_bls12381_scalar_div_cost: Option<u64>,
group_ops_bls12381_g1_div_cost: Option<u64>,
group_ops_bls12381_g2_div_cost: Option<u64>,
group_ops_bls12381_gt_div_cost: Option<u64>,
group_ops_bls12381_g1_hash_to_base_cost: Option<u64>,
group_ops_bls12381_g2_hash_to_base_cost: Option<u64>,
group_ops_bls12381_g1_hash_to_cost_per_byte: Option<u64>,
group_ops_bls12381_g2_hash_to_cost_per_byte: Option<u64>,
group_ops_bls12381_g1_msm_base_cost: Option<u64>,
group_ops_bls12381_g2_msm_base_cost: Option<u64>,
group_ops_bls12381_g1_msm_base_cost_per_input: Option<u64>,
group_ops_bls12381_g2_msm_base_cost_per_input: Option<u64>,
group_ops_bls12381_msm_max_len: Option<u32>,
group_ops_bls12381_pairing_cost: Option<u64>,

// hmac::hmac_sha3_256
hmac_hmac_sha3_256_cost_base: Option<u64>,
hmac_hmac_sha3_256_input_cost_per_byte: Option<u64>,
hmac_hmac_sha3_256_input_cost_per_block: Option<u64>,

// zklogin::check_zklogin_id
check_zklogin_id_cost_base: Option<u64>,
// zklogin::check_zklogin_issuer
check_zklogin_issuer_cost_base: Option<u64>,

vdf_verify_vdf_cost: Option<u64>,
vdf_hash_to_input_cost: Option<u64>,

// Stdlib costs
bcs_per_byte_serialized_cost: Option<u64>,
bcs_legacy_min_output_size_cost: Option<u64>,
bcs_failure_cost: Option<u64>,

hash_sha2_256_base_cost: Option<u64>,
hash_sha2_256_per_byte_cost: Option<u64>,
hash_sha2_256_legacy_min_input_len_cost: Option<u64>,
hash_sha3_256_base_cost: Option<u64>,
hash_sha3_256_per_byte_cost: Option<u64>,
hash_sha3_256_legacy_min_input_len_cost: Option<u64>,
type_name_get_base_cost: Option<u64>,
type_name_get_per_byte_cost: Option<u64>,

string_check_utf8_base_cost: Option<u64>,
string_check_utf8_per_byte_cost: Option<u64>,
string_is_char_boundary_base_cost: Option<u64>,
string_sub_string_base_cost: Option<u64>,
string_sub_string_per_byte_cost: Option<u64>,
string_index_of_base_cost: Option<u64>,
string_index_of_per_byte_pattern_cost: Option<u64>,
string_index_of_per_byte_searched_cost: Option<u64>,

vector_empty_base_cost: Option<u64>,
vector_length_base_cost: Option<u64>,
vector_push_back_base_cost: Option<u64>,
vector_push_back_legacy_per_abstract_memory_unit_cost: Option<u64>,
vector_borrow_base_cost: Option<u64>,
vector_pop_back_base_cost: Option<u64>,
vector_destroy_empty_base_cost: Option<u64>,
vector_swap_base_cost: Option<u64>,
debug_print_base_cost: Option<u64>,
debug_print_stack_trace_base_cost: Option<u64>,

// ==== Ephemeral (consensus only) params deleted ====
//
// Const params for consensus scoring decision
// The scaling factor property for the MED outlier detection
// scoring_decision_mad_divisor: Option<f64>,
// The cutoff value for the MED outlier detection
// scoring_decision_cutoff_value: Option<f64>,
/// === Execution Version ===
execution_version: Option<u64>,

// Dictates the threshold (percentage of stake) that is used to calculate the "bad" nodes to be
// swapped when creating the consensus schedule. The values should be of the range [0 - 33]. Anything
// above 33 (f) will not be allowed.
consensus_bad_nodes_stake_threshold: Option<u64>,

max_jwk_votes_per_validator_per_epoch: Option<u64>,
// The maximum age of a JWK in epochs before it is removed from the AuthenticatorState object.
// Applied at the end of an epoch as a delta from the new epoch value, so setting this to 1
// will cause the new epoch to start with JWKs from the previous epoch still valid.
max_age_of_jwk_in_epochs: Option<u64>,

/// === random beacon ===

/// Maximum allowed precision loss when reducing voting weights for the random beacon
/// protocol.
random_beacon_reduction_allowed_delta: Option<u16>,

/// Minimum number of shares below which voting weights will not be reduced for the
/// random beacon protocol.
random_beacon_reduction_lower_bound: Option<u32>,

/// Consensus Round after which DKG should be aborted and randomness disabled for
/// the epoch, if it hasn't already completed.
random_beacon_dkg_timeout_round: Option<u32>,

/// Minimum interval between consecutive rounds of generated randomness.
random_beacon_min_round_interval_ms: Option<u64>,

/// Version of the random beacon DKG protocol.
/// 0 was deprecated (and currently not supported), 1 is the default version.
random_beacon_dkg_version: Option<u64>,

/// The maximum serialised transaction size (in bytes) accepted by consensus. That should be bigger than the
/// `max_tx_size_bytes` with some additional headroom.
consensus_max_transaction_size_bytes: Option<u64>,
/// The maximum size of transactions included in a consensus block.
consensus_max_transactions_in_block_bytes: Option<u64>,
/// The maximum number of transactions included in a consensus block.
consensus_max_num_transactions_in_block: Option<u64>,

/// The max accumulated txn execution cost per object in a Narwhal commit. Transactions
/// in a checkpoint will be deferred once their touch shared objects hit this limit.
/// This config is meant to be used when consensus protocol is Narwhal, where each
/// consensus commit corresponding to 1 checkpoint (or 2 if randomness is enabled)
max_accumulated_txn_cost_per_object_in_narwhal_commit: Option<u64>,

/// The max number of consensus rounds a transaction can be deferred due to shared object congestion.
/// Transactions will be cancelled after this many rounds.
max_deferral_rounds_for_congestion_control: Option<u64>,

/// Minimum interval of commit timestamps between consecutive checkpoints.
min_checkpoint_interval_ms: Option<u64>,

/// Version number to use for version_specific_data in `CheckpointSummary`.
checkpoint_summary_version_specific_data: Option<u64>,

/// The max number of transactions that can be included in a single Soft Bundle.
max_soft_bundle_size: Option<u64>,

/// Whether to try to form bridge committee
// Note: this is not a feature flag because we want to distinguish between
// `None` and `Some(false)`, as committee was already finalized on Testnet.
bridge_should_try_to_finalize_committee: Option<bool>,

/// The max accumulated txn execution cost per object in a mysticeti. Transactions
/// in a commit will be deferred once their touch shared objects hit this limit.
/// This config plays the same role as `max_accumulated_txn_cost_per_object_in_narwhal_commit`
/// but for mysticeti commits due to that mysticeti has higher commit rate.
max_accumulated_txn_cost_per_object_in_mysticeti_commit: Option<u64>,

/// Configures the garbage collection depth for consensus. When is unset or `0` then the garbage collection
/// is disabled.
consensus_gc_depth: Option<u32>,
}

Select a network from the following tabs to see the currently configured limits and values.

ParameterTypeValue
address_from_bytes_cost_baseu6452
address_from_u256_cost_baseu6452
address_to_u256_cost_baseu6452
base_tx_cost_fixedu641000
base_tx_cost_per_byteu640
bcs_failure_costu6452
bcs_legacy_min_output_size_costu641
bcs_per_byte_serialized_costu642
binary_address_identifiersu16100
binary_constant_poolu164000
binary_enum_def_instantiationsnull
binary_enum_defsnull
binary_field_handlesu16500
binary_field_instantiationsu16250
binary_friend_declsu16100
binary_function_defsu161000
binary_function_handlesu161500
binary_function_instantiationsu16750
binary_identifiersu1610000
binary_module_handlesu16100
binary_signaturesu161000
binary_struct_def_instantiationsu16100
binary_struct_defsu16200
binary_struct_handlesu16300
binary_variant_handlesnull
binary_variant_instantiation_handlesnull
bls12381_bls12381_min_pk_verify_cost_baseu6449282
bls12381_bls12381_min_pk_verify_msg_cost_per_blocku642
bls12381_bls12381_min_pk_verify_msg_cost_per_byteu642
bls12381_bls12381_min_sig_verify_cost_baseu6444064
bls12381_bls12381_min_sig_verify_msg_cost_per_blocku642
bls12381_bls12381_min_sig_verify_msg_cost_per_byteu642
bridge_should_try_to_finalize_committeebooltrue
buffer_stake_for_protocol_upgrade_bpsu645000
check_zklogin_id_cost_baseu64200
check_zklogin_issuer_cost_baseu64200
checkpoint_summary_version_specific_datau641
config_read_setting_impl_cost_baseu64100
config_read_setting_impl_cost_per_byteu6440
consensus_bad_nodes_stake_thresholdu6420
consensus_gc_depthnull
consensus_max_num_transactions_in_blocku64512
consensus_max_transaction_size_bytesu64262144
consensus_max_transactions_in_block_bytesu64524288
consensus_voting_roundsu3240
crypto_invalid_arguments_costu64100
debug_print_base_costu6452
debug_print_stack_trace_base_costu6452
dynamic_field_add_child_object_cost_baseu64100
dynamic_field_add_child_object_struct_tag_cost_per_byteu6410
dynamic_field_add_child_object_type_cost_per_byteu6410
dynamic_field_add_child_object_value_cost_per_byteu6410
dynamic_field_borrow_child_object_child_ref_cost_per_byteu6410
dynamic_field_borrow_child_object_cost_baseu64100
dynamic_field_borrow_child_object_type_cost_per_byteu6410
dynamic_field_has_child_object_cost_baseu64100
dynamic_field_has_child_object_with_ty_cost_baseu64100
dynamic_field_has_child_object_with_ty_type_cost_per_byteu642
dynamic_field_has_child_object_with_ty_type_tag_cost_per_byteu642
dynamic_field_hash_type_and_key_cost_baseu64100
dynamic_field_hash_type_and_key_type_cost_per_byteu642
dynamic_field_hash_type_and_key_type_tag_cost_per_byteu642
dynamic_field_hash_type_and_key_value_cost_per_byteu642
dynamic_field_remove_child_object_child_cost_per_byteu642
dynamic_field_remove_child_object_cost_baseu64100
dynamic_field_remove_child_object_type_cost_per_byteu642
ecdsa_k1_decompress_pubkey_cost_baseu6452
ecdsa_k1_ecrecover_keccak256_cost_baseu64500
ecdsa_k1_ecrecover_keccak256_msg_cost_per_blocku642
ecdsa_k1_ecrecover_keccak256_msg_cost_per_byteu642
ecdsa_k1_ecrecover_sha256_cost_baseu64500
ecdsa_k1_ecrecover_sha256_msg_cost_per_blocku642
ecdsa_k1_ecrecover_sha256_msg_cost_per_byteu642
ecdsa_k1_secp256k1_verify_keccak256_cost_baseu641470
ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_blocku642
ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byteu642
ecdsa_k1_secp256k1_verify_sha256_cost_baseu641470
ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_blocku642
ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byteu642
ecdsa_r1_ecrecover_keccak256_cost_baseu641173
ecdsa_r1_ecrecover_keccak256_msg_cost_per_blocku642
ecdsa_r1_ecrecover_keccak256_msg_cost_per_byteu642
ecdsa_r1_ecrecover_sha256_cost_baseu641173
ecdsa_r1_ecrecover_sha256_msg_cost_per_blocku642
ecdsa_r1_ecrecover_sha256_msg_cost_per_byteu642
ecdsa_r1_secp256r1_verify_keccak256_cost_baseu644225
ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_blocku642
ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byteu642
ecdsa_r1_secp256r1_verify_sha256_cost_baseu644225
ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_blocku642
ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byteu642
ecvrf_ecvrf_verify_alpha_string_cost_per_blocku642
ecvrf_ecvrf_verify_alpha_string_cost_per_byteu642
ecvrf_ecvrf_verify_cost_baseu644848
ed25519_ed25519_verify_cost_baseu641802
ed25519_ed25519_verify_msg_cost_per_blocku642
ed25519_ed25519_verify_msg_cost_per_byteu642
event_emit_cost_baseu6452
event_emit_output_cost_per_byteu6410
event_emit_tag_size_derivation_cost_per_byteu645
event_emit_value_size_derivation_cost_per_byteu642
execution_versionu643
gas_budget_based_txn_cost_absolute_cap_commit_countu6450
gas_budget_based_txn_cost_cap_factoru64400000
gas_model_versionu649
gas_rounding_stepu641000
groth16_prepare_verifying_key_bls12381_cost_baseu6453838
groth16_prepare_verifying_key_bn254_cost_baseu6482010
groth16_verify_groth16_proof_internal_bls12381_cost_baseu6472090
groth16_verify_groth16_proof_internal_bls12381_cost_per_public_inputu648213
groth16_verify_groth16_proof_internal_bn254_cost_baseu64115502
groth16_verify_groth16_proof_internal_bn254_cost_per_public_inputu649484
groth16_verify_groth16_proof_internal_public_input_cost_per_byteu642
group_ops_bls12381_decode_g1_costu642848
group_ops_bls12381_decode_g2_costu643770
group_ops_bls12381_decode_gt_costu643068
group_ops_bls12381_decode_scalar_costu647
group_ops_bls12381_g1_add_costu641556
group_ops_bls12381_g1_div_costu645091
group_ops_bls12381_g1_hash_to_base_costu642962
group_ops_bls12381_g1_hash_to_cost_per_byteu642
group_ops_bls12381_g1_msm_base_costu6462648
group_ops_bls12381_g1_msm_base_cost_per_inputu641333
group_ops_bls12381_g1_mul_costu644842
group_ops_bls12381_g1_sub_costu641550
group_ops_bls12381_g1_to_uncompressed_g1_costu642099
group_ops_bls12381_g2_add_costu643048
group_ops_bls12381_g2_div_costu649206
group_ops_bls12381_g2_hash_to_base_costu648688
group_ops_bls12381_g2_hash_to_cost_per_byteu642
group_ops_bls12381_g2_msm_base_costu64131192
group_ops_bls12381_g2_msm_base_cost_per_inputu643216
group_ops_bls12381_g2_mul_costu649108
group_ops_bls12381_g2_sub_costu643019
group_ops_bls12381_gt_add_costu64188
group_ops_bls12381_gt_div_costu6427804
group_ops_bls12381_gt_mul_costu6427490
group_ops_bls12381_gt_sub_costu64497
group_ops_bls12381_msm_max_lenu3232
group_ops_bls12381_pairing_costu6426897
group_ops_bls12381_scalar_add_costu6410
group_ops_bls12381_scalar_div_costu6491
group_ops_bls12381_scalar_mul_costu6411
group_ops_bls12381_scalar_sub_costu6410
group_ops_bls12381_uncompressed_g1_sum_base_costu6477
group_ops_bls12381_uncompressed_g1_sum_cost_per_termu6426
group_ops_bls12381_uncompressed_g1_sum_max_termsu641200
group_ops_bls12381_uncompressed_g1_to_g1_costu64677
hash_blake2b256_cost_baseu6410
hash_blake2b256_data_cost_per_blocku642
hash_blake2b256_data_cost_per_byteu642
hash_keccak256_cost_baseu6410
hash_keccak256_data_cost_per_blocku642
hash_keccak256_data_cost_per_byteu642
hash_sha2_256_base_costu6452
hash_sha2_256_legacy_min_input_len_costu641
hash_sha2_256_per_byte_costu642
hash_sha3_256_base_costu6452
hash_sha3_256_legacy_min_input_len_costu641
hash_sha3_256_per_byte_costu642
hmac_hmac_sha3_256_cost_baseu6452
hmac_hmac_sha3_256_input_cost_per_blocku642
hmac_hmac_sha3_256_input_cost_per_byteu642
max_accumulated_randomness_txn_cost_per_object_in_mysticeti_commitu643700000
max_accumulated_txn_cost_per_object_in_mysticeti_commitu6418500000
max_accumulated_txn_cost_per_object_in_narwhal_commitu6440
max_age_of_jwk_in_epochsu641
max_argumentsu32512
max_back_edges_per_functionu6410000
max_back_edges_per_moduleu6410000
max_basic_blocksu641024
max_checkpoint_size_bytesu6431457280
max_deferral_rounds_for_congestion_controlu6410
max_dependency_depthu64100
max_event_emit_sizeu64256000
max_event_emit_size_totalu6465536000
max_fields_in_structu6432
max_function_definitionsu641000
max_function_parametersu64128
max_gas_computation_bucketu645000000
max_gas_payment_objectsu32256
max_gas_priceu64100000
max_generic_instantiation_lengthu6432
max_input_objectsu642048
max_jwk_votes_per_validator_per_epochu64240
max_loop_depthu645
max_meter_ticks_per_moduleu6416000000
max_meter_ticks_per_packageu6416000000
max_modules_in_publishu3264
max_move_enum_variantsnull
max_move_identifier_lenu64128
max_move_object_sizeu64256000
max_move_package_sizeu64102400
max_move_value_depthu64128
max_move_vector_lenu64262144
max_num_deleted_move_object_idsu642048
max_num_deleted_move_object_ids_system_txu6432768
max_num_event_emitu641024
max_num_new_move_object_idsu642048
max_num_new_move_object_ids_system_txu6432768
max_num_transferred_move_object_idsu642048
max_num_transferred_move_object_ids_system_txu6432768
max_package_dependenciesu3232
max_programmable_tx_commandsu321024
max_publish_or_upgrade_per_ptbu645
max_pure_argument_sizeu3216384
max_push_sizeu6410000
max_serialized_tx_effects_size_bytesu64524288
max_serialized_tx_effects_size_bytes_system_txu648388608
max_size_written_objectsu645000000
max_size_written_objects_system_txu6450000000
max_soft_bundle_sizeu645
max_struct_definitionsu64200
max_transactions_per_checkpointu6410000
max_tx_gasu6450000000000
max_tx_size_bytesu64131072
max_txn_cost_overage_per_object_in_commitu6418446744073709551615
max_type_argument_depthu3216
max_type_argumentsu3216
max_type_nodesu64256
max_type_to_layout_nodesu64512
max_value_stack_sizeu641024
max_verifier_meter_ticks_per_functionu6416000000
min_checkpoint_interval_msu64200
min_move_binary_format_versionu326
move_binary_format_versionu327
obj_access_cost_delete_per_byteu6440
obj_access_cost_mutate_per_byteu6440
obj_access_cost_read_per_byteu6415
obj_access_cost_verify_per_byteu64200
obj_data_cost_refundableu64100
obj_metadata_cost_non_refundableu6450
object_borrow_uid_cost_baseu6452
object_delete_impl_cost_baseu6452
object_record_new_uid_cost_baseu6452
object_runtime_max_num_cached_objectsu641000
object_runtime_max_num_cached_objects_system_txu6416000
object_runtime_max_num_store_entriesu641000
object_runtime_max_num_store_entries_system_txu6416000
package_publish_cost_fixedu641000
package_publish_cost_per_byteu6480
poseidon_bn254_cost_basenull
poseidon_bn254_cost_per_blocku64388
random_beacon_dkg_timeout_roundu323000
random_beacon_dkg_versionu641
random_beacon_min_round_interval_msu64500
random_beacon_reduction_allowed_deltau16800
random_beacon_reduction_lower_boundu32500
reward_slashing_rateu6410000
storage_fund_reinvest_rateu64500
storage_gas_priceu6476
storage_rebate_rateu649900
string_check_utf8_base_costu6452
string_check_utf8_per_byte_costu642
string_index_of_base_costu6452
string_index_of_per_byte_pattern_costu642
string_index_of_per_byte_searched_costu642
string_is_char_boundary_base_costu6452
string_sub_string_base_costu6452
string_sub_string_per_byte_costu642
transfer_freeze_object_cost_baseu6452
transfer_receive_object_cost_baseu6452
transfer_share_object_cost_baseu6452
transfer_transfer_internal_cost_baseu6452
tx_context_derive_id_cost_baseu6452
type_name_get_base_costu6452
type_name_get_per_byte_costu642
types_is_one_time_witness_cost_baseu6452
types_is_one_time_witness_type_cost_per_byteu642
types_is_one_time_witness_type_tag_cost_per_byteu642
validator_validate_metadata_cost_baseu6420000
validator_validate_metadata_data_cost_per_byteu642
vdf_hash_to_input_costnull
vdf_verify_vdf_costnull
vector_borrow_base_costu6452
vector_destroy_empty_base_costu6452
vector_empty_base_costu6452
vector_length_base_costu6452
vector_pop_back_base_costu6452
vector_push_back_base_costu6452
vector_push_back_legacy_per_abstract_memory_unit_costu642
vector_swap_base_costu6452