witness

Difficoltà: avanzato

Argomento: tecnologia


DEFINIZIONE

Il Witness, traducibile letteralmente come testimone, all'interno di una transazione è quella parte che rappresenta la firma di sblocco.

La transazione Bitcoin può quindi essere considerata composta da 2 segmenti:

  • I dati della firma, chiamati witness
  • il Merkle tree record di chi invia o riceve i bitcoin

Prima di Segwit, questi due segmenti erano uniti, mentre con Segwit i due segmenti vengono divisi, rimuovendo il witness dalla porzione originale e aggiungendolo in fondo come struttura separata. La sezione originale continua a trattenere i dati di chi invia o riceve e la nuova struttura witness contiene gli script e le firme. Questo comporta un vantaggio anche in termini di scalabilità ai fini dell'occupazione di un blocco, perché il segmento dati originale viene contato normalmente ma il segmento witness viene contato come un quarto della sua grandezza reale.

Il Witness di una transazione è una sezione delle transazioni SegWit non inclusa quando una transazione viene sottoposta a hash e firma. Il witness contiene gli Script Witness per tutti gli input SegWit di una transazione. Lo Script Witness è analogo a uno ScriptSig nelle transazioni legacy (quelle con il vecchio formato prima di segwit): contiene le firme e gli script necessari per spendere un precedente output SegWit.

Poiché lo ScriptSpend, script di spesa, è incluso nel witness, lo ScriptSig delle transazioni SegWit viene lasciato vuoto. Non essendo il witness incluso nell'hash di una transazione, non influisce sul txid. Questa architettura è stata implementata per eliminare la Transaction Malleability.

I dati del witness sono considerati parte di una transazione e vengono memorizzati insieme a ogni transazione da tutti i nodi Bitcoin che hanno implementato SegWit. Tuttavia, i dati dei witness ricevono uno sconto quando viene calcolato il peso di una transazione. Mentre un normale byte di una transazione equivale a 4 unità di peso, un byte di dati del witness pesa solo 1 unità di peso. Questo sconto rende le uscite SegWit meno costose di quelle legacy. Inoltre, aumenta effettivamente la dimensione massima dei blocchi da 1MB a 4MB.

Per garantire che il witness di una transazione non possa essere alterato una volta inserito nella blockchain, viene calcolato un witness txid, o wtxid, separato. Questo wtxid viene utilizzato per creare un albero di Merkle distinto di tutte le transazioni SegWit in un blocco, simile al normale albero di Merkle di un blocco. Questo albero Merkle viene aggiunto come scriptPubKey di un output coinbase vuoto utilizzando OP_RETURN.


aggiornato il 2022-10-22