Una de las creaciones de Satoshi Nakamoto con el fin de hacer realidad a Bitcoin es la codificación Base58, un tipo de función criptográfica especialmente diseñada para Bitcoin cuya función principal es la de transformar los bytes resultantes de la sintetización de datos representados por una serie de bytes, (a la que se le aplica un proceso criptográfico específico para transformar la salida a un formato estandarizado dentro de la red) en algo que fuera fácilmente legible y verificable.

La función no solo puede codificar la información, sino también decodificarla y hacer el checksum (suma de verificación) de la misma. De hecho, todas estas funciones son fácilmente identificables en el código fuente de Bitcoin. En primer lugar, las definiciones de todas estas funciones están disponibles en el header (cabecera de definición de funciones y macros en C/C++), base58.h, disponible en el siguiente enlace.

Base58 y sus especificaciones dentro del código fuente de Bitcoin

Mientras que el código de las funciones puede ser revisado y verificado revisando el archivo base58.cpp, disponible en este otro enlace. Son estas dos partes las que hacen posible el funcionamiento de Base58 dentro de Bitcoin.

Una función para facilitar el uso de Bitcoin

Así, básicamente Base58 hace algo que nos facilita el uso de Bitcoin: transformar los datos de origen de una dirección al formato legible que conocemos de las mismas. Por ejemplo, algo tan sencillo como esta función es lo que nos permite poder reducir una gran cantidad de datos, como lo es una clave ECDSA, en algo mucho más manejable y legible, como lo es una dirección de Bitcoin con sus 20 caracteres de largo (en la versión estándar o legacy de estas direcciones y que empiezan por 1 o 3).

Ahora bien ¿Cómo se da todo este proceso? Pues bien, el proceso es bastante sencillo y se puede dividir en los siguientes pasos:

  1. En primer lugar, se toman los datos de versión/aplicación, junto a los datos correspondientes a la clave pública de nuestras criptomonedas. Estos datos son tratados en bytes.
  2. Seguidamente se comienza a calcular el hash SHA-256 de todos los datos concatenados. Aquí tenemos nuestro primer SHA-256.
  3. El resultado anterior se toma como valor para una nueva ronda de SHA-256, y con ello tenemos el hash SHA-256 del hash anterior.
  4. Con el segundo hash calculado, tomaremos los cuatro primeros bytes resultantes del mismo.
  5. Ahora concatenamos los datos del segundo hash SHA-256 (paso 3) y lo unimos al conjunto de datos del paso 1.
  6. La concatenación anterior será tratada como un conjunto de bytes en formato big-endian (un formato de almacenamiento y tratamiento de datos a nivel computacional). En este punto, comienza la conversión de datos a Base58, usando un alfabeto especial (definido en la siguiente imagen). Durante todo este proceso se tiene el cuidado de normalizar el resultado para que no tenga ceros de Base58 al inicio de la cadena (en ese caso se representan con el valor “1”).
  7. Al final, el proceso termina con una concatenación de todos los “1”resultantes en el paso anterior para con ello obtener el valor de Base58 final.
Diccionario de Base58 y su especificación para Bitcoin, este diccionario es diferente para cada criptomoneda.

Usado en direcciones y demás dat