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

# 預言機

> 指數價格如何從各交易場所的資料產出、由驗證者認證，並在消費它的那個區塊裡完成提交。

Intention 不使用外部的預言機委員會。**驗證者集合本身就是預言機。** 每個驗證者對每個商品的價格產出自己的看法並簽署；同一個共識事件既提交那些據以結算的交易，也在其中認證出一個結果。

這裡有兩個不同的步驟，回答的是不同的問題。聚合問的是**這個商品值多少**，在每個驗證者內部、在共識路徑之外進行。認證問的是**網路在這一輪認定它值多少**，在共識內部進行。

<div className="dg" data-dg="oracle-path">
  <div className="dg-c" style={{aspectRatio:"720 / 316"}}>
    <svg className="dg-w" viewBox="0 0 720 316" aria-hidden="true">
      <path className="dg-wire" d="M 176.00 90.00 L 176.00 101.60" />

      <path className="dg-head" d="M 176.00 108.00 L 171.60 101.60 L 180.40 101.60 Z" />

      <path className="dg-wire" d="M 176.00 152.00 L 176.00 163.60" />

      <path className="dg-head" d="M 176.00 170.00 L 171.60 163.60 L 180.40 163.60 Z" />

      <path className="dg-wire" d="M 550.00 90.00 L 550.00 101.60" />

      <path className="dg-head" d="M 550.00 108.00 L 545.60 101.60 L 554.40 101.60 Z" />

      <path className="dg-wire" d="M 550.00 152.00 L 550.00 163.60" />

      <path className="dg-head" d="M 550.00 170.00 L 545.60 163.60 L 554.40 163.60 Z" />

      <path className="dg-wire dg--blue" d="M 341.00 130.00 L 384.60 130.00" />

      <path className="dg-head dg--blue" d="M 391.00 130.00 L 384.60 134.40 L 384.60 125.60 Z" />

      <path className="dg-wire dg--green" d="M 550.00 222.00 L 550.00 235.60" />

      <path className="dg-head dg--green" d="M 550.00 242.00 L 545.60 235.60 L 554.40 235.60 Z" />
    </svg>

    <div className="dg-band" style={{left:"0.0000%",top:"8.2278%",width:"48.8889%",height:"62.0253%"}}><span className="dg-cap">每個驗證者內部 — 在共識路徑之外</span></div>
    <div className="dg-band" style={{left:"52.7778%",top:"8.2278%",width:"47.2222%",height:"62.0253%"}}><span className="dg-cap">共識內部</span></div>
    <div className="dg-b" style={{left:"2.2222%",top:"15.8228%",width:"44.4444%",height:"11.3924%"}}><span className="dg-t">交易場所</span></div>
    <div className="dg-b dg--sky" style={{left:"2.2222%",top:"35.4430%",width:"44.4444%",height:"11.3924%"}}><span className="dg-t">預言機 sidecar</span><span className="dg-s">每個驗證者一個</span></div>
    <div className="dg-b dg--blue" style={{left:"2.2222%",top:"55.0633%",width:"44.4444%",height:"11.3924%"}}><span className="dg-t">驗證者驗證並簽署</span></div>
    <div className="dg-b dg--blue" style={{left:"55.0000%",top:"15.8228%",width:"42.7778%",height:"11.3924%"}}><span className="dg-t">在驗證者之間 gossip 擴散</span></div>
    <div className="dg-b dg--green" style={{left:"55.0000%",top:"35.4430%",width:"42.7778%",height:"11.3924%"}}><span className="dg-t">按紀元與輪次認證</span></div>
    <div className="dg-b dg--green" style={{left:"55.0000%",top:"55.0633%",width:"42.7778%",height:"11.3924%"}}><span className="dg-t">隨區塊攜帶</span></div>
    <div className="dg-b dg--green dg-left" style={{left:"0.0000%",top:"77.8481%",width:"100.0000%",height:"17.7215%"}}><span className="dg-t">內核 — 標記價格 · 保證金 · 強平 · 資金費</span><span className="dg-s">按同一個共識事件裡提交的價格結算</span></div>
  </div>
</div>

<h2 id="producing-an-index-price">
  產出一個指數價格
</h2>

每個驗證者都運行自己的預言機 sidecar，從多個交易場所採集資料，歸約成每個商品一個指數價格。這個歸約刻意不用簡單平均：平均值太容易被一個壞來源拉走。

<div className="dg" data-dg="oracle-aggregate">
  <div className="dg-c" style={{aspectRatio:"720 / 236"}}>
    <svg className="dg-w" viewBox="0 0 720 236" aria-hidden="true">
      <path className="dg-wire" d="M 100.67 84.00 L 114.27 84.00" />

      <path className="dg-head" d="M 120.67 84.00 L 114.27 88.40 L 114.27 79.60 Z" />

      <path className="dg-wire" d="M 225.33 84.00 L 238.93 84.00" />

      <path className="dg-head" d="M 245.33 84.00 L 238.93 88.40 L 238.93 79.60 Z" />

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

      <path className="dg-head" d="M 370.00 84.00 L 363.60 88.40 L 363.60 79.60 Z" />

      <path className="dg-wire" d="M 474.67 84.00 L 488.27 84.00" />

      <path className="dg-head" d="M 494.67 84.00 L 488.27 88.40 L 488.27 79.60 Z" />

      <path className="dg-wire" d="M 599.33 84.00 L 612.93 84.00" />

      <path className="dg-head" d="M 619.33 84.00 L 612.93 88.40 L 612.93 79.60 Z" />
    </svg>

    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"12.7119%",width:"13.4259%",height:"45.7627%"}}><span className="dg-t">過濾</span><span className="dg-s">非有限值與格式錯誤的值</span></div>
    <div className="dg-b dg--sky" style={{left:"17.3148%",top:"12.7119%",width:"13.4259%",height:"45.7627%"}}><span className="dg-t">中位數</span><span className="dg-s">在各來源之間</span></div>
    <div className="dg-b dg--sky" style={{left:"34.6296%",top:"12.7119%",width:"13.4259%",height:"45.7627%"}}><span className="dg-t">鉗制</span><span className="dg-s">各來源到中位數 ± 偏離帶</span></div>
    <div className="dg-b dg--sky" style={{left:"51.9444%",top:"12.7119%",width:"13.4259%",height:"45.7627%"}}><span className="dg-t">加權</span><span className="dg-s">按價差與穩定性</span></div>
    <div className="dg-b dg--sky" style={{left:"69.2593%",top:"12.7119%",width:"13.4259%",height:"45.7627%"}}><span className="dg-t">設上限</span><span className="dg-s">按場所等級</span></div>
    <div className="dg-b dg--green" style={{left:"86.5741%",top:"12.7119%",width:"13.4259%",height:"45.7627%"}}><span className="dg-t">指數價格</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"69.4915%",width:"100.0000%",height:"26.2712%"}}><span className="dg-t">這個先後順序就是設計</span><span className="dg-s">過濾先跑，是因為只要有一個無窮值活著進入中位數或加權和，後面的一切都被污染。鉗制而不是丟棄，讓每個來源都仍然計入，同時限定任何一個能拉多遠。</span></div>
    <div className="dg-free" style={{left:"0.0000%",top:"0.0000%",width:"100.0000%"}}><div className="dg-n">不是簡單平均 — 平均值太容易被一個壞來源拉走</div></div>
  </div>
</div>

**過濾。** 非有限值和格式錯誤的值，在接觸到任何下游環節之前就先丟掉。這個先後順序很重要：只要有一個無窮值活著進入中位數或加權和，整個結果就被污染了。

**鉗制到中位數。** 先在各來源之間取中位數，再把每個來源鉗制到圍繞中位數的一條偏離帶之內。偏離帶按商品設定，市場越深的地方越窄：

| 商品類別            | 中位數周圍的偏離帶 |
| --------------- | --------- |
| 主流加密資產（BTC、ETH） | 1%        |
| 穩定幣             | 0.5%      |
| 其他              | 3%        |

來源的報價落在偏離帶之外，不會被丟棄，而是被拉到偏離帶的邊緣上。這個區別很重要：丟棄會讓攻擊者得以縮小樣本；鉗制則讓每個來源都仍然計入，同時限定任何一個來源能把結果拉出多遠。

**先按品質加權，再設上限。** 鉗制後的各來源按加權平均合併，而不是等權。權重隨報價品質上升——價差越窄，權重越高——也隨穩定性上升；穩定性由近期成交量與更長期的日均值對比衡量，因此一家成交量異常飆升的場所不會藉此獲得影響力。

隨後權重按來源等級設上限，這樣無論某家場所的報價看起來多好，都無法單獨主導結果：

| 等級     | 權重上限 |
| ------ | ---- |
| 一級交易場所 | 0.45 |
| 二級交易場所 | 0.35 |

以不同貨幣計價的商品，在上述所有步驟之前先換算到統一的計價貨幣，這樣中位數取的是可比的數字，而不是混在一起的計價單位。

<Note>
  這裡的每一個常數都是政策決定，不是自然常數。偏離帶、等級劃分和權重上限都是配置項；某家場所的行為變了，或者新增一個來源，要調整的就是這些旋鈕。
</Note>

<h2 id="certifying-it">
  認證它
</h2>

sidecar 產出的指數價格，只是單個驗證者的看法。要把它變成網路可以據以結算的東西，這一步發生在共識裡。

驗證者從自己的 sidecar 取回價格，並**在簽署之前先驗證**——包括按配置的門檻檢查新鮮度，這樣 sidecar 一旦卡住，產出的是「沒有提交」，不是一份過時的提交。接著驗證者對價格資料簽署，把已簽署的提交當成一條共識網路訊息 gossip 給其他驗證者。

認證價格按紀元（epoch）和輪次組裝，並隨區塊提案攜帶。因此，提交區塊內交易的那些簽章，同時也提交了這些交易據以結算的價格——不存在單獨的預言機交易，也不存在價格從發布到被使用之間的窗口。

**拿不出本輪有效的價格觀測，驗證者就無法提議區塊。** 價格可用性是出塊的前提條件，不是執行時期望能找到的輸入。

<h2 id="index-price-and-mark-price">
  指數價格與標記價格
</h2>

認證出來的價格是**指數價格**，也就是網路對外部市場的看法。它不是交易實際成交的價格。

[內核](/zh-Hant/protocol/architecture/kernel)再從指數價格導出**標記價格**，經過平滑和限幅，讓指數上一次短暫的脫節不會連鎖引發強平。保證金、強平和資金費實際使用的是標記價格。交易側的說明見[標記價格](/zh-Hant/trading/mark-price)和[指數價格](/zh-Hant/trading/index-price)。

<h2 id="what-this-does-and-does-not-guarantee">
  它保證什麼，不保證什麼
</h2>

保證的是：一筆交易據以結算的價格，在提交這筆交易的那一輪已經由驗證者法定人數認證過，而且任何執行路徑都不可能讀到另一個價格。

不保證的是這個價格對不對。如果指數所依據的那些交易場所本身就錯了——例如其中幾家協同拉動，或者一次全市場範圍的脫節——鉗制和加權只能限定單個來源把結果推出多遠，無法憑空造出市場當時並沒有的資訊。

<Warning>
  價格是交易系統影響最大的外部輸入。這裡的抗操縱性是程度問題，不是有或沒有的二元屬性。仍然暴露在外的部分，見[風險揭露](/zh-Hant/protocol/security/risks)。
</Warning>

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

<CardGroup cols={2}>
  <Card title="IntentionBFT" href="/zh-Hant/protocol/architecture/intention-bft">
    認證如何綁進提交區塊的那同一批簽章。
  </Card>

  <Card title="清算所" href="/zh-Hant/protocol/architecture/clearinghouse">
    保證金、強平和資金費拿這個價格做什麼。
  </Card>

  <Card title="標記價格" href="/zh-Hant/trading/mark-price">
    指數如何變成推動部位的那個數字。
  </Card>

  <Card title="風險揭露" href="/zh-Hant/protocol/security/risks">
    價格風險還留在哪裡，可能帶來多大代價。
  </Card>
</CardGroup>
