private JObject SendRawTransaction(IEnumerable <string> parameters, JObject response, string id)
        {
            var blockChain = _blockChainStore.GetBlockChain();

            if (parameters == null || !parameters.Any())
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The transaction is missing"));
            }

            var txPayload     = parameters.First().FromHexString();
            var allowHighFees = false;

            if (parameters.Count() >= 2)
            {
                if (bool.TryParse(parameters.ElementAt(1), out allowHighFees))
                {
                }
            }

            var kvp = BaseTransaction.Deserialize(txPayload);

            try
            {
                var tx = kvp.Key;
                _transactionValidator.Check(tx);
                MemoryPool.Instance().AddTransaction(tx, blockChain.GetCurrentBlockHeight());
                P2PConnectorEventStore.Instance().Broadcast(tx);
                response["result"] = tx.GetTxId().ToHexString();
                return(response);
            }
            catch (ValidationException ex)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_VERIFY_ERROR, ex.Message));
            }
        }
        public void Dispose()
        {
            foreach (var activePeer in _peers)
            {
                activePeer.Dispose();
            }

            P2PConnectorEventStore.Instance().NewBlockEvt       -= BroadcastNewBlock;
            P2PConnectorEventStore.Instance().NewTransactionEvt -= BroadcastNewTransaction;
        }
        public P2PNetworkConnector(IMessageCoordinator messageCoordinator)
        {
            _peers              = new ConcurrentBag <PeerConnector>();
            _messageParser      = new MessageParser();
            _peersRepository    = new PeersRepository();
            _messageCoordinator = messageCoordinator;
            var instance = PeerEventStore.Instance();

            instance.NewPeerEvt += ListenPeer;
            P2PConnectorEventStore.Instance().NewBlockEvt       += BroadcastNewBlock;
            P2PConnectorEventStore.Instance().NewTransactionEvt += BroadcastNewTransaction;
        }
        private JObject SubmitBlock(IEnumerable <string> parameters, string id, JObject response)
        {
            var blockChain    = _blockChainStore.GetBlockChain();
            var smartContract = _smartContractStore.GetSmartContracts();

            if (!parameters.Any())
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The block is missing"));
            }

            var payload = parameters.First().FromHexString();
            var block   = Block.Deserialize(payload);

            try
            {
                _blockValidator.Check(block);
                if (block.Transactions != null)
                {
                    MemoryPool.Instance().Remove(block.Transactions.Select(tx => tx.GetTxId()));
                }

                smartContract.AddBlock(block);
                smartContract.Commit();
                blockChain.AddBlock(block);
                P2PConnectorEventStore.Instance().Broadcast(block);
                response["result"] = null;
                return(response);
            }
            catch (ValidationException ex)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_VERIFY_ERROR, ex.Message));
            }
            catch (Exception ex)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_REQUEST, ex.Message));
            }
        }
        private JObject SendSmartContractTransaction(IEnumerable <string> parameters, string id, JObject response)
        {
            var blockChain = _blockChainStore.GetBlockChain();

            if (parameters == null || !parameters.Any())
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The from & data are not specified"));
            }

            if (parameters.Count() < 2)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The data is not specified"));
            }

            IEnumerable <byte> fromPayload = null;
            IEnumerable <byte> dataPayload = null;
            IEnumerable <byte> toPayload   = null;
            double             gas         = 0,
                               gasPrice = 0,
                               scValue  = 0;
            int scNonce                 = 0;

            try
            {
                fromPayload = parameters.First().FromHexString();
            }
            catch (Exception)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The from cannot be decoded"));
            }

            try
            {
                dataPayload = parameters.ElementAt(1).FromHexString();
            }
            catch (Exception)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The data cannot be decoded"));
            }

            if (parameters.Count() >= 3)
            {
                try
                {
                    toPayload = parameters.ElementAt(2).FromHexString();
                }
                catch (Exception)
                {
                    return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The to cannot be decoded"));
                }
            }

            if (parameters.Count() >= 4)
            {
                try
                {
                    gas = double.Parse(parameters.ElementAt(3));
                }
                catch (Exception) { }
            }

            if (parameters.Count() >= 5)
            {
                try
                {
                    gasPrice = double.Parse(parameters.ElementAt(4));
                }
                catch (Exception) { }
            }

            if (parameters.Count() >= 6)
            {
                try
                {
                    scValue = double.Parse(parameters.ElementAt(5));
                }
                catch (Exception) { }
            }

            if (parameters.Count() >= 7)
            {
                try
                {
                    scNonce = int.Parse(parameters.ElementAt(6));
                }
                catch (Exception) { }
            }

            var smartContractTx = new SmartContractTransaction
            {
                Data     = dataPayload,
                From     = fromPayload,
                To       = toPayload,
                Gas      = gas,
                GasPrice = gasPrice,
                Nonce    = scNonce,
                Value    = scValue
            };

            try
            {
                _transactionValidator.Check(smartContractTx);
                MemoryPool.Instance().AddTransaction(smartContractTx, blockChain.GetCurrentBlockHeight());
                P2PConnectorEventStore.Instance().Broadcast(smartContractTx);
                response["result"] = smartContractTx.GetTxId().ToHexString();
                return(response);
            }
            catch (ValidationException ex)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_VERIFY_ERROR, ex.Message));
            }
        }