Taproot Assets¶
Overview¶
Taproot Assets (formerly Taro) is a protocol for issuing assets on Bitcoin that leverages Taproot to enable scalable, private, and efficient asset transfers. Built by Lightning Labs, it allows for the creation and transfer of assets on Bitcoin and Lightning Network.
Features¶
- Bitcoin Native: Assets live directly on Bitcoin using Taproot
- Lightning Compatible: Instant asset transfers over Lightning Network
- Scalable: Efficient use of Bitcoin block space
- Private: Leverages Taproot privacy features
- Programmable: Smart contract capabilities through Tapscript
Configuration¶
Basic Configuration¶
use anya_core::layer2::taproot_assets::{TaprootAssetsConfig, TaprootAssetsClient};
let config = TaprootAssetsConfig {
network: "mainnet".to_string(),
lnd_host: "localhost:10009".to_string(),
tapd_host: "localhost:10029".to_string(),
tls_cert_path: "/path/to/tls.cert".to_string(),
macaroon_path: "/path/to/admin.macaroon".to_string(),
timeout_ms: 30000,
};
let client = TaprootAssetsClient::new(config);
Environment Variables¶
TAPROOT_ASSETS_NETWORK=mainnet
TAPROOT_ASSETS_LND_HOST=localhost:10009
TAPROOT_ASSETS_TAPD_HOST=localhost:10029
TAPROOT_ASSETS_TLS_CERT_PATH=/path/to/tls.cert
TAPROOT_ASSETS_MACAROON_PATH=/path/to/admin.macaroon
TAPROOT_ASSETS_TIMEOUT_MS=30000
Usage Examples¶
Asset Creation¶
use anya_core::layer2::{AssetParams, AssetTransfer};
// Create a new Taproot asset
let asset_params = AssetParams {
asset_id: "my_asset".to_string(),
name: "My Taproot Asset".to_string(),
symbol: "MTA".to_string(),
precision: 8,
total_supply: 21_000_000,
description: "A sample Taproot asset".to_string(),
};
let result = client.create_asset(asset_params).await?;
println!("Asset created: {:?}", result);
Asset Transfers¶
// Send Taproot assets over Lightning
let transfer = AssetTransfer {
from: "source_address".to_string(),
to: "destination_address".to_string(),
amount: 1000000, // amount in asset units
asset_id: "my_asset".to_string(),
memo: Some("Lightning asset transfer".to_string()),
};
let result = client.transfer_asset(transfer).await?;
println!("Asset transfer: {:?}", result);
Lightning Integration¶
// Create Lightning invoice for Taproot assets
let invoice_result = client.create_asset_invoice(
"my_asset".to_string(),
1000000, // amount
"Payment for services".to_string(), // memo
3600, // expiry in seconds
).await?;
println!("Asset invoice: {:?}", invoice_result);
// Pay Lightning invoice with Taproot assets
let payment_result = client.pay_asset_invoice(
"lntb1...".to_string(), // Lightning invoice
"my_asset".to_string(),
).await?;
Asset Discovery¶
// List all available assets
let assets = client.list_assets().await?;
for asset in assets {
println!("Asset: {} ({}) - Balance: {}",
asset.name, asset.symbol, asset.balance);
}
// Get asset details
let asset_info = client.get_asset_info("my_asset".to_string()).await?;
println!("Asset info: {:?}", asset_info);
API Reference¶
TaprootAssetsClient¶
Methods¶
new(config: TaprootAssetsConfig) -> 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>
list_assets() -> Result<Vec<AssetInfo>, Layer2Error>
get_asset_info(asset_id: String) -> Result<AssetInfo, Layer2Error>
create_asset_invoice(asset_id: String, amount: u64, memo: String, expiry: u64) -> Result<InvoiceResult, Layer2Error>
pay_asset_invoice(invoice: String, asset_id: String) -> Result<PaymentResult, Layer2Error>
verify_proof(proof: Proof) -> Result<VerificationResult, Layer2Error>
validate_transaction(tx_id: String) -> Result<ValidationResult, Layer2Error>
Configuration Options¶
Option | Type | Description | Default |
---|---|---|---|
network |
String | Network type (mainnet/testnet) | "mainnet" |
lnd_host |
String | LND gRPC host | "localhost:10009" |
tapd_host |
String | Taproot Assets daemon host | "localhost:10029" |
tls_cert_path |
String | Path to TLS certificate | "/path/to/tls.cert" |
macaroon_path |
String | Path to authentication macaroon | "/path/to/admin.macaroon" |
timeout_ms |
u64 | Request timeout in milliseconds | 30000 |
Asset Types¶
AssetInfo¶
pub struct AssetInfo {
pub asset_id: String,
pub name: String,
pub symbol: String,
pub precision: u8,
pub total_supply: u64,
pub balance: u64,
pub genesis_point: String,
pub asset_type: AssetType,
}
InvoiceResult¶
pub struct InvoiceResult {
pub payment_request: String,
pub payment_hash: String,
pub asset_id: String,
pub amount: u64,
pub expiry: u64,
}
PaymentResult¶
pub struct PaymentResult {
pub payment_hash: String,
pub payment_preimage: String,
pub status: PaymentStatus,
pub fee_sat: u64,
pub asset_id: String,
pub amount: u64,
}
Taproot Assets Protocol¶
Asset Issuance¶
- Genesis Output: Create genesis UTXO with asset metadata
- Merkle Tree: Construct Merkle tree of asset commitments
- Taproot Script: Embed asset commitments in Taproot script
- Bitcoin Transaction: Publish to Bitcoin blockchain
Asset Transfers¶
- Asset Inputs: Reference previous asset UTXOs
- Transfer Logic: Define transfer amounts and recipients
- Witness Data: Include asset proofs in transaction witness
- Settlement: Settle on Bitcoin or Lightning Network
Lightning Integration¶
- Channel Funding: Fund Lightning channels with Taproot assets
- HTLC Extensions: Extend HTLCs for multi-asset payments
- Atomic Swaps: Enable atomic swaps between different assets
- Routing: Route asset payments through Lightning Network
Security Considerations¶
Taproot Security¶
- Schnorr Signatures: Uses Schnorr signatures for efficiency and privacy
- Script Privacy: Taproot provides script privacy for asset logic
- Quantum Resistance: Preparation for post-quantum cryptography
Asset Security¶
- Proof Verification: Client-side validation of all asset proofs
- Double-Spend Prevention: Bitcoin's UTXO model prevents double-spending
- Cryptographic Commitments: Assets secured by cryptographic commitments
Lightning Security¶
- Channel Security: Lightning channel security applies to asset transfers
- Routing Privacy: Onion routing protects payment privacy
- Atomic Payments: All-or-nothing payment semantics
Best Practices¶
Development¶
- Test Thoroughly: Use testnet and regtest for development
- Proof Validation: Always validate asset proofs client-side
- Error Handling: Implement robust error handling for network issues
- Backup Management: Secure backup of asset keys and proofs
Asset Management¶
- Genesis Security: Secure the genesis key for asset issuance
- Supply Management: Carefully manage asset supply and issuance
- Metadata Standards: Follow emerging standards for asset metadata
- Version Control: Plan for protocol upgrades and compatibility
Lightning Integration¶
- Channel Management: Properly manage Lightning channel states
- Fee Management: Account for Lightning routing fees
- Liquidity Planning: Ensure sufficient channel liquidity
- Monitoring: Monitor channel and payment status
Troubleshooting¶
Common Issues¶
Connection Problems¶
// Test connectivity to services
match client.connect().await {
Ok(_) => println!("Connected to Taproot Assets daemon"),
Err(e) => println!("Connection failed: {}", e),
}
Asset Creation Failures¶
- Verify sufficient Bitcoin for on-chain fees
- Check asset parameters are valid
- Ensure proper permissions for asset creation
Transfer Issues¶
- Confirm sufficient asset balance
- Verify recipient address format
- Check Lightning channel capacity
Debugging¶
Enable debug logging:
RUST_LOG=anya_core::layer2::taproot_assets=debug cargo run
Support Resources¶
Examples¶
Complete Asset Ecosystem¶
use anya_core::layer2::taproot_assets::{TaprootAssetsConfig, TaprootAssetsClient};
use anya_core::layer2::{AssetParams, AssetTransfer};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize client
let config = TaprootAssetsConfig::default();
let mut client = TaprootAssetsClient::new(config);
// Connect to services
client.connect().await?;
// Create a new asset
let asset_params = AssetParams {
asset_id: "game_token".to_string(),
name: "Game Token".to_string(),
symbol: "GAME".to_string(),
precision: 2,
total_supply: 1_000_000,
description: "Gaming platform utility token".to_string(),
};
let asset_creation = client.create_asset(asset_params).await?;
println!("Game token created: {:?}", asset_creation);
// Create Lightning invoice for asset payment
let invoice = client.create_asset_invoice(
"game_token".to_string(),
10000, // 100.00 GAME tokens
"Premium upgrade".to_string(),
3600,
).await?;
println!("Payment invoice: {}", invoice.payment_request);
// Transfer assets to another user
let transfer = AssetTransfer {
from: "player1_address".to_string(),
to: "player2_address".to_string(),
amount: 500, // 5.00 GAME tokens
asset_id: "game_token".to_string(),
memo: Some("Reward for achievement".to_string()),
};
let transfer_result = client.transfer_asset(transfer).await?;
println!("Asset transfer completed: {:?}", transfer_result);
Ok(())
}
Integration Notes¶
- Compatible with existing Lightning Network infrastructure
- Supports atomic swaps with Bitcoin and other Taproot assets
- Integration with Bitcoin wallets through Taproot script paths
- Compatible with PSBT (Partially Signed Bitcoin Transactions) workflow