From 271bcedc19ade8497944417374d88b2a4e3e0fd4 Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Tue, 11 Feb 2020 18:02:55 +0200 Subject: [PATCH] [NOD-747] Change FinalityInterval to be 24 hours, isCurrent to be true if the DAG's time is less than 12 hours than the present, and change MaxInvPerMsg to be 1 << 17 (#625) --- blockdag/dag.go | 6 ++++-- blockdag/dag_test.go | 17 ++++++++++++++++- blockdag/external_dag_test.go | 20 ++++++++++++++------ dagconfig/params.go | 33 +++++++++++++++++++-------------- wire/invvect.go | 2 +- wire/msggetdata_test.go | 2 +- wire/msginv_test.go | 2 +- wire/msgnotfound_test.go | 2 +- 8 files changed, 57 insertions(+), 27 deletions(-) diff --git a/blockdag/dag.go b/blockdag/dag.go index cf6745316..fc5779bec 100644 --- a/blockdag/dag.go +++ b/blockdag/dag.go @@ -27,6 +27,8 @@ const ( // maxOrphanBlocks is the maximum number of orphan blocks that can be // queued. maxOrphanBlocks = 100 + + isDAGCurrentMaxDiff = 12 * time.Hour ) // orphanBlock represents a block that we don't yet have the parent for. It @@ -1274,8 +1276,8 @@ func (dag *BlockDAG) isCurrent() bool { } else { dagTimestamp = selectedTip.timestamp } - minus24Hours := dag.AdjustedTime().Add(-24 * time.Hour).Unix() - return dagTimestamp >= minus24Hours + dagTime := time.Unix(dagTimestamp, 0) + return dag.AdjustedTime().Sub(dagTime) <= isDAGCurrentMaxDiff } // AdjustedTime returns the adjusted time according to diff --git a/blockdag/dag_test.go b/blockdag/dag_test.go index 73b4846d4..98558a086 100644 --- a/blockdag/dag_test.go +++ b/blockdag/dag_test.go @@ -938,7 +938,7 @@ func testFinalizeNodesBelowFinalityPoint(t *testing.T, deleteDiffData bool) { nodes := make([]*blockNode, 0, finalityInterval) currentNode := dag.genesis nodes = append(nodes, currentNode) - for i := 0; i <= finalityInterval*2; i++ { + for i := uint64(0); i <= finalityInterval*2; i++ { currentNode = addNode(currentNode) nodes = append(nodes, currentNode) } @@ -1084,3 +1084,18 @@ func TestDAGIndexFailedStatus(t *testing.T) { t.Fatalf("invalidBlockGrandChildNode status to have %b flags raised (got %b)", statusInvalidAncestor, invalidBlockGrandChildNode.status) } } + +func TestIsDAGCurrentMaxDiff(t *testing.T) { + netParams := []*dagconfig.Params{ + &dagconfig.MainnetParams, + &dagconfig.TestnetParams, + &dagconfig.DevnetParams, + &dagconfig.RegressionNetParams, + &dagconfig.SimnetParams, + } + for _, params := range netParams { + if params.TargetTimePerBlock*time.Duration(params.FinalityInterval) < isDAGCurrentMaxDiff { + t.Errorf("in %s, a DAG can be considered current even if it's below the finality point", params.Name) + } + } +} diff --git a/blockdag/external_dag_test.go b/blockdag/external_dag_test.go index 5ade22e44..84d1d712b 100644 --- a/blockdag/external_dag_test.go +++ b/blockdag/external_dag_test.go @@ -73,7 +73,7 @@ func TestFinality(t *testing.T) { currentNode := genesis // First we build a chain of params.FinalityInterval blocks for future use - for i := 0; i < params.FinalityInterval; i++ { + for i := uint64(0); i < params.FinalityInterval; i++ { currentNode, err = buildNodeToDag([]*daghash.Hash{currentNode.Hash()}) if err != nil { t.Fatalf("TestFinality: buildNodeToDag unexpectedly returned an error: %v", err) @@ -85,7 +85,7 @@ func TestFinality(t *testing.T) { // Now we build a new chain of 2 * params.FinalityInterval blocks, pointed to genesis, and // we expect the block with height 1 * params.FinalityInterval to be the last finality point currentNode = genesis - for i := 0; i < params.FinalityInterval; i++ { + for i := uint64(0); i < params.FinalityInterval; i++ { currentNode, err = buildNodeToDag([]*daghash.Hash{currentNode.Hash()}) if err != nil { t.Fatalf("TestFinality: buildNodeToDag unexpectedly returned an error: %v", err) @@ -94,7 +94,7 @@ func TestFinality(t *testing.T) { expectedFinalityPoint := currentNode - for i := 0; i < params.FinalityInterval; i++ { + for i := uint64(0); i < params.FinalityInterval; i++ { currentNode, err = buildNodeToDag([]*daghash.Hash{currentNode.Hash()}) if err != nil { t.Fatalf("TestFinality: buildNodeToDag unexpectedly returned an error: %v", err) @@ -167,9 +167,17 @@ func TestFinality(t *testing.T) { // a getblocks message it should always be able to send // all the necessary invs. func TestFinalityInterval(t *testing.T) { - params := dagconfig.SimnetParams - if params.FinalityInterval > wire.MaxInvPerMsg { - t.Errorf("dagconfig.SimnetParams.FinalityInterval should be lower or equal to wire.MaxInvPerMsg") + netParams := []*dagconfig.Params{ + &dagconfig.MainnetParams, + &dagconfig.TestnetParams, + &dagconfig.DevnetParams, + &dagconfig.RegressionNetParams, + &dagconfig.SimnetParams, + } + for _, params := range netParams { + if params.FinalityInterval > wire.MaxInvPerMsg { + t.Errorf("FinalityInterval in %s should be lower or equal to wire.MaxInvPerMsg", params.Name) + } } } diff --git a/dagconfig/params.go b/dagconfig/params.go index 561940461..c1700e726 100644 --- a/dagconfig/params.go +++ b/dagconfig/params.go @@ -47,9 +47,14 @@ var ( devnetPowMax = new(big.Int).Sub(new(big.Int).Lsh(bigOne, 239), bigOne) ) -const ghostdagK = 10 -const difficultyAdjustmentWindowSize = 2640 -const timestampDeviationTolerance = 132 +const ( + ghostdagK = 10 + difficultyAdjustmentWindowSize = 2640 + timestampDeviationTolerance = 132 + finalityDuration = 24 * time.Hour + targetTimePerBlock = 1 * time.Second + finalityInterval = uint64(finalityDuration / targetTimePerBlock) +) // ConsensusDeployment defines details related to a specific consensus rule // change that is voted in. This is part of BIP0009. @@ -132,7 +137,7 @@ type Params struct { TargetTimePerBlock time.Duration // FinalityInterval is the interval that determines the finality window of the DAG. - FinalityInterval int + FinalityInterval uint64 // TimestampDeviationTolerance is the maximum offset a block timestamp // is allowed to be in the future before it gets delayed @@ -195,8 +200,8 @@ var MainnetParams = Params{ PowMax: mainPowMax, BlockCoinbaseMaturity: 100, SubsidyReductionInterval: 210000, - TargetTimePerBlock: time.Second * 1, // 1 second - FinalityInterval: 1000, + TargetTimePerBlock: targetTimePerBlock, + FinalityInterval: finalityInterval, DifficultyAdjustmentWindowSize: difficultyAdjustmentWindowSize, TimestampDeviationTolerance: timestampDeviationTolerance, @@ -252,8 +257,8 @@ var RegressionNetParams = Params{ PowMax: regressionPowMax, BlockCoinbaseMaturity: 100, SubsidyReductionInterval: 150, - TargetTimePerBlock: time.Second * 1, // 1 second - FinalityInterval: 1000, + TargetTimePerBlock: targetTimePerBlock, + FinalityInterval: finalityInterval, DifficultyAdjustmentWindowSize: difficultyAdjustmentWindowSize, TimestampDeviationTolerance: timestampDeviationTolerance, @@ -307,8 +312,8 @@ var TestnetParams = Params{ PowMax: testnetPowMax, BlockCoinbaseMaturity: 100, SubsidyReductionInterval: 210000, - TargetTimePerBlock: time.Second * 1, // 1 second - FinalityInterval: 1000, + TargetTimePerBlock: targetTimePerBlock, + FinalityInterval: finalityInterval, DifficultyAdjustmentWindowSize: difficultyAdjustmentWindowSize, TimestampDeviationTolerance: timestampDeviationTolerance, @@ -368,8 +373,8 @@ var SimnetParams = Params{ PowMax: simnetPowMax, BlockCoinbaseMaturity: 100, SubsidyReductionInterval: 210000, - TargetTimePerBlock: time.Second * 1, // 1 second - FinalityInterval: 1000, + TargetTimePerBlock: targetTimePerBlock, + FinalityInterval: finalityInterval, DifficultyAdjustmentWindowSize: difficultyAdjustmentWindowSize, TimestampDeviationTolerance: timestampDeviationTolerance, @@ -421,8 +426,8 @@ var DevnetParams = Params{ PowMax: devnetPowMax, BlockCoinbaseMaturity: 100, SubsidyReductionInterval: 210000, - TargetTimePerBlock: time.Second * 1, // 1 second - FinalityInterval: 1000, + TargetTimePerBlock: targetTimePerBlock, + FinalityInterval: finalityInterval, DifficultyAdjustmentWindowSize: difficultyAdjustmentWindowSize, TimestampDeviationTolerance: timestampDeviationTolerance, diff --git a/wire/invvect.go b/wire/invvect.go index 4fd5b885a..75c914354 100644 --- a/wire/invvect.go +++ b/wire/invvect.go @@ -14,7 +14,7 @@ import ( const ( // MaxInvPerMsg is the maximum number of inventory vectors that can be in a // single kaspa inv message. - MaxInvPerMsg = 1 << 16 + MaxInvPerMsg = 1 << 17 // MaxSyncBlockInvPerGetDataMsg is the maximum number of sync block inventory // vectors that can be in a single getData message. diff --git a/wire/msggetdata_test.go b/wire/msggetdata_test.go index c8c6af731..3102cb052 100644 --- a/wire/msggetdata_test.go +++ b/wire/msggetdata_test.go @@ -28,7 +28,7 @@ func TestGetData(t *testing.T) { // Ensure max payload is expected value for latest protocol version. // Num inventory vectors (varInt) + max allowed inventory vectors. - wantPayload := uint32(2359305) + wantPayload := uint32(4718601) maxPayload := msg.MaxPayloadLength(pver) if maxPayload != wantPayload { t.Errorf("MaxPayloadLength: wrong max payload length for "+ diff --git a/wire/msginv_test.go b/wire/msginv_test.go index 5f2b76ad9..0a8437efb 100644 --- a/wire/msginv_test.go +++ b/wire/msginv_test.go @@ -28,7 +28,7 @@ func TestInv(t *testing.T) { // Ensure max payload is expected value for latest protocol version. // Num inventory vectors (varInt) + max allowed inventory vectors. - wantPayload := uint32(2359305) + wantPayload := uint32(4718601) maxPayload := msg.MaxPayloadLength(pver) if maxPayload != wantPayload { t.Errorf("MaxPayloadLength: wrong max payload length for "+ diff --git a/wire/msgnotfound_test.go b/wire/msgnotfound_test.go index e65ec6397..824ad33e4 100644 --- a/wire/msgnotfound_test.go +++ b/wire/msgnotfound_test.go @@ -28,7 +28,7 @@ func TestNotFound(t *testing.T) { // Ensure max payload is expected value for latest protocol version. // Num inventory vectors (varInt) + max allowed inventory vectors. - wantPayload := uint32(2359305) + wantPayload := uint32(4718601) maxPayload := msg.MaxPayloadLength(pver) if maxPayload != wantPayload { t.Errorf("MaxPayloadLength: wrong max payload length for "+