mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00

* [NOD-208] Added blockBlueScore to UTXOEntry. * [NOD-208] Added blueBlockScore to NewUTXOEntry. * [NOD-208] Fixed compilation errors in policy, utxoset, and dag tests. * [NOD-208] Changed validateBlockRewardMaturity and CheckTransactionInputsAndCalulateFee to use blueScore. * [NOD-208] Changed CalcBlockSubsidy to use blueScore. * [NOD-208] Changed SequenceLockActive to use blueScore. * [NOD-208] Removed ExtractCoinbaseHeight. * [NOD-208] Removed reference to block height in ensureNoDuplicateTx. * [NOD-208] Changed IsFinalizedTransaction to use blueScore. * [NOD-208] Fixed merge errors. * [NOD-208] Made UTXOEntry serialization use blueScore. * [NOD-208] Changed CalcPriority and calcInputValueAge to use blueScore. * [NOD-208] Changed calcSequenceLock to use blueScore. * [NOD-208] Removed blockChainHeight from UTXOEntry. * [NOD-208] Fixed compilation errors in feeEstimator. Fixed a bug in the test pool hardness. * [NOD-208] Fixed oldestChainBlockWithBlueScoreGreaterThan not handling an extreme case. * [NOD-208] Fixed TestDiffFromTx. * [NOD-208] Got rid of priority and support of free transactions. * [NOD-208] Fixed TestProcessTransaction. * [NOD-208] Fixed TestTxFeePrioHeap. * [NOD-208] Fixed TestAddrIndex and TestFeeEstimatorCfg. * [NOD-208] Removed unused rateLimit parameter from ProcessTransaction. * [NOD-208] Fixed tests that rely on CreateTxChain. * [NOD-208] Fixed tests that rely on CreateSignedTxForSubnetwork. * [NOD-208] Fixed TestFetchTransaction. * [NOD-208] Fixed TestHandleNewBlock. Fixed HandleNewBlock erroneously processing fee transactions. * [NOD-208] Fixed TestTxIndexConnectBlock. * [NOD-208] Removed the use of Height() from the fee estimator. * [NOD-208] Removed unused methods from rpcwebsocket.go. * [NOD-208] Removed Height from util.Block. * [NOD-208] Removed ErrForkTooOld. It doesn't make sense in a DAG. * [NOD-208] Made blockHeap use blueScore instead of height. * [NOD-208] Removed fee estimator. * [NOD-208] Removed DAG.Height. * [NOD-208] Made TestAncestorErrors test chainHeight instead of height. * [NOD-208] Fixed a couple of comments that were still speaking about block height. * [NOD-208] Replaced all uses of HighestTipHash with SelectedTipHash. * [NOD-208] Remove blockNode highest and some remaining erroneous uses of height. * [NOD-208] Fixed a couple of comments. Fixed outPoint -> outpoint merge error. * [NOD-208] Fixed a couple more comments. * [NOD-208] Used calcMinRequiredTxRelayFee instead of DefaultMinRelayTxFee for mempool tests. * [NOD-208] Renamed mempool Config BestHeight to DAGChainHeight. * [NOD-208] Fixed a bug in oldestChainBlockWithBlueScoreGreaterThan. Made calcSequenceLock use the node's selected parent chain rather than the virtual block's. * [NOD-208] Removed chainHeight from blockNode String(). Renamed checkpointsByHeight to checkpointsByChainHeight and prevCheckpointHeight to prevCheckpointChainHeight. Removed reference to chainHeight in blockIndexKey. Fixed comments in dagio.go. * [NOD-208] Removed indexers/blocklogger.go, as no one was using it. * [NOD-208] Made blocklogger.go log blueScore instead of height. * [NOD-208] Fixed typo. * [NOD-208] Fixed comments, did minor renaming. * [NOD-208] Made a "common sense" wrapper around sort.Search. * [NOD-208] Fixed comment in SearchSlice.
89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
package blockdag
|
|
|
|
import (
|
|
"container/heap"
|
|
|
|
"github.com/daglabs/btcd/util/daghash"
|
|
)
|
|
|
|
// baseHeap is an implementation for heap.Interface that sorts blocks by their height
|
|
type baseHeap []*blockNode
|
|
|
|
func (h baseHeap) Len() int { return len(h) }
|
|
func (h baseHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
|
|
|
|
func (h *baseHeap) Push(x interface{}) {
|
|
*h = append(*h, x.(*blockNode))
|
|
}
|
|
|
|
func (h *baseHeap) Pop() interface{} {
|
|
oldHeap := *h
|
|
oldLength := len(oldHeap)
|
|
popped := oldHeap[oldLength-1]
|
|
*h = oldHeap[0 : oldLength-1]
|
|
return popped
|
|
}
|
|
|
|
// upHeap extends baseHeap to include Less operation that traverses from bottom to top
|
|
type upHeap struct{ baseHeap }
|
|
|
|
func (h upHeap) Less(i, j int) bool {
|
|
if h.baseHeap[i].blueScore == h.baseHeap[j].blueScore {
|
|
return daghash.HashToBig(h.baseHeap[i].hash).Cmp(daghash.HashToBig(h.baseHeap[j].hash)) < 0
|
|
}
|
|
|
|
return h.baseHeap[i].blueScore < h.baseHeap[j].blueScore
|
|
}
|
|
|
|
// downHeap extends baseHeap to include Less operation that traverses from top to bottom
|
|
type downHeap struct{ baseHeap }
|
|
|
|
func (h downHeap) Less(i, j int) bool {
|
|
if h.baseHeap[i].blueScore == h.baseHeap[j].blueScore {
|
|
return daghash.HashToBig(h.baseHeap[i].hash).Cmp(daghash.HashToBig(h.baseHeap[j].hash)) > 0
|
|
}
|
|
|
|
return h.baseHeap[i].blueScore > h.baseHeap[j].blueScore
|
|
}
|
|
|
|
// blockHeap represents a mutable heap of Blocks, sorted by their height
|
|
type blockHeap struct {
|
|
impl heap.Interface
|
|
}
|
|
|
|
// newDownHeap initializes and returns a new blockHeap
|
|
func newDownHeap() blockHeap {
|
|
h := blockHeap{impl: &downHeap{}}
|
|
heap.Init(h.impl)
|
|
return h
|
|
}
|
|
|
|
// newUpHeap initializes and returns a new blockHeap
|
|
func newUpHeap() blockHeap {
|
|
h := blockHeap{impl: &upHeap{}}
|
|
heap.Init(h.impl)
|
|
return h
|
|
}
|
|
|
|
// pop removes the block with lowest height from this heap and returns it
|
|
func (bh blockHeap) pop() *blockNode {
|
|
return heap.Pop(bh.impl).(*blockNode)
|
|
}
|
|
|
|
// Push pushes the block onto the heap
|
|
func (bh blockHeap) Push(block *blockNode) {
|
|
heap.Push(bh.impl, block)
|
|
}
|
|
|
|
// pushSet pushes a blockset to the heap.
|
|
func (bh blockHeap) pushSet(bs blockSet) {
|
|
for _, block := range bs {
|
|
heap.Push(bh.impl, block)
|
|
}
|
|
}
|
|
|
|
// Len returns the length of this heap
|
|
func (bh blockHeap) Len() int {
|
|
return bh.impl.Len()
|
|
}
|