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

# ステートシンク

> チェーンを一度も見たことのないノードが現在のバージョンへ到達する方法と、その位置に留まり続ける方法です。

ネットワークに参加するノードは、2つの問いに答えなければなりません。チェーンの現在地までどうやって到達するか、そこにどうやって留まり続けるかです。ステートシンクはその両方に答えます。両者のトレードオフは隠されておらず、明示されています。

<h2 id="two-modes-of-catching-up">
  追いつき方は2通り
</h2>

ブートストラップ（何もない状態から現在のバージョンへ到達すること）には、根本的に異なる2つのやり方があります。

**履歴をリプレイする**。ジェネシスから始めて前へ進みます。すべてのトランザクションを実行し直すか、実行がすでに生成した出力を適用するかのいずれかです。結果として得られるのは、履歴全体（すべてのバージョン、すべての証明、すべてのトランザクション）を保持したノードです。そのぶん遅く、チェーンが動き続けるほど日ごとに遅くなります。

**現在の状態をダウンロードする**。履歴を飛ばし、最新バージョン時点の状態のキーと値を取得して、コミット済みのルートに照らして検証します。ノードはごくわずかな時間で現在に追いつきますが、チェーンがそこに至った経緯については何も知りません。

<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>
  これは運用上の判断であり、何も考えずに受け入れてよいデフォルトではありません。現在の状態をダウンロードしたノードは、過去に関するクエリに答えられず、あるポジションが現在の姿になった経緯も説明できません。読むべき履歴を持っていないからです。[インデクサー](/ja/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="/ja/protocol/architecture/state/storage">
    同期を検証可能にしている構造です。
  </Card>

  <Card title="ノードを運用する" href="/ja/developers/run-a-node">
    ノードの役割と、運用について問い合わせる方法です。
  </Card>

  <Card title="ネットワークトポロジー" href="/ja/protocol/architecture/intention-bft">
    同期中のノードが話している相手が、どのティアのノードなのかです。
  </Card>

  <Card title="インデクサー" href="/ja/protocol/architecture/indexer">
    現在の状態では答えられないことに、履歴がどう答えるのかです。
  </Card>
</CardGroup>
