Skip to content

xcapit/document-notary

Repository files navigation

dApp Notario de Documentos

Una aplicación descentralizada para notarizar y verificar documentos PDF en la blockchain de Ethereum usando firmas EIP-712.

Qué Prueba Esto

Esta dApp te permite demostrar criptográficamente tres hechos clave sobre un documento:

  1. El documento existió - El hash se almacena on-chain con una marca de tiempo
  2. Fue firmado por una billetera específica - La dirección del firmante queda registrada
  3. En una fecha determinada - La marca de tiempo del bloque proporciona prueba de cuándo fue notarizado

La integridad del contenido está garantizada porque cualquier modificación al documento resultaría en un hash diferente.

Características

  • Notarizar Documentos: Sube un PDF, fírmalo usando EIP-712 y almacena su hash on-chain
  • Verificar Documentos: Verifica si un documento ha sido notarizado y ve quién lo firmó y cuándo
  • Firmas EIP-712: Usa firmado de datos estructurados para mejor seguridad y UX
  • Integración con MetaMask: Conexión de billetera sin problemas
  • Sepolia Testnet: Desplegado en la testnet Sepolia de Ethereum

Stack Tecnológico

  • Next.js 15 con App Router
  • TypeScript
  • Tailwind CSS
  • ethers.js v6
  • Solidity 0.8.20 (Contrato Inteligente)
  • OpenZeppelin Contracts (implementación EIP-712)

Contrato Inteligente

El contrato está desplegado en la testnet Sepolia. Puedes encontrar el contrato en:

// lib/contract.ts
export const CONTRACT_ADDRESS = "0xYOUR_CONTRACT_ADDRESS_HERE";

Funciones del Contrato

  • notarize(bytes32 docHash, bytes signature): Notariza un documento con una firma EIP-712
  • documents(bytes32 docHash): Ver detalles de notarización para un hash de documento

Configuración

Requisitos Previos

  • Node.js 18+
  • Extensión de navegador MetaMask
  • ETH de la testnet Sepolia (obtener desde faucet de Sepolia)

Instalación

  1. Clonar el repositorio:
git clone <tu-url-del-repo>
cd document-notary
  1. Instalar dependencias:
npm install
  1. Actualizar la dirección del contrato:

Edita lib/contract.ts y reemplaza CONTRACT_ADDRESS con la dirección de tu contrato desplegado:

export const CONTRACT_ADDRESS = "0xTuDireccionDelContrato";
  1. Ejecutar el servidor de desarrollo:
npm run dev
  1. Abre http://localhost:3000 en tu navegador

Uso

Notarizando un Documento

  1. Haz clic en "Conectar Billetera" para conectar tu billetera MetaMask
  2. Asegúrate de estar en la red Sepolia (la dApp te pedirá cambiar si es necesario)
  3. Ve a la pestaña "Notarizar Documento"
  4. Sube un archivo PDF
  5. La dApp generará automáticamente el hash del archivo usando keccak256
  6. Haz clic en "Firmar con EIP-712" para firmar el hash con tu billetera
  7. Haz clic en "Notarizar en Blockchain" para enviar la transacción
  8. Espera a que la transacción se confirme en Sepolia

Verificando un Documento

  1. Ve a la pestaña "Verificar Documento"
  2. Sube el archivo PDF que deseas verificar
  3. Haz clic en "Verificar en Blockchain"
  4. Si el documento ha sido notarizado, verás:
    • El hash del documento
    • Quién lo firmó (dirección de billetera)
    • Cuándo fue notarizado (marca de tiempo)

Cómo Funciona

Firmado EIP-712

La dApp usa EIP-712 (Firmado de Datos Estructurados Tipados) que proporciona:

  • Mejor UX: Los usuarios pueden ver qué están firmando
  • Mejor seguridad: Previene la reutilización de firmas en diferentes contratos/cadenas
  • Formato estándar: Compatible con MetaMask y otras billeteras

El dominio de firmado:

{
  name: "DocumentNotary",
  version: "1",
  chainId: 11155111, // Sepolia
  verifyingContract: CONTRACT_ADDRESS
}

Los datos tipados:

{
  Document: [
    { name: "hash", type: "bytes32" }
  ]
}

Proceso de Hashing

  1. El archivo PDF se lee como un ArrayBuffer
  2. El contenido se convierte a un Uint8Array
  3. El hash keccak256 se calcula usando ethers.js
  4. Este hash se usa para firmar y almacenar on-chain

Proceso de Verificación

  1. El PDF subido se hashea usando el mismo método
  2. El hash se usa para consultar el contrato inteligente
  3. Si se encuentra, el contrato devuelve la dirección del firmante y la marca de tiempo
  4. El usuario puede verificar la integridad comparando los hashes

Estructura del Proyecto

document-notary/
├── app/
│   ├── page.tsx              # Página principal con pestañas
│   ├── layout.tsx            # Layout raíz
│   └── globals.css           # Estilos globales
├── components/
│   ├── WalletConnect.tsx     # Componente de conexión de billetera
│   ├── NotarizeDocument.tsx  # UI de notarización de documentos
│   └── VerifyDocument.tsx    # UI de verificación de documentos
├── hooks/
│   └── useWallet.ts          # Hook de conexión de billetera
├── lib/
│   ├── contract.ts           # ABI y configuración del contrato
│   └── utils.ts              # Funciones de utilidad
└── README.md

Consideraciones de Seguridad

  • La dApp solo almacena hashes de documentos, no los documentos reales
  • Los documentos nunca se suben a la blockchain o a ningún servidor
  • Todo el hashing ocurre del lado del cliente en el navegador
  • Las firmas EIP-712 aseguran que la firma no puede ser repetida en diferentes contratos o cadenas
  • El contrato previene la re-notarización del mismo documento

Limitaciones

  • Solo se soportan archivos PDF
  • El hashing de archivos se hace completamente en el navegador (puede ser lento para archivos grandes)
  • Una vez notarizado, un hash de documento no puede ser actualizado o eliminado
  • La verificación requiere exactamente el mismo archivo (incluso un cambio de 1 bit producirá un hash diferente)

Licencia

MIT

Contribuciones

¡Las pull requests son bienvenidas! Por favor abre un issue primero para discutir cualquier cambio importante.

Releases

No releases published

Packages

 
 
 

Contributors