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”的主要内容,如果未能解决你的问题,请参考以下文章