Перейти к содержанию

Ноды и синхронизация истории

Все транзакции, которые отправляются в блокчейн - принимаются нодами. Полная копия всей цепочки содержится на каждой ноде и передаётся другим нодам по внутренним протоколам связи с регулярностью дважды в секунду (2 блока в секунду).

Нода - экземпляр серверного программного обеспечения блокчейна

На нодах исполняется программное обеспечение блокчейна. Ноду блокчейна может запустить и синхронизировать из открытых источников любой желающий на своём сервере.

История транзакций образует публичную последовательность вызова действий всех смарт-контрактов от момента запуска платформы. И эта содержится одновременно на всех нодах сети и она абсолютно идентичная.

Однако, то, как ноды работают с этой историей, зависит от их назначения. Всего в сети можно выделить 4 основных функциональных назначения нод: HISTORY-ноды, DELEGATE-ноды, SEED-ноды и API-ноды.

Все эти ноды по своей сути являются PEER-нодами, т.е. нодами, которые равны друг другу.

PEER-нода - это любая нода блокчейна

Все PEER-ноды функционально одинаковы. Они позволяют принимать и передавать новые блоки истории от подключенных пиров, и делают автоматически. Все представленные ниже ноды - это PEER-ноды в своей основе. Мы же будем рассматривать только практически-полезные ноды на прикладном уровне.

flowchart TD
    subgraph Layer0["Ноды истории"]
        History1["HISTORY-1"]
        History2["HISTORY-2"]
        History3["HISTORY-..."]
    end

    subgraph Layer1["Делегатские ноды"]
        Delegate1["DELEGATE-1"]
        Delegate2["DELEGATE-..."]
        Delegate3["DELEGATE-21"]
    end

    subgraph Layer2["SEED-ноды"]
        Seed1["SEED-1"]
        Seed2["SEED-2"]
        Seed3["SEED-..."]
    end

    subgraph Layer3["API-ноды"]
        API1["API-1"]
        API2["API-2"]
        API2["API-..."]
    end

    ExternalApps["Приложения провайдеров"]

    Layer0 --> Layer1
    Layer0 --> Layer2
    Layer1 --> Layer3
    Layer2 --> Layer3
    Layer3 --> ExternalApps

HISTORY-нода

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

Чтобы их использовать активно, каждый желающий может запустить HISTORY-ноду, включив дополнительный плагин, который сделает все исторические данные доступными по протоколу Websocket. В сети существуют программные решения (в том числе в наших репозиториях), которые используют HISTORY-ноды для извлечения данных из цепочки истории ноды - в обычную базу данных MONGO или POSTGRES.

flowchart TD
    subgraph Layer0["HISTORY-нода"]
        A1["Хранение полной истории блоков"]
        A2["Предоставление API"]
        A3["Поддержка Websocket соединений"]
    end

    subgraph Layer1["Методы API"]
        B["Извлечение блоков"]
        C["Действия и каскадные вызовы"]
        D["Срез состояния таблиц"]
    end

    subgraph Layer2["Приложения"]
        E["Обозреватели"]
        F["Инструменты анализа"]
        G["Фабрики документов"]
    end

    Layer0 --> Layer1
    Layer1 --> Layer2

Именно HISTORY-ноды используются фабриками документов при кооперативах для восстановления истории подписанных документов. Это позволяет хранить большие массивы неизменяемых данных, но не использовать для этого дорогие ресурсы оперативной памяти. HISTORY-нода конфигурируется при запуске с помощью дополнительных настроек плагина истории. Без этого плагина, история транзакций по-прежнему будет содержаться в каждой ноде, но без возможности быстрого извлечения для прикладного применения.

HISTORY-нода позволяет извлекать не только данные о действиях, которые вызывались пользователями, но и о каскадных действиях, которые вызывались автоматически смарт-контрактами в других смарт-контрактах согласно заложенной в них бизнес-логике кооперации.

Например, все действия с цифровыми кошельками пользователей - автомарны, и вызываются только каскадными действиями других смарт-контрактов. Таким образом, HISTORY-нода позволит при необходимости извлечь все действия, которые влияли на кошелёк пользователя. Также, HISTORY-нода позволяет не только извлекать действия, но и все изменения в таблицах контрактов.

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

DELEGATE-нода

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

Делегаты - это участники, которые предоставляют вычислительные ресурсы своих серверов для работы платформы.

Делегаты выполняют ключевую роль по обработке транзакций и включению их в цепочку блоков, которая фактически производится на их серверах. Т.е. именно делегатские ноды являются производителями блокчейна, и именно они ставят свои подписи на каждом новом блоке истории событий, утверждая ее и делая тем самым неизменной.

На платформе действует система выборов делегатов, где 21 основная команда и 150 резервных команд получают право предоставлять свои ресурсы и получать за это вознаграждение. Подробнее о системе ресурсов и токеномике вознаграждений в соответствующих разделах.

flowchart TB
    subgraph Layer0["DELEGATE-нода"]
        A1["Производство блоков"]
        A2["Достижение консенсуса"]
        A3["Предоставление вычислительных ресурсов"]
        A4["Получение вознаграждений"]
    end

Запуск делегатской ноды осуществляется путём добавления плагина и ключа производителя в конфигурацию ноды при её синхронизации. Однако, для того, чтобы участвовать в производстве блокчейна, делегату необходимо стать пайщиком кооператива-оператора и присоединиться к соответствующей целевой потребительской программе. Кроме того, делегату необходимо собрать достаточное количество голосов, чтобы войти в топ-21 самых надежных и доверенных делегатов платформы. Подробнее о процессе выборов в соответствующем разделе.

Здесь же следует сказать, что ключевым для делегата является его скорость и надежность в производстве транзакций. Это значит, что никаких других операций на той же ноде совершать нежелательно. Поэтому ноды делегатов рекомендуется отделять от всех других нод в производственных средах. Более того, существует программная возможность соединения нод делегатов исключительно с доверенными SEED-нодами, что позволяет делегатам построить внутреннюю, изолированную топологию для надежной обработки транзакций.

API-нода

API-нода - программный интерфейс для связи с приложениями провайдеров

Все ноды обладают API - например, у HISTORY - это API для извлечения истории, а у делегата - это API делегата. Однако, для регулярной работы с платформой необходим доступ к методам, которые позволяют отправлять транзакции, получать информацию из таблиц распределенной базы данных, и другую, прочую информацию о состоянии блокчейна.

Для этого нужны API-ноды. Они конфигурируются таким образом, что предоставляют публичные конечные точки доступа для взаимодействия с внешним программным обеспечением. Они предоставляют RPC-интерфейсы, позволяющие отправлять POST и GET запросы для отправки транзакций и извлечения данных.

flowchart TD
    subgraph Layer0["API-нода"]
        A1["Публичная точка доступа"]
        A2["Первичная валидация транзакций"]
        A3["Вещание транзакций в сеть"]
        A4["Извлечение данных из базы"]
    end

    subgraph Layer1["Функции взаимодействия"]
        B1["Отправка транзакций"]
        B2["Получение данных из таблиц"]
        B3["Получение информации о состоянии блокчейна"]
    end

    subgraph Layer2["Внешние приложения"]
        C1["Приложения провайдеров"]
    end

    Layer0 --> Layer1
    Layer1 --> Layer2

API-ноды при получении новой транзакции немедленно производят валидацию её и действий внутри неё. И только в случае если транзакция признана этой нодой достоверной - она отправляется всем другим нодам сети (вещается). Ноды делегатов получают эти транзакции и точно также проверяют их. И только в том случае, если 2/3 из основных делегатов согласятся с тем, что новая транзакция не содержит ошибок - тогда и только тогда она будет включена в цепочку. А до этого времени она считается всеми нодами - обратимой.

Но API-нода не беспокоится об этом. Её задачи - первичная валидация, вещание транзакции в сеть, а также, извлечение информации из собственной базы данных по запросам. База данных API-ноды формируется в процессе синхронизации и обновляется дважды в секунду автоматизированным и заверенным решением делегатов.

SEED-нода

Для того, чтобы все ноды сети могли получить информацию о её состоянии - необходимы специальные ноды, которые будут предоставлять эту информацию большими пачками блоков транзакций. Такие ноды называются SEED, или, семя.

SEED-нода - это публичная точка для синхронизации блокчейна

Любой ноде для того, чтобы подключиться к блокчейн-сети, необходимо указать SEED-ноду, с которой будет произведена полная синхронизация цепочки блоков истории транзакций. SEED-ноды предоставляют такую возможность. Их главная задача - подключать другие ноды, делиться актуальной информацией о состоянии блоков, а также, наличии других нод в сети.

flowchart TD
    Z1["Новая нода"]

    subgraph Layer0["SEED-нода"]
        A2["Синхронизация новых нод"]
        A3["Передача списка активных PEER-нод"]
    end

    subgraph Layer2["PEER-ноды"]
        C1["SEED-ноды"]
        C2["DELEGATE-ноды"]
        C3["HISTORY-ноды"]
        C4["API-ноды"]
    end

    Z1 --> Layer0
    Layer0 --> Layer2

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

Синхронизация

Все принятые блокчейном транзакции образуют цепочку истории действий. Полная копия этой цепочки содержится на каждой PEER-ноде и передаётся другим нодам по внутренним сетевым каналам связи платформы при синхронизации.

Синхронизация - процесс скачивания и криптографической проверки истории транзакций блокчейна.

При подключении новой PEER-ноды к платформе, она скачивает всю историю, криптографически проверяет взаимосвязь между блоками, и полностью воссоздаёт состояние своей базы данных таким, какое оно у всех других нод в сети.

Синхронизация выполняется между всеми PEER-нодами дважды в секунду. Именно такая скорость производства новых блоков истории транзакций на платформе. Блоки могут быть и пустыми, но процесс производства и синхронизации не останавливается ни на секунду.

Синхронизация истории между нодами сопровождается синхронизацией текущего состояния распределенной базы данных, которая хранится одновременно на всех серверах нод в их оперативной памяти.