From 32c10b29a7d3d433876649aa1c1617880c3cb951 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Tue, 19 Feb 2019 10:13:58 +0800 Subject: [PATCH] Fix and optimize view changing --- neo/Consensus/ConsensusService.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/neo/Consensus/ConsensusService.cs b/neo/Consensus/ConsensusService.cs index b0dff4a5a9..e8c2413fd5 100644 --- a/neo/Consensus/ConsensusService.cs +++ b/neo/Consensus/ConsensusService.cs @@ -112,7 +112,12 @@ private void CheckExpectedView(byte viewNumber) { if (context.ViewNumber == viewNumber) return; if (context.ChangeViewPayloads.Count(p => p != null && p.GetDeserializedMessage().NewViewNumber == viewNumber) >= context.M) + { + ChangeView message = context.ChangeViewPayloads[context.MyIndex]?.GetDeserializedMessage(); + if (message is null || message.NewViewNumber < viewNumber) + localNode.Tell(new LocalNode.SendDirectly { Inventory = context.MakeChangeView(viewNumber) }); InitializeConsensus(viewNumber); + } } private void CheckPreparations() @@ -499,7 +504,8 @@ public static Props Props(IActorRef localNode, IActorRef taskManager, Store stor private void RequestChangeView() { context.State |= ConsensusState.ViewChanging; - byte expectedView = GetLastExpectedView(context.MyIndex); + byte expectedView = context.ChangeViewPayloads[context.MyIndex]?.GetDeserializedMessage().NewViewNumber ?? 0; + if (expectedView < context.ViewNumber) expectedView = context.ViewNumber; expectedView++; Log($"request change view: height={context.BlockIndex} view={context.ViewNumber} nv={expectedView} state={context.State}"); ChangeTimer(TimeSpan.FromSeconds(Blockchain.SecondsPerBlock << (expectedView + 1)));