@@ -51,33 +51,34 @@ type Config struct {
51
51
52
52
// Pruner is implemented by FullNode and ArchiveNode.
53
53
type Pruner interface {
54
- StoreJournalRecord (deletedHashesSet , insertedHashesSet map [common. Hash ]struct {},
54
+ StoreJournalRecord (deletedMerkleValues , insertedMerkleValues map [string ]struct {},
55
55
blockHash common.Hash , blockNum int64 ) error
56
56
}
57
57
58
58
// ArchiveNode is a no-op since we don't prune nodes in archive mode.
59
59
type ArchiveNode struct {}
60
60
61
61
// StoreJournalRecord for archive node doesn't do anything.
62
- func (* ArchiveNode ) StoreJournalRecord (_ , _ map [common. Hash ]struct {},
62
+ func (* ArchiveNode ) StoreJournalRecord (_ , _ map [string ]struct {},
63
63
_ common.Hash , _ int64 ) error {
64
64
return nil
65
65
}
66
66
67
67
type deathRecord struct {
68
- blockHash common.Hash
69
- deletedKeys map [common. Hash ]int64 // Mapping from deleted key hash to block number.
68
+ blockHash common.Hash
69
+ deletedMerkleValueToBlockNumber map [string ]int64
70
70
}
71
71
72
72
type deathRow []* deathRecord
73
73
74
74
// FullNode stores state trie diff and allows online state trie pruning
75
75
type FullNode struct {
76
- logger log.LeveledLogger
77
- deathList []deathRow
78
- storageDB chaindb.Database
79
- journalDB chaindb.Database
80
- deathIndex map [common.Hash ]int64 // Mapping from deleted key hash to block number.
76
+ logger log.LeveledLogger
77
+ deathList []deathRow
78
+ storageDB chaindb.Database
79
+ journalDB chaindb.Database
80
+ // deathIndex is the mapping from deleted node Merkle value to block number.
81
+ deathIndex map [string ]int64
81
82
// pendingNumber is the block number to be pruned.
82
83
// Initial value is set to 1 and is incremented after every block pruning.
83
84
pendingNumber int64
@@ -88,31 +89,31 @@ type FullNode struct {
88
89
type journalRecord struct {
89
90
// blockHash of the block corresponding to journal record
90
91
blockHash common.Hash
91
- // Hash of keys that are inserted into state trie of the block
92
- insertedHashesSet map [common. Hash ]struct {}
93
- // Hash of keys that are deleted from state trie of the block
94
- deletedHashesSet map [common. Hash ]struct {}
92
+ // Merkle values of nodes inserted in the state trie of the block
93
+ insertedMerkleValues map [string ]struct {}
94
+ // Merkle values of nodes deleted from the state trie of the block
95
+ deletedMerkleValues map [string ]struct {}
95
96
}
96
97
97
98
type journalKey struct {
98
99
blockNum int64
99
100
blockHash common.Hash
100
101
}
101
102
102
- func newJournalRecord (hash common.Hash , insertedHashesSet ,
103
- deletedHashesSet map [common. Hash ]struct {}) * journalRecord {
103
+ func newJournalRecord (hash common.Hash , insertedMerkleValues ,
104
+ deletedMerkleValues map [string ]struct {}) * journalRecord {
104
105
return & journalRecord {
105
- blockHash : hash ,
106
- insertedHashesSet : insertedHashesSet ,
107
- deletedHashesSet : deletedHashesSet ,
106
+ blockHash : hash ,
107
+ insertedMerkleValues : insertedMerkleValues ,
108
+ deletedMerkleValues : deletedMerkleValues ,
108
109
}
109
110
}
110
111
111
112
// NewFullNode creates a Pruner for full node.
112
113
func NewFullNode (db , storageDB chaindb.Database , retainBlocks int64 , l log.LeveledLogger ) (Pruner , error ) {
113
114
p := & FullNode {
114
115
deathList : make ([]deathRow , 0 ),
115
- deathIndex : make (map [common. Hash ]int64 ),
116
+ deathIndex : make (map [string ]int64 ),
116
117
storageDB : storageDB ,
117
118
journalDB : chaindb .NewTable (db , journalPrefix ),
118
119
retainBlocks : retainBlocks ,
@@ -140,9 +141,9 @@ func NewFullNode(db, storageDB chaindb.Database, retainBlocks int64, l log.Level
140
141
}
141
142
142
143
// StoreJournalRecord stores journal record into DB and add deathRow into deathList
143
- func (p * FullNode ) StoreJournalRecord (deletedHashesSet , insertedHashesSet map [common. Hash ]struct {},
144
+ func (p * FullNode ) StoreJournalRecord (deletedMerkleValues , insertedMerkleValues map [string ]struct {},
144
145
blockHash common.Hash , blockNum int64 ) error {
145
- jr := newJournalRecord (blockHash , insertedHashesSet , deletedHashesSet )
146
+ jr := newJournalRecord (blockHash , insertedMerkleValues , deletedMerkleValues )
146
147
147
148
key := & journalKey {blockNum , blockHash }
148
149
err := p .storeJournal (key , jr )
@@ -168,13 +169,13 @@ func (p *FullNode) addDeathRow(jr *journalRecord, blockNum int64) {
168
169
return
169
170
}
170
171
171
- p .processInsertedKeys (jr .insertedHashesSet , jr .blockHash )
172
+ p .processInsertedKeys (jr .insertedMerkleValues , jr .blockHash )
172
173
173
- // add deleted keys from journal to death index
174
- deletedKeys := make (map [common. Hash ]int64 , len (jr .deletedHashesSet ))
175
- for k := range jr .deletedHashesSet {
174
+ // add deleted node Merkle values from journal to death index
175
+ deletedMerkleValueToBlockNumber := make (map [string ]int64 , len (jr .deletedMerkleValues ))
176
+ for k := range jr .deletedMerkleValues {
176
177
p .deathIndex [k ] = blockNum
177
- deletedKeys [k ] = blockNum
178
+ deletedMerkleValueToBlockNumber [k ] = blockNum
178
179
}
179
180
180
181
blockIndex := blockNum - p .pendingNumber
@@ -183,25 +184,25 @@ func (p *FullNode) addDeathRow(jr *journalRecord, blockNum int64) {
183
184
}
184
185
185
186
record := & deathRecord {
186
- blockHash : jr .blockHash ,
187
- deletedKeys : deletedKeys ,
187
+ blockHash : jr .blockHash ,
188
+ deletedMerkleValueToBlockNumber : deletedMerkleValueToBlockNumber ,
188
189
}
189
190
190
191
// add deathRow to deathList
191
192
p .deathList [blockIndex ] = append (p .deathList [blockIndex ], record )
192
193
}
193
194
194
195
// Remove re-inserted keys
195
- func (p * FullNode ) processInsertedKeys (insertedHashesSet map [common. Hash ]struct {}, blockHash common.Hash ) {
196
- for k := range insertedHashesSet {
196
+ func (p * FullNode ) processInsertedKeys (insertedMerkleValues map [string ]struct {}, blockHash common.Hash ) {
197
+ for k := range insertedMerkleValues {
197
198
num , ok := p .deathIndex [k ]
198
199
if ! ok {
199
200
continue
200
201
}
201
202
records := p .deathList [num - p .pendingNumber ]
202
203
for _ , v := range records {
203
204
if v .blockHash == blockHash {
204
- delete (v .deletedKeys , k )
205
+ delete (v .deletedMerkleValueToBlockNumber , k )
205
206
}
206
207
}
207
208
delete (p .deathIndex , k )
@@ -229,14 +230,14 @@ func (p *FullNode) start() {
229
230
230
231
sdbBatch := p .storageDB .NewBatch ()
231
232
for _ , record := range row {
232
- err := p .deleteKeys (sdbBatch , record .deletedKeys )
233
+ err := p .deleteKeys (sdbBatch , record .deletedMerkleValueToBlockNumber )
233
234
if err != nil {
234
235
p .logger .Warnf ("failed to prune keys for block number %d: %s" , blockNum , err )
235
236
sdbBatch .Reset ()
236
237
return
237
238
}
238
239
239
- for k := range record .deletedKeys {
240
+ for k := range record .deletedMerkleValueToBlockNumber {
240
241
delete (p .deathIndex , k )
241
242
}
242
243
}
@@ -373,9 +374,9 @@ func (p *FullNode) getLastPrunedIndex() (int64, error) {
373
374
return blockNum , nil
374
375
}
375
376
376
- func (* FullNode ) deleteKeys (b chaindb.Batch , nodesHash map [common. Hash ]int64 ) error {
377
- for k := range nodesHash {
378
- err := b .Del (k . ToBytes ( ))
377
+ func (* FullNode ) deleteKeys (b chaindb.Batch , deletedMerkleValueToBlockNumber map [string ]int64 ) error {
378
+ for merkleValue := range deletedMerkleValueToBlockNumber {
379
+ err := b .Del ([] byte ( merkleValue ))
379
380
if err != nil {
380
381
return err
381
382
}
0 commit comments