Todo lo que necesitas saber para usar Bitcoin Cash con SeedCash

Una breve explicación para entender Bitcoin y comenzar a usarlo con SeedCash.
English Version
"No creo que tengamos buen dinero nuevamente antes de sacarlo de las manos del gobierno, es decir, no podemos sacarlo violentamente de sus manos. Todo lo que podemos hacer es introducir algo que no puedan detener de alguna manera astuta." - Friedrich August von Hayek

Al embarcarnos en el camino para convertirnos en un bitcoiner soberano, encontramos varios desafíos. Primero, entender la filosofía subyacente: su impacto económico, político y, en mi opinión, moral. Una vez que superamos estas barreras, que en el caso de Bitcoin siempre son tan altas como nuestra curiosidad quiera construirlas, nos enfrentamos al aprendizaje práctico, su usabilidad.

Quiero destilar el conocimiento más importante que mi experiencia me ha proporcionado, de tal manera que al terminar de leer estas pocas páginas, habrás comprendido todo el conocimiento necesario para usar Bitcoin con confianza y comprensión. Este artículo es el 20% de esfuerzo que conduce al 80% de los resultados.

Si eres un usuario avanzado, gran parte de la información relacionada con "Conceptos" puede parecer redundante. Aunque recomiendo leer esta sección para reforzar o recordar conceptos. Puedes saltar directamente a "Explicación".

Conceptos

La base teórica necesaria para usar Bitcoin con tranquilidad

Cuando decidimos exiliarnos a esta economía paralela, libre y descentralizada que Bitcoin nos permite acceder, el primer paso que debemos dar es obtenerlo. Para conseguir Bitcoin, para recibirlo, primero necesitamos un lugar para almacenarlo.

Más adelante, veremos que los verbos "enviar", "recibir" o "almacenar" Bitcoin son inexactos—más precisamente, incorrectos—pero por ahora, me permitirás usarlos.

Volvamos a nuestro objetivo: almacenar Bitcoin. Imagina 2^256 buzones—difícil de comprender, ¿verdad? Estamos hablando de un valor equivalente al número de átomos en el universo. Bueno, en Bitcoin, tienes 2^256 "buzones" donde puedes almacenar Bitcoin.

Cada uno de estos buzones puede contener Bitcoin. Cada buzón está asociado con una clave (clave privada) que solo el propietario debería poseer (o, más bien, conocer), y tiene un signo con su dirección (clave pública). Cualquiera que tenga la clave (conozca la clave privada) puede abrir el buzón, "tomar el Bitcoin," y lanzarlo a otro buzón con su propia clave pública y privada. En otras palabras, si tienes la clave de un buzón, controlas los fondos porque puedes gastarlos. Cualquiera que conozca la dirección (clave pública) puede encontrar el buzón y depositar Bitcoin. De manera similar, podrían simplemente esperar y observar quién deposita Sats en ese buzón. (La subunidad de cuenta en Bitcoin se llama Sats | 1 BCH = 100,000,000 Sats)

Conceptos

Seamos claros, sin metáforas que nos confundan.

Una billetera de bitcoin se caracteriza por dos números muy importantes asociados. Una clave privada, que es cualquier número menor que 2^256, y una clave pública, que es otro número que se construye a partir de nuestra clave privada. Es decir, para crear una billetera tenemos que elegir un número que llamaremos la clave privada (secreta) y usaremos este número para generar a través de operaciones matemáticas otro número resultante que llamaremos la clave pública (pública). Como veremos más adelante, poseer bitcoin es tener el poder de gastar. Para gastar nuestros bitcoins tenemos que usar nuestra clave privada para probar que dichos bitcoins son nuestra propiedad. Quien conozca una clave privada tendrá todo lo necesario para justificar que es el propietario de algunos Sats y, en consecuencia, podrá gastar dichos Sats. Simplificando; La clave pública te permite recibir y la clave privada te permite gastar, donde la clave privada solo es conocida por ti, y si no, otro también tendría control sobre tus fondos.

Resumamos.

Para almacenar bitcoin tenemos que elegir cualquier número menor que 2^256. Este número será nuestra clave privada, nuestra clave. Cualquiera que conozca este número tendrá control sobre los fondos asociados, "almacenados" en esta clave privada. Usando operaciones matemáticas basadas en nuestra clave privada, nuestro número secreto, obtenemos nuestro número público, nuestra clave pública, que otros bitcoiners usarán para "enviarnos" bitcoin. A partir de la clave privada es fácil generar la clave pública, pero a partir de la clave pública no es posible generar la clave privada. Para los más curiosos, bitcoin utiliza un sistema de criptografía de curva elíptica para este propósito.

Entendamos el proceso por el cual se genera nuestra clave privada. En bitcoin, como hemos dicho, las claves privadas son un número menor que 2^256. Para que la elección de este número sea realmente aleatoria y, en consecuencia, segura, no vamos a elegirlo nosotros mismos. Vamos a crear dos elementos (ahora veremos qué elementos son) y luego usaremos estos dos elementos como entrada para una función llamada hmac-sha512. Es decir, tomamos el elemento 1 y el elemento 2, los introducimos en la función hmac-sha512 y esta función devuelve el resultado. Con el resultado anterior obtendremos la clave privada.

Creo que todo se ha vuelto de repente complicado. Voy a explicar cuatro conceptos que quiero que entiendas antes de revisar lo que se dijo anteriormente y continuar con la explicación.

¿Qué es una función hash?

Una función hash es una función que toma cualquier valor de entrada y devuelve un valor de una longitud determinada (para la misma función hash siempre es la misma longitud) de tal manera que para el mismo valor de entrada siempre obtendremos la misma salida, pero si variamos ligeramente el valor de entrada, el valor de salida cambia radicalmente.

¿Qué es hmac-sha512?

Para nuestro propósito no es necesario entender esta función en detalle. En consecuencia, consideraremos que hmac-sha512 es una función hash que toma dos valores de entrada y devuelve una salida de 512 bits (64 bytes). Recuerda las propiedades de una función hash.

¿Cómo convertir de decimal a binario?

Cualquier número decimal puede expresarse en binario. De manera similar, cualquier código binario puede expresarse como un número decimal. Así que veamos cómo convertir un número decimal a binario. Cualquier número decimal puede construirse como la suma de potencias de dos. 12 = 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 → 1100 Para convertir 12 a binario tenemos que obtener los factores de la suma, en este caso: 12 = 1100 Para el caso de 5: 5 = 1*2^2 + 0*2^1 + 1*2^0 → 101

¿Cómo convertir de binario a decimal?

Vamos a hacer el proceso inverso. Primero, escribamos, desde 2^0, el número de potencias de dos equivalente a la longitud de nuestro código binario (si el código binario tiene 0 a la izquierda, no los consideramos). Luego, para cada posición, si la potencia de esa posición corresponde a un 1 en el código binario, sumamos el valor de la potencia de dos en cuestión. Si corresponde a un 0, no lo sumamos (multiplicamos por 1 en el primer caso y por 0 en el segundo). Considera que al elegir el factor asignado a la potencia 2^0, miraremos el bit más a la izquierda. Para 2^1, el segundo bit más a la izquierda, etc.

Veamos algunos ejemplos mejor.

Vamos a convertir 101 a decimal: Tenemos un código binario que tiene tres elementos de longitud, así que necesitamos escribir las primeras tres potencias de dos: 1*2^2 + 0*2^1 + 1*2^0 Ahora sumamos las potencias y el resultado es nuestro número decimal, 5. Vamos a convertir 0000101 a decimal: Dado que tenemos 4 ceros a la izquierda, simplemente los ignoramos y repetimos el proceso anterior. Vamos a convertir 1100 a decimal: Tenemos 4 elementos, así que necesitamos las primeras 4 potencias de dos: 1*2^3 +1*2^2+0*2^1+0*2^0 = 12

Bien. Ahora que entendemos los conceptos anteriores, estamos listos para retomar donde lo dejamos. Recuerda: Para obtener la clave privada debemos crear un elemento 1 y otro elemento 2. Introducimos los dos elementos como entrada en hmac-sha512 y obtenemos una secuencia resultante de 64 bytes, esa secuencia es equivalente a una secuencia de 512 bits. Los primeros 256 serán nuestra clave privada. Los siguientes 256 bits no nos interesan ahora. Todo lo que necesitamos para tener control sobre una billetera es mantener bajo nuestro conocimiento el valor resultante de la función hmac-sha512. Los primeros 256 serán nuestra clave privada y los siguientes 256 serán nuestro código de cadena (como dije, el código de cadena no nos interesa ahora). Insisto; Para tener una billetera segura necesitamos mantener nuestra clave privada y nuestro código de cadena bajo nuestro conocimiento y de manera secreta. En este punto, podrías estar preguntándote: Ok, necesito guardar mi clave privada (primeros 256 bits del resultado de hmac-sh512) y mi código de cadena (segundo 256 del resultado de hmac-sha512) pero, ¿cómo los obtengo? ¿Cuáles eran esos elementos de los que hablábamos? Vamos a ello.

Como dijimos, la función hmac-sha512 toma dos valores como entrada. Hasta ahora los hemos definido provisionalmente como elemento 1 y elemento 2. Primero que todo, quiero aclarar que la función hmac-sha512 no toma los elementos 1 y 2 directamente, sino que los transforma en formato de bytes. El elemento 1 es la frase mnemotécnica. El elemento 2 es la passphrase. Para nuestro propósito, guardar bitcoin, tendremos que generar ambos elementos de manera segura.

¿Qué es una frase mnemotécnica y cómo generarla?

Una frase mnemotécnica es una forma de representar y recordar (de una manera amigable para el ser humano) una secuencia binaria. Otra secuencia binaria!. El elemento 1, la frase mnemotécnica no es más que otro número menor que 2^256. Un número menor que 2^256 que para recordar (o guardar) convertimos en una frase mnemotécnica. El primer paso para obtener nuestra frase mnemotécnica es elegir nuestro número secreto en binario, es decir, una secuencia de hasta 256 bits.

Por supuesto, debe hacerse de acuerdo con los estándares de bitcoin (bip 39), los vemos a continuación: Nuestra secuencia puede tener una longitud de 128, 160, 192, 224 o 256 bits. En consecuencia, tendremos 12, 15, 18, 21 o 24 palabras. El estándar en bitcoin es 12 o 24 palabras. Una vez que hayamos elegido la longitud de nuestra frase mnemotécnica, vamos a crear la cadena de bits correspondiente.

Ahora tenemos que tomar un papel, un bolígrafo y una moneda (o cualquier otra forma de obtener buena entropía), lanzarla 128, 160, 192, 224 o 256 veces y escribir para cada lanzamiento si el resultado es 0 o 1 (asignar un valor a un lado y el otro el opuesto). Este procedimiento se describe en detalle en "Explication". Cualquier otro procedimiento es válido para obtener una cadena de 128, 160, 192, 224 o 256 bits de longitud siempre que el método proporcione buena entropía.

Ahora tenemos una cadena de 128, 160, 192, 224 o 256 bits. Aún está incompleta. Necesitamos agregar algunos bits a ella. Necesitamos agregar lo que se conoce como un checksum. Un checksum es una "suma de verificación", el resultado de un hash sha256 de nuestra cadena de bits de la cual se extraen los primeros bits y se añaden a nuestra cadena. La longitud del checksum, es decir, el número de bits que se toman para añadir a nuestra cadena a partir del resultado del hash de nuestra cadena, son respectivamente 4, 5, 6, 7 u 8.

Resumamos un poco. A nuestra cadena de 128, 160, 192, 224 o 256 bits que hemos hecho a mano, bit a bit, lanzando una moneda, un dado o con cualquier otra fuente de entropía, tenemos que añadir algunos bits más, un "resumen". Este resumen se llama checksum y se construye haciendo un hash de la cadena de bits que hemos hecho con papel y bolígrafo. El resultado del hash (dado que se utiliza sha256) son 256 bits de los cuales solo nos interesan los primeros 4, 5, 6, 7 u 8 dependiendo de la longitud de nuestra cadena de bits original (tomando 4 bits para el caso de 128, 5 para el caso de 160, etc.). Tomamos los primeros 4, 5, 6, 7 u 8 bits y los añadimos a nuestra cadena original de 128, 160, 192, 224 o 256 bits, resultando en una cadena de 132, 165, 198, 231 o 264 bits de longitud. Felicitaciones, ahora tienes tu semilla, tu frase mnemotécnica en formato binario.

Pero espera, si has estado prestando atención, hay algo que no cuadra. Para generar nuestra secuencia de bits original todo ha sido muy analógico, papel y bolígrafo, sabes a lo que me refiero. Y de repente me pides que haga un hash? Amigo, eso es un poco difícil con papel y bolígrafo. Necesitamos una computadora y aquí comienzan las complicaciones. Si tomas tu computadora habitual y entras a un sitio web que tiene implementada la función hash sha256, obtendrás el checksum rápidamente, pero has comprometido tu semilla. Me atrevo a decir más, al intentar completar un checksum con cualquier computadora con capacidad de conectarse a Internet, comprometes tu frase mnemotécnica. Aquí es donde entra SeedCash.

Una de las características de SeedCash es poder tener una computadora que nunca puede conectarse a Internet. Esto te permite usar tu clave privada sin temor a que nadie pueda acceder a ella. SeedCash ha implementado la función "generar semilla" donde, a partir de una cadena original de 128, 160, 192, 224 o 256 bits, genera el checksum. Pero nuevamente, el funcionamiento de "generar semilla" se explica en detalle en "Explication". Ahora nos enfocamos en entender las bases teóricas. Voy a asumir que SeedCash te proporciona el checksum. Ahora, tenemos nuestra frase mnemotécnica en formato binario.

Ahora tenemos que transformarla en una frase mnemotécnica. Para ello, tendremos que tomar nuestra cadena binaria y dividirla en bloques de 11 bits. (Quiero que notes que 132/11=12, 165/11=15, etc.). Después de hacer el agrupamiento anterior, tendremos 12, 15, 18, 21 o 24 cadenas, cada una de ellas con una longitud de 11 bits. Es hora de recordar lo que aprendimos sobre cómo hacer una conversión de binario a decimal. Vamos a tomar cada uno de los grupos de 11 bits y los vamos a transformar a decimal. Como resultado obtendremos 12, 15, 18, 21 o 24 números. En bitcoin tenemos un diccionario (Bip 39). Es un diccionario que relaciona una palabra con un número menor o igual a 2048. Quiero que notes que el valor decimal máximo para una cadena binaria de 11 bits es 2048. Consideraremos cada número obtenido como el índice de la palabra en dicho diccionario (Bip 39) y mantendremos la palabra que ocupa la posición del índice en cuestión. Obtuvimos 12, 15, 18, 21 o 24 grupos de cadenas de 11 bits y los convertimos en 12, 15, 18, 21 o 24 números. Ahora obtendremos 12, 15, 18, 21 o 24 palabras, cada palabra correspondiente a la palabra que ocupa la posición en el diccionario correspondiente al número obtenido para esa palabra. Estas palabras serán nuestra frase mnemotécnica. Ahora tenemos la primera entrada para nuestra función hmac-sha512, una cadena de 12, 15, 18, 21 o 24 palabras.

Veamos un ejemplo.

Conceptos

¿Qué es una passphrase y cómo generarla?

Recuerda que una función hmac-sha512 necesita dos entradas. Hemos creado la primera, nos falta la segunda. Esta segunda se llama passphrase. Una passphrase es simplemente un string (en programación, un string es un tipo de dato utilizado para representar texto). Es importante considerar que cualquier ligera variación en esta cadena resultaría en un resultado completamente diferente para nuestra hmac-sha512 y, en consecuencia, obtendríamos una clave privada y un código de cadena completamente diferentes. Un espacio extra, una letra mayúscula en lugar de una minúscula, una coma... Es muy importante que cuando decidas cuál será tu passphrase, verifiques que la tienes escrita correctamente. Con absoluta precisión. Siempre tienes la opción de tener una passphrase nula. En ese caso solo necesitarás guardar cuidadosamente tu frase de recuperación, es decir, tu frase mnemotécnica. Personalmente, recomiendo usar una passphrase, ya que añade mucha seguridad a bajo costo. También considera que para la misma frase mnemotécnica, el uso de diferentes passphrases resulta en diferentes claves privadas y códigos de cadena. Es decir, en diferentes "buzones". Mi ejemplo de passphrase será: "232y buka wABHGE82" Ahora es tu turno de crear tu propia passphrase. Puedes usar una cadena más amigable para facilitar su recuerdo. Considera que cuanto más corta y simple sea, más vulnerable serán tus fondos a un ataque de fuerza bruta en caso de que un atacante obtenga tu frase mnemotécnica y no conozca la passphrase.

Si este artículo te está aportando valor, si estás aprendiendo, te animo a practicar el valor por valor. Estarás apoyando la creación de este contenido y el desarrollo de SeedCash.

El QR corresponde a una dirección de bitcoin cash ( cashaddr ).

Código QR de donación de Bitcoin Cash

Bien, ahora entiendes cómo generar una frase mnemotécnica y una passphrase. Sabes que estos valores se introducirán en una función hmac-sha512 y el resultado, una cadena de 512 bits, se dividirá en dos partes, los primeros 256 bits serán la clave privada (maestra) y los segundos 256 bits serán el código de cadena (maestro). Entenderás el concepto "maestro" más adelante.

Hay una cosa que me gustaría aclarar. Dije anteriormente que para tener una billetera de bitcoin solo necesitas mantener tu clave privada maestra y tu código de cadena maestro en secreto. Eso es correcto, pero no se hace de esa manera. Como dijimos, si mantienes tu clave privada maestra y tu código de cadena maestro en secreto, tienes todo lo que necesitas, pero no es práctico. Recuerda que son dos cadenas de 256 bits. Lo que vamos a guardar es la información que, cuando la introduzcamos en hmac-sha512, genera la clave privada maestra y el código de cadena maestro, es decir, la frase mnemotécnica y tu passphrase. Las diferentes aplicaciones de bitcoin que uses (como SeedCash) se encargarán de, a partir de la frase mnemotécnica introducida y la passphrase, derivar la clave privada maestra y el código de cadena maestro.

Conceptos

Ahora tienes todo lo que necesitas para generar tu billetera de bitcoin. Tu frase mnemotécnica y tu passphrase, pudionendo obtener siempre tu clave privada maestra y tu código de cadena maestro.

Hasta ahora he estado mencionando, junto con la clave privada maestra, un llamado "código de cadena maestro". Entendamos Bip32, otra de las implementaciones más importantes de Bitcoin.

Quiero aclarar que uso Bitcoin y Bitcoin Cash de manera intercambiable.

Recuerda que para "recibir" fondos necesitamos nuestra clave pública. En bitcoin todas las transacciones son públicas para que haya un registro de qué clave pública ha transferido x bitcoin a otra clave pública. Para mejorar nuestra privacidad, podría interesarnos usar diferentes claves públicas, pero eso trae problemas. Recuerda que generar y guardar una frase semilla con una frase de contraseña no es fácil, requiere elaboración y guardar muchas no sería práctico. En consecuencia, bip32 (en bitcoin BIP es el acrónimo de propuesta de implementación de bitcoin, una actualización) introduce el concepto de billeteras HD, billeteras jerárquicas deterministas. Desarrollemos este concepto. Recuerda que nuestro objetivo es tener diferentes claves públicas, por lo tanto, tenemos que tener diferentes claves privadas, bien. ¿Cómo logramos esto? Si tuviéramos una clave privada y cualquier otra cadena de información (código de cadena) podríamos combinar ambos códigos binarios para obtener claves privadas infinitas y, en consecuencia, claves públicas infinitas. No vamos a profundizar en este campo, lo dejaremos para futuras publicaciones, "conceptos avanzados".

Quiero que tengas en cuenta lo siguiente. Con nuestra clave privada maestra y nuestro código de cadena maestro podemos generar claves privadas hijas. Estas claves privadas hijas serán las que guardarán fondos pero solo guardaremos la clave privada maestra y el código maestro, suficiente información para siempre poder generar las claves privadas hijas y controlar los fondos.

Conceptos

Hasta que no profundicemos en bip32 en "conceptos avanzados", te recomiendo que saltes el paso intermedio, que se refiere a la ruta de derivación m/44'/145'/0'. Quiero que tengas en cuenta lo siguiente . A partir de nuestra clave privada maestra junto con nuestro código de cadena maestro, combinándolos y usando funciones hash, obtenemos prácticamente claves privadas hijas infinitas que serán las que sostendrán los fondos. Siempre que tengamos posesión de nuestra clave privada maestra junto con nuestro código de cadena maestro, siempre podremos generar las claves privadas hijas y mantener el control sobre nuestros fondos.

Hemos entendido la estructura de una billetera de bitcoin. Cómo podemos obtener hasta 2^31 claves privadas con solo una frase mnemotécnica y una passphrase. Ahora necesitamos entender cómo se relaciona nuestra billetera con las demás. ¿Cómo puedo sacar sats de mi buzón y enviarlos al buzón de otra persona? ¿Cómo puedo recibir sats de otra billetera en mi buzón? El proceso es el mismo, es una cuestión de perspectiva. Recuerdas que te dije que en bitcoin los verbos "enviar", "recibir" y "guardar" eran incorrectos? Como dije, nos sirven inicialmente como medida pedagógica, pero ahora ya nos estamos adentrando en el tema. Comencemos por el final. Almacenar bitcoin es mantener tus claves privadas, es decir, tu clave privada maestra junto con tu código maestro, es decir, tu frase mnemotécnica junto con tu passphrase, bajo tu conocimiento y fuera del alcance de otros. Recuerda que almacenar tu frase mnemotécnica junto con tu passphrase es equivalente a almacenar tu clave privada maestra junto con tu código maestro. Por supuesto, el estándar (por practicidad) es guardar la frase mnemotécnica y la passphrase. Y ahora, ¿qué significa enviar bitcoin? O en otras palabras, ¿qué significa recibir bitcoin? Veamos. Una transacción de bitcoin, es decir, una situación en la que una persona "envía" y otra "recibe" puede entenderse como un contrato. Este contrato consiste en diferentes partes, "cláusulas". Ver el siguiente diagrama para la composición de una transacción de bitcoin.

Conceptos

Abrumador, ¿verdad? En este artículo, "Conceptos", no abordaremos la transacción desde un aspecto técnico y profundo, solo quiero que tengas un esquema de su estructura. Una transacción de bitcoin es una secuencia de información y no se construye de una vez, requiere diferentes pasos hasta que tenga todo lo necesario y esté lista para ser introducida en un bloque de la red de bitcoin. Podríamos definir dos etapas. El primer paso es construir una "transacción cruda" (también llamada proto transacción o raw transaction). Una transacción cruda, como se ve en el diagrama anterior, contiene todos los elementos de una transacción de bitcoin, toda la información necesaria para definir la estructura de dicha transacción. Pero entonces, ¿cuál es la diferencia entre una raw transaction y una transacción completa? Aquí es donde aparece la segunda etapa, la definitiva. Para que una raw transaction se convierta en una transacción válida, necesitamos que el propietario firme dicha raw transaction. Una raw transaction firmada se convierte en una transacción lista para ser enviada a la red. Ahora echemos un vistazo más de cerca a la estructura de una raw transaction y al posterior proceso de firma.

Como puedes ver en el diagrama anterior, una raw transaction se compone principalmente, entre otros elementos secundarios que no nos conciernen ahora, de una serie de entradas y salidas. El número de entradas y salidas dependerá del número de UTXOS que quieras gastar (cada entrada corresponde a un UTXO). Cada salida corresponde a un nuevo UTXOS que quieras generar (cada salida genera un nuevo UTXO). Un UTXO es el acrónimo de salida de transacción no gastada, es decir, un UTXO es una salida que aún no se ha utilizado como entrada. Esta parte es un poco circular, así que me resulta difícil transmitirlo. Lo explicaré de nuevo.

Imagina que tienes bitcoin, por el momento no nos preocuparemos de cómo lo obtuviste. Tu billetera consiste en dos cantidades de bitcoin: una cantidad de 3 bitcoins de una primera transacción y en una segunda transacción recibiste 0.5 bitcoins (como ejemplo). Ahora imagina que quieres gastar todo tu saldo. Vamos a crear una transacción cruda para ese propósito. El primer paso es averiguar cuáles son las entradas para la transacción que estamos creando (qué bitcoins queremos gastar). El segundo paso (y ahora volveré al primero) es definir cuáles son las salidas (a dónde queremos enviarlo). Una salida es una secuencia de información de nuestra transacción que define quién será el futuro propietario de una cantidad de bitcoin (definida en la misma salida) y qué condiciones deben cumplirse para que esta cantidad asignada a esa persona pueda ser gastada. Recuerda que cuando digo "enviar bitcoin a una persona", no estamos "enviándolos" a "cualquiera", sino que estamos dando control de una cantidad de sats a una clave privada controlada por esa persona.

Recapitulemos. Una salida asigna una porción del valor total de sats, resultante de la suma del valor de sats de todas las entradas (UTXOS) involucradas en la transacción, a una dirección determinada (a un buzón determinado) y define qué requisitos tendrán que cumplirse para que esta salida (este nuevo UTXO, es decir, esta nueva salida no gastada) pueda ser gastada por el propietario del nuevo "buzón". Generalmente, estos requisitos se limitan a que el nuevo propietario legítimo demuestre, cuando quiera gastar sus nuevos UTXOS, que es definitivamente el propietario legítimo (en el caso estándar de un ScriptPubKey P2PKH). Hay más posibilidades, pero no vamos a entrar en tales posibilidades ahora como locktimes, multisigns y otras situaciones.

Recibir bitcoin es una consecuencia de que un tercero use algunos UTXOS (salidas de una transacción anterior donde el tercero se benefició, recibió bitcoin), es decir, usando salidas no gastadas (UTXOS) como nuevas entradas en una nueva transacción. Al mismo tiempo, está definiendo nuevas salidas, que serán nuevos UTXOS para el beneficiario de la nueva transacción. En nuestro caso tendríamos dos entradas, la primera correspondiente al UTXO de 3 bitcoins y la segunda entrada correspondiente al UTXO de 0.5 bitcoins. Como hemos dicho que queríamos enviar todo nuestro saldo a una sola dirección (un solo buzón), en consecuencia, tendríamos una sola salida. Te acabo de mentir, para generar una transacción en bitcoin siempre tenemos que pagar una comisión al nodo que incluye la transacción en el siguiente bloque de la red. En consecuencia, para nuestro caso tendríamos la salida correspondiente a la dirección del nodo (con la correspondiente comisión) y la salida correspondiente a nuestro gasto, enviando 3.49999 bitcoins a quien consideremos.

Si este artículo te está aportando valor, si estás aprendiendo, te animo a practicar el valor por valor. Estarás apoyando la creación de este contenido y el desarrollo de SeedCash.

El QR corresponde a una dirección de bitcoin cash ( cashaddr ).

Código QR de donación de Bitcoin Cash

Quiero que notes que una transacción es un contrato. La diferencia entre "enviar" y "recibir" bitcoin es meramente el papel que asumes en ese contrato.

Si en este punto no entiendes completamente cómo funciona una transacción, no te preocupes. Voy a dedicar las siguientes líneas a insistir en cómo funciona el intercambio en bitcoin.

El proceso, escuché esta metáfora a lunaticoin (quizas el mayor apóstata de bitcoin), es equivalente a tomar monedas con diferentes valores nominales (cada moneda es una entrada) y fundirlas en nuevas monedas. Si fundimos todas las monedas en una nueva moneda, tendríamos una salida, es decir, un nuevo UTXO. Pero también podemos fundir dos monedas (dos entradas) en 15 nuevas monedas (15 salidas, es decir, 15 nuevos UTXOS). O cualquier otra combinación que puedas imaginar. Quiero enfatizar que, obviamente, el valor total de los UTXOS, es decir, las salidas, tiene que ser igual al valor total de las entradas para que la transacción sea válida. También es importante considerar que cada salida tiene su propio contrato de desbloqueo, su propio ScripSign. Cada moneda viene con su propio contrato de uso.

Un ScripSign es un script, un código, que prueba que se cumplen las condiciones de desbloqueo del UTXO. Un ScripPubKey es un script, un código, que establece dichas condiciones de bloqueo.

Considero necesario compilar nuevamente. Para mover bitcoin tenemos que presentar un contrato válido a un minero. Este contrato válido es una transacción de bitcoin que será incluida, por dicho minero, en un bloque de la cadena, de la red. Esta transacción de bitcoin consiste en fundir una o varias monedas donde cada una tiene su valor nominal en una o varias nuevas monedas con su correspondiente valor nominal. Este contrato se construye en dos pasos. Primero, se genera una transacción cruda. Una transacción cruda es una secuencia de información que contiene la información sobre qué UTXOS se van a gastar (entradas) y qué UTXOS se generarán a costa de dichas entradas (salidas). Es importante considerar que las salidas no solo contienen la información correspondiente a la cantidad de bitcoin y a quién se dirige dicha cantidad, sino que también contienen la información que describe: bajo qué condiciones las nuevas salidas pueden convertirse en entradas para una futura transacción, es decir, contienen la información necesaria que describe las condiciones que deben cumplirse para que los nuevos UTXOS puedan ser gastados, dicha información, dichos "requisitos" son conocidos como ScriptPubKey. Ahora entendemos cómo se construye una raw transaction. Solo necesitamos entender cómo convertir esta raw transaction en una transacción lista para ser enviada a un nodo. Antes de eso, me gustaría que volvieras a leer y reflexionar sobre lo que se ha dicho hasta este punto. También revisa el diagrama sobre la estructura de una raw transaction y la composición de cada entrada y salida.

Ahora que tenemos nuestra transacción cruda en mano, vamos a firmarla. ¿Recuerdas lo que hemos aprendido sobre la composición de las salidas? Una salida contiene 3 bloques de información. El primero contiene el valor en sats de dicha salida. El segundo contiene el tamaño del ScriptPubkey en bytes, y finalmente el ScriptPubKey donde el ScriptPubKey son los requisitos que se definen para que la salida en cuestión, el nuevo UTXO, pueda ser utilizada como entrada, es decir, gastada. También quiero que recuerdes que, como dije, el ScriptPubKey más común (P2PKH) se limita a asegurar que quien gasta un UTXO es realmente el propietario. Bueno, teniendo esto en cuenta, ya puedes adivinar qué nos falta. Tenemos nuestra transacción cruda con algunas entradas que aún no se han completado, es decir, no han satisfecho las condiciones de validación, no han satisfecho los ScriptPubKeys de las salidas de las que provienen. En otras palabras, la sección ScriptSign, la sección de la entrada destinada a que el firmante adjunte las pruebas que satisfacen las condiciones de gasto, está vacía. Dado que ya hemos construido nuestras salidas y todas las demás partes de la transacción que no nos interesan ahora, solo necesitamos construir la información que se adjuntará a cada ScriptSign de dichas entradas, es decir, satisfacer los ScriptPubKeys de los UTXOS a gastar.

Para satisfacer el ScriptPubKey de los UTXOS a gastar y completar la transacción, tendremos que entender qué condiciones se solicitan en el ScriptPubKey. Como dijimos antes, nos vamos a centrar en la situación más común, una transacción estándar. En una transacción estándar (P2PKH), el ScriptPubKey de cada UTXO nos pide que la sección ScriptSign de la entrada correspondiente contenga una firma criptográfica de la transacción cruda (*1). Para obtener la firma usamos nuestra clave privada hija correspondiente al "buzón" donde almacenamos el UTXO a gastar. Adjuntamos la clave pública correspondiente a la clave privada que hizo la firma después de la firma en si. La secuencia resultante será nuestro scripsign. Al iterar el proceso para cada entrada, probamos que somos los propietarios legítimos de cada entrada (UTXO a gastar). Ahora, habiendo completado todos los ScripSigns que satisfacen las condiciones de todos los ScriptPubKeys correspondientes a cada UTXO a gastar (a cada entrada), ya tenemos una transacción válida lista para ser enviada a la red.

*1 El procedimiento para firmar (en el estándar P2PKH) es más complejo. Se toma la transacción cruda, se vacían todas las secciones ScriptSign (tenemos una sección ScriptSign para cada entrada).

Para cada entrada de la transacción cruda (o proto transacción) seguiremos los siguientes pasos:

1: Introducir el scriptPubKey correspondiente al UTXO a gastar en esa entrada en el espacio vacío de la sección ScriptSign de la entrada a firmar.

2: Llamaremos a la secuencia obtenida del paso 1 serialized_tx.

3: hash_to_sign=sha256(sha256( serialized_tx + SIGHASH_ALL ))

4: El hash_to_sign se firma usando ECDSA

5: Para nuestro número de entrada i, el ScriptSign_i = firma + pubKey(correspondiente a la clave privada que hizo la firma)

Finalmente, tomamos nuestra raw transaction inicial a la que habíamos vaciado los ScriptSigns y en cada sección vacía añadimos el correspondiente ScriptSign_i. La secuencia resultante es nuestra transacción final firmada.

No te preocupes si no has entendido estos últimos aspectos técnicos de cómo funciona una transacción. Es un poco complejo. Lo que me interesa es que entiendas la metáfora de las monedas fundidas y posteriormente acuñadas , es decir, cómo funciona el modelo de transacción basado en UTXO.

Si este artículo te está aportando valor, si estás aprendiendo, te animo a practicar el valor por valor. Estarás apoyando la creación de este contenido y el desarrollo de SeedCash.

El QR corresponde a una dirección de bitcoin cash ( cashaddr ).

Código QR de donación de Bitcoin Cash

Finalmente, para cerrar este artículo, quiero presentarte un concepto muy importante: el de las billeteras "watch only". Este concepto será un pilar, central en nuestro esquema de seguridad estándar que explicaremos en "Explication", nuestra guía práctica para usar Bitcoin cash. Veamos qué es una billetera solo de observación y qué nos permite hacer, pero primero déjame presentarte dos conceptos que son necesarios para entender qué es una billetera solo de observación. También serán útiles en tu esquema de seguridad. Veamos qué son una xpriv y una xpub.

Los términos xpriv y xpub provienen de "clave privada extendida" y "clave pública extendida" respectivamente. Ambas son secuencias de información que contienen el código de cadena maestro y respectivamente la clave privada maestra o la clave pública maestra, es decir, la clave pública correspondiente a la clave privada maestra. Con un xpriv tenemos la información necesaria para controlar los fondos en una billetera, para controlar un buzón. Con el xpriv podemos generar una billetera y con el xpub podemos hacer algo aún más interesante.

Conceptos

Quiero que recuerdes beep 32. Beep 32 describe la estructura de las billeteras de Bitcoin. Con una clave privada maestra y un código de cadena maestro, podríamos combinarlos para generar hasta 2^31 claves privadas hijas con su correspondiente clave pública hija, y eran estas claves hijas las que sostenían los fondos. Es decir, para obtener las claves privadas hijas combinaríamos la clave privada maestra con el código de cadena maestro y un índice y obtendríamos la clave privada hija correspondiente a ese índice. Ahora, aquí está la parte interesante. Con la clave pública maestra junto con el código de cadena maestro, podemos generar todas las claves públicas hijas. Es decir, para un índice de clave (por ejemplo, supongamos que queremos generar la clave privada hija número 35) si sabemos el código de cadena maestro y la clave pública maestra podemos generar dicha clave privada hija sin problema y sabiendo la clave privada hija 35 podemos sin ningún problema generar la clave pública hija 35. Bueno, sabiendo el mismo código de cadena maestro y la clave pública maestra derivada de la clave privada maestra, también podemos generar dicha clave pública hija 35 combinando el código de cadena maestro con la clave pública maestra. El índice 35 es un ejemplo, claramente funciona para todos los índices (menores que 2^31).

Resumamos, si conocemos un xpriv podemos generar toda una billetera con cada una de sus claves privadas hijas con sus correspondientes claves públicas hijas. Si conocemos un xpub podemos generar todas las claves públicas hijas. Esto es muy poderoso, me refiero al uso de un xpub, ya que nos permite generar una billetera solo de observación, es decir, una billetera con la que solo podemos ver nuestro saldo, en la que se distribuyen los UTXOS, podemos generar transacciones crudas (sin firmar) y podemos usar las claves públicas para generar direcciones y recibir bitcoin. Repito, con un xpub podemos generar una billetera solo de observación. Una billetera solo de observación nos permite ver el saldo de nuestra billetera y de cada clave pública hija (ver todos nuestros UTXOS), generar direcciones para recibir bitcoin y preparar transacciones que solo necesitan ser firmadas para poder ser enviadas a la red. Poderoso, ¿verdad? El uso de nuestro xpub será esencial para generar nuestra billetera solo de observación y nuestra billetera solo de observación será el centro de nuestro esquema de seguridad para almacenar y usar bitcoin (explicado en "Explicación").

Finalmente, quiero introducir un concepto más, el de la dirección. Si notaste en el último párrafo para recibir bitcoin, no propuse usar directamente una de nuestras claves públicas hijas, sino que con esa clave pública hija generamos una dirección. Ok, entendamos este punto. Las direcciones se utilizan en lugar de usar la clave pública directamente para mejorar la seguridad, la privacidad y la usabilidad. Veamos las principales razones. Primero, tenemos privacidad. Las direcciones son hashes de claves públicas. Esto significa que aunque las direcciones están relacionadas con las claves públicas, no revelan la clave pública completa hasta que se utiliza en una transacción. Esto ofrece una capa adicional de privacidad ya que la clave pública solo se revela cuando se confirma la transacción (recuerda que la clave pública debe añadirse junto con el hash de la transacción firmada en la sección ScriptSign). En segundo lugar, tenemos seguridad. Si la clave pública se utilizara directamente, un atacante con una computadora cuántica podría teóricamente calcular la clave privada a partir de la clave pública. Al usar una dirección, que es un hash de la clave pública, se vuelve mucho más difícil para un atacante intentar derivar la clave privada hasta que la transacción esté firmada y transmitida. Finalmente, añade que las direcciones de Bitcoin están diseñadas para ser más cortas y más fáciles de manejar en comparación con las claves públicas. Es para facilitar a los usuarios copiar, pegar y escribir direcciones sin errores, y para que los sistemas las verifiquen más fácilmente. Las direcciones también incluyen un mecanismo de verificación (que hemos visto antes) llamado checksum, que ayuda a detectar errores tipográficos. Esto es especialmente útil para evitar enviar fondos a la dirección incorrecta debido a un error humano.

En BCH tenemos dos tipos de direcciones. Las originales en bitcoin: Legacy y el estándar actual: CashAddr.

1: Legacy

Se caracteriza por el prefijo 1 o 3. El prefijo 1 se utiliza en el caso de transacciones P2PKH y 3 en el caso de P2SH. Ejemplo: 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

2: CashAddr

Contiene el encabezado: "bitcoincash:". Se caracteriza por el prefijo q o p. El prefijo q se utiliza en el caso de transacciones P2PKH y p en el caso de P2SH. Ejemplo: bitcoincash:qqeht8vnwag20yv8dvtcrd4ujx09fwxwsqqqw93w88

Si has llegado hasta aquí, te felicito . Este artículo es una gran parte del conocimiento que he adquirido en los últimos 2 años sobre bitcoin. Conocimiento que he condensado y sintetizado para ti. Espero que este artículo te haya sido útil y sea solo el comienzo de tu viaje por el agujero de conejo de bitcoin . Te recomiendo que uses este artículo no como una lectura casual, sino como "notas" para revisar y releer. Este artículo tiene como objetivo sintetizar mucho conocimiento; esto implica que es difícil para el lector digerirlo. Insisto en que releas y complementes con otras fuentes los aspectos que te hayan resultado más difíciles de entender.

Si este artículo te ha aportado valor, si has aprendido, te animo a contribuir a este proyecto. Estarás promoviendo el desarrollo de SeedCash y la redacción de artículos educativos como el que acabas de disfrutar. También te invito a participar en la comunidad de Telegram de SeedCash donde encontrarás ayuda para todo lo que necesites, puedes dar retroalimentación sobre la herramienta e incluso contribuir a su desarrollo.

Ahora que hemos estudiado la parte teórica, comencemos a construir!

Explicación