Simple Transaction (1 input, 1 output) - Legacy P2PKH
To follow along this tutorial
|
Let’s create a legacy P2PKH transaction with 1 input and 1 output.
Creating UTXO to spend
We first need to create a transaction in order to have a UTXO at our disposal that we can spend.
sendtoaddress n4SvybJicv79X1Uc4o3fYXWGwXadA53FSq 1
We now have an UTXO locked with alice_1 public key hash. In order to spend it, we will refer to it with the transaction id (txid) and the
output index (vout), also called outpoint. Fortunately, sendtoaddress
returns the id of the transaction.
gettransaction TX_ID
Find the output index (or vout) under |
Creating a simple transaction
Now let’s spend the UTXO with BitcoinJS.
const bitcoin = require('bitcoinjs-lib')
const { alice, bob } = require('./wallets.json')
const network = bitcoin.networks.regtest
const keyPairAlice1 = bitcoin.ECPair.fromWIF(alice[1].wif, network)
const psbt = new bitcoin.Psbt({network})
.addInput({
hash: 'TX_ID',
index: TX_OUT,
nonWitnessUtxo: Buffer.from('TX_HEX', 'hex')
}) (1)
.addOutput({
address: bob[1].p2pkh,
value: 999e5,
}) (2)
1 | Add the input by filling it with the outpoint (TxId and output index of the funding transaction) and, since it is a non segwit input,
we must also pass the full previous transaction buffer. We can get the transaction hexadecimal with the getrawtransaction command. |
2 | Add the output with the bob_1 P2PKH recipient address and the amount of 0.999 btc. |
The miner fee is calculated by subtracting the outputs from the inputs. |
The UTXO is locked with alice_1’s public key hash. If she wants to spend it, she needs to prove her ownership of the private key that is linked to the public key, which hash is written in the UTXO.
To do so, alice_1 will sign this transaction that we just built with her private key. BitcoinJS will automatically place the signature into the scriptSig
field of the input 0.
psbt.signInput(0, keyPairAlice1)
psbt.validateSignaturesOfInput(0)
psbt.finalizeAllInputs()
console.log('Transaction hexadecimal:')
console.log(psbt.extractTransaction().toHex())
decoderawtransaction TX_HEX
Broadcasting the transaction
sendrawtransaction TX_HEX
sendrawtransaction
returns the transaction ID, with which you can inspect your transaction again.
getrawtransaction TX_ID true
Don’t forget the second argument. If false, it returns the hex string, otherwise it returns a detailed json object. |