Guia para construir una blockchain. Parte 6

En una red de criptomonedas como Bitcoin , la unidad fundamental de interacción es una transacción en la que el valor se transfiere de una entidad a otra.
En este tipo de red, la blockchain es un libro mayor distribuido e inmutable de todas las transacciones que han ocurrido en la red. El valor se transfiere de una dirección pública a otra dirección pública. Podemos examinar y enumerar todas las transacciones asociadas con una dirección pública al escanear todas las transacciones que involucran esta dirección. El tipo de blockchain que acabamos de describir no tiene concepto de cuenta de usuario. La blockchain no proporciona a cada usuariouna cuenta única donde se registra toda la actividad de la cuenta. Más bien, la aplicación solo registra las transacciones en la blockchain a medida que ocurren. Cada transacción se compone de una o más direcciones públicas de origen desde las que se transfiere valor a uno o más destinos de direcciones públicas. Por lo tanto, dado que un individuo usa una dirección pública para recibir valor y transferir valor, las transacciones que involucran a un individuo se pueden construir escaneando la cadena de bloques desde el bloque génesis hacia adelante para transacciones que involucren las direcciones públicas que posee la persona.

Este post y los dos siguientes examinan las transacciones en criptomonedas. Ahora vamos a profundizar en las transacciones de criptomonedas, la validación de tales transacciones y, en particular, cómo el valor se transfiere de forma segura de las manos de sus propietarios legítimos a las de un destinatario previsto.

construccion de una direccion publica

En una transacción típica, el receptor de valor proporciona al transmisor de valor una dirección pública a la que se enviará el valor. Mediante técnicas criptográficas, el receptor
de valor puede probar que generó la dirección pública y, por lo tanto, es el propietario
del valor que se ha transferido a esta dirección

De ahora en adelante y en aras de la brevedad, nos referirémos a la salida codificada en hexadecimal de una cadena de una función hash criptográfica como SHA-256 o RIPEMD-160 simplemente como hash.

El siguiente algoritmo enumera los pasos necesarios para generar una dirección pública:

  1. Se genera un par de claves asimetricas (clave publica-clave privada)
  2. Se genera el SHA256 de la clave pública
  3. Se genera el hash RIPEMD-160 del resultado del paso 2
  4. Añade del prefijo 0x1 al hash del resultado del paso 3
  5. Computa SHA256 del resultado del paso 4
  6. Extrae los últimos 4 bytes del resultado del paso 5. Esta será nuestro checksum
  7. Concatena el checksum del paso 6 con el resultado del paso 4
  8. Codifica el resultado del paso 7 en Base58. El resultado es la direccion publica de Blancoin

Podemos simbolizar este algoritomo asi:

address = base58_encode("1" + RIPEMD-160(SHA256_HASH(public_key)) +
checksum)

Aqui la imagen del proceso:

Generacion de la direccion publica

El byte de versión de las direcciones de blancoinse fijará al valor en el módulo hconfig.
Los últimos cuatro bytes antes de la codificación Base58 son una suma de comprobación que nos permite probar que la dirección no esté dañada. Esta suma de comprobación se utiliza de la siguiente manera:

  1. Decodificamos el base58 de la direccion publica
  2. Quitamos los últimos cuatro bytes del resultado del paso anterior. Estos cuatro bytes son la suma checksum. La parte restante es el prefijo de la versión y el hash RIPEMD-160.
  3. Tomamos el hash SHA-256 del hash RIPEMD-160 y extraemos los últimos cuatro bytes. Esta es nuestro checksum calculado.
  4. La dirección pública no es válida si la suma de comprobación calculada no es igual al checksum extraído.

Tenga en cuenta que debido a la generación aleatoria de la clave pública y la propiedad criptografica de los algoritmos hash, una clave pública siempre generará una direccion publica única, y por ello, la dirección es generada por algún par de claves asimétricas únicas.

estructura de una transaccion

Ahora examinaremos la estructura canónica de una transacción. Una transacción tiene
la siguiente estructura de diccionario:

{
 version: <string>
 transactionid: <string>
 locktime: <integer>
 vin: <list of dictionary elements>
 vout: <list of dictionary elements>
}

El texto que está entre corchetes angulares especifica el tipo de valor
correspondiente a la clave.
El valor de la clave de version describe la versión del software de la aplicación que es
utilizado para procesar la transacción. Para el blancoin, esto se fija en “1”.
El transactionid es un identificador único universal para la transacción. Lo haremos
use el módulo secrets de la biblioteca estándar de Python para crear una cadena criptográfica codificada en hexadecimal de 512 bits de longitud.
locktime es un número entero no negativo. Este valor, si es mayor que cero, instruye a un minero de abstenerse de gastar la transacción hasta que haya transcurrido un período de tiempo específico. locktime no puede tener un valor superior al MAX_LOCKTIME especificado en el módulo de configuración de blancoin.

lista de transacciones de entrada

Ahora estamos en condiciones de hablar de la lista transacciones de entrada Vin y el mecanismo de desbloqueo de transacciónes. Vin es un acrónimo de Value in. Vin es una lista de entradas de transacciones que consumen las salidas de transacciones anteriores.
Cada elemento de la lista de Vin es un diccionario. Este elemento de diccionario tiene la siguiente estructura típica:

{
 txid: <string>
 vout_index: <integer>
 ScriptSig: <list>
}

txid es el transactionid de una transacción anterior, una parte de cuya salida es consumida.
Vout_index es un índice de la matriz vout de la transacción anterior. Cada elemento de Vout de una transacción anterior especifica un valor que se puede consumir (transferir). El valor total consumido es una suma de valores transferidos por todos los elementos Vin.
Tenga en cuenta que toda la salida en el elemento vout de la transacción anterior debe ser
consumido. El script ScriptSig permite la transferencia de valor al demostrar la propiedad del valor. Esto es la concatenación de una firma digital y una clave pública. La clave pública es la clave que se utilizó para generar la dirección pública a la que se transfirió el valor en la transacción. Veremos este mecanismo de script en breve.

lista de transacciones de salida

Vout es un acrónimo de Value out. Recuerde que cuando una dirección pública recibe valor de acuerdo con una transacción, este valor se puede gastar posteriormente en otra
transacción por parte de su propietario. La lista de Vout de una transacción especifica los valores que son transferibles a uno o más receptores de valor. Para reiterar, la lista de Vout especifica los valores de transacción que están disponibles para ser gastados en transacciones posteriores por los dueños de tales valores.

Vout es una lista. Cada elemento de la lista de vout es un diccionario que tiene la siguiente
representación:

{
 value: <integer>,
 ScriptPubKey: <list>
}

value es el valor de la criptomoneda que recibe una dirección pública específica. ScriptPubKey es una lista operaciones de desbloqueo, que se comentarán posteriormente. El valor de la criptomoneda en un elemento vout puede ser gastado por la entidad que puede desbloquear el script ScriptPubKey. La única entidad que puede desbloquear el script es la entidad que posee la clave privada perteneciente a
RIPEMD-160 (SHA-160 (clave pública)). Mostrarémos esto posteriormente. Hay dos aspectos de vout a destacar. En primer lugar, solo se pueden
transferir. En el reino de Bitcoin, la unidad transferible más pequeña es un satoshi, o una
cienmillonésima parte de un bitcoin. En blancoin, la unidad transferible más pequeña es una cienmillonesima parte de un blancoin. La razón de esto es que evitamos todas las complicadas complicaciones involucradas en la aritmética decimal y de coma flotante. En segundo lugar, observe que la suma de los valores de toda la lista de vout es el total
valor recibido por direcciones públicas que han sido proporcionadas por los destinatarios de la transacción. Por lo general, esta cantidad será un poco menor que la cantidad transferida a esta transacción. La diferencia es el feed de la transaccion.

mecanismo de la transaccion

En la mecánica newtoniana, la unidad fundamental de cálculo es un cuerpo que tiene
masa. Los cuerpos tienen propiedades bien definidas y existen leyes físicas que gobiernan su comportamiento. De manera análoga, la unidad fundamental de cálculo en una red de criptomoneda es la transacción. Sin transacciones, no hay blockchain. Las transacciones tienen una estructura rígida y bien definida, así como reglas fijas que rigen su comportamiento.
Repasemos todos los pasos que están involucrados en una transacción típica. Suponemos
que Alice quiere transferirle un blancoin a Smith. La tarea ante Alice es crear un objeto de transacción (la estructura de diccionario anterior) que permite esta transferencia. Este objeto de transacción debe

  1. Desbloquear algunos de los blancoin anteriores que posee Alice
  2. Bloquear los valores de blancoin de salida para que solo Smith pueda desbloquearlos y usarlos


Desbloquear los blancoin que posee Alice significa que tieneque demostrar la propiedad de estos blancoin, y por lo tanto, pueden ser transferidos por ella. Una vez que se desbloquean estos blancoin se convierten en productos que se pueden entregar a Smith. Alice bloquea estas outputs para que solo Smith puede desbloquearlos. Esto demostrará que Smith posee estos blancoin.
Antes de que Alice pueda transferir un blancoin a Smith, debe poseer al menos un blancoin. Entonces, supongamos que hay una transacción anterior que contiene una sola salida de 1.08 blancoin, que Alice posee (un elemento vout). Suponemos que la transacción anterior tiene id:

618a125ac95ba370187c574d174eb7d618f3ee35d374899ca0007a035ba0a9e1

Estos son los pasos que debe seguir Alice para transferir un blancoin a Smith:

  1. Alice solicita a Smith que le envíe una dirección pública a la que pueda enviar un blancoin
  2. Smith envia a Alice su direccion publica
  3. Alic crea un id para la transaccion. supongamos que es “d6b77f077ff700cd36df061ed75af353506f0cec6e267f0ce674eaa3b5d53217”
  4. Cuando Alice recibió blancoin en la transacción anterior.“618 … 9e1”, había facilitado una dirección pública al emisor. Alice ahora obtiene la clave pública (digamos, pPubKey) con la que esta se creó la dirección y se emparejó la clave privada (por ejemplo, PrivKey )con esta clave pública. Alice extrae el siguiente valor, que está disponible en la salida de la transacción anterior (elemento vout): MDHash = RIPEMD-160 (SHA256 (pPubKey)). Alice crea la firma digital de MDHash: Signature = Firma (MDHash). Lo siguiente que hace Alice es crear una lista con dos elementos: Signature y el Public key correspondiente a la clave privada. Esta lista se llama ScriptSig.
  5. Usando esta información, Alice crea el elemento vin en la lista Vin de la transacción. Esta lista contiene exactamente un elemento. El elemento vout_index es el índice de la lista vout de la transaccion anterior, e identifica la salida de la transacción anterior que se está consumiendo (supongamos que es 0). El elemento vin es:

{
“txid”: “618a125ac95ba370187c574d174eb7d618f3ee35d374899ca0007a
035ba0a9e1″
“vout_index”: 0
“ScriptSig”: [Sig, PublicKey]
}

  1. Alice toma la dirección pública proporcionada por Smith y deshace la codificacion Base58 y elimina la checksum. El resultado es RESULT = “1” + RIPEMD-160 (SHA256 (clave pública de Smith)). Luego calcula el hash SHA256 de RESULT con el checksum que se ha quitado. Si no se indica un error, Alice coloca la siguiente cadena en la clave ScriptPubKey del primer elemento vout:” MDHASH “donde MDHASH es RIPEMD-160 (SHA256 (clave pública de smith)).
  2. El Vout de Alice es:

{ “value”: 1, “ScriptPubKey”: ” MDHASH ” }

  1. Alice crea un objeto transaction:

{ “version”: “1”, “transactionid”: “d6b77f077ff700cd36df061ed75af353506f0cec6e
267f0ce674eaa3b5d53217″, “locktime”: 0, “vin”: { “txid”: “618a125ac95ba370187c574d174eb7d618f3ee35d374899ca0007a 035ba0a9e1″ ,”vout_index”: 0, “ScriptSig”: “Sig PublicKey” }, “vout”: { “value”: 1, “ScriptPubKey”: [ MDHASH ] } }

9. Una vez creado el objeto de transacción, Alice lo serializa en Base58
y la transmite en la red peer-to-peer de Blancoin.
Los mineros que están escuchando en esta red las transacciones recogen la
transacción y (pueden) incluirla en un bloque que pueda extraer.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s