Signature
無法使用 bitcoinjs-lib psbt 使用更改地址簽署 txn
我很難弄清楚如何從更改地址簽署支出。我明白了
Error: cannot sign for this input with the key <value>
。初始交易工作正常,我生成一個交易,其中有多個輸入到兩個輸出,其中一個是更改地址 - 它與支出者地址相同。以下是步驟: 1) 我為我們的支出地址獲取所有 UTXO。
const unspentTx = (await listUnspentTxByAddresses([mainAddress])).data.result;
2)我添加所有輸入和輸出,簽名,完成並送出。
const fee = new BigNumber((await getEstimateSmartFee(2)).data.result.feerate) .times(100000000) .div(3); const output = { address: destinationAddress, value: parseInt(pullAmount.minus(fee).toFixed(0)), }; const senderBalance = sum .times(100000000) .minus(pullAmount) .minus(fee); const change = { address: sender, value: parseInt(senderBalance.toString()), }; // Adding the output psbt.addOutput(output); psbt.addOutput(change); for (let i = 0; i < txids.length; i++) { const transactionObject = await getTransaction(txids[i]); const input = { hash: txids[i], index: 0, nonWitnessUtxo: Buffer.from(transactionObject.data.result.hex, 'hex'), }; try { psbt.addInput(input); } catch (e) { console.log('Add Input Failed e =>', e); return null; } } const key = bitcoin.ECPair.fromWIF(privateKey, testnet); for (let i = 0; i < txids.length; i++) { psbt.signInput(i, key); } psbt.finalizeAllInputs(); const rawTx = psbt.extractTransaction().toHex(); const withdrawPendingTx = await sendRawTransaction(rawTx);
這第一次有效,但如前所述,我第二次呼叫
await listUnspentTxByAddresses([mainAddress])
並遵循相同的確切程序時,js 庫驗證會阻止使用主地址密鑰進行簽名。這似乎沒有意義,所以我希望這裡有一個明顯的錯誤。我很確定它是作為帶有 SigHashAll 的預設 P2PKH 發送的。
簡單的解決方案!
index
在輸入對像中被硬編碼為0
而不是vout
從 UTXO 列表中獲取隨機數。本來想刪的,不過還是留著吧。