# User Blockchain Architecture Every user in LocalGreenChain operates their own blockchain, creating a decentralized network of plant lineage and transport records that collectively form a global agricultural tracking system. ## Why Per-User Blockchains? ### Traditional Centralized Approach ``` All Data → Central Database → Single Point of Failure ↓ Trust the operator Data can be modified Privacy concerns ``` ### LocalGreenChain Distributed Approach ``` User A Chain ←→ User B Chain ←→ User C Chain ↓ ↓ ↓ Own data Own data Own data Own history Own history Own history ↓ ↓ ↓ Cross-referenced via Master Ledger ``` ## Architecture ``` ┌─────────────────────────────────────────────────────────────────────┐ │ USER BLOCKCHAIN NETWORK │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ MASTER LEDGER │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ Plant Index: plantId → [userA:block5, userB:block12] │ │ │ │ │ │ Lineage Index: parentId → [childId1, childId2...] │ │ │ │ │ │ Transport Index: batchId → [events...] │ │ │ │ │ │ User Directory: userId → publicKey, chainHash │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ↑ │ │ ┌───────────────┼───────────────┐ │ │ ▼ ▼ ▼ │ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │ │ USER A CHAIN │ │ USER B CHAIN │ │ USER C CHAIN │ │ │ ├───────────────┤ ├───────────────┤ ├───────────────┤ │ │ │ Block 0: Gen │ │ Block 0: Gen │ │ Block 0: Gen │ │ │ │ Block 1: Reg │ │ Block 1: Acq │ │ Block 1: Reg │ │ │ │ Block 2: Grow │ │ Block 2: Plant│ │ Block 2: Clone│ │ │ │ Block 3: Harv │ │ Block 3: Grow │ │ Block 3: Trans│ │ │ │ Block 4: Send │ │ Block 4: Recv │ │ Block 4: ... │ │ │ │ ... │ │ ... │ │ ... │ │ │ └───────────────┘ └───────────────┘ └───────────────┘ │ │ ↓ ↓ ↓ │ │ └───────────────────┼───────────────────┘ │ │ ▼ │ │ ┌───────────────────┐ │ │ │ CROSS-CHAIN REFS │ │ │ │ Plant P in A:3 │ │ │ │ received by B:4 │ │ │ │ cloned to C:2 │ │ │ └───────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` ## Block Types ### Plant Registration Block ```typescript interface PlantBlock { index: number; timestamp: string; blockType: 'plant_registration'; plant: { id: string; commonName: string; scientificName: string; propagationType: 'original' | 'seed' | 'clone' | 'cutting'; generation: number; parentPlantId?: string; // Cross-chain reference location: PlantLocation; owner: PlantOwner; childPlants: string[]; }; previousHash: string; hash: string; nonce: number; } ``` ### Transport Event Block ```typescript interface TransportBlock { index: number; timestamp: string; blockType: 'transport_event'; transportEvent: { eventType: TransportEventType; fromLocation: TransportLocation; toLocation: TransportLocation; plantIds?: string[]; batchIds?: string[]; carbonFootprintKg: number; senderId: string; // Cross-chain reference receiverId: string; // Cross-chain reference }; previousHash: string; hash: string; nonce: number; } ``` ### Environment Update Block ```typescript interface EnvironmentBlock { index: number; timestamp: string; blockType: 'environment_update'; environment: { plantId: string; readings: GrowingEnvironment; healthScore: number; alerts: EnvironmentAlert[]; }; previousHash: string; hash: string; nonce: number; } ``` ## Cross-Chain References When plants move between users, cross-chain references maintain lineage: ``` User A's Chain: User B's Chain: ┌────────────────────┐ ┌────────────────────┐ │ Block 5 │ │ Block 12 │ │ Type: Send Plant │────────────→│ Type: Receive Plant│ │ PlantId: tomato-1 │ │ PlantId: tomato-1 │ │ To: UserB │ │ From: UserA │ │ ToBlock: pending │←────────────│ FromBlock: A:5 │ └────────────────────┘ └────────────────────┘ After confirmation: Block 5.ToBlock = "B:12" // Updated with cross-reference ``` ## Chain Synchronization ### Local-First Operation ``` 1. User creates block locally 2. Block is mined (proof-of-work) 3. Block added to local chain 4. Sync to master ledger index 5. Cross-references updated ``` ### Conflict Resolution ``` If chain fork detected: 1. Longer chain wins (most work) 2. Orphaned blocks flagged 3. Cross-references updated 4. Users notified of conflicts ``` ## Privacy Model ### Default Privacy - Location can be fuzzy (city-level) - Owner name can be pseudonymous - Wallet addresses are pseudonymous ### Enhanced Privacy (Tor) - Onion routing for chain sync - Hidden service for API access - No IP logging - Anonymous registration ### Public Data - Plant species/variety - Lineage relationships - Transport events (anonymized) - Environmental data (aggregated) ## Verification ### Single Chain Verification ```typescript function verifyChain(chain: Block[]): boolean { for (let i = 1; i < chain.length; i++) { const current = chain[i]; const previous = chain[i - 1]; // Verify hash if (current.hash !== calculateHash(current)) { return false; } // Verify chain link if (current.previousHash !== previous.hash) { return false; } // Verify proof-of-work if (!current.hash.startsWith('0'.repeat(difficulty))) { return false; } } return true; } ``` ### Cross-Chain Verification ```typescript function verifyCrossReference( senderChain: Block[], receiverChain: Block[], reference: CrossReference ): boolean { const senderBlock = senderChain[reference.senderBlockIndex]; const receiverBlock = receiverChain[reference.receiverBlockIndex]; // Verify matching plant/batch IDs if (senderBlock.plantId !== receiverBlock.plantId) { return false; } // Verify timestamps (receiver after sender) if (new Date(receiverBlock.timestamp) < new Date(senderBlock.timestamp)) { return false; } // Verify signatures if (!verifySignature(senderBlock, senderPublicKey)) { return false; } return true; } ``` ## Querying the Network ### Find Plant History ```typescript // Query across all user chains const history = masterLedger.queryPlantHistory(plantId); // Returns: { plantId: 'tomato-123', currentOwner: 'userC', registeredBy: 'userA', generation: 2, history: [ { user: 'userA', block: 1, event: 'registered', date: '2025-01-01' }, { user: 'userA', block: 5, event: 'cloned', date: '2025-02-15' }, { user: 'userB', block: 12, event: 'received', date: '2025-02-16' }, { user: 'userB', block: 20, event: 'grew', date: '2025-03-01' }, { user: 'userC', block: 8, event: 'received', date: '2025-03-15' }, ] } ``` ### Find Lineage ```typescript const lineage = masterLedger.queryLineage(plantId, generations: 5); // Returns tree structure { plant: 'tomato-123', generation: 2, ancestors: [ { plant: 'tomato-orig', generation: 0, owner: 'userA' }, { plant: 'tomato-clone1', generation: 1, owner: 'userA' } ], descendants: [ { plant: 'tomato-123-seed1', generation: 3, owner: 'userD' }, { plant: 'tomato-123-seed2', generation: 3, owner: 'userE' } ], siblings: [ { plant: 'tomato-clone2', generation: 2, owner: 'userF' } ] } ``` ## Data Storage ### Local Storage Each user stores their chain locally: ``` ~/.localgreenchain/ ├── chain.json # Main blockchain ├── transport-chain.json # Transport events ├── keys/ │ ├── private.key # User's private key │ └── public.key # User's public key └── cache/ └── master-index.json # Cached master ledger ``` ### Cloud Sync (Optional) ``` User Chain → Encrypted → Cloud Backup ↓ Only user can decrypt Master ledger has index only ``` ## Performance Considerations ### Block Size - Target: < 10KB per block - Compression for large data - Images stored as references ### Mining Difficulty - Adjustable per chain - Lower for personal use (difficulty: 2) - Higher for shared chains (difficulty: 4) ### Sync Frequency - Real-time for active users - Batch sync for inactive users - Prioritize cross-references ## Security Measures ### Against Tampering - Hash chains prevent modification - Cross-references create witnesses - Master ledger provides redundancy ### Against Sybil Attacks - Proof-of-work makes spam expensive - Reputation system for users - Rate limiting on registrations ### Against Privacy Leaks - Minimal data in master ledger - Tor integration optional - User controls visibility