- Primeiramente, o que é bitcoin?
- Como funciona as transações do bitcoin?
- Criptografia/SHA-256
- Qual a aplicação do SHA-256 no bitcoin?
- Vamos para o código?
- Vamos testar como funciona essa função?
- Funções do nosso script!
- Função main!
- Rodando o Código
- Buscar informações reais
- Conclusão
generated with Summaryze Forem
Primeiramente, o que é bitcoin?
Bitcoin é uma forma de dinheiro, assim como o dólar, real, euro, a única diferença é que o bitcoin é uma moeda puramente digital, e não é emitido por nenhum governo. O seu valor, é definido individualmente pelos próprios indivíduos do mercado.
Como funciona as transações do bitcoin?
Todas as transações ficam armazenadas em um “livro”, que é o que chamamos de Ledger. Contudo, como existem milhares e milhares de transações, em vez de termos só um Ledger geral, nós temos milhares e milhares de ledgers também, sendo um conectado a seu antecessor. Desta forma fica muito mais fácil para pesquisarmos uma determinada transação. Está cadeia de ledgers são chamadas de blockchain (cadeia de blocos).
Criptografia/SHA-256
SHA-256, do inglês “Secure Hash Algorithm”, é uma função criptográfica utilizada como base do sistema de trabalho do Bitcoin. Essa função recebe uma entrada de tamanho aleatório e a converte em uma saída de tamanho fixo de 256 bits. As funções de hash são especiais por serem unidirecionais, ou seja, não podem produzir a entrada a partir da saída, mas sim uma saída quando recebem uma entrada. Além disso, o hash é calculado pelos mineradores para que uma transação possa ser adicionada à blockchain, funcionando como uma espécie de link entre os blocos, como já citado anteriormente.
O SHA-256 recebe códigos de qualquer cumprimento e cria um algoritmo de comprimento fixado em 256 bits ou 64 caracteres. Ele recebe uma entrada particular, que podemos chamar de “mensagem”, e basicamente aplica um conjunto de transformações matemáticas nessa entrada para produzir uma única saída, a qual também não pode ser descriptografada, seguindo uma função unidirecional, como uma via de mão única.
Qual a aplicação do SHA-256 no bitcoin?
A função SHA-256 na mineração do Bitcoin se dá quando um indivíduo se torna elegível a fim de colocar novos blocos dentro da blockchain. Para concluir a tarefa, ele deve preencher o que seria um cabeçalho do bloco, que deve atender pelos 6 parâmetros impostos pelo protocolo, são eles:
1°- Versão: número da versão do software Bitcoin
2°- Hash do bloco anterior: referência ao hash do bloco anterior
3°- Raiz de Merkle: um hash representativo das transações incluídas no bloco
4°- Registro de data e hora: o horário em que o bloco foi criado
5°- Target: algoritimo de prova de trabalho para o bloco
6°- Nonce: a variável usada no processo de prova de trabalho
Para que um bloco seja adicionado ao cabeçalho ele deve ser colocado duas vezes no algoritmo SHA-256.
Por exemplo:
Hash do bloco anterior = SHA-256(SHA-256(cabeçalho do bloco)).
Vamos para o código?
Primeiramente vamos importar 2 bibliotecas para que nosso código rode com sucesso! A primeira é a hashlib
, e a segunda é a time
.
<span>from</span> <span>hashlib</span> <span>import</span> <span>sha256</span><span>import</span> <span>time</span><span>from</span> <span>hashlib</span> <span>import</span> <span>sha256</span> <span>import</span> <span>time</span>from hashlib import sha256 import time
Enter fullscreen mode Exit fullscreen mode
A hashlib
utilizaremos para pegar a função sha256 tão importante nesta mineração, e a time será apenas para contabilizar o tempo em que nosso código ficará rodando.
Vamos testar como funciona essa função?
<span>print</span><span>(</span><span>sha256</span><span>(</span><span>'</span><span>efk</span><span>'</span><span>.</span><span>encode</span><span>(</span><span>'</span><span>ascii</span><span>'</span><span>)))</span><span>print</span><span>(</span><span>sha256</span><span>(</span><span>'</span><span>efk</span><span>'</span><span>.</span><span>encode</span><span>(</span><span>'</span><span>ascii</span><span>'</span><span>)))</span>print(sha256('efk'.encode('ascii')))
Enter fullscreen mode Exit fullscreen mode
Primeiramente, vou colocar tudo dentro de um print. Agora, chamei a função sha256
, e passei os caracteres ‘efk’ para codificarmos. Contudo, esses caracteres estão no formato unicode, por isso, passamos o método encode, e passamos como parâmetro o ‘ascii’. O resultado disso é:
<span><</span><span>sha256</span> <span>_hashlib</span><span>.</span><span>HASH</span> <span>object</span> <span>@</span> <span>0x0000025F1CFEA990</span><span>></span><span><</span><span>sha256</span> <span>_hashlib</span><span>.</span><span>HASH</span> <span>object</span> <span>@</span> <span>0x0000025F1CFEA990</span><span>></span><sha256 _hashlib.HASH object @ 0x0000025F1CFEA990>
Enter fullscreen mode Exit fullscreen mode
Ele gerou um objeto no python. Para transformamos esse objeto em uma string python, vamos passar o método hexdigest
. O código fica assim então:
<span>print</span><span>(</span><span>sha256</span><span>(</span><span>'</span><span>efk</span><span>'</span><span>.</span><span>encode</span><span>(</span><span>'</span><span>ascii</span><span>'</span><span>)).</span><span>hexdigest</span><span>())</span><span>print</span><span>(</span><span>sha256</span><span>(</span><span>'</span><span>efk</span><span>'</span><span>.</span><span>encode</span><span>(</span><span>'</span><span>ascii</span><span>'</span><span>)).</span><span>hexdigest</span><span>())</span>print(sha256('efk'.encode('ascii')).hexdigest())
Enter fullscreen mode Exit fullscreen mode
Gerando a saída:
<span>7</span><span>b450aa131c1b97d9573d30003b55290c1995d1258bb2596048c1c8cba3abd75</span><span>7</span><span>b450aa131c1b97d9573d30003b55290c1995d1258bb2596048c1c8cba3abd75</span>7b450aa131c1b97d9573d30003b55290c1995d1258bb2596048c1c8cba3abd75
Enter fullscreen mode Exit fullscreen mode
Ou seja, a string resultante, é o código criptografado para aqueles caracteres que passamos acima, ‘efk’.
Funções do nosso script!
<span>def</span> <span>apply_sha256</span><span>(</span><span>texto</span><span>):</span><span>return</span> <span>sha256</span><span>(</span><span>texto</span><span>.</span><span>encode</span><span>(</span><span>"</span><span>ascii</span><span>"</span><span>)).</span><span>hexdigest</span><span>()</span><span>def</span> <span>apply_sha256</span><span>(</span><span>texto</span><span>):</span> <span>return</span> <span>sha256</span><span>(</span><span>texto</span><span>.</span><span>encode</span><span>(</span><span>"</span><span>ascii</span><span>"</span><span>)).</span><span>hexdigest</span><span>()</span>def apply_sha256(texto): return sha256(texto.encode("ascii")).hexdigest()
Enter fullscreen mode Exit fullscreen mode
<span>def</span> <span>mine</span><span>(</span><span>n_bloco</span><span>,</span> <span>transacoes</span><span>,</span> <span>hash_anterior</span><span>,</span> <span>qtd_zeros</span><span>):</span><span>nonce</span> <span>=</span> <span>0</span><span>while</span> <span>True</span><span>:</span><span>text</span> <span>=</span> <span>str</span><span>(</span><span>n_bloco</span><span>)</span> <span>+</span> <span>transacoes</span> <span>+</span> <span>hash_anterior</span> <span>+</span> <span>str</span><span>(</span><span>nonce</span><span>)</span><span>hash</span> <span>=</span> <span>apply_sha256</span><span>(</span><span>text</span><span>)</span><span>if</span> <span>hash</span><span>.</span><span>startswith</span><span>(</span><span>"</span><span>0</span><span>"</span><span>*</span><span>qtd_zeros</span><span>):</span><span>return</span> <span>nonce</span><span>,</span><span>hash</span><span>nonce</span><span>+=</span><span>1</span><span>def</span> <span>mine</span><span>(</span><span>n_bloco</span><span>,</span> <span>transacoes</span><span>,</span> <span>hash_anterior</span><span>,</span> <span>qtd_zeros</span><span>):</span> <span>nonce</span> <span>=</span> <span>0</span> <span>while</span> <span>True</span><span>:</span> <span>text</span> <span>=</span> <span>str</span><span>(</span><span>n_bloco</span><span>)</span> <span>+</span> <span>transacoes</span> <span>+</span> <span>hash_anterior</span> <span>+</span> <span>str</span><span>(</span><span>nonce</span><span>)</span> <span>hash</span> <span>=</span> <span>apply_sha256</span><span>(</span><span>text</span><span>)</span> <span>if</span> <span>hash</span><span>.</span><span>startswith</span><span>(</span><span>"</span><span>0</span><span>"</span><span>*</span><span>qtd_zeros</span><span>):</span> <span>return</span> <span>nonce</span><span>,</span><span>hash</span> <span>nonce</span><span>+=</span><span>1</span>def mine(n_bloco, transacoes, hash_anterior, qtd_zeros): nonce = 0 while True: text = str(n_bloco) + transacoes + hash_anterior + str(nonce) hash = apply_sha256(text) if hash.startswith("0"*qtd_zeros): return nonce,hash nonce+=1
Enter fullscreen mode Exit fullscreen mode
Na função mine vamos precisar das informações que já foram mencionadas anteriormente, o número de blocos, as transações, o código do hash anterior, e a quantidade de zeros que é o que diz se aquele código é originado de um bitcoin. Saindo dos parâmetros, vamos definir nosso nonce como 0. Após isso, criamos um laço “infinito”, e vamos definir a nossa variável de texto. Esta variável vai receber o número do bloco convertido para string, concatenado com as transações, concatenado com o hash anterior, e concatenado com o nonce convertido para string também. E agora vamos criar nossa variável hash, que vai receber nossa função apply_sha256(). Verificamos agora a quantidade de 0 que tem no nosso hash, para isso vamos utilizar o if, e vamos utilizar o método startswith, que é utilizado para identificar a quantidade de 0 iniciais na nossa string hash. Para que não passássemos inúmeros 0, passamos apenas um, e multiplicamos pela variável quantidade de zeros. Se este if for verdadeiro, entramos nele e retornamos o nonce e o hash, se ele não for, atribuímos +1 no valor do nonce, e o laço se repete até que a condição acima seja verdadeira.
Função main!
<span>if</span> <span>__name__</span> <span>==</span> <span>"</span><span>__main__</span><span>"</span><span>:</span><span>num_bloco</span> <span>=</span> <span>15</span><span>transacoes</span> <span>=</span> <span>"""</span><span> Eduardo->Tulio->2 Adriano->Lucas->20 Isabella->Joao->10</span><span>"""</span><span>qtde_zeros</span> <span>=</span> <span>5</span><span>hash_anterior</span> <span>=</span> <span>"</span><span>abc</span><span>"</span><span>inicio</span> <span>=</span> <span>time</span><span>.</span><span>time</span><span>()</span><span>resultado</span> <span>=</span> <span>mine</span><span>(</span><span>num_bloco</span><span>,</span> <span>transacoes</span><span>,</span> <span>hash_anterior</span><span>,</span> <span>qtde_zeros</span><span>)</span><span>print</span><span>(</span><span>resultado</span><span>)</span><span>print</span><span>(</span><span>time</span><span>.</span><span>time</span><span>()</span> <span>-</span> <span>inicio</span><span>)</span><span>if</span> <span>__name__</span> <span>==</span> <span>"</span><span>__main__</span><span>"</span><span>:</span> <span>num_bloco</span> <span>=</span> <span>15</span> <span>transacoes</span> <span>=</span> <span>"""</span><span> Eduardo->Tulio->2 Adriano->Lucas->20 Isabella->Joao->10</span><span>"""</span> <span>qtde_zeros</span> <span>=</span> <span>5</span> <span>hash_anterior</span> <span>=</span> <span>"</span><span>abc</span><span>"</span> <span>inicio</span> <span>=</span> <span>time</span><span>.</span><span>time</span><span>()</span> <span>resultado</span> <span>=</span> <span>mine</span><span>(</span><span>num_bloco</span><span>,</span> <span>transacoes</span><span>,</span> <span>hash_anterior</span><span>,</span> <span>qtde_zeros</span><span>)</span> <span>print</span><span>(</span><span>resultado</span><span>)</span> <span>print</span><span>(</span><span>time</span><span>.</span><span>time</span><span>()</span> <span>-</span> <span>inicio</span><span>)</span>if __name__ == "__main__": num_bloco = 15 transacoes = """ Eduardo->Tulio->2 Adriano->Lucas->20 Isabella->Joao->10""" qtde_zeros = 5 hash_anterior = "abc" inicio = time.time() resultado = mine(num_bloco, transacoes, hash_anterior, qtde_zeros) print(resultado) print(time.time() - inicio)
Enter fullscreen mode Exit fullscreen mode
Primeiro vamos declarar o número de blocos. Após isso, vamos declarar as transações, e logo em seguida vamos declarar a quantidade de zeros. Após isso vamos criar nosso hash anterior, e vou declarar uma variável que vai servir pra cronometrar o tempo que meu algoritmo dará o resultado. Vamos utilizar a função time() para isso. Por fim, criaremos uma variável resultado, e chamaremos a função mine(), passando todos os parâmetros necessários. Após isso, vamos printar o resultado, e o tempo que o algoritmo utilizou pra rodar.
Rodando o Código
<span>from</span> <span>hashlib</span> <span>import</span> <span>sha256</span><span>import</span> <span>time</span><span>def</span> <span>apply_sha256</span><span>(</span><span>texto</span><span>):</span><span>return</span> <span>sha256</span><span>(</span><span>texto</span><span>.</span><span>encode</span><span>(</span><span>"</span><span>ascii</span><span>"</span><span>)).</span><span>hexdigest</span><span>()</span><span>def</span> <span>mine</span><span>(</span><span>n_bloco</span><span>,</span> <span>transacoes</span><span>,</span> <span>hash_anterior</span><span>,</span> <span>qtde_zeros</span><span>):</span><span>nonce</span> <span>=</span> <span>0</span><span>while</span> <span>True</span><span>:</span><span>texto</span> <span>=</span> <span>str</span><span>(</span><span>n_bloco</span><span>)</span> <span>+</span> <span>transacoes</span> <span>+</span> <span>hash_anterior</span> <span>+</span> <span>str</span><span>(</span><span>nonce</span><span>)</span><span>meu_hash</span> <span>=</span> <span>apply_sha256</span><span>(</span><span>texto</span><span>)</span><span>if</span> <span>meu_hash</span><span>.</span><span>startswith</span><span>(</span><span>"</span><span>0</span><span>"</span> <span>*</span> <span>qtde_zeros</span><span>):</span><span>return</span> <span>nonce</span><span>,</span> <span>meu_hash</span><span>nonce</span> <span>+=</span> <span>1</span><span>if</span> <span>__name__</span> <span>==</span> <span>"</span><span>__main__</span><span>"</span><span>:</span><span>num_bloco</span> <span>=</span> <span>15</span><span>transacoes</span> <span>=</span> <span>"""</span><span> Eduardo->Tulio->2 Adriano->Lucas->20 Isabella->Joao->10</span><span>"""</span><span>qtde_zeros</span> <span>=</span> <span>5</span><span>hash_anterior</span> <span>=</span> <span>"</span><span>abc</span><span>"</span><span>inicio</span> <span>=</span> <span>time</span><span>.</span><span>time</span><span>()</span><span>resultado</span> <span>=</span> <span>mine</span><span>(</span><span>num_bloco</span><span>,</span> <span>transacoes</span><span>,</span> <span>hash_anterior</span><span>,</span> <span>qtde_zeros</span><span>)</span><span>print</span><span>(</span><span>resultado</span><span>)</span><span>print</span><span>(</span><span>time</span><span>.</span><span>time</span><span>()</span> <span>-</span> <span>inicio</span><span>)</span><span>from</span> <span>hashlib</span> <span>import</span> <span>sha256</span> <span>import</span> <span>time</span> <span>def</span> <span>apply_sha256</span><span>(</span><span>texto</span><span>):</span> <span>return</span> <span>sha256</span><span>(</span><span>texto</span><span>.</span><span>encode</span><span>(</span><span>"</span><span>ascii</span><span>"</span><span>)).</span><span>hexdigest</span><span>()</span> <span>def</span> <span>mine</span><span>(</span><span>n_bloco</span><span>,</span> <span>transacoes</span><span>,</span> <span>hash_anterior</span><span>,</span> <span>qtde_zeros</span><span>):</span> <span>nonce</span> <span>=</span> <span>0</span> <span>while</span> <span>True</span><span>:</span> <span>texto</span> <span>=</span> <span>str</span><span>(</span><span>n_bloco</span><span>)</span> <span>+</span> <span>transacoes</span> <span>+</span> <span>hash_anterior</span> <span>+</span> <span>str</span><span>(</span><span>nonce</span><span>)</span> <span>meu_hash</span> <span>=</span> <span>apply_sha256</span><span>(</span><span>texto</span><span>)</span> <span>if</span> <span>meu_hash</span><span>.</span><span>startswith</span><span>(</span><span>"</span><span>0</span><span>"</span> <span>*</span> <span>qtde_zeros</span><span>):</span> <span>return</span> <span>nonce</span><span>,</span> <span>meu_hash</span> <span>nonce</span> <span>+=</span> <span>1</span> <span>if</span> <span>__name__</span> <span>==</span> <span>"</span><span>__main__</span><span>"</span><span>:</span> <span>num_bloco</span> <span>=</span> <span>15</span> <span>transacoes</span> <span>=</span> <span>"""</span><span> Eduardo->Tulio->2 Adriano->Lucas->20 Isabella->Joao->10</span><span>"""</span> <span>qtde_zeros</span> <span>=</span> <span>5</span> <span>hash_anterior</span> <span>=</span> <span>"</span><span>abc</span><span>"</span> <span>inicio</span> <span>=</span> <span>time</span><span>.</span><span>time</span><span>()</span> <span>resultado</span> <span>=</span> <span>mine</span><span>(</span><span>num_bloco</span><span>,</span> <span>transacoes</span><span>,</span> <span>hash_anterior</span><span>,</span> <span>qtde_zeros</span><span>)</span> <span>print</span><span>(</span><span>resultado</span><span>)</span> <span>print</span><span>(</span><span>time</span><span>.</span><span>time</span><span>()</span> <span>-</span> <span>inicio</span><span>)</span>from hashlib import sha256 import time def apply_sha256(texto): return sha256(texto.encode("ascii")).hexdigest() def mine(n_bloco, transacoes, hash_anterior, qtde_zeros): nonce = 0 while True: texto = str(n_bloco) + transacoes + hash_anterior + str(nonce) meu_hash = apply_sha256(texto) if meu_hash.startswith("0" * qtde_zeros): return nonce, meu_hash nonce += 1 if __name__ == "__main__": num_bloco = 15 transacoes = """ Eduardo->Tulio->2 Adriano->Lucas->20 Isabella->Joao->10""" qtde_zeros = 5 hash_anterior = "abc" inicio = time.time() resultado = mine(num_bloco, transacoes, hash_anterior, qtde_zeros) print(resultado) print(time.time() - inicio)
Enter fullscreen mode Exit fullscreen mode
E nossa saída é:
<span>(</span><span>1523970</span><span>,</span> <span>'</span><span>0000001be19bb67966b06b1261f729d0b00e3f557537184537378336f6989313</span><span>'</span><span>)</span><span>3.2422425746917725</span><span>(</span><span>1523970</span><span>,</span> <span>'</span><span>0000001be19bb67966b06b1261f729d0b00e3f557537184537378336f6989313</span><span>'</span><span>)</span> <span>3.2422425746917725</span>(1523970, '0000001be19bb67966b06b1261f729d0b00e3f557537184537378336f6989313') 3.2422425746917725
Enter fullscreen mode Exit fullscreen mode
Primeiro temos o nonce, logo em seguida o hash, e por fim o tempo em segundos que ele demorou para executar este script.
Buscar informações reais
Conclusão
O script para minerar bitcoin é relativamente simples, contudo, é preciso uma máquina extremamente potente para que esta mineração seja eficiente. O número de 0 utilizados nestas minerações atualmente iniciam com 20, quanto mais 0, mais tempo de processamento. Para apenas exemplificar, utilizei números menores, mas podem tentar a vontade, só cuidado pra não explodir o computador kkkkkk.
暂无评论内容