void IBroadcaster.BroadcastTransaction(Transaction tx)
 {
     _eventAggregator.Publish(new TxBroadcastEvent {
         Tx = tx
     });
     _logger.LogDebug($"Broadcasting transaction {tx.ToHex()}");
     _client.Broadcast(tx);
 }
예제 #2
0
 void IBroadcaster.BroadcastTransaction(Transaction tx)
 {
     _logger.LogDebug($"Broadcasting transaction {tx.ToHex()}");
     _client.Broadcast(tx);
 }
예제 #3
0
        public static void Execute()
        {
            // To setup NBXplorer's, you need a fully synced bitcoind node with default parameters.
            // Then clone and run NBXplorer with default parameters.
            // Reference the NBXplorer.Client nuget package then you need to notify the NBXplorer 
            // to track the user wallet:
            var network = new NBXplorerNetworkProvider(NetworkType.Mainnet).GetBTC();
            var userExtKey = new ExtKey();
            var userDerivationScheme = network.DerivationStrategyFactory.CreateDirectDerivationStrategy(userExtKey.Neuter(), new DerivationStrategyOptions()
            {
                // Use non-segwit
                Legacy = true
            });

            ExplorerClient client = new ExplorerClient(network);
            client.Track(userDerivationScheme);

            // query the UTXOs of your user and spend them the following way
            var utxos = client.GetUTXOs(userDerivationScheme, null, false);

            // If you want to spend those UTXOs:
            var coins = utxos.GetUnspentCoins();
            var keys = utxos.GetKeys(userExtKey);
            var changeAddress = new Key();
            TransactionBuilder builder = new TransactionBuilder();
            builder.AddCoins(coins)
                   .AddKeys(keys)
                   .Send(new Key(), Money.Coins(0.5m))
                   .SetChange(changeAddress.ScriptPubKey);

            // Set the fee rate
            var fallbackFeeRate = new FeeRate(Money.Satoshis(100), 1);
            var feeRate = client.GetFeeRate(1, fallbackFeeRate).FeeRate;
            builder.SendEstimatedFees(feeRate);
            /////

            var tx = builder.BuildTransaction(sign: true);
            Console.WriteLine(client.Broadcast(tx));

            // To prevent this problem of broadcasting the same transaction twice,
            // you need to make sure to not spend twice the same coins.
            // A way to solve the problem is by simply retrying:
            while (true)
            {
                coins = utxos.GetUnspentCoins();
                keys = utxos.GetKeys(userExtKey);
                builder = new TransactionBuilder();
                builder.AddCoins(coins)
                       .AddKeys(keys)
                       .Send(new Key(), Money.Coins(0.5m))
                       .SetChange(changeAddress.ScriptPubKey);

                // Set the fee rate
                fallbackFeeRate = new FeeRate(Money.Satoshis(100), 1);
                feeRate = client.GetFeeRate(1, fallbackFeeRate).FeeRate;
                builder.SendEstimatedFees(feeRate);
                /////

                tx = builder.BuildTransaction(true);
                var result = client.Broadcast(tx);
                if (result.Success)
                {
                    Console.WriteLine("Success!");
                    break;
                }
                else if (result.RPCCode.HasValue && result.RPCCode.Value == RPCErrorCode.RPC_TRANSACTION_REJECTED)
                {
                    Console.WriteLine("We probably got a conflict, let's try again!");
                    continue;
                }
                else
                {
                    Console.WriteLine($"Something is really wrong {result.RPCCode} {result.RPCCodeMessage} {result.RPCMessage}");
                    // Do something!!!
                }
            }

            // Another common way is to have a global list of already used outpoint that you can check against.
        }