O processo.
Durante a última semana, mergulhei de cabeça em tecnologias de blockchain e passei algum tempo aprendendo mais sobre contratos inteligentes e d-apps, replicando projetos previamente realizados para me ajudar a construir meu conjunto de habilidades.
Mas agora, é hora de passar ao próximo nível:
Elaborar uma ideia de projeto e trabalhar nela.
E foi o que eu fiz e devo dizer que estou muito feliz com o resultado.
De qualquer forma, neste artigo, vou compartilhar a ideia e levá-los através do processo que segui para realmente construí-la.
O problema
Assinar contratos da maneira tradicional requer confiança
Então, quando assinamos um contrato da maneira tradicional, como sabemos que a outra parte não vai alterar os termos do contrato? E como podemos garantir que a outra parte não vai alegar que não assinou? Será que queremos assumir esse risco?
A resposta é bem clara: NÃO
O uso de chaves privadas levanta preocupações com relação à segurança
Mas é claro que já existem algumas soluções da blockchain que tentam resolver este problema de segurança, por exemplo, usando "assinaturas digitais".
As assinaturas digitais são essencialmente uma forma de assinar mensagens na Blockchain usando chaves privadas e o sistema tem algumas propriedades muito legais, tais como poder usar a chave pública de um remetente para verificar sua assinatura.
Mas o problema aqui é que usar sua chave privada é arriscado em termos de segurança. Será que queremos correr esse risco? Existe uma maneira mais simples de fazer isso?
Foi isso que tentei resolver no meu projeto.
A Ideia
Então, qual é a sua ideia, fale!
Está bem, eu vou chegar lá.
Essencialmente, meu projeto permite que você "assine" contratos sem usar nenhuma chave privada. Para uma noção melhor, aqui está como funciona:
- Um usuário vai para o aplicativo e "inicializa" um contrato - escreve o conteúdo do contrato e o endereço do destinatário.
- O usuário assina e envia o contrato para a blockchain.
- O destinatário vai na plataforma e vê o contrato que é destinado a ele, ele tem a opção de assinar (usando sua chave pública) ou ignorar.
Espere, eu acabei de dizer para assinar usando uma chave pública?
Sim.
Portanto, essencialmente, o objetivo é verificar se a pessoa assinou - concordou com os termos do contrato.
Minha solução usa uma maneira mais simples de fazê-lo, sem uma chave privada.
E é quando uma pessoa inicia um contrato, seu endereço público (conta atual) é automaticamente adicionado ao contrato...
e a única maneira de acrescentar seu endereço é se eles estiverem conectados com seu endereço, o que significa que ele confirma que a pessoa assinou.
E então, uma pessoa só pode ver os contratos que foram enviados para seu endereço.
É um conceito bastante simples, mas pode ser usado para resolver alguns problemas com assinatura digital.
Aplicações
A ideia pode ser implementada em praticamente qualquer lugar onde um contrato precise ser assinado - emprego, locação, negócios, …
Limitações
O contrato inteligente não suporta contratos de múltiplas linhas (multi-line): Se você inserir um contrato com múltiplas linhas, o contrato inteligente o transformará apenas em uma única linha, o que é definitivamente uma dor na formatação. Há algumas maneiras de resolver este problema, e estou trabalhando para implementá-lo.
O contrato inteligente não suporta mais de um contrato por usuário: Se um usuário inicia múltiplos contratos ou precisa assinar múltiplos contratos, apenas o mais recente será considerado pelo contrato inteligente. Isto porque o contrato inteligente verifica os contratos por endereço do usuário; no entanto, cada contrato tem sua própria identificação, portanto eu devo ser capaz de encontrar um contrato usando uma identificação. Estarei trabalhando para implementar essa mudança.
A interface é feia: Não é exatamente uma limitação, no entanto, a interface atual é principalmente html básica e não é muito agradável ao olho humano. O design dela é definitivamente algo que eu gostaria de encarar durante as próximas semanas.
Agora, sobre o processo para realmente construir o projeto...
Ferramentas:
Metamask:
Seja para escrever e implantar o contrato inteligente ou para testar o frontend, você precisará de uma carteira em seu navegador. Para este projeto, irei usar a Metamask.
Remix:
Como iniciante, prefiro trabalhar com IDEs online apenas para não ter que instalar nada localmente em meu computador. Vou usar o IDE Remix para escrever e implantar o contrato inteligente.
Replit:
Replit é também um IDE online. Tem uma característica beta para solidity, mas eu só a utilizo para o frontend do aplicativo.
Solidity:
Eu usei Solidity para escrever o contrato inteligente em Remix.
JS/HTML/CSS:
Para o frontend, usarei JavaScript, HTML e CSS. Também usarei algum bootstrap por estilo.
Web3.js:
web3.js é uma coleção de bibliotecas que lhe permite interagir com um nó Ethereum local ou remoto usando HTTP, IPC ou WebSocket.
Vou usar o web3.js para interagir com o contrato inteligente.
Backend:
Passo #1: Configurando seu workspace
Configure seu workspace remix com um arquivo solidity.
Não se preocupe com a pasta de artefatos. Ela é autocriada na compilação e implementação do contrato.
Passo#2: Defina sua licença
Defina a licença de seu contrato usando a declaração do SPDX. Para este projeto, eu usei a licença do MIT.
Passo #3: Declare sua versão do solidity
Lembra-se que precisamos declarar a versão do solidity que estaremos usando para cada contrato inteligente? Aqui mesmo, eu posso usar a versão até 0.9.0.
Passo #4: Certifique-se de que seu compilador está corretamente configurado
Eu recomendaria que você habilitasse a "opção de compilação automática" para depuração em tempo real. Certifique-se também de que sua versão do compilador corresponda à sua versão do Solidity e isso é compilar o contrato correto.
Passo #5: Defina um contrato
Em seguida, defina um contrato usando a declaração "contrato". Sinta-se à vontade para nomeá-lo como você quiser 😁
Não questione minhas habilidades de nomenclatura, é um pouco complicado demais.
Passo #6: Defina a estrutura para um contrato
Agora chegamos à parte divertida: começamos por definir a estrutura de dados para um candidato. Em meu projeto, decidi que cada contrato tem uma identificação (inteiro), um conteúdo (string), e o endereço do iniciador (inteiro).
Passo #7: Introduza a declaração do construtor
Neste contrato inteligente, não há nenhuma ação interessante acontecendo no desdobramento, então eu apenas defini o proprietário do contrato como sendo quem quer que o implante.
Passo #8: Visibilidade do endereço do proprietário, mapeamento de signatários e contratos, evento e modificador
Antes de entrarmos na função propriamente dita, eu apenas preparei rapidamente algumas declarações de mapeamento e um evento e um modificador para configurar meu contrato.
Passo #9: Definir função para iniciar um contrato
Portanto, agora, posso definir uma função para iniciar um contrato. Como um input, seria preciso incluir o texto do contrato e o endereço do destinatário. O endereço dos iniciadores é automaticamente assumido como o da pessoa que inicia a transação.
Passo #10: Definir a função para visualizar um contrato
Então, quando um iniciador inicia um contrato, o destinatário quer poder ver o texto do contrato antes de assiná-lo (#bonshábitos)... Então, criei uma função que retorna o contrato de texto:
Passo #11: Definir a função para assinar um contrato
Certo, agora o destinatário vê e lê o contrato e concorda com o termo - eles querem assinar o contrato.
Passo #12: Definir função para verificar um iniciador
Esta é uma função para verificar se um endereço iniciou um contrato. Embora eu não vá usá-la na versão inicial do projeto, eu a adicionei para futuros lançamentos.
Passo #13: Definir função para verificar um destinatário:
Eu também escrevi uma função para verificar se a segunda pessoa (destinatário) assinou o contrato. Não vou usá-la na primeira linha, mas vou mantê-la de qualquer maneira.
Passo #14: Implantá-lo na VM Java Script
Regra de ouro no remix: sempre comece implantando na VM do JS, apenas para facilitar a vida.
Passo #15: Implantar o Aplicativo
Se você testou o aplicativo na VM do Java Script e tudo estava bem, vá em frente e implante-o em uma rede de teste - eu pessoalmente usei a Rede de Teste Ropsten para este projeto - para que você possa usá-la no frontend.
Frontend:
Passo #1: Configurar um novo Repl
Vá até sua conta Replit e crie uma nova repl. Selecione HTML/CSS/JS para a linguagem, pois é isso que eu vou usar.
Se você tiver um modelo que deseja usar, ou um código inicial para começar, você pode clonar o repositório GitHub diretamente no repl.
Passo #2: Crie todos os arquivos de que você precisaria
Eu sempre gosto de começar criando todos os arquivos e a estrutura que eu sei que precisarei para meu projeto. Me poupa muita frustração depois. Aqui estão os arquivos de que precisamos:
Eu copiei o contrato ali mesmo para poder consultá-lo, mas não é necessário.
Passo #3: Importe a ABI
Vamos começar importando a ABI do contrato inteligente do Remix para o nosso arquivo contract.js.
Passo #4: Importar o endereço do contrato
Em seguida, estamos recebendo nosso endereço do contrato da Remix em nosso arquivo contract.js.
Agora, nosso arquivo contract.js está pronto para ser lançado.
Passo #5: Configure o arquivo index.js
Depois disso, criaremos nosso arquivo index.js para poder executar nosso aplicativo.
Para executar o aplicativo, execute o seguinte comando na shell e pressione run:
node index.js
Você também pode executá-lo em uma nova aba com o link no canto superior direito:
Passo #6: Importe tudo que é necessário
Você precisa importar algumas coisas para seu arquivo html:
- Script Web3.js
- Arquivo contract.js
- Bootstrap (opcional para o estilo)
Passo #7: Crie um formulário para iniciar o contrato
Para permitir que os usuários iniciem um contrato, seria necessário usar um formulário com um campo para o contrato e um campo para o endereço do destinatário, assim como um botão "enviar".
Passo #8: Crie formulário para assinatura de contrato
O próximo passo é um formulário para visualizar e assinar um contrato. Para isso, precisamos de um botão para visualizar o contrato, então devemos ter um texto devolvido do contrato inteligente, se houver um contrato para o destinatário e um botão para assiná-lo.
Então a maneira como vamos fazer isso é criando um botão comum em que um usuário clicaria para ver o contrato, então adicionaremos um elemento de parágrafo vazio com um id - que seria onde colocaríamos o conteúdo do contrato e finalmente precisamos de um botão que só mostra uma vez que o contrato é retornado, para que possamos fazer isso usando o atributo oculto e manipulá-lo mais tarde no script.
Passo #9: Conecte a função Metamask
Podemos usar algumas funções web3.js sob a função document.ready para poder conectar o endereço Metamask de um usuário ao aplicativo.
Passo #9: Crie uma função para obter a conta atual
Vou precisar da conta atual para que algumas das funções funcionem, então criei uma função definida localmente para obter a conta atual.
Com novas atualizações, pode haver uma função integrada para fazer isso, mas eu fui com uma função definida localmente.
Passo #9: Crie uma função para Iniciar um contrato
Agora podemos criar uma função js para iniciar um contrato. Precisamos usar algumas declarações getElementById para obter inputs do formulário, assim como uma declaração window.myContract.methods para enviar inputs para a Blockchain.
Passo #9: Crie uma função para pré-visualizar um contrato
Em seguida, precisamos de uma função para poder pré-visualizar um contrato para um destinatário. Novamente, precisaríamos usar uma window.myContract.methods para chamar o texto do contrato, bem como uma declaração getElementById para mostrar o botão que escondemos anteriormente.
Passo #10: Crie uma Função para Assinar um Contrato
Último passo do código aqui, quase lá!
Só precisamos criar uma função que assine o contrato quando se clica no botão e as taxas de gas são confirmadas com uma simples declaração janela.myContract.methods.
Passo #11: Teste o seu D-App
Neste ponto, o aplicativo deve estar pronto e funcionando. Você pode testá-lo com contas secundárias em seu computador e, também, pode compartilhar o link de repl com amigos e familiares para testar!
O que vem a seguir?
Então, agora que trabalhei em alguns projetos de blockchain e trabalhei em uma ideia que tive, quais são os meus próximos passos?
Tenho outra ideia de projeto em mente, e gostaria de continuar melhorando este projeto, assim, isto está definitivamente na minha lista de tarefas.
Entretanto, farei uma pausa na blockchain para cuidar de alguns outros projetos, mas estarei de volta, prometo!
Se você chegou até aqui, obrigado por ler! Se você gostou, sinta-se à vontade para acompanhar minha jornada no Twitter @linamaach, no LinkedIn e inscreva-se na minha newsletter pessoal para receber mensalmente atualizações sobre o que um adolescente ambicioso está fazendo!
Este artigo foi escrito por Lina Nada Maach e traduzido por Fátima Lima. Seu original pode ser lido aqui.
Top comments (0)