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 pilaOP_HASH160(0xa9): Aplica HASH160 al tope<pubKeyHash>: 20 bytes, el hash de la clave pública del receptorOP_EQUALVERIFY(0x88): Verifica igualdad, falla si no son igualesOP_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:
- Tomar el pubKeyHash (20 bytes)
- Añadir prefijo de versión: 0x00 para mainnet
- Calcular checksum: SHA256(SHA256(versión + pubKeyHash))[0:4]
- Concatenar: versión + pubKeyHash + checksum
- Codificar en Base58
El resultado es una dirección que empieza por "1" y tiene 25-34 caracteres.