Вселенная
World является глобальным субъектом, который содержит другие субъекты. World состоит из:
- Iroha параметры конфигурации
- зарегистрированные сверстники
- зарегистрированные домены
- зарегистрированные триггеры
- зарегистрированные роли
- зарегистрированные определения разрешительных токенов
- токены разрешения для всех счетов
- цепь validators runtime
Когда домены, равные или роли зарегистрированы или не зарегистрировались, World является целью (не) регистрации инструкции.
Взгляд на мировое состояние (WSV)
World State View - это представление в памяти текущего состояния блокчейна. Он включает в себя World, обязательные хеш-блоки, индексы транзакций и сверстники, избранные для нынешней эпохи. Полная нагрузка блоков подается из Kura, а не дублируется как изменчивые WSV данные.
В настоящее время WSV Это состояние, в котором прочитываются запросы и блокируют исполнение. Продолжительная история хранится в Kura, и WSV могут быть восстановлены из Kura блокируются или загружаются из состояния мгновенного снимка, а затем захватываются воспроизведением новейшего Kura Блоки.
Что за следы WSV
Объект WSV более широкий, чем объект World, на практике он содержит:
World: параметры, аналоги, домены, учетные записи, активы, NFTs, роли, разрешения, триггеры, данные исполнителя и другие зарегистрированные объекты модели данных.- заданные хэши блока и последняя заданная высота
- индексы транзакции к блоку, используемые для запросов и полученных расписок
- текущая и предыдущая топология обязательств, используемая в консенсусе
- индексы в памяти, полученные из обязательных блоков, такие как обязательства по доступности данных, курсоры приема, намерения пин и маркеры проекции запроса
- изображения конфигурации runtime, необходимые для выполнения детерминистических блоков, такие как криптография, управление, трубопровод, содержание, расчет и настройки Nexus
Запросы обычно получают только для чтения StateView над этими структурами. Посмотр является последовательным снимком для выполнения запроса; он не позволяет прямой мутации WSV.
Как изменяется WSV
Изменения WSV выполняются на этапе до их совершения. Исполнение блока создает перекрытие состояния по объему блока, и каждая принятая транзакция применяет свои инструкции в перекрытии по объему транзакции. Временные триггеры оцениваются после эффектов транзакций для блока.
После того, как консенсус назначает блок, пир сначала зачисляет заданный блок в Kura. Если этот шаг зачисляния не удается, WSV не продвигается, и цепь консенсуса пытается перезагрузить полезную нагрузку блока. Когда блок принимается в очередь Kura, Iroha применяет эффекты блока после исполнения, обновляет полученные индексы и совершает этапные изменения WSV под блокировкой состояния. Это мешает читателям наблюдать за частично обязательным блоком.
Критическое правило консенсуса заключается в том, что сверстники должны достичь одного и того же уровня WSV Отправление локальных редактирований на WSV данные обходят инструкции и заставляют сверстников не соглашаться во время проверки или повторного воспроизведения.
Начало и воспроизведение
При запуске Iroha сначала инициирует Kura и узнает высоту сохранённого блока. Затем он пытается загрузить снимок состояния. Если нет никакого снижения, или если снимок отклоняется как восстановительный, Iroha создает первоначальное состояние и восстанавливает взятые блоки из Kura. Если снимок действителен, но позади Kura, воспроизводится только отсутствующий диапазон высоты.
Replay подтверждает каждый сохраненный блок, восстанавливает список коммитаций для этой высоты, применяет эффекты блока к WSV и обязывает полученное состояние. Это означает, что Kura является пути восстановления для WSV, в то время как снимки являются оптимизацией, которая избегает повторного воспроизведения всей цепочки.
Kura Хранение
Kura является постоянным блоковым хранилищем Iroha. Он хранит подписанные блоки и метаданные восстановления. В нем не хранится вторая изменяемая копия WSV.
Kura хранилище коренится на kura.store_dir. В этом корне данные блока разделены по полосе или сегменту.
| Путь . | Цель . |
|---|---|
blocks/<segment>/blocks.data | Совместные подписанные блочные полезные нагрузки с рамками Norito. |
blocks/<segment>/blocks.index | Фиксированный размер (start, length) вводит высоту блока карты в байтах в blocks.data. |
blocks/<segment>/blocks.hashes | Блокируйте хеш по высоте для быстрого поиска и проверки запуска. |
blocks/<segment>/blocks.count.norito | Устойчивый маркер обязательства, записывающий количество блочных индексов, которые безопасны в использовании. |
blocks/<segment>/da_blocks/ | Устраненные полезные нагрузки блоков, хранящиеся за пределами blocks.data, когда исполнение дискового бюджета выводит старые тела из горячего файла. |
blocks/<segment>/pipeline/sidecars.norito и sidecars.index | Боковые машины для восстановления трубопровода по высоте блока. |
blocks/<segment>/pipeline/roster_sidecars.norito и roster_sidecars.index | Недавние боковые машины, используемые для синхронизации блоков и воспроизведения. |
merge_ledger/<segment>.log | Записи с объединением, выровненные с обязательными блоками. |
commit-rosters.norito | Сохранение сертификатов обязательства и контрольных пунктов проверки для недавних блоков. |
Kura сохраняет компактный вектор в памяти для цепочки: каждая высота имеет хэш-блок и, возможно, корпус блока. Блок генезиса остается запасным, и последнее kura.blocks_in_memory Негенезистые блоки сохраняют свои тела в памяти. Kura файлы, когда это необходимо.
Во время инициирования, strict режим проверяет сохраненные блоки из полезных нагрузок блоков и переписывает хеш-файл при необходимости. fast режим начинается с хранения хэш/индексовых метаданных и возвращается к строгому инициированию, если эти метаданные несовместимы. Kura обнаруживает испорченный хвост, он сокращает хранение до последнего проверенного блока.
Kura пишет новые блоки через автора фона. Писатель добавляет полезные нагрузки блоков, хэши и индексные записи, затем продвигает прочный счет-маркер в соответствии с конфигурированной политикой fsync. При активном соблюдении диск-бюджета Kura может очистить отставные сегменты или выселить старые блоки в da_blocks/, сохраняя хэши и индексные записи доступными для проверки и поиска.