mirror of
https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line.git
synced 2025-06-08 16:36:32 +00:00
Create 7_1_Understanding_the_Foundation_of_Transactions.md
This commit is contained in:
parent
09f5e47f40
commit
57cc883403
106
7_1_Understanding_the_Foundation_of_Transactions.md
Normal file
106
7_1_Understanding_the_Foundation_of_Transactions.md
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
# 7.1: Understanding the Foundation of Transactions
|
||||||
|
|
||||||
|
> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning.
|
||||||
|
|
||||||
|
## Know the Parts of the Cryptographic Puzzle
|
||||||
|
|
||||||
|
As described in [Chapter 1](1_0_Introducing_Bitcoin.md), the funds in each Bitcoin transaction are locked with a cryptographic puzzle. To be precise, we said that Bitcoin is made up of "a sequence of atomic transactions: each of which is enabled by the sender with the solution to a cryptographic puzzle that is stored as a script; each of which is locked for the recipient with a new cryptographic puzzle that is stored as a script". Those scripts, that lock transactions and that unlock transactions, are written in Bitcoin Script.
|
||||||
|
|
||||||
|
_What is Bitcoin Script?_ Bitcoin Script is a stack-based Forth-like language that is purposefully avoids loops and is not Turing-complete. It's made up of individual opcodes. Every single transaction in Bitcoin is locked with a Bitcoin Script; when the locking transaction is run with the correct inputs, it will allow a UTXO to be respent.
|
||||||
|
|
||||||
|
The fact that transactions are locked with scripts means that they can be unlocked in a variety of different ways. In fact, we've met a number of different unlocking mechanisms to date, each of which incorporates different opcodes:
|
||||||
|
|
||||||
|
* OP_CHECKSIG, which checks a public key against a signature is the basis of a P2PKH address, as will be fully detailed in [7.3: Scripting a Pay to Public Key Hash](7_3_Scripting_a_Pay_to_Public_Key_Hash.md).
|
||||||
|
* OP_CHECKMULTISIG similarly checks multisigs, as will be fully detailed in Chapter 8.
|
||||||
|
* OP_CHECKLOCKTIMEVERIFY and OP_SEQUENCEVERIFY form the basis of more complex Timelocks, as will be fully detailed in Chapter 9.
|
||||||
|
* OP_RETURN is the mark of an unspendable transaction, which is why it's used to carry data.
|
||||||
|
|
||||||
|
## Access Scripts In Your Transactions
|
||||||
|
|
||||||
|
You may not realize it, but you've already seen these locking and unlocking scripts, all as part of the raw transactins you've been working with.
|
||||||
|
|
||||||
|
The best way to look into them with more depth is thus to create a raw transaction, then examine it.
|
||||||
|
|
||||||
|
### Create a Test Transaction
|
||||||
|
|
||||||
|
This quick raw transaction grabs the first unspent transaction sitting around, and resends it to a change address, minus a transaction fee:
|
||||||
|
```
|
||||||
|
$ utxo_txid=$(bitcoin-cli listunspent | jq -r '.[0] | .txid')
|
||||||
|
$ utxo_vout=$(bitcoin-cli listunspent | jq -r '.[0] | .vout')
|
||||||
|
$ recipient=$(bitcoin-cli getrawchangeaddress)
|
||||||
|
$ rawtxhex=$(bitcoin-cli -named createrawtransaction inputs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout' } ]''' outputs='''{ "'$recipient'": 1.2985 }''')
|
||||||
|
$ signedtx=$(bitcoin-cli -named signrawtransaction hexstring=$rawtxhex | jq -r '.hex')
|
||||||
|
```
|
||||||
|
We're creating it and signing it but not sending it: the goal is simply produce a complete transaction that we can examine.
|
||||||
|
|
||||||
|
### Examing Your Test Transaction
|
||||||
|
|
||||||
|
You can now examine your transaction in depth by examining the `$signedtx`:
|
||||||
|
```
|
||||||
|
$ bitcoin-cli -named decoderawtransaction hexstring=$signedtx
|
||||||
|
{
|
||||||
|
"txid": "7b5f161ff9f9275c94dca38348c91056fe6829a2b768ed82ede4bcf7c7384a68",
|
||||||
|
"hash": "7b5f161ff9f9275c94dca38348c91056fe6829a2b768ed82ede4bcf7c7384a68",
|
||||||
|
"size": 192,
|
||||||
|
"vsize": 192,
|
||||||
|
"version": 2,
|
||||||
|
"locktime": 0,
|
||||||
|
"vin": [
|
||||||
|
{
|
||||||
|
"txid": "99d2b5717fed8875a1ed3b2827dd60ae3089f9caa7c7c23d47635f6f5b397c04",
|
||||||
|
"vout": 0,
|
||||||
|
"scriptSig": {
|
||||||
|
"asm": "3045022100c4ef5b531061a184404e84ab46beee94e51e8ae15ce98d2f3e10ae7774772ffd02203c546c399c4dc1d6eea692f73bb3fff490ea2e98fe300ac6a11840c7d52b6166[ALL] 0319cd3f2485e3d47552617b03c693b7f92916ac374644e22b07420c8812501cfb",
|
||||||
|
"hex": "483045022100c4ef5b531061a184404e84ab46beee94e51e8ae15ce98d2f3e10ae7774772ffd02203c546c399c4dc1d6eea692f73bb3fff490ea2e98fe300ac6a11840c7d52b616601210319cd3f2485e3d47552617b03c693b7f92916ac374644e22b07420c8812501cfb"
|
||||||
|
},
|
||||||
|
"sequence": 4294967295
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vout": [
|
||||||
|
{
|
||||||
|
"value": 1.29850000,
|
||||||
|
"n": 0,
|
||||||
|
"scriptPubKey": {
|
||||||
|
"asm": "OP_DUP OP_HASH160 371c20fb2e9899338ce5e99908e64fd30b789313 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
|
"hex": "76a914371c20fb2e9899338ce5e99908e64fd30b78931388ac",
|
||||||
|
"reqSigs": 1,
|
||||||
|
"type": "pubkeyhash",
|
||||||
|
"addresses": [
|
||||||
|
"mkYMA2i2vzEXjoDn4GfvPoFr3MJ62uUtMx"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
The two scripts are found in the two different parts of the transaction.
|
||||||
|
|
||||||
|
The `scriptSig` is found in the `vin`. This is the _unlocking_ script. It's what's run to unlock the associated UTXO. There will be one `scriptSig` per UTXO in a transaction.
|
||||||
|
|
||||||
|
The `scriptPubKey` is found in the `vout`. This is the _locking_ script. It's what locks the new output from the transaction. There will be one output in a transaction.
|
||||||
|
|
||||||
|
To be precise: the `scriptSig` of this transaction will unlock the previous UTXO; this new transaction's outputs will be locked with the `scriptPubKey`, which will be unlocked by the `scriptSig` of the transaction that reuses this UTXO.
|
||||||
|
|
||||||
|
### Read The Scripts in Your Transaction
|
||||||
|
|
||||||
|
Note that each of these scripts includes two different representations: the `hex` is what actually gets stored, but the more readable assembly language (`asm`) can sort of show you what's going on.
|
||||||
|
|
||||||
|
So, here's your first look at what Bitcoin Scripting looks like.
|
||||||
|
|
||||||
|
The unlocking script is:
|
||||||
|
```
|
||||||
|
"3045022100c4ef5b531061a184404e84ab46beee94e51e8ae15ce98d2f3e10ae7774772ffd02203c546c399c4dc1d6eea692f73bb3fff490ea2e98fe300ac6a11840c7d52b6166[ALL] 0319cd3f2485e3d47552617b03c693b7f92916ac374644e22b07420c8812501cfb"
|
||||||
|
```
|
||||||
|
As it happens, that mess of numbers is a private-key signature followed by the associated public key. Or at least hopefully that's what it is, because that's what's required to unlock the P2PKH UTXO that this transaction is using.
|
||||||
|
|
||||||
|
The locking script is:
|
||||||
|
```
|
||||||
|
OP_DUP OP_HASH160 371c20fb2e9899338ce5e99908e64fd30b789313 OP_EQUALVERIFY OP_CHECKSIG
|
||||||
|
```
|
||||||
|
That in turn is the standard method in Bitcoin Script for locking a P2PKH transaction.
|
||||||
|
|
||||||
|
[7.3: Scripting a Pay to Public Key Hash](7_3_Scripting_a_Pay_to_Public_Key_Hash.md) explains how these go together, but first you need to know how Bitcoin Scripts are evaluated.
|
||||||
|
|
||||||
|
## Summary: Understanding the Foundation of Transactions
|
||||||
|
|
||||||
|
Every Bitcoin transaction includes at least one unlocking script (`scriptPubKey`), which solves a previous cryptographic puzzle, and at least one locking script (`scriptPubKey`), which creates a new cryptographic puzzle. There's one per input and one per output. Each of these scripts is written in Bitcoin Script, a Forth-like language that further empowers Bitcoin.
|
Loading…
x
Reference in New Issue
Block a user