elixir-golos
7 лет назадРелиз ExGolos v0.7: теперь с возможностью подписки на поток структурированных операций Golos
На связи @ontofractal. Цель этого релиза -- упростить и ускорить написание кода управления потоками блокчейн ивентов благодаря включению обработки кастомных json операций, экстракции значений из строк, добавлению метаданных и т.д. К примеру, вместо ивентов
%CustomJson{}
теперь можно получать ивенты %Reblog{}
или %Follow{}
Продюсер структурированных операций соответствует спецификации GenStage, что позволяет подключиться к пайплайну ивентов на любом этапе: блоки, операции или структурированные операции.
Репозитории и документация
Changelog
- добавлен модуль
Steemex.Stage.StructuredOps.ProducerConsumer
- Для подписки на структурированные операции используеся опция GenStage:
subscribe_to: Steemex.Stage.StructuredOps.ProducerConsumer
. Все продюсеры используют BroadcastDispatcher -- ивенты будут отправлены всем подписавшимся консюмерам - добавлены стракты для следующих структурированных операций: трансфер, комментарий, трансфер в вестинг, подписка, реблог, публикация фида
- для каждого стракта добавлена функция трансформации и соответствующие тесты
- форма ивентов структурированных операций имеет следующий вид:
{op_data, op_metadata}
- форма ивентов операций была изменена на
{op_type, op_data, op_metadata}
- строки переводов токены парсятся и экстрагируются в поля стракта
- op_metadata =
%{height: h, timestamp: t}
дает доступ к информации о высоте и времени генерации блока - обновлен супервайзер для GenStage продюсеров
- обновлен пример потребителя ивентов с использованием пэттерн метчинга для страктов структурированных операций
- добавлена опция конфига
activate_stage_sup
запускающая продюсеры ивентов
Пример GenStage потребителя ивентов
defmodule Golos.Stage.StructuredOps.ExampleConsumer do
use GenStage
alias Golos.StructuredOps
require Logger
def start_link(args, options \\ []) do
GenStage.start_link(__MODULE__, args, options)
end
def init(state) do
Logger.info("Golos example consumer is initializing...")
{:consumer, state, subscribe_to: state[:subscribe_to]}
end
def handle_events(events, _from, state) do
for op <- events do
process_event(op)
end
{:noreply, [], state}
end
def process_event({%StructuredOps.Reblog{} = op_data, %{height: h, timestamp: t} = op_metadata}) do
Logger.info """
Новый реблог:
#{inspect op_data} в блоке #{h}, время: #{t}
"""
end
def process_event({op_data, %{height: h, timestamp: t} = op_metadata}) do
Logger.info """
Новая операция:
#{inspect op_data} в блоке #{h}, время: #{t}
"""
end
end
Дорожная карта
ExGolos находится в активной разработке.
- Улучшить документацию
- Добавить оставшиеся стракты
- Добавить возможность броадкаста транзакций
Больше об Elixir
Elixir -- функциональный язык программирования созданный на основе Erlang/OTP. Его основные преимущества: удобные примитивы параллелизации и одновременности(concurrency) вычислений, устойчивость к сбоям и относительно простое создание распределенных кластеров.
Elixir Crash Course
Elixir School