Um dos principais objetivos que os projetos baseados em blockchain pretendem alcançar é a verificação de dados. Para exemplos reais, você pode consultar a identidade digital e o armazenamento e verificações de documentos on-line. Na verdade, qualquer um destes casos exige a verificação do iniciador da ação/transação para confirmar a pessoa ou entidade. Por exemplo, se a pessoa possui documento de identidade digital, torna-se fundamental garantir a titularidade. Portanto, é um excelente exemplo de problema de verificabilidade de dados. Vamos revisar a forma mais simples da solução — uma assinatura digital, cujo teste é um dos pontos cruciais durante o desenvolvimento do contrato inteligente.
A abordagem é simples:
1) o sistema gera uma mensagem de acordo com regras conhecidas por todos
2) o signatário recebe a mensagem e adiciona um conjunto específico de símbolos – assinatura digital, código construído a partir da mensagem por uma chave privada
3) a assinatura gerada agora é enviada para o contrato, onde é decomposta para recuperar o endereço do signatário.
Solidity oferece o algoritmo ECDSA para geração de assinatura e posterior decomposição. Não precisamos nos aprofundar no algoritmo em si (você pode encontrar as informações necessárias nas fontes apropriadas). Tudo o que precisamos saber é que ECDSA é um exemplo de criptografia assimétrica, onde o primeiro usuário cria uma assinatura com sua chave privada, e o segundo usuário aplica um algoritmo padrão para recuperar a chave pública do signatário. Assim, pode verificar a origem da assinatura. Em vez disso, vamos nos concentrar na parte prática – uso e teste de assinaturas.
Em primeiro lugar, precisamos reconhecer um problema. Por exemplo, o contrato precisa realizar alguma ação, digamos, armazenar o endereço do chamador. Embora o contrato deva realizar o armazenamento apenas se o chamador for verificado, precisamos ter certeza de que ninguém poderá usar seu endereço sem permissão. Para recuperar o chamador autêntico, precisamos gerar alguma mensagem, assiná-la e decompô-la no contrato.
Você pode encontrar o solução padrão na documentação do Solidity (por exemplo, no 0.8.4 — a versão estável mais recente no momento do artigo). Os documentos nos oferecem o contrato, que precisava das seguintes funcionalidades integradas: geração de mensagens, divisão de assinatura e código assembly para recuperar o signatário. O exemplo mostra todos os métodos necessários e é bastante direto, embora tenha dois contras: falta universalidade e não há um bom exemplo de teste de solução. É por isso que forneço minha versão do código e (o objetivo real) – a estratégia de teste do contrato.
Claro, você pode usar a biblioteca padrão do OpenZeppelin para as operações da ECDSA, mas enfrentarão novamente os mesmos problemas — falta de flexibilidade e de abordagens de teste. Então, vamos mergulhar no meu exemplo de lógica baseada em assinatura. Você pode encontrar o completo exemplo de trabalho no meu GitHub, mas há poucos lugares que desejo mostrar por completo.
Em primeiro lugar, prepararemos a mensagem. Como você pode ver, ele é formado por dois endereços de carteira compactados e com hash:
A segunda parte importante do código é fazer o hash da mensagem junto com a mensagem Ethereum padrão:
Mostra que a mensagem foi enviada dentro da rede Ethereum e tem comprimento de 32 bytes, o que não é um número aleatório. Após as operações anteriores, temos o hash, que possui 32 bytes de comprimento. É essencial ter a função hash adicional nesse formato e discutiremos o raciocínio um pouco mais tarde.
Outras partes do código são bastante padronizadas. A função para dividir a assinatura é a seguinte:
e aqui está a função para recuperar o signatário:
Para a interface externa usaremos a função customizada, que recebe a assinatura e os argumentos necessários, verifica se o usuário já está cadastrado, forma a mensagem e verifica a assinatura:
Primeiro, imitaremos a mensagem que precisa ser assinada. Nós vamos usar ethers.js biblioteca, que é (juntamente com web3) a biblioteca mais usada e conveniente. Por ser uma biblioteca de código aberto, você está livre para explorar seu código e documentos. Além disso, esta biblioteca nos fornece a interface perfeita para construir a seguinte mensagem:
Um dos contras de ambos web3 e Éteres bibliotecas é que elas não possuem todas as funções para o ambiente Ganache local, uma vez que ambas as bibliotecas são destinadas a funcionar com nós Ethererum completos. No entanto, existe uma abordagem para testes locais usando funcionalidade da conta web3. Embora você precise criar uma conta adicional, que implementará a funcionalidade do cantor e fornecerá uma conexão com o provedor web3 atual:
Então, agora temos a mensagem gerada e assinada. Mas isso não é tudo; ainda restam algumas coisas para falar. Ambas as bibliotecas (web3 e ethers) fornecem hash adicional da mensagem antes da criação da assinatura. Além disso, a mensagem não é apenas hash, mas é combinada com a mensagem Ethereum padrão que vimos anteriormente:
E é por isso que adicionamos o método adicional ao contrato. Portanto, se quiser usar mensagens personalizadas, pular hash adicional, etc., você precisará criar uma versão personalizada da funcionalidade de assinatura. Discutimos o motivo acima — ambas as bibliotecas padrão implementam a abordagem típica para assinar a mensagem, que só pode ser alterada substituindo a funcionalidade.
Como última etapa, vamos executar o teste e verificar se funciona corretamente:
Testamos a geração de assinatura, a mensagem gerada, a aprovação e rejeição da assinatura. Portanto, é um conjunto bastante completo de testes para a funcionalidade de verificação.
- Conta
- Açao Social
- Adicional
- algoritmo
- Todos os Produtos
- argumentos
- artigo
- Autêntico
- Pouco
- casos
- Cheques
- código
- contract
- criptografia
- Atual
- dados,
- Desenvolvimento
- digital
- identidade digital
- INSTITUCIONAIS
- Meio Ambiente
- ethereum
- rede ethereum
- Rosto
- Primeiro nome
- Flexibilidade
- Foco
- formulário
- Gratuito
- cheio
- função
- Bom estado, com sinais de uso
- hash
- Hashing
- HTTPS
- ia
- Identidade
- INFORMAÇÕES
- IP
- IT
- Chave
- mais recente
- Biblioteca
- local
- média
- rede
- nós
- oferecer
- Oferece
- online
- aberto
- open source
- Operações
- privado
- chave privada
- projetos
- público
- chave pública
- rever
- Execute
- conjunto
- simples
- So
- solidez
- divisão
- armazenamento
- loja
- Estratégia
- .
- teste
- ensaio
- testes
- A fonte
- us
- Verificação
- Wallet
- Wikipedia
- dentro
- Atividades:
- trabalho