Informe sobre la investigación
e implementación de
aplicación en el contexto de
Blockchain y criptomonedas.
Alumno: Helio Rivera.
Asignatura: Comunicación de datos y redes I
Profesor: Manuel Yañez
Universidad de la Serena Chile.
índice de contenidos
Los fundamentos de la tecnología blockchain 3
El consenso, la clave de la blockchain 3
Los elementos básicos de la blockchain 4
Las claves de la tecnología blockchain 5
Criptografía y consenso aplicado a la blockchain 6
El Hash 6
Que es una prueba de trabajo 7
Aplicación (simulador de Criptomoneda). 8
Postman 8
Flask 10
codificación de los nodos 11
procedimiento 16
1
Introducción
Desde que en el año 2009 surgiera la blockchain, el interés por esta tecnología no
ha parado de aumentar. Lo demuestra el hecho de que empresas, emprendedores y
Gobiernos de todo el mundo estén realizando inversiones millonarias para
desarrollarla y tomar una posición privilegiada en la que será la próxima revolución
industrial: el internet del valor. Más aún, estamos entrando en una fase nueva: la de
imaginar las posibilidades y los distintos modelos de uso que finalmente adoptará
esta tecnología. Y es que el único límite que conoce la blockchain es la propia
imaginación del ser humano.
2
Los fundamentos de la tecnología blockchain
Aunque generalmente hablamos de blockchain, lo cierto es que este concepto como
tal no existe. O al menos no a secas, sino acompañado siempre de un adjetivo, de
modo que podamos diferenciar entre «blockchains públicas», «blockchains
privadas» o, incluso, «blockchains híbridas». No obstante, en general se puede
hablar de una tecnología que ha llegado para quedarse y, más aún, para definir lo
que será el mundo del futuro. Gracias a ella, el actual internet de la información
alcanzará un nuevo paso evolutivo, que ya se ha dado en llamar internet del valor.
El consenso, la clave de la blockchain
Una blockchain no es otra cosa que una base de datos que se halla distribuida entre
diferentes participantes, protegida criptográficamente y organizada en bloques de
transacciones relacionados entre sí matemáticamente. Expresado de forma más
breve, es una base de datos descentralizada que no puede ser alterada. Otro
elemento muy importante a tener en cuenta en ella es que, por definición, se trata
de un sistema que permite que partes que no confían plenamente unas en otras
puedan mantener un consenso sobre la existencia, el estado y la evolución de una
serie de factores compartidos. El consenso es precisamente la clave de un sistema
blockchain porque es el fundamento que permite que todos los participantes en el
mismo puedan confiar en la información que se encuentra grabada en él. Se trata de
un aspecto con un potencial increíble para transformar una infinidad de sectores
clave de la industria y no menos de la sociedad en la que vivimos, de tal modo que
podría llegar a cambiar incluso nuestra forma de entender el mundo. Desde un
punto de vista técnico, ese sistema basado en la confianza y el consenso se
construye a partir de una red global de ordenadores que gestionan una gigantesca
base de datos. Ésta puede estar abierta a la participación de cualquiera que lo
desee (hablamos entonces de una «blockchain pública») o bien limitada a sólo
algunos participantes (caso de la «blockchain privada»), aunque siempre sin la
necesidad de una entidad central que supervise o valide los procesos que se lleven
a cabo. La primera de todas las blockchains que han existido fue la blockchain
pública de Bitcoin, lanzada en enero de 2009. En su funcionamiento juegan un papel
importante términos como «minería», inspirado en la minería del oro y referido al
proceso computacional necesario que opera para asegurar su red, la llamada
«Prueba de Trabajo» (Proof of Work, en inglés, PoW). No obstante, para hacerse
una idea del impacto que podría tener la blockchain en el mundo no es
imprescindible entender desde un primer momento estos conceptos, en los que ya
habrá ocasión de profundizar en los capítulos dedicados a criptografía, consenso y
tecnología. En ellos podrás ver que no todas las blockchains se basan en la misma
operativa y que incluso hay algunos proyectos que, a pesar de denominarse
«blockchain», quizás no lo sean.
3
Los elementos básicos de la blockchain
Para entender el alcance de la tecnología blockchain hay que conocer los elementos
básicos de que se compone. Son los siguientes:
• Un nodo: puede ser un ordenador personal o, según la complejidad de la red, una
mega computadora. Con independencia de la capacidad de cómputo, todos los
nodos han de poseer el mismo software/protocolo para comunicarse entre sí. De
otro modo no podrán conectarse ni formar parte de la red de una blockchain, sea
ésta pública, privada o híbrida. Si en una blockchain pública estos nodos no tienen
por qué identificarse, en una blockchain privada los nodos se conocen entre sí,
pudiendo también ser iguales entre ellos.
• Un protocolo estándar: en forma de software informático para que una red de
ordenadores (nodos) pueda comunicarse entre sí. Existen protocolos muy
conocidos, como el TCP/IP para internet o el SMPT para el intercambio de correos
electrónicos. El protocolo de una blockchain funciona de la misma forma: otorga un
estándar común para definir la comunicación entre los ordenadores participantes en
la red.
• Una red entre pares o P2P (Peer-to-Peer, en inglés): se trata de una red de
nodos conectados directamente en una misma red. Un ejemplo muy conocido de
red P2P es BitTorrent.
• Un sistema descentralizado: a diferencia de un sistema centralizado, donde toda
la información está controlada por una única entidad, aquí son todos los
ordenadores conectados los que controlan la red porque todos son iguales entre sí;
es decir, no hay una jerarquía entre los nodos, al menos en una blockchain pública.
En una privada sí puede haber jerarquía.
De lo dicho se desprende que una blockchain es un conjunto de ordenadores (o
servidores) llamados «nodos» que, conectados en red, utilizan un mismo sistema de
comunicación (el protocolo) con el objetivo de validar y almacenar la misma
información registrada en una red P2P. Podríamos decir que ésta sería la estructura
«física», como lo es la carrocería en un coche… Pero ¿y el motor? El motor de la
blockchain es la suma de todos esos elementos que logran que la información
recogida no pueda modificarse porque complejos algoritmos criptográficos, sumados
a la propia capacidad colectiva de la red, contribuyen a asegurar la irreversibilidad
de la información.
4
Las claves de la tecnología blockchain
Una blockchain se compone de tres partes que, combinadas e integradas, cumplen
un propósito determinado y fundamental. Son éstas:
• La criptografía: por tal entendemos un procedimiento que, utilizando un algoritmo
con clave (clave de cifrado), transforma un mensaje sin atender a su estructura
lingüística o significado, de tal forma que sea incomprensible o, al menos, difícil de
comprender, a toda persona que no tenga la clave secreta (clave de descifrado) del
algoritmo empleado. En la blockchain, la criptografía tiene la responsabilidad de
proveer un mecanismo infalible para la codificación segura de las reglas del
protocolo que rigen el sistema. Es también fundamental para evitar la manipulación,
hurto o introducción errónea de información en la cadena de bloques, así como la
responsable de generar firmas e identidades digitales encriptadas.
• La cadena de bloques o blockchain: es la base de datos diseñada para el
almacenamiento de los registros realizados por los usuarios. Todas las blockchains
han de actuar bajo las mismas reglas o protocolo para dar validez al bloque —y a la
información recogida— e incorporarlo a la cadena de bloques. Una vez realizada
esta tarea, la cadena continuará con la emisión del siguiente bloque, permaneciendo
inalterable la información registrada a través de la criptografía. Esta forma de obrar
elimina la necesidad de un tercer ente de confianza.
• Un consenso: se trata de una parte imprescindible entre los usuarios de la
blockchain. Este consenso se sustenta en un protocolo común que verifica y
confirma las transacciones realizadas, y asegura la irreversibilidad de las mismas.
De igual modo, este consenso debe proporcionar a todos los usuarios una copia
inalterable y actualizada de las operaciones realizadas en la blockchain.
Independientemente de si se opta por una cadena de bloques pública o privada, la
combinación de estos tres elementos dentro del protocolo/software otorgan ese sello
de calidad que certifica que es un motor blockchain.
5
Criptografía y consenso aplicado a la blockchain
No es posible conocer el funcionamiento de la tecnología blockchain sin una
aproximación a uno de sus elementos básicos, la criptografía. A partir de él se
descubre todo su potencial en campos tan diversos de la vida como el industrial, el
económico o el de la información. La criptografía es el arte de transformar un
mensaje legible en otro ilegible. A este proceso se le llama «cifrado», mientras que
el contrario, la recomposición del mensaje en un formato legible, es el «descifrado».
En la actualidad contamos con tres tipos principales de criptografía:
• Hashing.
• Criptografía simétrica o convencional.
• Criptografía asimétrica o de clave pública.
Los tres se usan de una u otra forma en el mundo de las criptodivisas o
criptomonedas de las blockchains públicas y privadas.
El Hash
Hash es un verbo inglés que significa «picar» o «moler». Se trata de una expresión
gráfica, pues la criptografía consiste precisamente en «moler» unos contenidos
hasta obtener una secuencia de caracteres de una longitud fija, algo así como la
huella digital de un mensaje o documento. En la práctica, el hash se obtiene
aplicando una función matemática a unos datos. Siempre que apliquemos la misma
función al mismo contenido, obtendremos el mismo hash. Del mismo modo,
cualquier modificación del contenido, ya sea por corrupción o intervención
intencional, cambiará por completo el hash resultante. Esto hace que las funciones
hash tengan muchas aplicaciones en criptografía tanto para generar firmas digitales
mediante algoritmos de autenticación como para verificar la integridad de los datos
en sistemas de fingerprinting (es decir, la identificación única e inequívoca de un
dato, algo muy útil por ejemplo para encontrar archivos duplicados).
El propósito de un hash no es el de ocultar el mensaje en sí, ni el de permitir
descifrarlo después, sino el de comprobar su integridad y verificar que no ha sido
alterado. Los editores de software, por ejemplo, publican archivos junto con su
correspondiente hash, de modo que los usuarios que se los descargan pueden
luego calcular el hash de cada uno de ellos y compararlo con el que publicó el
editor. Si los hashes son idénticos, los usuarios saben que los archivos no se han
alterado o corrompido por el camino. Todo esto que parece tan técnico es
fundamental en la minería de bitcoins u otras criptomonedas que utilizan sistemas
de Prueba de Trabajo (Proof of Work, en inglés, PoW).
6
Que es una prueba de trabajo
El protocolo de Prueba de Trabajo o Proof of Work, es el más conocido y antiguo
protocolo de consenso que consiste en que las partes de una red realicen con éxito
un trabajo computacionalmente costoso para acceder a los recursos de dicha red.
El protocolo de Prueba de Trabajo, nos sirve para evitar ciertos comportamientos
indeseados en una red. Su nombre proviene del inglés Proof of Work (PoW). Este
protocolo funciona bajo el concepto de requerir un trabajo al cliente, que luego es
verificado por la red. Normalmente el trabajo solicitado, consiste en realizar
complejas operaciones de cómputo.
Estas operaciones que luego son verificadas por la red. Una vez que son
aprobadas, se da acceso al cliente para que use los recursos de la misma. Con ello
se busca impedir que clientes maliciosos puedan consumir todos los recursos de
forma incontrolada. Una situación que puede acabar por denegar el servicio
prestado al resto de clientes de la red.
Un ejemplo muy simple de entender es el famoso captcha que se pone cuando se
quiere hacer un registro en una web. La web pone este reto que el visitante ha de
resolver. Si lo resuelve tendrá acceso al servicio. Esto evita que un atacante pueda
crear millones de registros y así colapsar la página web. No obstante, el reto en una
comunicación entre ordenadores no puede ser tan complejo. Debe ser solventable,
aunque con una complejidad relativa.
La principal característica de esta estrategia es su asimetría. El trabajo por parte del
cliente es moderadamente difícil de realizar, pero la verificación por parte de la red
es sencilla. Esto quiere decir, que la prueba de trabajo lleva mucho tiempo en
producirse y es computacionalmente costosa. Pero verificarla es sencillo, pues la
prueba diseña patrones que facilitan la verificación.
Fue precisamente esta característica, la que llamó la atención de Satoshi Nakamoto
a la hora de diseñar el Bitcoin. Es por ello que implementó el sistema HashCash (un
sistema PoW) en su reconocida criptomoneda.
7
Aplicación (simulador de Criptomoneda).
● La aplicación es desarrollada en el lenguaje de programación Python. En el
entorno de desarrollo integrado Spyder(python 3.8)
● las herramientas que se utilizan como complementos indispensables para
que la aplicación sea posible son:
○ Postman.
○ Flask
○ Json
○ encabezados de archivo en el script que corresponden a librerías
claves para trabajar con aplicaciones WEB y peticiones HTTP
Postman
Se trata de una herramienta dirigida a desarrolladores web que permite realizar
peticiones HTTP a cualquier API. Postman es muy útil a la hora de programar y
hacer pruebas, puesto que nos ofrece la posibilidad de comprobar el correcto
funcionamiento de nuestros desarrollos.
● Primeramente se debe descargar la aplicación y posteriormente crear una
cuenta de usuario. [Link]
8
mediante esta aplicación se realizan las peticiones http sobre los nodos de la red de
blockchain que crearemos.
HTTP: El Protocolo de transferencia de hipertexto (en inglés, Hypertext Transfer
Protocol, abreviado HTTP) es el protocolo de comunicación que permite las
transferencias de información a través de archivos (XHML, HTML . . .) en la World
Wide Web.
métodos de petición HTTP : HTTP define una serie predefinida de métodos de
petición (algunas veces referido como "verbos") que pueden utilizarse.
para nuestro caso los métodos de petición utilizados serán:
GET: El método GET solicita una representación del recurso especificado. Las
solicitudes que usan GET solo deben recuperar datos y no deben tener ningún otro
efecto. (Esto también es cierto para algunos otros métodos HTTP.)
POST: Envía datos para que sean procesados por el recurso identificado en la URI
de la línea petición. Los datos se incluirán en el cuerpo de la petición. A nivel
semántico está orientado a crear un nuevo recurso.
conjunto de peticiones programadas en cada nodo de aplicación:
● GET : [Link]
● GET : [Link]
● GET: [Link]
● POST: [Link]
● POST: [Link]
● GET: [Link]
notar que el puerto 5001 varía de acuerdo al nodo conectado a la [Link] nuestro
ejemplo probaremos con 2 nodos en la red. cuyos puertos serán 5001 y 5002.
Además [Link].1 corresponde al local host que se refiere a un nombre
reservado que tienen todas las computadoras, routers o dispositivos
independientemente de que dispongan o no de una tarjeta de red ethernet. El
nombre localhost es traducido como la dirección IP de loopback [Link] en IPv4..
9
Flask
Flask es un framework minimalista escrito en Python que permite crear aplicaciones
web rápidamente y con un mínimo número de líneas de código. Está basado en la
especificación WSGI de Werkzeug y el motor de templates Jinja2 y tiene una
licencia BSD.
luego para correr la aplicación web hacemos:
host ‘[Link]’ : La dirección [Link] se utiliza por acuerdo general como una referencia
general para todas las IP que no están en la red interna.
10
codificación de los nodos
El código que a continuación se presenta corresponde al archivo
locoHelioCoin_nodo_5001.py . por cada nodo que se quiera implementar en la red este
archivo debe replicarse y se debe cambiar el valor de la variable puerto método run y el
valor de la variable receiver en el método add_transaccion (valor que corresponde al
nombre del usuario propietario de dicho nodo)
# -*- coding: utf-8 -*-
"""
Created on Sun Jul 4 [Link] 2021
@author: helios
"""
import datetime
import hashlib
import json
from flask import Flask, jsonify,request
import requests
from uuid import uuid4
from [Link] import urlparse
class Blockchain:
def __init__(self):
[Link] = []
[Link] = [] # transacciones en el bloque
self.create_block(proof=1, previous_hash = '0')
[Link] = set()
def add_node(self,address):
parsed_url=urlparse(address)
[Link](parsed_url.netloc)
def replace_chain(self):# establece el protocolo de consenso
network = [Link]
longest_chain = None
max_length = len([Link])
for node in network:
response = [Link](f'[Link]
11
if response.status_code == 200:
data = [Link]()
length= data['length']
chain = data['chain']
if length > max_length and self.is_chain_valid(chain):
max_length = length
longest_chain = chain
if longest_chain:
[Link] = longest_chain
return True
return False
def create_block(self, proof, previous_hash):
block = {'index': len([Link])+1,
'timestamp':str([Link]()),
'proof': proof,
'previous_hash':previous_hash,
'transaccion' : [Link]}
[Link] = [] # para evitar duplicado
[Link](block)
return block
def add_transaccion(self, sender,receiver,amount):
[Link]({'sender': sender,
'receiver': receiver,
'amount': amount})
previous_block = self.get_previous_block()
return previous_block['index']+1
def get_previous_block(self):
return [Link][-1]
def proof_of_work(self, previous_proof):
new_proof = 1
check_proof = False
while check_proof is False:
12
hash_operation = hashlib.sha256(str(new_proof**2 -
previous_proof**2).encode()).hexdigest()
if hash_operation[:4] =='0000':
check_proof = True
else:
new_proof += 1
print(hash_operation)
return new_proof
def hash(self, block):
encoded_block = [Link](block, sort_keys = True).encode()
return hashlib.sha256(encoded_block).hexdigest()
def is_chain_valid(self, chain):
previous_block = chain[0]
block_index = 1
while block_index < len(chain):
block = chain[block_index]
if block['previous_hash']!=[Link](previous_block):
return False
previous_proof = previous_block['proof']
proof = block['proof']
hash_operation = hashlib.sha256(str(proof**2 -
previous_proof**2).encode()).hexdigest()
if hash_operation[:4] !='0000':
return False
previous_block = block
block_index += 1
return True
# paso 2 minando el blockchain
# creando web app
app = Flask(__name__)
#creando una direccion para el nodo en el puerto 5000
node_address = str(uuid4()).replace('-','')
# creando blockchain
blockchain = Blockchain()
# minando un nuevo bloque
13
@[Link]('/mine_block', methods = ['GET'])
def mine_block():
previous_block = blockchain.get_previous_block()
previous_proof = previous_block['proof']
proof = blockchain.proof_of_work(previous_proof)
previous_hash = [Link](previous_block)
blockchain.add_transaccion(sender= node_address, receiver = 'Helio',amount = 1)
block = blockchain.create_block(proof, previous_hash)
response = {'message':"has logrado minar un bloque",
'index':block['index'],
'timestamp':block['timestamp'],
'proof': block['proof'],
'previous_hash': block['previous_hash'],
'transaccion':block['transaccion']
}
return jsonify(response),200
#obteniendo la cadena completa
@[Link]('/get_chain', methods=['GET'])
def get_chain():
response= {'chain':[Link],
'length':len([Link])}
return jsonify(response),200
#chequeando la validez de la blockchain
@[Link]('/is_valid', methods=['GET'])
def is_valid():
is_valid= blockchain.is_chain_valid([Link])
if is_valid:
response={'message':'blockchain es valido'}
else:
response={'message':'error : blockchain no valido'}
return jsonify(response),200
#agregando nueva transaccion al blockchain
@[Link]('/add_transaccion', methods=['POST'])
def add_transaccion():
json = request.get_json()
14
transaccion_keys = ['sender','receiver','amount']
if not all(key in json for key in transaccion_keys):
return 'faltan elementos para la transaccion',400
index = blockchain.add_transaccion(json['sender'],json['receiver'],json['amount'])
response = {'message':f'la transaccion sera añadida al bloque{index}'}
return jsonify(response),201
# paso 3 descentralizando el blockchain
#conectando nuevos nodos
@[Link]('/connect_node', methods=['POST'])
def connect_node():
json = request.get_json()
nodes = [Link]('nodes')
if nodes is None:
return 'no node',401
for node in nodes:
blockchain.add_node(node)
response = {'messagge':'todos los nodos están ahora conectados. el locoHelioCoin
blocchain contiene los siguientes nodos:',
'total_nodes':list([Link])}
return jsonify(response),201
# reemplazando la cadena por la más larga
@[Link]('/replace_chain', methods=['GET'])
def replace_chain():
is_chain_replaced = blockchain.replace_chain()
if is_chain_replaced:
response={'message':'los nodos tienen diferentes cadenas asi que fue reemplazada
por la mas larga',
'new_chain':[Link]}
else:
response={'message':'Todo bien. la cadena es la mas larga',
'actual_chain':[Link]}
return jsonify(response),200
#corriendo el App
[Link](host='[Link]', port='5001')
15
procedimiento
1. Se procede a escribir un script en el lenguaje de
programación Python
2. Para este caso de uso se procede a escribir dos
archivos que representarán cada uno un nodo de la
red. estos archivos serán:
a. locoHelioCoin_nodo_5001.py
b. locoHelioCoin_nodo_5002.py
3. para la simulación de cada archivo como un
ordenador; se procede a la ejecución de cada archivo
en terminales de consola de línea de comandos en
diferentes instancias al mismo tiempo.
a. el comando que echa a correr cada ordenador es : python3
locoHelioCoin_nodo_500x.py
4. cuando las aplicaciones están corriendo
simultáneamente. se procederá a interactuar con ellas
mediante la aplicación POSTMAN.
5.- las peticiones HTTP que se harán con POSTMAN
serán:
● GET : [Link]
● GET : [Link]
● GET: [Link]
● POST: [Link]
● POST: [Link]
● GET: [Link]
6. las representación tanto de envío como recepción de
16
datos será presentada en formato json. Es decir la
interacción entre los nodos de la red serán utilizando dicho
formato.
17