mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-05-23 15:26:42 +00:00

* Get rid of insertMode * Rename AddBlockToVirtual->AddBlock * When F is not in the future of P, enforce finality with P and not with F. * Don't allow blocks with invalid parents or with missing block body * Check finality violation before checking block status * Implement CalculateIndependentPruningPoint * Move checkBlockStatus to validateBlock * Add ValidateBlock to block processor interface * Adjust SetPruningPoint to the new IBD flow * Add pruning store to CSM's constructor * Flip wrong condition on AddHeaderTip * Fix func (hts *headerSelectedTipStore) Has * Fix block stage order * Call to ValidateBodyInContext from validatePostProofOfWork * Enable overrideDAGParams * Update log * Rename SetPruningPoint to ValidateAndInsertPruningPoint and move most of its logic inside block processor * Rename hasValidatedHeader->hasValidatedOnlyHeader * Fix typo * Name return values for fetchMissingUTXOSet * Add comment * Return ErrMissingParents when block body is missing * Add logs and comments * Fix merge error * Fix pruning point calculation to be by virtual selected parent * Replace CalculateIndependentPruningPoint to CalculatePruningPointByHeaderSelectedTip * Fix isAwaitingUTXOSet to check pruning point by headers * Change isAwaitingUTXOSet indication * Remove IsBlockInHeaderPruningPointFuture from BlockInfo * Fix LowestChainBlockAboveOrEqualToBlueScore * Add validateNewPruningPointTransactions * Add validateNewPruningAgainstPastUTXO * Rename set_pruning_utxo_set.go to update_pruning_utxo_set.go * Check missing block body hashes by missing block instead of status * Validate pruning point against past UTXO with the pruning point as block hash * Remove virtualHeaderHash * Fix comment * Fix imports
101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package headersselectedtipstore
|
|
|
|
import (
|
|
"github.com/golang/protobuf/proto"
|
|
"github.com/kaspanet/kaspad/domain/consensus/database/serialization"
|
|
"github.com/kaspanet/kaspad/domain/consensus/model"
|
|
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
|
|
"github.com/kaspanet/kaspad/domain/consensus/utils/dbkeys"
|
|
)
|
|
|
|
var headerSelectedTipKey = dbkeys.MakeBucket().Key([]byte("headers-selected-tip"))
|
|
|
|
type headerSelectedTipStore struct {
|
|
staging *externalapi.DomainHash
|
|
cache *externalapi.DomainHash
|
|
}
|
|
|
|
// New instantiates a new HeaderSelectedTipStore
|
|
func New() model.HeaderSelectedTipStore {
|
|
return &headerSelectedTipStore{}
|
|
}
|
|
|
|
func (hts *headerSelectedTipStore) Has(dbContext model.DBReader) (bool, error) {
|
|
if hts.staging != nil {
|
|
return true, nil
|
|
}
|
|
|
|
if hts.cache != nil {
|
|
return true, nil
|
|
}
|
|
|
|
return dbContext.Has(headerSelectedTipKey)
|
|
}
|
|
|
|
func (hts *headerSelectedTipStore) Discard() {
|
|
hts.staging = nil
|
|
}
|
|
|
|
func (hts *headerSelectedTipStore) Commit(dbTx model.DBTransaction) error {
|
|
if hts.staging == nil {
|
|
return nil
|
|
}
|
|
|
|
selectedTipBytes, err := hts.serializeHeadersSelectedTip(hts.staging)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = dbTx.Put(headerSelectedTipKey, selectedTipBytes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
hts.cache = hts.staging
|
|
|
|
hts.Discard()
|
|
return nil
|
|
}
|
|
|
|
func (hts *headerSelectedTipStore) Stage(selectedTip *externalapi.DomainHash) {
|
|
hts.staging = selectedTip.Clone()
|
|
}
|
|
|
|
func (hts *headerSelectedTipStore) IsStaged() bool {
|
|
return hts.staging != nil
|
|
}
|
|
|
|
func (hts *headerSelectedTipStore) HeadersSelectedTip(dbContext model.DBReader) (*externalapi.DomainHash, error) {
|
|
if hts.staging != nil {
|
|
return hts.staging.Clone(), nil
|
|
}
|
|
|
|
if hts.cache != nil {
|
|
return hts.cache.Clone(), nil
|
|
}
|
|
|
|
selectedTipBytes, err := dbContext.Get(headerSelectedTipKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
selectedTip, err := hts.deserializeHeadersSelectedTip(selectedTipBytes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
hts.cache = selectedTip
|
|
return hts.cache.Clone(), nil
|
|
}
|
|
|
|
func (hts *headerSelectedTipStore) serializeHeadersSelectedTip(selectedTip *externalapi.DomainHash) ([]byte, error) {
|
|
return proto.Marshal(serialization.DomainHashToDbHash(selectedTip))
|
|
}
|
|
|
|
func (hts *headerSelectedTipStore) deserializeHeadersSelectedTip(selectedTipBytes []byte) (*externalapi.DomainHash, error) {
|
|
dbHash := &serialization.DbHash{}
|
|
err := proto.Unmarshal(selectedTipBytes, dbHash)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return serialization.DbHashToDomainHash(dbHash)
|
|
}
|