mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-09-14 05:20:11 +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
123 lines
4.3 KiB
Go
123 lines
4.3 KiB
Go
package consensusstatemanager
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/domain/consensus/model"
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
"github.com/kaspanet/kaspad/infrastructure/logger"
|
|
)
|
|
|
|
func (csm *consensusStateManager) updateVirtual(stagingArea *model.StagingArea, newBlockHash *externalapi.DomainHash,
|
|
tips []*externalapi.DomainHash) (*externalapi.SelectedChainPath, externalapi.UTXODiff, error) {
|
|
|
|
onEnd := logger.LogAndMeasureExecutionTime(log, "updateVirtual")
|
|
defer onEnd()
|
|
|
|
log.Debugf("updateVirtual start for block %s", newBlockHash)
|
|
|
|
log.Debugf("Saving a reference to the GHOSTDAG data of the old virtual")
|
|
var oldVirtualSelectedParent *externalapi.DomainHash
|
|
if !newBlockHash.Equal(csm.genesisHash) {
|
|
oldVirtualGHOSTDAGData, err := csm.ghostdagDataStore.Get(csm.databaseContext, stagingArea, model.VirtualBlockHash)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
oldVirtualSelectedParent = oldVirtualGHOSTDAGData.SelectedParent()
|
|
}
|
|
|
|
log.Debugf("Picking virtual parents from tips len: %d", len(tips))
|
|
virtualParents, err := csm.pickVirtualParents(stagingArea, tips)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
log.Debugf("Picked virtual parents: %s", virtualParents)
|
|
|
|
err = csm.dagTopologyManager.SetParents(stagingArea, model.VirtualBlockHash, virtualParents)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
log.Debugf("Set new parents for the virtual block hash")
|
|
|
|
err = csm.ghostdagManager.GHOSTDAG(stagingArea, model.VirtualBlockHash)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// This is needed for `csm.CalculatePastUTXOAndAcceptanceData`
|
|
_, err = csm.difficultyManager.StageDAADataAndReturnRequiredDifficulty(stagingArea, model.VirtualBlockHash)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
log.Debugf("Calculating past UTXO, acceptance data, and multiset for the new virtual block")
|
|
virtualUTXODiff, virtualAcceptanceData, virtualMultiset, err :=
|
|
csm.CalculatePastUTXOAndAcceptanceData(stagingArea, model.VirtualBlockHash)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
log.Debugf("Calculated the past UTXO of the new virtual. "+
|
|
"Diff toAdd length: %d, toRemove length: %d",
|
|
virtualUTXODiff.ToAdd().Len(), virtualUTXODiff.ToRemove().Len())
|
|
|
|
log.Debugf("Staging new acceptance data for the virtual block")
|
|
csm.acceptanceDataStore.Stage(stagingArea, model.VirtualBlockHash, virtualAcceptanceData)
|
|
|
|
log.Debugf("Staging new multiset for the virtual block")
|
|
csm.multisetStore.Stage(stagingArea, model.VirtualBlockHash, virtualMultiset)
|
|
|
|
log.Debugf("Staging new UTXO diff for the virtual block")
|
|
csm.consensusStateStore.StageVirtualUTXODiff(stagingArea, virtualUTXODiff)
|
|
|
|
log.Debugf("Updating the selected tip's utxo-diff after adding %s to the DAG", newBlockHash)
|
|
err = csm.updateSelectedTipUTXODiff(stagingArea, virtualUTXODiff)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
log.Debugf("Calculating selected parent chain changes")
|
|
var selectedParentChainChanges *externalapi.SelectedChainPath
|
|
if !newBlockHash.Equal(csm.genesisHash) {
|
|
newVirtualGHOSTDAGData, err := csm.ghostdagDataStore.Get(csm.databaseContext, stagingArea, model.VirtualBlockHash)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
newVirtualSelectedParent := newVirtualGHOSTDAGData.SelectedParent()
|
|
selectedParentChainChanges, err = csm.dagTraversalManager.
|
|
CalculateChainPath(stagingArea, oldVirtualSelectedParent, newVirtualSelectedParent)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
log.Debugf("Selected parent chain changes: %d blocks were removed and %d blocks were added",
|
|
len(selectedParentChainChanges.Removed), len(selectedParentChainChanges.Added))
|
|
}
|
|
|
|
return selectedParentChainChanges, virtualUTXODiff, nil
|
|
}
|
|
|
|
func (csm *consensusStateManager) updateSelectedTipUTXODiff(
|
|
stagingArea *model.StagingArea, virtualUTXODiff externalapi.UTXODiff) error {
|
|
|
|
onEnd := logger.LogAndMeasureExecutionTime(log, "updateSelectedTipUTXODiff")
|
|
defer onEnd()
|
|
|
|
selectedTip, err := csm.selectedTip(stagingArea)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Debugf("Calculating new UTXO diff for virtual diff parent %s", selectedTip)
|
|
selectedTipUTXODiff, err := csm.utxoDiffStore.UTXODiff(csm.databaseContext, stagingArea, selectedTip)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
newDiff, err := virtualUTXODiff.DiffFrom(selectedTipUTXODiff)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Debugf("Staging new UTXO diff for virtual diff parent %s", selectedTip)
|
|
csm.stageDiff(stagingArea, selectedTip, newDiff, nil)
|
|
|
|
return nil
|
|
}
|