Sistema baseado em Ethereum para registro de identidade islâmica com privacidade (SSI-friendly). Nenhum dado pessoal é armazenado on-chain — apenas hashes (keccak256) e ponteiros opcionais (URI) para credenciais cifradas off-chain.
| Dado | On-chain | Off-chain (localStorage / JSON exportável) |
|---|---|---|
| Nome oficial | keccak256(nome) |
Texto completo |
| Nome muçulmano | keccak256(nome) |
Texto completo |
| Mesquita | keccak256(mesquita) |
Texto completo |
| Credenciais (VC) | claimHash + uri opcional |
JSON completo da VC |
O usuário pode exportar seus dados como um JSON de Verifiable Credential (VC) e importá-los de volta a qualquer momento.
contracts/
IslamicPassport.sol ← Contrato principal (Solidity ^0.8.20)
ui/
index.html ← Interface web
app.js ← Lógica JS com ethers.js v6
styles.css ← Estilos
scripts/
deploy_islamic_passport.js ← Script de deploy para Remix
README.md ← Este arquivo
Acesse https://remix.ethereum.org.
Copie os arquivos do projeto para o workspace do Remix ou use o plugin "File Explorer" para importar.
- Abra
contracts/IslamicPassport.sol. - No painel Solidity Compiler:
- Selecione o compilador
0.8.20ou superior. - Habilite optimization (200 runs) se desejar.
- Clique em Compile IslamicPassport.sol.
- Selecione o compilador
- No painel Deploy & Run Transactions:
- Environment:
Remix VM (Cancun)ou similar. - Account: escolha uma conta (será o admin + primeiro sheik se registrar).
- Environment:
- Selecione o contrato
IslamicPassport. - Clique em Deploy.
- Copie o endereço do contrato implantado.
- Environment:
Injected Provider - MetaMask. - Certifique-se de estar na rede Sepolia no MetaMask.
- Tenha SepoliaETH (obtenha em faucets como sepoliafaucet.com).
- Clique em Deploy e confirme no MetaMask.
- Copie o endereço do contrato.
- Abra
scripts/deploy_islamic_passport.jsno Remix. - Execute via o plugin Remix Scripting (botão ▶ no editor).
- Sirva a pasta
ui/com um servidor HTTP simples:- VS Code: use a extensão "Live Server".
- Terminal:
npx serve uioupython -m http.server 8080 --directory ui. - Remix: se estiver usando o plugin de preview, aponte para
ui/index.html.
- Abra
http://localhost:<porta>/index.htmlno navegador.
- Clique em Conectar MetaMask.
- No campo Contrato, cole o endereço do contrato implantado e clique em Definir.
- Com a Conta A no MetaMask, vá à aba Registro.
- Preencha nome oficial, nome muçulmano e mesquita.
- Clique em Registrar Perfil.
- Vá ao Meu Painel — você verá seu DID, userId=1, badge SHEIK, e credenciais INITIAL + SHEIK_CERTIFICATE.
- Troque para a Conta B no MetaMask.
- Registre-se normalmente.
- No painel, verá userId=2 e apenas a credencial INITIAL.
- Com a Conta B, vá à aba Solicitar Atesto.
- Cole o endereço da Conta A (sheik) e gere o pedido JSON.
- Copie ou baixe o JSON (enviaria ao sheik por WhatsApp/email).
- Troque para a Conta A (sheik).
- Vá à aba Atestar / Promover.
- Cole o endereço da Conta B no campo "Endereço do muçulmano".
- Clique em Emitir Atesto.
- A Conta B agora terá uma credencial MUSLIM_ATTESTATION.
- Ainda com a Conta A, no formulário Promover a Sheik, cole o endereço da Conta B.
- Clique em Promover a Sheik.
- A Conta B agora é sheik (visível na aba Sheiks).
- Na aba Sheiks, ambas as contas aparecem na lista.
- No Meu Painel de cada conta, todas as credenciais são listadas com tipo, issuer, data e status.
| Função | Descrição |
|---|---|
registerProfile(...) |
Registra perfil com hashes. Primeiro registro vira sheik. |
attestMuslim(...) |
Sheik atesta muçulmano. |
promoteToSheikh(...) |
Sheik promove outro a sheik. |
revokeCredential(id) |
Issuer ou admin revoga credencial. |
getDID(addr) |
Retorna did:ethr:<chainId>:<address>. |
getProfile(addr) |
Retorna perfil (hashes + uri). |
getCredentialsOf(addr) |
Lista IDs de credenciais do usuário. |
getCredential(id) |
Retorna dados completos de uma credencial. |
listSheikhs() |
Array de endereços com papel SHEIK. |
isSheikh(addr) |
Booleano: é sheik? |
- AccessControl (OpenZeppelin): roles
DEFAULT_ADMIN_ROLEeSHEIK_ROLE. - Dados pessoais nunca em claro on-chain.
- Mensagens de revert descritivas.
- VC JSON gerado localmente no browser antes de enviar hashes.
- Exportação/importação de dados pessoais via JSON.
- Solidity ^0.8.20 + OpenZeppelin Contracts
- ethers.js v6 (CDN)
- HTML/CSS/JS vanilla (sem framework)
- Remix IDE para compilação e deploy