Locktime

TransactionLocktime
Structure
Version
4 bytes
Segwit (Optional)
Marker
1 byte
Flag
1 byte
Structure
Input Count
variable
Input Structure
Previous TXID
32 bytes
Output Index
4 bytes
ScriptSig Size
variable
ScriptSig
variable
Sequence
4 bytes
Structure
Output Count
variable
Output Structure
Amount
8 bytes
ScriptPubKey Size
variable
ScriptPubKey
variable
Structure
Witness
variable
Structure
Locktime
4 bytes

Size

4 bytes

Format

Little-Endian

Description

The block number or timestamp at which this transaction is unlocked.

Example

00000000

Byte Visualization

00
Byte 1
00
Byte 2
00
Byte 3
00
Byte 4

The locktime field is a 4-byte value that specifies the earliest time a transaction can be added to the blockchain.

Let's examine our transaction to understand this better:

SVG Image

In our example transaction, we can see the locktime value is 00000000. This means:

  • The transaction is valid immediately (can be included in the next block)
  • No timelock restrictions are applied
  • This is the most common locktime value used in Bitcoin transactions

Locktime Values

The interpretation of the locktime value depends on its range:

Locktime ValueInterpretation
0Transaction is valid immediately (most common)
< 500.000.000Interpreted as a block height
≥ 500.000.000Interpreted as a Unix timestamp

For example:

  • Locktime of 650000 means the transaction is invalid until block 650000
  • Locktime of 1640995200 means the transaction is invalid until January 1, 2022 (Unix timestamp)

Note

Locktime is only enforced if at least one input has a sequence number below 0xffffffff. If all inputs have sequence 0xffffffff, the locktime is ignored.

Implementation Example

Here's how you might parse a transaction's locktime:

python
def parse_locktime(raw_tx: bytes, offset: int = 0) -> tuple[int, int]:
    """
    Parse locktime from raw transaction bytes
    
    Args:
        raw_tx: Raw transaction bytes
        offset: Starting position in bytes
        
    Returns:
        (locktime, new_offset)
    """
    # Read 4 bytes for locktime
    locktime_bytes = raw_tx[offset:offset + 4]
    
    # Convert to integer (little-endian)
    locktime = int.from_bytes(locktime_bytes, 'little')
    
    return locktime, offset + 4

Use Cases

1. Time-Delayed Transactions

Locktime can be used to create transactions that only become valid in the future:

python
def create_future_tx(block_height: int) -> bytes:
    """Create a transaction valid only after specific block height"""
    tx = Transaction()
    # ... add inputs and outputs ...
    
    # Set locktime to future block
    tx.locktime = block_height
    
    # Must set sequence < 0xffffffff for locktime to be enforced
    for tx_in in tx.inputs:
        tx_in.sequence = 0xfffffffe
        
    return tx.serialize()

2. Escrow Transactions

Locktime can be used in escrow services where funds should only be released after a certain time:

python
def create_escrow_tx(release_time: int) -> bytes:
    """Create a transaction that releases funds at specific time"""
    tx = Transaction()
    # ... add inputs and outputs ...
    
    # Set locktime to future timestamp
    tx.locktime = release_time
    
    # Enable locktime enforcement
    for tx_in in tx.inputs:
        tx_in.sequence = 0xfffffffe
        
    return tx.serialize()

Historical Note

Locktime was originally intended to be used with sequence numbers for

"high-frequency trades" - a way to update transactions before they were mined.

Validation Rules

When validating a transaction with locktime:

  1. If all input sequences are 0xffffffff, locktime is ignored
  2. Otherwise:
    • If locktime < 500000000: Compare against current block height
    • If locktime ≥ 500000000: Compare against median time past (MTP)
  3. Transaction is invalid if current time/height is less than locktime

Warning

Using locktime for time-sensitive applications requires careful consideration of block time variance and potential network reorganizations.

Suggest Edits
View our public visitor count
Built with 🧡 by the Bitcoin Dev Project
We'd love to hear your feedback on this project?Give Feedback