> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# IntentionKernel

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

В IntentionKernel зафиксированный блок превращается в торговое состояние. Это не виртуальная машина общего назначения, исполняющая произвольные программы: её набор инструкций — замкнутый набор финансовых операций, нужных площадке деривативов, и у каждой из них есть определённый эффект, который протокол понимает.

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

<h2 id="closed-world-execution">
  Исполнение в замкнутом мире
</h2>

Замкнуть набор инструкций — лишь один случай движения, которое ядро совершает четырежды. Каждый раз пространство возможного перечисляется заранее, а всё, что вне его, отвергается, а не обрабатывается.

<div className="dg" data-dg="kernel-closure">
  <div className="dg-c" style={{aspectRatio:"720 / 384"}}>
    <svg className="dg-w" viewBox="0 0 720 384" aria-hidden="true" />

    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"7.8125%",width:"20.8333%",height:"17.1875%"}}><span className="dg-t">Операции</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"22.5000%",top:"7.8125%",width:"41.6667%",height:"17.1875%"}}><span className="dg-s">Полезная нагрузка вне перечисленного набора — отклоняется на валидации, а не во время исполнения</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"65.8333%",top:"7.8125%",width:"34.1667%",height:"17.1875%"}}><span className="dg-s dg-ink--blue">Что именно было запрошено</span></div>
    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"28.1250%",width:"20.8333%",height:"17.1875%"}}><span className="dg-t">Истина</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"22.5000%",top:"28.1250%",width:"41.6667%",height:"17.1875%"}}><span className="dg-s">Считать поблочный рабочий набор авторитетным. Это журнал; источник — состояние движка</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"65.8333%",top:"28.1250%",width:"34.1667%",height:"17.1875%"}}><span className="dg-s dg-ink--sky">Что верно прямо сейчас</span></div>
    <div className="dg-b dg--yellow" style={{left:"0.0000%",top:"48.4375%",width:"20.8333%",height:"17.1875%"}}><span className="dg-t">Входы</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"22.5000%",top:"48.4375%",width:"41.6667%",height:"17.1875%"}}><span className="dg-s">Всё, что может отличаться на двух машинах: часы, энтропия, плавающая точка, порядок хеширования</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"65.8333%",top:"48.4375%",width:"34.1667%",height:"17.1875%"}}><span className="dg-s dg-ink--yellow">Получит ли другой узел те же байты</span></div>
    <div className="dg-b dg--green" style={{left:"0.0000%",top:"68.7500%",width:"20.8333%",height:"17.1875%"}}><span className="dg-t">Причинность</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"22.5000%",top:"68.7500%",width:"41.6667%",height:"17.1875%"}}><span className="dg-s">Изменение состояния без хозяина. Эффекты, не принадлежащие ни одной пользовательской транзакции, идут по системному каналу, а не по исключению</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"65.8333%",top:"68.7500%",width:"34.1667%",height:"17.1875%"}}><span className="dg-s dg-ink--green">Почему произошло именно это изменение</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"0.0000%",width:"20.8333%"}}><div className="dg-n">Замкнуто</div></div>
    <div className="dg-free" style={{left:"22.5000%",top:"0.0000%",width:"41.6667%"}}><div className="dg-n">Отвергается</div></div>
    <div className="dg-free" style={{left:"65.8333%",top:"0.0000%",width:"34.1667%"}}><div className="dg-n">И потому реестр отвечает</div></div>
    <div className="dg-free" style={{left:"0.0000%",top:"89.0625%",width:"100.0000%"}}><div className="dg-n">Четыре замыкания, одно движение: перечислить пространство заранее и отвергнуть всё, что вне его.</div></div>
  </div>
</div>

Это не четыре независимых достоинства. Каждое держит следующее: замыкание операций делает восстановимым *смысл* инструкции; единственное авторитетное состояние придаёт смысл слову «результат»; замыкание входов делает этот результат воспроизводимым не на этой машине; замыкание причинности позволяет пройти от результата к запросу, который его породил. Уберите одно — и цепочка ответственности рвётся именно в этом звене.

То, что четыре покупают вместе, стоит назвать, потому что традиционные площадки покупают то же самое куда дороже. Аудиторский след биржи собирается **рядом** с торговой системой и отправляется дальше в отчётность — поэтому он может с системой разойтись, поэтому сверка становится постоянной работой, и поэтому синхронизация часов между площадками — регуляторное требование, а не деталь реализации. Здесь второй записи, с которой надо сверяться, нет. Аудиторский след и есть исполнение.

Остальная часть страницы — эти четыре замыкания в подробностях.

<h2 id="the-instruction-set">
  Набор инструкций
</h2>

Всё, что может сделать участник или валидатор, — это одна из операций фиксированного типизированного набора:

| Группа                       | Операции                                                                                                                                                                             |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Ордера**                   | Выставление, отмена, замена и изменение — для лимитных, рыночных и условных форм, со сроком действия, режимом только уменьшения и связанными конструкциями тейк-профита / стоп-лосса |
| **Настройка счёта**          | Создание субсчетов, выбор плеча, режим маржи, режим позиций                                                                                                                          |
| **Переводы**                 | Между субсчетами, между счетами, а также ввод и вывод через [мост](/ru/protocol/architecture/bridge)                                                                                 |
| **Авторизация агента**       | Выдача и отзыв полномочий агенту, который торгует от имени счёта                                                                                                                     |
| **Операции с волтами**       | Создание, депозиты, выводы, настройка                                                                                                                                                |
| **Системная конфигурация**   | Листинг рынков, настройка комиссий, ступени плеча, параметры риска — санкционируются управлением протоколом                                                                          |
| **Выпускаемые валидаторами** | Обновления сертифицированных цен и переконфигурация                                                                                                                                  |

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

<h2 id="executing-a-block">
  Исполнение блока
</h2>

Исполнение — фиксированная последовательность стадий. Их порядок не деталь реализации: именно он решает, увидит ли ликвидация вызвавшую её цену и опередит ли отмена входящий агрессивный ордер.

<div className="dg" data-dg="kernel-stages">
  <div className="dg-c" style={{aspectRatio:"720 / 434"}}>
    <svg className="dg-w" viewBox="0 0 720 434" aria-hidden="true">
      <path className="dg-wire" d="M 150.00 69.33 L 150.00 80.93" />

      <path className="dg-head" d="M 150.00 87.33 L 145.60 80.93 L 154.40 80.93 Z" />

      <path className="dg-wire" d="M 150.00 130.67 L 150.00 142.27" />

      <path className="dg-head" d="M 150.00 148.67 L 145.60 142.27 L 154.40 142.27 Z" />

      <path className="dg-wire" d="M 150.00 192.00 L 150.00 203.60" />

      <path className="dg-head" d="M 150.00 210.00 L 145.60 203.60 L 154.40 203.60 Z" />

      <path className="dg-wire" d="M 150.00 253.33 L 150.00 264.93" />

      <path className="dg-head" d="M 150.00 271.33 L 145.60 264.93 L 154.40 264.93 Z" />

      <path className="dg-wire" d="M 150.00 314.67 L 150.00 326.27" />

      <path className="dg-head" d="M 150.00 332.67 L 145.60 326.27 L 154.40 326.27 Z" />
    </svg>

    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"6.9124%",width:"41.6667%",height:"8.1413%"}}><span className="dg-t">Цена</span><span className="dg-s">фиксация маркировочных цен</span></div>
    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"21.0445%",width:"41.6667%",height:"8.1413%"}}><span className="dg-t">Загрузка</span><span className="dg-s">счета и ордера блока</span></div>
    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"35.1767%",width:"41.6667%",height:"8.1413%"}}><span className="dg-t">Расчёт финансирования</span><span className="dg-s">потоки платежей</span></div>
    <div className="dg-b dg--orange" style={{left:"0.0000%",top:"49.3088%",width:"41.6667%",height:"8.1413%"}}><span className="dg-t">Риск</span><span className="dg-s">делеверидж волтов → ликвидация → ADL</span></div>
    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"63.4409%",width:"41.6667%",height:"8.1413%"}}><span className="dg-t">Сопоставление</span><span className="dg-s">до → сопоставление → после</span></div>
    <div className="dg-b dg--green" style={{left:"0.0000%",top:"77.5730%",width:"41.6667%",height:"8.1413%"}}><span className="dg-t">Финализация</span><span className="dg-s">сбор выходных данных, очистка</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"45.8333%",top:"6.9124%",width:"54.1667%",height:"8.1413%"}}><span className="dg-s">Каждая следующая стадия работает с одной ценой на инструмент, а не с движущейся</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"45.8333%",top:"35.1767%",width:"54.1667%",height:"8.1413%"}}><span className="dg-s">Расчёт по позициям в том виде, в каком они загружены</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"45.8333%",top:"49.3088%",width:"54.1667%",height:"8.1413%"}}><span className="dg-s">Принудительный поток отрабатывает раньше, чем допускается дискреционный</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"45.8333%",top:"63.4409%",width:"54.1667%",height:"8.1413%"}}><span className="dg-s">Работа после стадии «Риск» — причина того, что ликвидацию нельзя опередить ордером того же блока</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"45.8333%",top:"77.5730%",width:"54.1667%",height:"8.1413%"}}><span className="dg-s">Обнулённые позиции и опустевшие счета не сохраняются</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"0.0000%",width:"41.6667%"}}><div className="dg-n">Один блок, шесть стадий</div></div>
    <div className="dg-free" style={{left:"45.8333%",top:"0.0000%",width:"54.1667%"}}><div className="dg-n">Что решает это место</div></div>
    <div className="dg-free" style={{left:"0.0000%",top:"89.4009%",width:"100.0000%"}}><div className="dg-n">Условные ордера просматриваются и продвигаются внутри этой последовательности, поэтому срабатывание по ценам этого блока действует в нём же, а не в следующем.</div></div>
  </div>
</div>

**Цена** идёт первой и фиксирует маркировочные цены, которыми будет пользоваться весь остальной блок, поэтому каждая следующая стадия работает с одной ценой на инструмент, а не с движущейся. **Загрузка** подтягивает счета и ордера блока. **Расчёт финансирования** проводит платежи по позициям в том виде, в каком они загружены. **Риск** прогоняет три фазы по порядку — делеверидж волтов, затем ликвидация, затем автоделеверидж, — так что принудительный поток успевает отработать до того, как в блок допустят новый дискреционный. **Сопоставление** затем прогоняет собственные три фазы и порождает исполнения. **Финализация** собирает изменения и вычищает состояние, которому больше незачем существовать: обнулённые позиции и опустевшие счета.

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

<Note>
  Именно потому, что ликвидация идёт до сопоставления, её нельзя опередить ордером в том же блоке. К моменту сопоставления дискреционных ордеров ликвидационный поток уже отработал.
</Note>

<h2 id="two-kinds-of-state">
  Два вида состояния
</h2>

Ядро строго разделяет то, что сохраняется, и то, что остаётся черновиком.

<div className="dg" data-dg="kernel-state">
  <div className="dg-c" style={{aspectRatio:"720 / 300"}}>
    <svg className="dg-w" viewBox="0 0 720 300" aria-hidden="true">
      <path className="dg-wire dg--blue" d="M 195.00 104.00 L 254.60 104.00" />

      <path className="dg-head dg--blue" d="M 261.00 104.00 L 254.60 108.40 L 254.60 99.60 Z" />

      <path className="dg-wire dg--yellow" d="M 261.00 152.00 L 201.40 152.00" />

      <path className="dg-head dg--yellow" d="M 195.00 152.00 L 201.40 147.60 L 201.40 156.40 Z" />

      <path className="dg-wire dg--green" d="M 449.00 128.00 L 498.60 128.00" />

      <path className="dg-head dg--green" d="M 505.00 128.00 L 498.60 132.40 L 498.60 123.60 Z" />

      <path className="dg-wire dg--green dg-dash" d="M 615.00 177.00 L 615.00 232.00 L 95.00 232.00 L 95.00 183.40" />

      <path className="dg-head dg--green" d="M 95.00 177.00 L 99.40 183.40 L 90.60 183.40 Z" />
    </svg>

    <div className="dg-band" style={{left:"34.7222%",top:"18.6667%",width:"29.1667%",height:"46.6667%"}}><span className="dg-cap">пока исполняется блок</span></div>
    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"26.6667%",width:"26.3889%",height:"30.6667%"}}><span className="dg-t">Состояние движка</span><span className="dg-s">рынки · счета · стаканы · позиции · клиринговая палата</span><span className="dg-n">живёт между блоками</span></div>
    <div className="dg-b dg--yellow dg-dashed" style={{left:"36.9444%",top:"26.6667%",width:"24.7222%",height:"30.6667%"}}><span className="dg-t">Рабочий набор блока</span><span className="dg-s">цены · затронутые счета · исполнения · выходные данные</span><span className="dg-n">живёт один блок</span></div>
    <div className="dg-b dg--green" style={{left:"70.8333%",top:"26.6667%",width:"29.1667%",height:"30.6667%"}}><span className="dg-t">Зафиксированное состояние</span><span className="dg-s">по версиям · аутентифицировано</span><span className="dg-n">источник истины</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"87.3333%",width:"100.0000%"}}><div className="dg-n">Отслеживание изменений легко принять за источник истины. Изменения за блок дают детерминированные выходные данные, но состояние живёт не там.</div></div>
    <div className="dg-lbl" style={{left:"49.3056%",top:"77.3333%"}}>источник истины для восстановления движка</div>
    <div className="dg-lbl" style={{left:"31.6667%",top:"30.0000%"}}>чтение</div>
    <div className="dg-lbl" style={{left:"31.6667%",top:"55.3333%"}}>применение</div>
    <div className="dg-lbl" style={{left:"66.2500%",top:"37.3333%"}}>материализация</div>
  </div>
</div>

**Состояние движка** живёт между блоками: метаданные рынков, счета, стаканы заявок, состояние инструментов, состояние клиринговой палаты. Это ответ на вопрос «что верно прямо сейчас».

**Поблочный рабочий набор** существует, только пока блок исполняется: входы блока, зафиксированные в начале маркировочные цены, затронутые счета и ордера, собираемые выходные данные. Это журнал, а не источник истины.

Различие важно, потому что отслеживание изменений легко принять за источник истины. То, что изменилось за блок, идёт на сборку детерминированных выходных данных, но состояние живёт не там. Перепутать эти две вещи — значит получить систему, в которой ответ зависит от того, как вы спросили.

<h2 id="why-the-result-is-reproducible">
  Почему результат воспроизводим
</h2>

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

* **Арифметика с фиксированной запятой везде.** Расчётная математика работает на целочисленной фиксированной запятой с явной семантикой округления: округление вверх при отрицательных показателях в марже, вниз и вверх — в комиссиях. На пути расчётов нет плавающей запятой, потому что расхождение в округлении между двумя машинами — это форк.
* **Никаких системных часов.** Порядок внутри блока определяется канонической позицией, зафиксированной консенсусом, и отметкой времени блока, но никогда локальным временем.
* **Никакой случайности во время исполнения.** Всё, чему нужна случайность, выводит её детерминированно из состояния блокчейна.
* **Детерминированный обход.** Любая коллекция, порядок обхода которой виден в выходных данных, отсортирована, а не рандомизирована по хешу.

Одно следствие стоит назвать отдельно: «время» внутри блока — это зафиксированная позиция в нём, а значит, субмиллисекундного преимущества от колокации *внутри* блока не существует. Вместе с порядком приоритетов, где отмены выполняются раньше агрессивных выставлений, это структурная защита: вашу котировку в стакане не снимут ордером, пришедшим в том же блоке.

<h2 id="risk-formulas-are-pure">
  Формулы риска — чистые функции
</h2>

Формулы, которые определяют маржинальные требования, цены ликвидации, отбор для делевериджа, комиссии и лимиты открытого интереса, реализованы как **чистые функции без состояния**. Они принимают значения и возвращают значения; они не читают и не изменяют состояние реестра.

Изменения состояния запускает исключительно [клиринговая палата](/ru/protocol/architecture/clearinghouse): она вызывает эти функции и применяет результаты. Модули, которые держат состояние — счета, позиции, стаканы заявок, — хранят данные и предоставляют операции изменения, но сами не управляют бизнес-логикой.

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

<h2 id="output">
  Выходные данные
</h2>

Исполнение порождает записи состояния и события, каждое из которых привязано к вызвавшей его транзакции, плюс канал для системных эффектов, не принадлежащих ни одной пользовательской транзакции: расчёты финансирования, движения страхового фонда, счётчики блоков. Из них складываются выходные данные транзакций, которые фиксирует [слой состояния](/ru/protocol/architecture/state/model) и отдаёт [индексатор](/ru/protocol/architecture/indexer).

Ничто из происходящего внутри ядра не остаётся невидимым дальше по потоку. Если оно изменило состояние, оно есть в чьих-то выходных данных или в системном канале.

<h2 id="where-to-go-next">
  Что дальше
</h2>

<CardGroup cols={2}>
  <Card title="Сопоставление" href="/ru/protocol/architecture/matching">
    Стакан заявок, приоритет «цена — время» и то, как отрабатывают срок действия и предотвращение самосделок.
  </Card>

  <Card title="Клиринговая палата" href="/ru/protocol/architecture/clearinghouse">
    Единственный путь, которым меняются балансы, позиции и маржа.
  </Card>

  <Card title="Модель состояния" href="/ru/protocol/architecture/state/model">
    Во что превращаются выходные данные ядра после фиксации.
  </Card>

  <Card title="IntentionBFT" href="/ru/protocol/architecture/intention-bft">
    Откуда взялись порядок и цены.
  </Card>
</CardGroup>
