diff --git a/common/constants.go b/common/constants.go index fdbbdfc742..ad2828aeec 100644 --- a/common/constants.go +++ b/common/constants.go @@ -17,6 +17,7 @@ const ( MaxMasternodes = 18 MaxMasternodesV2 = 108 LimitPenaltyEpoch = 4 + LimitPenaltyEpochV2 = 0 BlocksPerYearTest = uint64(200000) BlocksPerYear = uint64(15768000) LimitThresholdNonceInQueue = 10 diff --git a/consensus/tests/engine_v2_tests/penalty_test.go b/consensus/tests/engine_v2_tests/penalty_test.go index faadaaa5b7..7b766ace61 100644 --- a/consensus/tests/engine_v2_tests/penalty_test.go +++ b/consensus/tests/engine_v2_tests/penalty_test.go @@ -15,7 +15,7 @@ import ( func TestHookPenaltyV2Mining(t *testing.T) { config := params.TestXDPoSMockChainConfig - blockchain, _, _, _, _, _ := PrepareXDCTestBlockChainForV2Engine(t, int(config.XDPoS.Epoch)*7, config, nil) + blockchain, _, _, _, _, _ := PrepareXDCTestBlockChainForV2Engine(t, int(config.XDPoS.Epoch)*3, config, nil) adaptor := blockchain.Engine().(*XDPoS.XDPoS) hooks.AttachConsensusV2Hooks(adaptor, blockchain, config) assert.NotNil(t, adaptor.EngineV2.HookPenalty) @@ -26,11 +26,11 @@ func TestHookPenaltyV2Mining(t *testing.T) { assert.Nil(t, err) masternodes := adaptor.GetMasternodesFromCheckpointHeader(header901) assert.Equal(t, 5, len(masternodes)) - header6300 := blockchain.GetHeaderByNumber(config.XDPoS.Epoch * 7) - penalty, err := adaptor.EngineV2.HookPenalty(blockchain, big.NewInt(int64(config.XDPoS.Epoch*7)), header6300.ParentHash, masternodes) + header2100 := blockchain.GetHeaderByNumber(config.XDPoS.Epoch * 3) + penalty, err := adaptor.EngineV2.HookPenalty(blockchain, big.NewInt(int64(config.XDPoS.Epoch*3)), header2100.ParentHash, masternodes) assert.Nil(t, err) // when we prepare the chain, we include all 5 signers as coinbase except one signer - // header6300 records 5 masternodes, so penalty contains 5-4=1 address + // header2100 records 5 masternodes, so penalty contains 5-4=1 address assert.Equal(t, 1, len(penalty)) contains := false for _, mn := range common.RemoveItemFromArray(masternodes, penalty) { @@ -40,21 +40,21 @@ func TestHookPenaltyV2Mining(t *testing.T) { } assert.True(t, contains) // set adaptor round/qc to that of 6299 - err = utils.DecodeBytesExtraFields(header6300.Extra, &extraField) + err = utils.DecodeBytesExtraFields(header2100.Extra, &extraField) assert.Nil(t, err) err = adaptor.EngineV2.ProcessQCFaker(blockchain, extraField.QuorumCert) assert.Nil(t, err) // coinbase is a faker signer headerMining := &types.Header{ - ParentHash: header6300.ParentHash, - Number: header6300.Number, + ParentHash: header2100.ParentHash, + Number: header2100.Number, GasLimit: params.TargetGasLimit, - Time: header6300.Time, + Time: header2100.Time, Coinbase: acc1Addr, } // Force to make the node to be at its round to mine, otherwise won't pass the yourturn masternodes check - // We have 19 nodes in total (20 candidates in snapshot - 1 penalty) and the fake signer is always at the 18th(last) in the list. Hence int(config.XDPoS.Epoch)*7+18-900, the +18 means is to force to next 18 round and -900 is the relative round number to block number int(config.XDPoS.Epoch)*7 - adaptor.EngineV2.SetNewRoundFaker(blockchain, utils.Round(int(config.XDPoS.Epoch)*7+18-900), false) + // We have 19 nodes in total (20 candidates in snapshot - 1 penalty) and the fake signer is always at the 18th(last) in the list. Hence int(config.XDPoS.Epoch)*3+18-900, the +18 means is to force to next 18 round and -900 is the relative round number to block number int(config.XDPoS.Epoch)*3 + adaptor.EngineV2.SetNewRoundFaker(blockchain, utils.Round(int(config.XDPoS.Epoch)*3+18-900), false) // The test default signer is not in the msaternodes, so we set the faker signer adaptor.EngineV2.AuthorizeFaker(acc1Addr) err = adaptor.Prepare(blockchain, headerMining) @@ -66,7 +66,7 @@ func TestHookPenaltyV2Mining(t *testing.T) { func TestHookPenaltyV2Comeback(t *testing.T) { config := params.TestXDPoSMockChainConfig - blockchain, _, _, signer, signFn := PrepareXDCTestBlockChainWithPenaltyForV2Engine(t, int(config.XDPoS.Epoch)*7, config) + blockchain, _, _, signer, signFn := PrepareXDCTestBlockChainWithPenaltyForV2Engine(t, int(config.XDPoS.Epoch)*3, config) adaptor := blockchain.Engine().(*XDPoS.XDPoS) hooks.AttachConsensusV2Hooks(adaptor, blockchain, config) assert.NotNil(t, adaptor.EngineV2.HookPenalty) @@ -77,25 +77,25 @@ func TestHookPenaltyV2Comeback(t *testing.T) { assert.Nil(t, err) masternodes := adaptor.GetMasternodesFromCheckpointHeader(header901) assert.Equal(t, 5, len(masternodes)) - header6300 := blockchain.GetHeaderByNumber(config.XDPoS.Epoch * 7) - penalty, err := adaptor.EngineV2.HookPenalty(blockchain, big.NewInt(int64(config.XDPoS.Epoch*7)), header6300.ParentHash, masternodes) + header2100 := blockchain.GetHeaderByNumber(config.XDPoS.Epoch * 3) + penalty, err := adaptor.EngineV2.HookPenalty(blockchain, big.NewInt(int64(config.XDPoS.Epoch*3)), header2100.ParentHash, masternodes) assert.Nil(t, err) // miner (coinbase) is in comeback. so all addresses are in penalty assert.Equal(t, 2, len(penalty)) - header6285 := blockchain.GetHeaderByNumber(config.XDPoS.Epoch*7 - common.MergeSignRange) + header2085 := blockchain.GetHeaderByNumber(config.XDPoS.Epoch*3 - common.MergeSignRange) // forcely insert signing tx into cache, to cancel comeback. since no comeback, penalty is 3 - tx, err := signingTxWithSignerFn(header6285, 0, signer, signFn) + tx, err := signingTxWithSignerFn(header2085, 0, signer, signFn) assert.Nil(t, err) - adaptor.CacheSigningTxs(header6285.Hash(), []*types.Transaction{tx}) - penalty, err = adaptor.EngineV2.HookPenalty(blockchain, big.NewInt(int64(config.XDPoS.Epoch*7)), header6300.ParentHash, masternodes) + adaptor.CacheSigningTxs(header2085.Hash(), []*types.Transaction{tx}) + penalty, err = adaptor.EngineV2.HookPenalty(blockchain, big.NewInt(int64(config.XDPoS.Epoch*3)), header2100.ParentHash, masternodes) assert.Nil(t, err) assert.Equal(t, 1, len(penalty)) } func TestHookPenaltyV2Jump(t *testing.T) { config := params.TestXDPoSMockChainConfig - end := int(config.XDPoS.Epoch)*7 - common.MergeSignRange - blockchain, _, _, _, _ := PrepareXDCTestBlockChainWithPenaltyForV2Engine(t, int(config.XDPoS.Epoch)*7, config) + end := int(config.XDPoS.Epoch)*3 - common.MergeSignRange + blockchain, _, _, _, _ := PrepareXDCTestBlockChainWithPenaltyForV2Engine(t, int(config.XDPoS.Epoch)*3, config) adaptor := blockchain.Engine().(*XDPoS.XDPoS) hooks.AttachConsensusV2Hooks(adaptor, blockchain, config) assert.NotNil(t, adaptor.EngineV2.HookPenalty) @@ -106,10 +106,10 @@ func TestHookPenaltyV2Jump(t *testing.T) { assert.Nil(t, err) masternodes := adaptor.GetMasternodesFromCheckpointHeader(header901) assert.Equal(t, 5, len(masternodes)) - header6285 := blockchain.GetHeaderByNumber(uint64(end)) - adaptor.EngineV2.SetNewRoundFaker(blockchain, utils.Round(config.XDPoS.Epoch*7), false) - // round 6285-6300 miss blocks, penalty should work as usual - penalty, err := adaptor.EngineV2.HookPenalty(blockchain, header6285.Number, header6285.ParentHash, masternodes) + header2085 := blockchain.GetHeaderByNumber(uint64(end)) + adaptor.EngineV2.SetNewRoundFaker(blockchain, utils.Round(config.XDPoS.Epoch*3), false) + // round 2085-2100 miss blocks, penalty should work as usual + penalty, err := adaptor.EngineV2.HookPenalty(blockchain, header2085.Number, header2085.ParentHash, masternodes) assert.Nil(t, err) assert.Equal(t, 2, len(penalty)) } diff --git a/eth/hooks/engine_v2_hooks.go b/eth/hooks/engine_v2_hooks.go index ac591f15e9..689a4e13fa 100644 --- a/eth/hooks/engine_v2_hooks.go +++ b/eth/hooks/engine_v2_hooks.go @@ -68,11 +68,11 @@ func AttachConsensusV2Hooks(adaptor *XDPoS.XDPoS, bc *core.BlockChain, chainConf } // get list check penalties signing block & list master nodes wil comeback - // start to calc comeback at v2 block + limitPenaltyEpoch to avoid reading v1 blocks - comebackHeight := (common.LimitPenaltyEpoch+1)*chain.Config().XDPoS.Epoch + chain.Config().XDPoS.V2.SwitchBlock.Uint64() + // start to calc comeback at v2 block + limitPenaltyEpochV2 to avoid reading v1 blocks + comebackHeight := (common.LimitPenaltyEpochV2+1)*chain.Config().XDPoS.Epoch + chain.Config().XDPoS.V2.SwitchBlock.Uint64() penComebacks := []common.Address{} if number.Uint64() > comebackHeight { - pens := adaptor.EngineV2.GetPreviousPenaltyByHash(chain, parentHash, common.LimitPenaltyEpoch) + pens := adaptor.EngineV2.GetPreviousPenaltyByHash(chain, parentHash, common.LimitPenaltyEpochV2) for _, p := range pens { for _, addr := range candidates { if p == addr {