mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-05-29 10:16:45 +00:00
61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
package consensusstatemanager
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/domain/consensus/model"
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
)
|
|
|
|
func (csm *consensusStateManager) checkFinalityViolation(
|
|
blockHash *externalapi.DomainHash) error {
|
|
|
|
if *blockHash == *csm.genesisHash {
|
|
return nil
|
|
}
|
|
|
|
isViolatingFinality, err := csm.isViolatingFinality(blockHash)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if isViolatingFinality {
|
|
csm.blockStatusStore.Stage(blockHash, externalapi.StatusUTXOPendingVerification)
|
|
log.Warnf("Finality Violation Detected! Block %s violates finality!", blockHash)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (csm *consensusStateManager) virtualFinalityPoint() (
|
|
*externalapi.DomainHash, error) {
|
|
|
|
virtualGHOSTDAGData, err := csm.ghostdagDataStore.Get(csm.databaseContext, model.VirtualBlockHash)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
finalityPointBlueScore := virtualGHOSTDAGData.BlueScore - csm.finalityDepth
|
|
if virtualGHOSTDAGData.BlueScore < csm.finalityDepth {
|
|
// if there's no `csm.finalityDepth` blocks in the DAG
|
|
// practically - returns the genesis
|
|
finalityPointBlueScore = 0
|
|
}
|
|
|
|
return csm.dagTraversalManager.HighestChainBlockBelowBlueScore(
|
|
model.VirtualBlockHash, finalityPointBlueScore)
|
|
}
|
|
|
|
func (csm *consensusStateManager) isViolatingFinality(
|
|
blockHash *externalapi.DomainHash) (bool, error) {
|
|
|
|
virtualFinalityPoint, err := csm.virtualFinalityPoint()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
isInSelectedParentChain, err := csm.dagTopologyManager.IsInSelectedParentChainOf(virtualFinalityPoint, blockHash)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return !isInSelectedParentChain, nil
|
|
}
|