Liquid Network¶
Overview¶
The Liquid Network is a federated Bitcoin sidechain that enables confidential transactions, asset issuance, and advanced script capabilities through Elements opcodes. Anya Core provides full integration with Liquid Network for enhanced privacy and functionality.
Features¶
- Confidential Transactions: Hide transaction amounts while maintaining verifiability
- Asset Issuance: Create and manage digital assets on Bitcoin
- Fast Settlement: 1-minute block times with federated consensus
- Advanced Scripts: Enhanced scripting capabilities beyond Bitcoin Script
- Two-Way Peg: Secure movement of Bitcoin between networks
Configuration¶
Basic Configuration¶
use anya_core::layer2::liquid::{LiquidConfig, LiquidClient};
let config = LiquidConfig {
network: "mainnet".to_string(),
rpc_url: "https://liquid.network/rpc".to_string(),
confidential: true,
timeout_ms: 30000,
federation_pubkeys: vec![
"02142b5513b2bb94c35310618b6e7c80b08c04b0e3c26ba7e1b306b7f3fecefbfb".to_string(),
// ... additional federation keys
],
required_signatures: 11,
elementsd_path: "/usr/local/bin/elementsd".to_string(),
};
let client = LiquidClient::new(config);
Environment Variables¶
LIQUID_NETWORK=mainnet
LIQUID_RPC_URL=https://liquid.network/rpc
LIQUID_CONFIDENTIAL=true
LIQUID_TIMEOUT_MS=30000
LIQUID_ELEMENTSD_PATH=/usr/local/bin/elementsd
Usage Examples¶
Asset Management¶
use anya_core::layer2::{AssetParams, AssetTransfer};
// Create a new asset
let asset_params = AssetParams {
asset_id: "new_asset".to_string(),
name: "My Digital Asset".to_string(),
symbol: "MDA".to_string(),
precision: 8,
total_supply: 1_000_000,
description: "A sample digital asset".to_string(),
};
let result = client.create_asset(asset_params).await?;
println!("Asset created: {:?}", result);
Confidential Transactions¶
// Send confidential transaction
let transfer = AssetTransfer {
from: "sender_address".to_string(),
to: "receiver_address".to_string(),
amount: 50000,
asset_id: "L-BTC".to_string(),
memo: Some("Confidential payment".to_string()),
};
let result = client.transfer_asset(transfer).await?;
println!("Confidential transfer: {:?}", result);
Peg Operations¶
// Peg-in Bitcoin to Liquid
let peg_in_result = client.peg_in(
"bitcoin_txid".to_string(),
"liquid_address".to_string(),
100000, // satoshis
).await?;
// Peg-out Liquid Bitcoin back to Bitcoin
let peg_out_result = client.peg_out(
"bitcoin_address".to_string(),
100000, // satoshis
).await?;
API Reference¶
LiquidClient¶
Methods¶
new(config: LiquidConfig) -> Self
connect() -> Result<(), Layer2Error>
disconnect() -> Result<(), Layer2Error>
get_state() -> Result<ProtocolState, Layer2Error>
create_asset(params: AssetParams) -> Result<TransferResult, Layer2Error>
transfer_asset(transfer: AssetTransfer) -> Result<TransferResult, Layer2Error>
verify_proof(proof: Proof) -> Result<VerificationResult, Layer2Error>
validate_transaction(tx_id: String) -> Result<ValidationResult, Layer2Error>
peg_in(bitcoin_txid: String, liquid_address: String, amount: u64) -> Result<TransferResult, Layer2Error>
peg_out(bitcoin_address: String, amount: u64) -> Result<TransferResult, Layer2Error>
Configuration Options¶
Option | Type | Description | Default |
---|---|---|---|
network |
String | Network type (mainnet/testnet) | "mainnet" |
rpc_url |
String | RPC endpoint URL | "https://liquid.network/rpc" |
confidential |
bool | Enable confidential transactions | true |
timeout_ms |
u64 | Request timeout in milliseconds | 30000 |
federation_pubkeys |
Vec |
Federation signer public keys | Default keys |
required_signatures |
u32 | Minimum required signatures | 11 |
elementsd_path |
String | Path to Elements daemon | "/usr/local/bin/elementsd" |
Security Considerations¶
Federation Trust Model¶
- Liquid uses a federated consensus model with trusted functionaries
- Transactions require 11 of 15 federation signatures
- Federation members include major Bitcoin companies and exchanges
Confidential Transactions¶
- Uses Pedersen commitments for amount hiding
- Range proofs ensure no inflation
- Confidential assets maintain privacy without sacrificing verifiability
Peg Security¶
- Two-way peg secured by federation multisig
- Emergency recovery mechanisms in case of federation failure
- Regular audits of peg wallet reserves
Best Practices¶
Development¶
- Test on Testnet: Always test on Liquid testnet before mainnet deployment
- Monitor Federation: Keep track of federation status and health
- Handle Reorgs: Implement proper reorganization handling
- Backup Keys: Secure backup of all private keys and seed phrases
Production¶
- Monitor Connectivity: Implement health checks for RPC connectivity
- Error Handling: Robust error handling for network failures
- Rate Limiting: Respect RPC rate limits to avoid service disruption
- Security Updates: Keep Elements daemon updated
Troubleshooting¶
Common Issues¶
Connection Failures¶
// Check network connectivity
match client.connect().await {
Ok(_) => println!("Connected successfully"),
Err(e) => println!("Connection failed: {}", e),
}
Asset Creation Errors¶
- Verify sufficient L-BTC for fees
- Check asset parameters are valid
- Ensure proper permissions for asset issuance
Peg Operation Issues¶
- Confirm Bitcoin transaction has sufficient confirmations
- Verify Liquid address format is correct
- Check federation is operational
Debugging¶
Enable debug logging:
RUST_LOG=anya_core::layer2::liquid=debug cargo run
Support Resources¶
Examples¶
Complete Asset Workflow¶
use anya_core::layer2::liquid::{LiquidConfig, LiquidClient};
use anya_core::layer2::{AssetParams, AssetTransfer};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize client
let config = LiquidConfig::default();
let mut client = LiquidClient::new(config);
// Connect to network
client.connect().await?;
// Create asset
let asset_params = AssetParams {
asset_id: "company_shares".to_string(),
name: "Company Shares".to_string(),
symbol: "COMP".to_string(),
precision: 0,
total_supply: 1000,
description: "Company equity shares".to_string(),
};
let asset_result = client.create_asset(asset_params).await?;
println!("Asset created: {:?}", asset_result);
// Transfer asset
let transfer = AssetTransfer {
from: "issuer_address".to_string(),
to: "investor_address".to_string(),
amount: 100,
asset_id: "company_shares".to_string(),
memo: Some("Initial allocation".to_string()),
};
let transfer_result = client.transfer_asset(transfer).await?;
println!("Transfer completed: {:?}", transfer_result);
Ok(())
}
Integration Notes¶
- Compatible with all Bitcoin wallets through two-way peg
- Supports atomic swaps with other Layer2 protocols
- Integration with Lightning Network for instant payments
- Compatible with Bitcoin Script and enhanced Elements opcodes