Bitcoinj
如何在 BitcoinJ 中進行多輸入一輸出的交易?
我正在嘗試使用以下程式碼將所有硬幣從我的帳戶(由 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()。
無論哪種方式,使用您的程式碼生成的交易都是無效的,因為您沒有減去足夠的交易費用(或任何東西,在您的情況下)。