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:
commit
86c936759b
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user