mirror of
https://github.com/sonr-io/sonr.git
synced 2026-08-02 17:31:39 +00:00
156 lines
3.5 KiB
Plaintext
156 lines
3.5 KiB
Plaintext
---
|
|||
|
|
title: "DWN Plugin Architecture"
|
||
|
|
description: "Deep dive into the Decentralized Web Node (DWN) plugin system and integration"
|
||
|
|
sidebarTitle: "WASM Architecture"
|
||
|
|
icon: "puzzle"
|
||
|
|
---
|
||
|
|
|
||
|
|
# DWN Plugin Architecture
|
||
|
|
|
||
|
|
The Sonr project implements a flexible and secure plugin system for Decentralized Web Nodes (DWN), enabling modular and extensible functionality.
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
The plugin architecture is designed to:
|
||
|
|
|
||
|
|
- Support dynamic loading of WebAssembly (WASM) plugins
|
||
|
|
- Provide a standardized interface for plugin interactions
|
||
|
|
- Enable secure, isolated execution of plugins
|
||
|
|
|
||
|
|
## Core Components
|
||
|
|
|
||
|
|
### Plugin Manager
|
||
|
|
|
||
|
|
The `PluginManager` manages plugin lifecycle and interactions:
|
||
|
|
|
||
|
|
```go
|
||
|
|
type PluginManager struct {
|
||
|
|
plugins map[string]Plugin
|
||
|
|
actors map[string]Actor
|
||
|
|
}
|
||
|
|
|
||
|
|
type Plugin interface {
|
||
|
|
Initialize(config map[string]any) error
|
||
|
|
Execute(method string, payload []byte) ([]byte, error)
|
||
|
|
Close() error
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Plugin Configuration
|
||
|
|
|
||
|
|
Plugins are configured through a structured configuration:
|
||
|
|
|
||
|
|
```go
|
||
|
|
type PluginConfig struct {
|
||
|
|
ID string // Unique plugin identifier
|
||
|
|
Type string // Plugin type (e.g., "motor", "crypto")
|
||
|
|
Path string // WASM module path
|
||
|
|
Environment map[string]any // Plugin-specific environment variables
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Loading and Initializing Plugins
|
||
|
|
|
||
|
|
### Basic Plugin Loading
|
||
|
|
|
||
|
|
```go
|
||
|
|
func (pm *PluginManager) LoadPlugin(config PluginConfig) error {
|
||
|
|
// Load WASM module
|
||
|
|
module, err := extism.Load(config.Path)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
// Initialize plugin
|
||
|
|
plugin := &WASMPlugin{
|
||
|
|
module: module,
|
||
|
|
config: config,
|
||
|
|
}
|
||
|
|
|
||
|
|
// Store in plugin registry
|
||
|
|
pm.plugins[config.ID] = plugin
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Actor-Based Plugin Management
|
||
|
|
|
||
|
|
```go
|
||
|
|
func (pm *PluginManager) CreateActor(pluginID string) (*Actor, error) {
|
||
|
|
plugin, exists := pm.plugins[pluginID]
|
||
|
|
if !exists {
|
||
|
|
return nil, errors.New("plugin not found")
|
||
|
|
}
|
||
|
|
|
||
|
|
actor := NewActor(plugin)
|
||
|
|
pm.actors[actor.ID] = actor
|
||
|
|
|
||
|
|
return actor, nil
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Plugin Execution Workflow
|
||
|
|
|
||
|
|
1. Plugin is loaded from WASM module
|
||
|
|
2. Configuration is applied
|
||
|
|
3. Plugin is initialized
|
||
|
|
4. Specific methods can be invoked through a standardized interface
|
||
|
|
|
||
|
|
### Example Plugin Execution
|
||
|
|
|
||
|
|
```go
|
||
|
|
func ExecutePluginMethod(pluginID, method string, payload []byte) ([]byte, error) {
|
||
|
|
plugin := pluginManager.plugins[pluginID]
|
||
|
|
return plugin.Execute(method, payload)
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration and Environment
|
||
|
|
|
||
|
|
### Plugin Environment Variables
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"motor_plugin": {
|
||
|
|
"enclave_config": { ... },
|
||
|
|
"chain_id": "sonr-testnet-1",
|
||
|
|
"log_level": "debug"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Error Handling and Logging
|
||
|
|
|
||
|
|
```go
|
||
|
|
type PluginError struct {
|
||
|
|
Code string
|
||
|
|
Message string
|
||
|
|
Details map[string]any
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Security Considerations
|
||
|
|
|
||
|
|
- WASM plugins run in an isolated sandbox
|
||
|
|
- Limited access to system resources
|
||
|
|
- Runtime restrictions prevent malicious behavior
|
||
|
|
- Cryptographic verification of plugin modules
|
||
|
|
|
||
|
|
## Plugin Types
|
||
|
|
|
||
|
|
1. **Crypto Plugins**: Cryptographic operations
|
||
|
|
2. **Motor Plugins**: MPC and token management
|
||
|
|
3. **DID Plugins**: Decentralized Identity operations
|
||
|
|
4. **Custom Plugins**: Application-specific extensions
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
- Keep plugins small and focused
|
||
|
|
- Use standardized interfaces
|
||
|
|
- Implement comprehensive error handling
|
||
|
|
- Validate all plugin inputs
|
||
|
|
- Monitor plugin performance
|
||
|
|
|
||
|
|
## Advanced Configuration
|
||
|
|
|
||
|
|
For advanced plugin configuration and deployment, refer to the [PDK Configuration Guide](/blockchain/modules/dwn/configuration).
|