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)); } }