How to: 如何计算 max_virtual_bandwidth / How to calculate the max_virtual_bandwidth?

in #steemdev6 years ago

今天遇到一个有意思的问题。我计划查询账户的可用带宽(bandwidth),原本以为和读账户其它信息如reputation、vesting_shares等一样可以直接读取到,但是调用get_account()后,却没法找到可用带宽信息。


(图源 :pixabay)

直接获取失败

只有类似如下信息:
'average_bandwidth': '117344254786',
'average_market_bandwidth': 3461867185,
'last_bandwidth_update': '2018-01-25T10:35:06',
'last_market_bandwidth_update': '2018-01-23T13:06:24',
'lifetime_bandwidth': '8459927000000',
'lifetime_market_bandwidth': '653650000000',

我期望直接拿到类似下边的百分比:

或者找到类似如下信息也可以:

可惜都没法拿到,也就是说我们没法直接拿到用户的带宽信息。

用户可用带宽公式

既然没法直接通过get_account ()拿到,那么只好看看有没有什么方式计算出来。用户是否有可用带宽的计算方式为:

has_bandwidth = ( account_vshares * max_virtual_bandwidth ) > ( account_average_bandwidth * total_vshares );

由上述公式变换个方式:
用户可用带宽为: account_vshares / total_vshares* max_virtual_bandwidth
可以理解为,你的有效SP占总SP多大比例,那么你就可以使用带宽池中多大比例的带宽

好,我们以前做程序的时候知道account_vsharestotal_vshares是可以分别通过get_account()以及get_dynamic_global_properties()获取的,如果max_virtual_bandwidth 也可以通过get_dynamic_global_properties()获取,那就简单了。

结果瞪大眼睛找半天发现根本没有max_virtual_bandwidth,看来只好计算了。

计算max_virtual_bandwidth

去代码里找了半天,总算找到计算max_virtual_bandwidth的代码:

其中,max_block_size以及current_reserve_ratio可以通过get_dynamic_global_properties()获取。

剩下的一堆看起来是常量,应该可以用get_config()获取。

结果程序一运行,出错啦,提示RESERVE_RATIO_PRECISION不存在,去代码中找了一下

原来是在代码中直接定义的,这不科学,不过直接拿来用吧。

算出来的总带宽为:17103052162990080000
而steemd上读到的带宽为:

你问我为啥不一样?当然是总带宽一直在变喽,除非我能保证程序获取带宽和刷新网页完全同时操作。

总结

  • 用户可用带宽无法通过get_account()直接获取
  • 用户可用带宽计算公式: account_vshares / total_vshares * max_virtual_bandwidth
  • max_virtual_bandwidth 无法直接用get_dynamic_global_properties()获取
  • max_virtual_bandwidth 计算公式见正文部分
  • RESERVE_RATIO_PRECISION 代码中硬编码为: ((int64_t)10000)
  • 计算总可用带宽需要用到如下API
    • get_dynamic_global_properties()
    • get_config()

相关链接

Sort:  

Good Article for increasing virtual band width.
If it posted in English lot of other people also get benefits.

Thanx

you know what I really didn't understand what you said. pls type in English

请教下 除了发文章要用到 带宽还有什么用处呢

如果没可用带宽为零,那么应该做不了任何操作,比如说power up、transfer

我800k的带宽 还是99 说明不够活跃啊....

太及时了,我还真正琢磨这个bandwidth到底是什么东东。转啦,谢谢分享!

不必客气

请教下大神,1. 带宽是做什么用的啊?2. 带宽的数值受什么影响?谢谢!:-)

不是大神😳
随便回答:
1, 所有操作都要消耗带宽,带宽为0,就啥也做不了啦
2,用户可用带宽为: account_vshares / total_vshares* max_virtual_bandwidth
可以理解为,你的有效SP占总SP多大比例,那么你就可以使用带宽池中多大比例的带宽

好的,谢谢解答。主要是,感觉大家的带宽都不怎么消耗,所以有点奇怪它的作用。

涨姿势了,感谢!

我还是不明白,因为乐队的动作太快了,但是我有一些奇怪的事情发生了。我今天早上想把钱转到另一个账户。他没有离开我。所以我确认了我有多少百分比。 ,我有-150%这是为什么?我应该等多久?等一整天知道发生了什么事

Nice post.I respect you very much because you contribute to steemit.I will do activities like you.I would like to extend the steemit.

Coin Marketplace

STEEM 0.19
TRX 0.13
JST 0.030
BTC 62832.46
ETH 3374.71
USDT 1.00
SBD 2.48