Nivel 5

P2PKH (Pay-to-Public-Key-Hash)

El script clásico de Bitcoin. Direcciones que empiezan por 1. Sencillo, probado, pero menos eficiente que las alternativas modernas.

El estándar original

P2PKH (Pay-to-Public-Key-Hash) es el tipo de transacción que Satoshi diseñó originalmente para Bitcoin. Las direcciones que empiezan por "1" (como 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2) son direcciones P2PKH.

Aunque hoy existen alternativas más eficientes (SegWit, Taproot), P2PKH sigue siendo válido y hay billones de dólares en UTXOs P2PKH.

El script de bloqueo (scriptPubKey)

OP_DUP OP_HASH160 <20 bytes: pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

Desglosado:

  • OP_DUP (0x76): Duplica el tope de la pila
  • OP_HASH160 (0xa9): Aplica HASH160 al tope
  • <pubKeyHash>: 20 bytes, el hash de la clave pública del receptor
  • OP_EQUALVERIFY (0x88): Verifica igualdad, falla si no son iguales
  • OP_CHECKSIG (0xac): Verifica la firma

En hexadecimal, un scriptPubKey P2PKH típico: 76a914<20 bytes pubKeyHash>88ac

El script de desbloqueo (scriptSig)

Para gastar un output P2PKH, el scriptSig proporciona: <signature> <pubKey>

La firma es típicamente 71-72 bytes (DER + sighash byte). La clave pública es 33 bytes (comprimida) o 65 bytes (sin comprimir).

Ejecución completa

Estado inicial de la pila: vacía

Push <signature> (del scriptSig) Pila: [sig] Push <pubKey> (del scriptSig) Pila: [sig, pubKey] OP_DUP (del scriptPubKey) Duplica pubKey Pila: [sig, pubKey, pubKey] OP_HASH160 Hashea la copia de pubKey Pila: [sig, pubKey, hash(pubKey)] Push <pubKeyHash> (del scriptPubKey) Pila: [sig, pubKey, hash(pubKey), expectedHash] OP_EQUALVERIFY ¿hash(pubKey) == expectedHash? Si no: FALLO INMEDIATO Si sí: elimina ambos valores Pila: [sig, pubKey] OP_CHECKSIG ¿sig es válida para pubKey sobre esta transacción? Si sí: empuja TRUE Si no: empuja FALSE Pila: [TRUE] o [FALSE]

Resultado final: si TRUE, el gasto es válido

Por qué hashear la clave pública

Podrías preguntarte: ¿por qué no bloquear directamente a la clave pública (P2PK) en vez del hash?

De hecho, las primeras transacciones de Bitcoin eran P2PK. Pero P2PKH tiene ventajas:

Direcciones más cortas

Una clave pública comprimida tiene 33 bytes. Su HASH160 tiene 20 bytes. Direcciones más cortas son más prácticas.

Protección extra ante futuros ataques

La clave pública solo se revela cuando gastas. Mientras no gastes, solo el hash es público.

Si algún día se encontrara una forma de derivar claves privadas de claves públicas (por ejemplo, con computación cuántica), los UTXOs P2PKH no gastados seguirían protegidos por la capa adicional del hash.

Esto no es protección perfecta (eventualmente tienes que gastar y revelar la clave), pero añade una capa de defensa en profundidad.

Tamaño y costes

Un input P2PKH típico ocupa:

  • scriptSig: ~107 bytes (firma + pubKey)
  • Outpoint + sequence: 40 bytes

Un output P2PKH ocupa:

  • Value: 8 bytes
  • scriptPubKey: 25 bytes (1 + 1 + 1 + 20 + 1 + 1)

Comparado con P2WPKH (SegWit), P2PKH paga más fees porque el scriptSig cuenta como datos "base" (4 WU por byte), mientras que el witness de P2WPKH solo cuenta 1 WU por byte.

Cuándo usar P2PKH hoy

En general, no deberías crear nuevos outputs P2PKH si tu wallet soporta SegWit o Taproot. Las alternativas modernas son más baratas y ofrecen mejores propiedades.

Sin embargo, P2PKH sigue siendo útil para:

  • Compatibilidad con sistemas muy antiguos
  • Gastar UTXOs P2PKH existentes (no tienes opción del tipo de input)
  • Situaciones específicas donde el receptor solo soporta legacy

Direcciones P2PKH

Las direcciones P2PKH usan codificación Base58Check:

  1. Tomar el pubKeyHash (20 bytes)
  2. Añadir prefijo de versión: 0x00 para mainnet
  3. Calcular checksum: SHA256(SHA256(versión + pubKeyHash))[0:4]
  4. Concatenar: versión + pubKeyHash + checksum
  5. Codificar en Base58

El resultado es una dirección que empieza por "1" y tiene 25-34 caracteres.