EOS智能合约开发-合约调用合约

EOS中合约之间是可以相互调用的,主要通过inline action完成合约之间的调用。

譬如在掷骰子游戏中,存在两个玩家先下注资金,然后比较骰子大小后决定胜负,赢的那一方将获得所有的下注资金。在eos>contract>dice 智能合约示例中,Alice和Bob是两个玩家,他们各自将资金账户里的3个EOS作为赌注,先抵押给Dice账户,然后在游戏决出胜负后,Dice账户就自动把赌注归还给胜方。这其中就涉及到代币的转账操作,因此很自然的可以想到,在deposit(下注抵押资金)和最后的withdraw(胜方赢取资金)这两个操作中,就可以通过调用eosio.token的transfer动作来完成。

下面是deposit 和 withdraw 的函数实现。其中均对eosio.token的action—— transfer进行了调用。

      //@abi action
      void deposit( const account_name from, const asset& quantity ) {
         
         eosio_assert( quantity.is_valid(), "invalid quantity" );
         eosio_assert( quantity.amount > 0, "must deposit positive quantity" );

         auto itr = accounts.find(from);
         if( itr == accounts.end() ) {
            itr = accounts.emplace(_self, [&](auto& acnt){
               acnt.owner = from;
            });
         }
         
        //对eosio.token的transfer进行合约调用,玩家开始下注资金
         action(
            permission_level{ from, N(active) },
            N(eosio.token), N(transfer),
            std::make_tuple(from, _self, quantity, std::string(""))
         ).send();

         accounts.modify( itr, 0, [&]( auto& acnt ) {
            acnt.eos_balance += quantity;
         });
      }
      
      //@abi action
      void withdraw( const account_name to, const asset& quantity ) {
         require_auth( to );

         eosio_assert( quantity.is_valid(), "invalid quantity" );
         eosio_assert( quantity.amount > 0, "must withdraw positive quantity" );

         auto itr = accounts.find( to );
         eosio_assert(itr != accounts.end(), "unknown account");

         accounts.modify( itr, 0, [&]( auto& acnt ) {
            eosio_assert( acnt.eos_balance >= quantity, "insufficient balance" );
            acnt.eos_balance -= quantity;
         });

         //对eosio.token的transfer进行合约调用,Dice主账号对胜利一方发送资金
         action(
            permission_level{ _self, N(active) },
            N(eosio.token), N(transfer),
            std::make_tuple(_self, to, quantity, std::string(""))
         ).send();

         if( itr->is_empty() ) {
            accounts.erase(itr);
         }
      }

核心如下代码如下:代表在资金撤回操作中,通过调用eosio.token的transfer,账户(_self)对账户(to)进行转账,对应于游戏中,Dice主账户为胜利的一方发放所赢的赌注。

//action所带参数具体如下:
//action(permssion_level, other_contract_account_name, method, args).send();

action(
    permission_level{ _self, N(active) },
    N(eosio.token), N(transfer),
    std::make_tuple(_self, to, quantity, std::string(""))
 ).send();

你可能感兴趣的:(EOS智能合约开发-合约调用合约)