下面看输出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个呢?
## 调试
上面我们将问题抛了出来,下面我们对代码进行debug,来分析这100个BTC在发放给用户的时候是如何转变的?我们打个断点,开始运行程序,走到convert函数中,由于我们的USD等于base的符号,所以执行到了converttoexchange函数。
`
asset connector::converttoexchange(exchange_state &ex, const asset &input) {
real_type R(ex.supply);// 1e+11
real_type S(balance.amount + input.amount); //100000100,等于state资产得新发行100个USD
real_type F(weight);//0.489999999999999991118,USD所占比重,state初始化时已经设置好
real_type T(input.amount);//100
real_type ONE(1.0);//1
auto E = R * (ONE - std::pow(ONE + T / S, F));// 根据这个算法得到对应的state资产的增发量的值。pow是cmath库的一个函数,有两个参数,返回结果为第一个参数为底,第二个参数为幂值的结果。
// (1e+11)*(1-(1+100/100000100)^+0.489999999999999991118),这得借助计算器了,算出结果为:-48999.9385,约等于程序执行结果-48999.938505084501827。
token_type issued = -E; //48999.9385,增发100个USD,实际上要增发state这么多。
ex.supply += issued;// 更新总发行量,加入以上计算的值。
balance.amount += input.amount;//state的USD connector(可理解为基于某稳值数字资产下的token)的余额可以增加100个USD了。
return asset{issued, exchange_symbol};// 最后是以EXC资产增发48999.9385个的形式返回。
}`
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-90843-13.html
长长中国军人的血性劲儿