Autor: SJORS PROVOOST

Fuente: https://sprovoost.nl/2022/11/10/what-is-a-bitcoin-address/

Una dirección de Bitcoin no forma parte de la cadena de bloques de Bitcoin, sino que es un token que el software de Bitcoin (billetera) utiliza para comunicar dónde enviar los Bitcoins: ya sea a una determinada clave pública (P2PK) o a un hash de una clave pública (P2PKH). , un hash de un script (P2SH), un hash de una clave pública de SegWit (P2WPKH) o un hash de un script de SegWit (P2WSH). La dirección también contiene algunos metadatos sobre su tipo.

(Nota del traductor: Los tipos de direcciones de Bitcoin seguirán aumentando con la actualización de la red Bitcoin y la estandarización de los métodos de secuencias de comandos. De hecho, los tipos de direcciones mencionados anteriormente, excepto P2PK y P2PKH, aparecieron con el lanzamiento inicial de Bitcoin. , el resto llegó más tarde. Ahora, debido a la actualización de Taproot activada en 2021, Bitcoin tiene otro tipo de dirección "P2TR").

Las direcciones de Bitcoin utilizan un sistema de numeración único para expresar los métodos de pago anteriores. Este artículo presentará cada uno de estos diferentes sistemas de numeración y proporcionará un análisis en profundidad de las ventajas de las direcciones Bitcoin en general y de las direcciones bech32. Además, explicaremos de dónde vino la vulnerabilidad (menor amenaza) contenida en la primera versión de las direcciones bech32 y cómo se resolvió. Finalmente, abordamos el impacto de la computación cuántica.

- Este artículo está extraído de mi nuevo libro "Bitcoin: Investigación inconclusa" -

antecedentes historicos

Cuando envías Bitcoin a alguien, básicamente estás creando una transacción con múltiples entradas y al menos una salida. Los productos especifican quién puede gastarlos mediante restricciones incorporadas (legalmente llamadas gravámenes, que limitan la transferencia de propiedad de un activo).

La carga más trivial es permitir que cualquiera gaste los bitcoins. Esto no es una buena idea porque el Bitcoin será robado rápidamente. Por lo tanto, en los primeros días del desarrollo de Bitcoin, la gran mayoría de Bitcoins en la cadena de bloques solo podían usar dos restricciones: Pay-to-Public-Key (P2PK) o Pay-to-Public-Key-Hash (P2PKH). El primero puede entenderse como "Sólo aquellos que poseen la clave privada correspondiente a la clave pública pueden gastar Bitcoin".

En ese momento, también podíamos enviar Bitcoin a la dirección IP del destinatario, pero esta función se suspendió en 2012. Para usarlo, debe conectarse a la dirección IP del beneficiario, solicitar la clave pública al beneficiario y el beneficiario le dará la clave pública1. Luego, su billetera creará Bitcoins con el script P2PK.

Este flujo de trabajo parecería un poco extraño hoy en día2, pero se ajustaba al patrón común de las aplicaciones peer-to-peer como Napster y Kazaa en ese momento, que consistía en conectarse directamente con otras personas y descargar cosas de ellas. Hoy en día, lo más probable es que no conozcas la dirección IP de tu amigo y, si está usando un dispositivo móvil, su dirección IP puede incluso cambiar todo el tiempo. Aunque puede indicarle a su nodo Bitcoin que se conecte específicamente a los nodos de sus amigos, en general solo se conectará a nodos aleatorios; consulte el Capítulo 2.

El método de transacción más común es similar a una transferencia bancaria. El destinatario le proporciona una dirección y usted envía bitcoins a esta dirección, tal como enviaría dinero a una cuenta bancaria. Inicialmente, todos usábamos P2PKH como dirección (el significado de P2PKH se explica a continuación).

De esta manera, la transacción no se envía directamente al beneficiario, sino que se transmite a través de todos los nodos de la red y, finalmente, el nodo minero la descubre y la empaqueta en un bloque. Es posible que el nodo de su contraparte haya visto la transacción desde un nodo par o haya recibido el bloque en el que se produce la transacción.

El tercer método de transacción es la minería, enviándose a usted mismo las recompensas en bloque obtenidas de la minería. Inicialmente, el software Bitcoin tenía integrado un software de minería. Entonces, tan pronto como descargue el software Bitcoin, su software Bitcoin comenzará a minar y luego enviará los Bitcoins a su billetera; en este caso no hay necesidad de intercambiar direcciones. Todos estos Bitcoins utilizan P2PK como restricción 3.

¿Cuál es la dirección?

Las direcciones son una forma conveniente de indicar qué script debe ingresar a la cadena de bloques. Como dijimos anteriormente, el propósito del script es imponer restricciones a los Bitcoins y permitir que solo el destinatario los gaste4. La dirección en sí no existe en la cadena de bloques y ni siquiera contiene un script completo.

De los dos tipos de scripts más utilizados en el pasado, las direcciones sólo se utilizaban para Pay-to-Public-Key-Hash (P2PKH). Cuando una billetera ve dicha dirección, genera un script que requiere que la persona que gasta los bitcoins en ella tenga la clave pública correspondiente para ese hash (el script real se proporciona en el Capítulo 10). Sólo el hash se hace público y la clave pública permanece secreta hasta que el destinatario gasta los bitcoins.

Las direcciones P2PKH comienzan con el número 1, seguido del hash de la clave pública. La dirección está codificada en base58, como se muestra en el siguiente ejemplo:

1HLoFgMiDL3hvACAfbkDUjcP9r9veUcqAF

¿Qué es el sistema Base?

Para comprender base58, primero debemos comprender los principios básicos del sistema base.

Tomemos como ejemplo base10, considérelo como tus 10 dedos. Entonces si quisieras expresar el número 115 (1, 1, 5), harías tres gestos con ambas manos correspondientes a 1, 1, 5. Desde que los humanos inventaron las tablillas de arcilla y el papel, también puedes escribir estos números con un bolígrafo, lo cual es mucho más conveniente que usar los dedos. Por lo tanto, base10 es un sistema decimal que utiliza 10 símbolos diferentes, utilizando varias combinaciones de estos 10 símbolos para expresar cualquier número (entero).

Más allá de eso, existen muchos sistemas básicos diferentes. Por ejemplo, los antiguos babilonios usaban base60. Para leer el código de máquina, normalmente usamos hexadecimal, también conocido como base16, usando los 16 caracteres, dígitos del 0 al 9 y letras de la A a la F. Mientras tanto, dentro de las computadoras, se prefiere la base2 (un sistema numérico binario) porque los transistores solo tienen dos estados: encendido y apagado. Esto significa que todo se hace con sólo dos números, 0 y 1, y puedes usarlos para representar cualquier número.

Satoshi Nakamoto introdujo el sistema base58, que utiliza 58 símbolos diferentes: los números del 0 al 9 y la mayoría de las letras minúsculas y mayúsculas del alfabeto. Sin embargo, algunas letras y números que los usuarios pueden confundir y identificar erróneamente fácilmente no están incluidos, por ejemplo, el número 0 y la O mayúscula, y la I mayúscula y la l minúscula.

¿Alguna vez has visto el código fuente de un archivo adjunto de correo electrónico? Un montón de números extraños. Esto es base64 y base58 nace sobre la base de bas64. Sin embargo, base64 contiene caracteres como guión bajo, signo más, signo igual y barra diagonal. base58 elimina estos caracteres, lo que facilita la inspección visual y se puede aplicar de forma eficaz a las URL.

Base58 y pago por hash de clave pública

¿Qué tiene esto que ver con P2PKH? Las direcciones P2PKH comienzan con 1, seguido del hash de clave pública codificado en base58.

Esta es la información que necesita enviar a otra persona cuando desea recibir Bitcoin de ella. También puedes simplemente enviarles 0x005 y la clave pública. Tal vez puedan traducir con éxito 0x00, pero lo más probable es que no.

En teoría, podrías enviarle a otra persona un script de Bitcoin expresado en hexadecimal (el formato utilizado en la cadena de bloques) porque los scripts de Bitcoin son mensajes binarios. En la cadena de bloques, un script de Bitcoin como este significaría: "Si esta persona tiene el hash de clave pública correcto y la clave pública correspondiente, puede gastar este Bitcoin. Si desea profundizar más, se describe cómo funciona el script de Bitcoin". en el Capítulo 10.

Aunque hay tantas representaciones para elegir, la gente suele elegir formatos de dirección estandarizados. Esto explica por qué todas las direcciones tradicionales de Bitcoin comienzan con 1 y tienen aproximadamente la misma longitud.

Además de usarse para enviar direcciones de Bitcoin, base58 también se puede usar para pasar claves privadas. En este caso, el símbolo inicial es 5 (que representa 128 como byte de versión), seguido de la clave privada.

En el pasado, los usuarios utilizaban carteras de papel que podían imprimirse. Si se generan de forma segura y sin puertas traseras, entonces el documento tiene una cadena que comienza con "1" en un lado y una cadena que comienza con "5" en el otro lado, con la nota de que solo se pueden presentar direcciones de Bitcoin, la clave privada debe no ser compartido.

También hay direcciones que comienzan con "3", lo que significa que los Bitcoins están bloqueados en el hash del script, no en el hash de la clave pública. Presentaremos Pay to Script Hash (P2SH) en el Capítulo 10. Estas direcciones suelen ser direcciones multifirma, pero también pueden ser direcciones SegWit6.

Aunque las direcciones base58 funcionan bien, hay margen de mejora. Entonces tenemos bech32.

aparece bech32

En marzo de 2017, Pieter Wuille habló sobre un nuevo formato de dirección: bech32. Bech32 se ha utilizado desde la activación exitosa de SegWit. Como sugiere el nombre, bech32 es un sistema base32. Es decir, puedes utilizar casi todas las letras y todos los números, excepto algunos que pueden causar confusión.

Vídeo explicativo: https://youtu.be/NqiN9VFE4CU

La mayor diferencia entre bech32 y base58 es que las letras mayúsculas y minúsculas no se mezclan. Cada letra solo aparecerá una vez (ya sea en mayúsculas o en minúsculas), por lo que será mucho más fácil de leer. La correlación precisa entre cada letra o número y su valor correspondiente es fija, pero más bien arbitraria: Q sólo significa 0, P sólo significa 1, sin ningún significado profundo detrás de ello.

- mesa de mapeo bech32. Por ejemplo, q significa 0 y 3 significa 17 (1+16) -

Una dirección bech327 consta de dos partes separadas por "1", por ejemplo, bc1q9kdcd08adkhg35r4g6nwu8ae4nkmsgp9vy00gf.

La primera mitad es legible intencionalmente, por ejemplo, "bc" (para Bitcoin) o "Inbc" (Lightning Network en Bitcoin). Los valores representados por letras como "b" y "c" no tienen significado. Sólo existen para que la gente los reconozca: "Entendido, si la dirección comienza con 'bc', se refiere a Bitcoin como criptomoneda. Sin embargo, la billetera verificará si estos valores existen como verificación de credibilidad, y estos valores". También se incluyen en la suma de comprobación.

"1" es sólo un carácter delimitador y no representa ningún valor. Si observa la tabla de mapeo de bech32, verá que "1" no está incluido, lo que significa "omitirlo".

La segunda mitad comienza con el número de versión de SegWit. La versión 0 está representada por Q(bc1q…) (ver Capítulo 3). La versión 1 es lo que llamamos Taproot (consulte la Parte 4 de este libro), representada por "P" (bc1p...). En el caso de la versión 0 de SegWit, el número de versión irá seguido de 20 o 32 bytes, que representan el hash de clave pública o el hash del script, respectivamente. La diferencia de longitud se debe a que SegWit utiliza el hash SHA256 del script (32 bytes) en lugar del hash RIPEMD160 del script (20 bytes).

En base58, el hash del script tiene la misma longitud que el hash de la clave pública. Pero en SegWit, las longitudes de los dos son diferentes. Entonces, con solo mirar la longitud de la dirección, puedes saber inmediatamente si estás pagando por un script o por un hash de clave pública. Por cierto, Taproot elimina esta diferencia de longitud, mejorando aún más la privacidad.

Por lo tanto, bench32 se caracteriza por utilizar solo 32 caracteres para la segunda mitad de la dirección y, por lo demás, no se diferencia mucho de base58. Vea esta función y sabrá: "Ajá, esta es una dirección P2PKH". En este caso, Pay-to-Witness-Public-Key-Hash (P2WPKH), donde "Testigo" se refiere a SegWit, pero la idea central Sigue siendo el mismo: las personas y las computadoras pueden identificar el tipo de dirección basándose en un prefijo corto seguido de un hash de una clave pública o script.

Juego de dardos de 32 dimensiones.

Sin embargo, la simplicidad no es la única ventaja. Otra ventaja es la corrección de errores, al menos la detección de errores.

Si ingresa la dirección incorrecta, lo peor que puede pasar es que envíe Bitcoin al hash de clave pública incorrecto. Cuando el destinatario intenta gastar Bitcoin, encontrará que el hash de su clave pública no coincide con los requisitos de la cadena de bloques porque el remitente ingresó antes la dirección incorrecta. Este Bitcoin nunca será recuperado.

Afortunadamente, la dirección base58 tiene una suma de verificación al final. De esta manera, si ingresa una dirección incorrecta, la verificación de la suma de verificación al final de la dirección fallará. Su billetera le alertará y se negará a enviar la transacción (la cadena de bloques no lo protegerá, pero su billetera sí). Sin embargo, si tienes mucha mala suerte, es posible obtener la suma de comprobación correcta incluso si cometes un error.

Bech32 está diseñado para evitar coincidencias tan extremas. Además, Bech32 no sólo te dice si cometiste un error, sino también dónde lo cometiste. El método específico consiste en tomar todos los bytes de la dirección y aplicarles un hash utilizando alguna fórmula matemática compleja. Incluso si comete 4 errores, Bech32 seguirá sabiendo dónde cometió el error y cuál es el valor real. Si cometes más de 4 errores, Bech32 no podrá hacer nada.

Ilustremos con una analogía: dibujas un montón de círculos que no se superponen en una pared. La diana de cada círculo representa un valor correcto, mientras que los otros puntos dentro del círculo representan un error de entrada. Si eres un jugador experto en dardos, la mayoría de las veces darás en el blanco, lo que significa que has perdido el valor correcto. Si falla ligeramente en la diana, pero aún así cae dentro del círculo, eso significa que el valor que ingresó está ligeramente fuera de lugar. La comprobación de errores es saber que no has dado en el blanco. La corrección implica mover el dardo a la diana más cercana.

La idea aquí es que quieras hacer el círculo lo más ancho posible para acomodar a los jugadores de dardos más descuidados, pero no quieres desperdiciar demasiado espacio. Del mismo modo, no queremos que una dirección Bitcoin tenga cientos de caracteres. Este es el problema de optimización favorito de los matemáticos.

A diferencia de una pared 2D, bech32 es como una pared 32D con una hiperesfera 32D. Cuando ingresas tu dirección, hay una ligera desviación en algún lugar dentro de este espacio de 32 dimensiones, pero no importa cómo se vea, todavía estás dentro de esta hiperesfera. En este caso, su billetera sabe lo que está mal y puede prevenir efectivamente la pérdida de Bitcoins causada por el envío a una dirección incorrecta8.

vulnerabilidad bech32

En 2019, la gente descubrió que si el último carácter de una dirección de bech32 es P y accidentalmente ingresa una o más Q más tarde, la verificación de la suma de verificación aún se aprobará y no recibirá un mensaje de error de entrada. El software de su billetera pensará que la dirección se ingresó correctamente, lo que le permitirá enviar el Bitcoin a la dirección incorrecta, lo que provocará que el Bitcoin no se pueda gastar, como explicamos anteriormente.

La buena noticia es que bech32 solo funciona con SegWit y las direcciones SegWit tienen un límite de longitud: solo pueden tener 20 o 32 bytes. Afortunadamente, si ingresa una Q adicional después de una dirección de 20 o 32 bytes de longitud, la dirección que ingrese no será válida porque excede el límite de longitud. Su billetera notará este problema y se negará a enviar los bitcoins. Originalmente se consideró introducir un límite de longitud de dirección similar para Taproot, pero la solución que se menciona a continuación elimina esta necesidad. La longitud flexible de la dirección nos ayudará a mejorar Taproot en el futuro.

Nace bech32m

Para solucionar las vulnerabilidades de bech32, se propuso un nuevo estándar llamado bech32m9. bech32m es en realidad un cambio muy simple: se agrega un número adicional a la fórmula de suma de verificación de bech32 para garantizar que cualquier carácter adicional genere una suma de verificación no válida.

Este nuevo estándar solo se aplica a direcciones Taproot y direcciones futuras. Nada cambia para las direcciones SegWit, ya que ya están protegidas por un límite de longitud de 20 o 32 bytes. Al momento de escribir este artículo, la mayoría del software de billetera admite el nuevo estándar bech32m.

¿Qué me hizo deshacerme de la ansiedad y enamorarme de la computación cuántica?

Por cierto, Pay-to-Public-Key-Hash (P2PKH) se considera más resistente a los ataques cuánticos porque no es necesario revelar su clave pública. La desventaja era que los hashes ocupaban más espacio, pero esto no fue un problema en ese momento porque los bloques no estaban ni cerca de llenos.

A mucha gente le preocupa que las computadoras cuánticas eventualmente socaven la seguridad de la criptografía de Bitcoin, dando a los piratas informáticos cuánticos la oportunidad de robar Bitcoins. Si logran robar millones de Bitcoins, incluso podría provocar una caída del mercado.

El problema es que a pesar de la adopción generalizada de P2PKH, las claves públicas de entre 5 y 10 millones de esos Bitcoins se han hecho públicas. Irónicamente, con tantos Bitcoins vulnerables a los hackers cuánticos, no tiene mucho sentido intentar proteger los Bitcoins restantes de esta manera. Incluso si sus Bitcoins están protegidos contra el robo porque usa P2PKH, inevitablemente perderán su valor debido al colapso de los precios.

El físico Stepan Snigirev y el matemático Andrew Poelstra explican el potencial de que los ataques cuánticos tengan consecuencias devastadoras a corto plazo y las posibles contramedidas en dos episodios del podcast titulado What Bitcoin Did.

El espacio en bloque se está volviendo muy escaso, por lo que no tener que almacenar hashes de clave pública en un espacio de bloque valioso ayuda a los usuarios a ahorrar dinero. Es por eso que en la nueva bifurcación suave Taproot (consulte la Parte 4 de este libro), la dirección de Bitcoin vuelve a ser P2PK10. Tenga en cuenta que el uso de direcciones Taproot no es obligatorio, por lo que si no está de acuerdo con el razonamiento anterior, puede optar por no utilizar Taproot.

nota

1. Para satisfacer la curiosidad de los entusiastas de la “arqueología” del código: el nodo emisor tendrá un cuadro de diálogo de interfaz de usuario que indicará el monto de la transferencia y la dirección IP. La función StartTransfer() crea una transacción de cheque en blanco en la que la orden de cheque en el nodo destinatario inserta un script P2PK (como scriptPubKey). OnReply2() luego inserta el monto, firma la transacción, la devuelve al receptor y la transmite. código fuente. ↩

2. Y no es seguro, Satoshi Nakamoto también lo admitió. ↩

3. ¿Por qué la versión lanzada originalmente por Satoshi Nakamoto admitía tanto P2PK como P2PKH? No estamos seguros exactamente de por qué. El método de pago P2PK en realidad solo se usa para pagar direcciones IP y recompensas en bloque a los mineros. Ninguno requiere interacción humana. En escenarios que involucran interacción humana, los usuarios usan P2PKH. La dirección utilizada se refiere a P2PKH, no a P2PK. Los sistemas automatizados no necesitan el concepto de direcciones porque también pueden manejar scripts, por lo que no hay necesidad de conceptos como direcciones P2PK. ↩

4. Hasta ahora, el guión ha sido similar a una cuenta bancaria. Como aprenderemos en el Capítulo 10, los guiones hacen mucho más que simplemente retener dinero para el propietario. ↩

5. Generalmente se usa un par de números hexadecimales con el prefijo 0x para representar un byte, que puede representar 16 × 16 = 256 valores diferentes. Por tanto, 0x00 representa un byte y su valor es 0. ↩

6. Como se explicó en el Capítulo 3, SegWit generalmente usa direcciones bech32. Sin embargo, pasó mucho tiempo hasta que todas las billeteras e intercambios admitieran pagos a direcciones de bech32. Para continuar aprovechando algunos de los beneficios de SegWit, presentamos un tipo de dirección que parece P2SH normal desde la perspectiva del remitente, pero que tiene la magia de SegWit detrás. Este tipo de dirección se denomina dirección P2SH-P2WPKH. ↩

7.bech32 propuesto por BIP173. ↩

8. Las primeras billeteras Ethereum no utilizaban detección de errores porque sus estándares de dirección carecían de sumas de verificación. Aunque EIP55 introdujo sumas de verificación en 2016, no todas las billeteras realizan detección de errores. Incluso en 2017, la gente seguía perdiendo éter por introducir una dirección incorrecta. ↩

9.bech32m propuesto por BIP 350. ↩

10. Véanse las notas de BIP 341 para razones específicas. ↩