From 05d315d2e3e0c0b121334f3f9627175f0cf52283 Mon Sep 17 00:00:00 2001 From: wgr523 Date: Sun, 23 Jan 2022 11:26:37 +0800 Subject: [PATCH] finish YourTurn handling v1->v2 switch, add test (#44) --- consensus/XDPoS/engines/engine_v2/engine.go | 8 +++++++- consensus/tests/initialize_v2_test.go | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index 75329ece34..21b4841b0d 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -343,7 +343,13 @@ func (x *XDPoS_v2) YourTurn(chain consensus.ChainReader, parent *types.Header, s var masterNodes []common.Address if isEpochSwitch { if x.config.XDPoSV2Block.Cmp(parent.Number) == 0 { - // TODO: read v1 master nodes + snap, err := x.getSnapshot(chain, x.config.XDPoSV2Block.Uint64()) + if err != nil { + log.Error("[YourTurn]Cannot find snapshot at gap num of last V1", "err", err, "number", x.config.XDPoSV2Block.Uint64()) + return false, err + } + // the initial snapshot of v1->v2 switch does not need penalty + masterNodes = snap.NextEpochMasterNodes } else { // TODO: calc master nodes by smart contract - penalty // TODO: related to snapshot diff --git a/consensus/tests/initialize_v2_test.go b/consensus/tests/initialize_v2_test.go index 773a297e5c..6dbfbd4401 100644 --- a/consensus/tests/initialize_v2_test.go +++ b/consensus/tests/initialize_v2_test.go @@ -35,7 +35,13 @@ func TestYourTurnInitialV2(t *testing.T) { } // YourTurn is called before mine first v2 block - adaptor.YourTurn(blockchain, block900.Header(), common.HexToAddress("xdc0278C350152e15fa6FFC712a5A73D704Ce73E2E1")) + b, err := adaptor.YourTurn(blockchain, block900.Header(), common.HexToAddress("xdc0278C350152e15fa6FFC712a5A73D704Ce73E2E1")) + assert.Nil(t, err) + assert.False(t, b) + b, err = adaptor.YourTurn(blockchain, block900.Header(), common.HexToAddress("xdc03d9e17Ae3fF2c6712E44e25B09Ac5ee91f6c9ff")) + assert.Nil(t, err) + // round=1, so masternode[1] has YourTurn = True + assert.True(t, b) assert.Equal(t, adaptor.EngineV2.GetCurrentRound(), utils.Round(1)) snap, err := adaptor.EngineV2.GetSnapshot(blockchain, block900.Header())