EOS 智能合约源代码解读 (10)token合约“几种关键操作”
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EOS 智能合约源代码解读 (10)token合约“几种关键操作”相关的知识,希望对你有一定的参考价值。
1. create:负责创建资产
void token::create( const text_name& issuer, const asset& maximum_supply)
{
require_auth( get_self() );
name issuer_id(get_account_id(issuer.c_str(), issuer.size()));
auto sym = maximum_supply.symbol;
check( sym.is_valid(), "invalid symbol name" );
check( maximum_supply.is_valid(), "invalid supply");
check( maximum_supply.amount > 0, "max-supply must be positive");
stats statstable( get_self(), sym.code().raw() );
auto existing = statstable.find( sym.code().raw() );
check( existing == statstable.end(), "token with symbol already exists" );
statstable.emplace( get_self(), [&]( auto& s ) {
s.supply.symbol = maximum_supply.symbol;
s.max_supply = maximum_supply;
s.issuer = issuer_id;
});
}
- 获取eosio.token合约部署账户的授权
- 判断币种符号 (sysmol name) 是否合法,币种符号必须是大写字母,长度小于8位
- 判断发行量是否越界且是否为正数,支持的最大发行量 amount <= 2^62-1
- 查询statstable表,判断代币符号是否存在,eosio.token支持发行多资产
- 建表,将代币符号、发行总量、发行方存入数据库
1.1 调用实例
cleos push action eosio.token create ‘[ “eosio”, “1000000000.0000 EOS”]’ -p eosio.token
- eosio.token合约部署在eosio.token账户
- 资产发行账户为eosio
- 最大发行量10亿
- 币种精度4
- 币种符号EOS
2. issue:负责发行资产
issue方法的实现在eosio.token.cpp中,需要传入两个参数完成币种的发行:
- to:发行金额打入的账户
- quantity:发行金额
- memo:交易备注
void token::issue(const text_name& to, const asset& quantity, const string& memo )
{
name to_id(get_account_id(to.c_str(), to.size()));
auto sym = quantity.symbol;
check( sym.is_valid(), "invalid symbol name" );
check( memo.size() <= 256, "memo has more than 256 bytes" );
stats statstable( get_self(), sym.code().raw() );
auto existing = statstable.find( sym.code().raw() );
check( existing != statstable.end(), "token with symbol does not exist, create token before issue" );
const auto& st = *existing;
check( to_id == st.issuer, "tokens can only be issued to issuer account" );
require_auth( st.issuer );
check( quantity.is_valid(), "invalid quantity" );
check( quantity.amount > 0, "must issue positive quantity" );
check( quantity.symbol == st.supply.symbol, "symbol precision mismatch" );
check( quantity.amount <= st.max_supply.amount - st.supply.amount, "quantity exceeds available supply");
statstable.modify( st, same_payer, [&]( auto& s ) {
s.supply += quantity;
});
add_balance( st.issuer, quantity, st.issuer );
}
- 前置检查:查表判断币种是否存在、memo最大长度不能超过256字节
- 查表获取币种信息:发行账户、最大发行量、币种精度、币种符号
- 获取发行账户的授权
- 前置检查:发行金额为正数且不超过最大发行量、币种精度校验
- 更新表,增加发行资产的余额
- 如果to账户和发行账户不一致,调用内联合约转账
调用实例: 资产发行账户eosio授权,将10亿EOS打入eosio账户中,备注是test issue
cleos push action eosio.token issue '[ "eosio", "1000000000.0000 EOS", "test issue"]' -p eosio
3. transfer:负责资产转账
transfer方法的实现在eosio.token.cpp中,需要传入四个参数完成币种的转账:
- from:出币账户
- to:入金账户
- quantity:转账金额
- memo:交易备注
void token::transfer( const text_name& from,
const text_name& to,
const asset& quantity,
const string& memo )
{
name from_id(get_account_id(from.c_str(), from.size()));
name to_id(get_account_id(to.c_str(), to.size()));
check( from != to, "cannot transfer to self" );
require_auth( from_id );
check( is_account( to ), "to account does not exist");
auto sym = quantity.symbol.code();
stats statstable( get_self(), sym.raw() );
const auto& st = statstable.get( sym.raw() );
require_recipient( from );
require_recipient( to );
check( quantity.is_valid(), "invalid quantity" );
check( quantity.amount > 0, "must transfer positive quantity" );
check( quantity.symbol == st.supply.symbol, "symbol precision mismatch" );
check( memo.size() <= 256, "memo has more than 256 bytes" );
auto payer = has_auth( to ) ? to_id : from_id;
sub_balance( from_id, quantity );
add_balance( to_id, quantity, payer );
}
资产的转账:
- 前置检查:判断是否转账给自己、判断to账户是否存在
- 获得from账户的授权
- 获取币种信息:发行账户、最大发行量、币种精度、币种符号
- 分别通知from、to账户合约调用结果
- 前置检查:转账金额为正且不超过最大发行量、币种精度正确、memo长度不大于256
- 加减from和to地址账户余额
以上是关于EOS 智能合约源代码解读 (10)token合约“几种关键操作”的主要内容,如果未能解决你的问题,请参考以下文章