Steem与Steem Power的对应和转换关系

in #steem4 years ago

最近研究了一下steem与steem power之前的对应和转换关系,因为苦于代码中常常出现的vesting_shares以及通过接口获取的数据中SP的数值,老是对应不上,这里做一下总结。

每种类型的数据都有一个自己的单位

其实在steem中,每种数据都会有一个单位,以便于用户查阅。例如vesting_shares的单位是VESTS,我们在接口中,常常拿到的如下数据:

"vesting_shares": "1033.277186 VESTS",

其实在代码中,vesting_shares的值为1033277186,为了便于显示,常常将实际数值做一定的转换后,再在后面加一个单位或者符号,vesting_shares的这个转换就是除以1000000,然后再加上VESTS
另外,在接口返回的某些数据中,也会存在不带单位的数值,例如:

 "proxied_vsf_votes": [
     "5951717255647562",
     "105607333914143",
     0,
     0
],

对于这些数值,如果要和别的数值做加法或者减法运算时,就需要先按照上面的转换关系,计算出相同单位下的数值之后,再进行运算。

power up操作是冻结steem获取等值的SP

steem是通过power up操作转换为steem power(后文中简称SP)的,其实steem的数值等于SP的数值,或者可以理解为将steem冻结之后,获取了等量的SP。在代码中,power up操作是通过如下代码实现的:

void transfer_to_vesting_evaluator::do_apply( const transfer_to_vesting_operation& o )

代码的核心逻辑,就是通过保证total_vesting_shares以及total_vesting_fund_steem的比值维持不变,来计算用户获得的vesting_shares

为了更好的解释上面的逻辑,我来举一个例子。
我目前的账户下,通过condenser_api.get_accounts接口,可以获取如下数据:

         "vesting_shares": "1033.277186 VESTS",

然后通过condenser_api.get_dynamic_global_properties接口,可以获取:

        "total_vesting_fund_steem": "240336853.076 STEEM",
        "total_vesting_shares": "470255027529.625272 VESTS",

我们进行如下的计算:

# 换算成相同单位的表示
vesting_shares = 1033277186 = 1033.277186 VESTS
(vesting_shares / 1000000) * (total_vesting_fund_steem.amount / total_vesting_shares.acmount) =
1033.277186  * 240336853.076 / 470255027529.625272 = 0.5280849171204662 SP

我们再去账户详情页面,可以发现我此时的SP为0.528,数据是一致的。

image.png

另外,我们可以再验证一下上文提到的steem和SP是一对一的关系。
还是在账户详情页面,可以看到最新的两条交易如下图:

image.png

刚开始我的账户里面有0.263 STEEM 和0.264 SP(交易4eb614e6),然后我进行了power up的操作(交易34a95cba),冻结了0.263 STEEM,获取等值的0.263 SP,0.264 SP + 0.263 SP = 0.527 SP,跟目前账户上面显示的SP的总量是一致的。

这是我目前的理解,如果有错误的地方,请大家指出,多谢。

Sort:  

写得很详细,一些不明白的地方,现在明白了。

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.028
BTC 58589.32
ETH 2636.10
USDT 1.00
SBD 2.45