该文件位于eosio.system\include\eosio.system\exchange_state.hpp。也是system合约的依赖之一。该文件处理资产方面的工作,主要部分是exchange_state结构体,该结构体使用Bancor算法在两种不同资产类型中间创造一个50对50的中继,bancor交易所的状态完全包含在这个结构体中,此API没有任何额外的副作用。
namespace eosiosystem { using eosio::asset; using eosio::symbol; typedef double real_type; // 使用Bancor算法在两种不同资产类型中间创造一个50对50的中继。bancor交易所的状态完全包含在这个结构体中。使用此API没有任何额外的副作用。 struct [[eosio::table, eosio::contract("eosio.system")]] exchange_state { asset supply; // 资产供应 struct connector { // 连接器 asset balance; // 资产余额 double weight = .5; // 权重 EOSLIB_SERIALIZE( connector, (balance)(weight) ) }; connector base; // 基本连接器 connector quote; // 引用连接器 uint64_t primary_key()const { return supply.symbol.raw(); } // 该table主键 asset convert_to_exchange( connector& c, asset in ); // 通过连接器c将输入资产in转换为发行资产issued。 asset convert_from_exchange( connector& c, asset in ); // 通过连接器c将输入资产in转换为输出资产out asset convert( asset from, const symbol& to ); // 核心功能:将一种资产转为另一种符号的等价资产。例如将10 SYS的资产转为EOS是20 EOS,币币交易。 EOSLIB_SERIALIZE( exchange_state, (supply)(base)(quote) ) }; // 内存市场状态表 typedef eosio::multi_index< "rammarket"_n, exchange_state > rammarket; }convert函数是exchange最重要的功能,它实现了完全按照boncor市场机制交换token。具体实现源码的机制如下:
asset exchange_state::convert(asset from, const symbol &to) { auto sell_symbol = from.symbol; // 原来的符号,作为卖出币 auto ex_symbol = supply.symbol; // 中转币的符号 auto base_symbol = base.balance.symbol; // base连接器资产的符号 auto quote_symbol = quote.balance.symbol; // quote连接器资产的符号 if (sell_symbol != ex_symbol) { // 如果卖出币不是中转币 if (sell_symbol == base_symbol) { // 如果卖出币等于base连接器资产 from = convert_to_exchange(base, from); // 通过base连接器转换卖出币 } else if (sell_symbol == quote_symbol) { // 如果卖出币等于quote连接器资产 from = convert_to_exchange(quote, from); // 通过quote连接器转换卖出币 } else { // 其他卖出币无任何连接器的情况视为无效币币兑换行为。 eosio_assert(false, "invalid sell"); } } else { // 如果卖出币是中转币 if (to == base_symbol) // 如果买入币等于base连接器资产 { from = convert_from_exchange(base, from); // 通过base连接器转换卖出币 } else if (to == quote_symbol) // 如果买入币等于quote连接器资产 { from = convert_from_exchange(quote, from); // 通过quote连接器转换卖出币 } else { // 其他卖出币无任何连接器的情况视为无效币币兑换行为。 eosio_assert(false, "invalid conversion"); } } if (to != from.symbol) // 如果经过一轮转换以后,from和to资产仍旧没有统一符号,则再次调一遍转换。 return convert(from, to); return from; // 最后成功得到转换为等价的to币 }这部分可以参照之前的一篇文章【EOS标准货币体系与源码实现分析】。
四、asset.hpp