🎯 Преимущества нового websocket api голоса: подписка set_block_applied_callback теперь содержит транзакции!
Вчера для тестирования обновленного 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 точки доступа, поскольку стоимость таковых может быть снижена (можно уменьшить количество нод в кластере), больше приложений с выбором оптимальной ноды, а стало быть больше отказоустойчивости и децентрализации.