Steem与Steem Power的对应和转换关系
最近研究了一下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,数据是一致的。
另外,我们可以再验证一下上文提到的steem和SP是一对一的关系。
还是在账户详情页面,可以看到最新的两条交易如下图:
刚开始我的账户里面有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的总量是一致的。
这是我目前的理解,如果有错误的地方,请大家指出,多谢。
写得很详细,一些不明白的地方,现在明白了。