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