P2WPKH y P2WSH (Native SegWit)
El estándar moderno para transacciones Bitcoin. Direcciones bc1q, fees reducidas, y el encoding Bech32.
SegWit nativo vs envuelto
SegWit puede usarse de dos formas:
- Envuelto en P2SH: Direcciones que empiezan por 3. Compatible con wallets legacy.
- Nativo: Direcciones que empiezan por bc1q. Más eficiente, requiere soporte SegWit.
Esta página cubre SegWit nativo, definido en BIP 141 y BIP 143.
P2WPKH: el equivalente SegWit de P2PKH
P2WPKH (Pay-to-Witness-Public-Key-Hash) es la versión SegWit del clásico P2PKH.
ScriptPubKey
OP_0 <20 bytes: pubKeyHash>
En hexadecimal: 0014<20 bytes pubKeyHash>
Solo 22 bytes. OP_0 indica witness version 0. Los 20 bytes son el hash de la clave pública.
Witness
En vez de scriptSig, los datos van en el witness: <signature> <pubKey>
El scriptSig está vacío (0 bytes).
Ejecución
El nodo ve OP_0 seguido de 20 bytes y reconoce el patrón P2WPKH. Aplica la lógica equivalente a P2PKH pero usando los datos del witness:
- Verificar que HASH160(pubKey del witness) == pubKeyHash del scriptPubKey
- Verificar que la firma es válida para la pubKey
Ventaja de fees
En P2PKH, la firma (~72 bytes) y pubKey (~33 bytes) van en el scriptSig, contando 4 WU por byte.
En P2WPKH, van en el witness, contando 1 WU por byte.
Resultado: ~30% menos fees para la misma operación.
P2WSH: scripts complejos en SegWit
P2WSH (Pay-to-Witness-Script-Hash) es la versión SegWit de P2SH, para scripts más complejos que un simple pago a clave pública.
ScriptPubKey
OP_0 <32 bytes: witnessScriptHash>
Nota: P2WSH usa SHA256 directamente (32 bytes), no HASH160 (20 bytes). Esto aumenta la seguridad del hash.
En hexadecimal: 0020<32 bytes witnessScriptHash>
Witness
<elementos que satisfacen el witnessScript> <witnessScript>
Ejecución
- El nodo ve OP_0 + 32 bytes, reconoce P2WSH
- Toma el último elemento del witness como witnessScript
- Verifica SHA256(witnessScript) == witnessScriptHash
- Ejecuta el witnessScript con los elementos anteriores del witness
Ejemplo: multisig 2-de-3
WitnessScript: OP_2 <pubKey1> <pubKey2> <pubKey3> OP_3 OP_CHECKMULTISIG
Witness para gastar: <> <sig1> <sig2> <witnessScript>
El elemento vacío inicial es por el bug histórico de CHECKMULTISIG.
Encoding Bech32 (BIP 173)
Las direcciones SegWit nativas usan un nuevo formato de encoding llamado Bech32.
Características
- Solo minúsculas (o solo mayúsculas):
bc1q...noBc1Q... - Sin caracteres confusos: no usa 1, b, i, o (fáciles de confundir con otros)
- Detección de errores mejorada: detecta hasta 4 errores, localiza hasta 2
- Prefijo legible:
bcpara mainnet,tbpara testnet
Estructura
bc1q[datos codificados][checksum de 6 caracteres]
El q después de bc1 indica witness version 0. Las direcciones Taproot usan p (version 1).
Ejemplo
bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq
bc: mainnet1: separadorq: version 0ar0srrr7xfkvy5l643lydnw9re59gtzz: pubKeyHash codificadowf5mdq: checksum
Comparativa de tamaños
| Tipo | ScriptPubKey | Input (aprox) | Fees relativas | |------|--------------|---------------|----------------| | P2PKH | 25 bytes | 148 bytes | 100% | | P2SH-P2WPKH | 23 bytes | 91 bytes | ~80% | | P2WPKH | 22 bytes | 68 bytes | ~68% | | P2WSH (2-de-3) | 34 bytes | ~140 bytes | Varía |
Cuándo usar cada uno
P2WPKH: Para pagos simples a una sola clave. Es el estándar actual para uso general.
P2WSH: Para scripts complejos: multisig, timelocks, contratos.
P2TR (Taproot): La evolución más reciente. Mejor privacidad y eficiencia para casos complejos. Debería preferirse cuando está soportado.
Soporte en el ecosistema
En 2025, la gran mayoría de wallets y servicios soportan SegWit nativo:
- Todas las hardware wallets principales
- Sparrow, Blue Wallet, Electrum
- Exchanges principales (Kraken, Coinbase, Binance, etc.)
Si tu wallet o servicio no soporta bc1q, considera actualizarte.