Glosario / Referencia para desarrolladores
Suma de comprobación del descriptor
- ¿Qué es la suma de comprobación del descriptor?
- La suma de comprobación del descriptor es el código de ocho caracteres que sigue al signo # en un descriptor de salida, un código BCH que detecta errores de tecleo y de copia antes de que una billetera importe claves equivocadas.
Se especifica en el BIP-380.
El código va al final de un descriptor, tras un único signo #, en el mismo alfabeto de 32 caracteres que bech32. BIP-380 garantiza que se detecta cualquier error que afecte a tres símbolos o menos en un descriptor de hasta 49.154 caracteres, y un error aleatorio pasa inadvertido aproximadamente una vez de cada billón. Sin esa comprobación, un solo carácter erróneo en un respaldo multisig le deja observando direcciones que no contienen nada.
Cómo funciona
La suma de comprobación del descriptor es un código BCH calculado sobre el texto del descriptor, no un hash de ese texto, y de ahí salen sus garantías frente a errores. BIP-380 define un alfabeto de entrada de 95 caracteres y lo divide en tres grupos, y pone en el primero los caracteres sin protección propia: dígitos, corchetes, barras, el asterisco comodín y las minúsculas de la a a la h, que es donde caen las claves codificadas en hexadecimal y las rutas de derivación. La prosa de la especificación habla de tres grupos de 32, aunque su código de referencia usa 32, 32 y 31.
Cada carácter aporta un símbolo, su posición dentro de su grupo, y tras cada tercer símbolo se inserta un cuarto que lleva combinados los tres números de grupo, de modo que tres caracteres se expanden en cuatro símbolos. Un cambio que solo mueve un carácter dentro de su grupo, o que solo cambia el grupo en el que está, altera exactamente un símbolo. Por eso un error de mayúsculas y minúsculas cuenta exactamente como un error de un símbolo, y por eso siempre se detecta un solo carácter puesto en mayúscula.
Las garantías se reducen por escalones a medida que crece la cadena de caracteres. Un error de un símbolo siempre se detecta; dos o tres se detectan siempre hasta 49.154 caracteres, cuatro hasta 507 caracteres y cinco hasta 77 caracteres, y el código está afinado para minimizar los errores de cinco símbolos no detectados hasta 387. El archivo descriptors.md de Bitcoin Core cita el límite de cuatro errores en 501 caracteres en lugar de 507 y sitúa el riesgo residual en aproximadamente uno entre un billón. El descriptor de una sola clave de ese documento ocupa 140 caracteres, dentro de todos los límites; su ejemplo multiruta 2 de 3 ocupa 439, fuera de la ventana de cinco símbolos y dentro de la de cuatro.
Las claves extendidas ya se defienden solas. BIP-380 señala que una xpub se sale del primer grupo y lleva un mecanismo de suma de comprobación propio, de modo que una expresión de clave queda protegida dos veces.
Dónde aparece
Los vectores de prueba de BIP-380 son la forma más breve de ver una suma de comprobación del descriptor haciendo su trabajo. La cadena de caracteres válida es raw(deadbeef)#89f8spxm, y entre las variantes casi válidas que la especificación rechaza figuran la ausencia de suma de comprobación, un signo # sin nada detrás, una suma de comprobación de nueve caracteres, una suma de comprobación de siete caracteres, raw(deedbeef) con la suma de comprobación anterior sin tocar y una carga útil que usa un carácter fuera del alfabeto de entrada.
Bitcoin Core imprime la suma de comprobación cuando entrega un descriptor y la exige cuando lo recibe. Toda llamada RPC que devuelve un descriptor añade los ocho caracteres, mientras que solo algunas exigen la suma de comprobación al recibir uno, entre ellas deriveaddresses e importdescriptors. Para una línea escrita o editada a mano, la llamada RPC getdescriptorinfo devuelve la suma de comprobación correcta.
La suma de comprobación sigue siendo opcional para el análisis sintáctico, y BIP-380 permite que las aplicaciones rechacen los descriptores que no la lleven. Espere encontrarla cuando traslade una configuración multisig entre un coordinador, una máquina de repuesto y una hoja de papel: esos ocho caracteres son la única parte que corrobora que el resto llegó intacto.
Suma de comprobación del descriptor frente a bech32
Una suma de comprobación bech32 protege una dirección y una suma de comprobación del descriptor protege la definición de una billetera, y los tamaños en juego explican la diferencia de diseño. BIP-173 limita una cadena bech32 a 90 caracteres y dedica a la suma de comprobación los seis últimos caracteres de la parte de datos, sobre el mismo alfabeto de 32 símbolos. Un descriptor no tiene ese límite y además debe abarcar corchetes, comas, comillas y espacios, así que BIP-380 expande el texto en símbolos de posición con un símbolo de grupo intercalado y dedica ocho.
Ambas escriben ese resultado en el mismo alfabeto, qpzry9x8gf2tvdw0s3jn54khce6mua7l, y ahí empieza la confusión. Lo que falla es distinto. A una dirección bech32 que no supera su suma de comprobación no se le puede pagar; un descriptor que no supera la suya es una billetera que no se puede restaurar.