This comprehensive update implements: Transport Tracking System: - Complete seed-to-seed lifecycle tracking with 9 event types - TransportChain blockchain for immutable transport records - Carbon footprint calculation per transport method - Food miles tracking with Haversine distance calculation - QR code generation for full traceability Demand Forecasting System: - Consumer preference registration and aggregation - Regional demand signal generation - Supply gap identification and market matching - Grower planting recommendations with risk assessment - Seasonal planning integration Vertical Farming Module: - Multi-zone facility management - Environmental control systems (HVAC, CO2, humidity, lighting) - Growing recipes with stage-based environment targets - Crop batch tracking with health scoring - Farm analytics generation Documentation: - Complete docs/ folder structure for Turborepo - Seed-to-seed transport concept documentation - Demand forecasting and seasonal planning guides - System architecture and user blockchain design - Transport API reference - Vertical farming integration guide Agent Report: - AGENT_REPORT.md with 5 parallel agent tasks for continued development - API routes implementation task - UI components task - Vertical farming pages task - Testing suite task - Documentation completion task
353 lines
12 KiB
Markdown
353 lines
12 KiB
Markdown
# 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
|