mirror of
https://github.com/kaspanet/kaspad.git
synced 2026-03-06 17:11:31 +00:00
* [NOD-1190] Move non-processBlock stuff out of process.go. * [NOD-1190] Move everything out of accept.go. * [NOD-1190] Move all processBlock functions to process.go. * [NOD-1190] Move orphan stuff to orphan.go. * [NOD-1190] Remove thresholdstate stuff. * [NOD-1190] Move isSynced to sync_rate.go. * [NOD-1190] Move delayed block stuff to delayed_blocks.go. * [NOD-1190] Rename orphans.go to orphaned_blocks.go. * [NOD-1190] Move non-BlockDAG structs out of dag.go. * [NOD-1190] Remove unused fields. * [NOD-1190] Fixup BlockDAG.New a bit. * [NOD-1190] Move sequence lock stuff to sequence_lock.go * [NOD-1190] Move some multiset stuff out of dag.go. * [NOD-1190] Move finality stuff out of dag.go. * [NOD-1190] Move blocklocator stuff out of dag.go. * [NOD-1190] Move confirmation stuff out of dag.go. * [NOD-1190] Move utxo and selected parent chain stuff out of dag.go. * [NOD-1190] Move BlockDAG lock functions to the beginning of dag.go. * [NOD-1190] Move verifyAndBuildUTXO out of process.go. * [NOD-1190] Extract handleProcessBlockError to a function. * [NOD-1190] Remove daglock unlock in notifyBlockAccepted. * [NOD-1190] Extract checkDuplicateBlock to a method. * [NOD-1190] Fix merge errors. * [NOD-1190] Remove unused parameter from CalcSequenceLock. * [NOD-1190] Extract processBlock contents into functions. * [NOD-1190] Fix parent delayed blocks not marking their children as delayed * [NOD-1190] Fix TestProcessDelayedBlocks. * [NOD-1190] Extract stuff in maybeAcceptBlock to separate functions. * [NOD-1190] Rename handleProcessBlockError to handleConnectBlockError. * [NOD-1190] Remove some comments. * [NOD-1190] Use lowercase in error messages. * [NOD-1190] Rename createNewBlockNode to createBlockNodeFromBlock. * [NOD-1190] Rename orphaned_blocks.go to orpan_blocks.go. * [NOD-1190] Extract validateUTXOCommitment to a separate function. * [NOD-1190] Fix a bug in validateUTXOCommitment. * [NOD-1190] Rename checkBlockTxsFinalized to checkBlockTransactionsFinalized. * [NOD-1190] Add a comment over createBlockNodeFromBlock. * [NOD-1190] Fold validateAllTxsFinalized into checkBlockTransactionsFinalized. * [NOD-1190] Return parents from checkBlockParents. * [NOD-1190] Remove the processBlock prefix from the functions that had it. * [NOD-1190] Begin extracting functions out of checkTransactionSanity. * [NOD-1190] Finish extracting functions out of checkTransactionSanity. * [NOD-1190] Remove an unused parameter. * [NOD-1190] Fix merge errors. * [NOD-1190] Added an explanation as to why we change the nonce in TestProcessDelayedBlocks. * [NOD-1190] Fix a comment. * [NOD-1190] Fix a comment. * [NOD-1190] Fix a typo. * [NOD-1190] Replace checkBlockParents with handleLookupParentNodesError.
104 lines
3.5 KiB
Go
104 lines
3.5 KiB
Go
package blockdag
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/util/mstime"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
syncRateWindowDuration = 15 * time.Minute
|
|
|
|
// isDAGCurrentMaxDiff is the number of blocks from the network tips (estimated by timestamps) for the current
|
|
// to be considered not synced
|
|
isDAGCurrentMaxDiff = 40_000
|
|
)
|
|
|
|
// addBlockProcessingTimestamp adds the last block processing timestamp in order to measure the recent sync rate.
|
|
//
|
|
// This function MUST be called with the DAG state lock held (for writes).
|
|
func (dag *BlockDAG) addBlockProcessingTimestamp() {
|
|
now := mstime.Now()
|
|
dag.recentBlockProcessingTimestamps = append(dag.recentBlockProcessingTimestamps, now)
|
|
dag.removeNonRecentTimestampsFromRecentBlockProcessingTimestamps()
|
|
}
|
|
|
|
// removeNonRecentTimestampsFromRecentBlockProcessingTimestamps removes timestamps older than syncRateWindowDuration
|
|
// from dag.recentBlockProcessingTimestamps
|
|
//
|
|
// This function MUST be called with the DAG state lock held (for writes).
|
|
func (dag *BlockDAG) removeNonRecentTimestampsFromRecentBlockProcessingTimestamps() {
|
|
dag.recentBlockProcessingTimestamps = dag.recentBlockProcessingTimestampsRelevantWindow()
|
|
}
|
|
|
|
func (dag *BlockDAG) recentBlockProcessingTimestampsRelevantWindow() []mstime.Time {
|
|
minTime := mstime.Now().Add(-syncRateWindowDuration)
|
|
windowStartIndex := len(dag.recentBlockProcessingTimestamps)
|
|
for i, processTime := range dag.recentBlockProcessingTimestamps {
|
|
if processTime.After(minTime) {
|
|
windowStartIndex = i
|
|
break
|
|
}
|
|
}
|
|
return dag.recentBlockProcessingTimestamps[windowStartIndex:]
|
|
}
|
|
|
|
// syncRate returns the rate of processed
|
|
// blocks in the last syncRateWindowDuration
|
|
// duration.
|
|
func (dag *BlockDAG) syncRate() float64 {
|
|
dag.RLock()
|
|
defer dag.RUnlock()
|
|
return float64(len(dag.recentBlockProcessingTimestampsRelevantWindow())) / syncRateWindowDuration.Seconds()
|
|
}
|
|
|
|
// IsSyncRateBelowThreshold checks whether the sync rate
|
|
// is below the expected threshold.
|
|
func (dag *BlockDAG) IsSyncRateBelowThreshold(maxDeviation float64) bool {
|
|
if dag.uptime() < syncRateWindowDuration {
|
|
return false
|
|
}
|
|
|
|
return dag.syncRate() < 1/dag.Params.TargetTimePerBlock.Seconds()*maxDeviation
|
|
}
|
|
|
|
func (dag *BlockDAG) uptime() time.Duration {
|
|
return mstime.Now().Sub(dag.startTime)
|
|
}
|
|
|
|
// isSynced returns whether or not the DAG believes it is synced. Several
|
|
// factors are used to guess, but the key factors that allow the DAG to
|
|
// believe it is synced are:
|
|
// - Latest block has a timestamp newer than 24 hours ago
|
|
//
|
|
// This function MUST be called with the DAG state lock held (for reads).
|
|
func (dag *BlockDAG) isSynced() bool {
|
|
// Not synced if the virtual's selected parent has a timestamp
|
|
// before 24 hours ago. If the DAG is empty, we take the genesis
|
|
// block timestamp.
|
|
//
|
|
// The DAG appears to be syncned if none of the checks reported
|
|
// otherwise.
|
|
var dagTimestamp int64
|
|
selectedTip := dag.selectedTip()
|
|
if selectedTip == nil {
|
|
dagTimestamp = dag.Params.GenesisBlock.Header.Timestamp.UnixMilliseconds()
|
|
} else {
|
|
dagTimestamp = selectedTip.timestamp
|
|
}
|
|
dagTime := mstime.UnixMilliseconds(dagTimestamp)
|
|
return dag.Now().Sub(dagTime) <= isDAGCurrentMaxDiff*dag.Params.TargetTimePerBlock
|
|
}
|
|
|
|
// IsSynced returns whether or not the DAG believes it is synced. Several
|
|
// factors are used to guess, but the key factors that allow the DAG to
|
|
// believe it is synced are:
|
|
// - Latest block has a timestamp newer than 24 hours ago
|
|
//
|
|
// This function is safe for concurrent access.
|
|
func (dag *BlockDAG) IsSynced() bool {
|
|
dag.dagLock.RLock()
|
|
defer dag.dagLock.RUnlock()
|
|
|
|
return dag.isSynced()
|
|
}
|