N函数的源码:
/** * @brief 用来生成一个编译时间,它是64位无符号整型。传入的参数X是一个base32编码的字符串的解释。 * @ingroup types */ #define N(X) ::eosio::string_to_name(#X)下面来看一下exchange_accounts.cpp源码:
#include <exchange/exchange_accounts.hpp> namespace eosio { void exchange_accounts::adjust_balance( account_name owner, extended_asset 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它实现了adjust_balance函数。这个函数主要实现了对账户数据的管理,余额的判断与处理。
exchange_stateexchange_state库的源码我就不张贴了,这里进行一个总结:
exchange_state.hpp,头文件中主要声明了一些变量结构体,
包括边缘状态margin_state,返回的是一个extended_asset
interest_shares,所有的给那些借出人分配的共享空间,当某人未借款,他们可以获得total_lendable * user_interest_shares / interest_shares。当付过利息以后,会显示在变量total_lendable。
exchange_state结构体是使用bancor数学创建一个在两种资产类型中的50/50的中继。这个bancor的状态,exchange是完全包含在这个结构体中。这个API没有额外的影响和使用。
exchange_state.cpp,源文件中主要实现了头文件中这几个结构体中的一些函数,包括
convert_to_exchange,通过传入一种extended_asset资产,将它转换成exchange token,相当于token在原有发行量的基础上,按照新的extended_asset资产抵押发行了新的token。
convert_from_exchange,通过传入一定量的exchange token(注意exchange token也是extended_asset资产类型),将其转化为其他extended_asset资产,相当于回购了部分token,降低了token保有量。