Package Relay (BIP331)
Overview
Package Relay (BIP331) enables nodes to relay and validate groups of transactions together as atomic units. This is particularly useful for fee-bumping (RBF) transactions, CPFP (Child Pays For Parent) scenarios, and atomic transaction sets.
Specification: BIP 331
Architecture
Package Structure
A transaction package contains:
#![allow(unused)]
fn main() {
pub struct TransactionPackage {
pub transactions: Vec<Transaction>, // Ordered: parents first
pub package_id: PackageId,
pub combined_fee: u64,
pub combined_weight: usize,
}
}
Code: package_relay.rs
Package ID
Package ID is calculated as double SHA256 of all transaction IDs:
#![allow(unused)]
fn main() {
pub fn from_transactions(transactions: &[Transaction]) -> PackageId {
let mut hasher = Sha256::new();
for tx in transactions {
let txid = calculate_txid(tx);
hasher.update(txid);
}
let first = hasher.finalize();
let mut hasher2 = Sha256::new();
hasher2.update(first);
PackageId(final_hash)
}
}
Code: package_relay.rs
Validation Rules
Size Limits
- Maximum Transactions: 25 (BIP331 limit)
- Maximum Weight: 404,000 WU (~101,000 vB)
- Minimum Fee Rate: Configurable (default: 1 sat/vB)
Code: package_relay.rs
Ordering Requirements
Transactions must be ordered with parents before children:
- Each transaction’s inputs that reference in-package parents must reference earlier transactions
- Invalid ordering results in
InvalidOrderrejection
Code: package_relay.rs
Fee Calculation
Package fee is calculated as sum of all transaction fees:
#![allow(unused)]
fn main() {
combined_fee = sum(inputs) - sum(outputs) for all transactions
}
Fee rate is calculated as:
#![allow(unused)]
fn main() {
fee_rate = combined_fee / combined_weight
}
Code: package_relay.rs
Use Cases
Fee-Bumping (RBF)
Parent transaction + child transaction that increases fee:
Package:
- Parent TX (low fee)
- Child TX (bumps parent fee)
CPFP (Child Pays For Parent)
Child transaction pays for parent’s fees:
Package:
- Parent TX (insufficient fee)
- Child TX (pays for parent)
Atomic Transaction Sets
Multiple transactions that must be accepted together:
Package:
- TX1 (depends on TX2)
- TX2 (depends on TX1)
Code: package_relay.rs
Package Manager
PackageRelay
The PackageRelay manager handles:
- Package validation
- Package state tracking
- Package acceptance/rejection
- Package relay to peers
Code: package_relay.rs
Package States
#![allow(unused)]
fn main() {
pub enum PackageStatus {
Pending, // Awaiting validation
Accepted, // Validated and accepted
Rejected { reason: PackageRejectReason },
}
}
Code: package_relay.rs
Rejection Reasons
#![allow(unused)]
fn main() {
pub enum PackageRejectReason {
TooManyTransactions,
WeightExceedsLimit,
FeeRateTooLow,
InvalidOrder,
DuplicateTransactions,
InvalidStructure,
}
}
Code: package_relay.rs
Validation Process
- Size Check: Verify transaction count ≤ 25
- Weight Check: Verify combined weight ≤ 404,000 WU
- Ordering Check: Verify parents before children
- Duplicate Check: Verify no duplicate transactions
- Fee Calculation: Calculate combined fee and fee rate
- Fee Rate Check: Verify fee rate ≥ minimum
- Structure Check: Verify valid package structure
Code: package_relay.rs
Network Integration
Package Messages
PackageRelay: Relay package to peersPackageAccept: Package accepted by peerPackageReject: Package rejected with reason
Code: package_relay_handler.rs
Handler Integration
The PackageRelayHandler processes incoming package messages:
- Receives package relay requests
- Validates packages
- Accepts or rejects packages
- Relays accepted packages to other peers
Code: package_relay_handler.rs
Configuration
[network.package_relay]
enabled = true
max_package_size = 25
max_package_weight = 404000 # 404k WU
min_fee_rate = 1000 # 1 sat/vB
Code: package_relay.rs
Benefits
- Efficient Fee-Bumping: Better fee rate calculation for packages
- Reduced Orphans: Reduces orphan transactions in mempool
- Atomic Validation: Package validated as unit
- DoS Resistance: Size and weight limits prevent abuse
- CPFP Support: Enables child-pays-for-parent scenarios
Components
The Package Relay system includes:
- Package structure and validation
- Package ID calculation
- Fee and weight calculation
- Ordering validation
- Package manager
- Network message handling
Location: blvm-node/src/network/package_relay.rs, blvm-node/src/network/package_relay_handler.rs