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
美国人流放犯的后代
迎接他的有猎