mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-20 23:14:37 +00:00
This reverts commit 9842b4b0fb.
This commit is contained in:
@@ -1,77 +0,0 @@
|
||||
# State Sync Reactor
|
||||
|
||||
State sync allows new nodes to rapidly bootstrap and join the network by discovering, fetching,
|
||||
and restoring state machine snapshots. For more information, see the [state sync ABCI section](../abci/apps.md#state-sync).
|
||||
|
||||
The state sync reactor has two main responsibilites:
|
||||
|
||||
* Serving state machine snapshots taken by the local ABCI application to new nodes joining the
|
||||
network.
|
||||
|
||||
* Discovering existing snapshots and fetching snapshot chunks for an empty local application
|
||||
being bootstrapped.
|
||||
|
||||
The state sync process for bootstrapping a new node is described in detail in the section linked
|
||||
above. While technically part of the reactor (see `statesync/syncer.go` and related components),
|
||||
this document will only cover the P2P reactor component.
|
||||
|
||||
For details on the ABCI methods and data types, see the [ABCI documentation](../abci/abci.md).
|
||||
|
||||
## State Sync P2P Protocol
|
||||
|
||||
When a new node begin state syncing, it will ask all peers it encounters if it has any
|
||||
available snapshots:
|
||||
|
||||
```go
|
||||
type snapshotsRequestMessage struct{}
|
||||
```
|
||||
|
||||
The receiver will query the local ABCI application via `ListSnapshots`, and send a message
|
||||
containing snapshot metadata (limited to 4 MB) for each of the 10 most recent snapshots:
|
||||
|
||||
```go
|
||||
type snapshotsResponseMessage struct {
|
||||
Height uint64
|
||||
Format uint32
|
||||
Chunks uint32
|
||||
Hash []byte
|
||||
Metadata []byte
|
||||
}
|
||||
```
|
||||
|
||||
The node running state sync will offer these snapshots to the local ABCI application via
|
||||
`OfferSnapshot` ABCI calls, and keep track of which peers contain which snapshots. Once a snapshot
|
||||
is accepted, the state syncer will request snapshot chunks from appropriate peers:
|
||||
|
||||
```go
|
||||
type chunkRequestMessage struct {
|
||||
Height uint64
|
||||
Format uint32
|
||||
Index uint32
|
||||
}
|
||||
```
|
||||
|
||||
The receiver will load the requested chunk from its local application via `LoadSnapshotChunk`,
|
||||
and respond with it (limited to 16 MB):
|
||||
|
||||
```go
|
||||
type chunkResponseMessage struct {
|
||||
Height uint64
|
||||
Format uint32
|
||||
Index uint32
|
||||
Chunk []byte
|
||||
Missing bool
|
||||
}
|
||||
```
|
||||
|
||||
Here, `Missing` is used to signify that the chunk was not found on the peer, since an empty
|
||||
chunk is a valid (although unlikely) response.
|
||||
|
||||
The returned chunk is given to the ABCI application via `ApplySnapshotChunk` until the snapshot
|
||||
is restored. If a chunk response is not returned within some time, it will be re-requested,
|
||||
possibly from a different peer.
|
||||
|
||||
The ABCI application is able to request peer bans and chunk refetching as part of the ABCI protocol.
|
||||
|
||||
If no state sync is in progress (i.e. during normal operation), any unsolicited response messages
|
||||
are discarded.
|
||||
Reference in New Issue
Block a user