【精解】EOS标准货币体系与源码实现分析 (4)

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中已经显式编译成功的字样。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxppy.html