# Module Integration System
## Overview
The module integration system provides a consistent, secure, and performant way for modules to integrate with the node. All modules follow the same integration pattern:
1. **IPC Communication**: Modules communicate via Unix domain sockets
2. **Event Subscription**: Modules subscribe to events they care about
3. **NodeAPI Access**: Modules access node functionality through the NodeAPI interface
4. **Configuration**: Modules receive configuration via ModuleContext and can react to ConfigLoaded events
5. **Process Isolation**: Each module runs in a separate process for security
## Integration Points
### 1. Module Lifecycle
Modules follow a standard lifecycle:
- **Load**: Module binary is discovered and loaded by ModuleManager
- **Initialize**: Module receives ModuleContext with config, data_dir, socket_path
- **Subscribe**: Module subscribes to events via `SubscribeEvents` IPC call
- **Start**: Module begins processing events and handling requests
- **Stop**: Module gracefully shuts down
- **Unload**: Module process is terminated
### 2. Event System
Modules subscribe to events they need:
```rust
// Example: blvm-governance subscribes to governance events
let event_types = vec![
EventType::GovernanceProposalCreated,
EventType::GovernanceForkDetected,
EventType::NewBlock,
EventType::ConfigLoaded, // React to config changes
];
client.subscribe_events(event_types).await?;
```
**Available Events:**
- **Blockchain Events**: NewBlock, ChainReorg, BlockValidationStarted, etc.
- **Mempool Events**: MempoolTransactionAdded, FeeRateChanged, etc.
- **Network Events**: PeerConnected, MessageReceived, etc.
- **Module Lifecycle**: ModuleLoaded, ModuleUnloaded, etc.
- **Configuration**: ConfigLoaded (NEW - allows modules to react to config changes)
- **Governance**: `GovernanceProposalCreated`, `GovernanceForkDetected`, webhook events, etc. (see `EventType` in `src/module/traits.rs`)
### 3. Configuration Integration
Modules can react to node configuration in two ways:
#### A. Initial Configuration (ModuleContext)
When a module is loaded, it receives a `ModuleContext` with:
- `module_id`: Unique identifier
- `config`: HashMap<String, String> from module's config.toml
- `data_dir`: Directory for module data
- `socket_path`: IPC socket path
#### B. ConfigLoaded Event (NEW)
Modules can subscribe to `ConfigLoaded` event to react to node configuration changes:
```rust
// Subscribe to ConfigLoaded event
let event_types = vec![EventType::ConfigLoaded];
client.subscribe_events(event_types).await?;
// In event loop:
match event {
ModuleMessage::Event(event_msg) => {
if event_msg.event_type == EventType::ConfigLoaded {
if let EventPayload::ConfigLoaded { changed_sections, config_json } = &event_msg.payload {
// React to config changes
if changed_sections.contains(&"governance".to_string()) {
// Reconfigure governance module
}
}
}
}
}
```
**ConfigLoaded Event Payload:**
- `changed_sections`: Vec<String> - Which config sections changed (e.g., ["network", "governance"])
- `config_json`: Option<String> - Full config as JSON (for modules that need it)
### 4. NodeAPI Integration
Modules access node functionality through NodeAPI:
```rust
let node_api = Arc::new(NodeApiIpc::new(ipc_client));
// Get blockchain data
let block = node_api.get_block(&hash).await?;
let height = node_api.get_block_height().await?;
// Get mempool data
let txs = node_api.get_mempool_transactions().await?;
// Get network stats
let stats = node_api.get_network_stats().await?;
```
**Available APIs:**
- **Blockchain API**: get_block, get_block_header, get_chain_tip, etc.
- **Mempool API**: get_mempool_transactions, get_fee_estimate, etc.
- **Network API**: get_network_stats, get_network_peers, etc.
- **Module API**: publish_event, call_module, etc.
### 5. Module-to-Module Communication
Modules can communicate with each other:
```rust
// Call another module
let response = node_api.call_module(
Some("blvm-mesh"),
"route_packet",
params,
).await?;
```
## Module-Specific Integration
### blvm-governance
**Integration Points:**
- Subscribes to: `GovernanceProposalCreated`, `GovernanceForkDetected`, `NewBlock`, `ConfigLoaded` (exact set may evolve; see `EventType`)
- Publishes: Governance webhook notifications
- Uses: NodeAPI for block data, network stats
**Configuration:**
- Reads `governance.webhook_url` and `governance.node_id` from node config
- Reacts to `ConfigLoaded` event to update webhook configuration
### blvm-mesh
**Integration Points:**
- Subscribes to: `PeerConnected`, `MessageReceived`, `NewBlock`, `ConfigLoaded`
- Publishes: Mesh routing events
- Uses: NodeAPI for network stats, peer information
**Configuration:**
- Reads mesh routing configuration from module config.toml
- Reacts to `ConfigLoaded` event for network config changes
### blvm-lightning
**Integration Points:**
- Subscribes to: `NewBlock`, `MempoolTransactionAdded`, `PaymentRequestCreated`, `ConfigLoaded`
- Publishes: Lightning payment events
- Uses: NodeAPI for blockchain data, mempool queries
**Configuration:**
- Reads Lightning provider configuration from module config.toml
- Reacts to `ConfigLoaded` event for payment config changes
### blvm-stratum-v2
**Integration Points:**
- Subscribes to: `NewBlock`, `BlockTemplateUpdated`, `ConfigLoaded`
- Publishes: Mining job events
- Uses: NodeAPI for block templates, mining stats
**Configuration:**
- Reads mining pool configuration from module config.toml
- Reacts to `ConfigLoaded` event for mining config changes
## Best Practices
1. **Event Subscription**: Subscribe only to events you need
2. **Configuration**: Use ModuleContext for initial config, ConfigLoaded for runtime changes
3. **Error Handling**: Always handle errors gracefully, don't crash the module
4. **Resource Management**: Clean up resources on shutdown
5. **Security**: Never trust input from other modules, validate all data
## Security Considerations
- **Process Isolation**: Modules run in separate processes
- **IPC Security**: Unix domain sockets with proper permissions
- **Permission System**: Modules have capabilities (read_blockchain, subscribe_events, etc.)
- **Sandboxing**: Filesystem sandboxing for module data directories
- **Signature Verification**: Modules can be signed and verified
## Performance Considerations
- **Event Batching**: Events are published asynchronously, non-blocking
- **IPC Efficiency**: Unix domain sockets are fast for local communication
- **Resource Limits**: Modules have CPU, memory, and filesystem limits
- **Lazy Loading**: Modules are loaded on-demand
## Future Enhancements
- **Module Registry**: P2P module discovery and installation
- **Module Dependencies**: Modules can depend on other modules
- **Module Versioning**: Support for module versioning and updates
- **Module Metrics**: Built-in metrics collection for modules