From 4951c0bee039be51095ce44cffdad83bbaf75631 Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Thu, 1 Nov 2018 14:43:38 +0200 Subject: [PATCH] [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 --- blockdag/blockindex.go | 7 ------- blockdag/common_test.go | 6 ++++++ blockdag/dag.go | 19 +++++++++++-------- blockdag/phantom_test.go | 2 ++ blockdag/virtualblock_test.go | 1 + 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/blockdag/blockindex.go b/blockdag/blockindex.go index 1f1a0362b..5964c5baf 100644 --- a/blockdag/blockindex.go +++ b/blockdag/blockindex.go @@ -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 } diff --git a/blockdag/common_test.go b/blockdag/common_test.go index 9d798d585..216e4e2b2 100644 --- a/blockdag/common_test.go +++ b/blockdag/common_test.go @@ -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) + } +} diff --git a/blockdag/dag.go b/blockdag/dag.go index 2858cdbaf..cfe334732 100644 --- a/blockdag/dag.go +++ b/blockdag/dag.go @@ -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() } diff --git a/blockdag/phantom_test.go b/blockdag/phantom_test.go index dca1a7a48..4e0f9cbbd 100644 --- a/blockdag/phantom_test.go +++ b/blockdag/phantom_test.go @@ -831,6 +831,8 @@ func TestPhantom(t *testing.T) { } blockDAG.index.AddNode(node) + addNodeAsChildToParents(node) + blockByIDMap[blockData.id] = node idByBlockMap[node] = blockData.id diff --git a/blockdag/virtualblock_test.go b/blockdag/virtualblock_test.go index e3a75fd0d..c697ff8b8 100644 --- a/blockdag/virtualblock_test.go +++ b/blockdag/virtualblock_test.go @@ -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) }