Идея: доверенное состояние системы (trusted state)
Я уже не раз поднимал эту тему в чате, вот комментарий по поводу отсутствия необходимости хранить всю историю цепочки на нодах. И недавно снова возникла идея в голове, что нужен срез состояния системы в основе которого стоит доверие источнику. Я назвал это trusted state.
Фактически в конфиг новой ноды добавляется список trusted-nodes с которых будет выполнено скачивание доверенного состояния системы (одна копия), их сверка между друг с другом и запуск ноды без реплея/ресинка блоков.
Как это может выглядеть технически:
- Trusted state формируется каждые 1000 блоков (~50 минут) и сохраняется как файл для отправки/развертывания. Состояние системы в dynamic global properties содержит previous_trusted_state_hash и current_trusted_state_hash в виде sha256 хэша.
- Запрос и получение у первой ноды из списка доверенных копии trusted state (посредством p2p).
- После получения trusted state расчет его хэша и запрос у списка других доверенных нод его валидности (они возвращают простое true/false на запрос по p2p).
- Если доверенные ноды подтвердили соответствие хэша trusted state, то нода разворачивает его копию в памяти и запускает синхронизацию с этого значения состояния системы.
Для анти-ддоса при запросе trusted state ноды могут вести p2p лог и блокировать повторное получение архива с trusted state на n минут.
В конфиг вынести параметры: список trusted-nodes (с ip адресами и портами, аналогично p2p-seed-node), trusted-state = true/false для включения или отключения поддержки trusted-state, trusted-state-limit = 600 (лимит в секундах на запрос trusted state с одного ip).
Формировать trusted state нужно только по необратимому состоянию (что логично).
Всё это можно делать в рамках действующего p2p плагина, по-крайней мере я не вижу проблем с этим. Если будет воркер с доступным уровнем C++ для реализации данной идеи, добро пожаловать с заявкой в комитет ;)