private void CheckPeerAvailability(object sender, DoWorkEventArgs e) { var callback = new Action(() => { if (TimeOutEvent != null) { TimeOutEvent(this, new IpAddressEventArgs(_currentIpAddress)); } }); var nonce = NonceHelper.GetNonceUInt64(); var pingMessage = new PingMessage(nonce, _network); try { var result = _messageCoordinator.Launch(this, pingMessage); if (result == null) { callback(); return; } var pongMessage = result as PongMessage; if (pongMessage.Nonce != nonce) { callback(); } } catch (Interop.RpcException) { callback(); } }
public void WhenBuildCoinbaseTransaction() { var ba = BuildBlockChainAddress(); var builder = new TransactionBuilder(); var nonce = BitConverter.GetBytes(NonceHelper.GetNonceUInt64()); var transaction = builder.NewCoinbaseTransaction() .SetInput(4, nonce) .AddOutput(20, Script.CreateP2PKHScript(ba.PublicKeyHash)) .Build(); var serializedTransaction = transaction.Serialize(); }
public void Connect(string host, ServiceFlags serviceFlag) { if (string.IsNullOrWhiteSpace(host)) { throw new ArgumentNullException(nameof(host)); } var iid = Interop.Constants.InterfaceId; var port = PortsHelper.GetPort(_network); IPAddress ipAdr = null; if (!IPAddress.TryParse(host, out ipAdr)) { // TODO : Throw an exception. } var adrBytes = ipAdr.MapToIPv6().GetAddressBytes(); _serviceFlag = serviceFlag; _currentIpAddress = new IpAddress(serviceFlag, adrBytes, ushort.Parse(port)); // _client = new RpcClientApi(iid, RpcProtseq.ncacn_ip_tcp, host, port); _client = new RpcClientApi(iid, RpcProtseq.ncalrpc, null, host); // Connection to peers : https://bitcoin.org/en/developer-guide#connecting-to-peers var instance = PeersStore.Instance(); var transmittingNode = instance.GetMyIpAddress(); var nonce = NonceHelper.GetNonceUInt64(); var versionMessage = new VersionMessage(transmittingNode, _currentIpAddress, nonce, string.Empty, 0, false, _network); try { _peerConnection = new PeerConnection(adrBytes); var result = _messageCoordinator.Launch(this, versionMessage); if (result != null && result is VerackMessage) { _peerConnection.Connect(); if (ConnectEvent != null) { ConnectEvent(this, new IpAddressEventArgs(_currentIpAddress)); } _timer = new Timer(TimerElapsed, _autoEvent, CHECK_INTERVAL, CHECK_INTERVAL); // CHECK PEERS AVAILABILITY EVERY 60 SECONDS. } } catch (Interop.RpcException) { throw new PeerConnectorException(ErrorCodes.PeerRpcError); } }
private JObject GetBlockTemplate(JObject response) { var transactions = MemoryPool.Instance().GetTransactions(); var blockChain = _blockChainStore.GetBlockChain(); if (transactions == null || !transactions.Any()) { response["result"] = null; return(response); } var currentBlock = blockChain.GetCurrentBlock(); var height = blockChain.GetCurrentBlockHeight(); var previousBlockHash = currentBlock.GetHashHeader().ToHexString(); var transactionBuilder = new TransactionBuilder(); var nonce = BitConverter.GetBytes(NonceHelper.GetNonceUInt64()); var value = transactions.Sum(t => _transactionHelper.GetFee(t.Transaction, _network)); var coinBaseTransaction = transactionBuilder.NewCoinbaseTransaction() .SetInput((uint)height + 1, nonce) .AddOutput(value, Script.CreateCorrectScript()) .Build(); var result = new JObject(); var jTransactions = new JArray(); foreach (var transaction in transactions) { jTransactions.Add(transaction.Transaction.Serialize().ToHexString()); } var currentTime = DateTime.UtcNow.ToUnixTimeUInt32(); var coinBaseTxnObj = new JObject(); coinBaseTxnObj.Add("data", coinBaseTransaction.Serialize().ToHexString()); result.Add("coinbasetxn", coinBaseTxnObj); result.Add("expires", "120"); result.Add("longpollid", ""); result.Add("height", blockChain.GetCurrentBlockHeight() + 1); result.Add("curtime", currentTime); result.Add("previousblockhash", previousBlockHash); result.Add("transactions", jTransactions); result.Add("version", BlockHeader.CURRENT_VERSION); result.Add("target", TargetHelper.GetTarget(Constants.DEFAULT_NBITS).ToHexString()); result.Add("bits", Constants.DEFAULT_NBITS); response["result"] = result; return(response); }
public void WhenSerializeBlockWithOneCoinbaseTransaction() { var ba = BuildBlockChainAddress(); var builder = new TransactionBuilder(); var nonce = BitConverter.GetBytes(NonceHelper.GetNonceUInt64()); var transaction = builder.NewCoinbaseTransaction() .SetInput(4, nonce) .AddOutput(20, Script.CreateP2PKHScript(ba.PublicKeyHash)) .Build(); var block = new Block(null, NBits, NonceHelper.GetNonceUInt32()); block.Transactions.Add(transaction); var serializedBlock = block.Serialize(); var des = Block.Deserialize(serializedBlock); string s = ""; }