Анонс нового скрипта обновления price feed и проекта golos-witness-tools
Преамбула
Начнём с того, что на Голосе нет какого-либо "официального" или рекомендованного скрипта обновления ценового фида. Каждый городит что-то своё или пользуется чужими наработками.
Потенциальный делегат при должном упорстве может обнаружить на wiki в статье Полезные ссылки ссылку на статью @primus 10-и месячной давности, в которой перечислены актуальные на тот момент скрипты обновления фида.
С тех пор появилось как минимум ещё 2 скрипта:
Зачем понадобился ещё один скрипт?
Я посмотрел все имеющиеся скрипты, но ни один из них не подошёл мне на 100%. Больше всего мне понравился скрипт golospricefeed от @roelandp, но и у него есть недостатки. Я решил его доработать, но в конечном итоге получился совершенно новый скрипт.
Проблемы имеющихся скриптов
Большинство скриптов требуют запущенного cli_wallet. В описании скриптов предлагается держать запущенный cli_wallet в screen. Мне такой вариант не понравился, т.к. я предпочитаю чтобы всё работало автоматически.
golosfeed-js работает без cli_wallet. Реализован на nodejs и вроде бы неплох. Использует форкнутую либу GolosJS-Lib. Сперва хотел взять его, но сыграли личные предпочтения - для таких задач мне проще использовать python.
Проект golos-witness-tools
golos-witness-tools - это набор скриптов для делегатов. Пока там только 1 скрипт для обновления прайсфида update_price_feed.py
.
Основные особенности update_price_feed.py
- Не требует наличия cli_wallet, вся работа через API прямо с нодой через websocket
- Написан на python, использует библиотеку piston-lib
- Удобен для запуска из cron
- Возможность работы в виде docker-контейнера, который 1 раз запустил и он сам периодически обновляет цену
- 2 режима работы: "одноразовый", когда цена считается 1 раз и скрипт завершает работу, и режим монитора, когда скрипт работает постоянно, периодически обновляя цену
- Возможность управления степенью подробности вывода:
- тихий режим для cron (
--quiet
), когда выводятся только ошибки --debug
режим для отладки- дефолтный режим с loglevel = info
- тихий режим для cron (
- Возможность симуляции (
--dry-run
) - посчитать цену но ничего не публиковать
Особенности вычисления цены
Одной из главных идей скрипта было сделать так, чтобы он не полагался на какой-либо один источник цен.
- Для получения цены золота используется goldprice.org, а если он недоступен, то цена берётся с Центробанка РФ
- Для получения цен USD/BTC и BTC/GOLOS используется coinmarketcap, а если он недоступен, то данные берутся с бирж
Пример запуска скрипта, когда происходит публикация цены:
% ./update_price_feed.py
2017-10-17 00:44:01,578 INFO: USD/gold: 0.041572281719965146
2017-10-17 00:44:01,922 INFO: USD/BTC: 5620.46
2017-10-17 00:44:02,651 INFO: BTC/GOLOS: 0.00001836
2017-10-17 00:44:03,228 INFO: BTC/GBG: 0.00002063
2017-10-17 00:44:03,228 INFO: BTC/gold: 0.00000740
2017-10-17 00:44:03,228 INFO: GBG/gold rate: 2.789120178224781
2017-10-17 00:44:03,228 INFO: USD/GOLOS: 0.1031916456
2017-10-17 00:44:03,229 INFO: GBG/GOLOS: 2.4822223205141536
2017-10-17 00:44:03,231 INFO: Old price: 2.65
2017-10-17 00:44:03,242 INFO: Current median price: 2.3923444976076556
2017-10-17 00:44:03,244 INFO: publishing price, difference is: 0.16777767948584632
2017-10-17 00:44:03,244 INFO: Price to publish: 2.482
Здесь мы видим как цены, полученные с бирж, так и вычисленные цены. Некоторые цены здесь приведены для аналитики, например:
- BTC/GBG - чтобы видеть текущую биржевую цену GBG
- BTC/gold - вычисленная цена золота в BTC
- GBG/gold rate - показывает степень переоцененности GBG на бирже. Вычисляется отношение цены GBG к цене 1 мг золота
- Old price - это текущая опубликованная нами цена
- Current median price - текущая медиана цен делегатов
Принцип публикации цены
- Цена публикуется в том случае, если новая цена изменилась относительно текущей опубликованной на величину
threshold
(по умолчанию 0.15) - Так же цена публикуется, если с момента предыдущего публикования прошло больше времени, чем
max_age
(по дефолту 86400, т.е. 1 сутки). В таком случае наш фид никогда не будет протухшим.
Как следствие, можно запускать скрипт на нескольких машинах одновременно, и они таким образом будут резервировать друг друга, никак не конфликтуя и не генерируя излишних ценовых обновлений.
Feedback приветствуется
Настройка и запуск скрипта описана в документации на github.
Если кто-то захочет использовать и найдёт проблемы, не стесняйтесь создавать issue на github. На вопросы по работе скрипта отвечу в комментах и в telegram в делегатском чатике .
P.S.
Вы можете проголосовать за делегата vvk сами знаете где.