> ## 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のコンセンサスプロトコルであり、金融インフラ向けに拡張したHotStuff系のBFTプロトコルです。安全性は障害しきい値の範囲内で無条件に成り立ち、生存性はネットワークが安定したあとに成り立ちます。

ここでのコンセンサスは、汎用チェーンのコンセンサスがやらないことを二つやります。**順序**を第一級のオブジェクトとしてコミットすることと、同じイベントの中で**認証済み価格ベクトル**をコミットすることです。[カーネル](/ja/protocol/architecture/kernel)が実行について保証できることはすべて、この二つが実行開始前に確定していることに依存します。

<h2 id="model">
  モデル
</h2>

IntentionBFTは、総ステークの3分の1までを支配するビザンチン攻撃者を許容します。したがって正直なステークは常に3分の2を超え、標準的なクォーラムは、合計ステークが3分の2を超えるバリデータの任意の集合です。これらのページではこれを\*\*$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$の署名集約を連続して集め、フェーズは隣接するラウンドにまたがってパイプライン化されます。そのため通常のケースでは、ブロックは2回のネットワーク往復でファイナリティに達します。楽観的応答性のもとでは進行は実際のメッセージ遅延で抑えられ、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](/ja/protocol/architecture/oracle)を動かします。sidecarは取引所のデータを集め、銘柄ごとにインデックス価格を生成します。バリデータはその価格を取得し、設定されたしきい値に対する鮮度も含めて検証したうえで署名し、署名済みの提出をコンセンサスネットワークメッセージとして他のバリデータへgossipします。認証済み価格はエポックとラウンドごとに組み立てられブロックに載るため、トランザクションをコミットする署名は、それらのトランザクションが決済される価格も同時にコミットします。

バリデータがブロックを提案できるのは、現在のラウンドについて有効な価格観測を提示できる場合だけです。したがって価格の可用性はブロック生成の前提条件であって、実行が見つかることを期待する入力ではありません。

<Warning>
  これは価格をトランザクションに結び付けるだけで、価格が正しいことを保証するものではありません。コンセンサスが認証するのは、バリデータのクォーラムがこのラウンドでこれらの観測を提出したという事実です。元になった取引所が正確だったかどうかは別の問題であり、[オラクル](/ja/protocol/architecture/oracle)ページの集約ルールで扱い、[リスク開示](/ja/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、カーネル実行、ストレージです。投票する参加者はバリデータだけです。

**バリデータ用フルノード**は、バリデータのすぐ後ろに位置します。コミット済みブロックを追跡して実行しますが、投票はしません。その目的は遮断です。公開の読み取りトラフィックとピア接続を引き受け、バリデータがインターネットに直接さらされないようにします。

**パブリックフルノード**は開放されたティアです。誰でも運用できます。チェーンを追跡し、コミット済みブロックを実行し、読み取りに応答し、下流のシステムへデータを供給します。

**クライアント**（フロントエンド、取引エージェント、マーケットメイカー、インデクサー）は、バリデータではなくフルノードに接続します。最も低遅延で最も完全なビューが必要なクライアントは、他人のフルノードに依存せず自分でフルノードを運用します。

ネットワークに参加するノードは、既定ではジェネシスからリプレイしません。新しいノードが追いつく方法は[ステートシンク](/ja/protocol/architecture/state/sync)を参照してください。

<h2 id="where-to-go-next">
  次に読む
</h2>

<CardGroup cols={2}>
  <Card title="メモリプール" href="/ja/protocol/architecture/mempool">
    何がどの順序でコンセンサスに到達し、何が破棄されるのかです。
  </Card>

  <Card title="IntentionKernel" href="/ja/protocol/architecture/kernel">
    順序と価格がコミットされたあと、ブロックに何が起きるのかです。
  </Card>

  <Card title="オラクル" href="/ja/protocol/architecture/oracle">
    バリデータが署名する前に、インデックス価格がどう作られるのかです。
  </Card>

  <Card title="ノードを運用する" href="/ja/developers/run-a-node">
    バリデータ集合が閉じている理由と、参加について問い合わせる方法です。
  </Card>
</CardGroup>
