Published October 16, 2026 | Version 2026.09

gossip-observer: Bitcoin Lightning Network P2P traffic capture, timing data, and related metadata

  • 1. Chaincode Labs

Description

This dataset is a capture of Bitcoin Lightning Network (BOLT 7) gossip messages as seen by a set of instrumented Lightning nodes ("collectors"), with microsecond timestamps for each send and receive. It is meant for studying how the P2P network functions: propagation delay, latency, fanout, redundancy, and how peers behave during sync.

Collection

Each 'collector' is a modified LDK node that captures the gossip messages it sends to or receives from a peer. Recorded types are channel_announcement, node_announcement and channel_update, plus a small number of pings. Captured messages and timing data are exported daily to Parquet files. Collection and infrastructure code: github.com/jharveyb/gossip_observer.

This version covers 21 collectors running on 2 hosts near NYC. 7 collectors each own one or two public channels (see collectors.csv). Peers are selected by splitting the network into communities with a hierarchical stochastic block-modelling algorithm, assigning a collector to each community, and then randomly selecting peers from that community. The infrastructure targets a total of 700 connections right now.

Files

One ZIP per table per month, named {table}_{YYYY-MM}.zip. The Parquet files inside the ZIP are zstd-compressed. Unzipping all of them into one directory gives a Hive-partitioned tree:

v2/table={table}/year={YYYY}/month={MM}/{table}_{START}_{END}.parquet
v2/table={table}/year={YYYY}/month={MM}/MANIFEST.csv

Each Parquet file covers the half-open UTC day [START, END) and carries the key-value metadata format_version=2. MANIFEST.csv lists the path, size and MD5 of each Parquet file in that month.

collectors.csv lists every collector with:

  • its public key, a short id and its chain backend;
  • which collectors share a host (colocated_group);
  • the first and last timestamp it logged;
  • one row per public channel it owns: SCID as a u64 and in BOLT 7 block x tx x output form, counterparty public key, and the channel_announcement first seen time.

Tables

Messages are identified by hash, a XXH3-64 hash of the message's unpadded base64url text, stored as a UBIGINT. All timestamps are UTC.

  • timings (~90% of the data): one row per message, per sending peer, per direction.
    • net_timestamp (TIMESTAMPTZ, µs): time the collector logged the message.
    • hash, inner_hash (UBIGINT): message identifiers.
    • collector, peer (BLOB): 33-byte compressed node public keys.
    • dir: 1 = received from peer, 2 = sent to peer.
    • orig_timestamp (UINTEGER, Unix seconds): the BOLT 7 timestamp field, for node_announcement and channel_update only.
  • messages: hash, raw and first_seen. raw is the message body without its 2-byte type prefix; the type is metadata.type. Prepend the type to decode it with a standard BOLT 7 parser.
  • metadata:
    • hash, inner_hash;
    • type: 1 = channel_announcement, 2 = node_announcement, 3 = channel_update, 4 = ping, 5 = pong;
    • size: wire bytes;
    • orig_node: the announcing node's public key, for node_announcement only;
    • scid: short channel ID as a u64, for channel messages only;
    • first_seen.
  • message_hashes: outer_hash → inner_hash mapping, plus first_seen.
  • message_first_seen: hash and first_seen, the earliest time any collector saw the message. The messages, metadata and message_hashes files are split by day on this column. So a message is in the file for the day it was first seen, even when timings rows for it fall on later days.

inner_hash is an XXH3-64 hash of the message's unsigned contents, leaving out the timestamp field. A node that re-signs and rebroadcasts the same node_announcement or channel_update with only a newer timestamp therefore produces a new hash but the same inner_hash.

Interpretation notes

  • dir=2 rows are mostly not relays or originations. Each row is one message the collector sent directly to one peer. Nearly all of them are the collector serving gossip during a peer's graph sync, so their timestamps are serve times, not creation times.
    • The collector's broadcasts are not recorded. That covers relaying others' gossip and the first broadcast of its own channel_updates and node_announcements.
    • A collector's own messages show up as dir=2 rows in two ways: when a channel_update is sent directly to that channel's counterparty, close to when it was created; and later, as sync serves to other peers.
    • To study origination, select a collector's own messages instead of using dir=2 timing. Join metadata.scid to collectors.csv scid for channel gossip, and metadata.orig_node to collectors.csv pubkey for node_announcements.
    • Anchor propagation measurements on message_first_seen.first_seen and dir=1 rows.
  • dir=2 rows exist only for peers that have stayed connected for at least 10 minutes. The number of distinct dir=2 peers is therefore a count of stable peers, not total fanout.
  • Peers drop a channel_update for a channel they don't yet know about. An update with no preceding announcement can therefore appear as dir=2 with no dir=1 receipts at other collectors.

Reading the data

Use one glob per table; the five tables have different schemas. For example, in DuckDB:

SELECT * FROM read_parquet('v2/table=timings/**/*.parquet', hive_partitioning = true);

A glob across tables gives no error for count(*); it silently adds up all five tables. With hive_partitioning = true, table, year and month become virtual columns. table is a reserved word, and month is a zero-padded string. Reference queries and loaders are in analysis/ in the repository.

A single day of timings is about 140 million rows. Multi-day queries that group by hash can need tens of GB of memory. An example Python script that analyzes the data using SQL and DuckDB can be found here: https://github.com/jharveyb/gossip_observer/blob/main/analysis/parquet_queries.py.

Files

collectors.csv

Files (132.9 GB)

Name Size
md5:cd1fef12d4fc12fea7504ba1c91051b0
4.6 kB Preview Download
md5:9b84b4bd320d74c20d8ad6aafb43074d
128.5 MB Preview Download
md5:fd8c5fb85b73e5e2dc90470508fb0f2a
161.0 MB Preview Download
md5:63b3f70f0acedaf1736bed3fe08b6ffd
157.4 MB Preview Download
md5:beac0c16b1b9bbd15aae5f41c0debc42
154.4 MB Preview Download
md5:e06978c82e82a3778fee7e85f6d79bdd
149.6 MB Preview Download
md5:b4b0e75b88c562db96ed67a15886eadc
163.5 MB Preview Download
md5:72476964d04ba21f2f17ca69af863710
153.1 MB Preview Download
md5:131d809f059abb5662527a25698fa3cc
123.4 MB Preview Download
md5:4d49d6c372d0f9466ad5e5b6661bc708
182.6 MB Preview Download
md5:0d76b6adc88a3a8a0848689ee819196f
224.4 MB Preview Download
md5:5792c58b4ef08dc706ea8f3b0002e11b
219.5 MB Preview Download
md5:23bbaecc56f6ab84c7c97739657bec51
215.6 MB Preview Download
md5:f30ebef5698dc0786f846ea241fbf1eb
209.1 MB Preview Download
md5:8113d282ef72f0867360f4e4dc3bfa00
227.3 MB Preview Download
md5:69a6219031f7b77140cec2a1eaccec55
212.5 MB Preview Download
md5:2bae15cf3103cd8a74920aa92ffea454
170.2 MB Preview Download
md5:d36c14955a4b94130a679729fa9b73d9
1.2 GB Preview Download
md5:90e983106538239c79326220d59f1d8c
1.4 GB Preview Download
md5:a2707d1692d052780f0c27cdc0f671b0
1.4 GB Preview Download
md5:20c904e2f21d1e109b58acdf9290e676
1.3 GB Preview Download
md5:8e1b54b3dba72c73a8be429f70fd2f4d
1.3 GB Preview Download
md5:979c676db8d2ff5641035ba52633c67a
1.4 GB Preview Download
md5:1b5bceed3e195799c179ca517e82de43
1.3 GB Preview Download
md5:dc0080ce686a652860fa13fa6c0b47e5
1.0 GB Preview Download
md5:d85f4188a9bee6f3867d422267455766
224.7 MB Preview Download
md5:f88eef000662d33f8f3319e69f8357db
274.3 MB Preview Download
md5:98fd624c1251d74c7a8c9341a01751d5
267.3 MB Preview Download
md5:98a3db0153937a05e1860f47350d942a
262.7 MB Preview Download
md5:abeeb15b17c2bb47d8b8076d66c86bef
254.6 MB Preview Download
md5:80a0fae3f23ad4d4e917e5ff441a8c43
277.1 MB Preview Download
md5:7e983fe7485f5fba5c64871f63ea1f78
257.6 MB Preview Download
md5:cf21158155b27fed3fae92f86176f48a
207.3 MB Preview Download
md5:8a9464434bfed100a9c1bf2b73c21695
11.6 GB Preview Download
md5:b590b4dd24092bf389697991dbd4f148
15.1 GB Preview Download
md5:dbb15f3e0fbd0456efd73f7b32fea383
15.6 GB Preview Download
md5:1796e2e5493acb253c858ee06cdbb9db
15.4 GB Preview Download
md5:cfe8e65f7699729f55e80cc4481ec6f1
15.3 GB Preview Download
md5:e9eb15c7ec910cc7b9ce899eb7196c16
17.2 GB Preview Download
md5:a5dd389e4f45a1d039ec9012b7a70fa1
15.1 GB Preview Download
md5:f2a3972d441cdcee565bdbec0e3bf2be
12.4 GB Preview Download

Additional details

Dates

Collected
2026-02-05/2026-09-30

Software

Repository URL
https://github.com/jharveyb/gossip_observer/
Programming language
Rust , Python , SQL
Development Status
Active