mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-09-13 21:10:12 +00:00

* Add StagingArea struct * Implemented staging areas in blockStore * Move blockStagingShard to separate folder * Apply staging shard to acceptanceDataStore * Update blockHeaderStore with StagingArea * Add StagingArea to BlockRelationStore * Add StagingArea to blockStatusStore * Add StagingArea to consensusStateStore * Add StagingArea to daaBlocksStore * Add StagingArea to finalityStore * Add StagingArea to ghostdagDataStore * Add StagingArea to headersSelectedChainStore and headersSelectedTipStore * Add StagingArea to multisetStore * Add StagingArea to pruningStore * Add StagingArea to reachabilityDataStore * Add StagingArea to utxoDiffStore * Fix forgotten compilation error * Update reachability manager and some more things with StagingArea * Add StagingArea to dagTopologyManager, and some more * Add StagingArea to GHOSTDAGManager, and some more * Add StagingArea to difficultyManager, and some more * Add StagingArea to dagTraversalManager, and some more * Add StagingArea to headerTipsManager, and some more * Add StagingArea to constnsusStateManager, pastMedianTimeManager * Add StagingArea to transactionValidator * Add StagingArea to finalityManager * Add StagingArea to mergeDepthManager * Add StagingArea to pruningManager * Add StagingArea to rest of ValidateAndInsertBlock * Add StagingArea to blockValidator * Add StagingArea to coinbaseManager * Add StagingArea to syncManager * Add StagingArea to blockBuilder * Update consensus with StagingArea * Add StagingArea to ghostdag2 * Fix remaining compilation errors * Update names of stagingShards * Fix forgotten stagingArea passing * Mark stagingShard.isCommited = true once commited * Move isStaged to stagingShard, so that it's available without going through store * Make blockHeaderStore count be avilable from stagingShard * Fix remaining forgotten stagingArea passing * commitAllChanges should call dbTx.Commit in the end * Fix all tests tests in blockValidator * Fix all tests in consensusStateManager and some more * Fix all tests in pruningManager * Add many missing stagingAreas in tests * Fix many tests * Fix most of all other tests * Fix ghostdag_test.go * Add comment to StagingArea * Make list of StagingShards an array * Add comment to StagingShardID * Make sure all staging shards are pointer-receiver * Undo bucket rename in block_store * Typo: isCommited -> isCommitted * Add comment explaining why stagingArea.shards is an array
85 lines
2.4 KiB
Go
85 lines
2.4 KiB
Go
package pastmediantimemanager
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/sorters"
|
|
|
|
"github.com/kaspanet/kaspad/domain/consensus/model"
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// pastMedianTimeManager provides a method to resolve the
|
|
// past median time of a block
|
|
type pastMedianTimeManager struct {
|
|
timestampDeviationTolerance int
|
|
|
|
databaseContext model.DBReader
|
|
|
|
dagTraversalManager model.DAGTraversalManager
|
|
|
|
blockHeaderStore model.BlockHeaderStore
|
|
ghostdagDataStore model.GHOSTDAGDataStore
|
|
|
|
genesisHash *externalapi.DomainHash
|
|
}
|
|
|
|
// New instantiates a new PastMedianTimeManager
|
|
func New(timestampDeviationTolerance int,
|
|
databaseContext model.DBReader,
|
|
dagTraversalManager model.DAGTraversalManager,
|
|
blockHeaderStore model.BlockHeaderStore,
|
|
ghostdagDataStore model.GHOSTDAGDataStore,
|
|
genesisHash *externalapi.DomainHash) model.PastMedianTimeManager {
|
|
|
|
return &pastMedianTimeManager{
|
|
timestampDeviationTolerance: timestampDeviationTolerance,
|
|
databaseContext: databaseContext,
|
|
|
|
dagTraversalManager: dagTraversalManager,
|
|
|
|
blockHeaderStore: blockHeaderStore,
|
|
ghostdagDataStore: ghostdagDataStore,
|
|
genesisHash: genesisHash,
|
|
}
|
|
}
|
|
|
|
// PastMedianTime returns the past median time for some block
|
|
func (pmtm *pastMedianTimeManager) PastMedianTime(stagingArea *model.StagingArea, blockHash *externalapi.DomainHash) (int64, error) {
|
|
window, err := pmtm.dagTraversalManager.BlockWindow(stagingArea, blockHash, 2*pmtm.timestampDeviationTolerance-1)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if len(window) == 0 {
|
|
header, err := pmtm.blockHeaderStore.BlockHeader(pmtm.databaseContext, stagingArea, pmtm.genesisHash)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return header.TimeInMilliseconds(), nil
|
|
}
|
|
|
|
return pmtm.windowMedianTimestamp(stagingArea, window)
|
|
}
|
|
|
|
func (pmtm *pastMedianTimeManager) windowMedianTimestamp(
|
|
stagingArea *model.StagingArea, window []*externalapi.DomainHash) (int64, error) {
|
|
|
|
if len(window) == 0 {
|
|
return 0, errors.New("Cannot calculate median timestamp for an empty block window")
|
|
}
|
|
|
|
timestamps := make([]int64, len(window))
|
|
for i, blockHash := range window {
|
|
blockHeader, err := pmtm.blockHeaderStore.BlockHeader(pmtm.databaseContext, stagingArea, blockHash)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
timestamps[i] = blockHeader.TimeInMilliseconds()
|
|
}
|
|
|
|
sort.Sort(sorters.Int64Slice(timestamps))
|
|
|
|
return timestamps[len(timestamps)/2], nil
|
|
}
|