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

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EOS 智能合约源代码解读 asset.hpp相关的知识,希望对你有一定的参考价值。

1. 合约中关于资产的数据结构的定义

输入字符串: “10.0000 CUR”
输出:amount = 10, symbol(4,“CUR”)

/**asset includes amount and currency symbol*/
struct asset : fc::reflect_init
{ 
   // 通过给定的符号名称以及资产数量构建一个新的资产对象。
   explicit asset(share_type a = 0, symbol id = symbol(CORE_SYMBOL)) :amount(a), sym(id) {
      eosio_assert( is_amount_within_range(), asset_type_exception, "magnitude of asset amount must be less than 2^62" );
      eosio_assert( sym.valid(), asset_type_exception, "invalid symbol" );

   share_type amount;                     // 资产数量
   symbol_type symbol;                // 资产符号名称,详见以下symbol_type源码分析。
   static constexpr int64_t max_amount = (1LL << 62) - 1; //资产数量最大值,取决于int64_t类型的取值范围。
 
// 检查资产数量是否在范围以内,是否超过了最大限额。
bool is_amount_within_range() const { return -max_amount <= amount && amount <= max_amount; }

// 检查资产对象是否有效,有效资产的数量应该小于等于最大限额同时它的符号名称也是有效的。
bool is_valid() const { return is_amount_within_range() && symbol.is_valid(); }
 
 // 设置资产的数量
 void set_amount(int64_t a)   {
    amount = a;
    eosio_assert(is_amount_within_range(), "magnitude of asset amount must be less than 2^62");
 }
 
   //资产对象的运算符重载 
   ...
   
   // 打印资产
   void print() const
   {
      int64_t p = (int64_t)symbol.precision();
      int64_t p10 = 1;
      while (p > 0)
      {
         p10 *= 10;
         --p;
      }
      p = (int64_t)symbol.precision();
 
      char fraction[p + 1];
      fraction[p] = '\\0';
      auto change = amount % p10;
      for (int64_t i = p - 1; i >= 0; --i)
      {
         fraction[i] = (change % 10) + '0';
         change /= 10;
      }
      printi(amount / p10);
      prints(".");
      prints_l(fraction, uint32_t(p));
      prints(" ");
      symbol.print(false);
   } 
   EOSLIB_SERIALIZE(asset, (amount)(symbol))
 }

   void reflector_init()const {
      eosio_assert( is_amount_within_range(), asset_type_exception, "magnitude of asset amount must be less than 2^62" );
      eosio_assert( sym.valid(), asset_type_exception, "invalid symbol" );
   }


};

//using share_type          = int64_t;


struct extended_asset  {
// 默认构造器,构造一个扩展资产对象
  extended_asset(){}

   // 通过给定的数量和扩展符号构造一个扩展资产对象。
  extended_asset( asset a, text_name n ):quantity(a),contract(n){}
  asset quantity;
  text_name contract;// 资产拥有者
};

以上是关于EOS 智能合约源代码解读 asset.hpp的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

EOS 智能合约源代码解读 class contract

EOS 智能合约源代码解读 合约之action

EOS 智能合约源代码解读 (10)token合约“简介”