Learning-Bitcoin-from-the-C.../it/09_1_Le_basi_delle_transazioni.md
Lutxo 80377bfbba Uploading italian transtlation to it directory
Uploading italian transtlation to "it" directory
2024-08-08 11:54:13 +02:00

9.7 KiB

9.1: Comprendere le basi delle transazioni

Le basi di Bitcoin sono la capacità di proteggere le transazioni, cosa che viene fatta con un semplice linguaggio di scripting.

Conoscere le parti del puzzle crittografico

Come descritto nel Capitolo 1, i fondi in ogni transazione Bitcoin sono bloccati con un puzzle crittografico. Per essere precisi, abbiamo detto che Bitcoin è composto da "una sequenza di transazioni atomiche". Abbiamo notato che: "Ogni transazione è autenticata da un mittente con la soluzione a un precedente puzzle crittografico che è stato memorizzato come uno script. La nuova transazione è bloccata per il destinatario con un nuovo puzzle crittografico che è anche memorizzato come uno script". Questi script, che bloccano e sbloccano le transazioni, sono scritti in Bitcoin Script.

📖 Cos'è Bitcoin Script? Bitcoin Script è un linguaggio simile a Forth basato su stack che evita volutamente i loop e quindi non è Turing-completo. È composto da singoli opcode. Ogni singola transazione in Bitcoin è bloccata con uno script Bitcoin; quando la transazione di blocco per un UTXO viene eseguita con gli input corretti, quell'UTXO può essere speso.

Il fatto che le transazioni siano bloccate con script significa che possono essere bloccate in vari modi diversi, richiedendo una varietà di chiavi diverse. Infatti, abbiamo incontrato diversi meccanismi di blocco fino ad oggi, ognuno dei quali utilizzava diversi opcode:

Script di accesso nelle tue transazioni

Potresti non rendertene conto, ma hai già visto questi script di blocco e sblocco come parte delle transazioni raw con cui hai lavorato. Il modo migliore per esaminare questi script in modo più approfondito è quindi creare una transazione raw, quindi esaminarla.

Crea una transazione di prova

Per esaminare gli script di sblocco e blocco, crea una rapida transazione raw prendendo un UTXO Legacy non speso e reinviandolo a un indirizzo di resto Legacy, meno una commissione di transazione:

$ utxo_txid=$(bitcoin-cli listunspent | jq -r '.[1] | .txid') 
$ utxo_vout=$(bitcoin-cli listunspent | jq -r '.[1] | .vout')
$ recipient=$(bitcoin-cli -named getrawchangeaddress address_type=legacy)
$ rawtxhex=$(bitcoin-cli -named createrawtransaction inputs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout' } ]''' outputs='''{ "'$recipient'": 0.0009 }''')
$ signedtx=$(bitcoin-cli -named signrawtransactionwithwallet hexstring=$rawtxhex | jq -r '.hex')

In realtà non è necessario inviarlo: l'obiettivo è semplicemente produrre una transazione completa che puoi esaminare.

NOTA: Perché indirizzi legacy? Perché i loro script sono più significativi. Tuttavia, offriremo anche un esempio di un SegWit P2WPKH nativo nel Capitolo 9.5.

Esamina la tua transazione di prova

Ora puoi esaminare la tua transazione in modo approfondito utilizzando decoderawtransaction su $signedtx:

$ bitcoin-cli -named decoderawtransaction hexstring=$signedtx
{
  "txid": "34151dac704d94a269cd33f80be34c122152edc9bfbb9323852966bf0ce937ed",
  "hash": "34151dac704d94a269cd33f80be34c122152edc9bfbb9323852966bf0ce937ed",
  "version": 2,
  "size": 191,
  "vsize": 191,
  "weight": 764,
  "locktime": 0,
  "vin": [
    {
      "txid": "bb4362dec15e67d366088f5493c789f22fb4a604e767dae1f6a631687e2784aa",
      "vout": 0,
      "scriptSig": {
        "asm": "304402201cc39005b076cb06534cd084fcc522e7bf937c4c9654c1c9dfba68b92cbab7d1022066f273178febc7a37568e2e9f4dec980a2e9a95441abe838c7ef64c39d85849c[ALL] 0315a0aeb37634a71ede72d903acae4c6efa77f3423dcbcd6de3e13d9fd989438b",
        "hex": "47304402201cc39005b076cb06534cd084fcc522e7bf937c4c9654c1c9dfba68b92cbab7d1022066f273178febc7a37568e2e9f4dec980a2e9a95441abe838c7ef64c39d85849c01210315a0aeb37634a71ede72d903acae4c6efa77f3423dcbcd6de3e13d9fd989438b"
      },
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 0.00090000,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 06b5c6ba5330cdf738a2ce91152bfd0e71f9ec39 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a91406b5c6ba5330cdf738a2ce91152bfd0e71f9ec3988ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mg8S7F1gY3ivV9M9GrWwe6ziWvK2MFquCf"
        ]
      }
    }
  ]
}

I due script si trovano in due parti diverse della transazione.

Lo scriptSig si trova in vin. Questo è lo script di sblocco. È ciò che viene eseguito per accedere all'UTXO utilizzato per finanziare questa transazione. Ci sarà uno scriptSig per UTXO in una transazione.

Lo scriptPubKey si trova in vout. Questo è lo script di blocco. È ciò che blocca il nuovo output dalla transazione. Ci sarà uno scriptPubKey per output in una transazione.

📖 Come interagiscono scriptSig e scriptPubKey? Lo scriptSig di una transazione sblocca l'UTXO precedente; l'output di questa nuova transazione verrà quindi bloccato con uno scriptPubKey, che a sua volta può essere sbloccato dallo scriptSig della transazione che riutilizza quell'UTXO.

Leggi gli script nella tua transazione

Guarda i due script e vedrai che ognuno include due rappresentazioni diverse: hex è ciò che viene effettivamente memorizzato, ma il linguaggio assembly più leggibile (asm) può in un certo senso mostrarti cosa sta succedendo.

Dai un'occhiata a asm dello script di sblocco e avrai una prima occhiata a come appare Bitcoin Scripting:

04402201cc39005b076cb06534cd084fcc522e7bf937c4c9654c1c9dfba68b92cbab7d1022066f273178febc7a37568e2e9f4dec980a2e9a95441abe838c7ef64c39d85849c[ALL] 0315a0aeb37634a71ede72d903acae4c6efa77f3423dcbcd6de3e13d9fd989438b

Come capita, quel pasticcio di numeri è una firma a chiave privata seguita dalla chiave pubblica associata. O almeno si spera che sia così, perché è ciò che serve per sbloccare l'UTXO P2PKH che questa transazione sta utilizzando.

Leggi lo script di blocco e vedrai che è molto più ovvio:

OP_DUP OP_HASH160 06b5c6ba5330cdf738a2ce91152bfd0e71f9ec39 OP_EQUALVERIFY OP_CHECKSIG

Questo è il metodo standard in Bitcoin Script per bloccare una transazione P2PKH.

Il Capitolo 9.4 spiegherà come questi due script vanno insieme, ma prima dovrai sapere come vengono valutati gli script Bitcoin.

Esaminare una transazione diversa

Prima di abbandonare questa base, esamineremo un diverso tipo di script di blocco. Ecco scriptPubKey dalla transazione multisig che hai creato in Capitolo 6.1: Inviare una Transazione a un Indirizzo Multifirma.

      "scriptPubKey": {
        "asm": "OP_HASH160 a5d106eb8ee51b23cf60d8bd98bc285695f233f3 OP_EQUAL",
        "hex": "a914a5d106eb8ee51b23cf60d8bd98bc285695f233f387",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2N8MytPW2ih27LctLjn6LfLFZZb1PFSsqBr"
        ]
      }

Confrontalo con lo scriptPubKey della tua nuova transazione P2PKH:

    "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 06b5c6ba5330cdf738a2ce91152bfd0e71f9ec39 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a91406b5c6ba5330cdf738a2ce91152bfd0e71f9ec3988ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mg8S7F1gY3ivV9M9GrWwe6ziWvK2MFquCf"
        ]
      }

Queste due transazioni sono sicuramente bloccate in modi diversi. Bitcoin riconosce la prima come scripthash (P2SH) e la seconda come pubkeyhash (P2PKH), ma dovresti anche essere in grado di vedere la differenza nel diverso codice asm: OP_HASH160 a5d106eb8ee51b23cf60d8bd98bc285695f233f3 OP_EQUAL contro OP_DUP OP_HASH160 06b5c6ba5330cdf738a2ce91152bfd0e71f9ec39 OP_EQUALVERIFY OP_CHECKSIG. Questo è il potere dello scripting: può semplicemente produrre alcuni dei tipi di transazioni radicalmente diversi che hai imparato nei capitoli precedenti.

Riepilogo: comprendere le basi delle transazioni

Ogni transazione Bitcoin include almeno uno script di sblocco (scriptSig), che risolve un precedente puzzle crittografico, e almeno uno script di blocco (scriptPubKey), che crea un nuovo puzzle crittografico. C'è uno scriptSig per input e uno scriptPubKey per output. Ognuno di questi script è scritto in Bitcoin Script, un linguaggio simile a Forth che potenzia ulteriormente Bitcoin.

🔥 Qual è il potere degli script? Gli script sbloccano tutta la potenza degli Smart Contract. Con gli opcode appropriati, puoi prendere decisioni molto precise su chi può riscattare i fondi, quando possono riscattare i fondi e come possono riscattare i fondi. Regole più complesse per la spesa aziendale, la spesa di partnership, la spesa proxy e altre metodologie possono anche essere codificate all'interno di uno Script. Potenzia persino servizi Bitcoin più complessi come Lightning e sidechain.

Cosa c'è dopo?

Continua "Introduzione agli script Bitcoin" col Capitolo 9.2:Eseguire uno Script di Bitcoin.