Merge pull request #3357 from filecoin-project/fix/block-validator-power

ignore, don't reject block if we can't determine power
This commit is contained in:
Łukasz Magiera 2020-08-28 00:24:53 +02:00 committed by GitHub
commit 86c936759b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,6 +3,7 @@ package sub
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"fmt" "fmt"
"sync" "sync"
"time" "time"
@ -40,6 +41,9 @@ import (
var log = logging.Logger("sub") var log = logging.Logger("sub")
var ErrSoftFailure = errors.New("soft validation failure")
var ErrInsufficientPower = errors.New("incoming block's miner does not have minimum power")
func HandleIncomingBlocks(ctx context.Context, bsub *pubsub.Subscription, s *chain.Syncer, bserv bserv.BlockService, cmgr connmgr.ConnManager) { func HandleIncomingBlocks(ctx context.Context, bsub *pubsub.Subscription, s *chain.Syncer, bserv bserv.BlockService, cmgr connmgr.ConnManager) {
for { for {
msg, err := bsub.Next(ctx) msg, err := bsub.Next(ctx)
@ -288,11 +292,12 @@ func (bv *BlockValidator) Validate(ctx context.Context, pid peer.ID, msg *pubsub
// if we are synced and the miner is unknown, then the block is rejcected. // if we are synced and the miner is unknown, then the block is rejcected.
key, err := bv.checkPowerAndGetWorkerKey(ctx, blk.Header) key, err := bv.checkPowerAndGetWorkerKey(ctx, blk.Header)
if err != nil { if err != nil {
if bv.isChainNearSynced() { if err != ErrSoftFailure && bv.isChainNearSynced() {
log.Warnf("received block from unknown miner or miner that doesn't meet min power over pubsub; rejecting message") log.Warnf("received block from unknown miner or miner that doesn't meet min power over pubsub; rejecting message")
recordFailure("unknown_miner") recordFailure("unknown_miner")
return pubsub.ValidationReject return pubsub.ValidationReject
} }
log.Warnf("cannot validate block message; unknown miner or miner that doesn't meet min power in unsynced chain") log.Warnf("cannot validate block message; unknown miner or miner that doesn't meet min power in unsynced chain")
return pubsub.ValidationIgnore return pubsub.ValidationIgnore
} }
@ -473,19 +478,19 @@ func (bv *BlockValidator) checkPowerAndGetWorkerKey(ctx context.Context, bh *typ
baseTs := bv.chain.GetHeaviestTipSet() baseTs := bv.chain.GetHeaviestTipSet()
lbts, err := stmgr.GetLookbackTipSetForRound(ctx, bv.stmgr, baseTs, bh.Height) lbts, err := stmgr.GetLookbackTipSetForRound(ctx, bv.stmgr, baseTs, bh.Height)
if err != nil { if err != nil {
log.Warnf("failed to load lookback tipset for incoming block") log.Warnf("failed to load lookback tipset for incoming block: %s", err)
return address.Undef, err return address.Undef, ErrSoftFailure
} }
hmp, err := stmgr.MinerHasMinPower(ctx, bv.stmgr, bh.Miner, lbts) hmp, err := stmgr.MinerHasMinPower(ctx, bv.stmgr, bh.Miner, lbts)
if err != nil { if err != nil {
log.Warnf("failed to determine if incoming block's miner has minimum power") log.Warnf("failed to determine if incoming block's miner has minimum power: %s", err)
return address.Undef, err return address.Undef, ErrSoftFailure
} }
if !hmp { if !hmp {
log.Warnf("incoming block's miner does not have minimum power") log.Warnf("incoming block's miner does not have minimum power")
return address.Undef, xerrors.New("incoming block's miner does not have minimum power") return address.Undef, ErrInsufficientPower
} }
return key, nil return key, nil