convert,传入一个extended_asset资产参数,以及一个extended_symbol参数,通过判断symbol的种类,调用以上convert_to_exchange或convert_from_exchange函数进行转换处理,最终将传入的extended_asset资产转换为携带extended_symbol。
requires_margin_call,传入一个connector,connector在以上转换函数中都作为参数并且在转换过程中发生了作用,这里是对connector参数进行判断,是否需要调用边缘处理(即与值peer_margin.total_lent.amount作比较)
下面是connector的源码部分:
struct connector { extended_asset balance;// 余额 uint32_t weight = 500;// 权重 margin_state peer_margin; /// peer_connector 抵押借贷余额,margin_state类型 EOSLIB_SERIALIZE( connector, (balance)(weight)(peer_margin) )还是那个初始化工具。 };exchange_state库中最重要的函数就是上面这几个转换函数,掌握这些函数都能干哪些事,未来我们可以直接测试调用或者在其他源码中出现继续分析。
market_state这是基于以上exchange_accounts以及exchange_state两个库的库,它的内容也很多,不适宜全部粘贴出来。
market_state.hpp,该头文件中包含了结构体
margin_position,我们针对每一个market/borrowed_symbol/collateral_symbol类型的数据计算了一个唯一的作用域,然后例举了一个边缘位置表,通过这个表,每个用户可以明确地拥有一个位置,因此owner可以作为主键。
loan_position,借贷位置。
market_state(C++ 语法补充:结构体中也可以有private成员,这跟类很相似了其实)。与边缘位置或者限制单数一起维护了一个状态
market_state.cpp,源文件中实现了很多函数。这些函数实现了市场借贷关系,余额数量等操作处理,具体我们在exchange主库中通过具体业务进行介绍。
exchange这是整个exchange合约的主库(通常我会将一个名字的头文件加源文件合并称为一个库,这也是C++ 的命名习惯)。
exchange.hpp头文件,主要声明了一个类exchange,这里面包含了三个私有成员,以及七个公有函数,还有三个公有结构体,下面贴一下源码吧:
#include <eosiolib/types.hpp> #include <eosiolib/currency.hpp> #include <boost/container/flat_map.hpp> #include <cmath> #include <exchange/market_state.hpp> namespace eosio { /** * 这个合约可以让用户在任意一对标准货币类型之间创建一个exchange,这个exchange是基于一个在购买方和发行方双边的价值等额的条件下而创建的。为了预防舍入误差,初始化金额应该包含大量的base以及quote货币的数量,并且exchange 共享应该在最大初始化金额的100倍的数量。用户在他们通过exchange交易前,必须先存入资金到exchange。每次一个exchange创建一个新的货币时,相应的交易市场制造商也会被创建。货币供应以及货币符号必须是唯一的并且它使用currency合约的表来管理。 */ class exchange { private: account_name _this_contract;// 私有,账户名 currency _excurrencies;// 货币 exchange_accounts _accounts;// exchange的账户 public: exchange( account_name self ) :_this_contract(self), _excurrencies(self), _accounts(self) {} // 创建 void createx( account_name creator, asset initial_supply, uint32_t fee, extended_asset base_deposit, extended_asset quote_deposit ); // 订金 void deposit( account_name from, extended_asset quantity ); // 提现 void withdraw( account_name from, extended_asset quantity ); // 借出 void lend( account_name lender, symbol_type market, extended_asset quantity ); // 不借? void unlend( account_name lender, symbol_type market, double interest_shares, extended_symbol interest_symbol ); // 边缘覆盖结构体 struct covermargin { account_name borrower; symbol_type market; extended_asset cover_amount; }; // 上侧边缘 struct upmargin { account_name borrower; symbol_type market; extended_asset delta_borrow; extended_asset delta_collateral; }; // 交易结构体 struct trade { account_name seller; symbol_type market; extended_asset sell; extended_asset min_receive; uint32_t expire = 0; uint8_t fill_or_kill = true; }; // 函数名根据参数列表方法重载,在xxx上执行exchange void on( const trade& t ); void on( const upmargin& b ); void on( const covermargin& b ); void on( const currency::transfer& t, account_name code ); // 应用 void apply( account_name contract, account_name act ); }; } // namespace eosio exchange.cpp该源文件中实现了以上头文件中定义的所有公有方法。
测试先定义两个标准货币base和quote,他们都是exchange_state类型:
exchange_state state; state.supply = 100000000000ll;// 发行量 //state.base.weight = state.total_weight / 2.; state.base.balance.amount = 100000000; state.base.balance.symbol = "USD"; state.base.weight = .49; //state.quote.weight = state.total_weight / 2.; state.quote.balance.amount = state.base.balance.amount; state.quote.balance.symbol = "BTC"; state.quote.weight = .51; print_state( state );插曲:ubuntu编译boost库
首先在boost官网下载最新库文件,目前我下载的版本是boost_1_67_0.tar.bz2。
下载好压缩包,解压缩tar --bzip2 -xf boost_1_67_0.tar.bz2
解压后的文件夹转移到自己的习惯位置管理好,然后进入该目录
先执行./booststrap.sh进行boost库编译。
再执行sudo ./b2 install进行命令安装。
然后,我们再打开CLion,CMake自动编译项目eos,会发现console中已经显式编译成功的字样。