接下来继续我们的测试。直接run 主函数,首先打印出来的是"USD"和"BTC"的发行信息,
----------------------------- supply: 1e+11 base: 1e+08 USD quote: 1e+08 BTC -----------------------------可以看到,这与代码中定义的总发行量以及包含的两种符号类型的token的各自发行量,都是准确的。
自定义数字资产类型exchange_state是在测试类中我们自定义的数字资产类型,下面是它的结构:
struct exchange_state { token_type supply;// 发行量 symbol_type symbol = exchange_symbol;// exchange符号 // 两个连接器base和quote connector base; connector quote; // 交易 void transfer( account_name user, asset q ) { output[balance_key{user,q.symbol}] += q.amount; } map<balance_key, token_type> output; vector<margin> margins; };exchange_state数字资产中,包含一个总发行量,两个成员资产base和quote,他们是connector类型,这个类型也是自定义的(与上面介绍的源码稍有不同,稍后在测试完成以后会总结他们的区别),交易函数以及一个自定义集合output和margins,下面来看connector的定义:
struct connector { asset balance; // asset资产类型 real_type weight = 0.5; token_type total_lent; /// 发行商从用户的贷款 token_type total_borrowed; /// 发行商借给用户 token_type total_available_to_lend; /// 可借出的有效数量 token_type interest_pool; /// 利息池,是所获得的总利息,但不一定每个用户都可以申请使用 // 以下三个方法都在本文件下被实现了。 void borrow( exchange_state& ex, const asset& amount_to_borrow ); asset convert_to_exchange( exchange_state& ex, const asset& input ); asset convert_from_exchange( exchange_state& ex, const asset& input ); };这个connector有一个余额,一个权重(可理解为占有exchange_state数字资产的比例),它的一些银行资产功能属性,贷款拆借利息等,以及connector本身作为资产可以与其他exchange_state数字资产进行转换,拆借等功能。余额成员是asset资产类型,这个类型也是一个自定义结构体:
struct asset { token_type amount; symbol_type symbol; };它具备一个总数量和符号两个成员。所以以上我们给exchange_state数字资产定义了两个connector,“BTC”和“USD”以及它们各自的发行量,正是采用这个asset的结构进行赋值的。
打印出state内容以后,显示的是两种token"USD"和"BTC"的发行信息,接下来,我们利用exchange中的一些函数功能进行两种token之间的转换及交易。
auto new_state = convert(state, "dan", asset{100, "USD"}, asset{0, "BTC"}); print_state(new_state);看一下这里面的convert函数的声明:
/** * 通过给出的一个当前state,计算出一个新的state返回。 */ exchange_state convert( const exchange_state& current,// 当前state account_name user,// 用户 asset input,// 输入资产 asset min_output,// 最小输出资产 asset* out = nullptr) {所以我们来解读第一行convert代码的意思为:
一个名为“dan”的用户,现有资产状态为上面已打印的state,输入资产为100个USD,最小输出资产为0个BTC(注意输入资产和最小输出资产必须是不同的,否则无法转化)。
下面看输出print_\state结果:
----------------------------- supply: 1e+11 base: 1e+08 USD quote: 9.99999e+07 BTC dan 96.0783 BTC dan 0 EXC dan -100 USD结果解读:
supply和base的数量都没变
quote的数量少了100个BTC(0.00001e+07)
dan的BTC多出来96.0783个。
dan的EXC为0(本次交易中没有涉及到,EXC是默认token符号)
dan的USD少了100个。
重新解读这一行convert代码的意思为:
state数字资产(我们最早设置的),dan根据state资产的格式拿出来自己账户中的100个USD(dan本身没有USD,所以是欠款状态)作为抵押想exchange BTC,,而BTC是quote(base和quote也可以理解为用户)的符号,所以quote的数量少了相应的100个BTC。最后,要将这100个BTC打入dan的账户里面,而为什么编程了96.0783个而不是100个呢?
调试