private void LocalNode_InventoryReceived(object sender, IInventory inventory)
        {
            ConsensusPayload payload = inventory as ConsensusPayload;

            if (payload != null)
            {
                lock (context)
                {
                    if (payload.ValidatorIndex == context.MyIndex)
                    {
                        return;
                    }
                    if (payload.Version != ConsensusContext.Version || payload.PrevHash != context.PrevHash || payload.BlockIndex != context.BlockIndex)
                    {
                        return;
                    }
                    if (payload.ValidatorIndex >= context.Validators.Length)
                    {
                        return;
                    }
                    ConsensusMessage message = ConsensusMessage.DeserializeFrom(payload.Data);
                    if (message.ViewNumber != context.ViewNumber && message.Type != ConsensusMessageType.ChangeView)
                    {
                        return;
                    }
                    switch (message.Type)
                    {
                    case ConsensusMessageType.ChangeView:
                        OnChangeViewReceived(payload, (ChangeView)message);
                        break;

                    case ConsensusMessageType.PerpareRequest:
                        OnPerpareRequestReceived(payload, (PerpareRequest)message);
                        break;

                    case ConsensusMessageType.PerpareResponse:
                        OnPerpareResponseReceived(payload, (PerpareResponse)message);
                        break;
                    }
                }
            }
        }
        private void LocalNode_NewInventory(object sender, IInventory inventory)
        {
            ConsensusPayload payload = inventory as ConsensusPayload;

            if (payload != null)
            {
                lock (context)
                {
                    if (payload.MinerIndex == context.MinerIndex)
                    {
                        return;
                    }
                    if (payload.Version != ConsensusContext.Version || payload.PrevHash != context.PrevHash || payload.Height != context.Height)
                    {
                        return;
                    }
                    if (payload.MinerIndex >= context.Miners.Length)
                    {
                        return;
                    }
                    ConsensusMessage message = ConsensusMessage.DeserializeFrom(payload.Data);
                    if (message.ViewNumber != context.ViewNumber && message.Type != ConsensusMessageType.ChangeView)
                    {
                        return;
                    }
                    switch (message.Type)
                    {
                    case ConsensusMessageType.ChangeView:
                        OnChangeViewReceived(payload, (ChangeView)message);
                        break;

                    case ConsensusMessageType.PerpareRequest:
                        OnPerpareRequestReceived(payload, (PerpareRequest)message);
                        break;

                    case ConsensusMessageType.PerpareResponse:
                        OnPerpareResponseReceived(payload, (PerpareResponse)message);
                        break;
                    }
                }
            }
            Transaction tx = inventory as Transaction;

            if (tx != null)
            {
                lock (context)
                {
                    if (!context.State.HasFlag(ConsensusState.Backup) || !context.State.HasFlag(ConsensusState.RequestReceived) || context.State.HasFlag(ConsensusState.SignatureSent))
                    {
                        return;
                    }
                    if (context.Transactions.ContainsKey(tx.Hash))
                    {
                        return;
                    }
                    if (!context.TransactionHashes.Contains(tx.Hash))
                    {
                        return;
                    }
                    AddTransaction(tx);
                }
            }
        }