<?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[ Criptomoeda - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Criptomoeda - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 20 Jun 2026 19:48:13 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/criptomoeda/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como criar a sua própria criptomoeda usando Python ]]>
                </title>
                <description>
                    <![CDATA[  > Com a fama recente das criptomoedas, a blockchain criou uma tendência no mundo da tecnologia. A blockchain tem atraído muita atenção, principalmente por conta de sua capacidade de garantir segurança, reforçar a descentralização e acelerar processos, especialmente no setor financeiro. Essencialmente, a blockchain é um banco de dados ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-criar-a-sua-propria-criptomoeda-usando-python/</link>
                <guid isPermaLink="false">62c2395ea3520206e79cfc51</guid>
                
                    <category>
                        <![CDATA[ Criptomoeda ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Deusiel da Cunha de Souza ]]>
                </dc:creator>
                <pubDate>Tue, 05 Jul 2022 18:47:48 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/07/blockchain-3448502_1920-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo 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><p></p><blockquote>Com a fama recente das criptomoedas, a blockchain criou uma tendência no mundo da tecnologia. A blockchain tem atraído muita atenção, principalmente por conta de sua capacidade de garantir segurança, reforçar a descentralização e acelerar processos, especialmente no setor financeiro.</blockquote><p>Essencialmente, a blockchain é um banco de dados público que documenta e autentica, de maneira irreversível, a posse e a transmissão de ativos digitais. Moedas digitais, como o Bitcoin e o Ethereum, são baseadas nesse conceito. A blockchain é uma tecnologia maravilhosa, que você pode usar para transformar suas aplicações.</p><p>Atualmente, governos, organizações e indivíduos têm usado a tecnologia da blockchain para criar suas próprias criptomoedas e para evitar ficar pra trás. Notavelmente, quando o Facebook propôs sua própria criptomoeda, chamada de Libra, o anúncio gerou muita repercussão ao redor do mundo.</p><p>E se você pudesse também fazer como eles e criar a sua própria versão de criptomoeda?</p><p>Eu pensei sobre isso e decidi desenvolver um algoritmo que cria uma criptomoeda.</p><p>Decidi chamá-la de: <strong><strong>fccCoin</strong></strong>.</p><p>Neste tutorial, vou ilustrar passo a passo o processo usado para construir essa moeda digital (usando conceitos de programação orientada a objetos da linguagem Python para fazer isso).</p><p>Aqui está o modelo básico de algoritmo para blockchain usado para criar a &nbsp;<strong><strong>fccCoin</strong></strong>:</p><pre><code class="language-python">class Block:

    def __init__():

    #Primeiro bloco da classe

        pass
    
    def calculate_hash():
    
    #Calcula o hash para cada bloco
        
    
class BlockChain:
    
    def __init__(self):
     # Método Construtor
    pass
    
    def construct_genesis(self):
        # Constrói o bloco inicial
        pass

    def construct_block(self, proof_no, prev_hash):
        # Constrói um novo bloco e adiciona-o à cadeia de blocos.
        pass

    @staticmethod
    def check_validity():
        # Verifica se a blockchain é válida.
        pass

    def new_data(self, sender, recipient, quantity):
        # Adiciona uma nova transação ao registro de transações
        pass

    @staticmethod
    def construct_proof_of_work(prev_proof):
        # Protege a blockchain de ataques
        pass
   
    @property
    def last_block(self):
        # Retorna o último bloco da cadeia
        return self.chain[-1]

</code></pre><p>Agora, deixe-me explicar como fazer...</p><h2 id="1-criando-a-primeira-classe-block"><strong><strong>1. </strong>Criando a primeira classe "Block"</strong></h2><p>Uma blockchain é uma cadeia de blocos que são unidos uns aos outros (soa familiar, não soa?).</p><p>Essa cadeia de blocos é construída de tal forma que, se um dos blocos for adulterado, toda a cadeia se torna inválida.</p><p>Aplicando o conceito acima, criamos a primeira classe Block.</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>Como podemos ver no código acima, foi definido o método <strong><strong>__init__()</strong>, </strong>que será executado quando o bloco for instanciado, assim como em qualquer outra classe em Python.</p><p>Foram definidos os seguintes parâmetros para a inicialização da função:</p><ul><li><strong><strong>self</strong> </strong>— refere-se à instância do bloco de classe, tornando possível acessar os métodos e atributos associados a ela;</li><li><strong><strong>index</strong> </strong>— mantém o controle da posição do bloco dentro da cadeia de blocos (blockchain);</li><li><strong><strong>proof_no</strong> </strong>— é o número produzido durante a criação de um bloco (chamada de mineração);</li><li><strong><strong>prev_hash</strong> </strong>— refere-se ao hash do bloco anterior da cadeia;</li><li><strong><strong>data</strong> </strong>— mantém o registro de todas as operações feitas, com informações como a quantidade comprada;</li><li><strong><strong>timestamp</strong> </strong>— possui a data e a hora em que as transações aconteceram.</li></ul><p>O segundo método da classe, <strong><strong>calculate_hash</strong></strong>, gerará um <em>hash</em> para os blocos que usarem os parâmetros descritos acima. O módulo SHA-256 foi importado no projeto para auxiliar na obtenção de <em>hashes</em> dos blocos.</p><p>Depois que os parâmetros forem passados para o algoritmo de <em>hash</em>, a função então retornará uma string de 256 bits representando o conteúdo do bloco.</p><p>É assim que a segurança é garantida em blockchains. Cada bloco terá um <em>hash</em> e esse <em>hash </em>fará referência a um hash do bloco anterior.</p><p>Dessa forma, se alguém tentar comprometer qualquer bloco da cadeia, os outros blocos terão <em>hashes </em>inválidos, o que fará com que a cadeia inteira seja inválida.</p><p>Até o momento, um bloco tem essa aparência:</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-construindo-a-classe-blockchain"><strong><strong>2. </strong>Construindo a classe Blockchain</strong></h2><p>A ideia principal por trás da blockchain, assim como o próprio nome sugere, envolve encadear vários blocos uns aos outros.</p><p>Portanto, será construída uma classe <strong><strong>Blockchain</strong></strong>, que será muito útil no gerenciamento do trabalho de toda a cadeia. Será nela que a maior parte do trabalho será feito.</p><p>A classe <strong><strong>Blockchain</strong></strong> terá vários métodos auxiliares para desempenhar várias funções na cadeia de blocos.</p><p>Será explicado o que cada um desses métodos fará na classe.</p><h3 id="a-m-todo-construtor"><strong><strong>a. </strong>Método construtor</strong><br></h3><p>Esse método é o responsável pela inicialização da classe.</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>Aqui estão as atribuições do método construtor:</p><ul><li><strong><strong>self.chain</strong> </strong>— variável que mantém todos os blocos;</li><li><strong><strong>self.current_data</strong> </strong>— variável que controla todas as transações feitas nesse bloco;</li><li><strong><strong>self.construct_genesis()</strong> </strong>— método que cuidará da criação do bloco inicial.</li></ul><h3 id="b-construindo-o-bloco-inicial"><strong><strong>b. </strong>Construindo o bloco inicial</strong><br></h3><p>A blockchain precisa do método <em><em><strong><strong>construct_genesis</strong></strong></em><strong> </strong>para criar o bloco inicial da cadeia. Normalmente, nas blockchains, esse bloco é especial, pois ele simboliza o início da cadeia.</em></p><p>Agora, o bloco inicial será construído com valores padrão passados ao método <em><em><strong><strong>construct_block</strong></strong></em><strong>.</strong></em></p><p>Foi definido o valor zero para <em><em><strong><strong>proof_no</strong></strong></em><strong> </strong>e<strong> </strong><em><strong><strong>prev_hash</strong></strong></em><strong>, </strong></em>mas você pode definir o valor que quiser para eles.</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-criando-outros-blocos"><strong><strong>c. </strong>Criando outros blocos</strong></h3><p><br>O método <strong><strong><em><em>construct_block</em></em></strong><em> </em></strong>é usado para criar outros blocos na blockchain.</p><p>Adiante, vemos os valores dos atributos desse método:</p><ul><li><strong><strong>index</strong> </strong>— representa o tamanho da blockchain;</li><li><strong><strong>proof_nor </strong>e<strong> prev_hash</strong> </strong>— o método que chama o construtor passará esses parâmetros;</li><li><strong><strong>data</strong> </strong>— aqui temos o registro das transações que não foram incluídas em nenhum bloco da cadeia; </li><li><strong><strong>self.current_data</strong> </strong>— essa variável é usada para reiniciar a lista de transações nesse bloco. Se um bloco foi construído e transações forem registradas nele, a lista é reiniciada para se ter certeza que transações futuras serão adicionadas a essa variável;</li><li><strong><strong>self.chain.append()</strong> <strong>—</strong> </strong>esse método adiciona os blocos recém-construídos à cadeia;</li><li><strong><strong>return</strong> </strong>— por último, temos um objeto do tipo bloco que é retornado.</li></ul><h3 id="d-verificando-a-validade"><strong><strong>d. </strong>Verificando a validade</strong></h3><p><br>Para o método <em><em><strong><strong>check_validity</strong></strong></em><strong>, </strong></em>é importante verificar a integridade da blockchain e ter certeza de que não há quaisquer anomalias nela.</p><p>Como mencionado anteriormente, os <em>hashes</em> são essenciais para a segurança da blockchain. Por isso, qualquer mudança no bloco gerará um <em>hash</em> completamente novo.</p><p>Portanto, esse método <strong><strong><em><em>check_validity</em></em></strong><em> </em></strong><em>usa um <em><strong><strong>if</strong></strong></em></em> &nbsp;para verificar se o <em>hash</em> de cada bloco está correto.</p><p>Ele também verifica se cada bloco aponta corretamente para o bloco anterior, comparando o valor dos <em>hashes</em>. Se tudo estiver correto, ele retorna verdadeiro. Caso contrário, retorna 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-adicionando-dados-de-transa-es"><strong><strong>e. </strong>Adicionando dados de transações</strong></h3><p><br>O método <em><em><strong><strong>new_data</strong></strong></em><strong> </strong></em>é usado para adicionar dados de transações a um bloco. É um método muito simples e aceita três parâmetros: (dados do remetente, do recebedor e quantidade) e adiciona isso aos dados da transação na lista <em><em><strong><strong>self.current_data</strong></strong></em><strong>.</strong></em></p><p>No momento em que um bloco é criado, essa lista é alocada a esse bloco e reiniciada, como foi explicado no método <em><em><strong><strong>construct_block</strong></strong></em><strong>.</strong></em></p><p>Uma vez que os dados da transação são colocados na lista, a posição do próximo bloco é retornada.</p><p>Essa posição é calculada adicionando-se 1 à posição do bloco atual (que é sempre o último da blockchain). Esses dados auxiliarão o usuário no envio de transações futuras.</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-adicionando-a-prova-de-trabalho"><br><strong><strong>f. </strong>Adicionando a prova de trabalho</strong></h3><p><a href="https://en.bitcoin.it/wiki/Proof_of_work">Prova de trabalho</a> (texto em inglês) é um conceito que ajuda a blockchain a evitar abusos. De maneira simplificada, o objetivo da prova de trabalho é identificar um número que resolva um problema após algum processamento computacional.</p><p>Se a dificuldade desse processamento for alta, o uso de spams e tentativas de fraude serão desencorajadas na blockchain.</p><p>Na blockchain que estamos criando, foi usado um algoritmo simples para desencorajar pessoas a minerar ou a criar blocos de maneira muito fácil.</p><pre><code class="language-python">@staticmethod
def proof_of_work(last_proof):
    '''este algoritmo simples identifica um número f' tal que hash(ff') contenha 4 zeros à esquerda
         f é o f' anterior
         f' é a nova prova
        '''
    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):
    #verificando a prova: hash(last_proof, proof) contém 4 zeros à esquerda?

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

</code></pre><h3 id="g-obtendo-o-ltimo-bloco"><strong><strong>g. </strong>Obtendo o último bloco</strong></h3><p>Finalmente, o método <strong><strong><em><em>latest_block</em></em></strong><em> </em></strong>é um método auxiliar que ajuda na obtenção do último bloco da blockchain. Lembre-se de que o último bloco, na verdade, é o bloco atual da blockchain.</p><pre><code class="language-python">@property
    def latest_block(self):
        return self.chain[-1]
</code></pre><h2 id="vamos-resumir-tudo-at-aqui"><strong>Vamos resumir tudo até aqui</strong></h2><p>Aqui está o código completo para criação da criptomoeda <strong><strong>fccCoin</strong>.</strong></p><p>Você também pode dar uma olhada no código através <a href="https://github.com/Alfrick/Create-Cryptocurrency-in-Python">desse repositório no 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):
        '''este algoritmo simples identifica um número f', de modo que hash(ff') contenha 4 zeros à esquerda
         f é o f' anterior
         f' é a nova prova
        '''
        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):
        #verificando a prova: hash(last_proof, proof) contém 4 zeros à esquerda?

        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",  #implica que esse nó criou um outro bloco
            receiver=details_miner,
            quantity=
            1,  #criar um bloco (ou identificar o número da prova) recebe um valor 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>Agora, vamos testar o código e ver se ele funciona.</p><pre><code class="language-python">blockchain = BlockChain()

print("***Mineração de fccCoin prestes a começar***")
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",  #implica que esse nó criou um outro bloco
    recipient="Quincy Larson",  #let's send Quincy some coins!
    quantity=
    1,  #criar um bloco (ou identificar o número da prova) recebe um valor 1
)

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

print("***Mineração de fccCoin feita com sucesso***")
print(blockchain.chain)
</code></pre><p><br>Funciona!</p><p>Aqui está o resultado da mineração que fizemos:</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="conclus-es"><br>Conclusões</h2><p>Agora, temos uma criptomoeda!</p><p>Esse foi o tutorial de como criar sua própria criptomoeda usando Python.</p><p>Porém, é preciso notar que esse tutorial apenas demonstra os conceitos básicos e que serve apenas pra você molhar os pés nessa onda de inovação trazida pela tecnologia da blockchain.</p><p>Se <strong>essa moeda</strong> fosse lançada como está, ela poderia não atender às demandas atuais de mercado por estabilidade, segurança e facilidade de uso.</p><p>Portanto, ela pode ser melhorada, adicionando-se novos recursos para aumentar as capacidades de mineração e o envio de <a href="https://www.forextradingbig.com/">transações financeiras</a> (texto em inglês).</p><p>Entretanto, é um bom ponto de partida se você decidir ficar famoso no maravilhoso mundo das criptomoedas.</p><p>Se tiver dúvidas ou comentários, <a href="https://twitter.com/a_opidi">fale com o autor do texto</a>.</p><p>Boa (cripto)programação!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
