A comprehensive document verification platform that leverages blockchain technology, IPFS, and role-based access control to provide secure, transparent, and tamper-proof document verification and management.
Prachi Maruti Patil Student Β· Developer Β· Vidyalankar Institute of Technology, Mumbai
DocVerfy is a full-stack application designed to streamline document verification processes by:
- Secure Document Storage: Documents are stored on IPFS with blockchain-backed verification
- Role-Based Access Control: Three user roles (Uploader, Verifier, Admin) with distinct capabilities
- Blockchain Integration: Smart contracts ensure document authenticity and immutability
- QR Code Support: Generate and scan QR codes for easy document verification
- IPFS Storage: Integration with decentralized storage
- Email Notifications: Automated email alerts for verification requests and status updates
The project consists of three main components:
- Modern React 19 application with React Router for navigation
- Role-based dashboards for Uploaders, Verifiers, and Admins
- QR code generation and scanning capabilities
- Blockchain interaction via Ethers.js
- Express.js REST API with MongoDB for data persistence
- Authentication via JWT and role-based authorization
- IPFS integration for document storage
- Ethereum blockchain interaction for document verification
- Email service for notifications
DocumentVerificationV2.sol: Main contract with role-based access control- Uses OpenZeppelin's AccessControlEnumerable for secure role management
- Manages document roots, versions, and verification status
- Events for document creation, version addition, and revocation
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DocVerfy System Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββ HTTP/REST ββββββββββββββββββββββββ
β React Frontend βββββββββββββββββββββββββββββββΊβ Express Backend β
β (Port 3000) β with JWT Token β (Port 5000) β
β β β β
β β’ Login Page β β β’ Auth Routes β
β β’ Dashboards β WebSocket β β’ Document Routes β
β β’ QR Generation β (Optional) β β’ Verification API β
β β’ QR Scanning β β β’ Email Service β
β β’ Document Mgmt β β β’ IPFS Integration β
ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β β
β Contract ABIs & β MongoDB
β Direct Contract Calls β Connection
β (Ethers.js v6) β
β ββββββββββββββΌβββββββββββββ
β β MongoDB Database β
β β β
β β β’ Users β
β β β’ Documents Metadata β
β β β’ Verification Data β
β β β’ Requests β
β ββββββββββββββββββββββββββ
β
β Web3 Calls (Port 8545)
β
ββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ
β β
ββββββββββββββββββΌβββββββββββββββββ β
β Ethereum Network (Ganache) β β
β β β
β ββββββββββββββββββββββββββββ β β
β β DocumentVerificationV2 β β β
β β Smart Contract β β β
β β β β β
β β β’ Document Roots β β β
β β β’ Versions & Hashes β β β
β β β’ Verification Status β β β
β β β’ Role-Based Access β β β
β ββββββββββββββββββββββββββββ β β
β β β
ββββββββββββββββββ¬ββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββ β
β β β
βΌ βΌ β
ββββββββββββββββββββββ ββββββββββββββββββββ
β IPFS Network β β NFT.storage β
β (Document Store) β β (Alternative) β
β β β β
β β’ File Content β β β’ Pinned Files β
β β’ Content Hash β β β’ Backup Storage β
β β’ Distributed β β β’ NFT Metadata β
ββββββββββββββββββββββ ββββββββββββββββββββ
DOCUMENT UPLOAD FLOW
βββββββββββββββββββ
ββββββββββββββ
β User β 1. Select & Upload File
β (Browser) β
ββββββββ¬ββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β React Client β
β β’ Hash Document (SHA-256) β
β β’ Validate File β
β β’ Generate QR Code β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β 2. POST /doc/upload + File Data
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β Express Server β
β β’ Verify JWT Token β
β β’ Authenticate User Role β
β β’ Store Metadata in MongoDB β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββ¬βββββββββββββββββββββββ
β β β
β 3. Upload to IPFS β 4. Store in DB β 5. Blockchain
βΌ βΌ βΌ
ββββββββββ ββββββββββ ββββββββββββββββ
β IPFS β βMongoDB β β Smart β
β Get CIDβ β Save β β Contract β
ββββββββββ β Metadata β uploadDoc() β
β ββββββββββ ββββββββββββββββ
β β β
βββββββββββββββββββββββ΄βββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββ
β 6. Confirmation β
β Sent to Client β
βββββββββββββββββββββββ
DOCUMENT VERIFICATION FLOW
ββββββββββββββββββββββββββββ
ββββββββββββββ
β Uploader β 1. Request Verification
β β
ββββββββ¬ββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β React Client β
β β’ Request Verifier Assignment β
β β’ Submit via Form β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β 2. POST /doc/request-verifier
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β Express Server β
β β’ Create Verification Request β
β β’ Store in MongoDB β
β β’ Send Email Notification β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββ
β 3. Verifier Receives Email β
β & Sees Request in Dashboard β
ββββββββ¬βββββββββββββββββββββββββββββββ
β
β 4. Scan QR Code / View Document
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β React Client (Verifier) β
β β’ Display Document Details β
β β’ Show IPFS Content β
β β’ Verification Interface β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 5. POST /doc/verify + Approval
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β Express Server β
β β’ Validate Verifier Role β
β β’ Update MongoDB β
β β’ Call Smart Contract β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββ¬βββββββββββββββββββ
β β β
β Blockchain Tx β Database Update β Email Notification
βΌ βΌ βΌ
ββββββββββββββ ββββββββββββββ ββββββββββββββββββ
βSmart β β MongoDB β β Nodemailer β
βContract β β Update β β Notify Users β
βverifyVersion β β of Status β
ββββββββββββββ ββββββββββββββ ββββββββββββββββββ
UPLOADER JOURNEY
ββββββββββββββββββββββββ
βββββββββββββββ
β START β
ββββββββ¬βββββββ
β
ββββββββΌβββββββ
β Login/Sign β
β Up β
ββββββββ¬βββββββ
β
βββββββββββββ΄ββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββ ββββββββββββββββββββ
β Upload β β View My Uploads β
β Document β β & Status β
ββββββββββ¬βββββββββ ββββββββββββββββββββ
β
ββββββββββΌβββββββββ
β Generate QR β
β Code β
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββββββββββ
β Request Verifier β
β (Pending Verification) β
ββββββββββ¬βββββββββββββββββ
β
ββββββββββΌβββββββββββββββββββ
β Scan QR to Verify β
β Document Status β
ββββββββββ¬βββββββββββββββββββ
β
ββββββ΄ββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββ
β VERIFIED β β β NOT VERIFIED β
βββββββββββββββββββ ββββββββββ¬βββββββββ
β
βββββββββββΌββββββββββ
β Wait or Request β
β Another Verifier β
βββββββββββββββββββββ
VERIFIER JOURNEY
ββββββββββββββββββββββββ
βββββββββββββββ
β START β
ββββββββ¬βββββββ
β
ββββββββΌβββββββ
β Login β
ββββββββ¬βββββββ
β
βββββββββββββ΄ββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββ ββββββββββββββββββββ
β View Pending β β Scan Documents β
β Verification β β (QR Code) β
β Requests β ββββββββββββββββββββ
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββββββββ
β Click on Request β
β View Document Details β
ββββββββββ¬βββββββββββββββ
β
ββββββββββΌβββββββββββββββββββ
β Review Document from β
β IPFS β
ββββββββββ¬βββββββββββββββββββ
β
ββββββ΄ββββββββββββββββ
β β
βΌ βΌ
ββββββββββββββββ ββββββββββββββββ
β Approve β β Reject β
β Document β β Document β
ββββββββ¬ββββββββ ββββββββ¬ββββββββ
β β
ββββββββββ¬ββββββββββββ
β
βββββββββΌβββββββββ
β Transaction to β
β Blockchain β
β (Immutable) β
βββββββββ¬βββββββββ
β
βββββββββΌβββββββββββββ
β Email Notification β
β Sent to Uploader β
ββββββββββββββββββββββ
ADMIN JOURNEY
ββββββββββββββββββββββββ
βββββββββββββββ
β START β
ββββββββ¬βββββββ
β
ββββββββΌβββββββ
β Admin Login β
ββββββββ¬βββββββ
β
βββββββββββββββββΌβββββββββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β Manage All β β Revoke Docs β β View Reports β
β Documents β β β β & Analytics β
ββββββββββββββββ ββββββββ¬ββββββββ ββββββββββββββββ
β
ββββββββββΌβββββββββ
β Select Doc β
β to Revoke β
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββββββ
β Provide Reason β
β for Revocation β
ββββββββββ¬βββββββββββββ
β
ββββββββββΌβββββββββββββ
β Submit Revocation β
β (Blockchain) β
ββββββββββ¬βββββββββββββ
β
ββββββββββΌβββββββββββββ
β Email Notifications β
β to All Parties β
βββββββββββββββββββββββ
- React 19: UI framework
- React Router v7: Client-side routing
- Ethers.js v6: Blockchain interaction
- Axios: HTTP client
- QR Code:
qrcode.reactandreact-qr-readerfor QR functionality - JWT:
jwt-decodefor token management
- Express.js v5: Web framework
- MongoDB: Database (via Mongoose)
- Ethers.js v6: Blockchain interaction
- IPFS Client:
ipfs-http-clientfor decentralized storage - NFT.storage: Alternative IPFS storage
- Nodemailer: Email notifications
- JWT: Authentication
- bcryptjs: Password hashing
- Solidity ^0.8.28: Smart contract language
- Hardhat: Development framework
- OpenZeppelin: Secure contract libraries
- Chai: Testing framework
doc-verfy/
βββ client/ # React frontend application
β βββ public/ # Static files
β βββ src/
β β βββ components/ # Reusable UI components
β β βββ pages/ # Page components (dashboards, login)
β β βββ context/ # React Context (AuthContext)
β β βββ utils/ # Utility functions and routing
β β βββ contracts/ # ABI files for smart contracts
β β βββ App.js # Main application component
β βββ package.json
β
βββ server/ # Node.js backend
β βββ routes/ # API endpoint definitions
β βββ middleware/ # Authentication and request processing
β βββ model/ # MongoDB schemas
β βββ utils/ # Helper functions (IPFS, Ethereum, Email)
β βββ index.js # Application entry point
β βββ package.json
β
βββ hardhat/ # Smart contract development
βββ contracts/ # Solidity smart contracts
βββ scripts/ # Deployment scripts
βββ test/ # Contract tests
βββ artifacts/ # Compiled contract artifacts
βββ hardhat.config.cjs # Hardhat configuration
βββ package.json
- Node.js v16 or higher
- npm or yarn
- MongoDB instance (local or cloud - MongoDB Atlas)
- Ganache or similar Ethereum local network (optional, for local blockchain testing)
- IPFS node or IPFS API key (for document storage)
cd doc-verfycd hardhat
# Install dependencies
npm install
# Create .env file with:
# PRIVATE_KEY=your-wallet-private-key
# GANACHE_RPC_URL=http://localhost:8545
# ETHERSCAN_API_KEY=your-etherscan-key
# Compile contracts
npx hardhat compile
# Deploy to local Ganache network
npx hardhat run scripts/deploy.js --network ganache
# Run tests
npx hardhat testcd server
# Install dependencies
npm install
# Create .env file with the following variables:
# MONGODB_URI
# PORT=5000
# JWT_SECRET=your-secret-key
# ETH_PROVIDER=http://localhost:8545
# CONTRACT_ADDRESS=0x...
# IPFS_API_KEY=your-ipfs-key
# EMAIL_USER=your-email@gmail.com
# EMAIL_PASS=your-app-password
# NFT_STORAGE_KEY=your-nft-storage-key
npm start
# For development with auto-reload:
npm run devThe server will run on http://localhost:5000
cd client
# Install dependencies with legacy peer deps flag
npm install -legacy-peer-deps
# Create .env file with:
# REACT_APP_API_URL=http://localhost:5000
# REACT_APP_CONTRACT_ADDRESS=0x...
# REACT_APP_RPC_URL=http://localhost:8545
npm startThe client will run on http://localhost:3000
- Upload documents to the system
- Generate QR codes for documents
- Scan QR codes to verify documents
- View personal uploads and their verification status
- Request verifiers for their documents
- View pending verification requests
- Scan and verify documents
- Approve or reject documents
- Track verification history
- Manage all documents in the system
- Revoke documents if needed
- Manage user roles and permissions
- View system reports and analytics
- Handle disputes and system administration
- Immutable Records: Documents stored on blockchain and IPFS
- Version Control: Track multiple versions of documents
- QR Code Integration: Easy document identification and sharing
- Expiry Management: Set document expiration dates
- Role-Based Access Control: Three-tier permission system
- Password Hashing: Bcrypt for secure password storage
- JWT Authentication: Stateless authentication tokens
- Blockchain Verification: Cryptographic proof of authenticity
- IPFS Integration: Decentralized file storage
- NFT.storage: Alternative IPFS provider support
- MongoDB: User data and metadata storage
- Ethereum: Document hash and status on-chain
POST /auth/signup- User registrationPOST /auth/login- User loginPOST /auth/logout- User logout
POST /doc/upload- Upload a documentGET /doc/:docId- Get document detailsGET /doc/- List documentsPOST /doc/verify- Verify a documentDELETE /doc/:docId- Revoke a document
POST /doc/request-verifier- Create verification requestGET /doc/requests- Get verification requestsPUT /doc/request/:id- Update verification request
uploadDocument()- Upload a new document rootaddVersion()- Add a new version to a documentverifyVersion()- Mark a version as verifiedrevokeRoot()- Revoke a document (admin only)getRootInfo()- Get document root informationgetVersionInfo()- Get version information
cd hardhat
npx hardhat testcd client
npm testcd hardhat
npx hardhat run scripts/deploy.js --network sepoliacd client
npm run buildThe optimized build will be in the client/build/ directory.
MONGODB_URI=
PORT=
JWT_SECRET=
ETH_PROVIDER=
CONTRACT_ADDRESS=
IPFS_API_KEY=
EMAIL_USER=
EMAIL_PASS=
NFT_STORAGE_KEY=
REACT_APP_API_URL=
REACT_APP_CONTRACT_ADDRESS=
REACT_APP_RPC_URL=
PRIVATE_KEY=
GANACHE_RPC_URL=
ETHERSCAN_API_KEY=
- Ensure MongoDB is running locally or check connection string
- Verify network access if using MongoDB Atlas
- Check that Ganache/local network is running
- Verify account has sufficient funds
- Check contract address is correctly set in client
- Verify IPFS API key or local IPFS node is accessible
- Check file size limits
- Test connectivity to IPFS node