- Add guides: quick-start, installation, configuration, grower, consumer, transport, vertical-farm - Add API references: REST, demand, vertical-farming - Add concepts: blockchain, seasonal-planning, carbon-footprint - Add architecture: data-flow, transport-tracking - Add vertical-farming: environmental-control, automation, integration - Add examples: seed-to-harvest, demand-driven-planting, vertical-farm-setup Completes Agent_5 documentation tasks from AGENT_REPORT.md
298 lines
8.3 KiB
Markdown
298 lines
8.3 KiB
Markdown
# Blockchain Architecture
|
|
|
|
Understanding LocalGreenChain's blockchain implementation for plant lineage and transport tracking.
|
|
|
|
## Overview
|
|
|
|
LocalGreenChain uses a custom proof-of-work blockchain designed specifically for agricultural traceability. Unlike cryptocurrency blockchains, our focus is on:
|
|
|
|
- **Immutability** - Plant records cannot be altered
|
|
- **Traceability** - Complete chain of custody
|
|
- **Efficiency** - Lightweight for agricultural use
|
|
- **Privacy** - User-controlled data visibility
|
|
|
|
## Core Concepts
|
|
|
|
### Blocks
|
|
|
|
Each block contains:
|
|
|
|
```typescript
|
|
interface PlantBlock {
|
|
index: number; // Position in chain
|
|
timestamp: string; // ISO 8601 datetime
|
|
data: PlantData; // Plant or transport data
|
|
previousHash: string; // Link to previous block
|
|
hash: string; // This block's hash
|
|
nonce: number; // Proof-of-work solution
|
|
}
|
|
```
|
|
|
|
### Chain Structure
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ BLOCKCHAIN │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
|
│ │ Genesis │───→│ Block 1 │───→│ Block 2 │───→│ Block 3 │ │
|
|
│ │ Block │ │ │ │ │ │ │ │
|
|
│ │ │ │ hash: A │ │ hash: B │ │ hash: C │ │
|
|
│ │ prev: 0 │ │ prev: G │ │ prev: A │ │ prev: B │ │
|
|
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
|
|
│ G A B C │
|
|
│ │
|
|
│ Each block contains: │
|
|
│ - Plant registration OR transport event │
|
|
│ - Timestamp │
|
|
│ - Cryptographic link to previous block │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Proof of Work
|
|
|
|
### Mining Process
|
|
|
|
```typescript
|
|
function mineBlock(block: PlantBlock): void {
|
|
const target = '0'.repeat(difficulty);
|
|
|
|
while (block.hash.substring(0, difficulty) !== target) {
|
|
block.nonce++;
|
|
block.hash = calculateHash(block);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Difficulty Levels
|
|
|
|
| Difficulty | Leading Zeros | Avg. Time | Use Case |
|
|
|------------|---------------|-----------|----------|
|
|
| 1 | 0 | < 1ms | Development |
|
|
| 2 | 00 | ~10ms | Testing |
|
|
| 3 | 000 | ~100ms | Default |
|
|
| 4 | 0000 | ~1s | Production |
|
|
| 5 | 00000 | ~10s | High Security |
|
|
|
|
### Hash Calculation
|
|
|
|
```typescript
|
|
function calculateHash(block: PlantBlock): string {
|
|
const data = `${block.index}${block.timestamp}${JSON.stringify(block.data)}${block.previousHash}${block.nonce}`;
|
|
return crypto.createHash('sha256').update(data).digest('hex');
|
|
}
|
|
```
|
|
|
|
## Chain Integrity
|
|
|
|
### Validation
|
|
|
|
Every block must satisfy:
|
|
|
|
1. **Correct Hash** - Hash matches recalculated hash
|
|
2. **Valid Previous Hash** - Links to actual previous block
|
|
3. **Proof of Work** - Hash meets difficulty requirement
|
|
4. **Timestamp Order** - Blocks are chronological
|
|
|
|
```typescript
|
|
function isChainValid(chain: PlantBlock[]): boolean {
|
|
for (let i = 1; i < chain.length; i++) {
|
|
const current = chain[i];
|
|
const previous = chain[i - 1];
|
|
|
|
// Verify hash
|
|
const expectedHash = calculateHash(current);
|
|
if (current.hash !== expectedHash) return false;
|
|
|
|
// Verify chain link
|
|
if (current.previousHash !== previous.hash) return false;
|
|
|
|
// Verify proof of work
|
|
const target = '0'.repeat(difficulty);
|
|
if (current.hash.substring(0, difficulty) !== target) return false;
|
|
}
|
|
return true;
|
|
}
|
|
```
|
|
|
|
## Data Types
|
|
|
|
### Plant Registration Block
|
|
|
|
```typescript
|
|
{
|
|
index: 42,
|
|
timestamp: "2024-06-01T10:00:00Z",
|
|
data: {
|
|
type: "plant_registration",
|
|
plantId: "plant-abc123",
|
|
commonName: "Tomato",
|
|
scientificName: "Solanum lycopersicum",
|
|
location: {
|
|
latitude: 40.7128,
|
|
longitude: -74.0060
|
|
},
|
|
owner: {
|
|
id: "user-123",
|
|
name: "John Doe"
|
|
},
|
|
generation: 0,
|
|
parentPlantId: null
|
|
},
|
|
previousHash: "00abc...",
|
|
hash: "00def...",
|
|
nonce: 12345
|
|
}
|
|
```
|
|
|
|
### Transport Event Block
|
|
|
|
```typescript
|
|
{
|
|
index: 43,
|
|
timestamp: "2024-06-15T08:00:00Z",
|
|
data: {
|
|
type: "transport_event",
|
|
eventType: "harvest",
|
|
plantIds: ["plant-abc123"],
|
|
fromLocation: { ... },
|
|
toLocation: { ... },
|
|
transportMethod: "electric_vehicle",
|
|
carbonFootprintKg: 2.5,
|
|
distanceKm: 25
|
|
},
|
|
previousHash: "00def...",
|
|
hash: "00ghi...",
|
|
nonce: 67890
|
|
}
|
|
```
|
|
|
|
## Lineage Tracking
|
|
|
|
### Parent-Child Relationships
|
|
|
|
```
|
|
Original Plant (Gen 0)
|
|
├── previousHash: null
|
|
├── propagationType: null
|
|
│
|
|
├─→ Clone A (Gen 1)
|
|
│ ├── previousHash: Original
|
|
│ ├── propagationType: "clone"
|
|
│ │
|
|
│ ├─→ Seed A-1 (Gen 2)
|
|
│ │ └── propagationType: "seed"
|
|
│ │
|
|
│ └─→ Clone A-2 (Gen 2)
|
|
│ └── propagationType: "clone"
|
|
│
|
|
└─→ Seed B (Gen 1)
|
|
├── propagationType: "seed"
|
|
│
|
|
└─→ Clone B-1 (Gen 2)
|
|
└── propagationType: "clone"
|
|
```
|
|
|
|
### Lineage Query
|
|
|
|
```typescript
|
|
function getLineage(plantId: string, generations: number): LineageTree {
|
|
const plant = findPlant(plantId);
|
|
|
|
return {
|
|
plant,
|
|
ancestors: getAncestors(plant.parentPlantId, generations),
|
|
descendants: getDescendants(plantId, generations)
|
|
};
|
|
}
|
|
```
|
|
|
|
## Cross-Chain References
|
|
|
|
### Transport Chain ↔ Plant Chain
|
|
|
|
Transport events reference plants by ID:
|
|
|
|
```typescript
|
|
// Transport chain references plant chain
|
|
{
|
|
eventType: "harvest",
|
|
plantIds: ["plant-abc123", "plant-abc124"], // References plant chain
|
|
harvestBatchId: "batch-001"
|
|
}
|
|
|
|
// Plant chain may reference transport
|
|
{
|
|
plantId: "plant-abc123",
|
|
lastTransportBlock: 156, // Reference to transport chain
|
|
currentCustodian: "user-456"
|
|
}
|
|
```
|
|
|
|
## Performance Considerations
|
|
|
|
### Storage
|
|
|
|
```
|
|
Block Size: ~1-2 KB typical
|
|
Growth Rate: ~10-100 blocks/day (varies by activity)
|
|
Storage/year: ~10-100 MB for active installation
|
|
```
|
|
|
|
### Indexing
|
|
|
|
Secondary indexes for fast lookups:
|
|
|
|
```typescript
|
|
// Plant ID → Block indices
|
|
plantIndex: Map<string, number[]>
|
|
|
|
// User ID → Block indices
|
|
userIndex: Map<string, number[]>
|
|
|
|
// Location → Block indices (geohash)
|
|
locationIndex: Map<string, number[]>
|
|
```
|
|
|
|
## Security
|
|
|
|
### Tamper Resistance
|
|
|
|
1. **Hash Chain** - Altering any block changes all subsequent hashes
|
|
2. **Proof of Work** - Expensive to recompute chain
|
|
3. **Distributed Copies** - Multiple users hold chain copies
|
|
4. **Signature Support** - Optional digital signatures
|
|
|
|
### Attack Resistance
|
|
|
|
| Attack | Defense |
|
|
|--------|---------|
|
|
| Data tampering | Hash verification fails |
|
|
| Chain rewrite | PoW cost prohibitive |
|
|
| Fake blocks | Signature verification |
|
|
| Replay | Timestamps + indices |
|
|
|
|
## Best Practices
|
|
|
|
### For Developers
|
|
|
|
1. **Validate on load** - Always verify chain integrity
|
|
2. **Backup regularly** - Export chain to JSON
|
|
3. **Monitor growth** - Archive old blocks if needed
|
|
4. **Index selectively** - Only index what you query
|
|
|
|
### For Operators
|
|
|
|
1. **Set appropriate difficulty** - Balance speed vs security
|
|
2. **Backup before updates** - Chain is your source of truth
|
|
3. **Monitor disk space** - Plan for growth
|
|
4. **Test restores** - Verify backups work
|
|
|
|
## Future Considerations
|
|
|
|
- **Distributed Consensus** - Multi-node verification
|
|
- **Sharding** - Geographic or species-based partitions
|
|
- **Merkle Trees** - Efficient verification
|
|
- **Zero-Knowledge Proofs** - Privacy-preserving verification
|