示例#1
0
        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;
            }
        }