Crate rustywallet_coinjoin

Crate rustywallet_coinjoin 

Source
Expand description

§rustywallet-coinjoin

CoinJoin and PayJoin (BIP78) utilities for rustywallet.

This crate provides tools for building privacy-enhancing Bitcoin transactions:

  • PayJoin (BIP78): Receiver contributes inputs to break common-input-ownership heuristic
  • CoinJoin: Multiple users combine transactions with equal outputs
  • Output Mixing: Shuffle and equalize outputs for privacy
  • Coordinator-less Protocol: P2P CoinJoin without central coordinator

§Quick Start

§PayJoin (BIP78)

use rustywallet_coinjoin::prelude::*;

// Receiver creates PayJoin request
let mut receiver = PayJoinReceiver::new(vec![0x00, 0x14], 100_000);
receiver.add_utxo(InputRef::from_outpoint([1u8; 32], 0, 50_000));

let request = receiver.create_request("cHNidP8...").unwrap();
println!("Receiver inputs: {}", request.receiver_inputs.len());

§CoinJoin Transaction

use rustywallet_coinjoin::prelude::*;

let mut builder = CoinJoinBuilder::new();

// Add participants
builder.add_participant_simple(
    "alice",
    vec![InputRef::from_outpoint([1u8; 32], 0, 100_000)],
    vec![0x00, 0x14, 0x01],
);
builder.add_participant_simple(
    "bob",
    vec![InputRef::from_outpoint([2u8; 32], 0, 100_000)],
    vec![0x00, 0x14, 0x02],
);

builder.set_output_amount(50_000);
let tx = builder.build().unwrap();

assert!(tx.verify_equal_outputs());

§Coordinator-less Session

use rustywallet_coinjoin::prelude::*;

// Create session
let mut session = CoinJoinSession::new(50_000);

// Participants join
let alice = Participant::new(
    "alice",
    vec![InputRef::from_outpoint([1u8; 32], 0, 100_000)],
    vec![0x00, 0x14],
);
session.join(alice).unwrap();

let bob = Participant::new(
    "bob",
    vec![InputRef::from_outpoint([2u8; 32], 0, 100_000)],
    vec![0x00, 0x14],
);
session.join(bob).unwrap();

// Build transaction
let tx = session.build_transaction().unwrap();

§Privacy Considerations

  • Use equal output amounts to maximize anonymity set
  • Shuffle inputs and outputs to hide ownership
  • Avoid unique change amounts that can be linked
  • Use standard denominations when possible

§Security

  • Verify all inputs before signing
  • Check fee calculations
  • Validate output amounts match expectations
  • Use commitments to prevent manipulation

Re-exports§

pub use builder::CoinJoinBuilder;
pub use builder::CoinJoinTransaction;
pub use coordinator::CoinJoinSession;
pub use coordinator::JoinResponse;
pub use coordinator::SessionAnnouncement;
pub use coordinator::SessionState;
pub use error::CoinJoinError;
pub use error::Result;
pub use mixer::analyze_privacy;
pub use mixer::find_best_denomination;
pub use mixer::OutputMixer;
pub use mixer::PrivacyAnalysis;
pub use payjoin::PayJoinProposal;
pub use payjoin::PayJoinReceiver;
pub use payjoin::PayJoinRequest;
pub use payjoin::PayJoinSender;
pub use types::FeeStrategy;
pub use types::InputRef;
pub use types::OutputDef;
pub use types::Participant;

Modules§

builder
CoinJoin transaction builder.
coordinator
Coordinator-less CoinJoin protocol.
error
Error types for CoinJoin operations.
mixer
Output mixing utilities.
payjoin
PayJoin (BIP78) implementation.
prelude
Prelude module for convenient imports.
types
Common types for CoinJoin operations.