익명 18:11

Missing Witness field in p2wpkh decoded tx hex

Missing Witness field in p2wpkh decoded tx hex

I have placed together a raw tx hex but when it's unable to be broadcasted as I keep getting an error below

sendrawtransaction RPC error: {"code":-25,"message":"bad-txns-inputs-missingorspent"}

I then decoded the tx hex using https://live.blockcypher.com/btc/decodetx/ to see that I seem to be missing the Witness field as I am using native segwit addresses:

{
    "addresses": [
        "bc1qj3rjxzhlqm6fqesd5fwphjnf457zkww3s5qrv5",
        "bc1qjp3cch0hdvdr0hy99cs76kl9kekmuxv3k9nr6l"
    ],
    "block_height": -1,
    "block_index": -1,
    "confirmations": 0,
    "double_spend": false,
    "fees": 200,
    "hash": "88420211f5ea53174fc6a708c00ca2e840d687591573d0ecd2464fae20d139a7",
    "inputs": [
        {
            "addresses": [
                "bc1qj3rjxzhlqm6fqesd5fwphjnf457zkww3s5qrv5"
            ],
            "age": 696993,
            "output_index": 0,
            "output_value": 60200,
            "prev_hash": "74e24a2d50ba64abc099126c1c208b5f7156e3ad515b86f3edcca3f3d4291f66",
            "script": "4730440220516e15b6354f17e3f02711107624005e6ccd26cf61ef21b35e91315dfbd33e9f022049dadb73ca3e814de9da0b35ff20a8ca82147dda138ede948ccac5621a5bc1bb01210384485d43e938f8c68c4ac903d4d5a97fe842f66c12b860d8d2e1242d2b01fc1f",
            "script_type": "pay-to-witness-pubkey-hash",
            "sequence": 4294967295
        }
    ],
    "outputs": [
        {
            "addresses": [
                "bc1qjp3cch0hdvdr0hy99cs76kl9kekmuxv3k9nr6l"
            ],
            "script": "001490638c5df76b1a37dc852e21ed5be5b66dbe1991",
            "script_type": "pay-to-witness-pubkey-hash",
            "value": 60000
        }
    ],
    "preference": "low",
    "received": "2021-09-05T10:17:14.395062568Z",
    "relayed_by": "3.82.154.159",
    "size": 188,
    "total": 60000,
    "ver": 2,
    "vin_sz": 1,
    "vout_sz": 1,
    "vsize": 188
}

I then thought perhaps I didn't add a scriptPubKey into the addInput but this code didn't seem to work for me:

const fetch = require("node-fetch")
const bitcoin = require("bitcoinjs-lib")
const url = "https://blockchain.info/rawaddr/"
let MAINNET = bitcoin.networks.bitcoin
pubAdd = "bc1qj3rjxzhlqm6fqesd5fwphjnf457zkww3s5qrv5"

let txb = new bitcoin.TransactionBuilder(MAINNET)
var txid = null
var outn = 0
var transactionhex = ""

async function getPubAddInfo() {
  const response = await fetch(url + pubAdd)
  const data = await response.json()

  txid = data["txs"][0]["hash"]
  outn = data["txs"][0]["out"][0]["n"]
}

async function getTXHash() {
  await getPubAddInfo()

  let WIF = "xxxxxxxxxxxx"
  let keypairSpend = bitcoin.ECPair.fromWIF(WIF, MAINNET)

  var scriptPubkey = bitcoin.script.witnessPubKeyHash.output.encode(bitcoin.crypto.hash160(keypairSpend.getPublicKeyBuffer()))

  txb.addInput(txid, outn, null, scriptPubkey)

  txb.addOutput("bc1qjp3cch0hdvdr0hy99cs76kl9kekmuxv3k9nr6l", 60000)

  txb.sign(0, keypairSpend, null, null, 60200)

  let tx = txb.build()
  transactionhex = tx.toHex()
  console.log(transactionhex)
}

getTXHash()

At the moment I get the error TypeError: Cannot read property 'output' of undefined on the line where i create var scriptPubKey.

Any suggestions as to how I can add the Witness field into the tx? Is it because I am improperly adding the scriptPubKey? I am using bitcoinjs 5.2.0



Top Answer/Comment:

How are you signing it? Also what version of bitcoinjs are you using? Looks like an older one (v3.3?)prior to PSBTs. It might be a little different depending on version. Spending from segwit addresses (p2sh or native) you must specify inputvalue, this is the full value of the unspent output being spent.

txb.sign(0, keypairSpend, null, null, inputvalue);

As of v.4.03 for an example spending from p2wpkh with the latest transaction builder see their github reference docs at https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/transactions.spec.ts#L11

상단 광고의 [X] 버튼을 누르면 내용이 보입니다