Se olharmos para as tendências dos anos anteriores, ouvimos falar de blockchain o tempo todo, mas não muito sobre as especificidades.
Estamos todos cientes de que criptomoedas como Bitcoin, Ethereum, Dogecoin, Matic e outras dependem da tecnologia blockchain. Blockchain liderou os eventos significativos que revolucionaram vários setores em 2021 e abriram o caminho para novas conquistas.
Blockchain é um meio de armazenar dados de uma maneira difícil ou impossível de editar, hackear ou fraudar. É um livro digital de transações que são duplicadas e espalhadas por toda a rede de sistemas de computadores da blockchain.
É a tecnologia de banco de dados inovadora que alimenta praticamente todas as criptomoedas. Blockchain torna incrivelmente difícil hackear ou enganar o sistema, espalhando cópias idênticas de um banco de dados em uma rede inteira.
Embora o Bitcoin seja agora o uso mais proeminente do blockchain, a tecnologia pode atender a uma ampla variedade de aplicações.
Criptomoedas e blockchains têm sido cada vez mais populares nos últimos anos, e espera-se que essa tendência continue.
Faremos um blockchain simples com JavaScript neste tutorial. Ele fornecerá uma compreensão básica de como um blockchain funciona.
Vamos chamá-lo de MelodyCoin e entrar em ação!
Criando um bloco
Para começar, criaremos um novo arquivo JavaScript no qual colocaremos todo o nosso código.
Vamos chamá-lo de main.js e começar com uma descrição de como um blockchain e blocos devem ser.
Crie uma classe Block e dê a ela uma função Object() { [código nativo] } para começar.
Você deve fornecer uma data e o hash do bloco anterior ao criar um novo bloco:
Aqui estão as definições para cada propriedade:
- O timestamp indica quando o bloqueio foi feito. Você pode usar qualquer formato que escolher (neste caso, um timestamp UNIX).
- Qualquer forma de dados que você deseja conectar a este bloco pode ser incluída no parâmetro data. Se você deseja criar uma criptomoeda, pode manter os dados da transação, como o remetente/destinatário e a quantidade de dinheiro movimentada aqui.
- O previousHash é uma string que contém o hash do bloco anterior. Isso é o que vai gerar a cadeia de blocos, que será fundamental para fornecer a integridade do nosso blockchain posteriormente.
Criando hashes
Cada bloco é vinculado ao bloco anterior (portanto, a propriedade previousHash). Ou seja, cada bloco requer um hash. Um hash é semelhante a uma impressão digital. É distinto para cada bloco.
O hash de um bloco pode ser calculado passando todo o seu conteúdo através de uma função hash.
Então, vamos começar implementando uma função que calcula o hash do bloco atual.
Então, na classe Block, definimos a função calculateHash:
No entanto, o hash SHA256 não é compatível com JavaScript e deve ser obtido de uma biblioteca externa.
Crypto-js é um pacote fantástico que inclui implementações seguras de vários algoritmos de hash.
Em seguida, podemos importá-lo para nosso código main.js.
Agora que temos nossa função calculateHash(), vamos colocá-la em uso na função do nosso Bloco:
Depois de descrever como é um Bloco, podemos definir como deve ser um Blockchain. Então vamos criar uma nova classe.
Nesse cenário, o blockchain é um objeto muito simples que possui uma cadeia de propriedades. Esta é uma matriz que contém todos os blocos da cadeia.
Antes de podermos adicionar blocos, devemos primeiro criar o que é conhecido como “bloco de gênese”. Este é o primeiro bloco da cadeia e é único, pois não pode apontar para um bloco anterior (é o primeiro!).
Então, para construir o bloco genesis, adicionarei uma função à nossa classe chamada createGenesisBlock(). De volta à função Object() { [código nativo] } da nossa classe Blockchain.
Agora podemos incluir o bloco genesis sempre que construirmos uma nova instância Blockchain:
Métodos Blockchain
Agora, vamos adicionar métodos à nossa classe Blockchain que nos permitirá fazer coisas como adicionar novos blocos e buscar o bloco mais recente.
A função getLatestBlock é a mais básica. Ele simplesmente retorna o membro final do array chain:
A técnica addBlock é um pouco mais complicada.
Antes de podermos adicionar um novo bloco à nossa cadeia, devemos primeiro definir adequadamente o campo previousHash desse bloco.
Ele deve ser definido como o hash do bloco adicionado mais recentemente à nossa cadeia. Também precisamos calcular o hash do novo bloco:
ensaio
Vamos ver como nosso MelodyCoin saiu.
Crie uma instância de blockchain para fazer isso. Vamos adicionar mais alguns blocos:
Fizemos dois novos blocos lá. Vamos dar uma olhada em como está nossa blockchain atualmente.
MelodyCoin será encadeado e formatado com quatro espaços:
Verifique a integridade do Blockchain
Blockchains são fantásticos porque uma vez que um bloco foi adicionado, ele não pode ser modificado sem invalidar o restante da cadeia.
No entanto, não há método para eu verificar a integridade do nosso blockchain com esta implementação.
Vamos introduzir uma função isChainValid ao nosso blockchain. Se a cadeia for legítima, ela retornará true; caso contrário, retornará false:
Teste de integridade
Agora podemos testar a integridade do nosso blockchain. Se o executarmos agora, confirmará que nossa cadeia é genuína.
Vamos agora tentar adulterar nosso blockchain. Vamos alterar o bloco 2 e sobrescrever seu conteúdo (vamos supor que transferimos 100 moedas em vez de quatro).
Quando executamos isso, podemos ver que o software reconhece nosso esforço para adulterar a cadeia.
No entanto, você pode acreditar que existe outro método para me intrometer nisso. Alterei o conteúdo do bloco, mas não recalculei o hash. Então você pode tentar ser esperto e recalcular o hash desse mesmo bloco.
Isso é tudo o que havia para nossa pequena configuração de blockchain! Ele nos permite adicionar novos blocos e detectar adulteração de dados dentro da cadeia.
Há dois problemas com nosso pequeno blockchain que devemos resolver:
- Os computadores modernos são extremamente rápidos e podem adicionar milhares de blocos à nossa cadeia em segundos. Obviamente, não queremos que ninguém faça spam em nosso blockchain.
- Nosso blockchain ainda é vulnerável a adulterações. Você pode atualizar o conteúdo de um bloco e, em seguida, simplesmente recalcular os hashes (e hashes anteriores) para todos os blocos seguintes. Mesmo se você mexer com isso, você acabará com uma corrente legítima.
Para resolver essas preocupações, as blockchains usam uma técnica conhecida como “prova de trabalho”. Você deve demonstrar que usou uma quantidade significativa de recursos computacionais para criar um bloco usando essa abordagem. Isso também é chamado mineração.
A prova de trabalho requer que o hash de um bloco comece com uma quantidade específica de zeros. Mas como você pode saber se seu hash se encaixa nessa regra?
O conteúdo de um bloco determina seu hash. Portanto, sempre obtemos o mesmo hash, desde que não modifiquemos o conteúdo.
Cada bloco deve ter um valor nonce adicionado a ele como uma solução. Estes são essencialmente alguns dados aleatórios que podemos atualizar até que o hash do nosso bloco comece com zeros suficientes. Como você não pode alterar a saída de uma função de hash, você precisa testar várias combinações diferentes e esperar o melhor.
Introduzir a mineração no Blockchain
Vamos começar incluindo um nonce em nossa classe Block. O nonce é o valor único dentro do nosso bloco que podemos modificar para impactar o hash do bloco.
Não podemos alterar o carimbo de data/hora ou os dados.
Em seguida, vamos escrever uma função mineBlock() que fará a mineração real de um bloco. Esta função receberá como parâmetro a dificuldade necessária e continuará sendo executada até que o hash do nosso bloco comece com zeros suficientes.
Acabei de fazer um loop while básico que seria executado até que nosso hash começasse com zeros suficientes. Usamos a dificuldade para determinar quantos zeros são necessários. Com uma dificuldade de 5, nosso hash deve começar com 5 zeros.
Quando nosso hash não contém zeros suficientes, aumentamos o nonce em um e recalculamos o hash. E se encontrarmos um hash que corresponda à dificuldade, registramos no console.
Há mais uma coisa que precisamos fazer. Nós realmente não levamos em consideração a variável nonce em nosso método calculateHash, então aqui está:
Classe Blockchain
Vamos testar essa nova abordagem em nossa classe blockchain e ver como ela se sai.
Para começar, vou definir a dificuldade do nosso blockchain na função Object(). Nós o definimos aqui, pois podemos usá-lo em algum lugar mais tarde.
A função addBlock deve então ser modificada de forma que minere o bloco antes de adicioná-lo à nossa cadeia.
Use o Blockchain
Agora, vamos usar nosso novo blockchain com o algoritmo de prova de trabalho. Aqui, adicione algumas instruções console.log.
Quando executamos este código, podemos observar que o processo de mineração não é mais particularmente rápido.
Demora algum tempo para o algoritmo gerar blocos com hashes que começam com três zeros (conforme configurado pela dificuldade).
Então esse foi o fim da nossa configuração básica de blockchain.
Podemos regular a rapidez com que novos blocos são adicionados ao nosso blockchain graças ao mecanismo de prova de trabalho.
É o recurso de segurança mais significativo em blockchains. E agora que você entende como funciona, comece a criar o seu!
Deixe um comentário