Вчера для тестирования обновленного API я запустил дополнительную паблик ноду wss://17.golos.cf
с 0.17.0 версией golosd, однако на протяжении вчерашнего дня ее работа не была полноценной, поскольку позднее я добавил весь набор плагинов и запустил ресинхронизацию. Кроме этого выяснилось, что метод get_block
не одтает транзакции в блоке, что было исправлено командой @goloscore https://github.com/GolosChain/golos/issues/468 , но ноду пришлось персобрать.
Сейчас она полностью синхронизирована и включает следующий набор плагинов:
witness social_network database_api network_broadcast_api private_message raw_block json_rpc account_history market_history follow
Синхронизирована с живым блокчейном, это не тестнет, поэтому если намерены что-то тестировать - учитывайте, что работаете с текущим блокчейном.
Преимущества нового json-rpc API
Я делаю постепенную миграцию своих скриптов на новую ноду. Начав с основного используемого метода set_block_applied_callback
я нашел приятный бонус в виде того, что ответ содержит транзакции!
Вот простой JavaScript который можно просто вставить в консоль браузера чтобы получать транзакции (операции) происходящие на голосе.
var ws = new WebSocket('wss://17.golos.cf');
ws.onopen = function(event) {
ws.send('{"id":1,"jsonrpc":"2.0","method":"call","params":["database_api","set_block_applied_callback",[0]]}');
ws.onmessage = function(raw) {
return console.log(JSON.parse(raw.data).result.transactions)
}
}
set_block_applied_callback
- это подписка по вебсокетам (которой больше нет в steemit) на новые блоки в блокчейне, достаточно подключиться к ноде по ws, сделать этот запрос и далее получать данные блоков автоматически какждый раз, когда они появляются в блокчейн.
Разумеется, самые главные данные блока - это операции пользователей.
Раньше был огромный минус и абсурд подписки на вебсокеты в том, что в ответ мы получали только бесполезные заголовки.
В данных был только закодированный номер предыдущего блока и информация о делегате подписавшем блок
В ответе не было транзакций и приходилось с каждым получением блока, кодировать строку previos чтобы узнать номер предыдущего блока и далее запрашивать следующий дополнительным (лишним) вызовом
Фактически получалось, что мониторинг блокчейна скатывался в то, что каждые 3 секунды мы отправляем get_block в ноду, что не отличается от примитивного интервала с постоянным дерганием этого метода.
Появление транзакций в подписке set_block_applied_callback
все в корне меняет, нам вообще не нужно делать get_block
Я подписываюсь set_block_applied_callback
на новую ноду 17.golos.cf и результат уже содержит данные о транзакциях
Остается только фильтровать операции в контексте вашего приложения.
Нагрузки на ноду при этом практически нет:
Зеленая строка в логе - это операция подписки на новые блоки. Все. Больше никаких запросов, блоки просто раздаются по вебсокетам не насилуя ноду запросами.
А теперь посмотрим на метод рекомендуемый в steemit и тот который был ранее на голосе
Он призван делать все тоже самое - отдавать новые транзакции из блоков.
И вот как это отражается на ноде:
Прежний подход: Почти десяток запросов на каждый блок!!! Вместо нуля.
Для децентрализованной экосистемы, где количество нод важный аспект той самой децентрализации - такая механика не может сделать содержание публичной ноды разумной, пару сотен пользователей на клиенте с конкретной нодой будут блокировать работу друг-другу, при этом не будет возможности переключится на альтернативную ноду по причины отсутствия таковой.
Новый подход и ожидания:
Больше желающих открыть публичные api точки доступа, поскольку стоимость таковых может быть снижена (можно уменьшить количество нод в кластере), больше приложений с выбором оптимальной ноды, а стало быть больше отказоустойчивости и децентрализации.
Я продолжаю экспериментировать, тыкаться вслепую, получаю отлуп такого вида:
Assert Exception (10) api_itr != _registered_apis.end(): Could not find API account_history
Есть ли где-нибудь список API с доступными из них функциями?
А что будет, если связь прервется или вебсокет-соединение по какой либо другой причине загнется. Там какой то параметр у метода, что он означает? У тебя в примерах там ноль.
Для некоторых приложений критичны пропуски блоков. Такой метод наверное не подойдет.
Я проверяю пишу в redis кеш номер последнего блока и в случае если нарушается секвенция идет дополнительная синхронизация.
Также ws соединение дополнительно контролировать можно, переподключаясь при закрытии.
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
sharker, alex2016, t3ran13, narin, radomir, oleg257, dimarss, vik, vadbars, amikphoto, tom123, natasmr, yourlastwinter, olga-olga, vict0r, semasping, kssenia, lira, ladynazgool, tnam0rken, decha, zivchakh, rubin, ovtretya, arhangel, newodin, vika-teplo, lenutsa, aiparnyuk, anatolich, felicita, amelina.elena, talia, graff0x, bombo, manavendra, dimas102, lengalenga, lokkie, bag, dim447, mp42b, massatela, kanalex, chirakovalsky, konstab, yakubovruslan, doctormucle, astramar, cryptovisitor, zelivsky, benken, funt33, leonid96, brainmechanic, siddxa, osra111, lologom, delectat, yurij12, rastabandito
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
Хорошая работа! Подписался! Надеюсь на взаимность)