> ## 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.

# IntentionBFT

> Консенсус: как порядок и сертифицированный вектор цен фиксируются вместе и как устроена топология сети.

IntentionBFT — протокол консенсуса Intention: византийски отказоустойчивый (BFT) протокол семейства HotStuff, расширенный под финансовую инфраструктуру. Безопасность держится безусловно при соблюдении порога отказов; живость — после стабилизации сети.

Консенсус делает здесь две вещи, которых консенсус блокчейна общего назначения не делает: он фиксирует **порядок** как полноценный объект и фиксирует **сертифицированный вектор цен** в том же событии. Всё, что [ядро](/ru/protocol/architecture/kernel) может гарантировать об исполнении, держится на том, что и порядок, и цены решены до начала исполнения.

<h2 id="model">
  Модель
</h2>

IntentionBFT выдерживает византийского противника, контролирующего до трети всей ставки. Честная ставка поэтому всегда составляет больше двух третей, а стандартный кворум — это любой набор валидаторов, чья суммарная ставка превышает две трети; на этих страницах он называется **кворумом $2f+1$ по весу ставки**. Сеть частично синхронна: до точки стабилизации задержки произвольны, после неё задержки между честными валидаторами ограничены.

<div className="dg" data-dg="bft-prices">
  <div className="dg-c" style={{aspectRatio:"720 / 318"}}>
    <svg className="dg-w" viewBox="0 0 720 318" aria-hidden="true">
      <path className="dg-wire" d="M 163.00 78.00 L 176.60 78.00" />

      <path className="dg-head" d="M 183.00 78.00 L 176.60 82.40 L 176.60 73.60 Z" />

      <path className="dg-wire" d="M 350.00 78.00 L 363.60 78.00" />

      <path className="dg-head" d="M 370.00 78.00 L 363.60 82.40 L 363.60 73.60 Z" />

      <path className="dg-wire" d="M 537.00 78.00 L 550.60 78.00" />

      <path className="dg-head" d="M 557.00 78.00 L 550.60 82.40 L 550.60 73.60 Z" />
    </svg>

    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"8.1761%",width:"22.0833%",height:"32.7044%"}}><span className="dg-t">Оракульный sidecar</span><span className="dg-s">у каждого валидатора</span></div>
    <div className="dg-b dg--blue" style={{left:"25.9722%",top:"8.1761%",width:"22.0833%",height:"32.7044%"}}><span className="dg-t">Валидатор проверяет и подписывает</span><span className="dg-s">в том числе свежесть по настроенным порогам</span></div>
    <div className="dg-b dg--blue" style={{left:"51.9444%",top:"8.1761%",width:"22.0833%",height:"32.7044%"}}><span className="dg-t">Gossip между валидаторами</span><span className="dg-s">как сообщение сети консенсуса</span></div>
    <div className="dg-b dg--green" style={{left:"77.9167%",top:"8.1761%",width:"22.0833%",height:"32.7044%"}}><span className="dg-t">Сертифицированные цены</span><span className="dg-s">по эпохам и раундам</span></div>
    <div className="dg-b dg--orange dg-left" style={{left:"0.0000%",top:"48.4277%",width:"100.0000%",height:"21.3836%"}}><span className="dg-t">Доступность цены управляет производством блоков</span><span className="dg-s">Валидатор имеет право предложить блок, только если может предъявить валидные наблюдения цен за текущий раунд, — поэтому подписи, фиксирующие транзакции, фиксируют и цены, по которым эти транзакции рассчитываются.</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"75.4717%",width:"100.0000%",height:"19.4969%"}}><span className="dg-t">Чего это не утверждает</span><span className="dg-s">Это связывает цену с транзакцией, но не делает цену правильной: консенсус сертифицирует, что кворум валидаторов отправил эти наблюдения в этом раунде, и не более того.</span></div>
  </div>
</div>

У каждого раунда есть назначенный лидер. Внутри раунда предложение собирает последовательные агрегаты подписей $2f+1$, а фазы конвейеризуются между соседними раундами, поэтому в обычном случае блок достигает финальности за два сетевых обхода. При оптимистичной отзывчивости скорость продвижения ограничена фактической задержкой сообщений; нарастающая пауза, которой управляет pacemaker, включается, только когда сеть враждебна или расколота.

<h2 id="committing-an-ordering">
  Фиксация порядка
</h2>

Порядок транзакций внутри блока поднят до объекта, который фиксирует консенсус, а не оставлен побочным продуктом исполнения. Хеш блока покрывает упорядоченную полезную нагрузку, поэтому любая перестановка после консенсуса делает недействительными подписи, которыми он был зафиксирован.

Следствие: как только блок финализирован, кворум $2f+1$ по весу ставки подписал обязательство именно об этом порядке, и ни один честный валидатор не подписал другой порядок тех же транзакций в том же раунде. А раз исполнение идёт последовательно поверх этого зафиксированного порядка, детерминированное воспроизведение перестаёт быть внутренней договорённостью реализации и становится свойством, которое может проверить кто угодно.

<Note>
  Свобода лидера внутри одного предложения — какие из доступных пакетов включить и как их расположить — остаётся остаточной поверхностью атаки; её смягчают репутация лидера и то, что без валидных наблюдений цен лидер вообще не может произвести блок. Более сильные конструкции честного упорядочивания рассматриваются как кандидат на будущее обновление.
</Note>

<h2 id="batch-availability">
  Доступность пакетов
</h2>

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

Валидаторы непрерывно распространяют пакеты транзакций в фоне. Каждый пакет подтверждается, пока его источник не сможет доказать доступность $2f+1$ по весу ставки, и только тогда предложение может на него сослаться — по дайджесту, а не по содержимому. Сообщения консенсуса остаются небольшими независимо от пропускной способности, а зафиксированный блок всегда воспроизводим, потому что ни один блок не может ссылаться на данные, которые держало лишь византийское меньшинство.

<h2 id="certifying-prices">
  Сертификация цен
</h2>

Валидаторы — это ещё и наблюдатели цен, а блок несёт в себе те цены, по которым он был исполнен.

<div className="dg" data-dg="bft-topology">
  <div className="dg-c" style={{aspectRatio:"720 / 322"}}>
    <svg className="dg-w" viewBox="0 0 720 322" aria-hidden="true">
      <path className="dg-wire dg-soft" d="M 215.00 95.00 L 215.00 99.00" />

      <path className="dg-wire dg-soft" d="M 215.00 167.00 L 215.00 171.00" />

      <path className="dg-wire dg-soft" d="M 215.00 239.00 L 215.00 243.00" />
    </svg>

    <div className="dg-b dg--blue dg-left" style={{left:"0.0000%",top:"9.3168%",width:"59.7222%",height:"19.2547%"}}><span className="dg-t">Валидаторы</span><span className="dg-s">консенсус · мемпул · оракульный sidecar · ядро · хранилище</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"63.6111%",top:"9.3168%",width:"36.3889%",height:"19.2547%"}}><span className="dg-s">Единственные, кто голосует</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"0.0000%",top:"31.6770%",width:"59.7222%",height:"19.2547%"}}><span className="dg-t">Полные узлы валидаторов</span><span className="dg-s">следуют за блоками и исполняют их; не голосуют</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"63.6111%",top:"31.6770%",width:"36.3889%",height:"19.2547%"}}><span className="dg-s">Изоляция: они принимают публичный трафик чтения и соединения с пирами, чтобы валидаторы не были открыты в интернет</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"0.0000%",top:"54.0373%",width:"59.7222%",height:"19.2547%"}}><span className="dg-t">Публичные полные узлы</span><span className="dg-s">запустить может любой; следуют, исполняют, отдают чтения</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"63.6111%",top:"54.0373%",width:"36.3889%",height:"19.2547%"}}><span className="dg-s">Открытый уровень</span></div>
    <div className="dg-b dg--green dg-left" style={{left:"0.0000%",top:"76.3975%",width:"59.7222%",height:"19.2547%"}}><span className="dg-t">Клиенты</span><span className="dg-s">фронтенды · торговые агенты · маркет-мейкеры · индексаторы</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"63.6111%",top:"76.3975%",width:"36.3889%",height:"19.2547%"}}><span className="dg-s">Подключаются к полным узлам, а не к валидаторам. Клиент, которому нужна самая быстрая и полная картина, запускает собственный.</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"0.0000%",width:"59.7222%"}}><div className="dg-n">Четыре уровня, от консенсуса вовне</div></div>
    <div className="dg-free" style={{left:"63.6111%",top:"0.0000%",width:"36.3889%"}}><div className="dg-n">Зачем нужен уровень</div></div>
  </div>
</div>

Каждый валидатор запускает собственный [оракульный sidecar](/ru/protocol/architecture/oracle), который собирает данные площадок и выдаёт индексную цену по каждому инструменту. Валидатор забирает эту цену, проверяет её — в том числе свежесть относительно настроенных порогов, — подписывает и рассылает подписанную отправку другим валидаторам через gossip как сообщение сети консенсуса. Сертифицированные цены собираются по эпохам и раундам и переносятся в блок, поэтому подписи, фиксирующие транзакции, фиксируют и цены, по которым эти транзакции рассчитываются.

Валидатор имеет право предложить блок, только если может предъявить валидные наблюдения цен за текущий раунд. Поэтому доступность цены — предусловие производства блока, а не входные данные, которые исполнение надеется найти.

<Warning>
  Это связывает цену с транзакцией, но не делает цену правильной. Консенсус сертифицирует, что кворум валидаторов отправил эти наблюдения в этом раунде. Насколько точны были исходные площадки — отдельный вопрос: его разбирают правила агрегации на странице [Оракул](/ru/protocol/architecture/oracle), а границы задаёт [раскрытие рисков](/ru/protocol/security/risks).
</Warning>

<h2 id="leader-reputation">
  Репутация лидера
</h2>

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

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

<h2 id="epochs-and-reconfiguration">
  Эпохи и переконфигурация
</h2>

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

<h2 id="network-topology">
  Топология сети
</h2>

<div className="dg" data-dg="bft-round">
  <div className="dg-c" style={{aspectRatio:"720 / 318"}}>
    <svg className="dg-w" viewBox="0 0 720 318" aria-hidden="true">
      <path className="dg-rule dg-dash" d="M 90 40 L 90 266" />

      <path className="dg-rule dg-dash" d="M 360 40 L 360 266" />

      <path className="dg-rule dg-dash" d="M 630 40 L 630 266" />

      <path className="dg-wire dg--blue" d="M 94.00 64.00 L 349.60 64.00" />

      <path className="dg-head dg--blue" d="M 356.00 64.00 L 349.60 68.40 L 349.60 59.60 Z" />

      <path className="dg-wire dg--sky" d="M 364.00 92.00 L 414.00 92.00 L 414.00 114.00 L 374.40 114.00" />

      <path className="dg-head dg--sky" d="M 368.00 114.00 L 374.40 109.60 L 374.40 118.40 Z" />

      <path className="dg-wire dg--sky dg-dash" d="M 356.00 146.00 L 100.40 146.00" />

      <path className="dg-head dg--sky" d="M 94.00 146.00 L 100.40 141.60 L 100.40 150.40 Z" />

      <path className="dg-wire dg--blue" d="M 94.00 218.00 L 349.60 218.00" />

      <path className="dg-head dg--blue" d="M 356.00 218.00 L 349.60 222.40 L 349.60 213.60 Z" />

      <path className="dg-wire dg--green dg-dash" d="M 364.00 254.00 L 619.60 254.00" />

      <path className="dg-head dg--green" d="M 626.00 254.00 L 619.60 258.40 L 619.60 249.60 Z" />
    </svg>

    <div className="dg-b dg--blue" style={{left:"2.2222%",top:"0.0000%",width:"20.5556%",height:"9.4340%"}}><span className="dg-t">Лидер</span></div>
    <div className="dg-b dg--sky" style={{left:"39.7222%",top:"0.0000%",width:"20.5556%",height:"9.4340%"}}><span className="dg-t">Валидаторы</span></div>
    <div className="dg-b dg--green" style={{left:"77.2222%",top:"0.0000%",width:"20.5556%",height:"9.4340%"}}><span className="dg-t">Блокчейн</span></div>
    <div className="dg-b dg-dashed dg-tight dg-solid" style={{left:"14.4444%",top:"52.2013%",width:"33.6111%",height:"8.1761%"}}><span className="dg-s">Агрегат 2f+1 по весу ставки</span></div>
    <div className="dg-b dg--green" style={{left:"68.8889%",top:"86.7925%",width:"31.1111%",height:"11.9497%"}}><span className="dg-s">Порядок и цены теперь неизменны</span></div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"15.0943%",width:"34.4444%",whiteSpace:"normal"}}>Предложить блок — дайджесты пакетов и сертифицированные цены</div>
    <div className="dg-lbl" style={{left:"72.7778%",top:"32.3899%",width:"26.3889%",whiteSpace:"normal"}}>Проверить доступность, порядок и цены</div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"40.8805%"}}>Голос</div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"63.5220%"}}>Сертифицировать раунд</div>
    <div className="dg-lbl" style={{left:"68.7500%",top:"74.8428%"}}>Зафиксировать</div>
  </div>
</div>

**Валидаторы** участвуют в консенсусе. Каждый запускает весь стек: консенсус, мемпул, оракульный sidecar, исполнение ядра и хранилище. Голосуют только они.

**Полные узлы валидаторов** стоят непосредственно за валидаторами. Они следуют за зафиксированными блоками и исполняют их, но не голосуют. Их назначение — изоляция: они принимают на себя публичный трафик чтения и соединения с пирами, чтобы валидаторы не были напрямую открыты в интернет.

**Публичные полные узлы** — открытый уровень. Запустить такой может кто угодно. Они следуют за блокчейном, исполняют зафиксированные блоки, обслуживают чтения и питают системы ниже по потоку.

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

Узлы, входящие в сеть, по умолчанию не воспроизводят историю с генезиса; как новый узел догоняет сеть, описано в [синхронизации состояния](/ru/protocol/architecture/state/sync).

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

<CardGroup cols={2}>
  <Card title="Мемпул" href="/ru/protocol/architecture/mempool">
    Что доходит до консенсуса, в каком порядке и что отбрасывается.
  </Card>

  <Card title="IntentionKernel" href="/ru/protocol/architecture/kernel">
    Что происходит с блоком после того, как его порядок и цены зафиксированы.
  </Card>

  <Card title="Оракул" href="/ru/protocol/architecture/oracle">
    Как получается индексная цена до того, как её подпишет валидатор.
  </Card>

  <Card title="Запуск узла" href="/ru/developers/run-a-node">
    Почему набор валидаторов закрыт и как узнать о вступлении в него.
  </Card>
</CardGroup>
