Recentemente, entrei no mundo das criptomoedas. Sim, eu sei que estou atrasado, mas quando algumas das pessoas mais estúpidas que você conhece continuam pressionando você a comprar suas shitcoins nos últimos 2 anos, para participar de seus golpes de marketing multinível, é um pouco difícil levar a coisa toda a sério.
Ouvir amigos idiotas do mundo cripto se gabando de como eles poderão pagar por uma Lamborghini quando o Bitcoin atingir U$200.000 foi o suficiente para me fazer querer cortar minhas orelhas. A estupidez da cena, bem como a ostentação ofensiva das pessoas dentro dela, foi o suficiente para me fazer ficar afastado por algum tempo.
Muito da cena cripto é uma fraude e um esquema ponzi, como evidenciado pela falência (com proporções semelhantes às da falência da Enron) nesta semana da segunda maior exchange de criptomoedas, a FTX. Dirigida pelo “meu vizinho bilionário” Sam Bankman-Fried (Sam Bankrun-Fraud), a exchange basicamente pegava o dinheiro das pessoas e desperdiçava tudo em apostas imprudentes que davam errado. Isso estará em livros e lições de escolas de negócios por anos, dada a escala da fraude envolvida e a quantidade de dinheiro vaporizada. O patrimônio líquido pessoal de Bankrun-Fraud caiu de cerca de U$16 bilhões para algumas centenas de milhões em um único dia. Mas, aparentemente, as pessoas confiavam nele porque ele dirigia um Corolla, usava shorts e tinha um grande e amigável penteado.
Recentemente, com o mercado em baixa das criptomoedas afastando os fraudadores, os espertinhos e os charlatães, decidi dar uma olhada mais de perto nessa indústria que tenho evitado intencionalmente, bem como na tecnologia por trás dela. Com todos os vendedores de óleo de cobra e criptocultistas do ano passado ficando quietos recentemente, era hora de abordar isso de uma posição menos defensiva e cética do que antes.
Comecei a aprender Solidity, que é essencialmente uma linguagem de programação para a blockchain Ethereum. Essa linguagem permite que você programe aplicativos que interagem diretamente com a blockchain, assim como o Ruby permite que você crie aplicativos que permitem interagir com bancos de dados SQL. Solidity é uma linguagem de programação nativa do ecossistema Ethereum que permite que aplicativos sejam construídos na blockchain e permite a ideia de “dinheiro programável”.
Tive a ideia do programa vasculhando a Internet em busca de aplicativos de exemplo que outras pessoas construíram e vi isso como uma ideia. Todo o código é meu, pois não li de mais ninguém; minha intenção era aprender mais sobre o Solidity construindo algo, então não teria me ajudado muito se eu apenas copiasse o código de outras pessoas.
A ideia do aplicativo é simples: gostaria de passar meus ativos digitais para um beneficiário em caso de minha morte e quero que isso seja automatizado. Neste caso, tenho alguns Ethereum e gostaria de doar esses ativos a um beneficiário de minha escolha em caso de falecimento.
Algumas questões a serem tratadas antes que isso seja construído:
- Como a blockchain sabe que estou morto?
- Se o beneficiário pode reivindicar os fundos, o que o impede de reivindicar os fundos a qualquer momento? Como escreveríamos um código que o impedisse de ser malicioso?
- O que impede que outros atores mal-intencionados roubem esses ativos? Afinal, eles estão armazenados na internet. Como eles seriam protegidos?
O código para tudo isso pode ser encontrado no meu Github aqui. Em resumo, existem 3 partes para o processo:
- Um contrato inteligente
- Um frontend para interagir com o contrato inteligente por meio de um navegador
- Um ouvinte de evento
Vamos começar com o contrato inteligente.
Contratos inteligentes são apenas pedaços de código escritos em Solidity e armazenados e executados na blockchain Ethereum. Eles permitem que o dinheiro seja transferido de forma automatizada de acordo com regras e lógica incorporadas no software. Na indústria tradicional de planejamento patrimonial, você normalmente teria fundos colocados em uma conta de garantia que pode ser distribuída para seus beneficiários no caso de sua morte. Os beneficiários teriam que entrar em contato com a equipe da empresa de planejamento patrimonial e fornecer prova de morte para iniciar o processo de transferência de bens.
O que me entusiasma no desenvolvimento da blockchain é como o conceito de dinheiro programável permite um tipo de aplicativo completamente novo, bem como o potencial de introduzir eficiências radicais em vários setores. Estou longe de ser um evangelista da blockchain neste momento e ainda tenho minhas dúvidas, mas vejo potencial nessas coisas, apesar de todos os vigaristas viscosos que deram má fama à indústria. Os contratos inteligentes costumam ser comparados a máquinas de venda automática; eles eliminam os intermediários e permitem que os clientes comprem diretamente um item sem ter que passar por outro humano que provavelmente ficará com uma parte da transação.
Vamos começar com a primeira pergunta que fiz acima; como a blockchain sabe que estou morto?
Bem, ela não sabe. A blockchain é um sistema determinístico que realmente não tem conhecimento do mundo exterior, muito menos das pulsações do coração de um ser humano vivo. Mas é aqui que entra a magia do Solidity e como os eventos podem nos ajudar a determinar se alguém está vivo ou morto com um alto grau de certeza.
O código do contrato inteligente é tão simples que pode caber em uma única captura de tela (veja abaixo).
Se você não é um programador, não se preocupe, vou explicar isso em termos leigos.
Em primeiro lugar, uma função construtora na linha 18 é chamada quando o contrato é implantado na blockchain. O contrato é iniciado com dois endereços; o endereço do proprietário do patrimônio e o endereço do beneficiário. Estes são endereços digitais online onde os usuários mantêm seus fundos, e armazená-los diretamente no contrato garante que nenhum outro ator (hackers) possa interagir com este contrato.
A função addFunds() permite que o proprietário do patrimônio adicione fundos ao contrato inteligente. Dessa forma, o contrato inteligente atua como uma conta de garantia inteligente que não requer intervenção humana.
A função ClaimInheritance() é onde as coisas ficam interessantes. Você notará que há uma referência payable na declaração da função, que significa essencialmente “esta função pode movimentar dinheiro entre contas”. Esta é a função que o beneficiário terá que chamar quando o proprietário do patrimônio falecer e quiser iniciar a transferência de fundos.
Você verá uma declaração condicional simples que diz que “se passou tempo suficiente desde a última vez que verificamos o pulso do proprietário do patrimônio e se o proprietário do patrimônio não estiver vivo, pague os fundos ao beneficiário”
Um ponto importante aqui; estamos trabalhando com o passar do tempo para determinar se o dono do patrimônio está morto. É aqui que entra o conceito de eventos blockchain / Solidity, e sem eles não seria possível construir este aplicativo.
Os eventos são uma maneira da blockchain se comunicar com o mundo exterior que algo aconteceu. Portanto, em nosso caso, queremos comunicar que o proprietário pode estar morto; novamente, a blockchain nunca pode saber com certeza se alguém está morto. Ela só pode assumir com alto grau de certeza devido à falta de interação ou resposta do usuário durante um longo período de tempo. Fazemos isso permitindo que o beneficiário chame a função ClaimInheritance(), que aciona um evento CheckPulse. Falaremos mais sobre isso mais adiante, onde poderemos ver que o dono do patrimônio pode ser notificado sobre esse evento e então executar uma ação (enviar um evento HeartBeat) que comunica à blockchain que ele está muito vivo .
Se o dono do patrimônio não enviou um batimento cardíaco após um certo período, podemos assumir que ele está de fato morto. Coloquei 30 segundos no desenvolvimento para poder testar as coisas mais rapidamente, mas, em geral, você pode usar um limite mais sensato, como 30 a 45 dias.
O código frontend para isso tudo é mínimo e inclui apenas alguns botões e um formulário para chamar as funções que descrevi acima. Eu usei a biblioteca ethers.js em Javascript para fazer as chamadas de funções da blockchain no navegador. Não vou entrar em muitos detalhes aqui porque não é o mais importante, mas esse é o código e a tela do frontend está abaixo, que pode ser chamada pelo navegador. Você precisaria de algum tipo de carteira criptográfica em seu navegador para que isso funcionasse. Eu usei a Metamask e também estou usando ether falso em uma rede de teste para esse processo. Metamask é essencialmente uma extensão de navegador que informa quanto dinheiro criptográfico você possui e buscará essas informações de seu endereço público na blockchain. Depois de conectar uma conta da Metamask, você pode começar a interagir com a interface do usuário de planejamento patrimonial para começar a fazer chamadas do contrato inteligente. Esses cliques de botão irão chamar essas funções em nosso contrato inteligente, como a função ClaimInheritance().
A próxima parte interessante é o ouvinte de eventos. Precisamos de algum tipo de aplicativo que possa ouvir eventos emitidos da blockchain e, em seguida, executar ações de acordo. No nosso caso, queremos ouvir as verificações de pulso (quando o beneficiário tenta reivindicar a herança, ele envia uma verificação de pulso para confirmar se o proprietário está vivo ou morto).
Para isso, precisamos configurar um nó que abra um soquete da web para a blockchain. Um soquete da web nos permitirá manter uma conexão contínua e aberta para ouvir os eventos e, como resultado, permitir que quaisquer eventos emitidos pela blockchain cheguem ao nosso código assim que acontecerem.
Em seguida, configuramos um ouvinte na linha 34 usando a biblioteca web3.js e usando o callback onData(), podemos verificar se há algum evento CheckPulse emitido (linha 45).
Isso é útil porque agora podemos dizer “Quando um evento de verificação de pulso for emitido do contrato inteligente / blockchain, envie um e-mail ao proprietário do patrimônio para verificar se ele está vivo e solicite que ele envie um batimento cardíaco”. Você pode me ver fazendo isso na linha 47, usando o pacote nodemailer.
O proprietário do patrimônio receberá um e-mail/notificação lembrando-o de enviar uma pulsação (chamando a função heatBeat() em nosso código Solidity), que então define o checkPulseTime de volta para 0 e o booleano estateOwnerAlive como verdadeiro.
Isso significa que, quando o beneficiário for reivindicar sua herança, não será permitido e a chamada payable que transfere o saldo do contrato não será executada
Vimos aqui como é fácil automatizar essas coisas e como a blockchain pode ser usada para transferir ativos digitais de forma programática de diferentes carteiras criptográficas online em caso de falecimento dos proprietários.
Este é um contrato muito simples e tenho certeza de que há muitos bugs de segurança nele que não considerei (ainda sou principiante). Eu só queria escrever um produto com mínima viabilidade bem simples para mostrar como um desenvolvedor de blockchain faria para construir algo assim e os tipos de escolhas tecnológicas envolvidas.
Feliz hackeamento!
Artigo original publicado por Adrian Booth. Traduzido por Paulinho Giovannini.
Latest comments (0)