The createrawtransaction RPC takes as parameters the source TX ID and the UTXO index (to create the new unsigned input) and the destination address and amount of bitcoins (to create the new output).

In the output created, the scriptPubKey is a standard P2PKH script containing the pubkey hash. What I don't understand is...if createrawtransaction only received the address, how did it get the pubkey hash from it?

I understand that going from the pubkey hash to the address is pretty easy:

[PubKey Hash] -> Add network bytes -> SHA-256 -> SHA-256 -> checksum -> Base58Check -> [BTC Address]

So how does createrawtransaction go the other way from BTC Address -> PubKey Hash?

To show this, you can follow my steps using this web based interface of Bitcoin API:


In that page, let's use this transaction for the Outpoints


and output index 3

Now, for the Outputs, use this address


and put 0.00159468 as the amount of BTC.

Click Execute Command and you should get this result

"result": "020000000165d049dcd38048851b3b5c18e046c42fa381924379a3c55e8b9ac0b866adf5f00300000000ffffffff01ec6e0200000000001976a9144d430ac5863757f5dc45f475d7cd2ccf43cf784588ac00000000",
"error": null,
"id": null


Now, let's decode this transaction with decoderawtransaction RPC


Just put there the "result" field value you got from the previous response. Click Execute Command and you'll get the raw transaction

"result": {
    "txid": "8d02780fbd265fdeaf08195b5488fc309270a8ff9d23043d0dfc9a0d8599a01c",
    "hash": "8d02780fbd265fdeaf08195b5488fc309270a8ff9d23043d0dfc9a0d8599a01c",
    "version": 2,
    "size": 85,
    "vsize": 85,
    "locktime": 0,
    "vin": [
            "txid": "f0f5ad66b8c09a8b5ec5a379439281a32fc446e0185c3b1b854880d3dc49d065",
            "vout": 3,
            "scriptSig": {
                "asm": "",
                "hex": ""
            "sequence": 4294967295
    "vout": [
            "value": 0.00159468,
            "n": 0,
            "scriptPubKey": {
                "asm": "OP_DUP OP_HASH160 4d430ac5863757f5dc45f475d7cd2ccf43cf7845 OP_EQUALVERIFY OP_CHECKSIG",
                "hex": "76a9144d430ac5863757f5dc45f475d7cd2ccf43cf784588ac",
                "reqSigs": 1,
                "type": "pubkeyhash",
                "addresses": [
"error": null,
"id": null


If you see the scriptPubKey script, i.e.

OP_DUP OP_HASH160 4d430ac5863757f5dc45f475d7cd2ccf43cf7845 OP_EQUALVERIFY OP_CHECKSIG

you can see the pubkey hash is there


and this pubkey hash matches the address given as parameter in the beginning. You can verify this by pasting the pubkey hash in step #3 in this page:


and clicking Send. You should get this address


in step #9.

So, my question once again...how did createrawtransaction go from the address to the pubkey hash if it didn't have the public key?


I think I can answer my own question...

I just saw the code of createrawtransaction and what it does is a Base58 decode, remove the checksum and network bytes and it gets the pubkey hash.


An address encodes the data necessary to produce the scriptPubKey for an output. In the case of 1... addresses, these encode the pubkey hash using Base58 Check encoding. Because an encoding is bidirectional, you can encode the pubkey hash with it, and then decode the Base58 string to get the pubkey hash as a binary string.

Furthermore, the encodings also include a version number which indicates additional information necessary to construct the entire scriptPubKey. For 1... addresses, the version number is 0 and is reflected in the address as the leading 1 character. The version number 0 indicates that the resulting scriptPubKey should be a Pay to Pubkey Hash type script so the wallet constructs a scriptPubKey using the P2PKH template and dropping in the provided pubkey hash into the correct place.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.