EOS 智能合约源代码解读 (14)system合约“exchange_state.hpp”

Posted thefist11

tags:

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

1. 使用bancor数学创建一个在两种资产类型中的50/50的中继

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 智能合约源代码解读 (14)system合约“exchange_state.hpp”的主要内容,如果未能解决你的问题,请参考以下文章

EOS 智能合约源代码解读 (13)system合约“native类的关键方法”

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

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

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

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

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