{"id":59,"date":"2015-05-25T22:41:52","date_gmt":"2015-05-25T22:41:52","guid":{"rendered":"https:\/\/40933013.servicio-online.net\/?p=59"},"modified":"2024-05-19T15:14:45","modified_gmt":"2024-05-19T15:14:45","slug":"algoritmos-de-consenso-en-blockchain-prueba-de-trabajo","status":"publish","type":"post","link":"https:\/\/santiagomarquezsolis.com\/index.php\/2015\/05\/25\/algoritmos-de-consenso-en-blockchain-prueba-de-trabajo\/","title":{"rendered":"Algoritmos de Consenso en Blockchain. Prueba de Trabajo"},"content":{"rendered":"<p>Dejando un rato de lado nuestra peque\u00f1a implementaci\u00f3n Blockchain en Python, vamos a hacer un par\u00e9ntesis para hablar de una de las piezas fundamentales en esta tecnolog\u00eda, los algoritmos de consenso y nos centraremos hoy en el m\u00e1s usado, al menos a dia de hoy, el popularizado por Bitcoin y conocido como Prueba de Trabajo o Proof of Work (PoW).<\/p>\n<p>Las tecnolog\u00edas de blockchain han revolucionado diversos sectores gracias a su capacidad para proporcionar un registro descentralizado, seguro y transparente de transacciones. En el coraz\u00f3n de esta tecnolog\u00eda se encuentran los algoritmos de consenso, que permiten a los nodos de una red blockchain ponerse de acuerdo sobre el estado de la red de manera segura y eficiente. Este art\u00edculo explora los fundamentos de los algoritmos de consenso en la blockchain, con un enfoque detallado en la Prueba de Trabajo (Proof of Work, PoW).<\/p>\n<h3>Qu\u00e9 es un Algoritmo de Consenso<\/h3>\n<p>Un algoritmo de consenso es un protocolo que permite a todos los participantes de una red distribuida acordar sobre una \u00fanica versi\u00f3n de la verdad, a pesar de posibles fallos y actores malintencionados. En el contexto de la blockchain, el consenso es crucial para asegurar que todas las transacciones sean v\u00e1lidas y para evitar el problema del doble gasto, donde la misma criptomoneda podr\u00eda ser utilizada en m\u00e1s de una transacci\u00f3n.<\/p>\n<h3>Tipos de Algoritmos de Consenso<\/h3>\n<p>Existen varios algoritmos de consenso utilizados en las blockchains, entre los cuales los m\u00e1s conocidos son:<\/p>\n<ol>\n<li><strong>Prueba de Trabajo (Proof of Work, PoW)<\/strong><\/li>\n<li><strong>Prueba de Participaci\u00f3n (Proof of Stake, PoS)<\/strong><\/li>\n<li><strong>Delegated Proof of Stake (DPoS)<\/strong><\/li>\n<li><strong>Byzantine Fault Tolerance (BFT)<\/strong><\/li>\n<li><strong>Prueba de Participaci\u00f3n por Delegaci\u00f3n (DPoS)<\/strong><\/li>\n<\/ol>\n<p>Cada uno de estos algoritmos tiene sus propias ventajas y desventajas en t\u00e9rminos de seguridad, escalabilidad y consumo de energ\u00eda.<\/p>\n<h3>Prueba de Trabajo (PoW)<\/h3>\n<p>La Prueba de Trabajo es uno de los algoritmos de consenso m\u00e1s antiguos y fue introducido por primera vez en el contexto de las criptomonedas con la aparici\u00f3n de Bitcoin en 2009, propuesto por el seud\u00f3nimo Satoshi Nakamoto. A continuaci\u00f3n, se explica en detalle c\u00f3mo funciona la PoW.<\/p>\n<h4>Funcionamiento de la Prueba de Trabajo<\/h4>\n<p>En la Prueba de Trabajo, los mineros compiten para resolver un problema matem\u00e1tico complejo, que requiere una considerable cantidad de poder computacional. Este problema implica encontrar un hash (resultado de una funci\u00f3n criptogr\u00e1fica) que cumpla con ciertos criterios de dificultad.<\/p>\n<ol>\n<li><strong>Creaci\u00f3n de un Bloque<\/strong>: Los mineros recogen las transacciones pendientes y las agrupan en un bloque candidato.<\/li>\n<li><strong>Resoluci\u00f3n del Problema<\/strong>: Los mineros intentan encontrar un valor nonce, que al ser a\u00f1adido al bloque y pasado por la funci\u00f3n hash, produce un hash que es menor que un valor objetivo predefinido.<\/li>\n<li><strong>Verificaci\u00f3n<\/strong>: Una vez que un minero encuentra un hash v\u00e1lido, el bloque es transmitido a la red. Otros nodos verifican la validez del hash y, si es correcto, el bloque se a\u00f1ade a la cadena.<\/li>\n<li><strong>Recompensa<\/strong>: El minero que resuelve el problema recibe una recompensa en la criptomoneda nativa de la red (por ejemplo, Bitcoin) y las tarifas de transacci\u00f3n incluidas en el bloque.<\/li>\n<\/ol>\n<h4>Dificultad y Seguridad<\/h4>\n<p>La dificultad del problema de hash se ajusta peri\u00f3dicamente para garantizar que el tiempo promedio para encontrar un nuevo bloque se mantenga constante (en Bitcoin, aproximadamente cada 10 minutos). Esto se hace modificando el valor objetivo que el hash del bloque debe cumplir.<\/p>\n<p>La seguridad de la PoW radica en el hecho de que es extremadamente dif\u00edcil y costoso para un atacante modificar la blockchain. Para cambiar un bloque, el atacante tendr\u00eda que recomputar el hash del bloque modificado y de todos los bloques posteriores, lo cual requerir\u00eda m\u00e1s poder computacional que el de toda la red combinada.<\/p>\n<h4>Ventajas y Desventajas de la Prueba de Trabajo<\/h4>\n<p><strong>Ventajas:<\/strong><\/p>\n<ul>\n<li><strong>Alta seguridad<\/strong>: La PoW es muy segura debido al alto costo computacional requerido para realizar ataques.<\/li>\n<li><strong>Descentralizaci\u00f3n<\/strong>: Fomenta una alta descentralizaci\u00f3n, ya que cualquier persona con el equipo adecuado puede convertirse en minero.<\/li>\n<\/ul>\n<p><strong>Desventajas:<\/strong><\/p>\n<ul>\n<li><strong>Alto consumo energ\u00e9tico<\/strong>: La PoW consume grandes cantidades de electricidad, lo que ha suscitado preocupaciones ambientales.<\/li>\n<li><strong>Escalabilidad limitada<\/strong>: Las transacciones por segundo (TPS) en redes PoW son limitadas debido a los tiempos necesarios para resolver los problemas de hash.<\/li>\n<li><strong>Centralizaci\u00f3n de la miner\u00eda<\/strong>: En la pr\u00e1ctica, la miner\u00eda tiende a centralizarse en grandes pools de miner\u00eda que pueden permitirse el hardware especializado y los costos de energ\u00eda.<\/li>\n<\/ul>\n<p>De momento lo dejamos aqu\u00ed, concluyendo que los algoritmos de consenso son esenciales para el funcionamiento seguro y eficiente de las redes blockchain. La Prueba de Trabajo, aunque robusta y segura, enfrenta desaf\u00edos en t\u00e9rminos de escalabilidad y consumo energ\u00e9tico. A medida que la tecnolog\u00eda blockchain evoluciona, se desarrollan y prueban nuevos algoritmos de consenso que buscan mejorar estos aspectos, como la Prueba de Participaci\u00f3n y otros enfoques innovadores.<\/p>\n<p>Entender c\u00f3mo funcionan estos algoritmos y sus implicaciones es fundamental para cualquier persona interesada en la tecnolog\u00eda blockchain y su futuro desarrollo. La Prueba de Trabajo ha establecido una base s\u00f3lida, pero el campo sigue evolucionando, ofreciendo nuevas soluciones y oportunidades para un futuro m\u00e1s descentralizado y eficiente.<\/p>\n<h4>Implementaci\u00f3n en Python<\/h4>\n<p>Lo anterior est\u00e1 muy bien, sin embargo, \u00bfqu\u00e9 aspecto tendr\u00eda si lo llevamos a c\u00f3digo? bueno pues aqu\u00ed tenemos una peque\u00f1a implementaci\u00f3n en Python, como podemos ver, el algoritmo en s\u00ed mismo es bastante simple y no resulta muy dificil de seguir, el c\u00f3digo est\u00e1 disponible el enlace a mi repositorio de Github est\u00e1 <a href=\"https:\/\/github.com\/santiagomarquezsolis-me\/blockchain-consensus\/blob\/main\/pow.py\">aqu\u00ed<\/a>.<\/p>\n<p>Lo m\u00e1s interesante del c\u00f3digo anterior lo podemos resumir del modo siguiente:<\/p>\n<ol>\n<li><strong>Clase ProofOfWork<\/strong>: Esta clase encapsula el algoritmo de Prueba de Trabajo.\n<ul>\n<li><strong><code>__init__<\/code><\/strong>: Inicializa la clase con un nivel de dificultad especificado. La dificultad determina cu\u00e1ntos ceros iniciales debe tener el hash.<\/li>\n<li><strong><code>mine_block<\/code><\/strong>: Realiza el proceso de miner\u00eda del bloque. Empieza con un nonce de 0 y calcula el hash del bloque con el nonce. Si el hash cumple con los requisitos de dificultad (es decir, tiene el n\u00famero requerido de ceros iniciales), devuelve el nonce y el hash. El proceso se repite incrementando el nonce hasta que se encuentre un hash v\u00e1lido.<\/li>\n<li><strong><code>calculate_hash<\/code><\/strong>: Calcula el hash SHA-256 para los datos del bloque concatenados con el nonce. Devuelve el hash en formato hexadecimal.<\/li>\n<li><strong><code>validate_block<\/code><\/strong>: Verifica que el hash del bloque con el nonce proporcionado cumple con los requisitos de dificultad.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Uso del Ejemplo<\/strong>:\n<ul>\n<li><strong><code>difficulty<\/code><\/strong>: Define la dificultad como el n\u00famero de ceros iniciales requeridos en el hash.<\/li>\n<li><strong><code>block_data<\/code><\/strong>: Define los datos del bloque que se desean minar.<\/li>\n<li><strong><code>pow<\/code><\/strong>: Crea una instancia de <code>ProofOfWork<\/code> con la dificultad especificada.<\/li>\n<li><strong><code>mine_block<\/code><\/strong>: Llama al m\u00e9todo <code>mine_block<\/code> para minar el bloque y obtener el nonce y el hash resultante.<\/li>\n<li><strong><code>validate_block<\/code><\/strong>: Valida que el bloque minado es correcto utilizando el m\u00e9todo <code>validate_block<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Este c\u00f3digo minar\u00e1 un bloque con los datos proporcionados y un nivel de dificultad especificado. La salida incluir\u00e1 el nonce encontrado, el hash correspondiente y el tiempo que tom\u00f3 minar el bloque. Luego, se verificar\u00e1 si el bloque es v\u00e1lido.<\/p>\n<p>Y nada m\u00e1s, creo que puede ser una buena base para hacer algo m\u00e1s complicado o incluirlo dentro de otro programa m\u00e1s complejo.<\/p>\n<hr \/>\n<p>Tal y como suelo hacer siempre, os dejo algunos enlaces de inter\u00e9s por si quer\u00e9is profundizar m\u00e1s:<\/p>\n<h3>Fuentes:<\/h3>\n<ol>\n<li><a href=\"https:\/\/bitcoin.org\/bitcoin.pdf\">Nakamoto, S. (2008). Bitcoin: A Peer-to-Peer Electronic Cash System<\/a>.<\/li>\n<li>Garay, J., Kiayias, A., &amp; Leonardos, N. (2015). The Bitcoin Backbone Protocol: Analysis and Applications. <em>Advances in Cryptology &#8211; EUROCRYPT 2015<\/em>, 129-148.<\/li>\n<li>Dwork, C., &amp; Naor, M. (1993). Pricing via Processing or Combatting Junk Mail. <em>CRYPTO &#8217;92<\/em>, 139-147.<\/li>\n<li>Castro, M., &amp; Liskov, B. (1999). Practical Byzantine Fault Tolerance. <em>OSDI &#8217;99<\/em>, 173-186.<\/li>\n<li><a href=\"https:\/\/www.semanticscholar.org\/paper\/PPCoin%3A-Peer-to-Peer-Crypto-Currency-with-King-Nadal\/0db38d32069f3341d34c35085dc009a85ba13c13\">King, S., &amp; Nadal, S. (2012). PPCoin: Peer-to-Peer Crypto-Currency with Proof-of-Stake. <\/a><\/li>\n<li><a href=\"https:\/\/blockchainlab.com\/pdf\/Ethereum_white_paper-a_next_generation_smart_contract_and_decentralized_application_platform-vitalik-buterin.pdf\">Buterin, V. (2013). Ethereum: A Next-Generation Smart Contract and Decentralized Application Platform.<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Dejando un rato de lado nuestra peque\u00f1a implementaci\u00f3n Blockchain en Python, vamos a hacer un par\u00e9ntesis para hablar de una de las piezas fundamentales en esta tecnolog\u00eda, los algoritmos de consenso y nos centraremos hoy en el m\u00e1s usado, al menos a dia de hoy, el popularizado por Bitcoin y conocido como Prueba de Trabajo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":61,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,12],"tags":[19,13,16,17,22,21,20],"class_list":["post-59","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-cripto","tag-algoritmos-de-consenso","tag-bitcoin","tag-blockchain","tag-cripto","tag-pow","tag-proof-of-work","tag-prueba-de-trabajo"],"jetpack_featured_media_url":"https:\/\/santiagomarquezsolis.com\/wp-content\/uploads\/2015\/05\/pow-e1716072573119.webp","_links":{"self":[{"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/posts\/59","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/comments?post=59"}],"version-history":[{"count":6,"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/posts\/59\/revisions"}],"predecessor-version":[{"id":69,"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/posts\/59\/revisions\/69"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/media\/61"}],"wp:attachment":[{"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/media?parent=59"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/categories?post=59"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/santiagomarquezsolis.com\/index.php\/wp-json\/wp\/v2\/tags?post=59"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}