第一源码网 ??【刘文彬】【精解】EOS标准货币体系与源码实现分析(6)

电脑杂谈  发布时间:2018-12-14 00:14:01  来源:网络整理

multi_index这里再简单介绍一下。它的模板定义是

template<uint64_t TableName, typename T, typename... Indices>

泛型中第一个参数是表名,第二个是多重索引。

N函数的源码:

 /**
    * @brief 用来生成一个编译时间,它是64位无符号整型。传入的参数X是一个base32编码的字符串的解释。
    * @ingroup types
    */
   #define N(X) ::eosio::string_to_name(#X)

可参考文章《EOS技术研究:合约与交互》,下面来看一下exchange_accounts.cpp源码:

`
include <exchange/exchange_accounts.hpp>
namespace eosio {
void exchangeaccounts::adjustbalance( accountname owner, extendedasset delta, const string& reason ) {
      (void)reason;// reason当做一个备注,不可修改的。
  auto table = exaccounts_cache.find( owner );//通过account\_name查找到对应的exaccount结构体对象数据。
  if( table == exaccounts_cache.end() ) {// 如果这个数据是最后一个,则将当前数据重新包装放入exaccounts_cache,同时将exaccounts_cache第一位的数据重新赋值给table
     table = exaccounts_cache.emplace( owner, exaccounts(_this_contract, owner )  ).first;
  }
  auto useraccounts = table->second.find( owner );//table现在有值了,在table下一个位置查找owner
  if( useraccounts == table->second.end() ) {// 如果这个用户是table下一个位置的结尾数据,则将owner重新组装数据放入table
     table->second.emplace( owner, [&]( auto& exa ){
       exa.owner = owner;
       exa.balances[delta.get_extended_symbol()] = delta.amount;
       eosio_assert( delta.amount >= 0, "overdrawn balance 1" );//断言,当extended_assert资产的数目小于0时,打印日志:透支余额1
     });
  } else {// 如果该用户不是table下一个位置的结尾数据,则修改以该用户为key的数据,
     table->second.modify( useraccounts, 0, [&]( auto& exa ) {
       const auto& b = exa.balances[delta.get_extended_symbol()] += delta.amount;// 扩展标识的余额加上extended_assert资产的数目为b
       eosio_assert( b >= 0, "overdrawn balance 2" );// 断言,当b小于0时,打印日志:透支余额2
     });
  }
}
} /// namespace eosio`


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-90843-6.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...