/
storage_database.go
67 lines (56 loc) · 1.86 KB
/
storage_database.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
package chain_state
import (
"fmt"
"github.com/vitelabs/go-vite/v2/common/types"
"github.com/vitelabs/go-vite/v2/interfaces"
ledger "github.com/vitelabs/go-vite/v2/interfaces/core"
)
func (sDB *StateDB) NewStorageDatabase(snapshotHash types.Hash, addr types.Address) (StorageDatabaseInterface, error) {
snapshotHeight, err := sDB.chain.GetSnapshotHeightByHash(snapshotHash)
if err != nil {
return nil, err
}
if snapshotHeight <= 0 {
return nil, fmt.Errorf("snapshot hash %s is not existed", snapshotHash)
}
return NewStorageDatabase(sDB, ledger.HashHeight{
Height: snapshotHeight,
Hash: snapshotHash,
}, addr), nil
}
type StorageDatabase struct {
stateDb *StateDB
snapshotHash types.Hash
snapshotHeight uint64
addr types.Address
}
func NewStorageDatabase(stateDb *StateDB, hashHeight ledger.HashHeight, addr types.Address) StorageDatabaseInterface {
return &StorageDatabase{
stateDb: stateDb,
snapshotHeight: hashHeight.Height,
snapshotHash: hashHeight.Hash,
addr: addr,
}
}
func (sd *StorageDatabase) GetValue(key []byte) ([]byte, error) {
return sd.stateDb.GetSnapshotValue(sd.snapshotHeight, sd.addr, key)
}
func (sd *StorageDatabase) NewStorageIterator(prefix []byte) (interfaces.StorageIterator, error) {
// if use cache
if sd.stateDb.consensusCacheLevel == ConsensusReadCache &&
sd.addr == types.AddressGovernance {
if iter := sd.stateDb.roundCache.StorageIterator(sd.snapshotHash); iter != nil {
return iter, nil
}
}
ss, err := sd.stateDb.NewSnapshotStorageIteratorByHeight(sd.snapshotHeight, sd.addr, prefix)
if err != nil {
cErr := fmt.Errorf("c.stateDB.NewSnapshotStorageIterator failed, snapshotHeight is %d, addr is %s, prefix is %s",
sd.snapshotHeight, sd.addr, prefix)
return nil, cErr
}
return ss, nil
}
func (sd *StorageDatabase) Address() *types.Address {
return &sd.addr
}