BITCOIN
IN CODICE
GiancarloValente
@gncvalente
@gncvalente - www.giancarlovalente.it
@gncvalente - www.giancarlovalente.it
WARNING CODE !!!
il codice e’ qui:
https://github.com/gncvalente/bitcoin_playground
DECENTRALIZZATA
• no single point of failure
• trasparenza
• verificabile
• non necessita di fiducia
• globale
PEERTO PEERTECHNOLOGY
reti decentralizzate paritetiche
VALORE
• limitato
• veloce
• sicuro
21 Milioni
quanti ne
restano ?
CRYPTOCURRENCY
crittografia
PRIVATE KEY E
BITCOIN ADDRESS
• il lucchetto e’ la public key
• la chiave e’ la private key
• www.bitcoinaddress.org
• bitcoinpaperwallet.com
INDIRIZZO BITCOIN
private key public key
non e’ possibile da un’indirizzo bitcoin ritrovare la private key
meglio: e’ altamente improbabile
bitcoin address
In bitcoin la chiave pubblica e’ usata per ricevere
la chiave privata per firmare le transazioni e spendere
non deterministic bitcoin address
00_newaddress.js
BITCOIN ADDRESS
E’ GENERATO DA
UNA PUBLIC KEY
random 256 bit number -> private key (HEX format)
WIF (Wallet import format) private key (base 58 check encode)
512 bit public key with a prefix (Elliptic Curve DSA)
160bit public key hash (SHA-256 | RIPEM 160)
base 58 check encode (BITCOIN ADDRESS)
https://asecuritysite.com/encryption/Bitcoin
CRITTOGRAFIA ASIMMETRICA
messaggio:
il tesoro si trova
nel punto x
chiave pubblica
messaggio cifrato:
svxhsvhgxvhgjvdjg
vsdcvgsjhcvhjdsv
chiave privata
messaggio:
il tesoro si trova
nel punto x
messaggio cifrato:
svxhsvhgxvhgjvdjg
vsdcvgsjhcvhjdsv
https://en.wikipedia.org/wiki/Electronic_signature
Bitcoin utilizza la Digital Signature
COSA MI IMPEDISCE DITROVARE LA
CHIAVE PRIVATA DI UN’ALTRO UTENTE
O DI GENERARE UNA CHIAVE ESISTENTE?
10^24 atomi
addresses
10^48 10^50 atomi
fermi lab
PRIVATE KEY
• random number between 0 and 2^256
• or between 0 and 10^77
• visibile universe contains 10^80 atoms
https://www.youtube.com/watch?v=S9JGmA5_unY
https://www.youtube.com/watch?v=S9JGmA5_unY
BRAIN WALLET
Deterministic Bitcoin address
01_newaddress.js
sorgente qui
Regaliamoci un po’ di BTC
Testnet faucets
Bitcoin faucet
02_open_testnet_faucet.sh
LIBRO MASTRO
• contiene i movimenti di
frazioni di bitcoin (satoshi)
da wallet a wallet
• bitcoin unspent outputs
• il reward del mining e’
l’unica transazione che
parte dal nulla
https://freedomnode.com/guides/17/how-bitcoin-works
i bitcoin consistono in voci in un database distribuito
che tiene traccia della proprietà dei bitcoin. A
differenza di una banca, i bitcoin non sono legati a
utenti o account. Invece i bitcoin sono di proprietà di
un indirizzo Bitcoin,
Unspent Outputs (UTXO)
04_transaction.js
ORA SIAMO PRONTI PER FARE
UNA NOSTRATRANSAZIONE
“nota bene …
… non abbiamo chiesto il permesso a nessuno …
… e’ un software ! :) “
Bitcoin transaction
05_transaction.js
COORDINAMENTO
come faccio a coordinare tutti i nodi
come faccio ad avere fiducia nel network
BLOCK CHAIN
un database mondiale … immutabile !!!!
wikipedia qui
LATRANSAZIONE NON
CONTIENE
UNA SEMPLICE NOTA
DITRASFERIMENTO DI
VALORE,
MA CONTIENE DEL CODICE !!!
Bitcoin script
06_transaction.js
Pay-to-Public-Key-Hash (P2PKH) script
https://bitcore.io/api/lib/script
MONETA PROGRAMMABILE
• alla transazione e’ associato
un linguaggio di
programmazione (non
touting complete)
• decision based spending
(link)
• esempio crowdfounding
IN
Transaction
OUT
OUT locking script
(scriptPubKey)
unlocking script
(scriptSig)
locking script
(scriptPubKey)
IN
Transacti
OUT
OUT locking
unlock locking
72 bytes <signature>
33 bytes <public key>
OP_DUP
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
IN
Transacti
OUT
OUT locking
unlock locking
72
0x3045022100ed2b9bfa58dcc57e9e2248de9d868dba01abd0535f6080416835bd
2996fd7e6e022004ce8927f9ca94fce2ab4b1216e9e98b13560ea7b46709b52a7e
70ae047713f801
33
0x02ae5929a65e8173c3af2f5bb52f33a2822de3c0f85ce78c5e848adb7076399e
79
OP_DUP
OP_HASH160
20 0x8653d84ce54d693fafbd860251bd475f904e4c80
OP_EQUALVERIFY
OP_CHECKSIG
72 bytes <private key>
0x3045022100ed2b9bfa58dcc57e9e2248de9d868dba01abd0535f6080416835bd
2996fd7e6e022004ce8927f9ca94fce2ab4b1216e9e98b13560ea7b46709b52a7e
70ae047713f801
33 bytes <public key>
0x02ae5929a65e8173c3af2f5bb52f33a2822de3c0f85ce78c5e848adb7076399e
79
OP_DUP
OP_HASH160
20 bytes <pubKey hash (bitcoin address dest address)>
0x8653d84ce54d693fafbd860251bd475f904e4c80
OP_EQUALVERIFY
OP_CHECKSIG
72 bytes <signature>
33 bytes <public key>
OP_DUP
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
72 bytes <signature>
33 bytes <public key>
OP_DUP
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
EXECUTE !
STACK
72 bytes <signature>
33 bytes <public key>
OP_DUP
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
72 bytes <signature>
33 bytes <public key>
OP_DUP
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
72 bytes <signature>
33 bytes <public key>
OP_DUP
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
72 bytes <signature>
33 bytes <public key>
OP_DUP
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
72 bytes <signature>
33 bytes <public key>
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
33 bytes <public key>
72 bytes <signature>
33 bytes <public key>
OP_HASH160
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
33 bytes <public key>
72 bytes <signature>
33 bytes <public key>
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
<public key hash>
72 bytes <signature>
33 bytes <public key>
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
<public key hash>
72 bytes <signature>
33 bytes <public key>
20 bytes <pubKey hash>
OP_EQUALVERIFY
OP_CHECKSIG
STACK
<public key hash>
72 bytes <signature>
33 bytes <public key>
20 bytes <pubKey hash>
OP_EQUAL
OP_CHECKSIG
STACK
<public key hash>
OP_VERIFY
72 bytes <signature>
33 bytes <public key>
OP_CHECKSIG
STACK
1
OP_VERIFY
72 bytes <signature>
33 bytes <public key>
OP_CHECKSIG
STACK
https://en.wikipedia.org/wiki/Electronic_signature
1
STACK
PROOF OF BURN
La tua firma sulla Blockchain
07_transaction_data.js
La tua firma sulla blockchain
(proof-of-burn)
Inviamo la firma sulla Blockchain
08_transaction_data.js
ERRORI DI CODING COSTOSI
OP_IFDUP
OP_IF
OP_2SWAP
OP_VERIFY
OP_2OVER
OP_DEPTH
That script turns out to be the ASCII text: script
http://www.righto.com/2014/03/the-programming-error-that-cost-mt-gox.html
COSA SUCCEDE QUANDO
INVIAMO UNATRANSAZIONE
AL NETWORK?
COORDINAMENTO
come faccio a coordinare tutti i nodi
come faccio ad avere fiducia nel network
peer
2
peer
1
DOUBLE SPENDING
come posso evitare il problema del riutilizzo di una stessa
“moneta” in un sistema distribuito ?
COORDINAMENTO• book keepers (peers)
• block-chain
• ogni 10 minuti n transazioni
entrano in un blocco
• transaction order
• consenso - siamo tutti
d’accordo?
B B B
parte competizione per risolvere il blocco nei prossimi 10 minuti
e’ una competizione basata sulla risoluzione di un problema
crittografico
yes !!! va bene bravo … :( va bene bravo … :(
transazione
transazione
transazione
transazione
Blocco #234
IL BOOKKEEPER CHE HA RISOLTO PER PRIMO
IL PROBLEMAVINCE DUE PREMI
le commissioni associate alle transazioni nel blocco
e dei nuovi bitcoin generati dal nulla (mining)
MINATORI
• mining difficulty
• bitcoin consenso (1 voto per 1 CPU)
• generazione controllata di nuova moneta
• transaction order
• commissioni piu’ alte consentono transazioni piu’ veloci
–Ciccio Cappuccio
“non ho capito … come funziona questa
block chain ! problema crittografico ?!
:(”
clicca qui …
SEMPLICE FUNZIONE DI HASH
• somma le lettere, dividi per 5 ritorna il resto
• casa => 3 + 1 + 19 + 1 = 24 mod 5 => 4
• case => 3 + 1 + 19 + 5 = 28 mod 5 => 3
in modo consistente ad input ottengo sempre lo stesso output
dall’output non posso ricostruire l’input
obiettivo di una funzione di hash e’ non essere reversibile!
–Mario Rossi
“non ho capito … come funziona questa
block chain ! problema crittografico ?!
:(”
clicca qui …
BITCOIN CRYPTOGRAPHIC HASH
SHA256 (Secure Hash Algorithm)
come funziona ? clicca qui …
–Johnny Appleseed
“non ho capito … come funziona questa
block chain ! problema crittografico ?!
:(”
clicca qui …
REFERENCES
• http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html
• https://www.amazon.it/Mastering-Bitcoin-Programming-Open-Blockchain/dp/
1491954388
• https://www.coursera.org/learn/cryptocurrency
• https://blockgeeks.com/guides/best-bitcoin-script-guide/
• https://en.bitcoin.it/wiki/Script
• https://bitcore.io/
• https://github.com/bitpay/bitcore-lib/blob/master/docs/examples.md
• http://lenschulwitz.com/base58
Blockchain e dintorni :D … Meetup Bari
Blockchain e dintorni :D … Meetup Bari
Giovedi’ 7 Giugno ore 18:00 primo meetup
presso auLAB - Hack-space X
GRAZIE
Agile Coach,
Giancarlo Valente
twitter: @gncvalente
www.giancarlovalente.it

Bitcoin in codice