Снимки и быстрая синхронизация
Узлу, присоединяющемуся к цепочке, которой уже несколько лет, не нужно воспроизводить каждый блок начиная с блока 0. Он следует spine-цепочке, загружает последний снимок, который она называет, проверяет его по частям и с помощью пиров, а затем применяет только блоки, созданные после этого. Это быстрая синхронизация. Ни на одном шаге узел не верит на слово ни сайту, ни отдельному пиру о состоянии цепочки.
Снимки
Снимок — это всё состояние цепочки, каждый баланс, место и запись, на одной высоте. Каждые main_snapshot_interval блоков, 172 800 блоков или около 30 дней в mainnet, каждый узел записывает снимок состояния на момент на 760 блоков ниже этой высоты срабатывания. (В devnet — каждые 240 блоков, на глубине 80 блоков.) Узлы разносят эту работу до 60 блоков, но снимок у каждого узла байт в байт одинаков.
Снимок — это один документ CBOR, содержащий таблицы состояния цепочки (их 57), заголовки недавних блоков, недавние транзакции, транзакции, хранение которых всё ещё оплачено (см. Плата за сохранение данных (долговечность)), и недавние опубликованные квитанции. Он разрезается на чанки по 102 400 байт, каждый из которых называется своим хешем SHA3-256. Список этих хешей вместе с хешем всего файла, опорной высотой, сроком действия и хешем генезиса цепочки образует манифест, который публикует блок spine-цепочки.
Ничто внутри снимка не подписано. Его подлинность обеспечивает spine-блок, который его называет: блок, соподписанный двумя третями мест, каждое из которых сначала сверило манифест со своим собственным снимком хеш в хеш.
Каждый узел хранит только три самых новых поколения снимков. Каждый снимок начиная с блока 0 хранит децентрализованное хранилище, а не каждый узел: чанки каждого снимка хранят пять зарегистрированных узлов, выбранных жеребьёвкой (см. Архив и чтение прошлого).
Быстрая синхронизация, шаг за шагом
Узел пытается выполнить быструю синхронизацию, когда отстаёт как минимум на 100 блоков и располагает пригодным манифестом выше собственной высоты. У него должен быть spine-блок, несущий манифест, вместе с его подписями. Самый новый манифест остаётся пригодным даже после истечения срока действия.
- Синхронизировать spine-цепочку. Сильно отставший узел сохраняет spine-блок, опорный блок которого лежит выше его собственной вершины, когда этот блок несёт свой порог подписей (две трети или больше половины для резервного блока). Содержимое блока он проверяет позже, когда его основная цепочка дойдёт до опорной высоты, и при несовпадении останавливается с тревогой.
- Загрузить чанки у подключённых зарегистрированных пиров, до 16 потоками, сверяя каждый чанк с хешем, который его называет.
- Проверить весь файл по хешу всего файла из манифеста.
- Загрузить состояние в одной транзакции базы данных.
- Проверить выборку у пиров (см. ниже).
- Применить оставшиеся блоки по одному, с полной проверкой, до вершины.
Аттестация: проверка состояния у пиров
Совпадающие хеши доказывают, что байты — именно те, которые называет манифест. Они не доказывают, что эти байты — настоящее состояние. Соподписанты spine-цепочки уже сверяют каждый манифест со своим снимком; начиная с версии 0.5.8 присоединяющийся узел добавляет собственную проверку на случай, если ему подсунули ложный манифест.
После загрузки узел выбирает из своего нового состояния до 8 аккаунтов и 8 узлов реестра. Выбор определяется собственным хешем снимка, поэтому каждый присоединяющийся узел выбирает одни и те же строки, а фальсификатор не может заранее знать, какие из них сделать согласованными. Узел спрашивает у 3 случайных зарегистрированных пиров баланс каждого аккаунта и ключ и статус каждого узла на высоте снимка. Честные ответы об одной цепочке на одной высоте идентичны.
- Не меньше 2 пиров согласны и ни один не противоречит: узел продолжает.
- Противоречия не уступают по числу: он расширяет опрос до 7 пиров, и тогда ему нужны не меньше 2 согласных ответов и не меньше двух третей ответивших.
- Иначе он отклоняет снимок и возвращается к синхронизации блок за блоком.
Если отвечает слишком мало пиров, узел продолжает, полагаясь только на хеши.
Почему результату можно доверять
- Spine-блок, называющий снимок, соподписали две трети мест после того, как каждое сверило манифест со своим снимком.
- Каждый чанк и весь файл должны совпадать с хешами манифеста.
- Выборка загруженного состояния проверяется у независимых зарегистрированных пиров, выбранных случайно, когда их отвечает достаточно.
- Каждый блок после снимка проверяется полностью.
- Саму spine-цепочку может закрепить пин релиза, который поставляется вместе с релизом узла.
Никто не подписывает снимки вручную, никакому сайту не доверяют, и ничего не воспроизводится с блока 0.