Expand description
§rustywallet-multisig
Bitcoin multi-signature wallet utilities with Shamir Secret Sharing and MuSig2 support.
§Features
- Create M-of-N multisig wallets (up to 15-of-15)
- Generate P2SH, P2WSH, and P2SH-P2WSH addresses
- Sign and combine multisig transactions
- PSBT integration for hardware wallet interoperability
- MuSig2 key aggregation for Schnorr multisig
- Shamir Secret Sharing for key backup
§Quick Start
use rustywallet_multisig::prelude::*;
use rustywallet_keys::prelude::PrivateKey;
// Generate 3 keys
let key1 = PrivateKey::random();
let key2 = PrivateKey::random();
let key3 = PrivateKey::random();
let pubkeys = vec![
key1.public_key().to_compressed(),
key2.public_key().to_compressed(),
key3.public_key().to_compressed(),
];
// Create 2-of-3 multisig wallet
let wallet = MultisigWallet::from_pubkeys(2, pubkeys, Network::Mainnet).unwrap();
println!("P2SH address: {}", wallet.address_p2sh);
println!("P2WSH address: {}", wallet.address_p2wsh);
println!("P2SH-P2WSH address: {}", wallet.address_p2sh_p2wsh);§PSBT Integration
use rustywallet_multisig::{MultisigWallet, MultisigPsbtBuilder, Network};
use rustywallet_keys::prelude::PrivateKey;
let key1 = PrivateKey::random();
let key2 = PrivateKey::random();
let pubkeys = vec![
key1.public_key().to_compressed(),
key2.public_key().to_compressed(),
];
let wallet = MultisigWallet::from_pubkeys(2, pubkeys, Network::Mainnet).unwrap();
let mut builder = MultisigPsbtBuilder::new(wallet, 1);
// Each party signs
let sighash = [0u8; 32]; // Compute actual sighash
builder.sign_input(0, &sighash, &key1).unwrap();
builder.sign_input(0, &sighash, &key2).unwrap();
// Build final witness
let witness = builder.build_witness(0).unwrap();§MuSig2 Key Aggregation
use rustywallet_multisig::{MuSigKeyAgg, musig_to_p2tr_address, Network};
use rustywallet_keys::prelude::PrivateKey;
let key1 = PrivateKey::random();
let key2 = PrivateKey::random();
let pubkeys = vec![
key1.public_key().to_compressed(),
key2.public_key().to_compressed(),
];
// Aggregate keys for n-of-n Schnorr multisig
let key_agg = MuSigKeyAgg::new(pubkeys).unwrap();
// Get P2TR address
let address = musig_to_p2tr_address(&key_agg, Network::Mainnet).unwrap();
println!("MuSig P2TR address: {}", address);§Shamir Secret Sharing
use rustywallet_multisig::{split_secret, combine_shares};
// Split a 32-byte secret into 5 shares, requiring 3 to recover
let secret = [0x42u8; 32];
let shares = split_secret(&secret, 3, 5).unwrap();
// Recover with any 3 shares
let recovered = combine_shares(&shares[0..3]).unwrap();
assert_eq!(recovered, secret);Re-exports§
pub use error::MultisigError;pub use error::Result;pub use config::MultisigConfig;pub use address::MultisigWallet;pub use address::Network;pub use address::hash160;pub use address::sha256;pub use script::build_multisig_script;pub use script::parse_multisig_script;pub use signer::sign_p2sh_multisig;pub use signer::sign_p2wsh_multisig;pub use signer::PartialSignature;pub use combiner::combine_signatures;pub use combiner::CombinedSignatures;pub use shamir::split_secret;pub use psbt::MultisigPsbtBuilder;pub use psbt::PsbtPartialSig;pub use musig::MuSigKeyAgg;pub use musig::musig_to_p2tr_address;
Modules§
- address
- Multisig address generation.
- combiner
- Signature combination for multisig transactions.
- config
- Multisig configuration.
- error
- Error types for multisig operations.
- musig
- MuSig2 Schnorr multisig support
- prelude
- Prelude module for convenient imports.
- psbt
- PSBT integration for multisig wallets
- script
- Multisig script generation.
- shamir
- Shamir Secret Sharing implementation.
- signer
- Multisig transaction signing.