FoldDB Economic Model
What is the Economic Model?
FoldDB's economic model creates a sustainable ecosystem through Lightning Network micropayments, trust-based pricing, and schema-driven access control. This model ensures fair compensation for data providers while maintaining security and privacy.
Key Components
The economic model consists of four primary configuration components:
Component | Description | Primary Responsibilities |
---|---|---|
GlobalPaymentConfig | System-wide payment settings | • Sets minimum system-wide base rate • Defines payment timeouts • Configures invoice retry limits • Sets hold invoice timeouts |
MarketRate | Current market pricing | • Provides base rate in satoshis • Tracks last update timestamp • Enables staleness detection • Supports dynamic rate updates |
SchemaPaymentConfig | Schema-level payment settings | • Applies multiplier to base rate • Sets minimum payment threshold • Provides schema-wide pricing control • Ensures minimum payment requirements |
FieldPaymentConfig | Field-specific payment settings | • Applies field-level multiplier • Configures trust distance scaling • Sets field-specific minimum payment • Enables granular pricing control |
How the Economic Model Works
Payment Flow
When a user requests data access, the system follows this payment sequence:
- Calculate required payment based on fields, trust distance, and configuration
- Generate Lightning Network invoice
- Wait for payment confirmation
- Process the data request upon payment settlement
- Handle payment timeouts, retries, or failures
graph LR
subgraph Request
U((User)) -->|Query Request| C[Calculate Payment]
C -->|Generate| I[Invoice]
I -->|Send to| U
end
subgraph Processing
U -->|Pay| L[Lightning Network]
L -->|Confirm| V[Verify Payment]
V -->|If Settled| P[Process Request]
V -->|If Failed| R[Retry/Timeout]
end
subgraph Response
P -->|Return Data| U
R -->|Error| U
end
Payment Calculation
The system calculates payments using this formula:
Final payment = max(
Global system base rate,
sum(
for each field:
Market base rate
* Schema multiplier
* Field multiplier
* Trust distance scaling factor
)
)
Trust distance scaling applies one of these formulas:
- Linear scaling:
scale_factor = max(slope * trust_distance + intercept, min_factor)
- Exponential scaling:
scale_factor = max(base^(scale * trust_distance), min_factor)
- No scaling:
scale_factor = 1.0
Implementation Features
1. Trust-Based Pricing
The system scales pricing based on trust distance:
- Lower trust distance - Lower cost for trusted relationships
- Higher trust distance - Higher cost for less trusted relationships
- Configurable scaling - Linear or exponential scaling options
- Safety bounds - Minimum scaling factors prevent underpricing
graph TD
subgraph Trust Scaling
T1[Trust Distance 1] -->|x1.0| Base[Base Cost]
T2[Trust Distance 2] -->|x1.5| Base
T3[Trust Distance 3] -->|x2.0| Base
end
subgraph Calculation
Base --> |Calculate| Total[Total Cost]
Schema[Schema Multiplier] --> |Multiply| Total
Field[Field Multiplier] --> |Multiply| Total
end
2. Lightning Network Integration
The system integrates with the Lightning Network through:
- Invoice generation - Creates payment requests with appropriate amounts
- Payment verification - Checks payment status with the Lightning node
- Hold invoices - Supports complex operations with payment holds
- Payment timeouts - Handles expired or timed-out payments
- Retry mechanisms - Supports payment retry attempts
3. Multi-Level Configuration
The system provides configuration at multiple levels:
- System-wide settings - Global minimum rates and timeouts
- Schema-level settings - Schema-specific multipliers and thresholds
- Field-level settings - Field-specific pricing and scaling
- Dynamic market rates - Adjustable base rates with staleness detection
Data Structures
Payment Configuration
The payment configuration includes these structures:
struct GlobalPaymentConfig {
system_base_rate: u64, // Minimum fee in satoshis
payment_timeout: Duration, // Payment timeout period
max_invoice_retries: u32, // Maximum retry attempts
hold_invoice_timeout: Duration // Hold invoice timeout
}
struct SchemaPaymentConfig {
base_multiplier: f64, // Multiplier for schema
min_payment_threshold: u64 // Minimum payment in satoshis
}
struct FieldPaymentConfig {
base_multiplier: f64, // Multiplier for field
trust_distance_scaling: TrustDistanceScaling,
min_payment: Option<u64> // Optional minimum payment
}
enum TrustDistanceScaling {
Linear {
slope: f64,
intercept: f64,
min_factor: f64 // Minimum scaling factor (>= 1.0)
},
Exponential {
base: f64,
scale: f64,
min_factor: f64 // Minimum scaling factor (>= 1.0)
},
None // No scaling (factor = 1.0)
}
Payment Processing
The payment processing includes these structures:
struct LightningPaymentRequest {
amount: u64, // Amount in satoshis
invoice: String, // Lightning invoice
expiry: DateTime<Utc>, // Expiration timestamp
payment_hash: String, // Payment identifier
hold_invoice: bool // Whether this is a hold invoice
}
struct PaymentState {
invoice_id: String, // Invoice identifier
status: PaymentStatus, // Current payment status
created_at: DateTime<Utc>, // Creation timestamp
last_checked: DateTime<Utc>, // Last check timestamp
retry_count: u32 // Number of retry attempts
}
enum PaymentStatus {
Pending, // Payment not yet received
Settled, // Payment completed
Expired, // Payment timed out
Failed, // Payment failed
PartiallyPaid(u64), // Partial payment received
Cancelled // Payment cancelled
}
Common Operations
Calculating Field Payment
To calculate payment for a single field:
- Validate trust distance is non-negative
- Apply base rate and multipliers
- Calculate trust distance scaling
- Apply minimum thresholds
- Validate final payment amount
fn calculate_field_payment(
global_config: &GlobalPaymentConfig,
market_rate: &MarketRate,
schema_payment: &SchemaPaymentConfig,
field_payment: &FieldPaymentConfig,
trust_distance: f64
) -> Result<u64, Error> {
// Validate trust distance
if trust_distance < 0.0 {
return Err(Error::InvalidTrustDistance);
}
// Apply base rate and multipliers
let base = market_rate.base_rate;
let schema_multiplier = schema_payment.base_multiplier;
let field_multiplier = field_payment.base_multiplier;
// Calculate trust distance scaling
let scale_factor = match &field_payment.trust_distance_scaling {
TrustDistanceScaling::Linear { slope, intercept, min_factor } => {
(slope * trust_distance + intercept).max(*min_factor)
},
TrustDistanceScaling::Exponential { base, scale, min_factor } => {
base.powf(scale * trust_distance).max(*min_factor)
},
TrustDistanceScaling::None => 1.0
};
// Calculate payment with all multipliers
let payment = (base as f64 * schema_multiplier * field_multiplier * scale_factor).round() as u64;
// Apply minimum thresholds
let field_min = field_payment.min_payment.unwrap_or(0);
let schema_min = schema_payment.min_payment_threshold;
let system_min = global_config.system_base_rate;
let final_payment = payment.max(field_min).max(schema_min).max(system_min);
// Validate final payment
global_config.validate_payment(final_payment)?;
Ok(final_payment)
}
Processing Payments
To process a payment:
- Generate an invoice for the required amount
- Send the invoice to the user
- Verify payment status periodically
- Process the request if payment is settled
- Handle timeouts, retries, or failures
async fn process_payment(
payment_manager: &PaymentManager,
amount: u64,
memo: String,
hold_invoice: bool
) -> Result<bool, Error> {
// Generate invoice
let invoice = payment_manager.generate_invoice(amount, memo, hold_invoice).await?;
// Wait for payment with periodic checks
let check_interval = Duration::from_secs(1);
payment_manager.wait_for_payment(&invoice, check_interval).await
}
Best Practices
Payment Configuration
Follow these practices for payment configuration:
- Set appropriate base rates for your data value
- Configure reasonable trust distance scaling
- Use minimum thresholds to prevent underpricing
- Set appropriate timeouts for your use case
- Configure retry limits based on expected payment behavior
Trust Distance Scaling
Follow these practices for trust distance scaling:
- Use linear scaling for predictable pricing
- Use exponential scaling for rapidly increasing costs
- Set appropriate minimum factors to prevent underpricing
- Test scaling with different trust distances
- Adjust scaling parameters based on user feedback
Payment Processing
Follow these practices for payment processing:
- Handle payment timeouts gracefully
- Implement appropriate retry mechanisms
- Clean up expired invoices regularly
- Monitor payment status for anomalies
- Provide clear payment instructions to users