Как правильно вычислять текущую voting power
Как узнать какая прямо сейчас Voting Power у аккаунта? Казалось бы, самое очевидное - это сделать RPC call к ноде get_account()
и взять оттуда значение voting_power:
% ./get_account.py vvk |grep power
'voting_power': 8427,
Но нет! Это не текущее значение VP, а значение на момент крайнего апа.
Т.е. если вы не апали например неделю, фактическая VP будет 100 (10000), а в блокчейне всё ещё будет болтаться старое значение.
А где же тогда взять VP, спросите вы?
А надо всего лишь взять и посчитать VP по алгоритму, как это делает golosd. Оригинальный код для 0.16.4 - в libraries/chain/steem_evaluator.cpp
.
Вкратце - надо взять last_vote_time
и посчитать, сколько % VP успело регенерироваться, и прибавить это к тому значению voting_power
, что отдаёт нода. На python:
STEEMIT_100_PERCENT = 10000
STEEMIT_VOTE_REGENERATION_SECONDS = 5*60*60*24 # 5 days
elapsed_time = datetime.utcnow() - last_vote_time
regenerated_power = STEEMIT_100_PERCENT * elapsed_time.total_seconds() / STEEMIT_VOTE_REGENERATION_SECONDS
current_power = vp + regenerated_power/100
Полный код доступен в репозитории golos-scripts. Я сделал отдельный скрипт get_votnig_power.py
А именно:
- функция
get_voting_power
- скрипт
get_votnig_power.py
там же.
Само собой, скрипт оценки апа будет использовать сию наиточнейшую VP.
Данный пост собирает финансирование по программе краудфандинга
Детали программы описаны в посте
Текущие открытые цели
- 200 GOLOS на скрипт оценки профита апа