Pay-to-Pubkey Hash
Pay-to-PubKey-Hash (Pay-to-Public-Key-Hash, P2PKH) è la forma di base per fare una transazione ed è la forma più comune di transazione sulla rete di Bitcoin. Le transazioni che pagano a un indirizzo Bitcoin contengono script P2PKH che sono risolti inviando la chiave pubblica e una firma digitale creata dalla corrispondente chiave privata.
ScriptPubKey e ScriptSig per transazione sono mostrati sotto:
Revsione di Pay-to-PubKey-Hash
Due tipi di pagamento sono denominati P2PK (pay to public key) e P2PKH (pay to public key hash).
Poi Satoshi ho deciso di usare P2PHK invece di P2PK per due motivi:
- La crittografia a curva ellittica (la crittografia usata dalla chiave pubblica e da una chiave privata) è vulnerabile ad un algoritmo modificato di Shor per risolvere il problema del logaritmo discreto sulle curve ellittiche. In inglese normale, significa che in futuro un computer quantistico potrebbe essere in grado di recuperare una chiave privata da una chiave pubblica. Pubblicando la chiave pubblica solo quando le monete sono spese (e supponendo che gli indirizzi non siano riutilizzati), tale attacco viene reso inefficace.
- Con l’hash più piccolo (20 byte) è più facile da stampare e più facile da incorporare in piccoli mezzi di archiviazione come i codici QR.
Un indirizzo di Bitcoin è solo un hash, quindi il mittente non può fornire una chiave pubblica completa in scriptPubKey. Quando le monete che sono state inviate a un indirizzo di Bitcoin, il destinatario fornisce sia la firma che la chiave pubblica. Il script verifica che la chiave pubblica fornita fa hash all’hash in scriptPubKey, e poi controlla anche la firma contro la chiave pubblica.
Controllo processo:
Stack | Script | descrizione |
---|---|---|
Vuoto. | <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG | scriptSig e scriptPubKey sono combinati. |
<sig> <pubKey> | OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG | Le costanti sono aggiunte alla stack. |
<sig> <pubKey> <pubKey> | OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG | L’elemento della stack superiore è duplicato. |
<sig> <pubKey> <pubHashA> | <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG | L’elemento della stack in alto è tratteggiato. |
<sig> <pubKey> <pubHashA> <pubKeyHash> | OP_EQUALVERIFY OP_CHECKSIG | Aggiunto costante. |
<sig> <pubKey> | OP_CHECKSIG | L’uguaglianza è controllata tra i due elementi principali della stack. |
vero | Vuoto. | La firma è controllata per i due elementi principali della stack. |
Esempio di Pay-to-PublicKey Hash
Le figure qui sotto aiutano ad illustrare come queste caratteristiche sono utilizzate mostrando il flusso di lavoro che Alice usa per inviare a Bob una transazione e che Bob USA successivamente per spendere quella transazione. Sia Alice e Bob useranno la forma più comune del tipo di transazione standard di Pay-To-Public-Key-Hash (P2PKH).
Bob deve prima generare una coppia di chiavi privato/pubblico prima che Alice possa creare la prima transazione. Bitcoin usa l’algoritmo di firma digitale della curva ellittica (ECDSA) con la curva secp256k1; i tasti privati secp256k1 sono 256 bit di dati casuali. Una copia di tali dati viene trasformata in chiave pubblica secp256k1. Poiché la trasformazione può essere ripetuta in modo affidabile in seguito, la chiave pubblica non deve essere memorizzata.
La chiave pubblica (pubkey) viene poi crittografata. Questo pubkey hash può anche essere ripetuto in modo affidabile più tardi, quindi non ha anche bisogno di essere memorizzato. L’hash accorcia e offusca la chiave pubblica, semplificando la trascrizione manuale e fornendo sicurezza contro i problemi non pianificati che potrebbero consentire la ricostruzione di chiavi private da dati chiave pubblici in un momento successivo.
Bob fornisce l’hash pubkey ad Alice. Gli hash Pubkey sono quasi sempre inviati codificati come indirizzi Bitcoin, che sono stringhe codificate base58 contenenti un numero di versione indirizzo, l’hash, e un checksum di rilevamento errori per catturare i dypos. L’indirizzo può essere trasmesso attraverso qualsiasi mezzo, inclusi mezzi a senso unico che impediscono allo spender di comunicare con il ricevitore, e può essere ulteriormente codificato in un altro formato, come un codice QR contenente un bitcoin: URI. Una volta che Alice ha l’indirizzo e lo decodifica in un hash standard, puo ‘ creare la prima transazione. Lei crea un output di transazione standard P2PKH contenente istruzioni che permettono a chiunque di spendere quell’output se possono dimostrare di controllare la chiave privata corrispondente alla chiave pubblica hashed di Bob. Queste istruzioni sono chiamate script pubkey o scriptPubKey.
Alice trasmette la transazione e viene aggiunta alla catena di blocchi. La rete lo categorizza come un output di Transazione Non speso (UTXO), e il portafoglio software di Bob lo visualizza come un equilibrio spendibile. Quando, un po ‘ di tempo dopo, Bob decide di spendere L’UTXO, deve creare un input che faccia riferimento alla transazione Alice creata dal suo hash, chiamata Transaction Identifier (txid), e all’output specifico usato dal suo numero di indice (indice di produzione). Deve quindi creare uno script di firma-una raccolta di parametri di dati che soddisfano le condizioni poste da Alice nello script pubkey dell’output precedente. Gli script di firma sono anche chiamati scripting.