EOS数字资产合约实战(二)eosio.token.cpp的减资产

eosio.token.cpp部分代码的解析(eosi.token.hpp实现)

上一节我们定义了智能合约的数据结构和公有私有方法,下面就是智能合约的是实现eosio.token.cpp。

主要是讲智能合约的减资产和加资产的两个核心方法。

#include <eosio.token/eosio.token.hpp>


//需要在这个命名空间下
namespace eosio{

      // 减资产
      //owner  资产的拥有者
      //value    资产的减少值
      //st         该资产的状态

      void  token::subbalance(account_name owner,asset value, const  currency_states& st){
               accounts from_acnts(_self, owner);  //初始化
               //accounts 是在eosio.token.hpp 中定义的 资产持有人列表类型  
               //定义了一个类型为accounts 的变量 from_acnts
              //from_acnts是一个局部变量,他是程序和数据库之间的一个桥梁(沟通的一个对象或者一个工具)。数据在数据库中。
              //这个函数执行完以后,虽然这个from_acnts变量销毁了的,但是数据库的数据还在。
              //_self  智能合约的拥有者(智能合约的名字),他拥有读写数据库的权限。
              //owner  就是数据库是存在谁名下的,就是发币的或者要减他资产的那个账户(要把资产转进转出的那个人)。
             //说明:数据是存在某人的名下的,但是某人自己不能改动存在自己名下的数据库,必须智能合约来改动这个人的名下的数据库的数据(资产)

              
             const auto& from = from_acnts;.get(value.symbol.name());
             //接下来需要在from_acnts(是程序和数据库交互的一个工具)数据库中查找某人名下的资产(account 定义资产持有人的资料)
             //说明:就是在from_acnts中去get资产value , 这个value是带数字和单位的,value.symbol就是单位(ETH,EOS等)
             //from 就是一个迭代器,如果找到了,这个from 就是一个account的实例。
            //auto 就是让系统自动定义这个from的类型。
 
            
            eosio_assert(from.balance.amount>=value.amount,"overdrawn balance");            
            //检查是不是透支了。如果余额不够,报overdrawn balance的信息。
            
            
            //下面是要判断某人是不是有权限,我们需要被减资产的人授权,这样才能把他的资产给别人。
            //调用api   has_auth(owner),这个动作(action)确认是否具有权限。

            if(has_auth(owner))
            {
                  eosio_assert(!st.can_freeze||!from.frozen,"account is frozen by issuer");
                  eosio_assert(!st.can_freeze || st.is_frozen,"all transfers are frozen by issuer");
                  //!st.can_freeze 该资产不能被冻结
                  //!from.frozen 某人的资产被冻结
                  //st.is_frozen 该资产已经被冻结了
                  //如果上述条件一项不符合就会报错信息:该资产被发行者冻结了 
                 
eosio_assert(!st.enforce_whitelist||from.whitelist," account is not white listed");    
                  //  !st.enforce_whitelist  某人有没有启用白名单
                  // from.whitelist  某人是否在白名单上  (某人(账户)有没有出现白名单里)
                  //如果上述条件一项不符合,就不能进行这笔交易, 报错信息:某人(账户)没有出现白名单里    

            }else  if(has_auth(st.issuer))    //如果这个owner没有授权,那谁可以减某人(账户)的资产呢,只有一种情况,发行者issuer 要回收这个资产并且这个资产是可回收的情况。
            {
                  //如果owner没有授权,那么我们再看看是发行者 issuer 是否授权。
                  eosio_assert(st.canrecall,"issuer may not recall  token");
                  //st.canrecall  该资产是否可以被回收,不能被回收,系统就会报错。
            } else  //以上两个条件都不满足,就不能做这个交易动作(减资产的动作) 
            {
                  eosio_assert(false, "insufficient  authority");
                  //权限不足
            }
            
            //经常上述的判断,下面才是真正的功能,减除资产
            from_acnts.modify(from, owner,[&](auto & a){
                 a.balance.amount -= value.amount;    //某人拥有的代币的数目,减去传进来要减的数目。

                 //a.balance -=value;  这样也可以,更简洁
            });
            //from_acnts是列表变量。不能用from来改,因为from是from_acnts得到的,修改没有用的,需要用接口modify 来改才行。
            //from 是需要改数据(资产持有人的信息)
            //owner  就是ram_player(owner : RAM payer) 谁负责支付这笔交易的内存(这笔交易内存是占谁的token)
            //eos 中的内存资源是由拥有代币的多少来分配的。转账的人需要拥有一定量的EOS代币才能占有系统内存资源,才能进行转账行为(保障这个动作可以实行)。
            //[&](auto & a)        匿名函数类型: 向里面传一个匿名函数来告诉系统他应该怎么办。

      }
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

akai9898

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值