Keymaster Multisig Rust Library
Rust v4 implementation of the Keymaster Multisig library using native Rust cryptography and WebAssembly bindings.
Features
- Multi-signature Support: Create M-of-N multi-signature scripts
- Script Generation: Generate P2MS (Pay-to-Multi-Signature) locking scripts
- Signature Creation: Generate individual and combined signatures
- Arbitrated Pool: Buyer/Seller/Arbiter v4 funding, state, signing, verification, and merge APIs
- Cross-Validation: Byte-compatible with the TypeScript and Go implementations
- WASM Support: Can be compiled to WebAssembly for browser usage
Usage
Basic Multisig Creation
use *;
// Create public keys
let public_keys = vec!;
// Create private keys
let private_keys = vec!;
// Create 2-of-3 multisig
let multisig = new.unwrap;
Generate Locking Script
// Generate the multi-signature locking script
let script = multisig.lock.unwrap;
println!;
Sign Transactions
// Create a transaction
let tx = new;
// Sign the transaction
let signatures = multisig.sign.unwrap;
Generate Single Signature
let signature = multisig.sign_one.unwrap;
Estimate Script Length
let estimated_length = multisig.estimate_length;
println!;
Build Signature Script
let signatures = vec!;
let script = multisig.build_sign_script.unwrap;
WebAssembly Usage
The library can be compiled to WebAssembly for use in browsers:
import init from './pkg/keymaster_multisig.js';
await ;
const publicKeys = ;
const privateKeys = ;
const multisig = ;
const lockingScript = multisig.;
Cross-Validation
This Rust implementation is designed to be fully compatible with the TypeScript and Golang implementations. The library produces identical outputs for:
- Locking scripts (P2MS format)
- Signature generation
- Script length estimation
- Signature script construction
Running Cross-Validation Tests
Building
Native Rust
WebAssembly
Testing
Run all tests:
Run specific test suites:
API Reference
Multisig
The main struct for creating and managing multi-signature operations.
Constructor
new
Methods
lock() -> Result<Vec<u8>, MultisigError>: Generate locking scriptsign(tx: &Transaction, input_index: usize) -> Result<Vec<Vec<u8>>, MultisigError>: Sign transactionsign_one(tx: &Transaction, input_index: usize, private_key: &PrivateKey) -> Result<Vec<u8>, MultisigError>: Generate single signatureestimate_length() -> usize: Estimate unlocking script lengthcreate_fake_sign() -> Result<Vec<u8>, MultisigError>: Create fake signature for estimationbuild_sign_script(signatures: &[Vec<u8>]) -> Result<Vec<u8>, MultisigError>: Build signature scriptget_m() -> usize: Get required signature countget_n() -> usize: Get total public key countget_sig_hash_type() -> u8: Get signature hash type
Error Types
InvalidPublicKeys: Invalid number of public keysNoPrivateKeys: Private keys not supplied when requiredInvalidM: Invalid m value (must be between 1 and n)EmptyPreviousTx: Previous transaction is emptySignatureError: Error during signature generationTransactionError: Invalid transaction data
Dependencies
wasm-bindgen: For WebAssembly supportserde: For serialization/deserializationserde-wasm-bindgen: For WASM-specific serde integrationthiserror: For error handlinghex: For hexadecimal encoding/decoding
License
MIT License
Contributing
Contributions are welcome! Please ensure all tests pass before submitting pull requests.