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

in steem •  5 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的总量是一致的。

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

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

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