private void OnConsensusPayload(ConsensusPayload payload) { if (context.BlockSent()) { return; } if (payload.Version != ConsensusContext.Version) { return; } if (payload.PrevHash != context.PrevHash || payload.BlockIndex != context.BlockIndex) { if (context.BlockIndex < payload.BlockIndex) { Log($"chain sync: expected={payload.BlockIndex} current={context.BlockIndex - 1} nodes={LocalNode.Singleton.ConnectedCount}", LogLevel.Warning); } return; } if (payload.ValidatorIndex >= context.Validators.Length) { return; } ConsensusMessage message = payload.ConsensusMessage; if (message.ViewNumber != context.ViewNumber && message.Type != ConsensusMessageType.ChangeView && message.Type != ConsensusMessageType.RecoveryMessage) { return; } switch (message) { case ChangeView view: OnChangeViewReceived(payload, view); break; case PrepareRequest request: OnPrepareRequestReceived(payload, request); break; case PrepareResponse response: OnPrepareResponseReceived(payload, response); break; case Commit commit: OnCommitReceived(payload, commit); break; case RecoveryMessage recovery: OnRecoveryMessageReceived(payload, recovery); break; } }