Bitcoinj

如何在 BitcoinJ 中進行多輸入一輸出的交易?

  • April 7, 2021

我正在嘗試使用以下程式碼將所有硬幣從我的帳戶(由 HD Wallet 生成)發送到一個帳戶:

fun sendAllFundsOnAddress(address: String) {
       val receiver = Address.fromString(params, address)
       val tx = Transaction(params)

       val balance = Coin.valueOf(walletAppKit.wallet().unspents.map { it.value.value }.sum())
       tx.addOutput(balance, receiver)

       walletAppKit.wallet().unspents.forEach {
           val key = walletAppKit.wallet().findKeyFromAddress(Address.fromString(params, it.scriptPubKey.getToAddress(params).toString()))
           tx.addSignedInput(it.outPointFor, it.scriptPubKey, key, Transaction.SigHash.ALL, true)
       }

       walletAppKit.wallet().commitTx(tx)
       val sendRequest = SendRequest.forTx(tx)
       walletAppKit.wallet().completeTx(sendRequest)
   }

但是我得到 NullPointerException,而它計算見證(在輸入簽名過程中)。

你能給出任何想法,有什麼問題嗎?

SendRequest sendRequest = SendRequest.emptyWallet(receiver);
Transaction tx = walletAppKit().wallet().sendCoinsOffline(sendRequest);
System.out.println(Hex.toHexString(tx.bitcoinSerialize()));

在您的原始程式碼中,您遍歷錢包中的每個 UTXO 並將其添加為簽名輸入,實質上是清空錢包到指定的輸出。

上面的程式碼做同樣的事情,但使用了不同的方法。您還應該在 commitTx() 之前呼叫 completeTx(),但 sendCoinsOffline() 會為您處理這些。

然後在我的程式碼中列印出原始交易十六進制,然後您可以將其發送到節點進行廣播。如果您希望 bitcoinj 的 WalletAppKit 也為您執行此操作,請查看 Wallet.sendCoins()。

無論哪種方式,使用您的程式碼生成的交易都是無效的,因為您沒有減去足夠的交易費用(或任何東西,在您的情況下)。

引用自:https://bitcoin.stackexchange.com/questions/105091