Merge pull request #2802 from nspcc-dev/fix-node-startup-with-broken-contract

Fix node startup with broken contract
This commit is contained in:
Roman Khimov 2022-11-16 16:21:56 +07:00 committed by GitHub
commit 5f763a26e7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 8 additions and 10 deletions

View file

@ -636,7 +636,7 @@ func initBlockChain(cfg config.Config, log *zap.Logger) (*core.Blockchain, stora
errArgs = append(errArgs, closeErr)
}
return nil, nil, cli.NewExitError(fmt.Errorf(errText, errArgs), 1)
return nil, nil, cli.NewExitError(fmt.Errorf(errText, errArgs...), 1)
}
return chain, store, nil
}

View file

@ -207,6 +207,7 @@ func TestBlockchain_StartFromExistingDB(t *testing.T) {
require.Error(t, err)
require.True(t, strings.Contains(err.Error(), "can't init MPT at height"), err)
})
/* See #2801
t.Run("failed native Management initialisation", func(t *testing.T) {
ps = newPS(t)
@ -223,6 +224,7 @@ func TestBlockchain_StartFromExistingDB(t *testing.T) {
require.Error(t, err)
require.True(t, strings.Contains(err.Error(), "can't init cache for Management native contract"), err)
})
*/
t.Run("invalid native contract deactivation", func(t *testing.T) {
ps = newPS(t)
_, _, _, err := chain.NewMultiWithCustomConfigAndStoreNoCheck(t, func(c *config.ProtocolConfiguration) {

View file

@ -539,19 +539,13 @@ func (m *Management) InitializeCache(d *dao.Simple) error {
nep17: make(map[util.Uint160]struct{}),
}
var initErr error
d.Seek(m.ID, storage.SeekRange{Prefix: []byte{PrefixContract}}, func(_, v []byte) bool {
d.Seek(m.ID, storage.SeekRange{Prefix: []byte{PrefixContract}}, func(k, v []byte) bool {
var cs = new(state.Contract)
initErr = stackitem.DeserializeConvertible(v, cs)
if initErr != nil {
return false
if stackitem.DeserializeConvertible(v, cs) == nil {
updateContractCache(cache, cs)
}
updateContractCache(cache, cs)
return true
})
if initErr != nil {
return initErr
}
d.SetCache(m.ID, cache)
return nil
}

View file

@ -78,12 +78,14 @@ func TestManagement_Initialize(t *testing.T) {
mgmt := newManagement()
require.NoError(t, mgmt.InitializeCache(d))
})
/* See #2801
t.Run("invalid contract state", func(t *testing.T) {
d := dao.NewSimple(storage.NewMemoryStore(), false, false)
mgmt := newManagement()
d.PutStorageItem(mgmt.ID, []byte{PrefixContract}, state.StorageItem{0xFF})
require.Error(t, mgmt.InitializeCache(d))
})
*/
}
func TestManagement_GetNEP17Contracts(t *testing.T) {