<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Victor Lins</title>
    <description>The latest articles on DEV Community by Victor Lins (@victorrlins).</description>
    <link>https://dev.to/victorrlins</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F832892%2F2047d985-9427-4aa3-b7a9-674ea3c39e46.jpg</url>
      <title>DEV Community: Victor Lins</title>
      <link>https://dev.to/victorrlins</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/victorrlins"/>
    <language>en</language>
    <item>
      <title>Construindo uma Blockchain em Kotlin</title>
      <dc:creator>Victor Lins</dc:creator>
      <pubDate>Tue, 31 May 2022 10:57:12 +0000</pubDate>
      <link>https://dev.to/victorrlins/construindo-uma-blockchain-em-kotlin-3kg5</link>
      <guid>https://dev.to/victorrlins/construindo-uma-blockchain-em-kotlin-3kg5</guid>
      <description>&lt;h2&gt;
  
  
  1. Visão geral
&lt;/h2&gt;

&lt;p&gt;Blockchain é um livro-razão distribuído e imutável que facilita o processo de registro de transações e o rastreamento de ativos em uma rede empresarial. Um ativo pode ser tangível (uma casa, um carro, dinheiro, terras) ou intangível (propriedade intelectual, patentes, direitos autorais e criação de marcas) [1].&lt;/p&gt;

&lt;p&gt;O objetivo desse artigo é que, ao construímos uma &lt;strong&gt;blockchain&lt;/strong&gt; simples em &lt;strong&gt;Kotlin&lt;/strong&gt;, tenhamos uma melhor compreensão de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como uma blockchain funciona;&lt;/li&gt;
&lt;li&gt;Como &lt;a href="https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_hash"&gt;funções hash&lt;/a&gt; e &lt;a href="https://pt.wikipedia.org/wiki/%C3%81rvores_de_Merkle"&gt;árvores de Merkle&lt;/a&gt; são utilizadas para manter e garantir a integridade da blockchain;&lt;/li&gt;
&lt;li&gt;Como algoritmos de &lt;a href="https://pt.wikipedia.org/wiki/Criptografia_de_chave_p%C3%BAblica"&gt;criptografia assimétrica&lt;/a&gt; e &lt;a href="https://pt.wikipedia.org/wiki/Assinatura_digital"&gt;assinatura digital&lt;/a&gt; são usados para implementar importantes features relacionadas à integridade, confidencialidade e autenticidade dos dados armazenados.&lt;/li&gt;
&lt;li&gt;Como o mecanismo de consenso chamado de &lt;a href="https://ethereum.org/pt-br/developers/docs/consensus-mechanisms/pow/"&gt;Prova de trabalho (Proof-of-Work)&lt;/a&gt; funciona e como ele é utilizado no processo de mineração de novos blocos e mitigação de ataques de 51%;&lt;/li&gt;
&lt;li&gt;Como expor as funcionalidades de uma blockchain através de uma API HTTP escrita em &lt;a href="https://kotlinlang.org/"&gt;Kotlin&lt;/a&gt; e &lt;a href="https://ktor.io/"&gt;Ktor&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Redes P2P (peer-to-peer)&lt;/strong&gt; são um componente chave usado pela tecnologia blockchain para tornar a rede descentralizada. Porém, para manter este artigo não tão extenso, discutiremos sobre o assunto em uma futura publicação. &lt;/p&gt;

&lt;p&gt;Iniciaremos apresentando importantes conceitos e, em seguida, implementaremos uma blockchain em um contexto de criptomoedas.&lt;/p&gt;

&lt;p&gt;É importante pontuar que esta não será uma blockchain totalmente funcional e pronta para produção. Esta é uma implementação para fins educacionais, para ajudá-lo a entender como funciona uma blockchain e que servirá de base para futuras publicações.&lt;/p&gt;

&lt;p&gt;O código fonte completo está disponível no &lt;a href="https://github.com/vrlins/kotlin-blockchain"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1. Funções Hash
&lt;/h3&gt;

&lt;p&gt;Uma função hash é um algoritmo que mapeia dados de comprimento variável para dados de comprimento fixo. Em geral, um hash é representado em base hexadecimal [2].&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu0vd2gp68vmc8z4cm39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu0vd2gp68vmc8z4cm39.png" alt="Função Hash" width="581" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Funções hash possuem características como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ser determinista&lt;/strong&gt;: Um procedimento de hash deve ser determinístico - o que significa que, para um determinado valor de entrada, ele deve sempre gerar o mesmo valor de hash;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ser computacionalmente eficiente&lt;/strong&gt;: Deve ser rápido calcular o valor de hash para qualquer entrada;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ser unidirecional&lt;/strong&gt;: Não deve ser possível reverter um valor hash para obter a entrada original;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ser resistente à colisão&lt;/strong&gt;: Deve ser computacionalmente difícil encontrar duas entradas diferentes de qualquer tamanho que resultem no mesmo hash;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em blockchain, funções hash são usadas em processos de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verificação de integridade dos dados;&lt;/li&gt;
&lt;li&gt;Assinaturas digitais;&lt;/li&gt;
&lt;li&gt;Mecanismo de consenso por Prova de trabalho (Proof-of-Work);&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.2. Árvores de Merkle
&lt;/h3&gt;

&lt;p&gt;Árvores de Merkle são um tipo de estrutura no qual cada nó não folha da árvore contém valores de hash de seus próprios nós filhos. Desta maneira, a raiz é o hash de todos os dados contidos nas folhas [3].&lt;/p&gt;

&lt;p&gt;Árvores de Merkle podem ser usadas para proteger qualquer tipo de dados armazenados, manuseados e transferidos dentro e entre computadores. Em blockchain, as árvores de Merkle podem ser utilizadas para garantir que blocos de dados recebidos de outros pares em uma rede P2P são recebidos intactos e inalterados, e até mesmo para verificar se os outros pares não mentem e enviam blocos falsos [4].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Árvore de Merkle binária:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxx3st1z3sk89o42ye07d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxx3st1z3sk89o42ye07d.png" alt="Árvores de Merkle" width="561" height="441"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.3. Criptografia assimétrica
&lt;/h3&gt;

&lt;p&gt;A criptografia assimétrica (conhecida como criptografia de chave pública) é um ramo da criptografia onde uma chave secreta pode ser dividida em duas partes, uma chave pública e uma chave privada. A chave pública pode ser dada a qualquer pessoa, confiável ou não, enquanto a chave privada deve ser mantida em segredo (assim como a chave na &lt;a href="https://pt.wikipedia.org/wiki/Algoritmo_de_chave_sim%C3%A9trica"&gt;criptografia simétrica&lt;/a&gt;). A criptografia assimétrica tem dois casos de uso principais: confidencialidade e autenticação [5].&lt;/p&gt;

&lt;p&gt;A imagem abaixo representa o processo de transmissão de uma mensagem com confidencialidade. Em primeiro lugar, o remetente criptografa a mensagem com a chave pública do destinatário, o remetente pode então enviar a mensagem (criptografada) com segurança. O destinatário então recebe a mensagem e pode descriptografá-la usando sua chave privada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxquyjxlhxzee7h6lz8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxquyjxlhxzee7h6lz8g.png" alt="Criptografia assimétrica" width="625" height="115"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.4. Assinatura digital
&lt;/h3&gt;

&lt;p&gt;Ao usar criptografia assimétrica, as mensagens podem ser assinadas com uma chave privada e, em seguida, qualquer pessoa com a chave pública pode verificar se a mensagem foi criada por alguém que possui a chave privada correspondente. Isso pode ser combinado com um sistema de prova de identidade para saber qual entidade (pessoa ou grupo) realmente possui essa chave privada, fornecendo autenticação [5].&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgy0iyzhb8gtrfjvcj1lh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgy0iyzhb8gtrfjvcj1lh.png" alt="Assinatura digital" width="481" height="227"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1.5. Blocos
&lt;/h3&gt;

&lt;p&gt;O nome blockchain vem do fato de que os dados são armazenados em blocos, e cada bloco é conectado ao bloco anterior, formando uma estrutura em cadeia. Com a tecnologia blockchain, você só pode adicionar (anexar) novos blocos à blockchain. Você não pode modificar ou excluir qualquer bloco depois que ele for adicionado à blockchain [6].&lt;/p&gt;

&lt;p&gt;De forma simplificada, um bloco é composto pelas seguintes propriedades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Previous Hash&lt;/strong&gt;: Hash de bloco anterior;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transactions&lt;/strong&gt;: Lista de transações incluídas no bloco;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamp&lt;/strong&gt;: Momento em que o bloco foi gerado;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nonce&lt;/strong&gt;: Número arbitrário que os mineradores devem encontrar - essencialmente adivinhar - para produzir um hash dentro de um conjunto de hashes válidos. Esse processo faz parte do mecanismo de consenso por prova de trabalho (PoW), que iremos entender durante o andamento desse artigo;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hash&lt;/strong&gt;: Um hash calculado a partir do conteúdo do bloco;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vckrx9sl6975di1hah8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vckrx9sl6975di1hah8.png" alt="Representação visual da estrutura dos blocos" width="481" height="241"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1.5.1. Hash do bloco
&lt;/h4&gt;

&lt;p&gt;O hash do bloco é uma das propriedades mais importantes do bloco. Ele é calculado a partir de todos os dados do bloco. Isso significa que, se algo no bloco mudar, o hash original não será mais válido.&lt;/p&gt;

&lt;p&gt;O hash do bloco também pode ser pensado como o identificador exclusivo do bloco. Usamos hashes de bloco para preservar a sua integridade e referenciar explicitamente o bloco anterior.&lt;/p&gt;

&lt;p&gt;Com isso, quanto mais profundo o bloco estiver na blockchain, mais difícil será modificá-lo, pois exigiria modificações em cada bloco consecutivo.&lt;/p&gt;
&lt;h4&gt;
  
  
  1.5.2. Bloco Genesis
&lt;/h4&gt;

&lt;p&gt;O bloco genesis é o primeiro bloco de uma blockchain. É a base na qual os próximos blocos serão adicionados para formar uma cadeia de blocos.&lt;/p&gt;

&lt;p&gt;Cada bloco em uma blockchain armazena uma referência ao bloco anterior. No caso do Bloco Genesis, não há bloco anterior para referência.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.6. Mecanismo de consenso por Prova de trabalho (Proof-of-Work)
&lt;/h3&gt;

&lt;p&gt;Mecanismos de consenso (também conhecidos como protocolos de consenso ou algoritmos de consenso) permitem que sistemas distribuídos (redes de computadores) trabalhem em conjunto, cheguem a um consenso sobre o estado da rede e permaneçam seguros.&lt;/p&gt;
&lt;h4&gt;
  
  
  1.6.1 Mineração de novos blocos
&lt;/h4&gt;

&lt;p&gt;Em blockchain, prova de trabalho é o algoritmo que define a dificuldade e as regras para o trabalho que os mineradores fazem. A mineração é o ato de adicionar blocos válidos (que inclui garantir que todas as transações presentes no bloco são válidas) à cadeia. &lt;/p&gt;

&lt;p&gt;A prova de trabalho exige que os mineradores passem por uma intensa corrida de tentativa e erro para encontrar o "nonce" para um bloco através da realização de uma ampla gama de funções de hash com diferentes valores de "nonce".&lt;/p&gt;

&lt;p&gt;O algoritmo de consenso de prova de trabalho define um bloco válido como aquele cujo valor de hash é menor que um determinado limite. A dificuldade determina o alvo para o hash. Quanto menor o alvo, menor o conjunto de hashes válidos. &lt;/p&gt;

&lt;p&gt;Essa prova (desafio criptográfico) exige que os mineradores encontrem um resultado de uma função hash dentro desse conjunto de hashes válidos, que é computacionalmente difícil (mas factível) de ser descoberto, porém é facilmente verificável por ele e pelos demais mineradores e clientes da rede [7] [8].&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4s9epbf35bmdgub0ne1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4s9epbf35bmdgub0ne1m.png" alt="Prova de trabalho" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O vencedor dessa corrida compartilha o novo bloco com o resto da rede e é recompensando pelo seu trabalho. &lt;/p&gt;

&lt;p&gt;Em um contexto de criptomoedas, a recompensa é feita através da geração de novas moedas, que são transferidas para o minerador do bloco.&lt;/p&gt;
&lt;h4&gt;
  
  
  1.6.2 Segurança e consenso
&lt;/h4&gt;

&lt;p&gt;Blockchains dependem de uma única fonte de verdade. E os utilizadores escolherão sempre a cadeia mais longa. A maior cadeia é aceita como válida pois ela teve o maior trabalho computacional realizado.&lt;/p&gt;

&lt;p&gt;Quanto mais "trabalho" for feito, quanto maior a cadeia e quanto maior o número do bloco, mais certeza a rede pode ter do estado atual das coisas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2qvj2qv627035jljhem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2qvj2qv627035jljhem.png" alt="Prova de trabalho - Consenso" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para criar blocos maliciosos, ainda que válidos, o atacante precisaria de mais de 51% do poder de mineração da rede para superar todos os demais mineradores. Seria preciso muito poder computacional para poder executar essa quantidade de "trabalho" [7].&lt;/p&gt;
&lt;h3&gt;
  
  
  1.7. Transações
&lt;/h3&gt;

&lt;p&gt;Em criptomoedas como o Bitcoin, as transações são compostas por dois componentes: entradas (inputs) e saídas (outputs).&lt;/p&gt;

&lt;p&gt;Uma transação é, essencialmente, uma transferência de valor.&lt;/p&gt;

&lt;p&gt;As entradas fornecem uma prova da origem dos valores transferidos e que são de propriedade do "remetente". As entradas sempre se referem a uma saída existente de uma transação anterior. As transações gastam saídas de transações anteriores e geram novas saídas que podem ser gastas por transações no futuro.&lt;/p&gt;

&lt;p&gt;Assim como na estrutura do bloco, também iremos registrar o momento em que a transação foi criada e ter um identificador exclusivo (hash) dessa transação, que também garantirá sua integridade.&lt;/p&gt;

&lt;p&gt;Com isso, uma transação pode ser representada pelas seguintes propriedades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inputs&lt;/strong&gt;: Lista de entradas da transação;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outputs&lt;/strong&gt;: Lista de saídas da transação;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamp&lt;/strong&gt;: Momento em que a transação foi criada;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hash&lt;/strong&gt;: Um hash calculado a partir do conteúdo da transação;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs39c3cb2ae2cbt5sh8f0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs39c3cb2ae2cbt5sh8f0.png" alt="Representação visual da estrutura das transações" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Implementação em Kotlin
&lt;/h2&gt;

&lt;p&gt;Após o entendimento de todos esses conceitos, chegou o momento de iniciarmos a nossa implementação em Kotlin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IDE utilizada:&lt;/strong&gt; &lt;a href="https://www.jetbrains.com/pt-br/idea/download/"&gt;IntelliJ IDEA 2022.1 (Community Edition)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Versão do Kotlin:&lt;/strong&gt; 1.6.20&lt;/p&gt;
&lt;h3&gt;
  
  
  2.1. Função Hash
&lt;/h3&gt;

&lt;p&gt;Assim como o Bitcoin, usaremos o algoritmo criptográfico &lt;a href="https://en.bitcoinwiki.org/wiki/SHA-256"&gt;SHA-256&lt;/a&gt; para o cálculo de hash. Podemos implementá-lo em Kotlin através de uma &lt;a href="https://kotlinlang.org/docs/extensions.html"&gt;extensão&lt;/a&gt; da classe String da seguinte forma:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  2.2. Criptografia assimétrica e assinatura digital
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;criptografia de curva elíptica (ECC)&lt;/strong&gt; é uma técnica de criptografia assimétrica baseada na teoria da curva elíptica que pode ser usada para criar chaves criptográficas mais rápidas, menores e mais eficientes [9].&lt;/p&gt;

&lt;p&gt;O ECC é uma alternativa ao algoritmo criptográfico Rivest-Shamir-Adleman (&lt;a href="https://pt.wikipedia.org/wiki/RSA_(sistema_criptogr%C3%A1fico)"&gt;RSA&lt;/a&gt;) e é mais usado para assinaturas digitais em criptomoedas, como Bitcoin e Ethereum, bem como criptografia unidirecional de e-mails, dados e software [9].&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://wiki.hyperledger.org/display/BESU/SECP256R1+Support"&gt;ECDSA&lt;/a&gt; é um esquema de assinatura digital criptograficamente seguro, baseado na criptografia de curva elíptica (&lt;a href="https://www.techtarget.com/searchsecurity/definition/elliptical-curve-cryptography"&gt;ECC&lt;/a&gt;) [10] [11].&lt;/p&gt;

&lt;p&gt;A seguir, iremos implementar funções responsáveis pela criação de pares de chaves, assinatura digital e alguns métodos auxiliares:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  2.3. Estrutura das transações
&lt;/h3&gt;

&lt;p&gt;O processo de armazenamento de transações na blockchain consiste, essencialmente, em criar transações (composta por Entradas e Saídas), assiná-las, incluí-las em um pool de transações a serem processadas e, a partir do processo de mineração, incluí-las nos blocos minerados.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  2.4. Estrutura dos blocos
&lt;/h3&gt;

&lt;p&gt;No mecanismo de consenso por prova de trabalho (Proof-of-Work), um bloco para ser considerado válido, além de ser composto por transações válidas, precisa que o hash gerado a partir do seu conteúdo atenda à um objetivo.&lt;/p&gt;

&lt;p&gt;Para isso, é necessário resolver um desafio criptográfico. Esse processo consiste em encontrar um número arbitrário (nomeado como "nonce" e que faz parte do conteúdo do bloco). &lt;/p&gt;

&lt;p&gt;Em nosso desafio, o valor de "nonce" encontrado deve permitir a geração de um valor hash com um certo número de 0s no início. A quantidade de 0s no inicio da hash determina a dificuldade de resolver o desafio criptográfico.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  2.5. Armazenando a blockchain e validando a integridade dos blocos
&lt;/h3&gt;

&lt;p&gt;Agora que criamos as classes relacionadas aos blocos e transações, vamos implementar uma blockchain. &lt;/p&gt;

&lt;p&gt;Em nossa versão de blockchain, há algumas simplificações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não existe um limite fixo para o número de transações que um bloco em uma blockchain pode conter;&lt;/li&gt;
&lt;li&gt;Cada novo bloco minerado, consome toda a lista atual de transações pendentes do pool de transações.&lt;/li&gt;
&lt;li&gt;O intervalo entre a geração de novos blocos não é gerenciado; &lt;/li&gt;
&lt;li&gt;O nível de dificuldade de mineração de novos blocos é fixo (Previamente estabelecido na geração do bloco genesis);&lt;/li&gt;
&lt;li&gt;Não há recompensa por bloco minerado e não há taxas ao enviar transações;&lt;/li&gt;
&lt;li&gt;Você pode pré-alocar valores a partir do bloco genesis para o dono (você) do par de chaves criadas na Wallet padrão (Iremos falar sobre a implementação da Wallet em breve);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nossa Blockchain é considerada válida quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estiver vazia;&lt;/li&gt;
&lt;li&gt;Houver um único bloco e ele for válido;&lt;/li&gt;
&lt;li&gt;Houver mais de um bloco e iterarmos por cada bloco garantindo que:

&lt;ul&gt;
&lt;li&gt;O bloco atual é válido;&lt;/li&gt;
&lt;li&gt;O bloco anterior é válido;&lt;/li&gt;
&lt;li&gt;Que o hash do bloco anterior é corretamente referenciado no bloco atual;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  2.6. Wallet
&lt;/h3&gt;

&lt;p&gt;O objetivo da carteira é criar uma interface mais simples para o usuário transacionar valores na blockchain.&lt;/p&gt;

&lt;p&gt;O usuário deve ser capaz de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar uma nova carteira (Que irá gerar um par de chaves);&lt;/li&gt;
&lt;li&gt;Ver o saldo de sua carteira;&lt;/li&gt;
&lt;li&gt;Enviar moedas para outros destinatários (referenciados por suas publicKey);&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  2.7. API HTTP
&lt;/h3&gt;

&lt;p&gt;Nesse momento, começaremos a criar uma API HTTP para nossa blockchain.&lt;/p&gt;

&lt;p&gt;Primeiro, iremos representar nossa blockchain em formato JSON:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Note na representação acima, que no primeiro bloco (genesis), há uma pré-alocação de 1000 unidades. A partir do segundo bloco, as entradas das transações são mapeadas em saídas (usadas também como forma de troco). Caso o remetente não deseje enviar todo o valor para o destinatário, o troco será devolvido ao remetente).&lt;/p&gt;

&lt;p&gt;A seguir, há uma descrição dos endpoints a serem implementados:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;/blockchain/blocks&lt;/td&gt;
&lt;td&gt;Get all blocks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;/blockchain/blocks/{index}&lt;/td&gt;
&lt;td&gt;Get block by index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;/blockchain/blocks&lt;/td&gt;
&lt;td&gt;Mine a new block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;/blockchain/status&lt;/td&gt;
&lt;td&gt;Blockchain status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;/my_wallet&lt;/td&gt;
&lt;td&gt;Get my wallet information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;/my_wallet/transactions&lt;/td&gt;
&lt;td&gt;Create a new transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;/wallets&lt;/td&gt;
&lt;td&gt;Create a new wallet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2.7.1 Criando uma API HTTP em Kotlin e Ktor
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ktor.io/"&gt;Ktor&lt;/a&gt; é um framework &lt;a href="https://kotlinlang.org/"&gt;Kotlin&lt;/a&gt; que pode ser usado para construir facilmente APIs HTTP.&lt;/p&gt;

&lt;p&gt;Nossa aplicação em Ktor requer as seguintes dependências:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;val ktorVersion = "2.0.1"
val logbackVersion = "1.2.11"

implementation("io.ktor:ktor-server-core:$ktorVersion")
implementation("io.ktor:ktor-server-netty:$ktorVersion")
implementation("io.ktor:ktor-server-html-builder:$ktorVersion")
implementation("io.ktor:ktor-server-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-jackson:$ktorVersion")

implementation("ch.qos.logback:logback-classic:$logbackVersion")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ao criarmos nossa API HTTP, é importante isolar os modelos relacionados às regras de negócio, dos que serão expostos através da API. Portanto, para cada estrutura criada anteriormente (Blockchain, Block, Transaction, Wallet, etc) foi criada uma representação a ser exposta em formato JSON.&lt;/p&gt;

&lt;p&gt;Na camada de API, utilizamos a biblioteca &lt;a href="https://github.com/FasterXML/jackson"&gt;Jackson&lt;/a&gt;, biblioteca poderosa e eficiente que trata da serialização e desserialização de objetos Java/Kotlin e suas representações JSON. &lt;/p&gt;

&lt;p&gt;Em seguida, implementaremos a API em Ktor, sem tantas validações, com objetivo apenas de tornar acessível externamente a blockchain para fins de aprendizado:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Conclusão
&lt;/h2&gt;

&lt;p&gt;Espero que você tenha gostado do artigo e agora tenha uma melhor compreensão de como uma blockchain funciona.&lt;/p&gt;

&lt;p&gt;Em futuros artigos, iremos explorar assuntos relacionados à arquitetura de redes, mecanismos de consenso e como podemos tornar nossa blockchain descentralizada.&lt;/p&gt;

&lt;p&gt;O código não é perfeito, então caso perceba algo a ser corrigido ou melhorado na implementação, sinta-se à vontade para contribuir com o projeto.&lt;/p&gt;

&lt;p&gt;O código fonte completo está disponível no &lt;a href="https://github.com/vrlins/kotlin-blockchain"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Obrigado :)&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Referências
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.ibm.com/br-pt/topics/what-is-blockchain"&gt;https://www.ibm.com/br-pt/topics/what-is-blockchain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_hash"&gt;https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_hash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gta.ufrj.br/ensino/eel878/redes1-2018-1/trabalhos-vf/blockchain/security.html"&gt;https://www.gta.ufrj.br/ensino/eel878/redes1-2018-1/trabalhos-vf/blockchain/security.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/%C3%81rvores_de_Merkle"&gt;https://pt.wikipedia.org/wiki/%C3%81rvores_de_Merkle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cryptography.io/en/latest/hazmat/primitives/asymmetric/index.html"&gt;https://cryptography.io/en/latest/hazmat/primitives/asymmetric/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.oracle.com/br/blockchain/what-is-blockchain/"&gt;https://www.oracle.com/br/blockchain/what-is-blockchain/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ethereum.org/pt-br/developers/docs/consensus-mechanisms/pow/"&gt;https://ethereum.org/pt-br/developers/docs/consensus-mechanisms/pow/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://resources.infosecinstitute.com/topic/hash-functions-in-blockchain/"&gt;https://resources.infosecinstitute.com/topic/hash-functions-in-blockchain/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.techtarget.com/searchsecurity/definition/elliptical-curve-cryptography"&gt;https://www.techtarget.com/searchsecurity/definition/elliptical-curve-cryptography&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.hyperledger.org/display/BESU/SECP256R1+Support"&gt;https://wiki.hyperledger.org/display/BESU/SECP256R1+Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.bitcoin.it/wiki/Elliptic_Curve_Digital_Signature_Algorithm"&gt;https://en.bitcoin.it/wiki/Elliptic_Curve_Digital_Signature_Algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alibabacloud.com/blog/comprehensive-review-of-proof-of-work-consensus-in-blockchain_597042"&gt;https://www.alibabacloud.com/blog/comprehensive-review-of-proof-of-work-consensus-in-blockchain_597042&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@vasilyf/lets-implement-a-cryptocurrency-in-kotlin-part-1-blockchain-8704069f8580"&gt;https://medium.com/@vasilyf/lets-implement-a-cryptocurrency-in-kotlin-part-1-blockchain-8704069f8580&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@vasilyf/lets-implement-a-cryptocurrency-in-kotlin-part-2-wallets-and-transactions-7aa55239c0d9"&gt;https://medium.com/@vasilyf/lets-implement-a-cryptocurrency-in-kotlin-part-2-wallets-and-transactions-7aa55239c0d9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa"&gt;https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/programmers-blockchain/creating-your-first-blockchain-with-java-part-2-transactions-2cdac335e0ce"&gt;https://medium.com/programmers-blockchain/creating-your-first-blockchain-with-java-part-2-transactions-2cdac335e0ce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lhartikk.github.io/"&gt;https://lhartikk.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackernoon.com/learn-blockchains-by-building-one-117428612f46"&gt;https://hackernoon.com/learn-blockchains-by-building-one-117428612f46&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>programming</category>
      <category>web3</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>Como configurar uma rede privada Ethereum na DigitalOcean</title>
      <dc:creator>Victor Lins</dc:creator>
      <pubDate>Mon, 28 Mar 2022 11:35:21 +0000</pubDate>
      <link>https://dev.to/victorrlins/como-configurar-uma-rede-privada-ethereum-na-digitalocean-5h56</link>
      <guid>https://dev.to/victorrlins/como-configurar-uma-rede-privada-ethereum-na-digitalocean-5h56</guid>
      <description>&lt;p&gt;Ethereum é um software executado em uma rede de computadores que garante que dados e pequenos programas de computador, chamados contratos inteligentes, sejam replicados e processados ​​em todos os computadores da rede, sem um coordenador central. Seu objetivo é criar um computador mundial descentralizado e autossustentável, resistente à censura e imparável [1].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockchain Ethereum&lt;/strong&gt;&lt;br&gt;
Assim como o Bitcoin, o Ethereum possui uma blockchain, que contém blocos de dados (transações e contratos inteligentes). Os blocos são criados ou minerados por alguns participantes e distribuídos para outros participantes que os validam [1].&lt;/p&gt;

&lt;p&gt;Um minerador, ao validar um novo bloco, é recompensado com uma certa quantia de valor por fazer esse trabalho. Qual é esse valor? A blockchain Ethereum usa um token digital intrínseco chamado "Ether" [2].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocolo Ethereum&lt;/strong&gt;&lt;br&gt;
Ethereum também é um protocolo, e isso significa que podem existir várias redes independentes em conformidade com esse protocolo mas que não interagem entre si. Com isso, uma rede privada é uma rede completamente isolada da rede principal Ethereum [3].&lt;/p&gt;

&lt;p&gt;Normalmente, as redes privadas são criadas por organizações para armazenar dados que não devem ser visíveis fora da mesma. Além disso, elas podem ser usadas para o desenvolvimento e testes de aplicativos descentralizados (dApps) e smart contracts antes de um lançamento na rede principal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que faremos a seguir:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuraremos uma rede privada;&lt;/li&gt;
&lt;li&gt;Configuraremos full nodes;&lt;/li&gt;
&lt;li&gt;Mineraremos alguns novos blocos;&lt;/li&gt;
&lt;li&gt;Por fim, criaremos uma transação enviando tokens ganhos como recompensa pela mineração de novos blocos;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contexto&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Criaremos uma rede privada com 2 full nodes. O primeiro será responsável por inicializar a blockchain e ser o primeiro signatário, enquanto o segundo será adicionado a rede em um estágio posterior.&lt;/p&gt;

&lt;p&gt;Um full node é responsável por validar as transações e blocos e, em seguida, por retransmiti-los para outros participantes da rede [4].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1ª etapa: Criação de uma instância Ubuntu&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://www.digitalocean.com/"&gt;Digital Ocean&lt;/a&gt;, provedora de infraestrutura em nuvem, permite criar máquinas virtuais por meio de um de seus produtos: &lt;a href="https://www.digitalocean.com/products/droplets"&gt;https://www.digitalocean.com/products/droplets&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para publicação desse guia, foram utilizadas instâncias Ubuntu da Digital Ocean com as seguintes especificações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04 (LTS) x64&lt;/li&gt;
&lt;li&gt;1 GB / 1 CPU;&lt;/li&gt;
&lt;li&gt;25 GB SSD Disk;&lt;/li&gt;
&lt;li&gt;1000 GB Transfer;&lt;/li&gt;
&lt;li&gt;Datacenter Region: New York 1 (nyc1);&lt;/li&gt;
&lt;li&gt;VPC Network: default-nyc1 (DEFAULT);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvc1rburax81h0rr7ok9a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvc1rburax81h0rr7ok9a.png" alt="Image description" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqb1sa1rw93st00jvta67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqb1sa1rw93st00jvta67.png" alt="Image description" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2ª etapa: Instalação do Geth no Ubuntu via PPAs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go-ethereum (geth) é a interface de linha de comando implementada em Go para executar um full node Ethereum. &lt;/p&gt;

&lt;p&gt;Uma das maneiras de instalar o geth em distribuições Ubuntu é através de PPAs (Personal Package Archives).&lt;/p&gt;

&lt;p&gt;Para instalá-lo, execute os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo add-apt-repository -y ppa:ethereum/ethereum 
sudo apt-get update 
sudo apt-get install ethereum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3ª etapa: Criação do bloco Genesis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O primeiro bloco de uma blockchain, chamado de bloco Genesis, pode ser configurado a partir de um arquivo .json.&lt;/p&gt;

&lt;p&gt;Abra uma interface de linha de comando e crie um diretório para armazenar os dados da nova blockchain privada e navegue até ele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~ &amp;amp;&amp;amp; mkdir private-blockchain &amp;amp;&amp;amp; cd private-blockchain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com um editor de texto de sua preferência, crie o arquivo genesis.json com as seguintes informações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "config": {
    "chainId": &amp;lt;insira um valor inteiro positivo arbitrário&amp;gt;,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "berlinBlock": 0,
    "londonBlock": 0,
    "ethash": {}
  },
  "difficulty": "1",
  "gasLimit": "8000000",
  "alloc": {}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;chainId&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Parâmetro que identifica a cadeia atual e é usado para proteção contra ataques de repetição. Você deve configurá-lo com um valor inteiro positivo arbitrário.&lt;/p&gt;

&lt;p&gt;Existe um site dedicado ao registro das chains da EVM (Ethereum Virtual Machine) e seus IDs correspondentes: &lt;a href="https://chainlist.org/"&gt;https://chainlist.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;homesteadBlock, eip150Block, eip155Block, etc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;São parâmetros relacionados à bifurcação da cadeia e versionamento dela. &lt;/p&gt;

&lt;p&gt;À medida que o desenvolvimento do protocolo Ethereum avança, novos recursos Ethereum ficam disponíveis. Para habilitar esses recursos em sua rede privada, você deve agendar um hard fork.&lt;/p&gt;

&lt;p&gt;No nosso caso, vamos deixá-los com valor 0, já que estamos iniciando uma nova blockchain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ethash&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ethash é um algoritmo de consenso por prova de trabalho (PoW / Proof of Work). Como ele é o algoritmo de consenso padrão, nenhum parâmetro adicional precisa ser configurado para usá-lo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;difficulty&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Corresponde ao nível de dificuldade para minerar um novo bloco. Definir esse valor baixo é útil em uma blockchain privada, pois permite minerar novos blocos rapidamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;gasLimit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esse valor afeta o quanto de computação da EVM (Ethereum Virtual Machine) pode acontecer em um único bloco. Com uma dificuldade de mineração baixa, os blocos se moverão muito rápido. Você pode definir um valor alto para evitar atingir o limite e desacelerar sua rede. Com isso, uma maior quantidade de transações poderão ser processadas por bloco.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;alloc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Permite definir uma lista de carteiras com uma pré-alocação de tokens ao iniciar a blockchain. Como poderemos minerar tokens rapidamente, não será necessário usar essa opção.&lt;/p&gt;

&lt;p&gt;Para inicializar o bloco de genesis a partir dos parâmetros definidos no arquivo genesis.json, execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;geth --datadir . init genesis.json 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe o resultado da execução do comando e verifique que na última linha do resultado é exibido algo como: &lt;code&gt;"INFO [03-19|21:43:14.533] Successfully wrote genesis state.."&lt;/code&gt;. Essa mensagem significa que a inicialização da blockchain privada foi feita com sucesso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4ª etapa: Inicialização de um full node Ethereum&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para iniciar um full node e ter acesso ao Geth JavaScript Console, execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;geth --datadir . --networkid &amp;lt;Use o mesmo valor que você definiu como sendo o chainId&amp;gt; --nodiscover --http --http.corsdomain "*" --http.api "eth,net,web3,personal,miner,admin" --allow-insecure-unlock console 2&amp;gt;&amp;gt; eth.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;--datadir&lt;/strong&gt;: configura a localização do diretório onde os dados da blockchain serão armazenados;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;--networkid&lt;/strong&gt;: As redes Ethereum têm dois identificadores, um ID de rede e um ID de cadeia. Embora muitas vezes tenham o mesmo valor, eles têm usos diferentes. A comunicação ponto a ponto entre os nós usa o ID da rede, enquanto o processo de assinatura da transação usa o ID da cadeia. No nosso caso, iremos usar o mesmo valor que foi definido como chainId, pois não queremos usar o mesmo ID da rede principal [9].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;--nodiscover&lt;/strong&gt;: desativa o mecanismo de descoberta de novos nós (para que a adição de um novo nó como signatário seja feita de forma manual);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;--http&lt;/strong&gt;: habilita o servidor HTTP-RPC. O geth aceita, por padrão,  conexões na interface de loopback (127.0.0.1) na porta 8545;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;--http.corsdomain&lt;/strong&gt;: Como o servidor HTTP pode ser acessado de qualquer aplicativo local, uma proteção adicional é incorporada ao servidor para evitar o uso indevido da API por páginas web. Como estamos em um ambiente de testes, podemos habilitar o acesso de qualquer origem utilizando "*";&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;--http.api&lt;/strong&gt;: permite que os módulos listados sejam usados ​​em chamadas HTTP;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;--allow-insecure-unlock&lt;/strong&gt;: é usado para permitir o desbloqueio de conta de forma insegura ao usar a API HTTP-RPC. Como estamos em um ambiente de testes, usaremos essa flag para ser possível enviar transações através do console geth;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;console&lt;/strong&gt;: Inicia o console JavaScript interativo geth;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Acesso ao console Geth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você pode iniciar o full node de mineração como um console ou executar o console separadamente e anexá-lo à um full node de mineração, com o comando attach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;geth --datadir . attach ipc:geth.ipc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para monitorar a execução do geth, execute os seguintes comandos em uma outra interface de linha de comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/private-blockchain &amp;amp;&amp;amp; tail -f eth.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5ª etapa: Criação de uma nova conta&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esse etapa considera que você esteja dentro do Geth JavaScript console.&lt;/p&gt;

&lt;p&gt;Para criar uma nova conta, execute o seguinte comando passando como parâmetro uma senha segura que será usada para encriptar sua nova conta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;personal.newAccount("&amp;lt;secure password&amp;gt;")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado do comando anterior será o endereço da conta criada. &lt;/p&gt;

&lt;p&gt;Um endereço como:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"0xd55859a0125c8f248905419e68b1fd603a9e7328"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O atributo "coinbase" representa o endereço da conta para onde as recompensas de mineração irão ser transferidas. Como nenhuma conta havia sido considerada como coinbase até o momento, o endereço da primeira conta criada foi definida como coinbase.&lt;/p&gt;

&lt;p&gt;Com isso, os seguintes comandos retornarão o mesmo endereço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eth.accounts[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eth.coinbase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para consultar a quantidade de tokens em sua conta, execute o seguinte comando no console Geth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web3.fromWei(eth.getBalance(eth.coinbase), "ether")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6ª etapa: Inicializar mineração&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para começar o processo de mineração de CPU usando um número determinado de threads (nesse caso, estamos passando como parâmetro o valor 1), execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;miner.start(1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir de uma interface de linha de comando, você poderá executar os seguintes comandos para monitorar o andamento do processo de mineração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/private-blockchain
tail -f eth.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E perceberá que a seguinte mensagem será exibida como informativo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Generating DAG in progress...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A saída mostra o DAG (directed acyclic graph) sendo criado. Esse processo é parte do configuração inicial do algoritmo de consenso ethash.&lt;/p&gt;

&lt;p&gt;Considerando as especificações das instâncias Ubuntu utilizadas nesta publicação, o processo de geração do DAG durou aproximadamente 30 minutos.&lt;/p&gt;

&lt;p&gt;Quando o processo de geração do DAG é concluído, a seguinte mensagem é exibida como informativo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Generated ethash verification cache...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após o DAG ser gerado, a mineração de novos blocos é iniciada.&lt;/p&gt;

&lt;p&gt;Quando um bloco é extraído, são adicionados tokens ao saldo da sua conta como recompensa. Este é um bom indicador se o processo de mineração foi bem-sucedido ou não.&lt;/p&gt;

&lt;p&gt;Ao minerar um novo bloco, será exibido algo como:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;INFO [03-19|22:21:08.660] Successfully sealed new block            number=1 sealhash=976c5d..862079 hash=f58c06..f22756 elapsed=30m49.597s&lt;br&gt;
INFO [03-19|22:21:08.714] 🔨 mined potential block                  number=1 hash=f58c06..f22756&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se continuarmos a mineração, o saldo de sua conta continuará aumentando à medida que novos blocos são minerados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7ª etapa: Repita as etapas 2-5 em uma segunda instância para configurar seu segundo full node Ethereum&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Certifique-se de que o mesmo arquivo genesis.json seja usado ao iniciar o blockchain no segundo full node.&lt;/p&gt;

&lt;p&gt;Não inicie a mineração (6ª Etapa) na segunda instância, pois queremos que o segundo full node esteja na mesma rede / blockchain que o do primeiro. Faremos esse processo através de uma etapa de pareamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8ª etapa: Pareamento dos full nodes&lt;/strong&gt;&lt;br&gt;
Consideramos que nessa etapa você tenha dois full nodes em funcionamento, com as mesmas definições de bloco genesis, mas que apenas o primeiro esteja minerando novos blocos.&lt;/p&gt;

&lt;p&gt;Antes de tudo, verifique que eles não estão pareados através do Geth console em ambas as instâncias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admin.peers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando anterior deve retornar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Em seguida, precisaremos obter as informações sobre o primeiro full node para usá-las nas configurações de pareamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node-01&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admin.nodeInfo.enode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado do comando anterior será algo no seguinte formato:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"enode://pubkey@ip:port?discport=0"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Altere o valor do ip para o endereço IP privado do primeiro full node e adicione essa informação ao segundo full node com o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node-02&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admin.addPeer("enode://pubkey@ip:port")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admin.addPeer("enode://2527461a25c9db1732e6105e1be50113e9203222381510a0e6a0139a78a4bfccecfeff962db192dcf32c8fc57cebe6209c1fa060ceb1b01432a22b57fb562833@10.136.0.2:30303")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a execução do comando anterior, os full nodes serão pareados.&lt;/p&gt;

&lt;p&gt;Para verificar se o pareamento foi concluído, execute o comando &lt;code&gt;admin.peers&lt;/code&gt; novamente em ambas a instâncias após alguns segundos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node-02&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admin.peers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[{
    caps: ["eth/66", "snap/1"],
    enode: "enode://2527461a25c9db1732e6105e1be50113e9203222381510a0e6a0139a78a4bfccecfeff962db192dcf32c8fc57cebe6209c1fa060ceb1b01432a22b57fb562833@10.136.0.2:30303?discport=0",
    id: "c27af002910cc0681dfb02df71a5c4e6c3f7d89a91dad1b957acf7014ac54903",
    name: "Geth/v1.10.16-stable-20356e57/linux-amd64/go1.17.5",
    network: {
      inbound: false,
      localAddress: "10.136.0.3:38204",
      remoteAddress: "10.136.0.2:30303",
      static: true,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 131073,
        head: "0xe65d3192a9678e4eff3c117a30e9c1db3cf750e62c7410f8932ef3f7123b2690",
        version: 66
      },
      snap: {
        version: 1
      }
    }
}]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;9ª etapa: Transação entre contas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como os dois full nodes estão pareados, enviaremos alguns tokens entre as contas que criamos. Neste exemplo, enviaremos 1 ETH da conta criada no node-01 para a conta criada no node-02. Essa é uma maneira de verificar se toda configuração foi bem-sucedida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node-01&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Para enviar uma transação, execute os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;personal.unlockAccount(eth.coinbase)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eth.sendTransaction({from: eth.coinbase, to: "&amp;lt;endereço da conta de destino&amp;gt;", value: web3.toWei(1, "ether")})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após um novo bloco ser minerado, fazendo com que sua transação seja confirmada, verifique que o saldo da conta criada a partir do node-02 será de valor 1. &lt;/p&gt;

&lt;p&gt;Com isso, concluímos a configuração de uma rede privada ethereum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://bitsonblocks.net/2016/10/02/gentle-introduction-ethereum/"&gt;https://bitsonblocks.net/2016/10/02/gentle-introduction-ethereum/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://preethikasireddy.medium.com/how-does-ethereum-work-anyway-22d1df506369"&gt;https://preethikasireddy.medium.com/how-does-ethereum-work-anyway-22d1df506369&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ethereum.org/en/developers/docs/networks/"&gt;https://ethereum.org/en/developers/docs/networks/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitcoin.org/en/full-node"&gt;https://bitcoin.org/en/full-node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://geth.ethereum.org/docs/install-and-build/installing-geth"&gt;https://geth.ethereum.org/docs/install-and-build/installing-geth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ethereum.org/en/developers/docs/evm/"&gt;https://ethereum.org/en/developers/docs/evm/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arvanaghi.com/blog/explaining-the-genesis-block-in-ethereum/"&gt;https://arvanaghi.com/blog/explaining-the-genesis-block-in-ethereum/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ethereum.stackexchange.com/questions/2376/what-does-each-genesis-json-parameter-mean"&gt;https://ethereum.stackexchange.com/questions/2376/what-does-each-genesis-json-parameter-mean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID/"&gt;https://besu.hyperledger.org/en/stable/Concepts/NetworkID-And-ChainID/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web3js.readthedocs.io/"&gt;https://web3js.readthedocs.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://geth.ethereum.org/docs/"&gt;https://geth.ethereum.org/docs/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>cloud</category>
      <category>ethereum</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
