Skip to content

bitcoin-integration/bip353-rs

Repository files navigation

bip353-rs

Crates.io Documentation License

BIP-353 DNS Payment Instructions integration for Bitcoin applications.

Resolve human-readable Bitcoin addresses like [email protected] through DNS with full DNSSEC validation.

Quick Start

Add to your Cargo.toml:

[dependencies]
bip353-rs = "0.1.0"
tokio = { version = "1.30", features = ["rt-multi-thread", "macros"] }

Basic usage:

use bip353::Bip353Resolver;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let resolver = Bip353Resolver::new()?;
    
    // This works well with real addresses!
    match resolver.resolve_address("[email protected]").await {
        Ok(info) => {
            println!("✅ Resolved: {}", info.uri);
            println!("   Type: {:?}", info.payment_type);
            println!("   Reusable: {}", info.is_reusable);
        },
        Err(e) => println!("❌ Error: {}", e),
    }
    
    Ok(())
}

Features

  • 🔐 Security: Built on DNSSEC-validated DNS resolution
  • High Performance: Sub-2-second resolution, 0ms caching
  • 🌐 Multi-Language: Rust, C/C++ (FFI), and Python bindings
  • 🧪 Tested: Works with real BIP-353 addresses (try [email protected])
  • 📊 Observable: Built-in metrics and monitoring support

What is BIP-353?

BIP-353 allows Bitcoin users to receive payments using email-like addresses:

Working Example

# Install CLI tool to test
cargo install bip353-rs --features cli

# Test with a real working address
bip353 resolve [email protected]
# ✅ Resolution successful! (2037ms)
#    🔗 URI: bitcoin:bc1qztwy6xen3zdtt7z0vrgapmjtfz8acjkfp5fp7l
#    💳 Type: lightning-offer
#    🔄 Reusable: Yes

CLI Testing

Use the following tests to validate CLI functionality in 'real world examples'.

# Test the main example in the lib
cargo run --features cli --bin bip353 -- resolve [email protected]

# Test help system
cargo run --features cli --bin bip353 -- --help

# Test verbose output
cargo run --features cli --bin bip353 -- -v resolve [email protected]

# Test the benchmark
cargo run --features cli --bin bip353 -- benchmark [email protected]

# Test known working BIP-353 addresses
cargo run --features cli --bin bip353 -- test-known

# Test enhanced/extended features (e.g., safety checks, verbose metadata)
cargo run --features cli --bin bip353 -- test-enhanced [email protected]

API Overview

Basic Resolution

use bip353::Bip353Resolver;

let resolver = Bip353Resolver::new()?;
let result = resolver.resolve_address("[email protected]").await?;

With Configuration

use bip353::{Bip353Resolver, ResolverConfig};
use std::time::Duration;

let config = ResolverConfig::testnet()
    .with_dns_resolver("1.1.1.1:53".parse()?)
    .with_timeout(Duration::from_secs(10));

let resolver = Bip353Resolver::with_config(config)?;

With Caching and Metrics

let resolver = Bip353Resolver::with_enhanced_config(
    config,
    true, // enable cache
    Duration::from_secs(300), // 5 minute TTL
    true, // enable metrics
)?;

let result = resolver.resolve_with_safety_checks("user", "domain.com").await?;

Error Handling

use bip353::Bip353Error;

match resolver.resolve_address(address).await {
    Ok(info) => println!("Success: {}", info.uri),
    Err(Bip353Error::DnsError(msg)) => println!("DNS error: {}", msg),
    Err(Bip353Error::InvalidAddress(msg)) => println!("Invalid: {}", msg),
    Err(e) => println!("Other error: {}", e),
}

C/C++ Integration

Enable FFI bindings:

bip353-rs = { version = "0.1.0", features = ["ffi"] }
#include "bip353.h"

ResolverPtr* resolver = bip353_resolver_create();
Bip353Result* result = bip353_resolve_address(resolver, "[email protected]");

if (result->success) {
    printf("URI: %s\n", result->uri);
}

bip353_result_free(result);
bip353_resolver_free(resolver);

Python Integration

Enable Python bindings:

bip353-rs = { version = "0.1.0", features = ["python"] }
import bip353

resolver = bip353.PyResolver()
result = resolver.resolve_address("[email protected]")
print(f"URI: {result.uri}")

Performance

Real benchmark results with working address:

  • First resolution: ~2 seconds (DNS + DNSSEC validation)
  • Cached resolution: ~0ms (instant!)
  • Success rate: 100% for valid BIP-353 addresses
  • Memory usage: ~10MB runtime

Current BIP-353 Status

BIP-353 is very new (2024), so most addresses will fail resolution:

This is normal and expected. Your integration will be ready for when BIP-353 adoption grows!

Examples

The repository includes working examples:

  • Rust: cargo run --example basic_usage
  • C: cd examples/c && make test
  • Python: python3 examples/python/basic_example.py

Built On

This library builds on Matt Corallo's production-ready BIP-353 implementation:

Matt Corallo is the official proposer of BIP-353.

License

Licensed under MIT license