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

# Sinkronisasi state

> Bagaimana node yang belum pernah melihat chain mencapai versi terkini, dan bagaimana node itu bertahan di sana.

Node yang bergabung ke jaringan harus menjawab dua pertanyaan: bagaimana saya sampai ke posisi chain saat ini, dan bagaimana saya bertahan di sana. Sinkronisasi state menjawab keduanya, dan trade-off di antara keduanya dibuat eksplisit, bukan disembunyikan.

<h2 id="two-modes-of-catching-up">
  Dua cara menyusul
</h2>

Bootstrapping — mencapai versi terkini dari nol — bisa dilakukan dengan dua cara yang secara mendasar berbeda.

**Replay riwayatnya.** Mulai dari genesis dan bergerak maju, entah dengan mengeksekusi ulang setiap transaksi atau dengan menerapkan output yang sudah dihasilkan eksekusi. Hasilnya adalah node yang memegang seluruh riwayat: setiap versi, setiap bukti, setiap transaksi. Cara ini juga lambat, dan makin lambat setiap hari chain berjalan.

**Unduh state terkini.** Lewati riwayatnya dan ambil key beserta nilai state sebagaimana adanya pada versi terbaru, diverifikasi terhadap root yang terkomit. Node menjadi terkini dalam waktu yang jauh lebih singkat, dan tidak tahu apa-apa tentang bagaimana chain sampai ke sana.

<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">Node baru</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">Mode bootstrapping</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">Replay riwayatnya</span><span className="dg-s">eksekusi ulang atau terapkan output, dari genesis</span><span className="dg-n">lambat, makin lambat tiap hari chain berjalan</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">Unduh state terkini</span><span className="dg-s">key dan nilai pada versi terbaru, diverifikasi terhadap root terkomit</span><span className="dg-n">terkini dalam sepersekian waktunya</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">Versi terkini</span><span className="dg-s">sinkronisasi kontinu</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">Kedua jalur tidak setara</span><span className="dg-s">Node yang mengunduh state terkini tidak bisa melayani query historis atau menjelaskan asal-usul sebuah posisi. Node yang melayani indexer atau audit butuh riwayat yang dilewatkan.</span></div>
  </div>
</div>

Di dalam jalur replay masih ada pilihan lanjutan — mengeksekusi ulang transaksi, menerapkan output yang tersimpan, atau membiarkan node memilih mana yang lebih cepat di setiap titik. Eksekusi ulang adalah pemeriksaan yang lebih kuat karena hasilnya benar-benar diproduksi ulang, bukan dipercaya begitu saja dari catatan; menerapkan output lebih cepat. Mode campuran ada karena jawaban yang tepat berubah tergantung seberapa jauh node tertinggal.

<Note>
  Ini keputusan operasional, bukan default yang diterima tanpa dipikirkan. Node yang mengunduh state terkini tidak bisa melayani query historis atau menjawab pertanyaan tentang bagaimana sebuah posisi sampai ke keadaannya sekarang — node itu tidak punya riwayat untuk dibaca. Node yang melayani [indexer](/id/protocol/architecture/indexer) atau proses audit membutuhkan riwayat yang dilewatkannya itu.
</Note>

<h2 id="staying-current">
  Tetap terkini
</h2>

Setelah berada di versi terkini, node menjaga posisinya dengan mengonsumsi blok terkomit begitu blok itu tiba — lagi-lagi dengan mengeksekusi transaksinya atau menerapkan output-nya, dengan trade-off yang sama antara kekuatan verifikasi dan kecepatan.

Bedanya dari bootstrapping: jaraknya kecil dan konstan, bukan besar dan menyusut. Node yang tertinggal cukup jauh akan kembali masuk ke jalur bootstrapping, bukan mencoba menutup jarak sebesar apa pun secara bertahap.

<h2 id="how-data-moves">
  Bagaimana data berpindah
</h2>

Sinkronisasi bukan sekadar satu node meminta rentang blok ke node lain. Sinkronisasi dipisahkan menjadi beberapa lapisan sehingga tidak ada satu peer pun yang menjadi dependensi dan tidak ada satu kegagalan pun yang menghentikan kemajuan.

| Lapisan               | Peran                                                                                           |
| --------------------- | ----------------------------------------------------------------------------------------------- |
| **Storage service**   | Menyajikan data ke node lain: transaksi, output, nilai state, dan bukti yang menyertainya       |
| **Data client**       | Memilih peer, melacak siapa punya apa, mengirim permintaan, dan menangani permintaan yang gagal |
| **Streaming service** | Mengubah “bawa saya dari sini ke sana” menjadi stream terurut berisi chunk terverifikasi        |
| **Driver**            | Menentukan apa yang dibutuhkan node berikutnya dan menerapkan apa yang tiba                     |

Konsekuensi yang perlu dipahami: node yang sedang menyinkronkan diri tidak sedang memercayai peer. Setiap chunk tiba disertai bukti terhadap root yang dikomit jaringan, dan peer yang menyajikan sesuatu yang tidak konsisten akan ditolak, bukan dipercaya. Pemilihan peer adalah keputusan performa, bukan keputusan kepercayaan.

<h2 id="verification">
  Verifikasi
</h2>

Tidak ada apa pun dalam sinkronisasi state yang diterima hanya karena siapa yang mengirimnya.

Nilai state diverifikasi terhadap state root yang terkomit. Transaksi dan output diverifikasi terhadap akumulator. Node yang menyelesaikan bootstrapping punya state yang root-nya cocok dengan apa yang ditandatangani kuorum validator — dan itulah yang membuat jalur cepat tetap aman: mengunduh state terkini melewati riwayatnya, tetapi tidak melewati verifikasinya.

<h2 id="where-to-go-next">
  Ke mana selanjutnya
</h2>

<CardGroup cols={2}>
  <Card title="Penyimpanan dan bukti" href="/id/protocol/architecture/state/storage">
    Struktur yang membuat sinkronisasi bisa diverifikasi.
  </Card>

  <Card title="Menjalankan node" href="/id/developers/run-a-node">
    Peran node, dan cara menanyakan soal menjalankannya.
  </Card>

  <Card title="Topologi jaringan" href="/id/protocol/architecture/intention-bft">
    Tier node mana yang sedang diajak bicara oleh peer yang menyinkronkan diri.
  </Card>

  <Card title="Indexer" href="/id/protocol/architecture/indexer">
    Apa yang bisa dijawab riwayat tetapi tidak bisa dijawab state terkini.
  </Card>
</CardGroup>
