mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00
[DEV-260] Don't update parents on initBlockNode (#114)
* [DEV-260] Don't update parents on initBlockNode * [DEV-260] move addNodeAsChildToParents to blockdag/common_test.go * [DEV-260] update newProvisionalNode comment
This commit is contained in:
parent
3ebded9ae7
commit
4951c0bee0
@ -138,19 +138,12 @@ func initBlockNode(node *blockNode, blockHeader *wire.BlockHeader, parents block
|
||||
}
|
||||
|
||||
if len(parents) > 0 {
|
||||
addNodeAsChildToParents(node)
|
||||
node.blues, node.selectedParent, node.blueScore = phantom(node, phantomK)
|
||||
node.height = calculateNodeHeight(node)
|
||||
node.workSum = node.workSum.Add(node.selectedParent.workSum, node.workSum)
|
||||
}
|
||||
}
|
||||
|
||||
func addNodeAsChildToParents(node *blockNode) {
|
||||
for _, parent := range node.parents {
|
||||
parent.children.add(node)
|
||||
}
|
||||
}
|
||||
|
||||
func calculateNodeHeight(node *blockNode) int32 {
|
||||
return node.parents.maxHeight() + 1
|
||||
}
|
||||
|
@ -193,3 +193,9 @@ func newTestNode(parents blockSet, blockVersion int32, bits uint32, timestamp ti
|
||||
}
|
||||
return newBlockNode(header, parents, phantomK)
|
||||
}
|
||||
|
||||
func addNodeAsChildToParents(node *blockNode) {
|
||||
for _, parent := range node.parents {
|
||||
parent.children.add(node)
|
||||
}
|
||||
}
|
||||
|
@ -568,7 +568,7 @@ func (dag *BlockDAG) applyUTXOChanges(node *blockNode, block *util.Block, fastAd
|
||||
// fail if the block is not valid, thus bringing all the affected nodes (and the virtual)
|
||||
// into an undefined state.
|
||||
provisionalSet := newProvisionalNodeSet()
|
||||
newNodeProvisional := provisionalSet.newProvisionalNode(node, true, block.Transactions())
|
||||
newNodeProvisional := provisionalSet.newProvisionalNode(node, true, true, block.Transactions())
|
||||
|
||||
// Clone the virtual block so that we don't modify the existing one.
|
||||
virtualClone := dag.virtual.clone()
|
||||
@ -591,7 +591,7 @@ func (dag *BlockDAG) applyUTXOChanges(node *blockNode, block *util.Block, fastAd
|
||||
virtualClone.AddTip(node)
|
||||
|
||||
// Build a UTXO set for the new virtual block and update the DAG tips' diffs.
|
||||
virtualNodeProvisional := provisionalSet.newProvisionalNode(&virtualClone.blockNode, true, nil)
|
||||
virtualNodeProvisional := provisionalSet.newProvisionalNode(&virtualClone.blockNode, true, true, nil)
|
||||
newVirtualUTXO, _, err := virtualNodeProvisional.pastUTXO(virtualClone, dag.db)
|
||||
if err != nil {
|
||||
newErrString := fmt.Sprintf("could not restore past UTXO for virtual %v: %s", virtualClone, err)
|
||||
@ -667,9 +667,9 @@ type provisionalNode struct {
|
||||
}
|
||||
|
||||
// newProvisionalNode takes a node and builds a provisionalNode from it.
|
||||
// To avoid building the entire DAG in provisionalNode format we pass withRelatives = true
|
||||
// only when the node's relatives (parents and children) are required.
|
||||
func (pns provisionalNodeSet) newProvisionalNode(node *blockNode, withRelatives bool,
|
||||
// To avoid building the entire DAG in provisionalNode format we pass withParents = true or withChildren = true,
|
||||
// only when the node's relatives (parents or children) are required.
|
||||
func (pns provisionalNodeSet) newProvisionalNode(node *blockNode, withParents bool, withChildren bool,
|
||||
transactions []*util.Tx) *provisionalNode {
|
||||
if existingProvisional, ok := pns[node.hash]; ok {
|
||||
return existingProvisional
|
||||
@ -683,23 +683,26 @@ func (pns provisionalNodeSet) newProvisionalNode(node *blockNode, withRelatives
|
||||
pns[node.hash] = provisional
|
||||
}
|
||||
|
||||
if withRelatives {
|
||||
if withParents {
|
||||
provisional.parents = []*provisionalNode{}
|
||||
for _, parent := range node.parents {
|
||||
provisional.parents = append(provisional.parents, pns.newProvisionalNode(parent, false, nil))
|
||||
provisional.parents = append(provisional.parents, pns.newProvisionalNode(parent, false, true, nil))
|
||||
}
|
||||
if node.selectedParent != nil {
|
||||
provisional.selectedParent = pns[node.selectedParent.hash]
|
||||
}
|
||||
}
|
||||
|
||||
if withChildren {
|
||||
provisional.children = []*provisionalNode{}
|
||||
for _, child := range node.children {
|
||||
provisional.children = append(provisional.children, pns.newProvisionalNode(child, false, nil))
|
||||
provisional.children = append(provisional.children, pns.newProvisionalNode(child, false, false, nil))
|
||||
}
|
||||
if node.diffChild != nil {
|
||||
provisional.diffChild = pns[node.diffChild.hash]
|
||||
}
|
||||
}
|
||||
|
||||
if node.diff != nil {
|
||||
provisional.diff = node.diff.clone()
|
||||
}
|
||||
|
@ -831,6 +831,8 @@ func TestPhantom(t *testing.T) {
|
||||
}
|
||||
|
||||
blockDAG.index.AddNode(node)
|
||||
addNodeAsChildToParents(node)
|
||||
|
||||
blockByIDMap[blockData.id] = node
|
||||
idByBlockMap[node] = blockData.id
|
||||
|
||||
|
@ -94,6 +94,7 @@ func TestVirtualBlock(t *testing.T) {
|
||||
|
||||
// Add all blockNodes in tipsToAdd in order
|
||||
for _, tipToAdd := range test.tipsToAdd {
|
||||
addNodeAsChildToParents(tipToAdd)
|
||||
virtual.AddTip(tipToAdd)
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user