W03.01 – TRANSAZIONI BITCOIN


WEEK 3
Mechanics of Bitcoin

Learn how the individual components of the Bitcoin protocol make the whole system tick: transactions, script, blocks, and the peer-to-peer network. Scopri in che modo i singoli componenti del protocollo Bitcoin fanno funzionare l’intero sistema: transazioni, script, blocchi e la rete peer-to-peer.

Joseph Bonneau
Postdoctoral Research Associate – Princeton University

Sezione 03.01 – Transazioni Bitcoin
03.01.0
Welcome to the third lecture in our series on Bitcoin. This lecture is going to be all about the mechanics of Bitcoin at a fairly low level. So whereas in the first two lectures, we’ve talk in a relatively high level, in this lecture, we’re going to be trying to give it to you as real as possible. So we’ll look at real data structures, real scripts. Try to learn the details and language of Bitcoin in a precise way to set up everything that we wanna talk about for the remainder of the course. So in some ways, this will be the most challenging lecture because a lot of details are going to be flying at you.

It’s also one of the most real, where you’re really learning the specifics and the quirks that make Bitcoin what it is.
Benvenuti alla terza sezione della nostra serie su Bitcoin. Questa conferenza sarà interamente dedicata alla meccanica del Bitcoin ad un livello abbastanza profondo. Quindi, mentre nelle prime due conferenze, abbiamo parlato in un livello relativamente generico, in questa conferenza, cercheremo di descriverlo nel modo più reale possibile. Quindi esamineremo strutture dati reali, veri script. Cerca di imparare i dettagli e il linguaggio di Bitcoin in un modo preciso per impostare tutto ciò di cui vogliamo parlare per il resto del corso. Quindi, in un certo senso, questa sarà la conferenza più impegnativa perché ti verranno dati molti dettagli.

È anche uno dei più reali, in cui impari davvero le caratteristiche e le peculiarità che rendono Bitcoin quello che è.
03.01.01
So to recap where we left off last time, the Bitcoin consensus mechanism gives us an append-only ledger, so a data structure that we can only write to and once data is written, it’s there forever.

And there’s a decentralized protocol for establishing consensus about the value of that ledger.

And the miners, who perform that protocol, are validating transactions. So making sure that transactions are well-formed, that there aren’t double spends, and that this thing can function as a currency.
Quindi, per ricapitolare dove abbiamo lasciato l’ultima volta, il meccanismo di consenso di Bitcoin ci fornisce un libro mastro di “sola aggiunta”, quindi una struttura dati a cui possiamo solo scrivere e una volta che i dati sono scritti, restano lì per sempre.

E c’è un protocollo decentralizzato per stabilire un consenso sul valore di quel libro mastro.

E i minatori, che eseguono quel protocollo, convalidano le transazioni. Quindi assicurandoci che le transazioni siano ben formate, che non ci siano doppie spese, e che questa cosa possa funzionare come una valuta.
03.01.02
Although, it’s kind of funny, because we assumed that the are currency existed to motivate these miners. So in this lecture, we’ll be looking at the details of how we actually build that currency to make the miners make this whole process happen. Anche se è divertente, perché abbiamo pensato che esistesse la valuta per motivare questi minatori. Quindi, in questa conferenza, esamineremo i dettagli di come effettivamente costruiamo quella valuta per far sì che i minatori facciano l’intero processo.
03.01.03
All right, so we’ll start by looking at transaction in Bitcoin. Transactions are really the fundamental building block which the whole currency is gonna be based on. So remember, we have this ledger. The ledger is append only, so as time goes on we just add more and more units to it. We’re gonna take a simplified model here, where instead of having blocks, we just have individual transactions being added to the ledger one at a time. So how can we build a currency this way? So the first model you might think of, which is actually a lot of people’s mental model for how Bitcoin works that we’ll look at first, is that you would have an account based system. So you can add some transactions that create new coins and credit them to somebody. And then later you can transfer them and you would just have a transaction that would say, we’re moving 17 coins from Alice to Bob. That will be signed by Alice to authorize the transaction. And that’s all the information that would be contained. Va bene, quindi inizieremo osservando la transazione in Bitcoin. Le transazioni sono davvero il tassello fondamentale su cui si baserà l’intera valuta. Quindi ricorda, abbiamo questo libro mastro. Il libro mastro è di “sola aggiunta”, quindi col passare del tempo aggiungiamo sempre più unità. Qui prenderemo un modello semplificato, in cui invece di avere blocchi, le singole transazioni vengono aggiunte al libro mastro una alla volta. Quindi come possiamo costruire una valuta in questo modo? Quindi, il primo modello che potreste pensare, che è in realtà un modello mentale di molte persone per come funziona Bitcoin che vedremo in primo luogo, è che avreste un sistema basato sull’account. Quindi puoi aggiungere alcune transazioni che creano nuove monete e li accreditano a qualcuno. E poi dopo puoi trasferirli e avresti solo una transazione che direbbe, stiamo spostando 17 monete da Alice a Bob. Questo sarà firmato da Alice per autorizzare la transazione. E questa è tutta l’informazione che sarebbe contenuta.
03.01.04
Now backing this up, there would some state that says that after Alice received 25 coins in the first transaction, and then transferred 17 coins to Bob in the second transaction, Alice would have an account that is left with 8 Bitcoins.

So now, after that transfer from Alice to Bob, we can add some more transactions to ledger. We’ll say that Bob pays some Bitcoins to Charlie, Charlie pays some coins to Alice. And at this point, each participant, Alice, Bob and Charlie has an account with a different value in it. And those values are gonna mutate each time we add a new transaction.
Ora sostenendo questo, ci sarebbe qualche stato che dice che dopo che Alice ricevette 25 monete nella prima transazione, e poi trasferì 17 monete a Bob nella seconda transazione, Alice avrebbe un account che è rimasto con 8 Bitcoin.

Quindi ora, dopo il trasferimento da Alice a Bob, possiamo aggiungere altre transazioni al libro mastro. Diremo che Bob paga alcuni Bitcoin a Charlie, Charlie paga alcune monete ad Alice. E a questo punto, ogni partecipante, Alice, Bob e Charlie ha un account con un valore diverso in esso. E quei valori stanno per mutare ogni volta che aggiungiamo una nuova transazione.
03.01.05
Now the downside of this system, if we add a new transaction at the bottom here, is that we have to remember what the account balance is for each participant to figure out if this transaction is valid or not. Does Alice have the 15 coins that she is trying to transfer to David here?

So sure enough looking at this just with your naked eye, it’s fairly hard to tell, to do the mental arithmetic, to figure out if Alice has enough money to transfer to David here. And in fact, to figure this out you’d have to look backwards in time forever to see every transaction effecting Alice and whether or not her net balance at the time that tries to transfer 15 coins to David is greater than 15 coins. Okay, so to tell if this transaction is valid or not, we have to figure out whether or not Alice has the 15 coins that she’s trying to transfer to David.
Ora il lato negativo di questo sistema, se aggiungiamo una nuova transazione in basso qui, è che dobbiamo ricordare qual è il saldo del conto per ogni partecipante per capire se questa transazione è valida o meno. Alice ha le 15 monete che sta cercando di trasferire a David qui?

Quindi è abbastanza sicuro di vederlo solo ad occhio nudo, è abbastanza difficile dire, fare l’aritmetica mentale, per capire se Alice ha abbastanza soldi da trasferire qui a David. E in effetti, per capirlo dovresti guardare indietro nel tempo per sempre per vedere ogni transazione che coinvolge Alice e se il suo saldo netto nel momento in cui cerchi di trasferire 15 monete a David è superiore a 15 monete. Va bene, quindi per sapere se questa transazione è valida o meno, dobbiamo capire se Alice ha o meno le 15 monete che sta cercando di trasferire a David.
03.01.06
And to figure that out, we might have to look backwards forever to the beginning of time at every transaction that’s ever involved Alice. Every time Alice is sent to receive coins, we need to find all of those transactions and add them up to see if she really has the 15 coins that she’s trying to transfer to David. And, of course, we can make this a little bit more efficient with some data structures that track Alice’s balance after each transaction, but that’s gonna require a lot of extra housekeeping beside the blockchain itself. E per capirlo, potremmo dover guardare all’indietro per sempre all’inizio del tempo ad ogni transazione che abbia mai coinvolto Alice. Ogni volta che Alice viene inviata per ricevere monete, dobbiamo trovare tutte quelle transazioni e aggiungerle per vedere se ha davvero le 15 monete che sta cercando di trasferire a David. E, naturalmente, possiamo renderlo un po ‘più efficiente con alcune strutture dati che tracciano il saldo di Alice dopo ogni transazione, ma questo richiederà un sacco di pulizie extra oltre alla blockchain stessa.
03.01.07
And that’s why Bitcoin isn’t based on an account based model like this. Instead Bitcoin uses a ledger that just keeps track of transactions. So how does that work? So this is a transaction based ledger, which is very close to Bitcoin.

So now transactions explicitly specify a number of inputs and a number of outputs. And transactions also each have a unique identifier. So we’ll start with transaction one, which has no inputs cause this is new currency being created, and an output of 25 coins going to Alice.

And again since this is a transaction where new coins are being created, there’s no signature required here.
Ed è per questo che Bitcoin non si basa su un modello basato su account come questo. Invece Bitcoin usa un libro mastro che tiene traccia delle transazioni. Quindi, come funziona? Quindi questo è un libro mastro basato sulle transazioni, che è molto vicino a Bitcoin.

Quindi ora le transazioni specificano esplicitamente un numero di ingressi e un numero di uscite. E le transazioni hanno anche un identificatore univoco. Quindi inizieremo con la prima transazione, che non ha input perché questa è la nuova valuta che viene creata e un output di 25 monete che vanno ad Alice.

E ancora, poiché questo è una transazione in cui vengono create nuove monete, non è necessaria alcuna firma qui.
03.01.08
Now, let’s say that Alice wants to send some of those coins over to Bob.

Well now, she has to explicitly refer to the previous transaction where these coins are coming from. So the input to this transaction will be output index zero from transaction one, which we can see from the very previous transaction, the log was a transaction that assigned 25 Bitcoins to Alice. And now there are two outputs of this transaction. One of them is 17 coins to Bob and one of them is 8 coins to Alice. And of course this whole thing is signed by Alice so that we know that Alice actually wants to do this transaction.

I know you might ask, why does Alice have to send money to herself here?

She’s taking the 25 coins that were assigned to her in transaction one, she only wanted to pay 17 to Bob and she has to have a new output where 8 coins are sent back to herself, possibly to a different key, but to herself.
Ora, diciamo che Alice vuole inviare alcune di quelle monete a Bob.

Bene, ora deve fare esplicito riferimento alla transazione precedente da cui provengono queste monete. Quindi l’input di questa transazione sarà l’indice zero dell’output dalla transazione uno, che possiamo vedere dalla transazione precedente, il log era una transazione che assegnava 25 bitcoin ad Alice. E ora ci sono due uscite di questa transazione. Uno di questi è di 17 monete per Bob e uno di loro è di 8 monete per Alice. E ovviamente tutto questo è firmato da Alice, così sappiamo che Alice vuole davvero fare questa transazione.

So che potresti chiederti, perché Alice deve mandare soldi a se stessa?

Sta prendendo le 25 monete che le sono state assegnate nella prima transazione, voleva solo pagare 17 a Bob e deve avere un nuovo output in cui 8 monete vengono rimandate a se stessa, possibilmente a una chiave diversa, ma a se stessa.
03.01.09
So this is what’s called change address. And the design here is that you always completely consume the output of a previous transaction. So there’s no way to say, I only need 17 coins from that previous output, you have to say I’m using all 25 coins from the previous output. But since you wanna keep some, you just have a second output that sends some of the coins back to yourself, which is called a change address. Quindi questo è ciò che viene chiamato cambio indirizzo. E il design qui è che si consuma sempre completamente l’output di una transazione precedente. Quindi non c’è modo di dire, ho solo bisogno di 17 monete da quell’uscita precedente, devi dire che sto usando tutte e 25 le monete dell’uscita precedente. Ma dal momento che vuoi mantenerne un po’, hai solo un secondo output che rimanda alcune monete a te stesso, che è chiamato un indirizzo di cambiamento.
03.01.10
Now, let’s say that we keep going with this system, and now we add a new transaction and we ask ourselves again, is this new transaction valid? Now it’s much easier to look at the blockchain and figure out whether or not this transaction is valid, cuz we know exactly which input to look at. So we just need to go to transaction two, output one, and verify that there’s enough money there and that it hasn’t been sent already.

And of course, we can look back and say yes, that second output of transaction two went to Alice with eight coins, therefore it’s enough to cover the outputs of this transaction.
Ora, diciamo che continuiamo con questo sistema, e ora aggiungiamo una nuova transazione e ci chiediamo ancora, questa nuova transazione è valida? Ora è molto più semplice guardare la blockchain e capire se questa transazione è valida, perché sappiamo esattamente quale input guardare. Quindi dobbiamo solo passare alla transazione due, emetterne una e verificare che ci siano abbastanza soldi e che non sia già stata inviata.

E naturalmente, possiamo guardare indietro e dire di sì, che la seconda uscita della transazione due è andata a Alice con otto monete, quindi è sufficiente per coprire le uscite di questa transazione.
03.01.11
It’s a finite backwards scan to check for the validity.
And we implement this with hash pointers. So, again, each transaction has a unique ID. In reality they’re not serial numbers like this, it’s the hash of the block. And each transaction actually gets its specific ID as well, which is the hash of the transaction.And now it’s basically just following one pointer to figure out whether or not there is enough money to cover the desired outputs in the new transaction.Now, conceptually you could say maybe this isn’t that much different than just maintaining a separate data structure which tracks account values for each person. But the nice thing is it now this data structure is embedded within the data in the blockchain itself.
È una scansione all’indietro finita per verificare la validità.
E la implementiamo con i puntatori di hash. Quindi, di nuovo, ogni transazione ha un ID univoco. In realtà non sono numeri seriali come questo, è l’hash del blocco. E ogni transazione riceve anche il suo ID specifico, che è l’hash della transazione.E ora è fondamentalmente solo seguendo un puntatore per capire se ci sono abbastanza soldi per coprire gli output desiderati nella nuova transazione.Ora, concettualmente potresti dire che forse non è molto diverso dal semplice mantenimento di una struttura dati separata che tiene traccia dei valori dell’account per ogni persona. Ma la cosa bella è che ora questa struttura di dati è incorporata nei dati della blockchain stessa.
03.01.12
So some other things that we can do quite easily here, we can merge value. So let’s say there’s two different transactions that sends the money to Bob, 17 coins in transaction one and two coins in transaction two. Bob might say I’d like to have one transaction I can spend later, why I have all 19 coins? Altre cose che possiamo fare abbastanza facilmente qui, possiamo unire valore. Quindi diciamo che ci sono due diverse transazioni che manda i soldi a Bob, 17 monete nella transazione uno e due monete nella transazione due. Bob potrebbe dire che mi piacerebbe avere una transazione che posso spendere più tardi, perché ho tutte e 19 le monete?
03.01.13
So this is pretty easy, you just create a new transaction that has two inputs now, and only one output so all of those coins go to Bob. And you’ve combined the two previous transaction into one that Bob can then suspend later.

Similarly, we can do joint payments very easily.

So let’s say that Carol and Bob both wanna pay David, we can have a transaction with two inputs that are actually owned by two different people and combine the value and pay all eight coins to David.
Quindi questo è abbastanza facile, basta creare una nuova transazione che ha due input ora, e solo una uscita quindi tutte quelle monete vai a Bob. E hai combinato le due transazioni precedenti in una che Bob può poi sospendere in un secondo momento.

Allo stesso modo, possiamo effettuare pagamenti congiunti molto facilmente.

Quindi diciamo che Carol e Bob vogliono entrambi pagare David, possiamo avere una transazione con due input che sono in realtà di proprietà di due persone diverse e unire il valore e pagare tutte e otto le monete a David.
03.01.14
And the only extra thing here is that since the two outputs that are being claimed here are owned by two different people we’re gonna need two separate signatures, one by Carol and one by Bob. E l’unica cosa in più qui è che dal momento che le due uscite rivendicate qui sono di proprietà di due persone diverse avremo bisogno di due firme separate, one by Carol e uno di Bob.
03.01.15
So, conceptually that’s really all there is to it to a Bitcoin transaction and let’s look at what it looks like at the low level. So again one of the goals of this lecture is gonna be to show you the real data structure, the real deal of what Bitcoin looks like and here it is. Now this isn’t exactly what a Bitcoin transaction looks like, this is a representation of it that is pretty printed. It looks kinda like JSON. In reality, there’s a compact binary format that this gets compiled down to that’s not human-readable, but this is very, very close to the actual low-level transaction. So, concettualmente, è tutto ciò che c’è da fare ad una transazione Bitcoin e diamo un’occhiata a ciò che sembra a basso livello. Quindi, ancora una volta uno degli obiettivi di questa conferenza sarà quello di mostrarti la vera struttura dei dati, la vera quantità di ciò che Bitcoin assomiglia e qui è. Ora questo non è esattamente come appare una transazione Bitcoin, questa è una rappresentazione che è piuttosto stampata. Sembra un po’ come JSON. In realtà, c’è un formato binario compatto che viene compilato in modo da non essere leggibile dall’uomo, ma questo è molto, molto vicino all’effettiva transazione di basso livello.
03.01.16
So there’s three parts. There’s some metadata, there’s a series of inputs and a series of outputs. Quindi ci sono tre parti. Esistono alcuni metadati, una serie di input e una serie di output.
03.01.17
So we’ll start with metadata.

So there’s some housekeeping information, which is the size of the transaction, the number of inputs and the number of outputs. Pretty straightforward stuff.

There’s the hash of the entire transaction, which as I said, will serve as a unique ID for the transaction to let us do hash pointers. And then there’s this funny lock _time parameter, which I’ll come back to later.
Quindi iniziamo con i metadati.

Quindi ci sono alcune informazioni di manutenzione, che sono la dimensione della transazione, il numero di input e il numero di output. Cose piuttosto semplici.

C’è l’hash dell’intera transazione, che, come ho detto, servirà come ID univoco per la transazione per consentirci di fare puntatori di hash. E poi c’è questo buffo parametro lock _time, che tornerò più tardi.
03.01.18
The transaction inputs is just an array of inputs that all have the same form.

The inputs specify a previous transaction specifically, so they have the hash of the previous transaction, or a hash pointer to it.

And the index of which output from that transaction you’re actually claiming.

And then there’s a signature. So remember that we have to sign to show that we actually have the ability to claim those previous transaction outputs.
Gli input della transazione sono solo una serie di input che hanno tutti la stessa forma.

Gli input specificano una transazione specifica in modo specifico, quindi hanno l’hash del precedente transazione, o un puntatore hash ad esso.

E l’indice di quale output di quella transazione stai rivendicando. Poi c’è una firma.

Quindi ricorda che dobbiamo firmare per dimostrare che abbiamo la possibilità di rivendicare quei precedenti output di transazione.
03.01.19
And now the outputs have just two things. They have a value, so each output can have a different value. The sum of all the outputs has to be less than the sum of all the inputs.

And then there’s this funny thing that looks like what we want to be the recipient address, so each output is supposed to go to a specific person, or to a specific public key. And there is some stuff in there that looks like it’s the hash of a public key. But there’s also some other stuff.

It looks like a script. And in fact, it is a script and we’ll talk more about that very soon.
Ora gli output hanno solo due cose. Hanno un valore, quindi ogni uscita può avere un valore diverso. La somma di tutti gli output deve essere inferiore alla somma di tutti gli input.

E poi c’è questa cosa divertente che assomiglia a quello che vogliamo essere l’indirizzo del destinatario, quindi ogni output dovrebbe andare a una persona specifica, o una chiave pubblica specifica. E c’è qualcosa che sembra essere l’hash di una chiave pubblica. Ma ci sono anche altre cose.

Sembra uno script. E infatti, è uno script e ne parleremo molto presto.

[top]
© Joseph Bonneau – Postdoctoral Research Associate – Princeton University

W02.05
Mettendo tutto insieme
W03.02
Script Bitcoin