feat: Goa GEL Blockchain e-Licensing Platform - Full Stack Implementation
Complete implementation of the Goa Government e-Licensing platform with: Backend: - NestJS API with JWT authentication - PostgreSQL database with Knex ORM - Redis caching and session management - MinIO document storage - Hyperledger Besu blockchain integration - Multi-department workflow system - Comprehensive API tests (266/282 passing) Frontend: - Angular 21 with standalone components - Angular Material + TailwindCSS UI - Visual workflow builder - Document upload with progress tracking - Blockchain explorer integration - Role-based dashboards (Admin, Department, Citizen) - E2E tests with Playwright (37 tests) Infrastructure: - Docker Compose orchestration - Blockscout blockchain explorer - Development and production configurations
This commit is contained in:
75
blockchain-architecture.mermaid
Normal file
75
blockchain-architecture.mermaid
Normal file
@@ -0,0 +1,75 @@
|
||||
graph TB
|
||||
subgraph Network["Hyperledger Besu Network<br/>QBFT Consensus<br/>4 Validator Nodes"]
|
||||
V1["🔐 Validator Node 1<br/>Port: 8545<br/>RPC Endpoint"]
|
||||
V2["🔐 Validator Node 2<br/>Port: 8546"]
|
||||
V3["🔐 Validator Node 3<br/>Port: 8547"]
|
||||
V4["🔐 Validator Node 4<br/>Port: 8548"]
|
||||
end
|
||||
|
||||
subgraph SmartContracts["Smart Contracts"]
|
||||
LicenseNFT["📋 LicenseRequestNFT<br/>(ERC-721 Soulbound)<br/>• tokenId<br/>• licenseHash<br/>• metadata URI<br/>• issuerDept"]
|
||||
ApprovalMgr["✅ ApprovalManager<br/>• recordApproval()<br/>• rejectRequest()<br/>• requestChanges()<br/>• getApprovalChain()"]
|
||||
DeptRegistry["🏢 DepartmentRegistry<br/>• registerDept()<br/>• setApprovers()<br/>• getApprovers()<br/>• deptMetadata"]
|
||||
WorkflowRegistry["⚙️ WorkflowRegistry<br/>• defineWorkflow()<br/>• getWorkflow()<br/>• workflowStates<br/>• transitions"]
|
||||
end
|
||||
|
||||
subgraph OnChain["On-Chain Data"]
|
||||
Accounts["💰 Accounts & Balances"]
|
||||
NFTState["🎖️ NFT State<br/>tokenId → Owner<br/>tokenId → Metadata"]
|
||||
Approvals["✅ Approval Records<br/>licenseHash → ApprovalChain"]
|
||||
end
|
||||
|
||||
subgraph OffChain["Off-Chain Data<br/>PostgreSQL + MinIO"]
|
||||
DocMeta["📄 Document Metadata<br/>• documentId<br/>• licenseHash<br/>• uploadedBy<br/>• uploadDate<br/>• status"]
|
||||
LicenseReq["📋 License Request Details<br/>• requestId<br/>• applicantInfo<br/>• documents<br/>• notes"]
|
||||
WorkflowState["⚙️ Workflow State<br/>• currentState<br/>• stateHistory<br/>• timestamps<br/>• transitions"]
|
||||
DocFiles["📦 Actual Files<br/>• PDFs (MinIO)<br/>• Images<br/>• Proofs"]
|
||||
end
|
||||
|
||||
subgraph DataLink["Data Linking"]
|
||||
Hash["🔗 Content Hashing<br/>SHA-256<br/>Document → Hash<br/>Immutable Link"]
|
||||
end
|
||||
|
||||
subgraph Consensus["Consensus: QBFT"]
|
||||
QBFTInfo["Quorum Byzantine<br/>Fault Tolerant<br/>Requires 3/4 validators<br/>~1 block/12s"]
|
||||
end
|
||||
|
||||
V1 -->|Peer Connection| V2
|
||||
V1 -->|Peer Connection| V3
|
||||
V1 -->|Peer Connection| V4
|
||||
V2 -->|Peer Connection| V3
|
||||
V2 -->|Peer Connection| V4
|
||||
V3 -->|Peer Connection| V4
|
||||
|
||||
V1 -->|Deploy/Call| SmartContracts
|
||||
V2 -->|Deploy/Call| SmartContracts
|
||||
V3 -->|Deploy/Call| SmartContracts
|
||||
V4 -->|Deploy/Call| SmartContracts
|
||||
|
||||
SmartContracts -->|Store State| OnChain
|
||||
LicenseNFT -->|Emit Events| OnChain
|
||||
ApprovalMgr -->|Record| OnChain
|
||||
DeptRegistry -->|Maintain| OnChain
|
||||
WorkflowRegistry -->|Track| OnChain
|
||||
|
||||
Hash -->|Link Via Hash| LicenseReq
|
||||
Hash -->|Store Hash| OnChain
|
||||
DocMeta -->|Contains Hash| Hash
|
||||
LicenseReq -->|Store Details| OffChain
|
||||
WorkflowState -->|Track Off-Chain| OffChain
|
||||
DocFiles -->|Reference Via Hash| OffChain
|
||||
|
||||
Hash -.->|Immutable Anchor| NFTState
|
||||
LicenseReq -.->|Linked to NFT| LicenseNFT
|
||||
|
||||
V1 -->|Consensus| Consensus
|
||||
V2 -->|Consensus| Consensus
|
||||
V3 -->|Consensus| Consensus
|
||||
V4 -->|Consensus| Consensus
|
||||
|
||||
style Network fill:#dc2626,stroke:#991b1b,stroke-width:2px,color:#fff
|
||||
style SmartContracts fill:#2563eb,stroke:#1e40af,stroke-width:2px,color:#fff
|
||||
style OnChain fill:#7c3aed,stroke:#5b21b6,stroke-width:2px,color:#fff
|
||||
style OffChain fill:#8b5cf6,stroke:#6d28d9,stroke-width:2px,color:#fff
|
||||
style DataLink fill:#06b6d4,stroke:#0891b2,stroke-width:2px,color:#fff
|
||||
style Consensus fill:#f59e0b,stroke:#d97706,stroke-width:2px,color:#fff
|
||||
Reference in New Issue
Block a user