Adds "checkDelayedBlock" - checks if the block timeStamp is in the future. (#1183)

* [#1056] Adds "checkDelayedBlock" - check if the block timeStamp is in future.
Adds 2 new fields to blockValidator struct.
Adds new Rule Error "ErrDelayedBlock" .

* [#1056] Replace "ErrDelayedBlock" to "ErrBlockIsTooMuchInTheFuture".

* [#1056] Replace "checkDelayedBlock" to "checkBlockTimeStampInIsolation".

* [#1056] Cosmetics changes: timeStamp -> timestamp .

* Merge remote-tracking branch 'origin/v0.8.2-dev' into droppedDelayedBlock

# Conflicts:
#	domain/consensus/factory.go
#	domain/consensus/processes/blockvalidator/block_header_in_isolation.go
#	domain/consensus/processes/blockvalidator/blockvalidator.go

Co-authored-by: tal <tal@daglabs.com>
This commit is contained in:
talelbaz 2020-12-06 18:41:07 +02:00 committed by GitHub
parent 7f899b0d09
commit 78550d3639
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 57 additions and 29 deletions

View File

@ -1,12 +1,11 @@
package consensus
import (
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtraversalmanager"
"io/ioutil"
"os"
"sync"
"github.com/kaspanet/kaspad/domain/consensus/processes/dagtraversalmanager"
"github.com/kaspanet/kaspad/infrastructure/db/database/ldb"
consensusdatabase "github.com/kaspanet/kaspad/domain/consensus/database"
@ -152,6 +151,8 @@ func (f *factory) NewConsensus(dagParams *dagconfig.Params, db infrastructuredat
dagParams.MaxBlockSize,
dagParams.MergeSetSizeLimit,
dagParams.MaxBlockParents,
dagParams.TimestampDeviationTolerance,
dagParams.TargetTimePerBlock,
dbManager,
difficultyManager,

View File

@ -4,6 +4,7 @@ import (
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/ruleerrors"
"github.com/kaspanet/kaspad/domain/consensus/utils/consensushashing"
"github.com/kaspanet/kaspad/util/mstime"
"github.com/pkg/errors"
)
@ -15,6 +16,11 @@ func (v *blockValidator) ValidateHeaderInIsolation(blockHash *externalapi.Domain
return err
}
err = v.checkBlockTimestampInIsolation(header)
if err != nil {
return err
}
err = v.checkParentsLimit(header)
if err != nil {
return err
@ -35,3 +41,15 @@ func (v *blockValidator) checkParentsLimit(header *externalapi.DomainBlockHeader
}
return nil
}
func (v *blockValidator) checkBlockTimestampInIsolation(header *externalapi.DomainBlockHeader) error {
blockTimestamp := header.TimeInMilliseconds
now := mstime.Now().UnixMilliseconds()
maxCurrentTime := now + int64(v.timestampDeviationTolerance)*v.targetTimePerBlock.Milliseconds()
if blockTimestamp > maxCurrentTime {
return errors.Wrapf(
ruleerrors.ErrBlockIsTooMuchInTheFuture, "The block timestamp is in the future.")
}
return nil
}

View File

@ -2,6 +2,7 @@ package blockvalidator
import (
"math/big"
"time"
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
@ -11,14 +12,16 @@ import (
// blockValidator exposes a set of validation classes, after which
// it's possible to determine whether either a block is valid
type blockValidator struct {
powMax *big.Int
skipPoW bool
genesisHash *externalapi.DomainHash
enableNonNativeSubnetworks bool
powMaxBits uint32
maxBlockSize uint64
mergeSetSizeLimit uint64
maxBlockParents model.KType
powMax *big.Int
skipPoW bool
genesisHash *externalapi.DomainHash
enableNonNativeSubnetworks bool
powMaxBits uint32
maxBlockSize uint64
mergeSetSizeLimit uint64
maxBlockParents model.KType
timestampDeviationTolerance uint64
targetTimePerBlock time.Duration
databaseContext model.DBReader
difficultyManager model.DifficultyManager
@ -45,6 +48,8 @@ func New(powMax *big.Int,
maxBlockSize uint64,
mergeSetSizeLimit uint64,
maxBlockParents model.KType,
timestampDeviationTolerance uint64,
targetTimePerBlock time.Duration,
databaseContext model.DBReader,
@ -64,25 +69,26 @@ func New(powMax *big.Int,
blockStatusStore model.BlockStatusStore) model.BlockValidator {
return &blockValidator{
powMax: powMax,
skipPoW: skipPoW,
genesisHash: genesisHash,
enableNonNativeSubnetworks: enableNonNativeSubnetworks,
powMaxBits: util.BigToCompact(powMax),
maxBlockSize: maxBlockSize,
mergeSetSizeLimit: mergeSetSizeLimit,
maxBlockParents: maxBlockParents,
databaseContext: databaseContext,
difficultyManager: difficultyManager,
pastMedianTimeManager: pastMedianTimeManager,
transactionValidator: transactionValidator,
ghostdagManager: ghostdagManager,
dagTopologyManager: dagTopologyManager,
dagTraversalManager: dagTraversalManager,
coinbaseManager: coinbaseManager,
mergeDepthManager: mergeDepthManager,
pruningStore: pruningStore,
powMax: powMax,
skipPoW: skipPoW,
genesisHash: genesisHash,
enableNonNativeSubnetworks: enableNonNativeSubnetworks,
powMaxBits: util.BigToCompact(powMax),
maxBlockSize: maxBlockSize,
mergeSetSizeLimit: mergeSetSizeLimit,
maxBlockParents: maxBlockParents,
timestampDeviationTolerance: timestampDeviationTolerance,
targetTimePerBlock: targetTimePerBlock,
databaseContext: databaseContext,
difficultyManager: difficultyManager,
pastMedianTimeManager: pastMedianTimeManager,
transactionValidator: transactionValidator,
ghostdagManager: ghostdagManager,
dagTopologyManager: dagTopologyManager,
dagTraversalManager: dagTraversalManager,
coinbaseManager: coinbaseManager,
mergeDepthManager: mergeDepthManager,
pruningStore: pruningStore,
blockStore: blockStore,
ghostdagDataStore: ghostdagDataStore,

View File

@ -234,6 +234,9 @@ var (
//ErrPruningPointViolation indicates that the pruning point isn't in the block past.
ErrPruningPointViolation = newRuleError("ErrPruningPointViolation")
//ErrBlockIsTooMuchInTheFuture indicates that the block timestamp is too much in the future.
ErrBlockIsTooMuchInTheFuture = newRuleError("ErrBlockIsTooMuchInTheFuture")
)
// RuleError identifies a rule violation. It is used to indicate that