<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ criptomoneda - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ criptomoneda - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 15 May 2026 09:22:15 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/criptomoneda/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear tu propia criptomoneda usando Python ]]>
                </title>
                <description>
                    <![CDATA[ > Con el auge actual de las criptomonedas, blockchain está creando un gran revuelo en el mundo de la tecnología. Esta tecnología ha atraído tanta atención principalmente por su capacidad para garantizar la seguridad, hacer cumplir la descentralización y acelerar los procesos en varias industrias, especialmente en la industria financiera. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-tu-propia-criptomoneda-usando-python/</link>
                <guid isPermaLink="false">644099882ef44808032f9eb1</guid>
                
                    <category>
                        <![CDATA[ criptomoneda ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ BlackeyeB ]]>
                </dc:creator>
                <pubDate>Thu, 27 Apr 2023 18:12:38 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/04/blockchain-3448502_1920-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/create-cryptocurrency-using-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Create Your Own Cryptocurrency Using Python</a>
      </p><blockquote>Con el auge actual de las criptomonedas, blockchain está creando un gran revuelo en el mundo de la tecnología. Esta tecnología ha atraído tanta atención principalmente por su capacidad para garantizar la seguridad, hacer cumplir la descentralización y acelerar los procesos en varias industrias, especialmente en la industria financiera.</blockquote><p>Esencialmente, una cadena de bloques (blockchain) es una base de datos pública que documenta y auténtica irreversiblemente la posesión y transmisión de activos digitales. Las monedas digitales, como Bitcoin y Ethereum, se basan en este concepto. Blockchain es una tecnología emocionante que puedes utilizar para transformar las capacidades de tus aplicaciones.</p><p>Últimamente, hemos visto gobiernos, organizaciones e individuos que utilizan la tecnología blockchain para crear sus propias criptomonedas y evitar quedarse atrás. En particular, cuando Facebook propuso su propia criptomoneda, llamada Libra, el anuncio agitó muchas aguas en todo el mundo.</p><p>¿Qué pasaría si también pudieras hacer lo mismo y crear tu propia versión de una criptomoneda?</p><p>Pensé en esto y decidí desarrollar un algoritmo que crea una criptografía.</p><p>Decidí llamar a la criptomoneda <strong><strong>fccCoin</strong></strong>.</p><p>En este tutorial, voy a ilustrar el proceso paso a paso que utilicé para crear la moneda digital (utilicé los conceptos orientados a objetos del lenguaje de programación <a href="https://www.freecodecamp.org/espanol/news/los-mejores-tutoriales-de-python/">Python</a>).</p><p>Este es el modelo básico del algoritmo de cadena de bloques para crear <strong><strong>fccCoin</strong></strong>:</p><pre><code class="language-python">class Block:

    def __init__():

    #primera clase bloque

        pass
    
    def calculate_hash():
    
    #calcula el hash criptográfico de cada bloque    
    
class BlockChain:
    
    def __init__(self):
     # método constructor
    pass
    
    def construct_genesis(self):
        # construye el bloque inicial
        pass

    def construct_block(self, proof_no, prev_hash):
        # construye un nuevo bloque y lo agrega a la cadena
        pass

    @staticmethod
    def check_validity():
        # comprueba si la cadena de bloques es válida
        pass

    def new_data(self, sender, recipient, quantity):
        # agrega una nueva transacción a los datos de las transacciones
        pass

    @staticmethod
    def construct_proof_of_work(prev_proof):
        # protege la cadena de bloques de ataques
        pass
   
    @property
    def last_block(self):
        # devuelve el último bloque de la cadena
        return self.chain[-1]

</code></pre><p>Ahora, déjame explicarte lo que está sucediendo...</p><h2 id="1-construyendo-la-primera-clase-block"><strong>1. Construyendo la primera clase Block</strong></h2><p>Una cadena de bloques se compone de varios bloques que se unen entre sí (eso suena familiar, ¿verdad?).</p><p>El encadenamiento de bloques se lleva a cabo de tal manera que si se manipula un bloque, el resto de la cadena se vuelve inválido.</p><p>Al aplicar el concepto anterior, creé la siguiente clase Block inicial:</p><pre><code class="language-python">import hashlib
import time

class Block:

    def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
        self.index = index
        self.proof_no = proof_no
        self.prev_hash = prev_hash
        self.data = data
        self.timestamp = timestamp or time.time()

    @property
    def calculate_hash(self):
        block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
                                              self.prev_hash, self.data,
                                              self.timestamp)

        return hashlib.sha256(block_of_string.encode()).hexdigest()

    def __repr__(self):
        return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
                                               self.prev_hash, self.data,
                                               self.timestamp)
</code></pre><p><br>Como puedes ver en el código anterior, definí la función <strong><strong>__init__()</strong></strong>, que se ejecutará cuando se inicie la clase <strong><strong>Block</strong></strong>, como en cualquier otra clase de Python.</p><p>Proporcioné los siguientes parámetros a la función de iniciación:</p><ul><li><strong><strong>self</strong></strong>—se refiere a la instancia de la clase <strong><strong>Block</strong></strong>, que permite acceder a los métodos y atributos asociados a la clase;</li><li><strong>index</strong>—realiza un seguimiento de la posición del bloque dentro de la cadena de bloques;</li><li><strong><strong>proof_no</strong></strong>—este es el número producido durante la creación de un nuevo bloque (llamado minería);</li><li><strong><strong>prev_hash</strong></strong>—se refiere al hash del bloque anterior dentro de la cadena;</li><li><strong><strong>dat</strong>a</strong>—esto brinda un registro de todas las transacciones completadas, como la cantidad comprada;</li><li><strong><strong>timestamp</strong></strong>—esto coloca una marca de tiempo para las transacciones.</li></ul><p>El segundo método de la clase, <strong>calculate<strong>_hash</strong></strong>, generará el hash de los bloques utilizando los valores anteriores. El módulo SHA-256 se importa al proyecto para ayudar a obtener los hash de los bloques.</p><p>Una vez que los valores se hayan ingresado en el algoritmo hash criptográfico, la función devolverá una cadena de 256 bits que representa el contenido del bloque.</p><p>Así es como se logra la seguridad en las cadenas de bloques: cada bloque tendrá un hash y ese hash se basará en el hash del bloque anterior.</p><p>Como tal, si alguien intenta comprometer cualquier bloque de la cadena, los otros bloques tendrán hashes no válidos, lo que provocará la interrupción de toda la red de la cadena de bloques.</p><p>En última instancia, un bloque se verá así:</p><pre><code class="language-python">{
    "index": 2,
    "proof": 21,
    "prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823",
    "transactions": [
        {'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}
    ],
    "timestamp": 1521646442.4096143
}
</code></pre><h2 id="2-construyendo-la-clase-blockchain"><strong>2. Construyendo la clase Blockchain</strong></h2><p>La idea principal de una cadena de bloques, tal como su nombre lo indica, consiste en "encadenar" varios bloques entre sí.</p><p>Por lo tanto, voy a construir una clase <strong><strong>Blockchain</strong></strong> que será útil para administrar el funcionamiento de toda la cadena. Aquí es donde se desarrollará la mayor parte de la acción.</p><p>La clase <strong><strong>Blockchain</strong></strong> tendrá varios métodos auxiliares para completar varias tareas en la cadena de bloques.</p><p>Permíteme explicar el papel de cada uno de los métodos en la clase.</p><h3 id="a-m-todo-constructor"><strong>a. Método constructor</strong></h3><p>Este método garantiza que se cree una instancia de la cadena de bloques.</p><pre><code class="language-python">class BlockChain:

    def __init__(self):
        self.chain = []
        self.current_data = []
        self.nodes = set()
        self.construct_genesis()
</code></pre><p>Estos son los roles de sus atributos:</p><ul><li><strong><strong>self.chain</strong></strong> —esta variable mantiene todos los bloques;</li><li><strong><strong>self.current_data</strong></strong> —esta variable mantiene todas las transacciones completadas en el bloque;</li><li><strong><strong>self.construct_genesis()</strong></strong> —este método se encargará de construir el bloque inicial.</li></ul><h3 id="b-construyendo-el-bloque-de-g-nesis"><strong>b. Construyendo el bloque de génesis</strong></h3><p>La cadena de bloques requiere un método <em><em><strong><strong>construct_genesis</strong></strong></em></em> para construir el bloque inicial en la cadena. En la convención de la cadena de bloques, este bloque es especial porque simboliza el inicio de la cadena de bloques.</p><p>En este caso, construyámoslo simplemente pasando algunos valores predeterminados al método <em><em><strong><strong>construct_block</strong></strong></em></em>.</p><p>Le di a <em><em><strong><strong>proof_no</strong></strong></em></em> y <em><em><strong><strong>prev_hash</strong></strong></em></em> un valor de cero, aunque puedes proporcionar cualquier valor que desees.</p><pre><code class="language-python">def construct_genesis(self):
    self.construct_block(proof_no=0, prev_hash=0)


def construct_block(self, proof_no, prev_hash):
    block = Block(
        index=len(self.chain),
        proof_no=proof_no,
        prev_hash=prev_hash,
        data=self.current_data)
    self.current_data = []

    self.chain.append(block)
    return block
</code></pre><h3 id="c-construyendo-nuevos-bloques-"><strong>C. Construyendo nuevos bloques.</strong></h3><p>El método <strong><strong><em><em>construct_block</em></em> </strong></strong>se utiliza para crear nuevos bloques en la cadena de bloques.</p><p>Esto es lo que está ocurriendo con los diversos atributos de este método:</p><ul><li><strong>index</strong>—esto representa la longitud de la cadena de bloques;</li><li><strong><strong>proof_nor &amp; prev_hash</strong></strong> —el método que llama los pasa;</li><li><strong><strong>data</strong></strong> — contiene un registro de todas las transacciones que no están incluidas en ningún bloque del nodo;</li><li><strong><strong>self.current_data</strong></strong>: se usa para restablecer la lista de transacciones en el nodo. Si se ha construido un bloque y se le han asignado transacciones, la lista se restablece para garantizar que se agreguen transacciones futuras a esta lista. Y, este proceso se llevará a cabo continuamente;</li><li><strong><strong>self.chain.append()—</strong></strong> este método une bloques recién construidos a la cadena;</li><li><strong><strong>return</strong></strong>: por último, se devuelve un objeto de bloque construido.</li></ul><h3 id="d-comprobaci-n-de-validez"><strong>d. Comprobación de validez</strong></h3><p><br>El método <em><em><strong><strong>check_validity</strong></strong></em></em> es importante para evaluar la integridad de la cadena de bloques y garantizar que no haya anomalías.</p><p>Como se mencionó anteriormente, los hashes son esenciales para la seguridad de la cadena de bloques, ya que incluso el más mínimo cambio en el objeto conducirá a la generación de un hash completamente nuevo.</p><p>Por lo tanto, este método <strong><strong><em><em>check_validity</em></em> </strong></strong>usa declaraciones <em><em><strong><strong>if</strong></strong></em></em> para verificar si el hash de cada bloque es correcto.</p><p>También verifica si cada bloque apunta al bloque anterior correcto, comparando el valor de sus hashes. Si todo es correcto, devuelve verdadero; de lo contrario, devuelve falso.</p><pre><code class="language-python">@staticmethod
def check_validity(block, prev_block):
    if prev_block.index + 1 != block.index:
        return False

    elif prev_block.calculate_hash != block.prev_hash:
        return False

    elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no):
        return False

    elif block.timestamp &lt;= prev_block.timestamp:
        return False

    return True
</code></pre><h3 id="e-adici-n-de-datos-de-transacciones"><strong>e. Adición de datos de transacciones</strong></h3><p>El método <em><em><strong><strong>new_data</strong></strong></em></em> se utiliza para agregar los datos de las transacciones a un bloque. Es un método muy simple: acepta tres parámetros (detalles del remitente, detalles del destinatario y cantidad) y agrega los datos de la transacción a la lista <em><em><strong><strong>self.current_data</strong></strong></em></em>.</p><p>Cada vez que se crea un nuevo bloque, esta lista se asigna a ese bloque y se restablece una vez más, como se explica en el método <strong><strong><em><em>construct_block</em></em></strong></strong> .</p><p>Una vez que se han agregado los datos de la transacción a la lista, se devuelve el índice del siguiente bloque que se creará.</p><p>Este índice se calcula sumando 1 al índice del bloque actual (que es el último de la cadena de bloques). Los datos ayudarán al usuario a enviar la transacción en el futuro.</p><pre><code class="language-python">def new_data(self, sender, recipient, quantity):
    self.current_data.append({
        'sender': sender,
        'recipient': recipient,
        'quantity': quantity
    })
    return True

</code></pre><h3 id="f-agregar-prueba-de-trabajo"><strong>f. Agregar prueba de trabajo</strong></h3><p>La prueba de trabajo es un concepto que evita el abuso de la cadena de bloques. Simplemente, su objetivo es identificar un número que resuelva un problema después de realizar una cierta cantidad de trabajo de cómputo.</p><p>Si el nivel de dificultad para identificar el número es alto, se desalienta el spam y la manipulación de la cadena de bloques.</p><p>En este caso, usaremos un algoritmo simple que disuade a las personas de minar bloques o crear bloques fácilmente.</p><pre><code class="language-python">@staticmethod
def proof_of_work(last_proof):
    '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes
         f is the previous f'
         f' is the new proof
        '''
    proof_no = 0
    while BlockChain.verifying_proof(proof_no, last_proof) is False:
        proof_no += 1

    return proof_no


@staticmethod
def verifying_proof(last_proof, proof):
    #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes?

    guess = f'{last_proof}{proof}'.encode()
    guess_hash = hashlib.sha256(guess).hexdigest()
    return guess_hash[:4] == "0000"

</code></pre><h3 id="g-conseguir-el-ltimo-bloque"><strong>g. Conseguir el último bloque</strong></h3><p>Por último, el método <strong><strong><em><em>latest_block</em></em> </strong></strong>es un método auxiliar que ayuda a obtener el último bloque de la cadena de bloques. Recuerde que el último bloque es en realidad el bloque actual de la cadena.</p><pre><code class="language-python">@property
    def latest_block(self):
        return self.chain[-1]
</code></pre><h2 id="sumemos-todo-junto"><strong>Sumemos todo junto</strong></h2><p>Aquí está el código completo para crear la criptomoneda <strong><strong>fccCoin</strong></strong> .</p><p>También puedes obtener el código en <a href="https://github.com/Alfrick/Create-Cryptocurrency-in-Python">este repositorio de GitHub.</a></p><pre><code class="language-python">import hashlib
import time


class Block:

    def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
        self.index = index
        self.proof_no = proof_no
        self.prev_hash = prev_hash
        self.data = data
        self.timestamp = timestamp or time.time()

    @property
    def calculate_hash(self):
        block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
                                              self.prev_hash, self.data,
                                              self.timestamp)

        return hashlib.sha256(block_of_string.encode()).hexdigest()

    def __repr__(self):
        return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
                                               self.prev_hash, self.data,
                                               self.timestamp)


class BlockChain:

    def __init__(self):
        self.chain = []
        self.current_data = []
        self.nodes = set()
        self.construct_genesis()

    def construct_genesis(self):
        self.construct_block(proof_no=0, prev_hash=0)

    def construct_block(self, proof_no, prev_hash):
        block = Block(
            index=len(self.chain),
            proof_no=proof_no,
            prev_hash=prev_hash,
            data=self.current_data)
        self.current_data = []

        self.chain.append(block)
        return block

    @staticmethod
    def check_validity(block, prev_block):
        if prev_block.index + 1 != block.index:
            return False

        elif prev_block.calculate_hash != block.prev_hash:
            return False

        elif not BlockChain.verifying_proof(block.proof_no,
                                            prev_block.proof_no):
            return False

        elif block.timestamp &lt;= prev_block.timestamp:
            return False

        return True

    def new_data(self, sender, recipient, quantity):
        self.current_data.append({
            'sender': sender,
            'recipient': recipient,
            'quantity': quantity
        })
        return True

    @staticmethod
    def proof_of_work(last_proof):
        '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes
         f is the previous f'
         f' is the new proof
        '''
        proof_no = 0
        while BlockChain.verifying_proof(proof_no, last_proof) is False:
            proof_no += 1

        return proof_no

    @staticmethod
    def verifying_proof(last_proof, proof):
        #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes?

        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        return guess_hash[:4] == "0000"

    @property
    def latest_block(self):
        return self.chain[-1]

    def block_mining(self, details_miner):

        self.new_data(
            sender="0",  #it implies that this node has created a new block
            receiver=details_miner,
            quantity=
            1,  #creating a new block (or identifying the proof number) is awarded with 1
        )

        last_block = self.latest_block

        last_proof_no = last_block.proof_no
        proof_no = self.proof_of_work(last_proof_no)

        last_hash = last_block.calculate_hash
        block = self.construct_block(proof_no, last_hash)

        return vars(block)

    def create_node(self, address):
        self.nodes.add(address)
        return True

    @staticmethod
    def obtain_block_object(block_data):
        #obtains block object from the block data

        return Block(
            block_data['index'],
            block_data['proof_no'],
            block_data['prev_hash'],
            block_data['data'],
            timestamp=block_data['timestamp'])

</code></pre><p><br>Ahora, probemos nuestro código para ver si funciona.</p><pre><code class="language-python">blockchain = BlockChain()

print("***Mining fccCoin about to start***")
print(blockchain.chain)

last_block = blockchain.latest_block
last_proof_no = last_block.proof_no
proof_no = blockchain.proof_of_work(last_proof_no)

blockchain.new_data(
    sender="0",  #it implies that this node has created a new block
    recipient="Quincy Larson",  #let's send Quincy some coins!
    quantity=
    1,  #creating a new block (or identifying the proof number) is awarded with 1
)

last_hash = last_block.calculate_hash
block = blockchain.construct_block(proof_no, last_hash)

print("***Mining fccCoin has been successful***")
print(blockchain.chain)
</code></pre><p>¡Funcionó!</p><p>Aquí está el resultado del proceso de minería:</p><pre><code class="language-python">***Mining fccCoin about to start***
[0 - 0 - 0 - [] - 1566930640.2707076]
***Mining fccCoin has been successful***
[0 - 0 - 0 - [] - 1566930640.2707076, 1 - 88914 - a8d45cb77cddeac750a9439d629f394da442672e56edfe05827b5e41f4ba0138 - [{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}] - 1566930640.5363243]
</code></pre><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>¡Ahí tienes!</p><p>Así es como podrías crear tu propia cadena de bloques usando Python.</p><p>Permíteme decir que este tutorial solo demuestra los conceptos básicos para mojarse los pies en la innovadora tecnología blockchain.</p><p>Si <strong><strong>esta moneda</strong></strong> se implementara tal como está, no podría satisfacer las demandas actuales del mercado de una criptomoneda estable, segura y fácil de usar.</p><p>Por lo tanto, aún se puede mejorar agregando características adicionales para mejorar sus capacidades para extraer y enviar transacciones financieras.</p><p>No obstante, es un buen punto de partida si decides dar a conocer tu nombre en el asombroso mundo de las criptomonedas.</p><p>Si tienes algún comentario o pregunta, por favor publícalo a continuación.</p><p>¡Feliz (cripto) codificación!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
