Glosario / Direcciones y claves
Bech32
- ¿Qué es Bech32?
- Bech32 es la codificación de direcciones detrás de las cadenas de caracteres bc1q, un formato base32 en minúsculas cuya suma de comprobación de seis caracteres detecta cualquier error que afecte a hasta cuatro caracteres.
Se especifica en el BIP-173.
El BIP-173 introdujo bech32 en 2017 para reemplazar a Base58Check en las salidas SegWit. El alfabeto tiene 32 caracteres y omite deliberadamente "1", "b", "i" y "o" para que no se puedan confundir por error glifos parecidos, y ninguna cadena bech32 supera los 90 caracteres. Cuando una billetera rechaza una dirección en el instante en que usted termina de pegarla, lo que detectó el daño fue la suma de comprobación de bech32.
Cómo funciona
Una cadena bech32 tiene tres partes en un orden fijo: un prefijo legible por humanos, el separador "1" y una sección de datos que termina con seis caracteres de suma de comprobación. La mainnet usa el prefijo "bc", la testnet y la signet usan "tb", y la regtest usa "bcrt", así que las letras iniciales identifican la red antes de que una billetera decodifique nada más. El separador es también la razón por la que "1" falta en el alfabeto. Así solo puede aparecer una vez, en la frontera, y un analizador sintáctico encuentra el punto de corte escaneando desde la derecha.
La suma de comprobación es un código BCH calculado sobre toda la cadena de caracteres, prefijo incluido. El BIP-173 garantiza la detección de cualquier error que afecte como máximo a cuatro caracteres y sitúa la probabilidad de no detectar un error mayor por debajo de una entre mil millones. Base58Check no ofrece nada comparable: sus cuatro bytes finales son un hash truncado de doble SHA-256, que le dice a una billetera que algo está mal sin precisar qué.
La diferencia entre mayúsculas y minúsculas no tiene ningún significado. Una dirección bech32 es válida si está escrita toda en minúsculas o toda en mayúsculas, nunca con ambas mezcladas, y las billeteras muestran la forma en minúsculas. El BIP-173 pide mayúsculas dentro de los códigos QR, porque los caracteres alfanuméricos en mayúsculas dan acceso al modo alfanumérico de QR, que empaqueta cada carácter en 5,5 bits en lugar de los 8 que necesita el modo de bytes, y produce un patrón más grueso que la cámara de un teléfono capta más rápido.
Dónde aparece
Toda dirección bc1q es bech32. Una de 42 caracteres codifica un programa de testigo de 20 bytes y paga a una sola clave; una de 62 caracteres codifica un programa de 32 bytes y paga a un script. Ambas son de la versión de testigo 0, y la versión 0 es la única que ahora se le permite llevar a bech32.
La codificación también aparece fuera de las direcciones. Las facturas Lightning según BOLT11 la toman prestada con prefijos como "lnbc", y, a sabiendas, hacen caso omiso del límite de 90 caracteres, porque una factura lleva un hash de pago, un monto, una descripción y route hints (pistas de ruta) en lugar de un único programa corto.
Donde duele es en el formulario de retiro de un exchange. Un validador escrito antes de 2017 solo reconoce cadenas de caracteres Base58 y responde a una dirección bc1q perfectamente válida con "invalid address". Es una limitación de la plataforma y no de su billetera, y la solución es retirar a una dirección de un tipo que la plataforma sí acepte, derivada de la misma semilla, en lugar de buscar otro software.
Bech32 frente a Bech32m
Bech32 y bech32m se diferencian en una constante y en nada más. Ambos usan el mismo alfabeto, la misma estructura y los mismos seis caracteres de suma de comprobación. Bech32m cambia el valor que se combina con la suma de comprobación de 1 a 0x2bc830a3, y la línea divisoria la marca la versión de testigo: las salidas de versión 0 conservan bech32 y las versiones de la 1 a la 16 usan bech32m. El software que trata los dos como intercambiables aceptará cadenas de caracteres que debería rechazar, que es exactamente el fallo que el BIP-350 se escribió para evitar.
Bech32 frente a Base58Check
Bech32 y Base58Check son codificaciones rivales, no tipos de dirección rivales. Base58Check envuelve un byte de versión y un hash de 20 bytes con una suma de comprobación de cuatro bytes y produce las cadenas de caracteres que distinguen mayúsculas de minúsculas y empiezan por 1 y por 3. Bech32 codifica una versión de testigo junto con un programa de testigo y produce cadenas de caracteres que no distinguen mayúsculas de minúsculas y empiezan por bc1. Ninguna de las dos codificaciones decide en qué quedan bloqueadas las monedas. Lo que deciden es con qué fiabilidad puede una persona copiar la cadena de caracteres, qué tamaño debe tener el código QR y con cuánto ruido se queja el software cuando falta un carácter.