波卡一起学

Assets Module

2019-10-16  本文已影响0人  空乱木

尝试读一读源码;做一些记录

术语

可替代资产:单位可互换的资产。 - ERC20?
不可替代资产:每个单位具有独特特征的资产。- ERC721?

目标

设计Substrate中的assets系统的目的是为了实现以下功能:

可分派功能

公共功能

“余额”——得到“资产”“id”“谁”的“余额”。
“total_supply”——获得“id”总资产。

使用

下面的例子展示了如何使用资产模块在您的运行时,通过公开的公共功能:

先决条件

导入资产模块和类型,并从资产模块特征派生运行时的配置特征。

简单的代码片段


//!
//! rust,ignore
//! use support::{decl_module, dispatch::Result};
//! use system::ensure_signed;
//!
//! pub trait Trait: assets::Trait { }
//!
//! decl_module! {
//! pub struct Module<T: Trait> for enum Call where origin: T::Origin {
//! pub fn issue_token_airdrop(origin) -> Result {
//! const ACCOUNT_ALICE: u64 = 1;
//! const ACCOUNT_BOB: u64 = 2;
//! const COUNT_AIRDROP_RECIPIENTS = 2; //代币总的发行人
//! const TOKENS_FIXED_SUPPLY: u64 = 100;
//!
//! ensure!(!COUNT_AIRDROP_RECIPIENTS.is_zero(), "Divide by zero error.");
//!
//! let sender = ensure_signed(origin)?;
//! let asset_id = Self::next_asset_id();
//!
//! <NextAssetId<T>>::mutate(|asset_id| *asset_id += 1);
//! <Balances<T>>::insert((asset_id, &ACCOUNT_ALICE), TOKENS_FIXED_SUPPLY / COUNT_AIRDROP_RECIPIENTS);
//! <Balances<T>>::insert((asset_id, &ACCOUNT_BOB), TOKENS_FIXED_SUPPLY / COUNT_AIRDROP_RECIPIENTS);
//! <TotalSupply<T>>::insert(asset_id, TOKENS_FIXED_SUPPLY);
//!
//! Self::deposit_event(RawEvent::Issued(asset_id, sender, TOKENS_FIXED_SUPPLY));
//! Ok(())
//! }
//! }
//! }


假设

下面是使用此模块时必须考虑的一些假设。如果违反其中任何一个,则此模块的行为是未定义的。

资产的总数应该小于' Trait::AssetId::max_value() ‘。

相关模块

System ../srml_system/index.html
Support ../srml_support/index.html

decl_storage! {
trait Store for Module<T: Trait> as Assets {
/// The number of units of assets held by any given account.
Balances: map (T::AssetId, T::AccountId) => T::Balance;
/// The next asset identifier up for grabs.
NextAssetId get(next_asset_id): T::AssetId;
/// The total unit supply of an asset.
TotalSupply: map T::AssetId => T::Balance;
}
}

???
decl_module!中使用了origin
impl<T: Trait> Module<T>中没有用到

上一篇下一篇

猜你喜欢

热点阅读