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

in #steemdev7 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.