mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-05-25 00:06:49 +00:00

* [NOD-1496] Implement headers only verification * [NOD-1496] Add checkParentsExist * [NOD-1496] Stage block statuses in block processor * [NOD-1496] Rename AddBlock->AddHeaderTip * [NOD-1496] Return early from validateAndInsertBlock on header only and put ValidateProofOfWorkAndDifficulty inside validateBlock
70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package headertipsstore
|
|
|
|
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 headerTipsKey = dbkeys.MakeBucket().Key([]byte("header-tips"))
|
|
|
|
type headerTipsStore struct {
|
|
staging []*externalapi.DomainHash
|
|
}
|
|
|
|
func (h headerTipsStore) Discard() {
|
|
h.staging = nil
|
|
}
|
|
|
|
func (h headerTipsStore) Commit(dbTx model.DBTransaction) error {
|
|
tipsBytes, err := h.serializeTips(h.staging)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return dbTx.Put(headerTipsKey, tipsBytes)
|
|
}
|
|
|
|
func (h headerTipsStore) Stage(tips []*externalapi.DomainHash) {
|
|
h.staging = tips
|
|
}
|
|
|
|
func (h headerTipsStore) IsStaged() bool {
|
|
return h.staging != nil
|
|
}
|
|
|
|
func (h headerTipsStore) Tips(dbContext model.DBReader) ([]*externalapi.DomainHash, error) {
|
|
if h.staging != nil {
|
|
return h.staging, nil
|
|
}
|
|
|
|
tipsBytes, err := dbContext.Get(headerTipsKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return h.deserializeTips(tipsBytes)
|
|
}
|
|
|
|
func (h headerTipsStore) serializeTips(tips []*externalapi.DomainHash) ([]byte, error) {
|
|
dbTips := serialization.HeaderTipsToDBHeaderTips(tips)
|
|
return proto.Marshal(dbTips)
|
|
}
|
|
|
|
func (h headerTipsStore) deserializeTips(tipsBytes []byte) ([]*externalapi.DomainHash, error) {
|
|
dbTips := &serialization.DbHeaderTips{}
|
|
err := proto.Unmarshal(tipsBytes, dbTips)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return serialization.DBHeaderTipsTOHeaderTips(dbTips)
|
|
}
|
|
|
|
// New instantiates a new HeaderTipsStore
|
|
func New() model.HeaderTipsStore {
|
|
return &headerTipsStore{}
|
|
}
|