Bitcoin
A payment protocol
blockchain
Distributed Timestamp Server
Not a payment protocol
define: payment protocol
How money is
transactions
Transactions

What information do we need:
Public key of recipient (address)
Reference to the previous transaction
Signature of owner
Real Transactions
Transaction:01000000016DBDDB085B1D8AF75184F0BC01FAD58D1266E9B63B50881990E4B40D6AEE3629000000008B483045022100F3581E1972AE8AC7C7367A7A253BC1135223ADB9A468BB3A59233F45BC578380022059AF01CA17D00E41837A1D58E97AA31BAE584EDEC28D35BD96923690913BAE9A0141049C02BFC97EF236CE6D8FE5D94013C721E915982ACD2B12B65D9B7D59E20A842005F8FC4E02532E873D37B96F09D6D4511ADA8F14042F46614A4C70C0F14BEFF5FFFFFFFF02404B4C00000000001976A9141AA0CD1CBEA6E7458A7ABAD512A9D9EA1AFB225E88AC80FAE9C7000000001976A9140EAB5BEA436A0484CFAB12485EFDA0B78B4ECC5288AC00000000
scriptsig
483045022100F3581E1972AE8AC7C7367A7A253BC1135223ADB9A468BB3A59233F45BC578380022059AF01CA17D00E41837A1D58E97AA31BAE584EDEC28D35BD96923690913BAE9A0141049C02BFC97EF236CE6D8FE5D94013C721E915982ACD2B12B65D9B7D59E20A842005F8FC4E02532E873D37B96F09D6D4511ADA8F14042F46614A4C70C0F14BEFF5
Of the form
<signature><public-key>
Scriptpubkey
Hex:
76 A9
14 1AA0CD1CBEA6E7458A7ABAD512A9D9EA1AFB225E88 AC
OP_DUP OP_HASH160
<ADDRESS>OP_EQUALVERIFY OP_CHECKSIG
These are the instructions for how to spend the transaction!
EXECUTION
<
signature> <pubkey>
OP_DUP
OP_HASH160
<address>
OP_EQUALVERIFY
OP_CHECKSIG
english
Give me a signature and public key
I'm going to duplicate the public key
and use one to make an address
I'm going to check this address against the one provided
If they're identical, I'm going to verify the signature
If that verifies, you can spend the money
The stack
Empty
<signature>
<signature> <pubkey>
OP_DUP
<signature> <pubkey>
Input: Anything
Output: Input repeated
<signature> <pubkey> <pubkey>
OP_HASH160
<signature> <pubkey> <pubkey>
Input: Public Key
Output: Address
<signature> <pubkey> <address>
<signature> <pubkey> <address> <address>
OP_EQUALVERIFY
<signature> <pubkey> <address> <address>
Input: 2 strings
Output: nothing or mark-invalid
<signature> <pubkey>
OP_CHECKSIG
<signature> <pubkey>
Input: Signature and Public Key
Output: 1 or 0
1
OVerview
Input: <
signature> <pubkey>
Script:
OP_DUP OP_HASH160
<address>
OP_EQUALVERIFY
OP_CHECKSIG
Standard Transactions
This is an example of a standard transaction
They are able to be 'read' or 'understood' by your Bitcoin Client
Conforms to a known template
multisig txs (BIP 0011)
ScriptPubKey:
m {pubkey} ... {pubkey} n OP_CHECKMULTISIG
ScriptSig:
OP_0 {signature} ... {signature}
OP_CHECKMULTISIG Input:
OP_0 followed by m signatures
Output:
1 or 0
Pay-to-pubkey
ScriptPubKey:
ScriptSig:
OP_CHECKSIG Input:
<signature> and <pubkey>
Output:
1 or 0
pay-to-password
ScriptPubKey:
OP_SHA256 {hash} OP_EQUALVERIFY
ScriptSig:
OP_SHA256 Input:
<data>
Output:
<hashed data>
CRAzy stuff
Chain Trade:
IF 2 {key A} {key B} 2 CHECKMULTISIGVERIFY ELSE {key B} CHECKSIGVERIFY SHA256 {hash A} EQUALVERIFY SHA256 {hash B} EQUALVERIFY ENDIF
Two options for evaluation:
- 2 of 2 multisig transaction
- 1 signature and 2 passwords
What I didn't cover
Lock time:
Keeps a tx non-final until a specified time
(cannot be included in a block)
Sequence Number:
Allows for tx replacement
BONUS: PAY-TO-SCRIPT-HASH
Your address IS the ScriptPubKey
Example:
ScriptPubKey: (2 of 3 multisig)
52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae
OP_2 {pubkey}x3 OP_3 CHECKMULTISIG
Resulting Address:
3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC