Bitcoin: getrawtransaction(verbose) and decoderawtransaction of a same transaction returns different txid

Created on 23 Apr 2019  ·  3Comments  ·  Source: bitcoin/bitcoin


For transaction f4dedd64c9841d53bbda8beeda52235ec986f1400606812d9c033ac34105532c, the call of [getrawtransaction(verbose)] and [getrawtransaction(hex) + decoderawtransaction] has totally different result,including txid.

Step of reproducing the issue:

  • Use getrawtransaction(hex) + decoderawtransaction
curl --user yourAuth --data-binary '{"jsonrpc": "1.0","id":"curltest","method":"getrawtransaction", "params": ["f4dedd64c9841d53bbda8beeda52235ec986f1400606812d9c033ac34105532c"] }' -H 'content-type: text/plain;' http://yourEndPoint

Returns:

{
    "result": "0100000000010115a16270d3ee7ccc58a0757c1d8e1763790f223d4e4c3823948fb3dfdf9865180100000000ffffffff023f3256000000000017a9142915a7db6c6df171fd0436c7cec0042195dad01c8738ee4647000000001600140aad95e932ba045c2daf31a04c36683d39efe91002473044022002537539ac9586fdd8b5947fa0a47dc002ebe57502608433e103efe2740f93d4022023b1ade7bdf0f002a8fdc4ec6d534588d2132ab88850ac426ea413b4adb465260121031ef964af6923a2111e4916afcc87c73a8980322cc761dd3648714dfda99e72c400000000",
    "error": null,
    "id": null
}

Decode with decoderawtransaction:

curl --user yourAuth  --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "decoderawtransaction", "params": ["0100000000010115a16270d3ee7ccc58a0757c1d8e1763790f223d4e4c3823948fb3dfdf9865180100000000ffffffff023f3256000000000017a9142915a7db6c6df171fd0436c7cec0042195dad01c8738ee4647000000001600140aad95e932ba045c2daf31a04c36683d39efe91002473044022002537539ac9586fdd8b5947fa0a47dc002ebe57502608433e103efe2740f93d4022023b1ade7bdf0f002a8fdc4ec6d534588d2132ab88850ac426ea413b4adb465260121031ef964af6923a2111e4916afcc87c73a8980322cc761dd3648714dfda99e72c400000000"] }' -H 'content-type: text/plain;' http://yourEndPoint

Returns:

{
    "result": {
        "txid": "0b637b18840d8fc978a657a3422df3c246c86e4c4046d90e63bf0f86b179b403",
        "hash": "0b637b18840d8fc978a657a3422df3c246c86e4c4046d90e63bf0f86b179b403",
        "version": 1,
        "size": 223,
        "vsize": 223,
        "locktime": 0,
        "vin": [

        ],
        "vout": [
            {
                "value": 90023651848.04721921,
                "n": 0,
                "scriptPubKey": {
                    "asm": "8 OP_GREATERTHAN OP_DROP OP_SWAP 8e1763790f223d4e4c3823948fb3dfdf9865180100000000ffffffff02 3256000000000017a9142915a7db6c6df171fd0436c7cec0042195dad01c8738ee4647000000001600140aad95e932ba045c2daf31a04c36683d39efe91002 3044022002537539ac9586fdd8b5947fa0a47dc002ebe57502608433e103efe2740f93d4022023b1ade7bdf0f002a8fdc4ec6d534588d2132ab88850ac426ea413b4adb4652601 031ef964af6923a2111e4916afcc87c73a8980322cc761dd3648714dfda99e72c4",
                    "hex": "58a0757c1d8e1763790f223d4e4c3823948fb3dfdf9865180100000000ffffffff023f3256000000000017a9142915a7db6c6df171fd0436c7cec0042195dad01c8738ee4647000000001600140aad95e932ba045c2daf31a04c36683d39efe91002473044022002537539ac9586fdd8b5947fa0a47dc002ebe57502608433e103efe2740f93d4022023b1ade7bdf0f002a8fdc4ec6d534588d2132ab88850ac426ea413b4adb465260121031ef964af6923a2111e4916afcc87c73a8980322cc761dd3648714dfda99e72c4",
                    "type": "nonstandard"
                }
            }
        ]
    },
    "error": null,
    "id": null
}

None of the "txid" or "hash" equals the hash I gave it at first(f4dedd64c9841d53bbda8beeda52235ec986f1400606812d9c033ac34105532c) .

  • Use getrawtransaction(verbose):
curl --user yourAuth --data-binary '{"jsonrpc": "1.0","id":"curltest","method":"getrawtransaction", "params": ["f4dedd64c9841d53bbda8beeda52235ec986f1400606812d9c033ac34105532c",true] }' -H 'content-type: text/plain;' http://yourEndPoint

This returns :

{
    "result": {
        "txid": "f4dedd64c9841d53bbda8beeda52235ec986f1400606812d9c033ac34105532c",
        "hash": "0b637b18840d8fc978a657a3422df3c246c86e4c4046d90e63bf0f86b179b403",
        "version": 1,
        "size": 223,
        "vsize": 142,
        "locktime": 0,
        "vin": [
            {
                "txid": "186598dfdfb38f9423384c4e3d220f7963178e1d7c75a058cc7ceed37062a115",
                "vout": 1,
                "scriptSig": {
                    "asm": "",
                    "hex": ""
                },
                "txinwitness": [
                    "3044022002537539ac9586fdd8b5947fa0a47dc002ebe57502608433e103efe2740f93d4022023b1ade7bdf0f002a8fdc4ec6d534588d2132ab88850ac426ea413b4adb4652601",
                    "031ef964af6923a2111e4916afcc87c73a8980322cc761dd3648714dfda99e72c4"
                ],
                "sequence": 4294967295
            }
        ],
        "vout": [
            {
                "value": 0.05648959,
                "n": 0,
                "scriptPubKey": {
                    "asm": "OP_HASH160 2915a7db6c6df171fd0436c7cec0042195dad01c OP_EQUAL",
                    "hex": "a9142915a7db6c6df171fd0436c7cec0042195dad01c87",
                    "reqSigs": 1,
                    "type": "scripthash",
                    "addresses": [
                        "35SFa5Aev3bjP7gfvfY959GSdWUrSdzoJn"
                    ]
                }
            },
            {
                "value": 11.95830840,
                "n": 1,
                "scriptPubKey": {
                    "asm": "0 0aad95e932ba045c2daf31a04c36683d39efe910",
                    "hex": "00140aad95e932ba045c2daf31a04c36683d39efe910",
                    "reqSigs": 1,
                    "type": "witness_v0_keyhash",
                    "addresses": [
                        "bc1qp2ket6fjhgz9ctd0xxsycdng85u7l6gs2x4dgh"
                    ]
                }
            }
        ],
        "hex": "0100000000010115a16270d3ee7ccc58a0757c1d8e1763790f223d4e4c3823948fb3dfdf9865180100000000ffffffff023f3256000000000017a9142915a7db6c6df171fd0436c7cec0042195dad01c8738ee4647000000001600140aad95e932ba045c2daf31a04c36683d39efe91002473044022002537539ac9586fdd8b5947fa0a47dc002ebe57502608433e103efe2740f93d4022023b1ade7bdf0f002a8fdc4ec6d534588d2132ab88850ac426ea413b4adb465260121031ef964af6923a2111e4916afcc87c73a8980322cc761dd3648714dfda99e72c400000000",
        "blockhash": "00000000000000000011ca3164ee629216de2e5dae09ffb099815319f6e35a71",
        "confirmations": 1459,
        "time": 1555100160,
        "blocktime": 1555100160
    },
    "error": null,
    "id": null
}

which has the right transaction Id(txid).

They were supposed to return the same transaction,at least returns the same txid. Which result is more correct?

My node info:

{
  "result": {
    "version": 170100,
    "subversion": "/Satoshi:0.17.1/",
    "protocolversion": 70015,
    "localservices": "000000000000040d",
    "localrelay": true,
    "timeoffset": 10,
    "networkactive": true,
    "connections": 8,
    "networks": [
      {
        "name": "ipv4",
        "limited": false,
        "reachable": true,
        "proxy": "",
        "proxy_randomize_credentials": false
      },
      {
        "name": "ipv6",
        "limited": false,
        "reachable": true,
        "proxy": "",
        "proxy_randomize_credentials": false
      },
      {
        "name": "onion",
        "limited": true,
        "reachable": false,
        "proxy": "",
        "proxy_randomize_credentials": false
      }
    ],
    "relayfee": 0.00001000,
    "incrementalfee": 0.00001000,
    "localaddresses": [

    ],
    "warnings": ""
  },
  "error": null,
  "id": "curltest"
}

Most helpful comment

This is (unfortunately) expected behavior. getrawtransaction is correct, decoderawtransaction is incorrect.

This issue occurs because the transaction is a segwit transaction which can be mistaken for a 0 input transaction by decoderawtransaction which needs to decode 0 input transactions. The heuristic used to distinguish between 0 input and segwit transactions that decoderawtransaction uses is not foolproof and there are still some false positives, such as your transaction. getrawtransaction is not confused because it is fetching the details of a transaction that exists on the network and thus cannot be a 0 input transaction. decoderawtransaction gives the wrong txid because it is including the segwit data in the txid when it shouldn't.

decoderawtransaction has an optional parameter iswitness which is used to indicate whether it should consider the transaction to be a segwit transaction and decode it as such. You should get the correct result (the same as getrawtransaction) if you set that to true (i.e. bitcoin-cli decoderawtransaction <raw tx> true).

All 3 comments

This is (unfortunately) expected behavior. getrawtransaction is correct, decoderawtransaction is incorrect.

This issue occurs because the transaction is a segwit transaction which can be mistaken for a 0 input transaction by decoderawtransaction which needs to decode 0 input transactions. The heuristic used to distinguish between 0 input and segwit transactions that decoderawtransaction uses is not foolproof and there are still some false positives, such as your transaction. getrawtransaction is not confused because it is fetching the details of a transaction that exists on the network and thus cannot be a 0 input transaction. decoderawtransaction gives the wrong txid because it is including the segwit data in the txid when it shouldn't.

decoderawtransaction has an optional parameter iswitness which is used to indicate whether it should consider the transaction to be a segwit transaction and decode it as such. You should get the correct result (the same as getrawtransaction) if you set that to true (i.e. bitcoin-cli decoderawtransaction <raw tx> true).

@achow101 Thanks for your explanation,my problem's solved.

This would make a useful stack exchange Question/Answer!

Was this page helpful?
0 / 5 - 0 ratings