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;