SlideShare a Scribd company logo
© 2022 • Aulab S.r.l.
Bitcoin in codice - Parte 2
Di Giancarlo Valente - CTO Aulab
Aprile 2022 - Coding Zone
© 2022 • Aulab S.r.l.
Aulab è la prima Coding Factory Italiana attiva dal 2014 nell’ ambito della formazione e dello
sviluppo software. Con i nostri corsi formiamo risorse nell’ambito IT da collocare in aziende
alla ricerca di personale. Siamo anche una software house, in cui molti studenti hanno
l’opportunità di mettere in pratica ciò che hanno imparato durante i nostri corsi.


L'Hackademy è un corso intensivo online di 400 ore già sperimentato con successo da oltre 800
studenti provenienti da tutta Italia  in 34 edizioni passate, che consente in  soli 3 mesi  di
acquisire le competenze necessarie per scrivere codice ed  avviare una nuova carriera
professionale come sviluppatore web.
photo pixabay.com
© 2022 • Aulab S.r.l.
Un’avventura in
tre puntate per
scoprire come
funziona bitcoin
© 2022 • Aulab S.r.l.
In questa seconda puntata
LA MAPPA DEL TESORO LA POLVERE D’ORO
LA MAGIA
CHE PROTEGGE IL TESORO
PRIVATE KEY
BITCOIN ADDRESS
CRYPTOGRAPHY
BITCOIN WALLETS
UTXO MODEL
BITCOIN TRANSACTION
BITCOIN SCRIPT
BITCOIN SCRIPT
BITCOIN NETWORK
BITCOIN MINING
© 2022 • Aulab S.r.l.
WARNING CODE !!!
© 2022 • Aulab S.r.l.
Tutorial passo passo qui
https://aulab.it/blog
© 2022 • Aulab S.r.l.
Codice a scopo didattico, da non utilizzare
in produzione. 
Obiettivo esplorare i meccanismi interni
che fanno funzionare Bitcoin.
Il tipo di transazione utilizzata è una
“Legacy P2PKH” oramai in disuso.
Ma è la più semplice per iniziare ad
approcciare il funzionamento del network
Bitcoin.
© 2022 • Aulab S.r.l.
Nella puntata precedente …
mhuTK7guQqQmvUyc2BQX8uUyZdkV32u73h
© 2022 • Aulab S.r.l.
Nella puntata precedente …
Private Key
256-bit
Bitcoin
Address
mhuTK7guQqQmvUyc2BQX8uUyZdkV32u73h
© 2022 • Aulab S.r.l.
Nella puntata precedente …
© 2022 • Aulab S.r.l.
Costruiamo una
transazione
© 2022 • Aulab S.r.l.
Jack
Willy
Jack
(il resto)
Maggio 2010
Gavin Andresen - First Faucet Website
Un sito web detto faucet che regalava 5 Bitcoin a ogni utente
photo pixabay.com
© 2022 • Aulab S.r.l.
Faucets
https://testnet-faucet.mempool.co/
https://testnet-faucet.com/btc-testnet/
© 2022 • Aulab S.r.l.
Faucets
https://testnet-faucet.mempool.co/
https://testnet-faucet.com/btc-testnet/
photo pixabay.com
© 2022 • Aulab S.r.l.
Cerchiamo il nostro forziere
mhuTK7guQqQmvUyc2BQX8uUyZdkV32u73h
© 2022 • Aulab S.r.l.
Blockchain explorer
https://live.blockcypher.com/btc-testnet/
© 2022 • Aulab S.r.l.
Blockchain explorer
https://live.blockcypher.com/btc-testnet/
© 2022 • Aulab S.r.l.
Blockchain explorer API
$> http GET https://api.blockcypher.com/v1/btc/test3/addrs/mwprx4B5aTLTD8eFDPBvyfBBrtMk68Cqk2/balance


https://httpie.io/
photo pixabay.com
// 10_transaction.js


var bitcore = require('bitcore-lib');


//bitcore.Networks.defaultNetwork = bitcore.Networks.livenet;


bitcore.Networks.defaultNetwork = bitcore.Networks.testnet;


function deterministicPrivateKey(mappa_del_tesoro) {


const value = Buffer.from(mappa_del_tesoro);


const hash = bitcore.crypto.Hash.sha256(value);


const bn = bitcore.crypto.BN.fromBuffer(hash);


return new bitcore.PrivateKey(bn);


}


const mappa_del_tesoro = `


Seconda stella a destra, questo è il cammino


E poi dritto fino al mattino


Poi la strada la trovi da te


Porta all'isola che non c'è


`;
const sorgente = deterministicPrivateKey(mappa_del_tesoro);


const destinazione = deterministicPrivateKey('apriti sesamo ciccio cappuccio');


const address_sorgente = sorgente.toAddress();


const address_destinazione = destinazione.toAddress();


var tx = bitcore.Transaction(); // Transazione di tipo: Legacy P2PKH


// devo trovare un output di transazione non speso


// http get https://api.bitcore.io/api/BTC/testnet/address/
mwprx4B5aTLTD8eFDPBvyfBBrtMk68Cqk2/?unspent=true


var utxo = {


"txId": "1b00aa5791cb6607e034b4b0a2d8dfdba83ad0c07d6cf3d260ce43a1f78cb64f",


"outputIndex": 0,


"address": "n3ct4eSiLQrJSpPGA8JmZHxKJ9WMFcXKvz",


"script": "76a914f271bb23c0fa55be23aacddfc8f95d7244fffcb988ac",


"satoshis": 100000


};


tx.from(utxo);
© 2022 • Aulab S.r.l.
Che cosa e’ un UTXO?
© 2022 • Aulab S.r.l.
Jack Willy Hook
© 2022 • Aulab S.r.l.
© 2022 • Aulab S.r.l.
© 2022 • Aulab S.r.l.
© 2022 • Aulab S.r.l.
© 2022 • Aulab S.r.l.
© 2022 • Aulab S.r.l.
UTXO
© 2022 • Aulab S.r.l.
Spent Output UTXO
photo pixabay.com
© 2022 • Aulab S.r.l.
Blockchain explorer API - UTXO
$> https://api.bitcore.io/api/BTC/testnet/address/mk3s3Fr7BCyVkMEFawQTa19a1T9uHgb2dM/?unspent=true
const sorgente = deterministicPrivateKey(mappa_del_tesoro);


const destinazione = deterministicPrivateKey('apriti sesamo ciccio cappuccio');


const address_sorgente = sorgente.toAddress();


const address_destinazione = destinazione.toAddress();


var tx = bitcore.Transaction(); // Transazione di tipo: Legacy P2PKH


// devo trovare un output di transazione non speso


// http get https://api.bitcore.io/api/BTC/testnet/address/
mwprx4B5aTLTD8eFDPBvyfBBrtMk68Cqk2/?unspent=true


var utxo = {


"txId": "1b00aa5791cb6607e034b4b0a2d8dfdba83ad0c07d6cf3d260ce43a1f78cb64f",


"outputIndex": 0,


"address": "n3ct4eSiLQrJSpPGA8JmZHxKJ9WMFcXKvz",


"script": "76a914f271bb23c0fa55be23aacddfc8f95d7244fffcb988ac",


"satoshis": 100000


};


tx.from(utxo);
"outputIndex": 0,


"address": "n3ct4eSiLQrJSpPGA8JmZHxKJ9WMFcXKvz",


"script": "76a914f271bb23c0fa55be23aacddfc8f95d7244fffcb988ac",


"satoshis": 100000


};


tx.from(utxo);


// 50000 satoshi di pagamento


tx.to(address_destinazione, 50000);


// 10000 satoshi al miner


tx.fee(10000);


// il resto mettilo sempre nel mio wallet sorgente :)


tx.change(address_sorgente);


// firmo questa transazione con la mia chiave privata


// solo io posso spostare i miei utxo


tx.sign(sorgente);
photo pixabay.com
© 2022 • Aulab S.r.l.
Digital Signature - Sign
Una
fi
rma digitale e’ un valore prodotto da una Chiave Privata e un Messaggio
Firma Digitale
Dato
Messaggio
Dato
Private Key
256 bit
f() ECDSA
digital signature
© 2022 • Aulab S.r.l.
Digital Signature - Verify
Chiunque può veri
fi
care, grazie alla chiave pubblica,
che chi ha prodotto la
fi
rma digitale era in possesso della relativa chiave privata
Dato
Public Key
512 bit
f()
CHECKSIG
Firma Digitale
tx.from(utxo);


// 30000 satoshi di pagamento


tx.to(address_destinazione, 50000);


// 20000 satoshi al miner


tx.fee(10000);


// il resto mettilo sempre nel mio wallet sorgente :)


tx.change(address_sorgente);


// firmo questa transazione con la mia chiave privata


// solo io posso spostare i miei utxo


tx.sign(sorgente);


// serializza la transazione sul protocollo a livello di Byte


tx.serialize();


const raw_transaction = tx.toString();


console.log('raw transaction: ', raw_transaction);
© 2022 • Aulab S.r.l.
Raw transaction
02000000016cace69330b25e479512f8a615c775d41e4f0556c20f8019eed48af4809f27140100
00006b48304502210091f0ae321cddd031a00660df57ce87433d2668d78556671b988d953a9d04
4e6602202e7286d9ae24d8fd5e73de88ff895390aeb6bb08108906eb7cb9aa8be6281729012102
d9af3459a1ddc32428c0af32bc36b0cc1aa6fda033d0d0e715af9cab2e9853acffffffff023075
0000000000001976a91450e22df3e9d42563b3482e81d8f66ab090beeb5e88ac50c30000000000
001976a914b2e509c9e7ce864c9fd6771e9709cac3eab3938b88ac00000000


In esadecimale (hex) ogni carattere e’ un nibble ossia 4 bit.


Due caratteri sono 1 byte.


Esempio: FF e’ 255


Che e’ il valore massimo rappresentabile con 1 byte
© 2022 • Aulab S.r.l.
Decode Raw transaction
https://live.blockcypher.com/btc/decodetx/
© 2022 • Aulab S.r.l.
Input
Output
Output
100.000 30.000
50.000
20.000
© 2022 • Aulab S.r.l.
Script
Script
Script
photo pixabay.com
© 2022 • Aulab S.r.l.
Unlocking SCRIPT
Locking SCRIPT Locking SCRIPT
TRANSAZIONE
© 2022 • Aulab S.r.l.
Input SCRIPT
UTXO Usato Output SCRIPT
TRANSAZIONE
© 2022 • Aulab S.r.l.
Lock
© 2022 • Aulab S.r.l.
Lock
Lock
Lock
Lock
Unlock
© 2022 • Aulab S.r.l.
Lock
Lock
Lock
Lock
Lock
Unlock
Unlock
© 2022 • Aulab S.r.l.
Lock
Lock
Lock
Lock
Lock
Lock
Unlock
Unlock
Unlock
© 2022 • Aulab S.r.l.
Lock
Lock
Lock
Lock
Lock
Lock
Lock
Unlock
Unlock
Unlock
Unlock
Unlock
// 12_scripts.js


var scriptIn = bitcore.Script(tx.toObject().inputs[0].script);


console.log('input scripting: ', scriptIn);


var scriptOut = bitcore.Script(tx.toObject().outputs[0].script);


console.log('noutput scripting 0 : ', scriptOut);


var scriptOut = bitcore.Script(tx.toObject().outputs[1].script);


console.log('output scripting 1 : ', scriptOut);
© 2022 • Aulab S.r.l.
P2PKH TRANSACTION - INPUT SCRIPT
© 2022 • Aulab S.r.l.
P2PKH TRANSACTION - INPUT SCRIPT
48304502210091f0ae321cddd031a00660df57ce87433d2668
d78556671b988d953a9d044e6602202e7286d9ae24d8fd5e73
de88ff895390aeb6bb08108906eb7cb9aa8be6281729012102
d9af3459a1ddc32428c0af32bc36b0cc1aa6fda033d0d0e715
af9cab2e9853ac
© 2022 • Aulab S.r.l.
P2PKH TRANSACTION - INPUT SCRIPT
Signature
Data
Public Key
Data
© 2022 • Aulab S.r.l.
P2PKH TRANSACTION - OUTPUT SCRIPT
© 2022 • Aulab S.r.l.
P2PKH TRANSACTION - OUTPUT SCRIPTs
76a91450e22df3e9d42563b3482e81d8f66ab090beeb5e88ac


76a914b2e509c9e7ce864c9fd6771e9709cac3eab3938b88ac
© 2022 • Aulab S.r.l.
P2PKH TRANSACTION - OUTPUT SCRIPT
HASH160
OP CODE
Public Key
Hash
Data
DUP
OP CODE
EQUALVERIFY
OP CODE
CHECKSIG
OP CODE
RIPEMD160(SHA256(Public Key))


Bitcoin address senza pre
fi
sso, carattere di checksum


E senza codi
fi
ca in base58
© 2022 • Aulab S.r.l.
P2PKH Transaction
Pay To Public Key
Hash
© 2022 • Aulab S.r.l.
EXECUTION!
HASH160
OP CODE
Public Key
Hash
Data
DUP
OP CODE
EQUALVERIFY
OP CODE
CHECKSIG
OP CODE
Signature
Data
Public Key
Data
© 2022 • Aulab S.r.l.
EXECUTION!
HASH160
Public Key
Hash
DUP EQUALVERIFY CHECKSIG
Signature Public Key
© 2022 • Aulab S.r.l.
Concatenative Language, Stack Oriented
HASH160
Public Key
Hash
DUP EQUALVERIFY CHECKSIG
Signature Public Key
https://en.wikipedia.org/wiki/Concatenative_programming_language
https://en.wikipedia.org/wiki/Forth_(programming_language)
https://en.wikipedia.org/wiki/Stack-oriented_programming
© 2022 • Aulab S.r.l.
Stack vuoto
HASH160
Public Key
Hash
DUP EQUALVERIFY CHECKSIG
Signature Public Key
© 2022 • Aulab S.r.l.
Execute!
HASH160
Public Key
Hash
DUP EQUALVERIFY CHECKSIG
Signature Public Key
© 2022 • Aulab S.r.l.
Execute!
HASH160
Public Key
Hash
DUP
EQUALVERIFY CHECKSIG
Signature
Public Key
https://en.bitcoin.it/wiki/Script
Duplicates the top stack item.
© 2022 • Aulab S.r.l.
Execute!
HASH160
Public Key
Hash
EQUALVERIFY CHECKSIG
Signature
Public Key
Public Key
© 2022 • Aulab S.r.l.
Execute!
HASH160
Public Key
Hash
EQUALVERIFY CHECKSIG
Signature
Public Key
Public Key
The input is hashed twice:
first with SHA-256 and then
with RIPEMD-160
© 2022 • Aulab S.r.l.
Execute!
Public Key
Hash
EQUALVERIFY CHECKSIG
Signature
Public Key
Public Key
Hash
© 2022 • Aulab S.r.l.
Execute!
Public Key
Hash
EQUALVERIFY CHECKSIG
Signature
Public Key
Public Key
Hash
© 2022 • Aulab S.r.l.
Execute!
Public Key
Hash
EQUALVERIFY
CHECKSIG
Signature
Public Key
Public Key
Hash
Same as OP_EQUAL, but runs
OP_VERIFY afterward
© 2022 • Aulab S.r.l.
Execute!
OP_EQUAL
CHECKSIG
Signature
Public Key
1
Returns 1 if the inputs are
exactly equal, 0 otherwise.
© 2022 • Aulab S.r.l.
Execute!
OP_VERIFY
CHECKSIG
Signature
Public Key
Marks transaction as invalid if
top stack value is not true.
The top stack value is removed.
© 2022 • Aulab S.r.l.
Execute!
CHECKSIG
Signature
Public Key
© 2022 • Aulab S.r.l.
Execute!
CHECKSIG
Signature
Public Key
The signature used by
OP_CHECKSIG must be a valid
signature for this hash and
public key. If it is, 1 is
returned, 0 otherwise.
© 2022 • Aulab S.r.l.
Execute!
1
TRANSAZIONE VALIDA!
Fine seconda parte
© 2022 • Aulab S.r.l.
Nella prossima e ultima puntata
LA MAPPA DEL TESORO LA POLVERE D’ORO
LA MAGIA
CHE PROTEGGE IL TESORO
PRIVATE KEY
BITCOIN ADDRESS
CRYPTOGRAPHY
BITCOIN WALLETS
UTXO MODEL
BITCOIN TRANSACTION
BITCOIN SCRIPT
BITCOIN SCRIPT
BITCOIN NETWORK
BITCOIN MINING
© 2022 • Aulab S.r.l.
per ulteriori informazioni su aulab
e sul corso Hackademy per sviluppatori web
visita il sito www.aulab.it
Grazie per l’attenzione
https://thecmmbay.com/community/coding-zone

More Related Content

Similar to Bitcoin in codice - Parte 2

Bitcoin in codice
Bitcoin in codiceBitcoin in codice
Bitcoin in codice
Giancarlo Valente
 
La Tokenomics Italiana verso una DAO MADE IN ITALY di Fantini Fabrizio SMAU 1...
La Tokenomics Italiana verso una DAO MADE IN ITALY di Fantini Fabrizio SMAU 1...La Tokenomics Italiana verso una DAO MADE IN ITALY di Fantini Fabrizio SMAU 1...
La Tokenomics Italiana verso una DAO MADE IN ITALY di Fantini Fabrizio SMAU 1...
INNOVABILITA
 
I Giochi e l'Arte della Manutenzione del Web
I Giochi e l'Arte della Manutenzione del WebI Giochi e l'Arte della Manutenzione del Web
I Giochi e l'Arte della Manutenzione del Web
Riccardo Cambiassi
 
formazione al coding.pdf
formazione al coding.pdfformazione al coding.pdf
formazione al coding.pdf
Laura Antichi
 
BitGold. L'estinzione dei dinosauri.
BitGold. L'estinzione dei dinosauri.BitGold. L'estinzione dei dinosauri.
BitGold. L'estinzione dei dinosauri.
DevDay
 
Barcamp, Ignite ed Elevator Pitch for Dummies
Barcamp, Ignite ed Elevator Pitch for DummiesBarcamp, Ignite ed Elevator Pitch for Dummies
Barcamp, Ignite ed Elevator Pitch for DummiesNicola Mattina
 
Portarsi A Casa Uno Stipendo Con Wordpress
Portarsi A Casa Uno Stipendo Con WordpressPortarsi A Casa Uno Stipendo Con Wordpress
Portarsi A Casa Uno Stipendo Con Wordpress
Luca Mercatanti
 
Smau milano 2012 arena social media matteo-collina
Smau milano 2012   arena social media matteo-collinaSmau milano 2012   arena social media matteo-collina
Smau milano 2012 arena social media matteo-collinaSMAU
 
L'universo dietro alle App
L'universo dietro alle AppL'universo dietro alle App
L'universo dietro alle App
Matteo Collina
 
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Codemotion
 
bitcoin il denaro del futuro
bitcoin il denaro del futurobitcoin il denaro del futuro
bitcoin il denaro del futuro
Oliviero Bottiglione
 
Blockchain - crittomonete, Bitcoin e altre applicazioni
Blockchain - crittomonete, Bitcoin e altre applicazioniBlockchain - crittomonete, Bitcoin e altre applicazioni
Blockchain - crittomonete, Bitcoin e altre applicazioni
Davide Carboni
 
Be wizard 2012 - content - seo - links - gianluca fiorelli
Be wizard 2012 - content - seo - links - gianluca fiorelliBe wizard 2012 - content - seo - links - gianluca fiorelli
Be wizard 2012 - content - seo - links - gianluca fiorelliGianluca Fiorelli
 
Bitcoin Forensics - Riciclaggio e Antiriciclaggio nell'era del Bitcoin
Bitcoin Forensics - Riciclaggio e Antiriciclaggio nell'era del BitcoinBitcoin Forensics - Riciclaggio e Antiriciclaggio nell'era del Bitcoin
Bitcoin Forensics - Riciclaggio e Antiriciclaggio nell'era del Bitcoin
dalchecco
 

Similar to Bitcoin in codice - Parte 2 (14)

Bitcoin in codice
Bitcoin in codiceBitcoin in codice
Bitcoin in codice
 
La Tokenomics Italiana verso una DAO MADE IN ITALY di Fantini Fabrizio SMAU 1...
La Tokenomics Italiana verso una DAO MADE IN ITALY di Fantini Fabrizio SMAU 1...La Tokenomics Italiana verso una DAO MADE IN ITALY di Fantini Fabrizio SMAU 1...
La Tokenomics Italiana verso una DAO MADE IN ITALY di Fantini Fabrizio SMAU 1...
 
I Giochi e l'Arte della Manutenzione del Web
I Giochi e l'Arte della Manutenzione del WebI Giochi e l'Arte della Manutenzione del Web
I Giochi e l'Arte della Manutenzione del Web
 
formazione al coding.pdf
formazione al coding.pdfformazione al coding.pdf
formazione al coding.pdf
 
BitGold. L'estinzione dei dinosauri.
BitGold. L'estinzione dei dinosauri.BitGold. L'estinzione dei dinosauri.
BitGold. L'estinzione dei dinosauri.
 
Barcamp, Ignite ed Elevator Pitch for Dummies
Barcamp, Ignite ed Elevator Pitch for DummiesBarcamp, Ignite ed Elevator Pitch for Dummies
Barcamp, Ignite ed Elevator Pitch for Dummies
 
Portarsi A Casa Uno Stipendo Con Wordpress
Portarsi A Casa Uno Stipendo Con WordpressPortarsi A Casa Uno Stipendo Con Wordpress
Portarsi A Casa Uno Stipendo Con Wordpress
 
Smau milano 2012 arena social media matteo-collina
Smau milano 2012   arena social media matteo-collinaSmau milano 2012   arena social media matteo-collina
Smau milano 2012 arena social media matteo-collina
 
L'universo dietro alle App
L'universo dietro alle AppL'universo dietro alle App
L'universo dietro alle App
 
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
 
bitcoin il denaro del futuro
bitcoin il denaro del futurobitcoin il denaro del futuro
bitcoin il denaro del futuro
 
Blockchain - crittomonete, Bitcoin e altre applicazioni
Blockchain - crittomonete, Bitcoin e altre applicazioniBlockchain - crittomonete, Bitcoin e altre applicazioni
Blockchain - crittomonete, Bitcoin e altre applicazioni
 
Be wizard 2012 - content - seo - links - gianluca fiorelli
Be wizard 2012 - content - seo - links - gianluca fiorelliBe wizard 2012 - content - seo - links - gianluca fiorelli
Be wizard 2012 - content - seo - links - gianluca fiorelli
 
Bitcoin Forensics - Riciclaggio e Antiriciclaggio nell'era del Bitcoin
Bitcoin Forensics - Riciclaggio e Antiriciclaggio nell'era del BitcoinBitcoin Forensics - Riciclaggio e Antiriciclaggio nell'era del Bitcoin
Bitcoin Forensics - Riciclaggio e Antiriciclaggio nell'era del Bitcoin
 

Bitcoin in codice - Parte 2

  • 1. © 2022 • Aulab S.r.l. Bitcoin in codice - Parte 2 Di Giancarlo Valente - CTO Aulab Aprile 2022 - Coding Zone
  • 2. © 2022 • Aulab S.r.l. Aulab è la prima Coding Factory Italiana attiva dal 2014 nell’ ambito della formazione e dello sviluppo software. Con i nostri corsi formiamo risorse nell’ambito IT da collocare in aziende alla ricerca di personale. Siamo anche una software house, in cui molti studenti hanno l’opportunità di mettere in pratica ciò che hanno imparato durante i nostri corsi. L'Hackademy è un corso intensivo online di 400 ore già sperimentato con successo da oltre 800 studenti provenienti da tutta Italia  in 34 edizioni passate, che consente in  soli 3 mesi  di acquisire le competenze necessarie per scrivere codice ed  avviare una nuova carriera professionale come sviluppatore web.
  • 3.
  • 5. © 2022 • Aulab S.r.l. Un’avventura in tre puntate per scoprire come funziona bitcoin
  • 6. © 2022 • Aulab S.r.l. In questa seconda puntata LA MAPPA DEL TESORO LA POLVERE D’ORO LA MAGIA CHE PROTEGGE IL TESORO PRIVATE KEY BITCOIN ADDRESS CRYPTOGRAPHY BITCOIN WALLETS UTXO MODEL BITCOIN TRANSACTION BITCOIN SCRIPT BITCOIN SCRIPT BITCOIN NETWORK BITCOIN MINING
  • 7. © 2022 • Aulab S.r.l. WARNING CODE !!!
  • 8. © 2022 • Aulab S.r.l. Tutorial passo passo qui https://aulab.it/blog
  • 9. © 2022 • Aulab S.r.l. Codice a scopo didattico, da non utilizzare in produzione.  Obiettivo esplorare i meccanismi interni che fanno funzionare Bitcoin. Il tipo di transazione utilizzata è una “Legacy P2PKH” oramai in disuso. Ma è la più semplice per iniziare ad approcciare il funzionamento del network Bitcoin.
  • 10. © 2022 • Aulab S.r.l. Nella puntata precedente … mhuTK7guQqQmvUyc2BQX8uUyZdkV32u73h
  • 11. © 2022 • Aulab S.r.l. Nella puntata precedente … Private Key 256-bit Bitcoin Address mhuTK7guQqQmvUyc2BQX8uUyZdkV32u73h
  • 12. © 2022 • Aulab S.r.l. Nella puntata precedente …
  • 13. © 2022 • Aulab S.r.l. Costruiamo una transazione
  • 14. © 2022 • Aulab S.r.l. Jack Willy Jack (il resto)
  • 15. Maggio 2010 Gavin Andresen - First Faucet Website Un sito web detto faucet che regalava 5 Bitcoin a ogni utente
  • 17. © 2022 • Aulab S.r.l. Faucets https://testnet-faucet.mempool.co/ https://testnet-faucet.com/btc-testnet/
  • 18. © 2022 • Aulab S.r.l. Faucets https://testnet-faucet.mempool.co/ https://testnet-faucet.com/btc-testnet/
  • 20. © 2022 • Aulab S.r.l. Cerchiamo il nostro forziere mhuTK7guQqQmvUyc2BQX8uUyZdkV32u73h
  • 21. © 2022 • Aulab S.r.l. Blockchain explorer https://live.blockcypher.com/btc-testnet/
  • 22. © 2022 • Aulab S.r.l. Blockchain explorer https://live.blockcypher.com/btc-testnet/
  • 23. © 2022 • Aulab S.r.l. Blockchain explorer API $> http GET https://api.blockcypher.com/v1/btc/test3/addrs/mwprx4B5aTLTD8eFDPBvyfBBrtMk68Cqk2/balance https://httpie.io/
  • 25. // 10_transaction.js var bitcore = require('bitcore-lib'); //bitcore.Networks.defaultNetwork = bitcore.Networks.livenet; bitcore.Networks.defaultNetwork = bitcore.Networks.testnet; function deterministicPrivateKey(mappa_del_tesoro) { const value = Buffer.from(mappa_del_tesoro); const hash = bitcore.crypto.Hash.sha256(value); const bn = bitcore.crypto.BN.fromBuffer(hash); return new bitcore.PrivateKey(bn); } const mappa_del_tesoro = ` Seconda stella a destra, questo è il cammino E poi dritto fino al mattino Poi la strada la trovi da te Porta all'isola che non c'è `;
  • 26. const sorgente = deterministicPrivateKey(mappa_del_tesoro); const destinazione = deterministicPrivateKey('apriti sesamo ciccio cappuccio'); const address_sorgente = sorgente.toAddress(); const address_destinazione = destinazione.toAddress(); var tx = bitcore.Transaction(); // Transazione di tipo: Legacy P2PKH // devo trovare un output di transazione non speso // http get https://api.bitcore.io/api/BTC/testnet/address/ mwprx4B5aTLTD8eFDPBvyfBBrtMk68Cqk2/?unspent=true var utxo = { "txId": "1b00aa5791cb6607e034b4b0a2d8dfdba83ad0c07d6cf3d260ce43a1f78cb64f", "outputIndex": 0, "address": "n3ct4eSiLQrJSpPGA8JmZHxKJ9WMFcXKvz", "script": "76a914f271bb23c0fa55be23aacddfc8f95d7244fffcb988ac", "satoshis": 100000 }; tx.from(utxo);
  • 27. © 2022 • Aulab S.r.l. Che cosa e’ un UTXO?
  • 28. © 2022 • Aulab S.r.l. Jack Willy Hook
  • 29. © 2022 • Aulab S.r.l.
  • 30. © 2022 • Aulab S.r.l.
  • 31. © 2022 • Aulab S.r.l.
  • 32. © 2022 • Aulab S.r.l.
  • 33. © 2022 • Aulab S.r.l.
  • 34. © 2022 • Aulab S.r.l. UTXO
  • 35. © 2022 • Aulab S.r.l. Spent Output UTXO
  • 37. © 2022 • Aulab S.r.l. Blockchain explorer API - UTXO $> https://api.bitcore.io/api/BTC/testnet/address/mk3s3Fr7BCyVkMEFawQTa19a1T9uHgb2dM/?unspent=true
  • 38. const sorgente = deterministicPrivateKey(mappa_del_tesoro); const destinazione = deterministicPrivateKey('apriti sesamo ciccio cappuccio'); const address_sorgente = sorgente.toAddress(); const address_destinazione = destinazione.toAddress(); var tx = bitcore.Transaction(); // Transazione di tipo: Legacy P2PKH // devo trovare un output di transazione non speso // http get https://api.bitcore.io/api/BTC/testnet/address/ mwprx4B5aTLTD8eFDPBvyfBBrtMk68Cqk2/?unspent=true var utxo = { "txId": "1b00aa5791cb6607e034b4b0a2d8dfdba83ad0c07d6cf3d260ce43a1f78cb64f", "outputIndex": 0, "address": "n3ct4eSiLQrJSpPGA8JmZHxKJ9WMFcXKvz", "script": "76a914f271bb23c0fa55be23aacddfc8f95d7244fffcb988ac", "satoshis": 100000 }; tx.from(utxo);
  • 39. "outputIndex": 0, "address": "n3ct4eSiLQrJSpPGA8JmZHxKJ9WMFcXKvz", "script": "76a914f271bb23c0fa55be23aacddfc8f95d7244fffcb988ac", "satoshis": 100000 }; tx.from(utxo); // 50000 satoshi di pagamento tx.to(address_destinazione, 50000); // 10000 satoshi al miner tx.fee(10000); // il resto mettilo sempre nel mio wallet sorgente :) tx.change(address_sorgente); // firmo questa transazione con la mia chiave privata // solo io posso spostare i miei utxo tx.sign(sorgente);
  • 41. © 2022 • Aulab S.r.l. Digital Signature - Sign Una fi rma digitale e’ un valore prodotto da una Chiave Privata e un Messaggio Firma Digitale Dato Messaggio Dato Private Key 256 bit f() ECDSA digital signature
  • 42. © 2022 • Aulab S.r.l. Digital Signature - Verify Chiunque può veri fi care, grazie alla chiave pubblica, che chi ha prodotto la fi rma digitale era in possesso della relativa chiave privata Dato Public Key 512 bit f() CHECKSIG Firma Digitale
  • 43. tx.from(utxo); // 30000 satoshi di pagamento tx.to(address_destinazione, 50000); // 20000 satoshi al miner tx.fee(10000); // il resto mettilo sempre nel mio wallet sorgente :) tx.change(address_sorgente); // firmo questa transazione con la mia chiave privata // solo io posso spostare i miei utxo tx.sign(sorgente); // serializza la transazione sul protocollo a livello di Byte tx.serialize(); const raw_transaction = tx.toString(); console.log('raw transaction: ', raw_transaction);
  • 44. © 2022 • Aulab S.r.l. Raw transaction 02000000016cace69330b25e479512f8a615c775d41e4f0556c20f8019eed48af4809f27140100 00006b48304502210091f0ae321cddd031a00660df57ce87433d2668d78556671b988d953a9d04 4e6602202e7286d9ae24d8fd5e73de88ff895390aeb6bb08108906eb7cb9aa8be6281729012102 d9af3459a1ddc32428c0af32bc36b0cc1aa6fda033d0d0e715af9cab2e9853acffffffff023075 0000000000001976a91450e22df3e9d42563b3482e81d8f66ab090beeb5e88ac50c30000000000 001976a914b2e509c9e7ce864c9fd6771e9709cac3eab3938b88ac00000000 In esadecimale (hex) ogni carattere e’ un nibble ossia 4 bit. Due caratteri sono 1 byte. Esempio: FF e’ 255 Che e’ il valore massimo rappresentabile con 1 byte
  • 45. © 2022 • Aulab S.r.l. Decode Raw transaction https://live.blockcypher.com/btc/decodetx/
  • 46. © 2022 • Aulab S.r.l. Input Output Output 100.000 30.000 50.000 20.000
  • 47. © 2022 • Aulab S.r.l. Script Script Script
  • 49. © 2022 • Aulab S.r.l. Unlocking SCRIPT Locking SCRIPT Locking SCRIPT TRANSAZIONE
  • 50. © 2022 • Aulab S.r.l. Input SCRIPT UTXO Usato Output SCRIPT TRANSAZIONE
  • 51. © 2022 • Aulab S.r.l. Lock
  • 52. © 2022 • Aulab S.r.l. Lock Lock Lock Lock Unlock
  • 53. © 2022 • Aulab S.r.l. Lock Lock Lock Lock Lock Unlock Unlock
  • 54. © 2022 • Aulab S.r.l. Lock Lock Lock Lock Lock Lock Unlock Unlock Unlock
  • 55. © 2022 • Aulab S.r.l. Lock Lock Lock Lock Lock Lock Lock Unlock Unlock Unlock Unlock Unlock
  • 56. // 12_scripts.js var scriptIn = bitcore.Script(tx.toObject().inputs[0].script); console.log('input scripting: ', scriptIn); var scriptOut = bitcore.Script(tx.toObject().outputs[0].script); console.log('noutput scripting 0 : ', scriptOut); var scriptOut = bitcore.Script(tx.toObject().outputs[1].script); console.log('output scripting 1 : ', scriptOut);
  • 57. © 2022 • Aulab S.r.l. P2PKH TRANSACTION - INPUT SCRIPT
  • 58. © 2022 • Aulab S.r.l. P2PKH TRANSACTION - INPUT SCRIPT 48304502210091f0ae321cddd031a00660df57ce87433d2668 d78556671b988d953a9d044e6602202e7286d9ae24d8fd5e73 de88ff895390aeb6bb08108906eb7cb9aa8be6281729012102 d9af3459a1ddc32428c0af32bc36b0cc1aa6fda033d0d0e715 af9cab2e9853ac
  • 59. © 2022 • Aulab S.r.l. P2PKH TRANSACTION - INPUT SCRIPT Signature Data Public Key Data
  • 60. © 2022 • Aulab S.r.l. P2PKH TRANSACTION - OUTPUT SCRIPT
  • 61. © 2022 • Aulab S.r.l. P2PKH TRANSACTION - OUTPUT SCRIPTs 76a91450e22df3e9d42563b3482e81d8f66ab090beeb5e88ac 76a914b2e509c9e7ce864c9fd6771e9709cac3eab3938b88ac
  • 62. © 2022 • Aulab S.r.l. P2PKH TRANSACTION - OUTPUT SCRIPT HASH160 OP CODE Public Key Hash Data DUP OP CODE EQUALVERIFY OP CODE CHECKSIG OP CODE RIPEMD160(SHA256(Public Key)) Bitcoin address senza pre fi sso, carattere di checksum E senza codi fi ca in base58
  • 63. © 2022 • Aulab S.r.l. P2PKH Transaction Pay To Public Key Hash
  • 64. © 2022 • Aulab S.r.l. EXECUTION! HASH160 OP CODE Public Key Hash Data DUP OP CODE EQUALVERIFY OP CODE CHECKSIG OP CODE Signature Data Public Key Data
  • 65. © 2022 • Aulab S.r.l. EXECUTION! HASH160 Public Key Hash DUP EQUALVERIFY CHECKSIG Signature Public Key
  • 66. © 2022 • Aulab S.r.l. Concatenative Language, Stack Oriented HASH160 Public Key Hash DUP EQUALVERIFY CHECKSIG Signature Public Key https://en.wikipedia.org/wiki/Concatenative_programming_language https://en.wikipedia.org/wiki/Forth_(programming_language) https://en.wikipedia.org/wiki/Stack-oriented_programming
  • 67. © 2022 • Aulab S.r.l. Stack vuoto HASH160 Public Key Hash DUP EQUALVERIFY CHECKSIG Signature Public Key
  • 68. © 2022 • Aulab S.r.l. Execute! HASH160 Public Key Hash DUP EQUALVERIFY CHECKSIG Signature Public Key
  • 69. © 2022 • Aulab S.r.l. Execute! HASH160 Public Key Hash DUP EQUALVERIFY CHECKSIG Signature Public Key https://en.bitcoin.it/wiki/Script Duplicates the top stack item.
  • 70. © 2022 • Aulab S.r.l. Execute! HASH160 Public Key Hash EQUALVERIFY CHECKSIG Signature Public Key Public Key
  • 71. © 2022 • Aulab S.r.l. Execute! HASH160 Public Key Hash EQUALVERIFY CHECKSIG Signature Public Key Public Key The input is hashed twice: first with SHA-256 and then with RIPEMD-160
  • 72. © 2022 • Aulab S.r.l. Execute! Public Key Hash EQUALVERIFY CHECKSIG Signature Public Key Public Key Hash
  • 73. © 2022 • Aulab S.r.l. Execute! Public Key Hash EQUALVERIFY CHECKSIG Signature Public Key Public Key Hash
  • 74. © 2022 • Aulab S.r.l. Execute! Public Key Hash EQUALVERIFY CHECKSIG Signature Public Key Public Key Hash Same as OP_EQUAL, but runs OP_VERIFY afterward
  • 75. © 2022 • Aulab S.r.l. Execute! OP_EQUAL CHECKSIG Signature Public Key 1 Returns 1 if the inputs are exactly equal, 0 otherwise.
  • 76. © 2022 • Aulab S.r.l. Execute! OP_VERIFY CHECKSIG Signature Public Key Marks transaction as invalid if top stack value is not true. The top stack value is removed.
  • 77. © 2022 • Aulab S.r.l. Execute! CHECKSIG Signature Public Key
  • 78. © 2022 • Aulab S.r.l. Execute! CHECKSIG Signature Public Key The signature used by OP_CHECKSIG must be a valid signature for this hash and public key. If it is, 1 is returned, 0 otherwise.
  • 79. © 2022 • Aulab S.r.l. Execute! 1 TRANSAZIONE VALIDA!
  • 81. © 2022 • Aulab S.r.l. Nella prossima e ultima puntata LA MAPPA DEL TESORO LA POLVERE D’ORO LA MAGIA CHE PROTEGGE IL TESORO PRIVATE KEY BITCOIN ADDRESS CRYPTOGRAPHY BITCOIN WALLETS UTXO MODEL BITCOIN TRANSACTION BITCOIN SCRIPT BITCOIN SCRIPT BITCOIN NETWORK BITCOIN MINING
  • 82. © 2022 • Aulab S.r.l. per ulteriori informazioni su aulab e sul corso Hackademy per sviluppatori web visita il sito www.aulab.it Grazie per l’attenzione https://thecmmbay.com/community/coding-zone