Daily Crypto News & Musings

Bitcoin Transaction Fees Explained: Size, Weight, and Optimization

11 March 2026 Columns
Bitcoin Transaction Fees Explained: Size, Weight, and Optimization

Bitcoin’s transaction fee mechanism is a complex but essential component of the network’s security and economics. This article explores the technical details of how transaction sizes are calculated, how fees are determined, and practical strategies for fee optimization.

Understanding Transaction Size Fundamentals

Bitcoin transactions are measured in three different ways: raw bytes, weight units, and virtual bytes (vbytes). Each measurement serves a specific purpose in the network:

  • Bytes: The actual size of the transaction data
  • Weight Units: A measurement system introduced with SegWit that applies different multipliers to witness and non-witness data
  • Virtual Bytes (vbytes): A standardized unit derived from weight units to simplify fee calculations

Basic Transaction Structure

Every Bitcoin transaction consists of several components that contribute to its total size:

  • Version number (4 bytes)
  • Input counter (1-9 bytes)
  • Inputs (variable size)
  • Output counter (1-9 bytes)
  • Outputs (variable size)
  • Locktime (4 bytes)

Transaction Size Calculation

The size of a transaction depends primarily on the number and types of inputs and outputs. Here’s a breakdown of typical sizes:

Component Size (bytes)
P2PKH input 148
P2PKH output 34
P2WPKH input (witness) 68
P2WPKH output 31

Weight Units and the SegWit Discount

The introduction of Segregated Witness (SegWit) in 2017 fundamentally changed how transaction sizes are calculated. The weight unit system applies different multipliers to different parts of the transaction:

Transaction Weight = (Base Size × 4) + Witness Size

Where:
Base Size = Non-witness data
Witness Size = Signature data and other witness elements

This creates an effective 75% discount for witness data, allowing more transactions to fit in each block while maintaining backward compatibility.

Virtual Bytes (vbytes)

Virtual bytes provide a standardized way to express transaction size that accounts for the SegWit discount. The formula for converting weight units to vbytes is:

vbytes = weight units ÷ 4

Fee Calculation and Optimization

Transaction fees are typically expressed in satoshis per vbyte (sat/vB). The total fee is calculated by multiplying the transaction’s size in vbytes by the desired fee rate:

Total Fee = Size (in vbytes) × Fee Rate (sat/vB)

Fee Optimization Strategies

  • Use native SegWit addresses (starting with bc1) to benefit from the witness discount
  • Consolidate inputs during low-fee periods
  • Implement transaction batching for multiple payments
  • Consider using payment channels like Lightning for frequent small transactions

Input Types and Their Impact

Different input types have varying sizes and weight implications:

Input Type Raw Size Weight Units Virtual Bytes
Legacy P2PKH 148 bytes 592 148
P2SH-P2WPKH 91 bytes 164 41
Native P2WPKH 68 bytes 136 34

Security Considerations

When implementing fee calculation and optimization strategies, several security factors must be considered:

  • Always verify fee calculations client-side before broadcasting
  • Implement proper input selection to avoid dust attacks
  • Consider the privacy implications of input consolidation
  • Account for potential fee market volatility

Code Example: Basic Fee Calculator

function calculateFee(inputs, outputs, feeRate) {
    // Base transaction size
    let baseSize = 10; // Version + Input/Output count + Locktime
    
    // Add input sizes
    inputs.forEach(input => {
        if (input.type === 'P2PKH') {
            baseSize += 148;
        } else if (input.type === 'P2WPKH') {
            baseSize += 68;
        }
    });
    
    // Add output sizes
    outputs.forEach(output => {
        baseSize += 34; // Standard P2PKH output
    });
    
    // Calculate total fee
    return baseSize * feeRate;
}

Related Tools & Resources