Glossario / Transazioni e commissioni
Outpoint
- Che cos'è un outpoint?
- Un outpoint è il puntatore di 36 byte che identifica esattamente un output di transazione, combinando l'id di 32 byte della transazione che lo ha creato con l'indice di 4 byte della sua posizione.
Bitcoin non ha numeri di conto, quindi ogni spesa deve indicare con precisione quale output sta spendendo. Scritto per le persone, il puntatore ha la forma di un id di transazione, due punti e un numero, e funge da chiave primaria dell'intero database degli output non spesi che ogni nodo completo mantiene. Se due transazioni indicano lo stesso outpoint, solo una delle due può essere valida, e quella singola regola è ciò che impedisce che lo stesso output venga speso due volte.
Come funziona
L'outpoint si trova all'inizio di ogni input di transazione ed è la prima cosa che un nodo cerca quando verifica se una spesa è consentita.
Nella forma serializzata sono due campi senza separatore: 32 byte di hash della transazione, poi un indice di 4 byte memorizzato in little-endian. L'hash è scritto nell'ordine dei byte interno, che è l'inverso dell'ordine che vedi su un block explorer, quindi una transazione grezza in esadecimale sembra fare riferimento a un id di transazione scritto al contrario. Questo confonde chiunque legga per la prima volta l'esadecimale grezzo ed è puramente una convenzione di visualizzazione, non una differenza nei dati.
Gli indici partono da zero. Il primo output di una transazione è l'indice 0, il secondo è l'indice 1, e una moneta descritta come terminante in :2 è il terzo output. Il campo è di 4 byte, quindi il tetto teorico è 4.294.967.295, a cui nessuna transazione reale si avvicina.
Un valore è riservato. Una transazione coinbase, quella che paga il miner, ha un solo input il cui outpoint è di 32 byte a zero con l'indice impostato su tutti uno, 0xffffffff. Quella combinazione non punta a nulla e segnala che questo input crea valore invece di spostarlo.
L'unicità ha dovuto essere imposta per regola anziché data per scontata. Due transazioni coinbase con contenuto identico produrrebbero id identici e quindi outpoint duplicati, cosa accaduta due volte nella storia iniziale del bitcoin. Il BIP30 ha vietato direttamente il pattern, e il BIP34 ha poi richiesto che ogni coinbase includesse l'altezza del blocco nel suo script di input, garantendo contenuti diversi. Il BIP34 è diventato obbligatorio al blocco 227.931, a marzo 2013.
Dove lo vedi
L'outpoint è l'identificatore che usi ogni volta che parli con precisione di una moneta specifica anziché di un saldo.
Le schermate di coin control dei wallet elencano i bitcoin detenuti come id di transazione e indice. L'interfaccia RPC di Bitcoin Core accetta i due campi come coppia: listunspent li restituisce, gettxout ne cerca uno e createrawtransaction li richiede. Lightning usa l'outpoint della transazione di finanziamento come nome permanente di un canale, ed è per questo che gli identificatori di canale nel software dei nodi sembrano un hash seguito da un numero piccolo.
È anche la cosa giusta da citare in una controversia. Un indirizzo può essere stato pagato decine di volte e una transazione può avere decine di output, ma un outpoint indica un singolo pagamento di un singolo importo in un singolo momento, senza ambiguità su cui discutere. Se un exchange ti chiede di dimostrare un deposito specifico, questo è il livello di precisione che chiude la questione.
Outpoint vs indice di output
L'indice di output è un campo dentro un outpoint, non un nome più breve per indicarlo. Da solo un indice non porta alcuna informazione, perché decine di milioni di transazioni hanno un output all'indice 0 e il numero non dice nulla su quale sia quello giusto. La confusione nasce dalle interfacce dei block explorer, che etichettano l'indice "vout" e lo mostrano in evidenza, così le persone iniziano a chiamare vout l'intero puntatore. Tienili separati quando scrivi qualcosa: l'id di transazione dice quale transazione, l'indice dice quale output al suo interno, e solo entrambi insieme identificano una moneta.