FCK NFT HEX: Opera

B50 0 3BA4 A228 3230 A229 23A4 8001 8001 25DC B509 ADC8 2508 2508 0 340

Opera d’arte pubblicata su Bitcoin

FCK NFT HEX è un’opera d’arte originale e immutabile, firmata crittograficamente, resistente al tempo, resistente alla censura e accessibile da ogni parte del globo, pubblicata interamente sulla blockchain Bitcoin il 14 febbraio 2022 alle 02:58 (ora italiana, timestamp: 1644803909).

Per un approfondimento sulla genesi di quest’opera, leggere il manifesto per la libertà dell’arte e del pensiero attraverso l’informatica e la crittografia

L’opera completa, nella sua forma originale certificata, consiste nel codice di una specifica transazione inviata alla rete Bitcoin identificabile con il TXID:

b9f5753bad5fb899f59bf95250901407a65c7d7bbb8b22d00fbbe38760a0d937

L’opera è conservata in decine di migliaia di copie della blockchain Bitcoin attorno al globo terrestre. Una lista dei noti attivi è disponibile su BitNodes.io.

L’originalità dell’opera è garantita dalla mia firma digitale pubblica: bc1qqtc7a7263zueae5wep4x2zkdmt65rpmp8rky2k abbinata alla transazione. Solo io, che sono l’autore dell’opera e posseggo la chiave privata corrispondente posso aver inviato quella transazione in quel punto del tempo specifico. La mia firma digitale non può essere contraffatta e l’opera, nella sua forma finale di transazione Bitcoin, non può essere rimossa. Il suo prezzo di mercato è dunque inestimabile.

L’opera è visionabile in molti modi. Il più semplice è utilizzare un Bitcoin Explorer, webapp che si occupano di formattare le transazioni raw in formato HTML rendendole più leggibili, per esempio Mempool.Space.

OP_RETURN B50 0 3BA4 A228 3230 A229 23A4 8001 8001 25DC B509 ADC8 2508 2508 0 340

Si possono anche utilizzare le API pubbliche di un Bitcoin Explorer per osservare l’opera in console in formato json. Supponendo di avere sia “curl” che “python” installati, utilizzando il seguente comando: curl -sSL "https://mempool.space/api/tx/{TXID}" | python -m json.tool inserendo al posto di {TXID} la transazione sopra indicata.

Scaricando un client Bitcoin, è possibile sincronizzarsi con la blockchain (che a oggi occupa in totale oltre 300 GB) e utilizzare il tool bitcoin-cli con il comando bitcoin-cli gettransaction "{TXID}"

Per comodità, ho estratto in questa pagina le parti più rilevanti del codice dell’opera con alcuni commenti allegati per spiegarne il funzionamento.

// ID della transazione
"txid":"b9f5753bad5fb899f59bf95250901407a65c7d7bbb8b22d00fbbe38760a0d937",
"vout":[
  {
    // Istruzioni in formato assembly
    // OP_RETURN = Opcode 106 -> Nothing
    // OP_PUSHBYTES_71 = 71 byte inviati
    "scriptpubkey_type":"op_return",
    "scriptpubkey_asm":"OP_RETURN OP_PUSHBYTES_71 35302030203342413420413232382033323330204132323920323341342038303031203830303120323544432042353039204144433820323530382032353038203020333430",
  },
  {
    // Nessun pagamento inviato, solo fee
    // OP_0 (OP_FALSE) = (00) Empty
    // OP_PUSHBYTES_20 = (14) 20 byte
    "scriptpubkey_asm":"OP_0 OP_PUSHBYTES_20 02f1eef95a88b99ee68ec86a650acddaf5418761",

    // Indirizzo nativo Segwit (Bech32) P2WPKH
    // Consente un risparmio sui costi di transazione
    // Riconoscibile perché inizia per 'bc1'
    "scriptpubkey_type":"v0_p2wpkh",
    // Chiave pubblica dell'autore Andrea Brandi
    // Questa firma garantisce l'autenticità
    "scriptpubkey_address":"bc1qqtc7a7263zueae5wep4x2zkdmt65rpmp8rky2k",
  }
],
// Commissione offerta ai miner in satoshi
// A febbraio 2022, corrisponde a circa $1
"fee":2560,
"status":{
  // La transazione risulta confermata
  "confirmed":true,
  // Inserita nel blocco numero 723191
  "block_height":723191,
  // In data Feb 14 2022 02:58:29 GMT+0100
  // Il timestamp è in formato Unix/Posix
  "block_time":1644803909
}

Il messaggio contenuto nell’istruzione OP_RETURN, leggibile alla voce scriptpubkey_asm in formato esadecimale, può essere convertito in formato ASCII ottenendo la seguente stringa di 71 caratteri (o byte):

B50 0 3BA4 A228 3230 A229 23A4 8001 8001 25DC B509 ADC8 2508 2508 0 340

La stringa è composta di 16 sotto-stringhe separate da spazi. Ogni sotto-stringa rappresenta una riga ordinata. Ogni spazio rappresenta un ‘ritorno-a-capo’ che separa le righe tra loro. Convertendo ogni riga da esadecimale a binario, otteniamo una matrice ordinata di 16x16 cifre binarie. L’algoritmo di decodifica è il seguente:

  • Convertire ogni sotto-stringa in formato binario
  • Aggiungere eventuali ‘zeri’ iniziali fino a 16 bit
  • Separare ogni ‘0’ e ‘1’ con una virgola
  • Sostituire ogni spazio con un ritorno-a-capo

Un’implementazione in linguaggio Python dell’algoritmo di decodifica sopra indicato è disponibile su GitHub al seguente indirizzo: https://github.com/starise/fck-nft-hex.

Questo è il risultato finale dopo la decodifica:

0,0,0,0,1,0,1,1,0,1,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,0,1,1,1,0,1,0,0,1,0,0,
1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,
0,0,1,1,0,0,1,0,0,0,1,1,0,0,0,0,
1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1,
0,0,1,0,0,0,1,1,1,0,1,0,0,1,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
0,0,1,0,0,1,0,1,1,1,0,1,1,1,0,0,
1,0,1,1,0,1,0,1,0,0,0,0,1,0,0,1,
1,0,1,0,1,1,0,1,1,1,0,0,1,0,0,0,
0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,
0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0.

Per comprendere il senso di tale codice e lo scopo dell’esistenza di quest’opera in formato transazione Bitcoin, invito alla lettura degli approfondimenti consigliati di seguito: