Sistema descentralizado para el registro y verificación de integridad de documentos digitales utilizando firmas EIP-712 y almacenamiento en la blockchain (EVM).
El proyecto permite a los usuarios cargar un archivo, generar su hash criptográfico (Keccak-256), firmarlo digitalmente y registrar esa "huella digital" en un Smart Contract para asegurar su existencia y autoría en un momento determinado.
El monorepositorio está dividido en dos partes principales:
- /sc: Smart Contracts desarrollados con Foundry.
- /web: Aplicación frontend desarrollada con Next.js, Ethers.js y TailwindCSS.
- Solidity 0.8.19: Lenguaje de programación de los contratos.
- OpenZeppelin: Estándares de seguridad y utilidades para EIP-712.
- Foundry: Herramienta de desarrollo (Forge para compilación/tests, Anvil como nodo local).
- React 19 & Next.js 16: Framework principal.
- Ethers.js v6: Interacción con la blockchain y manejo de wallets.
- TailwindCSS: Estilado de la interfaz.
- Zod: Validación de esquemas.
- Lucide React / Heroicons: Iconografía.
- Jest & Testing Library: Suite de pruebas.
classDiagram
class DocumentRegistry {
+struct Document
-mapping(bytes32 => Document) documents
+storeDocumentHash(bytes32 hash, uint256 timestamp, bytes signature)
+verifyDocument(bytes32 hash, address expectedSigner, bytes signature) bool
+getDocumentInfo(bytes32 hash) (uint256, address, bool)
+getEIP712Hash(bytes32 digest) bytes32
-_verifySignature(bytes32 digest, bytes signature) address
-_recoverSigner(bytes32 digestHash, bytes signature) address
}
class Document {
+uint256 timestamp
+address signer
+bool exists
}
DocumentRegistry --* Document : stores
- Generación de Hash Local: Cálculo del hash Keccak-256 del archivo seleccionado sin subirlo a ningún servidor (privacidad total).
- Firmas EIP-712: Implementación de firmas estructuradas para que el usuario sepa exactamente qué está firmando.
- Registro On-chain: Almacenamiento del hash, el timestamp y la dirección del firmante en la blockchain.
- Verificación de Integridad: Herramienta para validar si un archivo coincide con un registro previo y si la firma es válida.
- Simulación de Wallets (Modo Dev): Integración directa con cuentas de Anvil para facilitar el desarrollo local sin necesidad de extensiones externas inicialmente.
- Multi-chain Ready: Configuración preparada para diferentes redes (aunque optimizada para Anvil en desarrollo).
Para ejecutar el proyecto localmente, sigue estos pasos:
Abre una terminal y ejecuta:
anvilEsto iniciará un nodo local en http://127.0.0.1:8545 con 10 cuentas de prueba.
El proyecto incluye un script deploy.sh en la raíz que automatiza la compilación, ejecución de tests, despliegue y configuración del frontend:
chmod +x deploy.sh
./deploy.shEste script realiza lo siguiente:
- Compila los contratos inteligentes.
- Ejecuta las pruebas funcionales.
- Despliega el contrato
DocumentRegistryen el nodo Anvil local. - Actualiza automáticamente el ABI en el directorio del frontend.
- Genera el archivo
.enven la carpetawebcon la dirección del contrato desplegado.
Si prefieres realizar los pasos de manera individual:
cd sc
# Compilar
forge build
# Desplegar (asegúrate de que anvil esté corriendo)
forge create --rpc-url http://127.0.0.1:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 src/DocumentRegistry.sol:DocumentRegistrycd web
# Instalar dependencias
npm install
# Configurar dirección del contrato
echo "NEXT_PUBLIC_CONTRACT_ADDRESS=DIRECCION_DE_TU_CONTRATO" > .env.localnpm run devLa aplicación estará disponible en http://localhost:3000.
cd web
npm testcd sc
forge test- El sistema utiliza el estándar EIP-712 para la recuperación del firmante, lo que mejora la seguridad y la experiencia de usuario al mostrar datos legibles en la firma.
- El almacenamiento en el contrato es minimalista (mapping de
bytes32) para optimizar costos de gas.