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

# 狀態同步

> 從未見過這條鏈的節點，如何到達當前版本，又如何保持在當前版本上。

節點加入網路，必須回答兩個問題：我要怎麼走到這條鏈現在的位置，以及走到之後怎麼待住。狀態同步回答的就是這兩個問題，而兩者之間的取捨是攤開來的，不是藏起來的。

<h2 id="two-modes-of-catching-up">
  追趕的兩種模式
</h2>

引導（bootstrapping）就是從零走到當前版本，做法有兩種，而且根本不同。

**重放歷史。** 從創世開始往前推進：要嘛把每筆交易重新執行一遍，要嘛套用執行早已產生的輸出。結果是一個持有完整歷史的節點，每個版本、每份證明、每筆交易都在。這條路也很慢，而且這條鏈每多跑一天就更慢。

**下載當前狀態。** 跳過歷史，直接取最新版本上的狀態鍵與值，對照已提交的根驗證。節點只花一小部分時間就追上了當下，代價是對這條鏈怎麼走到這裡一無所知。

<div className="dg" data-dg="state-sync">
  <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--blue" d="M 134.00 126.00 L 159.60 126.00" />

      <path className="dg-head dg--blue" d="M 166.00 126.00 L 159.60 130.40 L 159.60 121.60 Z" />

      <path className="dg-wire dg--sky" d="M 324.00 126.00 L 356.54 75.38" />

      <path className="dg-head dg--sky" d="M 360.00 70.00 L 360.24 77.76 L 352.84 73.00 Z" />

      <path className="dg-wire dg--yellow" d="M 324.00 126.00 L 356.54 176.62" />

      <path className="dg-head dg--yellow" d="M 360.00 182.00 L 352.84 179.00 L 360.24 174.24 Z" />

      <path className="dg-wire dg--green" d="M 568.00 70.00 L 578.66 119.74" />

      <path className="dg-head dg--green" d="M 580.00 126.00 L 574.36 120.66 L 582.96 118.82 Z" />

      <path className="dg-wire dg--green" d="M 568.00 182.00 L 578.66 132.26" />

      <path className="dg-head dg--green" d="M 580.00 126.00 L 582.96 133.18 L 574.36 131.34 Z" />
    </svg>

    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"30.4348%",width:"18.0556%",height:"17.3913%"}}><span className="dg-t">新節點</span></div>
    <div className="dg-b dg--yellow dg-round" style={{left:"23.6111%",top:"29.1925%",width:"20.8333%",height:"19.8758%"}}><span className="dg-t">引導模式</span></div>
    <div className="dg-b dg--sky" style={{left:"50.5556%",top:"6.2112%",width:"27.7778%",height:"31.0559%"}}><span className="dg-t">重放歷史</span><span className="dg-s">從創世開始重新執行，或套用已儲存的輸出</span><span className="dg-n">很慢，而且這條鏈每多跑一天就更慢</span></div>
    <div className="dg-b dg--yellow" style={{left:"50.5556%",top:"40.9938%",width:"27.7778%",height:"31.0559%"}}><span className="dg-t">下載當前狀態</span><span className="dg-s">最新版本上的鍵與值，對照已提交的根驗證</span><span className="dg-n">只花一小部分時間就追上當下</span></div>
    <div className="dg-b dg--green" style={{left:"81.1111%",top:"25.4658%",width:"18.8889%",height:"27.3292%"}}><span className="dg-t">當前版本</span><span className="dg-s">之後持續同步</span></div>
    <div className="dg-b dg--orange dg-left" style={{left:"0.0000%",top:"78.2609%",width:"100.0000%",height:"18.0124%"}}><span className="dg-t">兩條路徑並不等價</span><span className="dg-s">下載當前狀態起來的節點，提供不了歷史查詢，也答不出某個部位是怎麼走到今天這一步的。為索引器或稽核供給資料的節點，需要的正是被跳過的那段歷史。</span></div>
  </div>
</div>

重放這條路徑裡還有一層選擇：重新執行交易、套用已儲存的輸出，或者讓節點在每一處自行挑比較快的那種。重新執行是更強的驗證，因為它把結果重算出來，而不是信任一份記錄下來的結果；套用輸出則比較快。混合模式之所以存在，是因為正確答案會隨節點落後的程度而變。

<Note>
  這是維運決定，不是一個可以不加思索就接受的預設值。節點若是下載當前狀態起來的，就提供不了歷史查詢，也答不出某個部位是怎麼走到今天這一步的：它沒有歷史可讀。為[索引器](/zh-Hant/protocol/architecture/indexer)或稽核流程提供服務的節點，需要的正是被跳過的那段歷史。
</Note>

<h2 id="staying-current">
  保持在當前版本
</h2>

到了當前版本之後，節點靠消費陸續到達的已提交區塊跟上進度，同樣可以選執行交易或套用輸出，驗證強度與速度之間還是同一套取捨。

和引導的差別在於，這裡的落差小而且恆定，不是大而且逐漸縮小。節點落後到一定程度就重新走引導路徑，不會想用增量方式去補一個任意大小的落差。

<h2 id="how-data-moves">
  資料如何流動
</h2>

同步不是一個節點向另一個節點索要一段區塊，而是拆成若干層，好讓任何單一對等節點都不會變成相依對象，也讓任何單點故障都拖不停進度。

| 層         | 職責                             |
| --------- | ------------------------------ |
| **儲存服務**  | 向其他節點提供資料：交易、輸出、狀態值，以及隨附的證明    |
| **資料用戶端** | 選擇對等節點、追蹤誰有哪些資料、發送請求，並處理失敗的請求  |
| **串流服務**  | 把「把我從這裡帶到那裡」變成一條有序的、經過驗證的資料塊串流 |
| **驅動器**   | 決定節點接下來需要什麼，並套用到達的內容           |

值得理解的一個推論是：正在同步的節點並不信任對等節點。每個資料塊到達時都帶著一份證明，對照的是網路已經提交的根；對等節點若給出不一致的資料，直接拒絕，不會採信。選擇對等節點是效能決定，不是信任決定。

<h2 id="verification">
  驗證
</h2>

狀態同步裡沒有任何東西是憑發送方是誰就接受的。

狀態值對照已提交的狀態根驗證，交易和輸出對照累加器驗證。節點引導完成之後，狀態的根會和驗證者法定人數所簽署的一致，快速路徑安全就安全在這裡：下載當前狀態跳過的是歷史，不是驗證。

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

<CardGroup cols={2}>
  <Card title="儲存與證明" href="/zh-Hant/protocol/architecture/state/storage">
    使同步可驗證的那些結構。
  </Card>

  <Card title="運行節點" href="/zh-Hant/developers/run-a-node">
    節點角色，以及如何諮詢節點營運事宜。
  </Card>

  <Card title="網路拓撲" href="/zh-Hant/protocol/architecture/intention-bft">
    正在同步的對等節點在和哪一層節點通訊。
  </Card>

  <Card title="索引器" href="/zh-Hant/protocol/architecture/indexer">
    歷史能回答而當前狀態無法回答的問題。
  </Card>
</CardGroup>
