mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-06-12 00:56:42 +00:00

* Pruning headers p2p basic structure * Remove headers-first * Fix consensus tests except TestValidateAndInsertPruningPointWithSideBlocks and TestValidateAndInsertImportedPruningPoint * Add virtual genesis * Implement PruningPointAndItsAnticoneWithMetaData * Start fixing TestValidateAndInsertImportedPruningPoint * Fix TestValidateAndInsertImportedPruningPoint * Fix BlockWindow * Update p2p and gRPC * Fix all tests except TestHandleRelayInvs * Delete TestHandleRelayInvs parts that cover the old IBD flow * Fix lint errors * Add p2p_request_ibd_blocks.go * Clean code * Make MsgBlockWithMetaData implement its own representation * Remove redundant check if highest share block is below the pruning point * Fix TestCheckLockTimeVerifyConditionedByAbsoluteTimeWithWrongLockTime * Fix comments, errors ane names * Fix window size to the real value * Check reindex root after each block at TestUpdateReindexRoot * Remove irrelevant check * Renames and comments * Remove redundant argument from sendGetBlockLocator * Don't delete staging on non-recoverable errors * Renames and comments * Remove redundant code * Commit changes inside ResolveVirtual * Add comment to IsRecoverableError * Remove blocksWithMetaDataGHOSTDAGDataStore * Increase windows pagefile * Move DeleteStagingConsensus outside of defer * Get rid of mustAccepted in receiveBlockWithMetaData * Ban on invalid pruning point * Rename interface_datastructures_daawindowstore.go to interface_datastructures_blocks_with_meta_data_daa_window_store.go * * Change GetVirtualSelectedParentChainFromBlockResponseMessage and VirtualSelectedParentChainChangedNotificationMessage to show only added block hashes * Remove ResolveVirtual * Use externalapi.ConsensusWrapper inside MiningManager * Fix pruningmanager.blockwithmetadata * Set pruning point selected child when importing the pruning point UTXO set * Change virtual genesis hash * replace the selected parent with virtual genesis on removePrunedBlocksFromGHOSTDAGData * Get rid of low hash in block locators * Remove +1 from everywhere we use difficultyAdjustmentWindowSize and increase the default value by one * Add comments about consensus wrapper * Don't use separate staging area when resolving resolveBlockStatus * Fix netsync stability test * Fix checkResolveVirtual * Rename ConsensusWrapper->ConsensusReference * Get rid of blockHeapNode * Add comment to defaultDifficultyAdjustmentWindowSize * Add SelectedChild to DAGTraversalManager * Remove redundant copy * Rename blockWindowHeap->calculateBlockWindowHeap * Move isVirtualGenesisOnlyParent to utils * Change BlockWithMetaData->BlockWithTrustedData * Get rid of maxReasonLength * Split IBD to 100 blocks each time * Fix a bug in calculateBlockWindowHeap * Switch to trusted data when encountering virtual genesis in blockWithTrustedData * Move ConsensusReference to domain * Update ConsensusReference comment * Add comment * Rename shouldNotAddGenesis->skipAddingGenesis
75 lines
2.4 KiB
Go
75 lines
2.4 KiB
Go
package difficultymanager
|
|
|
|
import (
|
|
"math/big"
|
|
|
|
"github.com/kaspanet/kaspad/domain/consensus/model"
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
"github.com/kaspanet/kaspad/infrastructure/logger"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
func (dm *difficultyManager) EstimateNetworkHashesPerSecond(startHash *externalapi.DomainHash, windowSize int) (uint64, error) {
|
|
onEnd := logger.LogAndMeasureExecutionTime(log, "EstimateNetworkHashesPerSecond")
|
|
defer onEnd()
|
|
|
|
stagingArea := model.NewStagingArea()
|
|
return dm.estimateNetworkHashesPerSecond(stagingArea, startHash, windowSize)
|
|
}
|
|
|
|
func (dm *difficultyManager) estimateNetworkHashesPerSecond(stagingArea *model.StagingArea,
|
|
startHash *externalapi.DomainHash, windowSize int) (uint64, error) {
|
|
|
|
const minWindowSize = 1000
|
|
if windowSize < minWindowSize {
|
|
return 0, errors.Errorf("windowSize must be equal to or greater than %d", minWindowSize)
|
|
}
|
|
|
|
blockWindow, windowHashes, err := dm.blockWindow(stagingArea, startHash, windowSize)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
// return 0 if no blocks had been mined yet
|
|
if len(windowHashes) == 0 {
|
|
return 0, nil
|
|
}
|
|
|
|
minWindowTimestamp, maxWindowTimestamp, _, _ := blockWindow.minMaxTimestamps()
|
|
if minWindowTimestamp == maxWindowTimestamp {
|
|
return 0, errors.Errorf("min window timestamp is equal to the max window timestamp")
|
|
}
|
|
|
|
firstHash := windowHashes[0]
|
|
firstBlockGHOSTDAGData, err := dm.ghostdagStore.Get(dm.databaseContext, stagingArea, firstHash, false)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
firstBlockBlueWork := firstBlockGHOSTDAGData.BlueWork()
|
|
minWindowBlueWork := firstBlockBlueWork
|
|
maxWindowBlueWork := firstBlockBlueWork
|
|
for _, hash := range windowHashes[1:] {
|
|
blockGHOSTDAGData, err := dm.ghostdagStore.Get(dm.databaseContext, stagingArea, hash, false)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
blockBlueWork := blockGHOSTDAGData.BlueWork()
|
|
if blockBlueWork.Cmp(minWindowBlueWork) < 0 {
|
|
minWindowBlueWork = blockBlueWork
|
|
}
|
|
if blockBlueWork.Cmp(maxWindowBlueWork) > 0 {
|
|
maxWindowBlueWork = blockBlueWork
|
|
}
|
|
}
|
|
|
|
windowsDiff := (maxWindowTimestamp - minWindowTimestamp) / 1000 // Divided by 1000 to convert milliseconds to seconds
|
|
if windowsDiff == 0 {
|
|
return 0, nil
|
|
}
|
|
|
|
nominator := new(big.Int).Sub(maxWindowBlueWork, minWindowBlueWork)
|
|
denominator := big.NewInt(windowsDiff)
|
|
networkHashesPerSecondBigInt := new(big.Int).Div(nominator, denominator)
|
|
return networkHashesPerSecondBigInt.Uint64(), nil
|
|
}
|