WEB3DEV

Cover image for Eu Construí uma Ferramenta para assinar Contratos em Contratos Inteligentes Sem a Utilização da Chave Privada
Fatima Lima
Fatima Lima

Posted on • Atualizado em

Eu Construí uma Ferramenta para assinar Contratos em Contratos Inteligentes Sem a Utilização da Chave Privada

O processo.

Image description

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".

Image description

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:

  1. Um usuário vai para o aplicativo e "inicializa" um contrato - escreve o conteúdo do contrato e o endereço do destinatário.
  2. O usuário assina e envia o contrato para a blockchain.
  3. 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.

Image description

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.

Image description

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.

Image description

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.

Image description

Passo #5: Defina um contrato

Em seguida, defina um contrato usando a declaração "contrato". Sinta-se à vontade para nomeá-lo como você quiser 😁

Image description

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).

Image description

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.

Image description

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.

Image description

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.

Image description

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:

Image description

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.

Image description

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.

Image description

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.

Image description

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.

Image description

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:

Image description

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.

Image description

Image description

Passo #4: Importar o endereço do contrato

Em seguida, estamos recebendo nosso endereço do contrato da Remix em nosso arquivo contract.js.

Image description

Image description

Agora, nosso arquivo contract.js está pronto para ser lançado.

Passo #5: Configure o arquivo index.js

Image description

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:

Image description

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".

Image description

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.

Image description

Passo #9: Conecte a função Metamask

Image description

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.

Image description

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.

Image description

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.

Image description

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.

Image description

Passo #11: Teste o seu D-App

Image description

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.

Latest comments (0)