HomeCriptovaluteBitcoinDentro Bitcoin: le transazioni. Guida parte 6

Dentro Bitcoin: le transazioni. Guida parte 6

Questo articolo è il sesto di una serie di approfondimenti sulla parte più squisitamente tecnica di Bitcoin, accessibile anche a coloro a digiuno di codice. Questo articolo continua altresì una sorta di guida pensata per entrare gradualmente in quella che molti definiscono “la tana del bianconiglio”. 

Read this article in the English version here.

A livello bibliografico è d’obbligo citare il testo “Mastering Bitcoin” di Andreas Antonopoulos, riferimento costante, dal quale sono state tratte le immagini. Chi fosse interessato ad approfondire questi temi, con o senza integrazione delle dinamiche legate al codice, può trovare supporto nei corsi formativi e nella attività consulenziali erogate da Bcademy. (prossimo appuntamento per approfondire tutti questi temi, a partire dal 1 ottobre, Milano, corso “Bitcoin and Blockchain Executive” all’interno di un corso più ampio dedicato ad aspiranti developer).

Transazioni bitcoin

Le transazioni sono la parte più importante del sistema bitcoin: tutto il resto in bitcoin è progettato per assicurare che le transazioni possano essere create, propagate, validate, rese inalterabili tramite l’inserimento in blockchain. In Bitcoin, le transazioni sono strutture di dati che codificano il valore di un trasferimento di proprietà: una transazione è una comunicazione da parte di un nodo al network che un proprietario di bitcoin autorizza il trasferimento di tutti o una parte di essi ad un altro proprietario.

Ogni transazione è composta da uno o più input e uno o più output (c’è sempre una differenza tra l’input e l’output totale, dato dalle commissioni di rete). Ogni transazione sposta valore dagli input agli output:

  • ciascun input è dato da un precedente output;
  • ciascun output è associato ad un impedimento (ingombro, encumbrance).

L’impedimento impone il requisito di una firma per poter “spendere” quel determinato valore, ergo poterlo utilizzare come input per una transazione successiva. Questo processo genera una vera e propria catena della proprietà.

Una transazione è dunque uno spostamento di valore, e può:

  • avere un input e più output (tra cui “il resto”);
  • avere più input e (almeno) due o più output (tra cui “il resto”).

Ciascun input è dato da un precedente output. I wallet (le applicazioni wallet) normalmente tengono un database degli UTXO (output di transazione non spesi) che sono bloccati (encumbered) con le chiavi del wallet. I wallet dei full-client diversamente tengono copia di ogni UTXO nella blockchain. Ciò permette ad un wallet sia di costruire gli input di transazione che di verificare che le transazioni in entrata abbiano input corretti.

Ciascun output è associato ad un impedimento. Un nuovo output di transazione è generato nella forma di uno script che crea un impedimento (encumbrance) sul valore e può essere sbloccato solo fornendo la soluzione allo script (una firma della chiave privata che corrisponde all’indirizzo pubblico di ricezione, nel caso più comune). Ciascuna transazione presenta solitamente un numero di input idoneo al valore che si intende spostare, con ciò intendendo che:

  • tale valore diviene un output “impedito” e “puntato” ad un determinato indirizzo bitcoin (quello del ricevente);
  • l’eventuale valore in eccesso diviene un output “impedito” e “puntato” ad un nuovo indirizzo controllato dal mandante (o al medesimo indirizzo del mandante).

Le commissioni di rete non sono esplicitate nella transazione, ma sono date dalla differenza tra input e output. Una transazione contiene tutte le informazioni necessarie per essere processata dalla rete Bitcoin, con lo scopo di propagare transazioni (e blocchi) agli altri nodi. Ogni nodo (client) del network Bitcoin che riceva una nuova transazione valida la inoltra ai nodi con i quali è connesso, raggiungendo una gran percentuale di nodi in pochi secondi. Alla fine, una transazione bitcoin è solamente un 300-400 byte di dati che deve raggiungere uno delle decine di migliaia di nodi bitcoin. La transazione è firmata, ergo non contiene alcuna informazione riservata (perciò può essere pubblica), dunque trasmissibile tramite reti WiFi, Bluetooth, NFC, eventualmente attraverso packet radio, trasmissione satellitare, etc. Bitcoin ha trasformato il valore in una struttura dati, rendendo praticamente impossibile impedire a qualcuno di creare una transazione bitcoin. Una volta inviata ad un qualsiasi nodo, la transazione sarà validata da quel nodo, che la propagherà agli altri nodi a cui è connesso. La rete bitcoin è una rete P2P, ergo ogni nodo bitcoin è connesso con altri nodi bitcoin attraverso il protocollo peer-to-peer. L’intero network forma una maglia (mesh) connessa in modo lasso senza una tipologia fissa o struttura predefinita. I messaggi (transazioni e blocchi) sono propagati da ogni nodo a tutti i peer a cui sono connessi (flooding).

Input e Output

Un UTXO è un frammento non-divisibile di valore (valuta) “bloccato” su un indirizzo di destinazione, validato e inserito in blockchain. Il destinatario, proprietario delle chiavi private idonee per “sbloccare” l’UTXO, non gode (come nessun altro nella rete Bitcoin) di un saldo relativo ad un account: possedere bitcoin significa semplicemente godere del possesso di chiavi private idonee a sbloccare UTXO che puntano ad indirizzi generati dalle stesse chiavi (il concetto di saldo è semplicemente una costruzione dell’applicazione wallet, che scansiona la blockchain aggregando gli UTXO relativi alle chiavi private di quello stesso wallet).

Una UTXO ha un valore arbitrario denominato in multipli di satoshi (un centomilionesimo di BTC). Di nuovo: il valore è arbitrario ma non-divisibile: ciascuna transazione spende l’intero UTXO generando eventualmente un resto (change) puntato ad un indirizzo generato dalle stesse chiavi che sbloccano l’UTXO in oggetto. Le UTXO “spese” dalla transazione sono gli input della transazione, mentre le UTXO generate dalla stessa transazione sono gli output della transazione. Così, una quantità arbitraria di valore (valuta) si sposta da un proprietario (di chiavi private) all’altro in una catena di transazioni che generano e spendono UTXO. La sola eccezione è rappresentata da una transazione definita coinbase, tramite la quale si generano nuovi bitcoin come ricompensa al lavoro di creazione di un nuovo blocco.

Output

Ogni transazione crea output, UTXO (con l’eccezione di OP_RETURN), tracciati da da ciascun full-node come UTXO set. Un output consiste di due parti:

  • un ammontare di bitcoin denominato in satoshi
  • un puzzle crittografico che definisce le condizioni richieste per spendere l’output conosciuto come locking script, witness script, o scriptPubKey.

Quando le transazioni sono trasmesse al network o scambiate tra applicazioni, vengono “serializzate” (serialized). Questo processo converte la rappresentazione interna della struttura dati in un formato che può essere trasmesso un byte alla volta (byte stream).

Input

Gli input di transazione identificano quali UTXO saranno spendibili e forniscono la prova della proprietà tramite lo script di sblocco. Per costruire una transazione un wallet seleziona tra gli UTXO controllati quelli (uno o più) con valore sufficiente per eseguire una richiesta di pagamento. Per ogni UTXO che sarà speso, il wallet genera un input che “punta” all’UTXO e lo sblocca con lo script di sblocco (unlocking script).

L’input contiene quattro elementi:

  • un’ID della transazione, in riferimento alla transazione che contiene l’UTXO che viene speso;
  • un indice dell’output (vout), che identifica a quale UTXO della transazione ci si riferisce;
  • uno scriptSig che soddisfa le condizioni della UTXO, sbloccandola per essere spesa;
  • un sequence number (nelle transazioni SegWit c’è anche un campo witness).

Fee

La maggior parte delle transazioni include fee (commissioni), sostanzialmente per due ragioni:

  • compensare (ulteriormente) i miner per la messa in sicurezza della rete;
  • rendere economicamente non sostenibile un attacco alla rete inondandola di transazioni.

Le fee non sono calcolate sull’importo transato, ma sulla grandezza della transazione in kilobyte: nel complesso le fee si basano sulle logiche di mercato interne al network. I miner possono dare precedenza in base a differenti criteri, ma transazioni con fee elevate sono tendenzialmente incluse dai miner nel blocco in costruzione, mentre transazioni con fee basse (o zero, non sono obbligatorie) possono essere non incluse per molto tempo (o del tutto). Va aggiunto che i nodi Bitcoin non accettano transazioni con fee minori di 1 sat/byte dalla rete P2P (che invece sono accettate se sono nei blocchi). Inizialmente le fee erano fisse, poi con l’evolvere della rete è subentrata la competizione e la legge di mercato. L’attuale default dell’opzione minrelaytxfee (con la quale si settano le fee in Bitcoin Core) è appunto di 0,00001 bitcoin (1 sat/byte equivalente a 100 millibitcoin per kilobyte): questo è il parametro che definisce le transazioni accettate via rete P2P.

Transazioni sotto questa soglia sono considerate come gratuite (zero fee) e scartate Wallet, exchange e altri servizi che creano transazioni implementano le fee dinamiche (dynamic fees), basate su algoritmi che stimano le fee corrette per inoltrare transazioni “competitive”. Alcuni servizi permettono di scegliere tra diverse tipologie (alte, medie e basse).

La struttura-dati delle transazioni non ha un campo per le fee: esse sono implicate nella differenza tra la somma degli input e quella degli output. Ogni eccedenza tra queste due somme viene trattenuta dai miner.

Alessio Salvetti
Alessio Salvetti
Co-founder di Bcademy e board member (VP), Alessio è partner e board member di Impact Hub Trentino, uno dei 102 nodi del network mondiale. Dopo un'esperienza come docente di filosofia, abbandona l’insegnamento per coordinare un team di ricerca sui temi della connessione tra neuroscienze ed economia, prima di dedicarsi alla vera e propria creazione d’impresa. Business developer e consulente per numerose startup, bitcoiner per passione ed esperto di modeling e lean startup, è co-founder di Inbitcoin e responsabile per l’erogazione dei prodotti di Bcademy (CPO).
RELATED ARTICLES

MOST POPULARS

GoldBrick