mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-10-14 00:59:33 +00:00
[DEV-137] Calculate height correctly in blockdag and mining packages (#67)
This commit is contained in:
parent
b348449f01
commit
c8461dfcba
@ -624,7 +624,7 @@ func checkSerializedHeight(coinbaseTx *util.Tx, wantHeight int32) error {
|
|||||||
// the checkpoints are not performed.
|
// the checkpoints are not performed.
|
||||||
//
|
//
|
||||||
// This function MUST be called with the chain state lock held (for writes).
|
// This function MUST be called with the chain state lock held (for writes).
|
||||||
func (dag *BlockDAG) checkBlockHeaderContext(header *wire.BlockHeader, selectedParent *blockNode, flags BehaviorFlags) error {
|
func (dag *BlockDAG) checkBlockHeaderContext(header *wire.BlockHeader, selectedParent *blockNode, blockHeight int32, flags BehaviorFlags) error {
|
||||||
fastAdd := flags&BFFastAdd == BFFastAdd
|
fastAdd := flags&BFFastAdd == BFFastAdd
|
||||||
if !fastAdd {
|
if !fastAdd {
|
||||||
// Ensure the difficulty specified in the block header matches
|
// Ensure the difficulty specified in the block header matches
|
||||||
@ -652,10 +652,6 @@ func (dag *BlockDAG) checkBlockHeaderContext(header *wire.BlockHeader, selectedP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The height of this block is one more than the referenced previous
|
|
||||||
// block.
|
|
||||||
blockHeight := selectedParent.height + 1
|
|
||||||
|
|
||||||
// Ensure chain matches up to predetermined checkpoints.
|
// Ensure chain matches up to predetermined checkpoints.
|
||||||
blockHash := header.BlockHash()
|
blockHash := header.BlockHash()
|
||||||
if !dag.verifyCheckpoint(blockHeight, &blockHash) {
|
if !dag.verifyCheckpoint(blockHeight, &blockHash) {
|
||||||
@ -736,7 +732,7 @@ func (dag *BlockDAG) checkBlockContext(block *util.Block, parents blockSet, sele
|
|||||||
}
|
}
|
||||||
// Perform all block header related validation checks.
|
// Perform all block header related validation checks.
|
||||||
header := &block.MsgBlock().Header
|
header := &block.MsgBlock().Header
|
||||||
err = dag.checkBlockHeaderContext(header, selectedParent, flags)
|
err = dag.checkBlockHeaderContext(header, selectedParent, block.Height(), flags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -745,13 +741,9 @@ func (dag *BlockDAG) checkBlockContext(block *util.Block, parents blockSet, sele
|
|||||||
if !fastAdd {
|
if !fastAdd {
|
||||||
blockTime := selectedParent.CalcPastMedianTime()
|
blockTime := selectedParent.CalcPastMedianTime()
|
||||||
|
|
||||||
// The height of this block is one more than the referenced
|
|
||||||
// previous block.
|
|
||||||
blockHeight := selectedParent.height + 1
|
|
||||||
|
|
||||||
// Ensure all transactions in the block are finalized.
|
// Ensure all transactions in the block are finalized.
|
||||||
for _, tx := range block.Transactions() {
|
for _, tx := range block.Transactions() {
|
||||||
if !IsFinalizedTransaction(tx, blockHeight,
|
if !IsFinalizedTransaction(tx, block.Height(),
|
||||||
blockTime) {
|
blockTime) {
|
||||||
|
|
||||||
str := fmt.Sprintf("block contains unfinalized "+
|
str := fmt.Sprintf("block contains unfinalized "+
|
||||||
@ -763,7 +755,7 @@ func (dag *BlockDAG) checkBlockContext(block *util.Block, parents blockSet, sele
|
|||||||
// Ensure coinbase starts with serialized block heights
|
// Ensure coinbase starts with serialized block heights
|
||||||
|
|
||||||
coinbaseTx := block.Transactions()[0]
|
coinbaseTx := block.Transactions()[0]
|
||||||
err := checkSerializedHeight(coinbaseTx, blockHeight)
|
err := checkSerializedHeight(coinbaseTx, block.Height())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ func (v *VirtualBlock) addTip(newTip *blockNode) {
|
|||||||
v.setTips(updatedTips)
|
v.setTips(updatedTips)
|
||||||
}
|
}
|
||||||
|
|
||||||
// addTip adds the given tip to the set of tips in the virtual block.
|
// AddTip adds the given tip to the set of tips in the virtual block.
|
||||||
// All former tips that happen to be the given tip's parents are removed
|
// All former tips that happen to be the given tip's parents are removed
|
||||||
// from the set.
|
// from the set.
|
||||||
//
|
//
|
||||||
@ -106,6 +106,12 @@ func (v *VirtualBlock) SelectedTipHeight() int32 {
|
|||||||
return v.SelectedTip().height
|
return v.SelectedTip().height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Height returns the height of the virtual block.
|
||||||
|
// In other words: height of highest block + 1
|
||||||
|
func (v *VirtualBlock) Height() int32 {
|
||||||
|
return v.tips().maxHeight() + 1
|
||||||
|
}
|
||||||
|
|
||||||
// TipHashes returns the hashes of the tips of the virtual block.
|
// TipHashes returns the hashes of the tips of the virtual block.
|
||||||
func (v *VirtualBlock) TipHashes() []daghash.Hash {
|
func (v *VirtualBlock) TipHashes() []daghash.Hash {
|
||||||
return v.tips().hashes()
|
return v.tips().hashes()
|
||||||
|
@ -403,7 +403,7 @@ func NewBlkTmplGenerator(policy *Policy, params *dagconfig.Params,
|
|||||||
func (g *BlkTmplGenerator) NewBlockTemplate(payToAddress util.Address) (*BlockTemplate, error) {
|
func (g *BlkTmplGenerator) NewBlockTemplate(payToAddress util.Address) (*BlockTemplate, error) {
|
||||||
// Extend the most recently known best block.
|
// Extend the most recently known best block.
|
||||||
virtualBlock := g.dag.VirtualBlock()
|
virtualBlock := g.dag.VirtualBlock()
|
||||||
nextBlockHeight := virtualBlock.SelectedTipHeight() + 1
|
nextBlockHeight := virtualBlock.Height()
|
||||||
|
|
||||||
// Create a standard coinbase transaction paying to the provided
|
// Create a standard coinbase transaction paying to the provided
|
||||||
// address. NOTE: The coinbase value will be updated to include the
|
// address. NOTE: The coinbase value will be updated to include the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user