gossip-observer: Bitcoin Lightning Network P2P traffic capture, timing data, and related metadata
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 outputform, 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 frompeer, 2 = sent topeer.orig_timestamp(UINTEGER, Unix seconds): the BOLT 7timestampfield, for node_announcement and channel_update only.
- messages:
hash,rawandfirst_seen.rawis the message body without its 2-byte type prefix; the type ismetadata.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_hashmapping, plusfirst_seen. - message_first_seen:
hashandfirst_seen, the earliest time any collector saw the message. Themessages,metadataandmessage_hashesfiles are split by day on this column. So a message is in the file for the day it was first seen, even whentimingsrows 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=2rows 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=2rows 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=2timing. Joinmetadata.scidtocollectors.csvscidfor channel gossip, andmetadata.orig_nodetocollectors.csvpubkeyfor node_announcements. - Anchor propagation measurements on
message_first_seen.first_seenanddir=1rows.
dir=2rows exist only for peers that have stayed connected for at least 10 minutes. The number of distinctdir=2peers 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=2with nodir=1receipts 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