> ## 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 協議。在故障門檻以內，安全性無條件成立；活性則要等網路穩定之後才成立。

這裡的共識做了兩件通用鏈的共識不做的事：把**順序**當成一等對象提交，並在同一個事件裡提交一組**認證過的價格向量**。[核心](/zh-Hant/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](/zh-Hant/protocol/architecture/oracle)，由它採集各交易場所的資料，為每個商品產出一個指數價格。驗證者取回這個價格，先做驗證——包括按配置的門檻檢查新鮮度——再簽章，然後把已簽章的提交作為一條共識網路訊息 gossip 給其他驗證者。認證價格按紀元和輪次組裝，並隨區塊攜帶，因此提交這些交易的簽章，同時也提交了這些交易據以結算的價格。

驗證者要提議區塊，必須拿得出當前輪次的有效價格觀測。價格可用性因此成了出塊的前提條件，不是執行時才指望能找到的輸入。

<Warning>
  這把價格綁到了交易上，但不會讓價格變得正確。共識認證的是「一個法定人數的驗證者在這一輪提交了這些觀測值」。底層交易場所準不準確是另一個問題，交由[預言機](/zh-Hant/protocol/architecture/oracle)頁面上的聚合規則處理，邊界則由[風險揭露](/zh-Hant/protocol/security/risks)界定。
</Warning>

<h2 id="leader-reputation">
  主節點聲譽
</h2>

主節點按確定性的權益加權輪替逐輪選出，另外疊了一層以滑動視窗為基礎的聲譽啟發式。反覆提案失敗的驗證者——這說明它不可用，或是有對抗行為——在後續選擇中會被降權，槽位重新分配給近期回應良好的驗證者；這樣一來，不可用的驗證者就不會佔著分到的槽位拖住進度。

由於價格觀測構成提案資格的門檻，聲譽機制還必須避免把主節點資格集中到行情連通性最好的那批驗證者手裡。一條場所多樣性要求——每個商品的觀測須取自多個相互獨立的來源——堵住了這條路。

<h2 id="epochs-and-reconfiguration">
  紀元與重新配置
</h2>

時間切成一個個紀元（epoch）。一個紀元之內，驗證者集合和大多數參數保持不變。到了紀元邊界，這些東西可以透過一次治理授權的重新配置改變：驗證者集合變更、共識參數變更、風險參數更新，以及緊急動作。切換是原子的：每個誠實驗證者都在同一個區塊高度看到同一次切換。

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

**驗證者**參與共識。每個驗證者都跑完整的技術堆疊：共識、記憶池（mempool）、預言機 sidecar、核心執行和儲存。它們是唯一投票的角色。

**驗證者全節點**直接位於驗證者之後。它們跟隨並執行已提交的區塊，但不投票。它們的作用是隔離：吸收公網的讀取流量和對等連線，讓驗證者不必直接暴露在開放網際網路上。

**公共全節點**是開放的一層。任何人都可以自己跑一個。它們跟隨鏈、執行已提交的區塊、提供讀取服務，並為下游系統供給資料。

**用戶端**——前端、交易代理人、造市商、索引器——連接的是全節點，不是驗證者。需要最低延遲、最完整視圖的用戶端，會自己跑一個全節點，不去依賴別人的。

加入網路的節點預設不會從創世區塊開始重放；新節點如何追上進度，參見[狀態同步](/zh-Hant/protocol/architecture/state/sync)。

<h2 id="where-to-go-next">
  後續閱讀
</h2>

<CardGroup cols={2}>
  <Card title="記憶池" href="/zh-Hant/protocol/architecture/mempool">
    什麼能到達共識、以什麼順序到達，以及什麼會被丟棄。
  </Card>

  <Card title="IntentionKernel" href="/zh-Hant/protocol/architecture/kernel">
    區塊的順序和價格提交之後，會發生什麼。
  </Card>

  <Card title="預言機" href="/zh-Hant/protocol/architecture/oracle">
    指數價格在驗證者簽章之前是怎麼產生的。
  </Card>

  <Card title="運行節點" href="/zh-Hant/developers/run-a-node">
    驗證者集合為什麼是封閉的，以及如何洽詢加入事宜。
  </Card>
</CardGroup>
