From 1a51d2d34c6a6375303023305861516cba39708c Mon Sep 17 00:00:00 2001 From: NguyenNguyen Date: Thu, 4 Apr 2019 11:06:50 +0700 Subject: [PATCH] Fix #482: Ignore order of masternodes list --- consensus/posv/posv.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/consensus/posv/posv.go b/consensus/posv/posv.go index 7508a24fc8..35177163ac 100644 --- a/consensus/posv/posv.go +++ b/consensus/posv/posv.go @@ -25,6 +25,8 @@ import ( "math/big" "math/rand" "path/filepath" + "reflect" + "sort" "strconv" "sync" "time" @@ -424,9 +426,18 @@ func (c *Posv) verifyCascadingFields(chain consensus.ChainReader, header *types. signers = RemovePenaltiesFromBlock(chain, signers, number-uint64(i)*c.config.Epoch) } } - byteMasterNodes := common.ExtractAddressToBytes(signers) extraSuffix := len(header.Extra) - extraSeal - if !bytes.Equal(header.Extra[extraVanity:extraSuffix], byteMasterNodes) { + masternodesFromCheckpointHeader := common.ExtractAddressFromBytes(header.Extra[extraVanity:extraSuffix]) + validSigners := true + sort.Slice(masternodesFromCheckpointHeader, func(i, j int) bool { + return masternodesFromCheckpointHeader[i].String() <= masternodesFromCheckpointHeader[j].String() + }) + sort.Slice(signers, func(i, j int) bool { + return signers[i].String() <= signers[j].String() + }) + validSigners = reflect.DeepEqual(masternodesFromCheckpointHeader, signers) + if !validSigners { + log.Error("Masternodes lists are different in checkpoint header and snapshot", "number", number, "masternodes_from_checkpoint_header", masternodesFromCheckpointHeader, "masternodes_in_snapshot", signers, "penList", penPenalties) return errInvalidCheckpointSigners } if c.HookVerifyMNs != nil {