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合约“几种关键操作”的主要内容,如果未能解决你的问题,请参考以下文章

EOS 智能合约源代码解读 总体说明

EOS 智能合约源代码解读 symbol.hpp

EOS 智能合约源代码解读 asset.hpp

EOS 智能合约源代码解读 boot合约

EOS 智能合约源代码解读 合约开发示例

EOS 智能合约源代码解读 bios合约