From e639f0f46e109b43b67e2068ad68981419d1fde5 Mon Sep 17 00:00:00 2001 From: DinhLN Date: Tue, 22 Jan 2019 10:49:16 +0700 Subject: [PATCH] Fixed check penalty signers working when it return chain. --- eth/backend.go | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/eth/backend.go b/eth/backend.go index 1e86f96829..7a649d9c53 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -274,6 +274,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { start := time.Now() prevHeader := chain.GetHeaderByNumber(prevEpoc) penSigners := c.GetMasternodes(chain, prevHeader) + goodSigners := make(map[common.Address]*big.Int) if len(penSigners) > 0 { // Loop for each block to check missing sign. for i := prevEpoc; i < blockNumberEpoc; i++ { @@ -282,25 +283,33 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { bhash := bheader.Hash() block := chain.GetBlock(bhash, i) if len(penSigners) > 0 { - signedMasternodes, err := contracts.GetSignersFromContract(canonicalState, block) + signer, err := c.RecoverSigner(block.Header()) if err != nil { return nil, err } - if len(signedMasternodes) > 0 { - // Check signer signed? - for _, signed := range signedMasternodes { - for j, addr := range penSigners { - if signed == addr { - // Remove it from dupSigners. - penSigners = append(penSigners[:j], penSigners[j+1:]...) - } - } + for _, addr := range penSigners { + if signer == addr { + // Remove it from dupSigners. + goodSigners[signer] = goodSigners[signer].Add(goodSigners[signer], big.NewInt(1)) } } } else { break } } + + if len(goodSigners) > 0 { + for signer, totalSign := range goodSigners { + if totalSign.Cmp(big.NewInt(4)) >= 0 { + for j, addr := range penSigners { + if signer == addr { + // Remove it from dupSigners. + penSigners = append(penSigners[:j], penSigners[j+1:]...) + } + } + } + } + } } } log.Debug("Time Calculated HookPenalty ", "block", blockNumberEpoc, "time", common.PrettyDuration(time.Since(start)))