From 58b7e16e0e6fdc0ae58e40723126fdf3525829d8 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Thu, 4 Jun 2020 17:19:30 +0300 Subject: [PATCH] core: fix PrevHash calculation for MPTRoot This was differing from C# notion of PrevHash. It's not a previous root, but rather a hash of the previous serialized MPTRoot structure (that is to be signed by CNs). Signed-off-by: Evgenii Stratonikov --- pkg/core/blockchain.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index d592eb085..7b2b45064 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -17,6 +17,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/state" "github.com/nspcc-dev/neo-go/pkg/core/storage" "github.com/nspcc-dev/neo-go/pkg/core/transaction" + "github.com/nspcc-dev/neo-go/pkg/crypto/hash" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/encoding/bigint" "github.com/nspcc-dev/neo-go/pkg/io" @@ -648,7 +649,7 @@ func (bc *Blockchain) storeBlock(block *block.Block) error { if err != nil { return errors.WithMessagef(err, "can't get previous state root") } - prevHash = prev.Root + prevHash = hash.DoubleSha256(prev.GetSignedPart()) } err := bc.AddStateRoot(&state.MPTRoot{ MPTRootBase: state.MPTRootBase{ @@ -1264,7 +1265,7 @@ func (bc *Blockchain) verifyStateRoot(r *state.MPTRoot) error { prev, err := bc.GetStateRoot(r.Index - 1) if err != nil { return errors.New("can't get previous state root") - } else if !prev.Root.Equals(r.PrevHash) { + } else if !r.PrevHash.Equals(hash.DoubleSha256(prev.GetSignedPart())) { return errors.New("previous hash mismatch") } else if prev.Version != r.Version { return errors.New("version mismatch")