Manage cross-chain assets
In the FT4 library, cross-chain assets are assets that originate on one blockchain but can be registered, tracked, and transferred across other chains in the ecosystem.
Cross-chain Asset Registration
Cross-chain assets must be registered on a receiving chain to be used there. The register_crosschain_asset
function handles this registration, ensuring that assets from other blockchains are properly linked to their origin and
available on the new chain. This function is marked as Unsafe
because it could potentially register numerous assets
and thus impact storage requirements.
Registration Requirements and Parameters
When registering a cross-chain asset, certain criteria must be met to ensure the asset's uniqueness and proper linkage to its origin chain. Below are the key parameters required for registration:
asset_id
: A unique identifier for the asset.name
: The name of the asset, which should be concise and unique within the network to prevent conflicts.symbol
: A short identifier, like a ticker, to represent the asset.decimals
: Specifies the precision (number of decimal places) of the asset, within an acceptable range (0–78).issuing_blockchain_rid
: The blockchain where the asset was initially created.origin_blockchain_rid
: The origin chain providing the asset to the current chain, often the same as the issuing chain but can differ in complex scenarios.icon_url
: Optional URL for the asset’s icon.type
: Specifies the asset type, typically set tocore.asset.ASSET_TYPE_FT4
.uniqueness_resolver
: An optional byte array used to avoid conflicts in cases where uniqueness cannot be guaranteed by other parameters alone.
Note: The register_crosschain_asset
function includes several validations, such as checking ID length, type
conformity, and icon URL validity.
Validation Constraints
This function has built-in checks to prevent registration errors or misuse:
- Origin and Issuing Chain Constraints:
- The
origin_blockchain_rid
must not be the current chain, ensuring the asset is from an external source. - Similarly, the
issuing_blockchain_rid
cannot be the current chain, as an asset issued locally does not qualify as a cross-chain asset.
- The
- Asset ID Validation:
- Validates asset ID length (32 bytes) and ensures the name, symbol, and uniqueness resolver fall within specified length limits.
Avoiding name conflicts
To avoid conflicts in asset names and symbols across multiple chains, Chromia enforces several rules:
- Uniqueness of
name
andsymbol
: These identifiers must be unique within the blockchain network. This uniqueness prevents ambiguity when the same asset name or symbol exists across multiple chains. uniqueness_resolver
: In situations where name conflicts are still possible (for example, in multi-chain scenarios with similar assets), theuniqueness_resolver
can be used to enforce distinctness. This byte array acts as an extra layer to ensure that even assets with the same name or symbol have a unique identifier.
Structure of Cross-chain Asset Management
Chromia’s cross-chain asset management relies on two core structures: the asset_origin
entity and blockchain
accounts for tracking cross-chain balances.
asset_origin
Entity
The asset_origin
entity links each cross-chain asset to its originating blockchain, enabling proper routing and
tracking when assets are transferred across chains.
assets.asset
: The cross-chain asset being registered.origin_blockchain_rid
: The identifier for the originating blockchain, establishing the origin chain that supplies this asset to the current chain.
Blockchain Accounts
Blockchain accounts in Chromia serve as balance trackers for cross-chain transfers. Each downstream chain maintains a blockchain account to track incoming and outgoing balances for tokens from upstream chains.
Key Characteristics of Blockchain Accounts
- Balance Management: When tokens are transferred to or from downstream chains, the blockchain account's balance is adjusted accordingly.
- Account Type: Each blockchain account is set to a specific account type,
ACCOUNT_TYPE_BLOCKCHAIN
, which designates it as a blockchain account rather than a user or business account.
The function ensure_blockchain_account
ensures that a blockchain account exists for each downstream chain,
creating it as necessary and assigning it the correct type.
Example of Cross-chain Asset Registration
When registering an asset from an external chain, the registration function call might look like the following:
register_crosschain_asset(
asset_id = "unique-asset-id",
name = "CrossChainToken",
symbol = "CCT",
decimals = 18,
issuing_blockchain_rid = "upstream-chain-rid",
icon_url = "https://example.com/icon.png",
type = "ft4",
uniqueness_resolver = "resolver-bytes",
origin_blockchain_rid = "parent-chain-rid"
)
In this example:
- The function verifies the uniqueness and validity of the asset parameters.
- Checks are made to ensure the asset comes from an external source (
origin_blockchain_rid
). - A new
asset_origin
entity is created, linkingCrossChainToken
to its origin chain,parent-chain-rid
.