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幣
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/321346.html
標籤:區塊鏈
上一篇:位元幣2
