Into the weeds...
"Extraordinary claims require extraordinary evidence."
- Carl Sagan
The process by which new blocks are added to the chain
Computing a hash of all the data in the block with certain requirements (proof-of-work)
Proving to everyone else that Bitcoin has been moved
Block Proposed
Node works on Hash
Node Proposes Block
Other Nodes Confirm Block Hash
Block is Entered into the Ledger
"Good code is like a work of art; it makes you feel something. And if it makes you feel something, then it's doing its job. Sometimes it makes you want to drool. Sometimes it makes you want to punch the screen. But it always makes you feel something."
- Unknown.
1 2 OP_ADD 3 OP_EQUAL
2 | 3 | |||
1 | 1 | 3 | 3 | TRUE (1) |
The Stack
Opcode | Description |
---|---|
OP_IF, OP_ELSE, OP_ENDIF | Flow control. If-else statements |
OP_RETURN | End a script early - used to mark a UTXO as unspendable |
OP_DUP | Duplicates the top stack item. |
OP_DROP | Removes the top stack item. |
OP_AND, OP_OR, OP_XOR | Bitwise boolean operators |
OP_EQUAL | Puts True (1) on the stack if true, or False (0) otherwise |
OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD | Math operators |
OP_RIPEMD160, OP_SHA256 | Run hashing algorithms on inputs |
OP_CHECKSIG | The entire transaction's outputs, inputs, and script are hashed. Must be given a valid signature for this hash and public key. |
OP_CHECKMULTISIG | Compares each signature against each public key until it finds enough ECDSA matches or runs out. |
"I'm gonna make him an offer he can't refuse."
- The Godfather
Unspent Transaction Output (UTXO)
Inputs to the transaction
Outputs from the transaction
Different types of Transactions
Locking Scripts & Unlocking Scripts
Locking scripts provide the script that needs to be solved
Unlocking scripts provide the correct input to make the locking script work
// Locking Script
2 OP_ADD 3 OP_EQUAL
// Unlocking Script
1
{
"txid": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
"hash": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
"version": 1,
"size": 258,
"vsize": 258,
"weight": 1032,
"locktime": 0,
"vin": [
{
"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
"vout": 0,
"scriptSig": {
"asm": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
"hex": "483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.015,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG",
"desc": "addr(1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA)#ykrtxd0a",
"hex": "76a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788ac",
"address": "1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA",
"type": "pubkeyhash"
}
},
{
"value": 0.0845,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
"desc": "addr(1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK)#e6ft626y",
"hex": "76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
"address": "1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK",
"type": "pubkeyhash"
}
}
],
"hex": "0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd734d2804fe65fa35779000000008b483045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e381301410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab68025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef8000000000001976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac00000000",
"blockhash": "0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4",
"confirmations": 502454,
"time": 1388185914,
"blocktime": 1388185914
}
Payment directly to a public Key
// Locking Script
04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c OP_CHECKSIG
// Unlocking Script
30440220576497b7e6f9b553c0aba0d8929432550e092db9c130aae37b84b545e7f4a36c022066cb982ed80608372c139d7bb9af335423d5280350fe3e06bd510e695480914f01
// Locking Script
< public_key > OP_CHECKSIG
// Unlocking Script
< signature >
Payment to a public key hash (A legacy address!)
// Locking Script
OP_DUP OP_HASH160 12ab8dc588ca9d5787dde7eb29569da63c3a238c OP_EQUALVERIFY OP_CHECKSIG
// Unlocking Script
304502203f004eeed0cef2715643e2f25a27a28f3c578e94c7f0f6a4df104e7d163f7f8f022100b8b248c1cfd8f77a0365107a9511d759b7544d979dd152a955c867afac0ef78601 044d05240cfbd8a2786eda9dadd520c1609b8593ff8641018d57703d02ba687cf2f187f0cee2221c3afb1b5ff7888caced2423916b61444666ca1216f26181398c
// Locking Script
OP_DUP OP_HASH160 < public_key_hash > OP_EQUALVERIFY OP_CHECKSIG
// Unlocking Script
< signature > < public_key >
Payment to a multisig (rarely used)
// Locking Script
OP_1 04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af OP_2 OP_CHECKMULTISIG
// Unlocking Script
OP_0 304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01
// Locking Script
< M > < ...public_keys > < N > OP_CHECKMULTISIG
// Unlocking Script
OP_0 < ...signatures >
Payment to a script hash (Address starts with 3)
Allows someone to define a script for unlocking (like a multisig) and let people send money to it as an address instead of needing to use that script directly
// Locking Script
OP_HASH160 748284390f9e263a4b766a75d0633c50426eb875 OP_EQUAL
// Unlocking Script
OP_0 3046022100a07b2821f96658c938fa9c68950af0e69f3b2ce5f8258b3a6ad254d4bc73e11e022100e82fab8df3f7e7a28e91b3609f91e8ebf663af3a4dc2fd2abd954301a5da67e701 5121022afc20bf379bc96a2f4e9e63ffceb8652b2b6a097f63fbee6ecec2a49a48010e2103a767c7221e9f15f870f1ad9311f5ab937d79fcaeee15bb2c722bca515581b4c052ae
// Locking Script
OP_HASH160 < script_hash > OP_EQUAL
// Unlocking Script
OP_0 < signature > < redeem_script >
Unspendable outputs
Store data on the chain
Burn Bitcoin
// Locking Script
OP_RETURN 68656c6c6f20776f726c64
// Unlocking Script
... UNSPENDABLE ...
// Locking Script
OP_RETURN < data >
// Unlocking Script
... UNSPENDABLE ...
"I'm not one to gossip, but I heard something that might interest you..."
- Unknown.
Finds a node to connect to (known or using DNS Seeds)
Transmits `version
` message and receives `verack
` message
Sends `addr
` message
Asks for other `addr
` messages of more nodes (`getaddr
`) - for reliability
Full Nodes sync the full blockchain from other full nodes and verify each block
Transaction is formed and hashed - the locking/unlocking scripts are set
Transaction is broadcast between nodes to their neighbors, and the to other neighbors, and so on
Unconfirmed transactions live in the "mempool"
After transactions are confirmed, all* the UTXOs (outputs from the transaction) end up in the UTXO pool to be spent later
Bitcoin is pretty cool
bitcoinbook
`