GOLOS
RU
EN
UA
vik
2 года назад

🎯 Преимущества нового 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, сделать этот запрос и далее получать данные блоков автоматически какждый раз, когда они появляются в блокчейн.
Разумеется, самые главные данные блока - это операции пользователей.

Раньше был огромный минус и абсурд подписки на вебсокеты в том, что в ответ мы получали только бесполезные заголовки.

333.gif

В данных был только закодированный номер предыдущего блока и информация о делегате подписавшем блок

s

В ответе не было транзакций и приходилось с каждым получением блока, кодировать строку previos чтобы узнать номер предыдущего блока и далее запрашивать следующий дополнительным (лишним) вызовом
get block

Фактически получалось, что мониторинг блокчейна скатывался в то, что каждые 3 секунды мы отправляем get_block в ноду, что не отличается от примитивного интервала с постоянным дерганием этого метода.

Появление транзакций в подписке set_block_applied_callback все в корне меняет, нам вообще не нужно делать get_block

Я подписываюсь set_block_applied_callback на новую ноду 17.golos.cf и результат уже содержит данные о транзакциях

Остается только фильтровать операции в контексте вашего приложения.
Нагрузки на ноду при этом практически нет:

s

Зеленая строка в логе - это операция подписки на новые блоки. Все. Больше никаких запросов, блоки просто раздаются по вебсокетам не насилуя ноду запросами.

А теперь посмотрим на метод рекомендуемый в steemit и тот который был ранее на голосе
555.PNG
Он призван делать все тоже самое - отдавать новые транзакции из блоков.
И вот как это отражается на ноде:

Прежний подход: Почти десяток запросов на каждый блок!!! Вместо нуля.
Для децентрализованной экосистемы, где количество нод важный аспект той самой децентрализации - такая механика не может сделать содержание публичной ноды разумной, пару сотен пользователей на клиенте с конкретной нодой будут блокировать работу друг-другу, при этом не будет возможности переключится на альтернативную ноду по причины отсутствия таковой.

Новый подход и ожидания:
Больше желающих открыть публичные api точки доступа, поскольку стоимость таковых может быть снижена (можно уменьшить количество нод в кластере), больше приложений с выбором оптимальной ноды, а стало быть больше отказоустойчивости и децентрализации.

3
67.668 GOLOS
На Golos с January 2017
Комментарии (5)
Сортировать по:
Сначала старые