<?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[ Bitcoin - 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[ Bitcoin - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 15:27:13 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/bitcoin/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como a mineração de Bitcoin realmente funciona ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Subhan Nadeem À medida que o Bitcoin é amplamente adotado e reconhecido, seu modelo de segurança fundamental, conhecido como mineração, é posto sob os holofotes e examinado mais e mais a cada dia. As pessoas estão cada vez mais preocupadas com o impacto ambiental da mineração de Bitcoin ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-a-mineracao-de-bitcoin-realmente-funciona/</link>
                <guid isPermaLink="false">65034c4fade67a03f81e4a1f</guid>
                
                    <category>
                        <![CDATA[ Bitcoin ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Filipe Virgínio Vital Torres Barbosa ]]>
                </dc:creator>
                <pubDate>Tue, 02 Apr 2024 01:34:07 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/0_A8uxgOGZV8XlHg8s.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-bitcoin-mining-really-works-38563ec38c87/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How Bitcoin mining really works</a>
      </p><p>Escrito por: Subhan Nadeem</p><p>À medida que o Bitcoin é amplamente adotado e reconhecido, seu modelo de segurança fundamental, conhecido como mineração, é posto sob os holofotes e examinado mais e mais a cada dia.</p><p>As pessoas estão cada vez mais preocupadas com o impacto ambiental da mineração de Bitcoin e interessadas no assunto, na segurança e no grau de descentralização do seu modelo subjacente e até no impacto potencial de uma descoberta da computação quântica no futuro dos Bitcoins e de outras criptomoedas.</p><p>Muitas vezes, a prova de trabalho é descrita como um "quebra-cabeças criptográfico", mas o que é de fato este quebra-cabeças?</p><p>Para compreender de fato essas questões (e quaisquer respostas possíveis), é preciso entender a mineração de Bitcoin em si e da sua evolução.</p><p>Este artigo tratará de todos os componentes técnicos e elementos da prova de trabalho e de como eles se mantém em perfeita sincronia, fazendo com que o Bitcoin seja a plataforma descentralizada que é hoje.</p><h3 id="por-que-a-minera-o-funciona-hashing-criptogr-fico-unidirecional">Por que a mineração funciona: hashing criptográfico unidirecional</h3><p>A <em>blockchain </em>do Bitcoin é frequentemente descrita como um banco de dados que é criptograficamente seguro e, subsequentemente, imutável. A tecnologia que alimenta essa imutabilidade e segurança é o <strong>hashing criptográfico</strong>.</p><p>Uma função de <em>hash </em>criptográfico é uma função matemática que, de maneira simples, pega qualquer dado inserido e o converte para uma sequência de caracteres de tamanho fixo.</p><p>No entanto, existem quatro características especiais dessas funções que as tornam inestimáveis para a rede dos Bitcoins. São elas:</p><ol><li><strong>Determinística</strong> <strong><strong>— </strong></strong>para qualquer entrada na função <em>hash</em> criptográfica, a saída resultante será sempre a mesma;</li><li><strong>Rápida</strong> <strong>—</strong> computar a saída da função <em>hash</em>, dada qualquer entrada, é um processo relativamente rápido (não precisa de computação pesada);</li><li><strong>Exclusividade<strong> — </strong></strong>cada entrada na função deve resultar em uma saída completamente aleatória e exclusiva (em outras palavras, não há duas entradas que resultem na mesma saída);</li><li><strong><strong>Irrevers</strong>ível<strong> — </strong></strong>a partir de uma saída de uma função <em>hash</em>, a entrada original não pode ser obtida.</li></ol><p>Essas regras formam a base que permite à mineração de Bitcoins proteger a rede.</p><p>O criador do protocolo Bitcoin, Satoshi Nakomoto, escolheu usar em particular a <a href="https://pt.wikipedia.org/wiki/SHA-2">função hash SHA-256</a> como base para a mineração de Bitcoins. Essa é uma função de hash criptográfico específica, que foi comprovada matematicamente para atender às propriedades acima. Ela produz sempre um <strong>número de 256 bits</strong> (a unidade mais básica de computação), que é normalmente representado no sistema numérico hexadecimal com 64 caracteres para facilitar a leitura humana.</p><p>A saída da função SHA-256 é normalmente referida como o <strong><em>hash</em></strong> da sua entrada.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/1iObT23KZMg-OPHVKyPW3Fp-12cFhc2oaMdI.png" class="kg-image" alt="1iObT23KZMg-OPHVKyPW3Fp-12cFhc2oaMdI" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/1iObT23KZMg-OPHVKyPW3Fp-12cFhc2oaMdI.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/1iObT23KZMg-OPHVKyPW3Fp-12cFhc2oaMdI.png 800w" sizes="(min-width: 720px) 720px" width="800" height="541" loading="lazy"><figcaption>Uma entrada para uma função <em>hash</em> resulta numa saída totalmente única</figcaption></figure><p>Abaixo, temos um exemplo de entrada e saída de uma função SHA-256 (você mesmo pode experimentá-la <a href="http://www.xorbin.com/tools/sha256-hash-calculator">aqui</a>):</p><pre><code>Entrada do SHA-256:
&lt;Transação de Bitcoins&gt;
Saída do SHA-256:
77077b1f4c3ad44c83dc0bdb8d937e9b71c0ef07a35c2664bb7da85be738eacf</code></pre><p>Curiosamente, na maioria dos lugares onde o <em>hashing</em> é usado no protocolo Bitcoin, o <strong><em>hashing</em> duplo</strong> é usado. Isso significa que a saída original da função SHA-256 é então colocada de volta na função SHA-256 para obter outra saída. Segue abaixo como seria esse processo:</p><pre><code>Entrada do SHA-256 (primeiro passo):
&lt;Transação de Bitcoins&gt;
Saída (primeiro passo):
77077b1f4c3ad44c83dc0bdb8d937e9b71c0ef07a35c2664bb7da85be738eacf

Entrada do SHA-256 (segundo passo):
77077b1f4c3ad44c83dc0bdb8d937e9b71c0ef07a35c2664bb7da85be738eacf
Saída (segundo passo e resultado final):
3c6c55b0e4b607b672b50f04e028a6951aed6dc97b91e103fb0f348c3f1dfa00</code></pre><p>O <em>hashing </em>duplo é utilizado para proteção contra ataques de aniversário. Um ataque de aniversário é um cenário em que o agressor é capaz de produzir o mesmo <em>hash </em>que outra entrada, só que usando uma entrada completamente diferente (chamada de <strong>colisão</strong>). Isso quebra a terceira propriedade, da <strong>exclusividade</strong>. Sem ela, dois blocos de Bitcoin completamente diferentes podem ser representados exatamente pelo mesmo <em>hash</em>, permitindo que os agressores troquem os blocos.</p><p>Com a função SHA-256, a probabilidade de esse ataque acontecer é infinitamente pequena. Se não fosse quase impossível, o SHA-256 seria considerado quebrado.</p><p>Contudo, outras funções de <em>hash </em>foram "quebradas" no passado. Para evitar que isso aconteça com o SHA-256 no futuro (e efetivamente quebrar o modelo de segurança do Bitcoin) é melhor fazer o <strong>hash </strong>do<strong> hash</strong>. Isso reduz pela metade a probabilidade de ocorrer uma colisão, tornando o protocolo muito mais seguro.</p><p>De maneira simplificada, a mineração de Bitcoin é um sistema no qual todas as transações de Bitcoin são enviadas para os mineradores de Bitcoin. Os mineradores selecionam transações no valor de um megabyte, agrupam-nas como entrada na função SHA-256 e tentam encontrar um resultado específico que a rede aceite. O primeiro minerador a encontrar esse resultado e publicar o bloco na rede recebe uma recompensa na forma de taxas de transação e criação de novos Bitcoins.</p><p>Vamos dar um passo adiante e mergulhar na própria <em>blockchain </em>do Bitcoin para ver o que exatamente os mineradores fazem para tornar a rede segura.</p><h3 id="minera-o-de-bitcoins-uma-introdu-o-t-cnica"><strong>Mineração de bitcoins: uma introdução técnica</strong></h3><p>A mineração foi introduzida como a solução para o problema do gasto duplo. Se eu tiver 1 Bitcoin e enviá-lo para Bob e depois tentar enviar o mesmo Bitcoin para Alice, a rede garante que apenas uma transação será aceita. Isso é feito pelo processo de mineração.</p><p>Antes de mergulhar nos detalhes técnicos, é importante entender por que a mineração é necessária para proteger a rede. A moeda fiduciária que existe atualmente é criada e validada por um banco central. Como o Bitcoin opera sob a rígida premissa de descentralização e consenso, não pode haver nenhuma autoridade central que valide e marque a emissão dessa moeda, bem como a validação de quaisquer transações que ocorram com essa moeda.</p><p>Satoshi Nakamoto propôs a única solução conhecida na época para resolver esse problema de validação na forma de um sistema orientado por consenso. Intitulado no <em>whitepaper </em>do Bitcoin como <strong>proof-of-work</strong> (prova de trabalho), esse esquema justifica de modo elegante que as transações são validadas por aqueles que estão dispostos a gastar energia física computacional e tempo suficientes para fazê-lo, ao mesmo tempo em que introduz um incentivo para induzir a concorrência no mercado. Essa concorrência permite que a descentralização surja e prospere organicamente no ecossistema.</p><h3 id="uma-olhada-dentro-do-bloco"><strong>Uma olhada dentro do bloco</strong></h3><p>Um bloco de Bitcoin consiste basicamente em dois componentes:</p><h4 id="1-transa-es-na-forma-de-uma-rvore-de-merkle"><strong>1. </strong>Transações, na forma de uma árvore de Merkle</h4><p>Os computadores de mineração coletam transações suficientes para preencher um bloco e as agrupam em uma árvore de Merkle.</p><p>Uma árvore de Merkle é um conceito relativamente simples: as transações ficam na parte inferior da árvore como folhas e são criptografadas em um <em>hash </em>usando a função SHA-256. A combinação de duas transações de folha é criptografada novamente em um <em>hash </em>usando a função SHA-256 para formar um pai dessas folhas. Esse pai é continuamente criptografado em <em>hash </em>para cima, combinado com outros pais, até que uma única <strong>raiz</strong> seja criada. O <em>hash </em>dessa raiz é efetivamente uma representação única das transações que estão abaixo dela.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/3Y5SmuCwRz8GnPlpMVo9SUG0n3mg95o4fwoP.png" class="kg-image" alt="3Y5SmuCwRz8GnPlpMVo9SUG0n3mg95o4fwoP" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/3Y5SmuCwRz8GnPlpMVo9SUG0n3mg95o4fwoP.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/3Y5SmuCwRz8GnPlpMVo9SUG0n3mg95o4fwoP.png 800w" sizes="(min-width: 720px) 720px" width="800" height="397" loading="lazy"><figcaption>Uma visualização de como uma árvore de Merkle é construída - as folhas na parte inferior da árvore são transações</figcaption></figure><p>A raiz da árvore de Merkle é uma combinação dos <em>hashes </em>de cada transação na árvore.</p><p>Lembre-se que, para qualquer entrada em uma função de <em>hash</em>, a saída é totalmente <strong>exclusiva</strong>. Portanto, quando a maioria dos nós da rede recebe um bloco minerado, o <em>hash </em>da raiz da árvore de Merkle atua como um resumo imutável de todas as transações nesse determinado bloco.</p><p>Se alguém mal-intencionado tentasse alterar o conteúdo de uma transação em um bloco, seu <em>hash </em>seria alterado. Essa alteração de um <em>hash </em>seria propagada pela árvore de Merkle da transação até que o <em>hash </em>da raiz fosse alterado. Qualquer nó pode então detectar rapidamente esse ato malicioso comparando a raiz da árvore de Merkle do bloco alterado com a árvore de Merkle de um bloco válido.</p><h4 id="2-o-cabe-alho-do-bloco"><strong>2. O cabeçalho do bloco</strong></h4><p>O cabeçalho do bloco é um resumo do conteúdo do próprio bloco. Ele contém os <strong>seis componentes</strong> a seguir:</p><ul><li>A versão do software que o cliente Bitcoin está executando;</li><li>O registro de data e hora do bloco;</li><li>A raiz da árvore de Merkle com as transações contidas;</li><li>O <em>hash </em>do bloco anterior;</li><li>Um <strong><strong>nonce</strong></strong> (número aleatório que pode ser usado apenas uma vez);</li><li>O <strong>target </strong>ou destino.</li></ul><p>Lembre-se de que a raiz da árvore de Merkle de transações funciona como um resumo eficaz de cada transação no bloco, sem a necessidade de examinar cada transação.</p><p>O <em>hash </em>do bloco anterior permite que a rede coloque corretamente o bloco em ordem cronológica. É daí que deriva o termo <strong>blockchain</strong> - cada bloco é encadeado a um bloco anterior.</p><p>O <strong>nonce</strong> e o <strong>target</strong> fazem a mineração funcionar. Eles são a base para resolver o quebra-cabeça SHA-256 que os mineradores precisam resolver.</p><p>Observe que todos esses dados no cabeçalho do bloco são compactados em 80 bytes usando uma notação chamada <em>little-endian</em>, o que torna a transferência de cabeçalhos de bloco entre os nós um processo trivialmente eficiente. Para essa explicação, ignoraremos essa compactação e assumiremos que os dados estão em sua forma original.</p><h3 id="explicando-o-problema-da-minera-o"><strong>Explicando o problema da mineração</strong></h3><p>O <strong>target</strong> armazenado no cabeçalho do bloco é simplesmente um valor numérico armazenado em bits. Na notação tradicional de base 10, esse <em>target </em>varia de 0 a algum lugar na faixa de 2²²⁴ (um número com <strong>mais de 67 dígitos</strong>), dependendo de quantos mineradores estão competindo para resolver esse problema ao mesmo tempo.</p><p>Lembre-se de que o resultado do SHA-256 é apenas um número. O objetivo de um minerador é pegar o cabeçalho do bloco atual, adicionar um número aleatório a ele chamado <strong>nonce</strong> e calcular seu <em>hash</em>. Esse valor numérico do <em>hash </em>deve ser menor que o valor do <em>target</em>.</p><p>Isso é tudo o que há para fazer, mas é muito mais fácil falar do que fazer.</p><p>Lembre-se da primeira propriedade do SHA-256: uma entrada em uma função de <em>hash </em>sempre resultará na mesma saída. Portanto, se o minerador pegasse o cabeçalho do bloco, fizesse o <em>hash </em>e percebesse que o valor do <em>hash </em>não era menor do que a meta, ele teria que alterar a entrada de algum modo para tentar encontrar um <em>hash </em>abaixo do valor do <em>target</em>.</p><p>É aí que entra o <strong>nonce</strong>.</p><p>O minerador adiciona um número (a partir de 0), chamado <strong>nonce</strong>, ao cabeçalho do bloco e faz o <em>hash </em>desse valor. Se o valor do <em>hash </em>não for menor do que o <em>target</em>, o minerador incrementará o <em>nonce </em>em 1, o adicionará novamente ao cabeçalho do bloco e fará o <em>hash </em>desse valor alterado. Esse processo é repetido continuamente até que seja encontrado um <em>hash </em>menor que o valor do <em>target</em>.</p><h4 id="um-exemplo-de-minera-o">Um exemplo de mineração</h4><p>Aqui está uma aproximação grosseira do que compõe o cabeçalho do primeiro bloco:</p><ul><li>A raiz de Merkle da transação no bloco Genesis:</li></ul><pre><code>Raiz de Merkle:
4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b</code></pre><ul><li>A primeira versão conhecida do Bitcoin: <code>0.1.0</code></li><li>O registro de data e hora do bloco: <code>2009–01–03 18:15:05</code></li><li>O <em>target </em>(esse também é o valor mais alto que o <em>target </em>poderá atingir):</li></ul><pre><code>Target:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</code></pre><ul><li>Nenhum <em>hash </em>de bloco anterior – esse foi o primeiro bloco e, portanto, esse é um caso único</li></ul><p>O cabeçalho final do bloco após a adição de seus componentes:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/RgFYX1FSetNk-EJF91HSNTcVhqIYyDziZJkD.png" class="kg-image" alt="RgFYX1FSetNk-EJF91HSNTcVhqIYyDziZJkD" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/RgFYX1FSetNk-EJF91HSNTcVhqIYyDziZJkD.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/RgFYX1FSetNk-EJF91HSNTcVhqIYyDziZJkD.png 767w" sizes="(min-width: 720px) 720px" width="767" height="672" loading="lazy"><figcaption>Os dados do bloco Genesis (isso inclui o nonce, mas vamos fingir que não), fonte: <a href="https://bitcointalk.org/index.php?topic=52706" rel="noopener">bitcointalk</a></figcaption></figure><p>Vamos pegar esse grande cabeçalho e calcular o <em>hash </em>duplo:</p><pre><code>SHA-256 do cabeçalho:
7d80bd12dfdccbdde2c41c9f406edfc05afb3320f5affc4f510b05a3394e1c91

SHA-256 do resultado anterior (resultado final):
c5aa3150f61b752c8fb39525f911981e2f9982c8b9bc907c73914585ad2ef12b</code></pre><p>Tanto o <em>hash </em>de destino quanto o de saída são números incrivelmente grandes quando convertidos para a base 10 (lembre-se: mais de 67 dígitos). Em vez de tentar demonstrar a comparação dos dois aqui, a função Python a seguir trata da comparação:</p><pre><code>def isBlockHashLessThanTarget(blockHash, target):
    return int(blockHash, 16) &lt; int(target, 16)</code></pre><p>Será retornado verdadeiro se o <em>hash </em>for menor do que o destino; caso contrário, falso.</p><p>Aqui está o resultado do nosso <em>target </em>e do <em>hash </em>de bloco:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/mI97AvtxoLFh08Qy99YmpOesirwiyS3a6iLj.png" class="kg-image" alt="mI97AvtxoLFh08Qy99YmpOesirwiyS3a6iLj" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/mI97AvtxoLFh08Qy99YmpOesirwiyS3a6iLj.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/mI97AvtxoLFh08Qy99YmpOesirwiyS3a6iLj.png 800w" sizes="(min-width: 720px) 720px" width="800" height="158" loading="lazy"></figure><p>Agora, pegamos o valor hexadecimal do bloco original e adicionamos 1 a ele. O resultado é o seguinte:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/M7hXm9TXd9CFp3vmZ4sOUHxyvuzMHowjTifh.png" class="kg-image" alt="M7hXm9TXd9CFp3vmZ4sOUHxyvuzMHowjTifh" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/M7hXm9TXd9CFp3vmZ4sOUHxyvuzMHowjTifh.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/M7hXm9TXd9CFp3vmZ4sOUHxyvuzMHowjTifh.png 752w" sizes="(min-width: 720px) 720px" width="752" height="662" loading="lazy"><figcaption>Observe como o último dígito agora é 1, devido à adição do nonce</figcaption></figure><p>Em seguida, executamos o mesmo algoritmo de <em>hashing </em>e a comparação com esses dados alterados. Se não estiverem abaixo do <em>target</em>, continue repetindo.</p><p>Quando um <em>hash </em>bem-sucedido é encontrado, o último <em>nonce </em>usado para encontrar essa solução é salvo no bloco.</p><p>O <em>nonce </em>listado no bloco Genesis é 2.083.236.893.</p><p>Isso significa que Satoshi Nakomoto iterou esse processo mais de 2 bilhões de vezes antes de encontrar o <em>hash </em>correto.</p><p>Escrevi uma pequena implementação em Python desse processo de mineração de blocos do Genesis, que pode ser encontrada no meu <a href="https://github.com/subhan-nadeem/bitcoin-mining-python">GitHub</a>.</p><p>Veja quanto tempo levaria para você minerar com sucesso o bloco Genesis!</p><h4 id="uma-advert-ncia-extranonce">Uma advertência:<strong> <code>extraNonce</code></strong></h4><p>O valor do <em>nonce </em>em um cabeçalho de bloco é armazenado como um número de 32 bits. Isso significa que o <em>nonce </em>mais alto que alguém pode obter é 2³² (aproximadamente 4 bilhões). Após 4 bilhões de iterações, o <em>nonce </em>se esgota e, se não for encontrada uma solução, os mineradores ficam empacados mais uma vez.</p><p>A solução para isso é adicionar um campo à <strong>coinbase </strong>(o conteúdo da transação de um bloco, armazenado como a árvore de Merkle) chamado <strong>extraNonce</strong>. O tamanho desse extraNonce é limitado apenas pelo tamanho do próprio bloco e, portanto, pode ser tão grande quanto os mineradores desejarem, desde que o tamanho do bloco esteja dentro dos limites do protocolo.</p><p>Se todos os 4 bilhões de valores possíveis do <em>nonce </em>forem esgotados, o <strong>extraNonce</strong> será adicionado e incrementado na <strong>coinbase</strong>. Uma nova raiz da árvore de Merkle e, subsequentemente, um novo cabeçalho de bloco são calculados, e o <strong>nonce</strong> é iterado mais uma vez. Esse processo é repetido até que um <em>hash </em>adequado seja encontrado.</p><p>É melhor evitar adicionar o <strong>extraNonce</strong> até que o <strong>nonce</strong> se esgote, pois qualquer alteração no extraNonce altera a árvore de Merkle. Isso requer computação adicional para propagar a alteração para cima até que uma nova raiz da árvore de Merkle seja calculada.</p><h4 id="a-recompensa-do-minerador"><strong>A recompensa do minerador</strong></h4><p>O minerador que conseguir publicar um bloco mais rápido é recompensado com um Bitcoin novinho em folha, criado do nada. Atualmente, essa recompensa é de 12,5 BTC. Como esses Bitcoins surgem?</p><p>Cada minerador simplesmente adiciona uma nova transação de saída ao seu bloco que atribui 12,5 Bitcoins a si mesmo antes de começar a minerar o bloco. O protocolo da rede aceitará essa transação especial como válida ao receber um bloco recém-validado. Essa transação especial é chamada de <strong>transação de geração</strong>.</p><p>É responsabilidade do minerador adicionar essa transação ao bloco antes de minerá-lo. Houve, pelo menos, um caso em que os mineradores se esqueceram de adicionar a recompensa à transação antes de minerar um bloco, literalmente destruindo 12,5 BTC!</p><h3 id="validando-a-prova-de-trabalho"><strong>Validando a prova de trabalho</strong></h3><p>Digamos que nosso minerador tenha encontrado um <em>hash </em>que seja menor que o <em>target</em>. Tudo o que esse minerador precisa fazer é publicar o bloco minerado com os seis componentes originais em qualquer nó conectado.</p><p>Esse nó que recebe o bloco verificará primeiro o conjunto de transações, garantindo que todas as transações sejam válidas (por exemplo, todas as transações estão devidamente assinadas e as moedas não estão sendo gastas duas vezes e/ou criadas do nada).</p><p>Em seguida, ele apenas gerará o <strong>duplo hash</strong> do cabeçalho do bloco e garantirá que o valor esteja abaixo do valor do <em>target </em>incluído no bloco. Quando o bloco for considerado válido, o novo nó continuará a propagar esse bloco pela rede até que todos os nós tenham um registro atualizado.</p><p>Como você pode ver, os blocos recém-publicados podem ser facilmente verificados por qualquer nó. Entretanto, a publicação de um bloco válido na rede requer uma quantidade incrivelmente grande de poder computacional (portanto, eletricidade e tempo). Essa assimetria é o que permite que a rede seja protegida e, ao mesmo tempo, permite que os indivíduos que desejam realizar atividades econômicas na rede o façam de maneira relativamente simples.</p><h3 id="o-tempo-de-produ-o-de-blocos-e-o-ajuste-do-target">O tempo de produção de blocos e o ajuste do <em>target</em></h3><p>Quando os primeiros mineradores começaram a minerar, cada um deles monitorou o <strong>tempo de produção de blocos</strong>. Cada bloco de Bitcoin tem um tempo de produção de blocos definido de 10 minutos. Isso significa que, dado o nível atual de capacidade computacional na rede (<strong>hashrate </strong>da rede), os nós sempre esperam que novos blocos validados sejam produzidos a cada 10 minutos, em média.</p><p>É razoável esperar que os blocos sejam produzidos em 10 minutos porque a probabilidade de encontrar um bloco, considerando o <em>hashrate </em>da rede, é conhecida.</p><p>Por exemplo, vamos pegar o alvo mais fácil que já existiu no Bitcoin: o bloco de Genesis. A probabilidade de um único <em>hash </em>ser menor do que o <em>target </em>mais fácil é de 1 em 2³². Isso é um em mais de quatro bilhões. Portanto, é razoável esperar que alguém execute 2³² iterações do problema de mineração para encontrar um <em>hash </em>adequado. Os nós da rede esperavam que quatro bilhões dessas iterações fossem executadas por <strong>todos</strong> os mineradores da rede a cada 10 minutos.</p><p>Se, em uma amostra grande de blocos, os blocos começarem a aparecer mais rápido do que 10 minutos, essa é uma indicação bastante clara de que os nós da rede estão iterando por quatro bilhões de <em>hashes </em>muito mais rápido do que 10 minutos. Essa situação faz com que cada nó ajuste o <em>target </em>proporcionalmente com base no aumento (ou diminuição) da potência da rede para garantir que os blocos continuem sendo produzidos a cada 10 minutos.</p><p>Na realidade, os nós da rede monitoram o tempo de produção de blocos em <strong>2016</strong> blocos, o que equivale a exatamente duas semanas. A cada duas semanas, o tempo total de produção de blocos é comparado com o tempo de produção de blocos esperado (que é de 20160 minutos).</p><p>Para obter o novo <em>target</em>, basta multiplicar o <em>target </em>existente pela proporção do tempo total de produção de blocos real nas últimas duas semanas para obter o tempo de produção de blocos esperado. Isso ajustará o <em>target </em>proporcionalmente à quantidade de poder computacional que entra ou sai da rede.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/M3-52KmmkeyZCRECDfzfdACTrILXpveYlDn5.png" class="kg-image" alt="M3-52KmmkeyZCRECDfzfdACTrILXpveYlDn5" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/M3-52KmmkeyZCRECDfzfdACTrILXpveYlDn5.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/M3-52KmmkeyZCRECDfzfdACTrILXpveYlDn5.png 800w" sizes="(min-width: 720px) 720px" width="800" height="91" loading="lazy"><figcaption>Fórmula para calcular o novo <em>target</em>, executada a cada 20160 minutos (duas semanas) por cada nó de Bitcoin</figcaption></figure><p>O tempo de produção de blocos e a capacidade de calcular facilmente a probabilidade de encontrar um bloco válido permitem que os nós monitorem e determinem facilmente o <em>hashpower </em>total na rede e ajustem a rede. Independentemente da quantidade de potência de computacional adicionada à rede ou da rapidez com que é adicionada, em média, o tempo de produção de blocos sempre permanecerá em 10 minutos.</p><p>A taxa de <em>hash </em>total atual na rede é de 28,27 <em>exahash</em> por segundo. Isso significa que <strong>28,27 x 10¹⁸</strong> <em>hashes </em>são executados a cada segundo em todos os computadores da rede.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/d9dUC5kBAfoDhYFAhuUIF-49pjPT-risoGxB.png" class="kg-image" alt="d9dUC5kBAfoDhYFAhuUIF-49pjPT-risoGxB" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/d9dUC5kBAfoDhYFAhuUIF-49pjPT-risoGxB.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/d9dUC5kBAfoDhYFAhuUIF-49pjPT-risoGxB.png 800w" sizes="(min-width: 720px) 720px" width="800" height="450" loading="lazy"></figure><h3 id="resumindo">Resumindo</h3><p>Aqui, cobrimos de maneira abrangente o seguinte:</p><ul><li>Por que o <em>hashing </em>criptográfico unidirecional é vital para a prova de trabalho;</li><li>Um detalhamento da construção de um bloco de Bitcoin;</li><li>O processo de mineração real e a iteração em si;</li><li>Como os nós podem validar facilmente outros blocos;</li><li>Como a rede consegue manter o algoritmo e a competitividade monitorando o tempo de bloqueio e ajustando o <em>target</em>.</li></ul><p>Agora, você deve ser capaz de entender e explicar como a prova de trabalho realmente funciona e por que ela é considerada um algoritmo totalmente seguro que permite a descentralização e o consenso!</p><p><strong>Siga o autor no <a href="https://twitter.com/SubhanNadeem19">Twitter</a> e no Medium se estiver interessado em artigos mais detalhados e informativos como esses no futuro!</strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como gerar sua própria chave privada de Bitcoin ]]>
                </title>
                <description>
                    <![CDATA[ Em criptomoedas, uma chave privada permite aos usuários acessar suas carteiras. A pessoa que possui a chave privada controla completamente as moedas naquela carteira. Por essa razão, você deve mantê-la em segredo. Se você realmente quiser gerar sua própria chave, faz sentido que ela seja gerada de uma maneira segura. ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-gerar-sua-propria-chave-privada-de-bitcoin/</link>
                <guid isPermaLink="false">6377ee6de2dc4305dbdcf1cc</guid>
                
                    <category>
                        <![CDATA[ Bitcoin ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gustavo Goulart Baptista ]]>
                </dc:creator>
                <pubDate>Wed, 15 Mar 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_6pWGbFF9kCmlGSra6Kmh-w.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-generate-your-very-own-bitcoin-private-key-7ad0f4936e6c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to generate your very own Bitcoin private key</a>
      </p><p>Em criptomoedas, uma chave privada permite aos usuários acessar suas carteiras. A pessoa que possui a chave privada controla completamente as moedas naquela carteira. Por essa razão, você deve mantê-la em segredo. Se você realmente quiser gerar sua própria chave, faz sentido que ela seja gerada de uma maneira segura. </p><p>Aqui, vou introduzir o assunto das chaves privadas e mostrar como você pode gerar sua própria chave usando várias funções criptográficas. Vou fornecer a descrição de um algoritmo e seu código em Python.</p><h3 id="eu-preciso-gerar-uma-chave-privada"><strong>Eu preciso gerar uma chave privada? </strong></h3><p>Na maioria das vezes, não. Por exemplo, se você usar uma carteira web como a Coinbase ou Blockchain.info, elas criam e administram a chave privada para você. A mesma coisa acontece com as transações.</p><p>Carteiras de celulares e desktops também geram normalmente uma chave privada para você, embora elas também possam dar a opção de gerar sua própria chave.</p><p>Então, porque gerá-la mesmo assim? Aqui, eu cito alguns motivos meus:</p><ul><li>Você quer ter certeza de que ninguém sabe qual é a chave</li><li>Você quer apenas aprender mais sobre criptografia e geração de números aleatórios (do inglês, <em>random number generation, ou RNG</em>)</li></ul><h3 id="o-que-exatamente-uma-chave-privada"><strong>O que exatamente é uma chave privada?</strong></h3><p>Formalmente, uma chave privada para Bitcoin (e muitas outras criptomoedas) é uma série de 32 bytes. Hoje em dia, existem muitas maneiras de gravar esses bytes. Eles podem ser gravados como uma sequência de caracteres (em inglês, <em>string</em>)<em> </em>de 256 zeros e uns (32 * 8 = 256) ou 100 jogadas de dados. Pode ser uma <em>string </em>binária, uma string de base 64, uma <a href="https://en.bitcoin.it/wiki/Wallet_import_format">chave WIF</a> (texto em inglês), uma <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" rel="noopener">frase mnemônica</a> (texto em inglês) ou ainda uma <em>string </em>hexadecimal. Neste artigo, usaremos uma<em> string hexadecimal</em> de 64 caracteres.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/lyrhBKkIKdFsCCrBdSXnaRYJrwj67NUaMXNy.png" class="kg-image" alt="lyrhBKkIKdFsCCrBdSXnaRYJrwj67NUaMXNy" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/lyrhBKkIKdFsCCrBdSXnaRYJrwj67NUaMXNy.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/lyrhBKkIKdFsCCrBdSXnaRYJrwj67NUaMXNy.png 800w" sizes="(min-width: 720px) 720px" width="800" height="320" loading="lazy"><figcaption>A mesma chave privada, escrita em formatos diferentes.</figcaption></figure><p>Por que exatamente 32 bytes? Ótima pergunta! Para criar uma chave pública a partir de uma privada, Bitcoin usa o <strong><strong>ECDSA</strong></strong>, ou Algoritmo de Assinatura Digital de Curva Elíptica (em inglês, <em>Elliptic Curve Digital Signature Algorithm</em>). Mais especificamente, usa uma curva particular chamada <strong><strong>secp256k1</strong></strong>.</p><p>Essa curva tem um arranjo de 256 bits, tem uma entrada de 256 bits e uma saída contendo números de 256 bits. 256 bits são exatamente 32 bytes. Isso quer dizer que precisamos de 32 bytes de dados para alimentar esse algoritmo de curva.</p><p>Existe um requisito adicional para uma chave privada. Por usarmos ECDSA, a chave deve ser positiva e inferior ao arranjo da curva. O arranjo de secp256k1 é <code>FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141</code>, o que é relativamente grande: quase todo número de 32 bytes será menor que ele.</p><h3 id="modo-iniciante"><strong>Modo iniciante</strong></h3><p>Então, como geramos um número de 32 bytes? A primeira coisa que nos vem à mente é usar uma biblioteca RNG na linguagem de sua escolha. Python até oferece uma maneira bonita de gerar esses números com apenas alguns bits necessários:</p><pre><code class="language-python">import random
bits = random.getrandbits(256)
# 30848827712021293731208415302456569301499384654877289245795786476741155372082
bits_hex = hex(bits)
# 0x4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32
private_key = bits_hex[2:]
# 4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32</code></pre><p>Parece bom, mas na verdade não é. Bibliotecas RNG comuns não foram criadas para criptografia. Sendo assim, elas não são muito seguras. Elas geram números baseados em uma semente (em inglês <em>seed</em>), que por padrão, é a hora atual. Sendo assim, se você souber aproximadamente quando eu gerei os bits acima, tudo o que você precisa é tentar um ataque de força bruta com algumas variantes.</p><p>Quando você gera uma chave privada, deseja estar extremamente seguro. Lembre-se de que, se alguém souber a chave privada, poderá facilmente roubar todas as moedas da carteira correspondente. Você não terá chance nenhuma de recuperá-las de volta.</p><p>Então, vamos tentar uma maneira mais segura.</p><h3 id="rng-criptograficamente-forte"><strong><strong>RNG</strong> criptograficamente forte</strong></h3><p>Junto com o método básico de RNG, linguagens de programação normalmente fornecem um RNG desenhado especificamente para operações criptográficas. Esse método é usualmente muito mais seguro, pois extrai entropia diretamente do sistema operacional. O resultado desse RNG é muito mais difícil de reproduzir. Você não pode obtê-lo apenas sabendo a hora que foi gerado ou sua <em>seed, </em>pois não há nenhuma <em>seed. </em>Bom, ao menos o usuário não insere nenhuma <em>seed. </em>Ela é criada pelo programa.</p><p>Em Python, um RNG criptograficamente forte é implementado pelo módulo <code>secrets</code>. Vamos modificar o código acima para tornar a geração da chave privada mais segura! </p><pre><code class="language-python">import secrets
bits = secrets.randbits(256)
# 46518555179467323509970270980993648640987722172281263586388328188640792550961
bits_hex = hex(bits)
# 0x66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31
private_key = bits_hex[2:]
# 66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31</code></pre><p>Isso é incrível. Eu aposto que você não seria capaz de reproduzi-lo, mesmo com acesso ao meu PC. Podemos, no entanto, ir mais longe.</p><h3 id="sites-especializados"><strong>Sites especializados</strong></h3><p>Existem sites que geram esses números aleatórios para você. Vamos analisar apenas dois aqui. Um é o <a href="https://random.org/" rel="noopener">random.org</a>, um gerador de números bem conhecido. Outro é o <a href="https://bitaddress.org/" rel="noopener">bitaddress.org</a>, que é desenhado especificamente para geração de chaves privadas de Bitcoin.</p><p>O <a href="https://random.org/" rel="noopener">random.org</a> poderianos ajudar a gerar uma chave? Com certeza, já que eles têm um <a href="https://www.random.org/bytes" rel="noopener">serviço</a> para geração de bytes aleatórios. Porém, dois problemas emergem aqui. O <a href="https://random.org/" rel="noopener">random.org</a> afirma ser um gerador verdadeiramente aleatório, mas será que você pode confiar? Você consegue ter certeza que é, de fato, aleatório? Como ter certeza de que o proprietário não grava todos os resultados gerados, especialmente os que se parecem com chaves privadas? Essa resposta fica a seu critério. Ah, você também não pode executá-lo localmente, o que gera um problema adicional. Esse método, definitivamente, não é 100% seguro.</p><p>Já com o <a href="https://bitaddress.org/" rel="noopener">bitaddress.org</a>, a história é completamente diferente. Ele é de código aberto (em inglês <em>open source</em>). Então, você pode checar o que há debaixo dos panos. É <em>client-side</em>, ou seja você pode fazer o download e executá-lo localmente, até mesmo sem conexão a internet.</p><p>Então, como funciona? Ele usa você – sim, você – como uma fonte de entropia. Ele pede que você mova seu mouse ou pressione teclas aleatórias. Você realiza esses passos até que seja inviável reproduzir os resultados.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/y5eDywvm3A2NMywdEk2u6pQYUORSP42gtWr2.gif" class="kg-image" alt="y5eDywvm3A2NMywdEk2u6pQYUORSP42gtWr2" width="862" height="540" loading="lazy"><figcaption>O processo de gerar uma entropia ao mover o mouse aleatoriamente. Os inúmeros símbolos mostram o agrupamento.</figcaption></figure><p>Tem interesse em descobrir como o <a href="https://bitaddress.org/" rel="noopener">bitaddress.org</a> funciona? Para fins educacionais, vamos dar uma olhada no seu código e tentar reproduzi-lo em Python.</p><blockquote><em>Nota rápida<em>: </em>o <em>bitaddress.org </em>fornece a chave privada em formato de <em>WIF </em>comprimido<em>, </em>que é parecido ao <a href="https://en.bitcoin.it/wiki/Wallet_import_format">formato <em>WIF</em></a><em> </em>(texto em inglês) que discutimos previamente. Para nossos propósitos, faremos o algoritmo retornar uma string hexadecimal. Dessa maneira, poderemos usá-la mais tarde na geração de uma chave pública.</em></blockquote><h3 id="bitaddress-as-especificidades"><strong><strong>Bitaddress: </strong>as especificidades</strong></h3><p>O Bitaddress cria uma entropia em duas maneiras: pelo movimento do mouse e pelo pressionamento das teclas. Vamos falar sobre ambos, mas vamos focar no pressionamento das teclas, já que é difícil de implementar o rastreamento do mouse na biblioteca do Python. Esperaremos o usuário apertar teclas suficientes até que tenhamos entropia suficiente. Então, geraremos uma chave.</p><p>O Bitaddress faz três coisas. Ele inicializa um <em>array </em>de bytes, tentando obter o máximo de entropia possível de seu computador, preenche o <em>array </em>com inserções do usuário (em inglês, <em>inputs) </em>e, então, gera uma chave privada.</p><p>O Bitaddress usa o <em>array </em>de 256 bytes para guardar a entropia. Esse <em>array</em> é reescrito em ciclos. Então, quando o array é preenchido pela primeira vez, o ponteiro vai para zero e o processo de preenchimento começa de novo.</p><p>O programa inicia um <em>array </em>com 256 bytes a partir de <a href="https://developer.mozilla.org/pt-BR/docs/Web/API/crypto_property">window.crypto</a>. Então, ele escreve um número representativo de um momento específico (nesse caso, a hora atual – em inglês, <em>timestamp</em>)<em> </em>para obter 4 bytes adicionais de entropia. Por fim, ele obtém dados como o tamanho da tela, seu fuso horário, informações sobre os plugins do seu navegador, sua localização e mais. Isso resulta em outros 6 bytes.</p><p>Depois da inicialização, o programa continuamente espera os <em>inputs </em>do usuário para reescrever os bytes iniciais. Quando o usuário move o cursor, o programa escreve a posição do cursor. Quando o usuário pressiona teclas, o programa escreve o código da tecla pressionada.</p><p>Finalmente, o bitaddress usa a entropia acumulada para gerar uma chave privada. É preciso gerar 32 bytes. Para essa tarefa, o bitaddress usa um algoritmo RNG chamado ARC4. O programa inicializa o ARC4 com a hora atual e a entropia coletada e, então, coleta os bytes um por um 32 vezes.</p><p>Isso tudo é uma simplificação de como o programa funciona, mas eu espero que tenha dado uma ideia de como ele é. Você pode checar o algoritmo completo e seus detalhes no <a href="https://github.com/pointbiz/bitaddress.org" rel="noopener">Github</a>.</p><h3 id="fa-a-voc-mesmo"><strong>Faça você mesmo</strong></h3><p>Para nossos propósitos, construiremos uma versão mais simples do bitaddress. Não vamos coletar dados sobre a localização e a máquina do usuário, somente inseriremos a entropia via texto, visto que é bem desafiador receber continuamente a posição do mouse em um script do Python (dê uma olhada em <a href="https://github.com/asweigart/pyautogui" rel="noopener">PyAutoGUI</a> se tiver interesse em fazer isso).</p><p>Isso nos traz para especificação formal de nossa biblioteca geradora. Primeiro, vamos inicializar um <em>array </em>de byte com RNG criptográfico. Depois, preencheremos com a <em>timestamp</em> e, finalmente, preencheremos com os caracteres inseridos pelo usuário. Depois que o agrupamento de <em>seeds</em> for preenchido, a biblioteca deixará o desenvolvedor criar a chave. Na verdade, o desenvolvedor será capaz de criar quantas chaves privadas ele quiser – tudo seguro de acordo com a entropia coletada.</p><h4 id="inicializando-o-agrupamento"><strong><strong>Ini</strong>c<strong>ializ</strong>ando o agrupamento</strong></h4><p>Aqui, colocamos alguns bytes de RNG criptográfico e uma <em>timestamp</em>. <code>__seed_int</code> e<code>__seed_byte</code> são dois métodos auxiliares que inserem entropia ao nosso array agrupador. Note que usamos a biblioteca <code>secrets</code>.</p><pre><code class="language-python">def __init_pool(self):
    for i in range(self.POOL_SIZE):
        random_byte = secrets.randbits(8)
        self.__seed_byte(random_byte)
    time_int = int(time.time())
    self.__seed_int(time_int)
def __seed_int(self, n):
    self.__seed_byte(n)
    self.__seed_byte(n &gt;&gt; 8)
    self.__seed_byte(n &gt;&gt; 16)
    self.__seed_byte(n &gt;&gt; 24)
def __seed_byte(self, n):
    self.pool[self.pool_pointer] ^= n &amp; 255
    self.pool_pointer += 1
    if self.pool_pointer &gt;= self.POOL_SIZE:
        self.pool_pointer = 0</code></pre><h4 id="alimentando-com-input"><strong>Alimentando com <strong><em>input</em></strong></strong></h4><p>Aqui, primeiro colocamos uma <em>timestamp </em>e, então, inserimos os caracteres, um a um.</p><pre><code>def seed_input(self, str_input):
    time_int = int(time.time())
    self.__seed_int(time_int)
    for char in str_input:
        char_code = ord(char)
        self.__seed_byte(char_code)</code></pre><h4 id="gerando-a-chave-privada"><strong><strong>Gera</strong>ndo a chave privada</strong></h4><p>Essa parte pode parecer difícil, mas, na verdade, é bem simples.</p><p>Primeiro, precisamos gerar um número de 32 bytes usando nosso agrupador. Infelizmente, não podemos apenas criar nosso próprio objeto <code>random</code> e usá-lo somente para a geração da chave. Ao invés disso, existe um objeto compartilhado que é usado por qualquer código que está sendo executado em um único script.</p><p>O que isso significa para nós? Significa que a cada momento, em qualquer lugar do código, um simples <code>random.seed(0)</code> pode destruir toda nossa entropia coletada. Não queremos isso. Por sorte, o Python nos dá os métodos <code>getstate</code> e <code>setstate</code>. Dessa maneira, para salvar nossa entropia cada vez que geramos uma chave, nós lembramos o estado onde paramos e o configuramos na próxima vez que necessitamos fazer uma chave.</p><p>Em segundo lugar, queremos ter certeza de que nossa chave está em uma variação específica (1, <code>CURVE_ORDER</code>). Isso é um requisito para todas chaves privadas ECDSA. O <code>CURVE_ORDER</code> é o arranjo da curva secp256k1, que é <code>FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141</code>.</p><p>Por fim, por conveniência, convertemos para hexadecimal e cortamos a parte '0x'.</p><pre><code class="language-python">def generate_key(self):
    big_int = self.__generate_big_int()
    big_int = big_int % (self.CURVE_ORDER — 1) # key &lt; curve order
    big_int = big_int + 1 # key &gt; 0
    key = hex(big_int)[2:]
    return key
def __generate_big_int(self):
    if self.prng_state is None:
    seed = int.from_bytes(self.pool, byteorder=’big’, signed=False)
    random.seed(seed)
    self.prng_state = random.getstate()
    random.setstate(self.prng_state)
    big_int = random.getrandbits(self.KEY_BYTES * 8)
    self.prng_state = random.getstate()
    return big_int</code></pre><h4 id="em-a-o"><strong>Em ação</strong></h4><p>Vamos tentar usar a biblioteca. Na verdade, é bem simples: você pode gerar uma chave privada em três linhas de código! </p><pre><code>kg = KeyGenerator()
kg.seed_input(‘Uma frase completamente aleatória. Eu joguei um dado e obtive 4.’)
kg.generate_key()
# 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2</code></pre><p>Veja você mesmo. A chave é aleatória e totalmente válida. Além disso, cada vez que você rodar o código, obterá um resultado diferente.</p><h3 id="conclus-o"><strong><strong>Conclus</strong>ão</strong></h3><p>Como pudemos ver, existem muitas maneiras de se gerar uma chave privada. Elas diferem em simplicidade e segurança.</p><p>Gerar uma chave privada é apenas o primeiro passo. O próximo passo é extrair uma chave pública e uma carteira que será usada para receber seus pagamentos. O processo de gerar uma carteira difere um pouco para Bitcoin e Ethereum. Eu planejo escrever outros dois artigos explorando mais esse tópico.</p><p>Se você quiser brincar com o código, ele está nesse <a href="https://github.com/Destiner/blocksmith">repositório do Github</a>.</p><p><em>O autor também trabalhou em um curso de criptomoedas<em>. </em>A <a href="https://medium.com/longcaller/blockchain-explained-2b26b28657ca">primeira parte</a> (texto em inglês) é uma descrição detalhada de blockchain.</em></p><p><em>Ele também publica pensamentos aleatórios sobre criptografia e criptomoedas no <em><a href="https://twitter.com/DestinerX" rel="noopener">Twitter</a></em>.<em> </em>Talvez você queira conferir.</em></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
