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

# Sincronizzazione dello stato

> Come un nodo che non ha mai visto la catena arriva alla versione corrente, e come ci resta.

Un nodo che entra nella rete deve rispondere a due domande: come arrivo al punto in cui la catena si trova adesso, e come ci resto. La sincronizzazione dello stato risponde a entrambe, e il compromesso fra le due è esplicito invece che nascosto.

<h2 id="two-modes-of-catching-up">
  Due modi per mettersi in pari
</h2>

Il bootstrap — arrivare alla versione corrente partendo da zero — si può fare in due modi radicalmente diversi.

**Rieseguire lo storico.** Si parte dal genesis e si va avanti, rieseguendo ogni transazione oppure applicando gli output che l'esecuzione ha già prodotto. Il risultato è un nodo che detiene l'intero storico: ogni versione, ogni prova, ogni transazione. È anche lento, e diventa più lento ogni giorno che la catena resta in funzione.

**Scaricare lo stato corrente.** Si salta lo storico e si prendono chiavi e valori di stato come stanno all'ultima versione, verificati rispetto alla radice consolidata. Il nodo è aggiornato in una frazione del tempo, e non sa nulla di come la catena ci sia arrivata.

<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">Un nuovo nodo</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">Modalità di bootstrap</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">Rieseguire lo storico</span><span className="dg-s">riesecuzione o applicazione degli output, dal genesis</span><span className="dg-n">lento, e più lento ogni giorno di catena</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">Scaricare lo stato corrente</span><span className="dg-s">chiavi e valori all'ultima versione, verificati sulla radice consolidata</span><span className="dg-n">aggiornato in una frazione di tempo</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">Versione corrente</span><span className="dg-s">sincronizzazione continua</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">I due percorsi non sono equivalenti</span><span className="dg-s">Un nodo che ha scaricato lo stato corrente non può servire query storiche né dire come una posizione sia arrivata dov'è. A un nodo che alimenta un indexer o un audit serve lo storico saltato.</span></div>
  </div>
</div>

Dentro il percorso di replay c'è un'ulteriore scelta: rieseguire le transazioni, applicare gli output memorizzati, oppure lasciare che il nodo scelga di volta in volta il più veloce. Rieseguire è il controllo più forte, perché riproduce il risultato invece di fidarsi di un risultato registrato; applicare gli output è più rapido. La modalità mista esiste perché la risposta giusta cambia con quanto il nodo è indietro.

<Note>
  Questa è una decisione operativa, non un default da accettare senza pensarci. Un nodo che ha scaricato lo stato corrente non può servire query storiche né rispondere a domande su come una posizione sia arrivata dov'è: non ha storico da leggere. A un nodo che alimenta un [indexer](/it/protocol/architecture/indexer) o un processo di audit serve lo storico che ha saltato.
</Note>

<h2 id="staying-current">
  Restare aggiornati
</h2>

Arrivato alla versione corrente, un nodo si mantiene in pari consumando i blocchi consolidati man mano che arrivano, di nuovo eseguendo le transazioni oppure applicando gli output, con lo stesso compromesso fra forza della verifica e velocità.

La differenza rispetto al bootstrap è che il divario è piccolo e costante, invece che grande e in riduzione. Un nodo che accumula troppo ritardo rientra nel percorso di bootstrap, invece di provare a colmare un divario arbitrario in modo incrementale.

<h2 id="how-data-moves">
  Come si muovono i dati
</h2>

La sincronizzazione non è un nodo che chiede a un altro un intervallo di blocchi. Si divide in livelli, così che nessun singolo peer sia una dipendenza e nessun singolo guasto fermi l'avanzamento.

| Livello               | Ruolo                                                                                             |
| --------------------- | ------------------------------------------------------------------------------------------------- |
| **Storage service**   | Serve dati agli altri nodi: transazioni, output, valori di stato e le prove che li accompagnano   |
| **Data client**       | Sceglie i peer, tiene traccia di chi ha cosa, invia le richieste e gestisce quelle che falliscono |
| **Streaming service** | Trasforma «portami da qui a lì» in un flusso ordinato di chunk verificati                         |
| **Driver**            | Decide che cosa serve al nodo dopo, e applica ciò che arriva                                      |

La conseguenza da capire: un nodo che si sincronizza non si fida di un peer. Ogni chunk arriva con una prova rispetto a una radice che la rete ha consolidato, e un peer che serve qualcosa di incoerente viene rifiutato invece che creduto. La scelta dei peer è una decisione di prestazioni, non di fiducia.

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

Nella sincronizzazione dello stato nulla viene accettato in base a chi lo ha inviato.

I valori di stato sono verificati rispetto alla radice dello stato consolidata. Transazioni e output sono verificati rispetto agli accumulatori. Un nodo che finisce il bootstrap ha uno stato la cui radice coincide con ciò che un quorum di validatori ha firmato. È questo a rendere sicuro il percorso veloce: scaricare lo stato corrente salta lo storico, ma non salta la verifica.

<h2 id="where-to-go-next">
  Dove proseguire
</h2>

<CardGroup cols={2}>
  <Card title="Archiviazione e prove" href="/it/protocol/architecture/state/storage">
    Le strutture che rendono verificabile la sincronizzazione.
  </Card>

  <Card title="Gestire un nodo" href="/it/developers/run-a-node">
    I ruoli dei nodi, e come chiedere di gestirne uno.
  </Card>

  <Card title="Topologia della rete" href="/it/protocol/architecture/intention-bft">
    Con quale livello di nodo parla un peer che si sincronizza.
  </Card>

  <Card title="Indexer" href="/it/protocol/architecture/indexer">
    Le domande a cui risponde lo storico e a cui lo stato corrente non può rispondere.
  </Card>
</CardGroup>
