How does createrawtransaction get the pubkey hash from the provided address? 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] -&gt; Add network bytes -&gt; SHA-256 -&gt; SHA-256 -&gt; checksum -&gt; Base58Check -&gt; [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:

http://chainquery.com/bitcoin-api/createrawtransaction 

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

f0f5ad66b8c09a8b5ec5a379439281a32fc446e0185c3b1b854880d3dc49d065


and output index 3

Now, for the Outputs, use this address

183XLwHyKJGCD9Dj9Pafv2zoqfiXWd5WMZ


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

http://chainquery.com/bitcoin-api/decoderawtransaction

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": [
                    "183XLwHyKJGCD9Dj9Pafv2zoqfiXWd5WMZ"
                ]
            }
        }
    ]
},
"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

4d430ac5863757f5dc45f475d7cd2ccf43cf7845


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:

http://gobittest.appspot.com/Address

and clicking Send. You should get this address

183XLwHyKJGCD9Dj9Pafv2zoqfiXWd5WMZ


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.