Nivel 5

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:

  1. Verificar que HASH160(pubKey del witness) == pubKeyHash del scriptPubKey
  2. 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

  1. El nodo ve OP_0 + 32 bytes, reconoce P2WSH
  2. Toma el último elemento del witness como witnessScript
  3. Verifica SHA256(witnessScript) == witnessScriptHash
  4. 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... no Bc1Q...
  • 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: bc para mainnet, tb para 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: mainnet
  • 1: separador
  • q: version 0
  • ar0srrr7xfkvy5l643lydnw9re59gtzz: pubKeyHash codificado
  • wf5mdq: 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.