private void OnTimer(Timer timer) { if (context.WatchOnly || context.BlockSent) { return; } if (timer.Height != context.Block.Index || timer.ViewNumber != context.ViewNumber) { return; } if (context.IsPrimary && !context.RequestSentOrReceived) { SendPrepareRequest(); } else if ((context.IsPrimary && context.RequestSentOrReceived) || context.IsBackup) { if (context.CommitSent) { // Re-send commit periodically by sending recover message in case of a network issue. Log($"Sending {nameof(RecoveryMessage)} to resend {nameof(Commit)}"); localNode.Tell(new LocalNode.SendDirectly { Inventory = context.MakeRecoveryMessage() }); ChangeTimer(TimeSpan.FromMilliseconds(neoSystem.Settings.MillisecondsPerBlock << 1)); } else { var reason = ChangeViewReason.Timeout; if (context.Block != null && context.TransactionHashes?.Length > context.Transactions?.Count) { reason = ChangeViewReason.TxNotFound; } RequestChangeView(reason); } } }