Signature

無法使用 bitcoinjs-lib psbt 使用更改地址簽署 txn

  • November 15, 2019

我很難弄清楚如何從更改地址簽署支出。我明白了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 列表中獲取隨機數。本來想刪的,不過還是留著吧。

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