[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:
Ori Newman 2018-11-01 14:43:38 +02:00 committed by stasatdaglabs
parent 3ebded9ae7
commit 4951c0bee0
5 changed files with 20 additions and 15 deletions

View File

@ -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
}

View File

@ -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)
}
}

View File

@ -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()
}

View File

@ -831,6 +831,8 @@ func TestPhantom(t *testing.T) {
}
blockDAG.index.AddNode(node)
addNodeAsChildToParents(node)
blockByIDMap[blockData.id] = node
idByBlockMap[node] = blockData.id

View File

@ -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)
}