WEB3DEV

Cover image for Contratos Inteligentes de Identidade Digital na Web3
Panegali
Panegali

Posted on

Contratos Inteligentes de Identidade Digital na Web3

A identidade digital está entre os casos de uso mais empolgantes que emergem para Contratos Inteligentes na tecnologia de blockchain.

Os sistemas de identidade tradicionais têm muitos pontos problemáticos - podem ser inseguros e isolados, deixando os usuários com pouco controle sobre seus dados. Uma identidade digital autossoberana devolve o controle aos usuários.

Neste artigo, exploraremos como construir um contrato inteligente básico para gerenciar identidades digitais na blockchain. Abordaremos:

  • Os benefícios de um sistema de identidade descentralizada.
  • A arquitetura central de um contrato de identidade na cadeia.
  • Programar as funções-chave para registrar e gerenciar credenciais de identidade.
  • Exemplos de aplicações como processos de "Conheça o seu cliente" (KYC).
  • Desafios e direções futuras para a identidade digital.

Usaremos Solidity e JavaScript para implementar um contrato inteligente simples que permite aos usuários armazenar e controlar o acesso a atributos de identidade como nome, endereço e data de nascimento. Até mesmo iniciantes devem ser capazes de acompanhar.

Por que a Identidade Digital é Importante

Na web de hoje, usamos sistemas de gerenciamento de identidade fragmentados e centralizados. Sua identidade é essencialmente dividida entre diferentes silos - seu perfil no Facebook, login na conta bancária, nome de usuário do Twitter etc.

Esses sistemas de identidade legados têm muitas desvantagens:

  • Falhas de segurança - Bancos de dados centralizados são iscas para hackers. A Equifax e outras violações de alto perfil expuseram milhões de identidades.
  • Sem controle do usuário - Você tem pouco controle sobre seus dados em sistemas centralizados. As plataformas detêm sua identidade.
  • Portabilidade limitada - As identidades estão presas em silos proprietários. Isso torna muito difícil levar sua identidade para outras plataformas.

Soluções de identidade descentralizada baseadas em blockchain abordam esses problemas. Elas permitem que os usuários possuam e controlem totalmente suas identidades digitais. Alguns princípios-chave da identidade auto-soberana incluem:

  • Persistente - A identidade persiste mesmo que uma empresa específica, provedor ou rede desapareça. Não depende de autoridades externas.
  • Portátil - Os usuários devem poder levar sua identidade consigo e transmiti-la com segurança em diferentes contextos.
  • Preservação da privacidade - A divulgação seletiva permite que os usuários compartilhem apenas determinadas credenciais quando necessário.
  • Baseado em consentimento - O compartilhamento de detalhes de identidade requer o consentimento explícito do usuário.
  • Controlado pelo usuário - Os usuários devem ter controle total sobre suas identidades digitais.
  • Fácil de usar - Os sistemas devem ter experiências de usuário intuitivas.

Podemos nos alinhar mais de perto com esses princípios com uma identidade enraizada na blockchain em vez de bancos de dados centralizados. Os usuários terão controle soberano sobre seus dados pessoais e biometria. As organizações podem verificar instantaneamente e com segurança credenciais como diplomas universitários, endereços e certidões de nascimento.

A seguir, exploraremos como modelar a identidade digital na blockchain em um nível mais alto.

Arquitetura de Contrato Inteligente de Identidade Digital

Antes de mergulharmos no código, vamos delinear os principais componentes de um contrato inteligente básico de gerenciamento de identidade.

Em um nível superior, nosso contrato precisa:

  • Permitir que os usuários registrem uma nova identidade baseada em blockchain.
  • Permitir que os usuários adicionem várias reivindicações de credenciais à sua identidade.
  • Suportar a revogação de credenciais que não são mais válidas.
  • Controlar o acesso à leitura das credenciais de identidade.

Para simplificar, armazenaremos os dados reais de credenciais fora da cadeia. A blockchain armazenará hashes representando cada credencial que um usuário atestou.

Aqui está um diagrama para visualizar a arquitetura:

O contrato armazenará mapeamentos entre o endereço de um usuário e os hashes de suas credenciais.

O usuário envia os dados da credencial para um oráculo de verificação fora da cadeia para adicionar uma nova credencial. Isso poderia ser uma universidade credenciada, agência governamental ou autoridade certificadora que verifica a credencial.

O oráculo retorna um hash de credencial, que o usuário pode então enviar ao contrato para anexar à sua identidade.

Mais tarde, as organizações podem consultar o contrato em busca de um hash de credencial específico de um usuário. O usuário pode fornecer os dados reais da credencial em texto simples, permitindo que a organização verifique se o hash corresponde.

Armazenar os hashes de credenciais em vez de dados em texto simples na cadeia ajuda a preservar a privacidade. O contrato também implementará controles de acesso em torno da leitura das credenciais.

Agora que entendemos os principais componentes em um nível elevado, vamos começar a codificar nosso contrato!

Para seguir este tutorial, você deve ter o seguinte:

Faça um fork do repositório aqui e vamos começar.

Instalando as Dependências

Usaremos Solidity para implementar o contrato inteligente em si e JavaScript para escrever testes simples que interagem com ele.

Primeiro, certifique-se de ter a versão mais recente do Node.js instalada. Usaremos o ambiente de desenvolvimento Hardhat para compilar nosso Solidity e executar testes.

Crie um novo diretório para o projeto:

mkdir digital-identity
cd digital-identity
Enter fullscreen mode Exit fullscreen mode

Então, instale o Hardhat e o Ethers.js:

npm install --save-dev hardhat
npm install --save-dev @nomiclabs/hardhat-ethers ethers
Enter fullscreen mode Exit fullscreen mode

O Ethers.js será útil para escrever nossos testes que chamam as funções do contrato.

Agora, estamos prontos para começar a codificação!

Implementando o Contrato Inteligente

Dentro do diretório digital-identity, crie um novo arquivo chamado Identity.sol - este conterá o código do nosso contrato inteligente em Solidity.

Vamos começar com algum boilerplate (modelo pronto) básico:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Identity {
}
Enter fullscreen mode Exit fullscreen mode

Isso declara a versão do Solidity e cria o shell do contrato Identity.

Agora, vamos definir uma estrutura para representar cada credencial de identidade. Vamos armazenar o hash e um booleano indicando se a credencial foi revogada:

struct Credential {
    bytes32 hash;
    bool revoked;
}
Enter fullscreen mode Exit fullscreen mode

Em seguida, definiremos um mapeamento em que a chave é o endereço do usuário e o valor é um mapeamento de tipos de credenciais para structs de Credential:

mapping (address => mapping (bytes32 => Credential)) public credentials;
Enter fullscreen mode Exit fullscreen mode

Isso nos permite acompanhar todas as credenciais para um usuário específico, fazendo referência a elas por um hash bytes32 único.

A palavra-chave "public" gera automaticamente um getter para que possamos acessar os dados no mapeamento.

Vamos adicionar uma função para permitir que um usuário adicione uma nova credencial:

function addCredential(bytes32 credHash) external {
  credentials[msg.sender][credHash] = Credential(credHash, false);
}
Enter fullscreen mode Exit fullscreen mode

Os usuários chamarão esta função e passarão o hash da credencial que desejam adicionar. Nós a adicionamos ao seu endereço no mapeamento de credenciais.

A seguir, vamos implementar a revogação de credenciais. Vamos alterar o sinalizador revoked para true no mapeamento:

function revokeCredential(bytes32 credHash) external {
  Credential storage credential = credentials[msg.sender][credHash];
  credential.revoked = true;
}
Enter fullscreen mode Exit fullscreen mode

Ler credenciais exigirá passar o endereço do usuário e o hash da credencial específica para recuperá-la. Podemos implementar uma função simples getCredential:

function getCredential(address user, bytes32 credHash) 
  external
  view
  returns (Credential memory) 
{
  return credentials[user][credHash];
}
Enter fullscreen mode Exit fullscreen mode

Isso retorna a struct Credential para o usuário e hash especificados. É marcado como "view", portanto, ele apenas lê o estado, mas não o modifica.

Isso cobre a funcionalidade básica! Os usuários podem adicionar credenciais mapeadas para seu endereço, revogá-las se necessário e ler credenciais específicas acessando o mapeamento.

Agora, vamos escrever alguns testes simples para interagir com essas funções.

Testando o Contrato

O Hardhat torna muito simples testar nosso contrato localmente.

Primeiro, inicialize o projeto Hardhat:

npx hardhat init
Enter fullscreen mode Exit fullscreen mode

Isso cria um contrato Greeter.sol de exemplo que podemos ignorar — nosso Identity.sol o substituirá.

No arquivo hardhat.config.js, vamos adicionar nossa configuração de compilação Solidity:

solidity: "0.8.0"
Enter fullscreen mode Exit fullscreen mode

Agora, crie um diretório de teste e adicione um arquivo TestIdentity.js dentro dele.

Vamos importar as utilidades de teste do Hardhat juntamente com ethers e a ABI do nosso contrato:

const { expect } = require("chai");
const { ethers } = require("hardhat");
const Identity = artifacts.require("Identity");
Enter fullscreen mode Exit fullscreen mode

Em nossos testes, vamos implantar uma nova instância do contrato Identity e interagir com suas funções.

Por exemplo, para testar a adição de uma credencial:

it("Deve adicionar uma credencial", async function() {
  const identity = await Identity.deployed();
  const credHash = ethers.utils.formatBytes32String("foo"); 
  await identity.addCredential(credHash);
  const credential = await identity.getCredential(owner.address, credHash);
  expect(credential.hash).to.equal(credHash);
});
Enter fullscreen mode Exit fullscreen mode

Podemos testar a revogação e a recuperação de credenciais de maneira semelhante.

O pacote completo de testes validará que:

  • A adição de credenciais as armazena sob o endereço do remetente.
  • A recuperação de uma credencial retorna o hash correto.
  • As credenciais podem ser revogadas com a inversão de seu status.

Com apenas essas poucas funções principais e testes, implementamos a funcionalidade básica para gerenciar credenciais na blockchain!

Certamente, existem melhorias que poderíamos fazer, como controles de acesso em getCredential.

Mas isso cobre o fluxo de trabalho básico de ponta a ponta. Os usuários podem registrar credenciais verificáveis ​​na blockchain e depois divulgá-las seletivamente a terceiros.

A seguir, explore algumas aplicações de amostra para ver o contrato de identidade em ação...

Casos de Uso de Identidade Digital

Agora que temos uma implementação básica, quais são alguns casos de uso do mundo real para nosso contrato inteligente de identidade digital?

Conheça Seu Cliente (KYC)

Uma das aplicações mais comuns é usar identidades verificadas para regulamentos de Conheça Seu Cliente (KYC) e prevenção à lavagem de dinheiro.

As instituições financeiras devem verificar a identidade dos clientes antes de trabalhar com eles. O processo KYC tradicional frequentemente envolve a inspeção física de documentos de identidade, como passaportes.

Organizações credenciadas podem verificar credenciais de identidade com um contrato de identidade digital, como nome legal, endereço, data de nascimento etc.

As credenciais podem ser atestadas com o consentimento do usuário e armazenadas no mapeamento sob seu endereço. Bancos ou exchanges podem verificar instantaneamente os usuários verificando os hashes de suas credenciais na blockchain.

Isso permite um KYC quase instantâneo, colocando os usuários no controle de compartilhar seus dados pessoais.

Autenticação de Serviços Online

Além do KYC, identidades digitais abrem oportunidades para melhorar a autenticação de serviços online.

Em vez de nossas identidades estarem em silos proprietários, podemos usar a divulgação seletiva para provar nossa identidade a qualquer serviço com segurança e privacidade.

Os serviços podem solicitar hashes de credenciais específicas dos usuários durante o login ou a criação de contas. Eles podem verificar se os hashes correspondem às credenciais de emissores confiáveis ​​sem ver os dados brutos.

Isso ajuda a minimizar a centralização de dados de identidade e dá mais controle aos usuários.

Credenciais Verificáveis

Outra aplicação é a criação de credenciais digitais verificáveis — essencialmente, "provas de X" que são verificadas na blockchain.

Uma universidade poderia emitir diplomas digitais verificáveis. Uma credencial de emprego poderia conferir prova de renda ou status de emprego. Agências de certificação podem criar certificados digitais para habilidades, treinamento e qualificações.

Os emissores criam essas credenciais verificáveis, atestando sua validade fora da cadeia, gerando um hash e ancorando esse hash na identidade de um usuário no mapeamento do contrato inteligente.

Qualquer organização pode verificar instantaneamente se um hash de credencial está associado ao usuário de forma inviolável. Isso cria versões digitais portáteis de credenciais do mundo real.

Indivíduos e organizações podem aproveitar possibilidades quase ilimitadas para credenciais verificáveis.

Desafios e Trabalho Futuro

Embora os contratos inteligentes de identidade abram possibilidades empolgantes, ainda existem desafios a serem superados:

  • Os hashes de credenciais dependem de oráculos fora da cadeia para procedimentos de verificação reais. Alternativas totalmente descentralizadas seriam ideais.
  • A gestão e a recuperação de chaves são obstáculos — os usuários não devem perder o acesso à sua conta na blockchain e a suas chaves.
  • A experiência do usuário ainda precisa de melhorias para adoção geral. Gerenciar chaves e hashes não é muito amigável para o usuário no momento.
  • A interoperabilidade com sistemas de identidade existentes levará tempo.
  • Ataques Sybil, nos quais uma entidade cria múltiplas identidades falsas, devem ser mitigados.
  • A conformidade com regulamentações em constante evolução será fundamental, especialmente para casos de uso financeiros.

Pesquisas em andamento estão desenvolvendo soluções em muitas dessas áreas. Identificadores descentralizados (DIDs) vinculados a contas de blockchain mostram promessa para a simplificação da gestão de identidade.

O mundo da identidade digital autossoberana está apenas começando. À medida que a tecnologia amadurece, sistemas de identidade descentralizados provavelmente desempenharão um papel crescente na forma como mantemos e compartilhamos nossos dados pessoais em diversos contextos.

Conclusão

Este artigo abordou os benefícios da identidade digital baseada em blockchain e como implementar funções básicas de contratos inteligentes, como adição de credenciais e controle de acesso.

Com apenas Solidity e JavaScript, construímos e testamos um contrato de identidade descentralizado simples. Embora o contrato tenha espaço para melhorias, ele demonstra conceitos fundamentais, como divulgação seletiva e controle de dados auto-soberanos.

A identidade é um dos casos de uso mais cativantes para a tecnologia blockchain em ascensão. A identidade autossoberana coloca os usuários no controle de seus dados e identidades.

À medida que o espaço continua a evoluir, os sistemas de identidade descentralizados darão poder às pessoas em todo o mundo com acesso financeiro, direitos de propriedade e vidas digitais seguras.

Se você achou este post interessante, encontre mais posts no Blog Learnhub; escrevemos sobre tudo relacionado a tecnologia, desde computação em nuvem até desenvolvimento frontend, cibersegurança, IA e blockchain.

Fontes


Artigo escrito por Scofield O. Idehen. Traduzido por Marcelo Panegali.

Top comments (0)