Desarrollar Una Aplicación Blockchain Desde Cero en Python - Recursos Python
Desarrollar Una Aplicación Blockchain Desde Cero en Python - Recursos Python
com/)
Inicio (https://recursospython.com/)
Búsqueda …
Desarrollar una aplicación
«blockchain» desde cero
en Python Últimas
julio 1, 2018
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-cero/)
by Recursos Python entradas
(https://recursospython.com/author/admin/)
(https://recursospython.com/guias-y-manuales/aplicacion- Introducción a Tcl/Tk
blockchain-desde-cero/#comments)34 comentarios
(https://recursospython.com/guias-y-manuales/aplicacion- (tkinter)
blockchain-desde-cero/#comments) (https://recursospython.com/gui
y-
manuales/introduccion-
a-tkinter/)
Requisitos
Un conocimiento básico de programación en Python [véase el
tutorial de Python (https://tutorial.recursospython.com/)].
El microframework Flask (http://flask.pocoo.org/) (para crear
puntos de acceso para el servidor blockchain).
Comentarios
Fundamentos
recientes
Blockchain público vs. privado Recursos Python en psutil
– Utilidades
Una red blockchain pública, como la red Bitcoin, está
multiplataforma para
completamente abierta al público, y cualquiera puede unirse y
procesos
participar.
(https://recursospython.com/gui
En la otra mano, negocios que requieren de mayor privacidad, y-manuales/psutil-
seguridad y velocidad en las transacciones optan por una red utilidades-
blockchain privada, donde los participantes necesitan una multiplataforma-para-
invitación para unirse. Saber más procesos/#comment-971)
(https://www.ibm.com/blogs/blockchain/2017/05/the- Recursos Python en
difference-between-public-and-private-blockchain/). Decoradores
(https://recursospython.com/gui
En 2008, un artículo titulado Bitcoin: un sistema de dinero y-
electrónico peer-to-peer (https://bitcoin.org/bitcoin.pdf) fue manuales/decoradores/#comme
publicado por un individuo (o tal vez un grupo) llamado Satoshi 970)
Nakamoto. El artículo combinaba técnicas criptográficas y una red asdf en psutil – Utilidades
peer-to-peer sin la necesidad de confiar en una autoridad multiplataforma para
centralizada (como los bancos) para realizar pagos de una persona a procesos
otra. Nació Bitcoin. Además de Bitcoin, el mismo artículo introdujo (https://recursospython.com/gui
un sistema distribuido para almacenar información (ahora conocido y-manuales/psutil-
popularmente como «blockchain»), que tiene un campo de utilidades-
aplicación mucho más amplio que únicamente pagos o multiplataforma-para-
criptomonedas. procesos/#comment-
969)
Desde entonces, el interés por el blockchain ha estallado en Carlos Rodriguez en
prácticamente toda la industria. Blockchain es ahora la tecnología Decoradores
debajo de criptomonedas completamente digitales como Bitcoin, (https://recursospython.com/gui
tecnologías de computación distribuida como Ethereum, y y-
frameworks de código abierto como Hyperledger Fabric manuales/decoradores/#comme
(https://www.ibm.com/developerworks/cloud/library/cl-top- 968)
technical-advantages-of-hyperledger-fabric-for-blockchain- Recursos Python en Lista
networks/), sobre donde está montada la IBM Blockchain Platform desplegable (Combobox)
(https://www.ibm.com/developerworks/cloud/library/cl-ibm- en Tcl/Tk (tkinter)
blockchain-platform-develop-govern-operate-your-business- (https://recursospython.com/gui
network/). y-manuales/lista-
desplegable-combobox-
¿Qué es «blockchain»?
en-tkinter/#comment-
Blockchain es una forma de almacenar información digital. La 967)
información puede ser literalmente cualquier cosa. Para Bitcoin, son
transacciones (transferencias de Bitcoins de una cuenta a otra), pero
pueden incluso ser archivos; no importa. La información está
almacenada en forma de bloques, que están encadenados usando
hashes. De aquí el nombre «blockchain» [block = bloque, chain =
cadena, «cadena de bloques»].
Toda la magia radica en el modo en que la información es añadida y
almacenada en el blockchain, que produce algunas características
altamente deseables:
Inmutabilidad de la historia.
Invulnerabilidad del sistema.
Persistencia de la información.
No hay un solo punto de falla.
Acerca de la aplicación
1. Contenido
2. Autor
3. Fecha de publicación [timestamp]
"author": "nombre_del_autor",
1. class Block:
2. def __init__(self, index, transactions, timestamp):
3. self.index = []
4. self.transactions = transactions
5. self.timestamp = timestamp
2. Hacer los bloques inmutables
Nos gustaría detectar cualquier tipo de manipulación en la
información almacenada dentro de un bloque. En blockchain, esto
se hace usando una función hash.
1. class Blockchain:
2.
3. def __init__(self):
4. self.unconfirmed_transactions = [] # información
para insertar en el blockchain
5. self.chain = []
6. self.create_genesis_block()
7.
8. def create_genesis_block(self):
9. """
10. Una función para generar el bloque génesis y
añadirlo a la
11. cadena. El bloque tiene index 0, previous_hash 0 y
un hash
12. válido.
13. """
14. genesis_block = Block(0, [], time.time(), "0")
15. genesis_block.hash = genesis_block.compute_hash()
16. self.chain.append(genesis_block)
17.
18. @property
19. def last_block(self):
20. return self.chain[-1]
1. class Blockchain:
2. # Dificultad del algoritmo de prueba de trabajo.
3. difficulty = 2
4.
5. """
6. Código anterior...
7. """
8.
9. def proof_of_work(self, block):
10. """
11. Función que intenta distintos valores de nonce hasta
obtener
12. un hash que satisfaga nuestro criterio de
dificultad.
13. """
14. block.nonce = 0
15.
16. computed_hash = block.compute_hash()
17. while not computed_hash.startswith('0' *
Blockchain.difficulty):
18. block.nonce += 1
19. computed_hash = block.compute_hash()
20.
21. return computed_hash
1. class Blockchain:
2. """
3. Código anterior...
4. """
5. def add_block(self, block, proof):
6. """
7. Una función que agrega el bloque a la cadena luego
de la verificación.
8. """
9. previous_hash = self.last_block.hash
10.
11. if previous_hash != block.previous_hash:
12. return False
13.
14. if not self.is_valid_proof(block, proof):
15. return False
16.
17. block.hash = proof
18. self.chain.append(block)
19. return True
20.
21. def is_valid_proof(self, block, block_hash):
22. """
23. Chquear si block_hash es un hash válido y satisface
nuestro
24. criterio de dificultad.
25. """
26. return (block_hash.startswith('0' *
Blockchain.difficulty) and
27. block_hash == block.compute_hash())
Minado
1. class Blockchain:
2. """
3. Código anterior...
4. """
5.
6. def add_new_transaction(self, transaction):
7.
self.unconfirmed_transactions.append(transaction)
8.
9. def mine(self):
10. """
11. Esta función sirve como una interfaz para añadir las
transacciones
12. pendientes al blockchain añadiéndolas al bloque y
calculando la
13. prueba de trabajo.
14. """
15. if not self.unconfirmed_transactions:
16. return False
17.
18. last_block = self.last_block
19.
20. new_block = Block(index=last_block.index + 1,
21.
transactions=self.unconfirmed_transactions,
22. timestamp=time.time(),
23. previous_hash=last_block.hash)
24.
25. proof = self.proof_of_work(new_block)
26. self.add_block(new_block, proof)
27. self.unconfirmed_transactions = []
28. return new_block.index
Muy bien, ya casi estamos. Puedes ver el código completo hasta este
momento en GitHub
(https://github.com/satwikkansal/ibm_blockchain/blob/3d252de03586
6. Crear interfaces
Bien, ahora es momento de crear interfaces para nuestro nodo para
interactuar con otros compañeros así como con la aplicación que
vamos a crear. Estaremos utilizando Flask para crear una REST-API
que interactúe con nuestro nodo. Aquí está el código para ello:
1. @app.route('/new_transaction', methods=['POST'])
2. def new_transaction():
3. tx_data = request.get_json()
4. required_fields = ["author", "content"]
5.
6. for field in required_fields:
7. if not tx_data.get(field):
8. return "Invlaid transaction data", 404
9.
10. tx_data["timestamp"] = time.time()
11.
12. blockchain.add_new_transaction(tx_data)
13.
14. return "Success", 201
1. @app.route('/chain', methods=['GET'])
2. def get_chain():
3. chain_data = []
4. for block in blockchain.chain:
5. chain_data.append(block.__dict__)
6. return json.dumps({"length": len(chain_data),
7. "chain": chain_data})
Y aquí hay otro para solicitar al nodo que mine las transacciones sin
confirmar (si es que hay alguna).
1. @app.route('/mine', methods=['GET'])
2. def mine_unconfirmed_transactions():
3. result = blockchain.mine()
4. if not result:
5. return "No transactions to mine"
6. return "Block #{} is mined.".format(result)
7.
8.
9. # punto de acceso para obtener las transacciones
10. # no confirmadas
11. @app.route('/pending_tx')
12. def get_pending_tx():
13. return json.dumps(blockchain.unconfirmed_transactions)
14.
15.
16. app.run(debug=True, port=8000)
1. def consensus():
2. """
3. Nuestro simple algoritmo de consenso. Si una cadena
válida más larga es
4. encontrada, la nuestra es reemplazada por ella.
5. """
6. global blockchain
7.
8. longest_chain = None
9. current_len = len(blockchain)
10.
11. for node in peers:
12. response =
requests.get('http://{}/chain'.format(node))
13. length = response.json()['length']
14. chain = response.json()['chain']
15. if length > current_len and
blockchain.check_chain_validity(chain):
16. current_len = length
17. longest_chain = chain
18.
19. if longest_chain:
20. blockchain = longest_chain
21. return True
22.
23. return False
8. Crear la aplicación
Bien, el backend está listo. Puedes ver el código hasta este momento
en GitHub
(https://github.com/satwikkansal/ibm_blockchain/blob/631346a130a4ef
1. import datetime
2. import json
3.
4. import requests
5. from flask import render_template, redirect, request
6.
7. from app import app
8.
9.
10. CONNECTED_NODE_ADDRESS = "http://127.0.0.1:8000"
11.
12. posts = []
La función fetch_posts obtiene la información de la URL /chain del
nodo, la procesa y la almacena localmente.
1. def fetch_posts():
2. get_chain_address = "
{}/chain".format(CONNECTED_NODE_ADDRESS)
3. response = requests.get(get_chain_address)
4. if response.status_code == 200:
5. content = []
6. chain = json.loads(response.content)
7. for block in chain["chain"]:
8. for tx in block["transactions"]:
9. tx["index"] = block["index"]
10. tx["hash"] = block["previous_hash"]
11. content.append(tx)
12.
13. global posts
14. posts = sorted(content, key=lambda k:
k['timestamp'],
15. reverse=True)
1. @app.route('/submit', methods=['POST'])
2. def submit_textarea():
3. """
4. Punto de acceso para crear una nueva transacción vía
nuestra
5. aplicación.
6. """
7. post_content = request.form["content"]
8. author = request.form["author"]
9.
10. post_object = {
11. 'author': author,
12. 'content': post_content,
13. }
14.
15. # Submit a transaction
16. new_tx_address = "
{}/new_transaction".format(CONNECTED_NODE_ADDRESS)
17.
18. requests.post(new_tx_address,
19. json=post_object,
20. headers={'Content-type':
'application/json'})
21.
22. return redirect('/')
9. Ejecutar la aplicación
¡Está lista! Puedes encontrar el código final en GitHub
(https://github.com/satwikkansal/ibm_blockchain).
python node_server.py
2. Ejecuta la aplicación:
python run_app.py
(https://recursospython.com/wp-
content/uploads/2018/06/fig01.png)
(https://recursospython.com/wp-
content/uploads/2018/06/fig02.jpg)
(https://recursospython.com/wp-
content/uploads/2018/06/fig03.png)
Verificar transacciones
Conclusión
Este tutorial cubrió los fundamentos de un blockchain público. Si lo
seguiste completamente, has implementado un blockchain desde
cero y creado una simple aplicación permitiendo a los usuarios
compartir información en él.
(/#facebook) (/#twitter)
Entrada publicada en
Guías y Manuales (https://recursospython.com/category/guias-y-manuales/) con las
etiquetas blockchain (https://recursospython.com/tag/blockchain/)
flask (https://recursospython.com/tag/flask/)
34 comentarios.
Sergio says:
julio 28, 2021 at 1:30 am
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-954)
Responder
Saludos
Responder
LUIS says:
junio 30, 2021 at 5:22 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-944)
Responder
Saludos
Responder
LUIS says:
julio 1, 2021 at 2:59 am
(https://recursospython.com/guias-
y-manuales/aplicacion-blockchain-
desde-cero/#comment-946)
Responder
Recursos Python
says:
julio 1, 2021 at 12:32 pm
(https://recursospython.com/guias-
y-manuales/aplicacion-
blockchain-desde-
cero/#comment-947)
Hola, Luis.
Responder
Sergio says:
junio 16, 2021 at 10:00 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-933)
Hola.
Luego,
2)Ejecuta la aplicación:
Saludos
Responder
Responder
edu says:
mayo 29, 2021 at 5:16 am
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-922)
ultima cosa
>>> sha256(data).hexdigest()
‘7c79eb1f1853630a00ea195b8f2979f16c1ea8016d9e487e1099537c02f513d9’
>>> sha256(data).hexdigest() # No importa cuántas veces lo
ejecutes, siempre retorna lo mismo.
‘7c79eb1f1853630a00ea195b8f2979f16c1ea8016d9e487e1099537c02f513d9’
Responder
Saludos
Responder
edu says:
mayo 29, 2021 at 5:13 am
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-921)
primer:
segundo:
run_app.py.
Responder
Gonzalo says:
abril 8, 2021 at 9:14 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-883)
Responder
Responder
Marcos says:
marzo 4, 2021 at 9:24 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-861)
Excelente Post..!
Responder
Miroslav says:
febrero 17, 2021 at 6:54 am
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-853)
Hola, genesis_block.hash = genesis_block.compute_hash() no
entiendo esta línea por el » hash» a secas sin nada en la
declaración de genesis_block.hash ?es un método hash() y va
a secas…
Saludos
Responder
Saludos!
Responder
Satellite says:
octubre 5, 2020 at 3:56 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-798)
Responder
Responder
Saludos
Responder
Alexander says:
abril 20, 2020 at 9:43 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-680)
Responder
Michelle says:
marzo 30, 2020 at 6:59 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-658)
SALUDOS!!
Responder
Recursos Python says:
marzo 31, 2020 at 11:16 am
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-661)
Responder
Fabian says:
julio 3, 2019 at 1:18 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-557)
Responder
Saludos!
Responder
Fabian says:
julio 4, 2019 at 10:59 am
(https://recursospython.com/guias-
y-manuales/aplicacion-blockchain-
desde-cero/#comment-559)
Entiendo lo de descentralización, pero
imaginaba que cada nodo tenia su base de
datos con los bloques aprobados y los
pendientes. Entonces la información queda
en memoria unicamente? Desconozco
python, pero entonces si reinicio el server se
pierde la información del nodo? (igualmente
entiendo que si esto pasa la información
estaria en otro nodo con lo que se
restauraria). Aprovecho para hacer otra
consulta, tiene que haber un lugar central
donde se administren los nodos y se asigne
el nodo al cual se va a enviar la informacion?
Sino como funciona la asignacion del
CONNECTED_NODE_ADDRESS?
Responder
Responder
Saludos
Responder
aargom says:
marzo 3, 2019 at 9:18 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-529)
Responder
Inge says:
febrero 28, 2019 at 1:51 am
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-524)
Responder
Responder
Responder
Jose says:
abril 26, 2021 at 11:12 am
(https://recursospython.com/guias-
y-manuales/aplicacion-blockchain-
desde-cero/#comment-897)
Responder
Recursos Python
says:
abril 26, 2021 at 12:34 pm
(https://recursospython.com/guias-
y-manuales/aplicacion-
blockchain-desde-
cero/#comment-898)
Saludos
Responder
Rafael says:
diciembre 30, 2018 at 10:25 pm
(https://recursospython.com/guias-y-
manuales/aplicacion-blockchain-desde-
cero/#comment-504)
Responder
Comentario
Nombre * Email *
Publicar el comentario
© 2013 - 2021
(https://creativecommons.org/licenses/by-nc/3.0/deed.es)