博客
关于我
eosio.token.cpp之减少资产
阅读量:175 次
发布时间:2019-02-28

本文共 3101 字,大约阅读时间需要 10 分钟。

// 减资产     // 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)        匿名函数类型: 向里面传一个匿名函数来告诉系统他应该怎么办。      }

 

转载地址:http://iuwj.baihongyu.com/

你可能感兴趣的文章
mt_rand
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>