forked from TrueCloudLab/neoneo-go
core: add API to store StateSyncPoint and StateSyncCurrentBlockHeight
We need it in order not to mess up the blockchain which has its own CurrentBlockHeight.
This commit is contained in:
parent
cb01f533c0
commit
0e3b9c48a2
4 changed files with 83 additions and 14 deletions
|
@ -43,7 +43,7 @@ import (
|
||||||
// Tuning parameters.
|
// Tuning parameters.
|
||||||
const (
|
const (
|
||||||
headerBatchCount = 2000
|
headerBatchCount = 2000
|
||||||
version = "0.1.1"
|
version = "0.1.2"
|
||||||
|
|
||||||
defaultInitialGAS = 52000000_00000000
|
defaultInitialGAS = 52000000_00000000
|
||||||
defaultMemPoolSize = 50000
|
defaultMemPoolSize = 50000
|
||||||
|
|
|
@ -45,6 +45,8 @@ type DAO interface {
|
||||||
GetHeaderHashes() ([]util.Uint256, error)
|
GetHeaderHashes() ([]util.Uint256, error)
|
||||||
GetNEP17TransferInfo(acc util.Uint160) (*state.NEP17TransferInfo, error)
|
GetNEP17TransferInfo(acc util.Uint160) (*state.NEP17TransferInfo, error)
|
||||||
GetNEP17TransferLog(acc util.Uint160, index uint32) (*state.NEP17TransferLog, error)
|
GetNEP17TransferLog(acc util.Uint160, index uint32) (*state.NEP17TransferLog, error)
|
||||||
|
GetStateSyncPoint() (uint32, error)
|
||||||
|
GetStateSyncCurrentBlockHeight() (uint32, error)
|
||||||
GetStorageItem(id int32, key []byte) state.StorageItem
|
GetStorageItem(id int32, key []byte) state.StorageItem
|
||||||
GetStorageItems(id int32) (map[string]state.StorageItem, error)
|
GetStorageItems(id int32) (map[string]state.StorageItem, error)
|
||||||
GetStorageItemsWithPrefix(id int32, prefix []byte) (map[string]state.StorageItem, error)
|
GetStorageItemsWithPrefix(id int32, prefix []byte) (map[string]state.StorageItem, error)
|
||||||
|
@ -58,6 +60,8 @@ type DAO interface {
|
||||||
PutCurrentHeader(hashAndIndex []byte) error
|
PutCurrentHeader(hashAndIndex []byte) error
|
||||||
PutNEP17TransferInfo(acc util.Uint160, bs *state.NEP17TransferInfo) error
|
PutNEP17TransferInfo(acc util.Uint160, bs *state.NEP17TransferInfo) error
|
||||||
PutNEP17TransferLog(acc util.Uint160, index uint32, lg *state.NEP17TransferLog) error
|
PutNEP17TransferLog(acc util.Uint160, index uint32, lg *state.NEP17TransferLog) error
|
||||||
|
PutStateSyncPoint(p uint32) error
|
||||||
|
PutStateSyncCurrentBlockHeight(h uint32) error
|
||||||
PutStorageItem(id int32, key []byte, si state.StorageItem) error
|
PutStorageItem(id int32, key []byte, si state.StorageItem) error
|
||||||
PutVersion(v string) error
|
PutVersion(v string) error
|
||||||
Seek(id int32, prefix []byte, f func(k, v []byte))
|
Seek(id int32, prefix []byte, f func(k, v []byte))
|
||||||
|
@ -399,6 +403,25 @@ func (dao *Simple) GetCurrentHeaderHeight() (i uint32, h util.Uint256, err error
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetStateSyncPoint returns current state synchronisation point P.
|
||||||
|
func (dao *Simple) GetStateSyncPoint() (uint32, error) {
|
||||||
|
b, err := dao.Store.Get(storage.SYSStateSyncPoint.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return binary.LittleEndian.Uint32(b), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetStateSyncCurrentBlockHeight returns current block height stored during state
|
||||||
|
// synchronisation process.
|
||||||
|
func (dao *Simple) GetStateSyncCurrentBlockHeight() (uint32, error) {
|
||||||
|
b, err := dao.Store.Get(storage.SYSStateSyncCurrentBlockHeight.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return binary.LittleEndian.Uint32(b), nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetHeaderHashes returns a sorted list of header hashes retrieved from
|
// GetHeaderHashes returns a sorted list of header hashes retrieved from
|
||||||
// the given underlying store.
|
// the given underlying store.
|
||||||
func (dao *Simple) GetHeaderHashes() ([]util.Uint256, error) {
|
func (dao *Simple) GetHeaderHashes() ([]util.Uint256, error) {
|
||||||
|
@ -466,6 +489,20 @@ func (dao *Simple) PutCurrentHeader(hashAndIndex []byte) error {
|
||||||
return dao.Store.Put(storage.SYSCurrentHeader.Bytes(), hashAndIndex)
|
return dao.Store.Put(storage.SYSCurrentHeader.Bytes(), hashAndIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PutStateSyncPoint stores current state synchronisation point P.
|
||||||
|
func (dao *Simple) PutStateSyncPoint(p uint32) error {
|
||||||
|
buf := make([]byte, 4)
|
||||||
|
binary.LittleEndian.PutUint32(buf, p)
|
||||||
|
return dao.Store.Put(storage.SYSStateSyncPoint.Bytes(), buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutStateSyncCurrentBlockHeight stores current block height during state synchronisation process.
|
||||||
|
func (dao *Simple) PutStateSyncCurrentBlockHeight(h uint32) error {
|
||||||
|
buf := make([]byte, 4)
|
||||||
|
binary.LittleEndian.PutUint32(buf, h)
|
||||||
|
return dao.Store.Put(storage.SYSStateSyncCurrentBlockHeight.Bytes(), buf)
|
||||||
|
}
|
||||||
|
|
||||||
// read2000Uint256Hashes attempts to read 2000 Uint256 hashes from
|
// read2000Uint256Hashes attempts to read 2000 Uint256 hashes from
|
||||||
// the given byte array.
|
// the given byte array.
|
||||||
func read2000Uint256Hashes(b []byte) ([]util.Uint256, error) {
|
func read2000Uint256Hashes(b []byte) ([]util.Uint256, error) {
|
||||||
|
|
|
@ -171,3 +171,33 @@ func TestMakeStorageItemKey(t *testing.T) {
|
||||||
actual = makeStorageItemKey(id, nil)
|
actual = makeStorageItemKey(id, nil)
|
||||||
require.Equal(t, expected, actual)
|
require.Equal(t, expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPutGetStateSyncPoint(t *testing.T) {
|
||||||
|
dao := NewSimple(storage.NewMemoryStore(), true)
|
||||||
|
|
||||||
|
// empty store
|
||||||
|
_, err := dao.GetStateSyncPoint()
|
||||||
|
require.Error(t, err)
|
||||||
|
|
||||||
|
// non-empty store
|
||||||
|
var expected uint32 = 5
|
||||||
|
require.NoError(t, dao.PutStateSyncPoint(expected))
|
||||||
|
actual, err := dao.GetStateSyncPoint()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPutGetStateSyncCurrentBlockHeight(t *testing.T) {
|
||||||
|
dao := NewSimple(storage.NewMemoryStore(), true)
|
||||||
|
|
||||||
|
// empty store
|
||||||
|
_, err := dao.GetStateSyncCurrentBlockHeight()
|
||||||
|
require.Error(t, err)
|
||||||
|
|
||||||
|
// non-empty store
|
||||||
|
var expected uint32 = 5
|
||||||
|
require.NoError(t, dao.PutStateSyncCurrentBlockHeight(expected))
|
||||||
|
actual, err := dao.GetStateSyncCurrentBlockHeight()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, expected, actual)
|
||||||
|
}
|
||||||
|
|
|
@ -8,19 +8,21 @@ import (
|
||||||
|
|
||||||
// KeyPrefix constants.
|
// KeyPrefix constants.
|
||||||
const (
|
const (
|
||||||
DataBlock KeyPrefix = 0x01
|
DataBlock KeyPrefix = 0x01
|
||||||
DataTransaction KeyPrefix = 0x02
|
DataTransaction KeyPrefix = 0x02
|
||||||
DataMPT KeyPrefix = 0x03
|
DataMPT KeyPrefix = 0x03
|
||||||
STAccount KeyPrefix = 0x40
|
STAccount KeyPrefix = 0x40
|
||||||
STNotification KeyPrefix = 0x4d
|
STNotification KeyPrefix = 0x4d
|
||||||
STContractID KeyPrefix = 0x51
|
STContractID KeyPrefix = 0x51
|
||||||
STStorage KeyPrefix = 0x70
|
STStorage KeyPrefix = 0x70
|
||||||
STNEP17Transfers KeyPrefix = 0x72
|
STNEP17Transfers KeyPrefix = 0x72
|
||||||
STNEP17TransferInfo KeyPrefix = 0x73
|
STNEP17TransferInfo KeyPrefix = 0x73
|
||||||
IXHeaderHashList KeyPrefix = 0x80
|
IXHeaderHashList KeyPrefix = 0x80
|
||||||
SYSCurrentBlock KeyPrefix = 0xc0
|
SYSCurrentBlock KeyPrefix = 0xc0
|
||||||
SYSCurrentHeader KeyPrefix = 0xc1
|
SYSCurrentHeader KeyPrefix = 0xc1
|
||||||
SYSVersion KeyPrefix = 0xf0
|
SYSStateSyncCurrentBlockHeight KeyPrefix = 0xc2
|
||||||
|
SYSStateSyncPoint KeyPrefix = 0xc3
|
||||||
|
SYSVersion KeyPrefix = 0xf0
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
Loading…
Reference in a new issue