mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2025-05-05 23:55:11 +00:00
blockchainer: allow to dump/restore chain
This commit is contained in:
parent
966b50f2ae
commit
6f7284906a
4 changed files with 208 additions and 91 deletions
|
@ -11,6 +11,7 @@ import (
|
|||
"github.com/nspcc-dev/neo-go/internal/testchain"
|
||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||
"github.com/nspcc-dev/neo-go/pkg/core/chaindump"
|
||||
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
||||
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
||||
"github.com/nspcc-dev/neo-go/pkg/core/mempool"
|
||||
|
@ -1032,3 +1033,63 @@ func TestSubscriptions(t *testing.T) {
|
|||
_, err = bc.genBlocks(2 * chBufSize)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func testDumpAndRestore(t *testing.T, stateRootInHeader bool) {
|
||||
bc := newTestChainWithStateRoot(t, stateRootInHeader)
|
||||
defer bc.Close()
|
||||
|
||||
initBasicChain(t, bc)
|
||||
require.True(t, bc.BlockHeight() > 5) // ensure that test is valid
|
||||
|
||||
w := io.NewBufBinWriter()
|
||||
require.NoError(t, chaindump.Dump(bc, w.BinWriter, 0, bc.BlockHeight()+1))
|
||||
require.NoError(t, w.Err)
|
||||
|
||||
buf := w.Bytes()
|
||||
t.Run("invalid start", func(t *testing.T) {
|
||||
bc2 := newTestChainWithStateRoot(t, stateRootInHeader)
|
||||
defer bc2.Close()
|
||||
|
||||
r := io.NewBinReaderFromBuf(buf)
|
||||
require.Error(t, chaindump.Restore(bc2, r, 2, 1, nil))
|
||||
})
|
||||
t.Run("good", func(t *testing.T) {
|
||||
bc2 := newTestChainWithStateRoot(t, stateRootInHeader)
|
||||
defer bc2.Close()
|
||||
|
||||
r := io.NewBinReaderFromBuf(buf)
|
||||
require.NoError(t, chaindump.Restore(bc2, r, 0, 2, nil))
|
||||
require.Equal(t, uint32(1), bc2.BlockHeight())
|
||||
|
||||
r = io.NewBinReaderFromBuf(buf) // new reader because start is relative to dump
|
||||
require.NoError(t, chaindump.Restore(bc2, r, 2, 1, nil))
|
||||
t.Run("check handler", func(t *testing.T) {
|
||||
lastIndex := uint32(0)
|
||||
errStopped := errors.New("stopped")
|
||||
f := func(b *block.Block) error {
|
||||
lastIndex = b.Index
|
||||
if b.Index >= bc.BlockHeight()-1 {
|
||||
return errStopped
|
||||
}
|
||||
return nil
|
||||
}
|
||||
require.NoError(t, chaindump.Restore(bc2, r, 0, 1, f))
|
||||
require.Equal(t, bc2.BlockHeight(), lastIndex)
|
||||
|
||||
r = io.NewBinReaderFromBuf(buf)
|
||||
err := chaindump.Restore(bc2, r, 4, bc.BlockHeight()-bc2.BlockHeight(), f)
|
||||
require.True(t, errors.Is(err, errStopped))
|
||||
require.Equal(t, bc.BlockHeight()-1, lastIndex)
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func TestDumpAndRestore(t *testing.T) {
|
||||
t.Run("no state root", func(t *testing.T) {
|
||||
testDumpAndRestore(t, false)
|
||||
})
|
||||
t.Run("with state root", func(t *testing.T) {
|
||||
testDumpAndRestore(t, true)
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue