Blog
¿Qué es el blockchain?
Blockchain significa cadena de bloques, según la wikipedia es una estructura de datos que contiene información, la cual es agrupada en conjuntos y se le añade información relativa al bloque anterior de manera que gracias a técnicas criptográficas, la información que contiene un bloque solo puede ser manipulada modificando todos los bloques posteriores.
Básicamente, el blockchain funciona como una red de seguridad, que hoy en día es útilizado en varios propositos en los cuales resaltan las transacciones bancarias, votaciones, criptomonedas, registro de datos entre otros. La razón por la cual el blockchain es útilizado es porque brinda una mayor seguridad, por ejemplo si se emite una transacción bancaria por un monto de 1000$ dicha información será dividida en bloques, si se tratará de modificar 1 solo bloque tendría que modificarse todos sus bloques anteriores y esto es lo que hace el blockchain tan seguro.
Muy bien hasta este punto la transacción por 1000$ se ha dividido en bloques, pero ¿como se recupera la información?, la información se recupera mendiante la unión de todos sus bloques, la secuencia de los hashes que unen cada bloque a su padre crea una cadena que se remonta hasta el primer bloque jamás creado, el cual es conocido como el bloque génesis. Los bloques se unen a traves de operaciones matemáticas que realizan los famosos mineros, una vez se encuentre el resultado el bloque estaría únido y es posible ver la información que contiene.
A lo largo del curso estarémos contruyendo una API que funcionará como la red blockchain para cifrar información, como por ejemplo el contenido de un post. Esto es irrelevante, ya que blockchain no se usaría nunca para esto, pero es una manera práctica de entender como funciona el blockchain implementado para una votación, registro bancario, transacción bancaria, registros médicos e incluso otros sectores en los cuales se pueda aplicar, pero que aún se esta por descubrir.
Construyendo un blockchain con python
Para comenzar, vamos a crear un pequeño script que simulará las transacciones de una criptomoneda. Esta criptomoneda la llamaremos “Unipy”, crearemos 3 clases, la clase cliente, transacción y bloque además de programar las funciones que darán lugar colocar la criptografia a los bloques y de resolverlos.
Antes de comenzar debemos instalar una librería para poder desarrollar nuestro simulador de transacciones de cryptomonedas, la librería se llama crypto y se instala con el siguiente comando pip:
pip install pycryptodome
Como vamos a utilizar otras librerías que hacen uso de la librería crypto, debemos dirigirnos donde tenemos instalado nuestro python y cambiar la carpeta, esto es debido a que las otras liberías que usaremos llaman a la librería crypto como “Crypto” con la letra c en mayúscula lo cual hace que ocurra un error de importación y para solucionarlo simplemente renombraremos la carpeta de dicho módulo a “Crypto” con la c mayúscula.
En mi caso me he dirigido al directorio python y entré donde están instaladas todas mis librerías, en mi caso la ruta es la siguiente:
C:\Users\MyUsuario\AppData\Local\Programs\Python\Python37\Lib\site-packages
En esta ruta buscaremos la carpeta “crypto” y la renombrarémos a “Crypto”.
Muy bien, una vez hecho esto vamos a nuestro editor de código y crearemos un archivo al que llamarémos blockchain.py
y vamos a importar todas las librerías que usaremos para desarrollar el script:
import hashlib import random import binascii import datetime import collections import Crypto import Crypto.Random from Crypto.Hash import SHA from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5
Librería hashlib:
- hashlib nos permite realizar cifrados del tipo BLAKE, SHAKE, SHA1, SHA224, SHA256, SHA384, SHA512 y MD5.
- random nos sirve para generar número o cifras aleatorias
- binascii permite convertir datos binarios a código ASCII
- datetime es la librería para manipular el tiempo con python
- collections para manipular colecciones como listas, las tuplas y los diccionarios.
- Crypto para generar datos cryptográficos
Estas son las librerías que utilizaremos para armar este pequeño script que nos enseñará a entender un poco mejor como funciona una transacción de cryptomonedas en el blockchain.
Lo siguiente por hacer es crear nuestra clase Cliente la cual generará las claves privadas y públicas mediante RSA, durante la inicialización del objeto Cliente, crearemos claves públicas y privadas y almacenamos sus valores en la variable de instancia.
self._clave_privada = RSA.generate(1024, random) self._clave_publica = self._clave_privada.publickey()
Debemos tener en cuenta que no debemos perder nuestra clave privada para poder mantener los registros, por otro lado; la clave pública generada se utilizará como indentidad del cliente pero para que esto sea posible debemos definirla en una propiedad que devuelva la clave pública en una representación tipo hexadecimal (HEX).
@property def identity(self): return binascii.hexlify(self._public_key.exportKey(format='DER')).decode('ascii')
Esta identidad será exclusiva para cada cliente, es decir; cada cliente tedrá su identidad propia para las transacciones. Esta identidad puede ser puesta a disposición del público para que así cualquiera pueda enviar la criptomoneda a cualquier cliente utilizando su dirección (Básicamente la dirección funcionaría como una billetera o cartera de criptomoneda), nuestra clase cliente debería de lucir así:
class Cliente(): def __init__(self): random = Crypto.Random.new().read self._clave_privada = RSA.generate(1024, random) self._clave_publica = self._clave_privada.publickey() self._signer = PKCS1_v1_5.new(self._clave_privada) @property def identidad(self): return binascii.hexlify(self._clave_publica.exportKey(format='DER')).decode('ascii')
Muy bien, pasemos a testear la clase cliente para hacerlo debemos instanciar el objeto Cliente
y llamar a su método identidad
Jose = Cliente() print(Jose.identidad)
Ejecutemos el script y deberíamos de obtener la identidad del cliente:
λ python blockchain.py 30819f300d06092a864886f70d010101050003818d0030818902818100a3560a10ebb65e2eb913ee28d533f8fdf5ea6d5e44b8ca96d5ab7f0e79a945a3723a5ed537d69e73ad20bf8e4023d1b5f3c54ec3d0c6dd5f55df41fb9de2f9e3745f50ca02efe140a27426109ba0d49428b1394c6817ebb354263630af8fad446199c3de14acf6628a90d329a2aba73790ecb96122bd9fb49709ba87df2cc7930203010001
Anteriormente dije, que cada cliente tendría una identidad única. Pero para verificar esto por nosotros mismos sería una locura total por eso la mejor forma es preguntandoselo a python voy a comentar el print de la identidad del Jose y luego voy a instanciar un segundo cliente al que llamaré Juan y le preguntaré a python si es igual al Jose
:
Juan = Cliente() print(Jose.identidad != Juan.identidad)
Si vuelvo a ejecutar el código:
λ python blockchain.py True
Python me dice que la sentencía es cierta al preguntarle si la identidad del Jose
es distinta a la identidad del Juan
, con lo cual comprobamos que el código que tenémos hasta ahora va por buen camino.
Hasta ahora hemos explicado como funciona el Blockchain y hemos comenzado a programar un pequeño script que nos servirá como base para entender como se comporta un blockchain con las criptomonedas.
➡ ¡Enhorabuena! Continúa aprendiendo con nuestro Curso de Blockchain:
ES TOTALMENTE CONFUSO EL FINAL DEL EJERCICIO! “Juan = Cliente()
print(Jose.identidad != Juan.identidad)
Si vuelvo a ejecutar el código:
λ python blockchain.py
True
Python me dice que la sentencía es cierta al preguntarle si la identidad del Jose es distinta a la identidad del Juan, con lo cual comprobamos que el código que tenémos hasta ahora va por buen camino.”
A PYTHON SE LE PREGUNTO SI ERAN IGUALES! Y CONTESTO “TRUE”, QUE SI SON IGUALES !!!!!!!!