-
Notifications
You must be signed in to change notification settings - Fork 80
/
snapshotter.go
96 lines (83 loc) · 2.77 KB
/
snapshotter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package statesync
import (
"io"
snapshot "github.com/cosmos/cosmos-sdk/snapshots/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
protoio "github.com/gogo/protobuf/io"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/libs/log"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
)
const (
SnapshotName = "sg_version_snapshotter"
SnapshotFormat = 0xFF
)
var _ snapshot.ExtensionSnapshotter = &VersionSnapshotter{}
type ConsensusParamsGetter interface {
GetConsensusParams(ctx sdk.Context) *abci.ConsensusParams
}
type ProtocolVersionSetter interface {
SetProtocolVersion(uint64)
}
type VersionSnapshotter struct {
consensusParamGetter ConsensusParamsGetter
versionSetter ProtocolVersionSetter
ms sdk.MultiStore
}
func NewVersionSnapshotter(ms sdk.MultiStore, cpg ConsensusParamsGetter, vs ProtocolVersionSetter) *VersionSnapshotter {
return &VersionSnapshotter{
consensusParamGetter: cpg,
versionSetter: vs,
ms: ms,
}
}
func (vs *VersionSnapshotter) SnapshotName() string {
return SnapshotName
}
// Snapshot writes snapshot items into the protobuf writer.
func (vs *VersionSnapshotter) Snapshot(height uint64, protoWriter protoio.Writer) error {
cms, err := vs.ms.CacheMultiStoreWithVersion(int64(height))
if err != nil {
return err
}
ctx := sdk.NewContext(cms, tmproto.Header{}, false, log.NewNopLogger())
params := vs.consensusParamGetter.GetConsensusParams(ctx)
// default to 1 for stargaze
appVersion := uint64(1)
if params != nil && params.Version != nil && params.Version.GetAppVersion() > 0 {
appVersion = params.Version.GetAppVersion()
}
bz := sdk.Uint64ToBigEndian(appVersion)
return snapshot.WriteExtensionItem(protoWriter, bz)
}
// Restore restores a state snapshot from the protobuf items read from the reader.
func (vs *VersionSnapshotter) Restore(height uint64, format uint32, protoReader protoio.Reader) (snapshot.SnapshotItem, error) {
if format == SnapshotFormat {
var item snapshot.SnapshotItem
for {
item = snapshot.SnapshotItem{}
err := protoReader.ReadMsg(&item)
if err == io.EOF {
break
} else if err != nil {
return snapshot.SnapshotItem{}, sdkerrors.Wrap(err, "invalid protobuf message")
}
payload := item.GetExtensionPayload()
if payload == nil {
vs.versionSetter.SetProtocolVersion(0)
break
}
appVersion := sdk.BigEndianToUint64(payload.Payload)
vs.versionSetter.SetProtocolVersion(appVersion)
}
return item, nil
}
return snapshot.SnapshotItem{}, snapshot.ErrUnknownFormat
}
func (vs *VersionSnapshotter) SnapshotFormat() uint32 {
return SnapshotFormat
}
func (vs *VersionSnapshotter) SupportedFormats() []uint32 {
return []uint32{SnapshotFormat}
}