-
Notifications
You must be signed in to change notification settings - Fork 4
/
store_migration.go
253 lines (230 loc) · 19.4 KB
/
store_migration.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
package gossip
import (
"fmt"
"github.com/TechPay-io/sirius-base/hash"
"github.com/TechPay-io/sirius-base/inter/idx"
"github.com/TechPay-io/sirius-base/kvdb"
"github.com/ethereum/go-ethereum/common"
"github.com/TechPay-io/go-photon/inter"
"github.com/TechPay-io/go-photon/utils/concurrent"
"github.com/TechPay-io/go-photon/utils/migration"
)
func isEmptyDB(db kvdb.Iteratee) bool {
it := db.NewIterator(nil, nil)
defer it.Release()
return !it.Next()
}
func (s *Store) migrateData() error {
versions := migration.NewKvdbIDStore(s.table.Version)
if isEmptyDB(s.mainDB) && isEmptyDB(s.async.mainDB) {
// short circuit if empty DB
versions.SetID(s.migrations().ID())
return nil
}
err := s.migrations().Exec(versions, s.Commit)
return err
}
func (s *Store) migrations() *migration.Migration {
return migration.
Begin("photon-gossip-store").
Next("used gas recovery", s.recoverUsedGas).
Next("tx hashes recovery", s.recoverTxHashes).
Next("DAG heads recovery", s.recoverHeadsStorage).
Next("DAG last events recovery", s.recoverLastEventsStorage)
}
func (s *Store) recoverUsedGas() error {
start := s.GetGenesisBlockIndex()
if start == nil {
return fmt.Errorf("genesis block index is not set")
}
for n := *start; true; n++ {
b := s.GetBlock(n)
if b == nil {
break
}
var (
rr = s.EvmStore().GetReceipts(n)
cumulativeGasWrong uint64
cumulativeGasRight uint64
fixed bool
)
for i, r := range rr {
// simulate the bug
switch {
case n == *start: // genesis block
if i == len(b.InternalTxs)-2 || i == len(b.InternalTxs)-1 {
cumulativeGasWrong = 0
}
default: // other blocks
if i == len(b.InternalTxs)-1 || i == len(b.InternalTxs) {
cumulativeGasWrong = 0
}
}
// recalc
gasUsed := r.CumulativeGasUsed - cumulativeGasWrong
cumulativeGasWrong += gasUsed
cumulativeGasRight += gasUsed
// fix
if r.CumulativeGasUsed != cumulativeGasRight {
r.CumulativeGasUsed = cumulativeGasRight
r.GasUsed = gasUsed
fixed = true
}
}
if fixed {
s.EvmStore().SetReceipts(n, rr)
}
}
return nil
}
var (
fixTxHash1 = common.HexToHash("0xb6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea30458")
fixTxEvent1 = hash.HexToEventHash("0x00001718000003d4d3955bf592e12fb80a60574fa4b18bd5805b4c010d75e86d")
fixTxHash2 = common.HexToHash("0x3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a40534")
fixTxEvent2 = hash.HexToEventHash("0x0000179e00000c464d756a7614d0ca067fcb37ee4452004bf308c9df561e85e8")
)
const (
fixTxEventPos1 = 2
fixTxBlock1 = 4738821
fixTxEventPos2 = 0
fixTxBlock2 = 4801307
)
func fixEventTxHashes(e *inter.EventPayload) {
if e.ID() == fixTxEvent1 {
e.Txs()[fixTxEventPos1].SetHash(fixTxHash1)
}
if e.ID() == fixTxEvent2 {
e.Txs()[fixTxEventPos2].SetHash(fixTxHash2)
}
}
type kvEntry struct {
key []byte
value []byte
}
func (s *Store) recoverTxHashes() error {
if s.GetRules().NetworkID != 0xfa {
return nil
}
diff1 := []kvEntry{
{key: common.Hex2Bytes("4c720000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000007"), value: nil},
{key: common.Hex2Bytes("4c720000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000008"), value: nil},
{key: common.Hex2Bytes("4c720000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000009"), value: nil},
{key: common.Hex2Bytes("4c720000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba7000000000000000a"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000000000000000000000000000000000000000000000020000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000007"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000000000000000000000000000000000000000000000020000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000008"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000000000000000000000000000000000000000000001030000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba7000000000000000a"), value: nil},
{key: common.Hex2Bytes("4c7400000000000000000000000004d02149058cc8c8d0cf5f6fd1dc5394a80d7371020000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba7000000000000000a"), value: nil},
{key: common.Hex2Bytes("4c7400000000000000000000000004d02149058cc8c8d0cf5f6fd1dc5394a80d7371030000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000009"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000004d5362dd18ea4ba880c829b0152b7ba371741e59030000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000007"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b000000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000007"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b000000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000008"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b000000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000009"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f093000000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba7000000000000000a"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f093020000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000009"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f093030000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000008"), value: nil},
{key: common.Hex2Bytes("4c7490890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15010000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba7000000000000000a"), value: nil},
{key: common.Hex2Bytes("4c74ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef010000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000007"), value: nil},
{key: common.Hex2Bytes("4c74ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef010000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000008"), value: nil},
{key: common.Hex2Bytes("4c74ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef010000000000484f05497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba70000000000000009"), value: nil},
{key: common.Hex2Bytes("4c720000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000007"), value: common.Hex2Bytes("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d5362dd18ea4ba880c829b0152b7ba371741e5900001718000003d9d4038f394e6b06123d0dc96da0e15ef6e16a799dcf0277df5cc61a78f164885776aa610fb0fe1257df78e59b000000000000000000000000000000000000000000000000502eca46e3971c71")},
{key: common.Hex2Bytes("4c720000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000008"), value: common.Hex2Bytes("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f09300001718000003d9d4038f394e6b06123d0dc96da0e15ef6e16a799dcf0277df5cc61a78f164885776aa610fb0fe1257df78e59b00000000000000000000000000000000000000000000000321d3e6c4e3e71c71")},
{key: common.Hex2Bytes("4c720000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000009"), value: common.Hex2Bytes("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f09300000000000000000000000004d02149058cc8c8d0cf5f6fd1dc5394a80d737100001718000003d9d4038f394e6b06123d0dc96da0e15ef6e16a799dcf0277df5cc61a78f164885776aa610fb0fe1257df78e59b0000000000000000000000000000000000000000000000000439248ee41549c0")},
{key: common.Hex2Bytes("4c720000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea30458000000000000000a"), value: common.Hex2Bytes("90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1500000000000000000000000004d02149058cc8c8d0cf5f6fd1dc5394a80d7371000000000000000000000000000000000000000000000000000000000000000100001718000003d9d4038f394e6b06123d0dc96da0e15ef6e16a799dcf0277df9083ea3756bde6ee6f27a6e996806fbd37f6f0930000000000000000000000000000000000000000000000000000000000000000")},
{key: common.Hex2Bytes("4c740000000000000000000000000000000000000000000000000000000000000000020000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000007"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000000000000000000000000000000000000000000000020000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000008"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000000000000000000000000000000000000000000001030000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea30458000000000000000a"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c7400000000000000000000000004d02149058cc8c8d0cf5f6fd1dc5394a80d7371020000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea30458000000000000000a"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c7400000000000000000000000004d02149058cc8c8d0cf5f6fd1dc5394a80d7371030000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000009"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000004d5362dd18ea4ba880c829b0152b7ba371741e59030000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000007"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b000000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000007"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b000000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000008"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b000000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000009"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f093000000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea30458000000000000000a"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f093020000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000009"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f093030000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000008"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c7490890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15010000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea30458000000000000000a"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c74ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef010000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000007"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c74ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef010000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000008"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c74ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef010000000000484f05b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea304580000000000000009"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("78497bf2b3f14a9d4f4e8ce89fddc26e4c912393e9f6a71dc188c19fa7115cfba7"), value: common.Hex2Bytes("e783453462a000000000000000000000000000000000000000000000000000000000000000008001")},
{key: common.Hex2Bytes("78b6840d4c0eb562b0b1731760223d91b36edc6c160958e23e773e6058eea30458"), value: common.Hex2Bytes("e783484f05a000001718000003d4d3955bf592e12fb80a60574fa4b18bd5805b4c010d75e86d0202")},
}
diff2 := []kvEntry{
{key: common.Hex2Bytes("4c72000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000004"), value: nil},
{key: common.Hex2Bytes("4c72000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000005"), value: nil},
{key: common.Hex2Bytes("4c74000000000000000000000000000000000000000000000000000000000000000103000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000005"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000001325625ae81846e80ac9d0b8113f31e1f8b479a802000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000005"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000001325625ae81846e80ac9d0b8113f31e1f8b479a803000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000004"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b00000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000004"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f09300000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000005"), value: nil},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f09302000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000004"), value: nil},
{key: common.Hex2Bytes("4c7490890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1501000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000005"), value: nil},
{key: common.Hex2Bytes("4c74ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef01000000000049431bc511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb0000000000000004"), value: nil},
{key: common.Hex2Bytes("4c72000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000004"), value: common.Hex2Bytes("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f0930000000000000000000000001325625ae81846e80ac9d0b8113f31e1f8b479a80000179e00000c49ff37137ee31a4020047bbff39016c3df896319816f2cfe565cc61a78f164885776aa610fb0fe1257df78e59b00000000000000000000000000000000000000000000000f5e7017a20b72fcb3")},
{key: common.Hex2Bytes("4c72000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000005"), value: common.Hex2Bytes("90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a150000000000000000000000001325625ae81846e80ac9d0b8113f31e1f8b479a800000000000000000000000000000000000000000000000000000000000000010000179e00000c49ff37137ee31a4020047bbff39016c3df896319816f2cfe569083ea3756bde6ee6f27a6e996806fbd37f6f0930000000000000000000000000000000000000000000000000000000000000000")},
{key: common.Hex2Bytes("4c74000000000000000000000000000000000000000000000000000000000000000103000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000005"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000001325625ae81846e80ac9d0b8113f31e1f8b479a802000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000005"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000001325625ae81846e80ac9d0b8113f31e1f8b479a803000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000004"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b00000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000004"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f09300000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000005"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c740000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f09302000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000004"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c7490890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1501000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000005"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("4c74ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef01000000000049431b3aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a405340000000000000004"), value: common.Hex2Bytes("03")},
{key: common.Hex2Bytes("783aeede91740093cb8feb1296a34cf70d86d2f802cff860edd798978e94a40534"), value: common.Hex2Bytes("e78349431ba00000179e00000c464d756a7614d0ca067fcb37ee4452004bf308c9df561e85e88001")},
{key: common.Hex2Bytes("78c511216e8bff6c347014ed695cb308f2792d07fd30079f12286768716b5bfacb"), value: common.Hex2Bytes("e78344dd6ca000000000000000000000000000000000000000000000000000000000000000008080")},
}
diff := []kvEntry{}
blockIdx := s.GetLatestBlockIndex()
if blockIdx >= fixTxBlock1 {
diff = append(diff, diff1...)
}
if blockIdx >= fixTxBlock2 {
diff = append(diff, diff2...)
}
for _, kv := range diff {
var err error
if kv.value != nil {
err = s.mainDB.Put(kv.key, kv.value)
} else {
err = s.mainDB.Delete(kv.key)
}
if err != nil {
return err
}
}
return nil
}
func (s *Store) recoverHeadsStorage() error {
s.loadEpochStore(s.GetEpoch())
es := s.getEpochStore(s.GetEpoch())
it := es.table.Heads.NewIterator(nil, nil)
defer it.Release()
heads := make(hash.EventsSet)
for it.Next() {
// note: key may be empty if DB was committed before being migrated, which is possible between migration steps
if len(it.Key()) > 0 {
heads.Add(hash.BytesToEvent(it.Key()))
}
_ = es.table.Heads.Delete(it.Key())
}
es.SetHeads(concurrent.WrapEventsSet(heads))
es.FlushHeads()
return nil
}
func (s *Store) recoverLastEventsStorage() error {
s.loadEpochStore(s.GetEpoch())
es := s.getEpochStore(s.GetEpoch())
it := es.table.LastEvents.NewIterator(nil, nil)
defer it.Release()
lasts := make(map[idx.ValidatorID]hash.Event)
for it.Next() {
// note: key may be empty if DB was committed before being migrated, which is possible between migration steps
if len(it.Key()) > 0 {
lasts[idx.BytesToValidatorID(it.Key())] = hash.BytesToEvent(it.Value())
}
_ = es.table.LastEvents.Delete(it.Key())
}
es.SetLastEvents(concurrent.WrapValidatorEventsSet(lasts))
es.FlushLastEvents()
return nil
}