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);
        }
示例#5
0
        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   = "";
        }