OpenSats Work-Log 8
Saturday, January 31, 2026This is a copy of the 8th work-log I sent to OpenSats for my LTS grant.
Disclaimer: Some information that is not (or not yet) meant to be published may have been redacted.What did you work on?
In November and December 2025, and January of 2026, I primarily focused on building out peer-observer tooling and infrastructure, but also worked on mainnet-observer, posted to the Bitcoin Network Operations Collective, contributed to Bitcoin Core, helped in the rust-bitcoin corepc and bip324 libraries, and more.
Publications / Podcasts / Talks
- Attended the Chaincode Labs Bitcoin Research Week 2025 and led an participated in sessions there.
- Presented on the Chaincode Labs Bitcoin Research Day 2025 on “Monitoring Bitcoin’s P2P network: Insights from the peer-observer Project”
- Spoke with Stephan Livera about “Monitoring the Bitcoin Network” in SLP707: https://stephanlivera.com/episode/707/
Bitcoin Network Operations Collective
In the Bitcoin Network Operations Collective discourse forum I posted about:
- Waves of (bad) addresses being gossiped
- Increased b-msghand thread utilization due to many 352 byte runestone inscriptions on 2025-11-17
- Forward-compatible coinbase locktimes for BIP-54
- Bitcoin Core versions run by mining pools
- ViaBTC mining pool mines multiple blocks at same height
- AntPool mines two blocks at height 925051
- and commented on multiple other posts.
peer-observer
tooling (peer-observer/peer-observer)
- Added metrics for connections to and from bitprojects.io: peer-observer/peer-observer#300. These showed that there is indeed a problem as Bitcoin Core can make multiple outbound connections to the bitproject.io IPs operated by the same entity. See discussion in https://bnoc.xyz/t/many-connections-to-bitproject-io-nodes/40/6
- Add support for
inv_to_sendandcpu_loadfields fromgetpeerinfoto the peer-observer rpc-extractor in peer-observer/peer-observer#299.inv_to_sendmetrics allow tracking if a bug from the past is really fixed (see e.g. https://bnoc.xyz/t/increased-b-msghand-thread-utilization-due-to-many-352-byte-runestone-inscriptions-on-2025-11-17/58/6).cpu_loadis proposed in bitcoin/bitcoin#31672 and collecting data on it allows providing feedback on the usefulness of that metric. - Added support for
invandfeefiltermessages for the p2p-extractor peer-observer/peer-observer#297. These allow us to check when and how oftenfeefilterandinvmessages are send from our node and what contents are included. See e.g.WTx inv ratechart (and below) in https://bnoc.xyz/t/increased-b-msghand-thread-utilization-due-to-many-352-byte-runestone-inscriptions-on-2025-11-17/58/6 - Fixed addr service bit metrics to be 64 bit instead of 32 bit in peer-observer/peer-observer#294 and peer-observer/peer-observer#286
- Fixed peer-observer extractors and tools not exiting if a
RuntimeErroroccurred. They were still waiting for a Ctrl+C: peer-observer/peer-observer#292. - Added an event for received
addrv2messages to the p2p-extractor peer-observer/peer-observer#296. These are useful for showing metrics for, e.g., the size of the last address announcement the node sent, total number of addresses announced per announcement, rate of the announcements. Metrics were added in peer-observer/peer-observer#306. - Started a brainstorming issue for a better NATS subject for events from extractors to tools. This should allow using one NATS server for multiple nodes: peer-observer/peer-observer#313
- Improved peer-observer CI by adding a lint job (peer-observer/peer-observer#318, peer-observer/peer-observer#326) and splitting up the jobs to run in parallel peer-observer/peer-observer#325. Also updated the NixOS version in peer-observer/peer-observer#322
- Switched to using
addconnectionin the peer-observer integration tests, as this 1) made the tests faster (-addnodeis only re-executed every minute) and 2) makes the test more stable on slower test runners (such as GHA). peer-observer/peer-observer#324 - Added Grafana dashboards for some recently added metrics: peer-observer/peer-observer#317
- Added documentation for the required
websocket.jsonfile describing the available websocket endpoints of the websocket tool. peer-observer/peer-observer#311 - Added a overview HTML page for the websocket tools peer-observer/peer-observer#310
- Cleaned up the protobuf definitions in peer-observer/peer-observer#305 which is required for e.g. the archiver tool which requires a stable protobuf API.
- Started a discussion on how to best parse Bitcoin Core debug.logs for a the log-extractor in peer-observer/peer-observer#336. Discussing ML methods and literature, but also code based ways of extracting log statements and their arguments.
- I added support for authenticated NATS to peer-observer in peer-observer/peer-observer#337 and to my NixOS module in 0xB10C/nix#282. This allows me to open a NATS server to the outside world without authentication for subscribers, but authentication required for publishers. This enables sharing a data stream of NATS events to external contributors, e.g. as part of the Vinteum residency, BOSS programm, B4OS, or other developer education programs.
- Added support for
getorphantxsfor therpc-extractorin peer-observer/peer-observer#340 to allow having metrics for the transaction orphanage. - Added support the
getrawaddrmanto therpc-extractorin peer-observer/peer-observer#345. This allows tracking e.g. addrman changes in metrics. - Updated the LinkingLion IPs to the new 2026 IPs they seem to use now (https://bnoc.xyz/t/linkinglion-an-entity-linking-bitcoin-transactions-to-ips/12/11) in peer-observer/peer-observer#335.
infrastructure library (peer-observer/infra-library)
- Upgraded to NixOS 25.11: peer-observer/infra-library#36
- Upgraded the default Bitcoin Core master commit used: peer-observer/infra-library#32 and peer-observer/infra-library#67
- Allow custom Bitcoin Core P2P ports: peer-observer/infra-library#29
- Fixed intermittent integration test failures: peer-observer/infra-library#26
- Added a CI job that opens an auto-update PR for my nix flake (containing the peer-observer package and module) each day, if there’s an update available. peer-observer/infra-library#23 and TODO
- Added support for the new log-extractor in peer-observer/infra-library#40 and 0xB10C/nix#247
Bitcoin Core
bitcoin/bitcoin
- Reviewed the tracepoint changes in bitcoin/bitcoin#33680
- Posted a bit of data for the
cpu_loadPR: bitcoin/bitcoin#31672 - Opened an issue for (too) frequent PCP warnings: bitcoin/bitcoin#34114
- Fixed a minor log rate-limiting bug of a log message in bitcoin/bitcoin#34008
- Added a functional test for the IP address self-announcement feature of Bitcoin Core, which previously didn’t have any test coverage, while playing an essential part in nodes on the network being able find others: bitcoin/bitcoin#34039. The test had a bug which caused it to intermittently fail, which only appeared on the CI runners. I fixed this in bitcoin/bitcoin#34204.
- Made sure that IP address self-announcements are sent in a separate message first: bitcoin/bitcoin#34146
bitcoin-core/guix.sigs
Build and uploaded signed GUIX signatures for the following releases and release candidates:
- v29.3rc1 bitcoin-core/guix.sigs#2164
- v29.3rc2 bitcoin-core/guix.sigs#2180
- v30.1rc1 bitcoin-core/guix.sigs#2073
- v30.1 release bitcoin-core/guix.sigs#2104, bitcoin-core/guix.sigs#2087
- v30.2rc1 bitcoin-core/guix.sigs#2115
- v30.2 release bitcoin-core/guix.sigs#2149
0xb10c/mainnet-observer
- added a chart for signature counts of Schnorr and ECDSA: 0xB10C/mainnet-observer#97
- fixed a the extension of the downloaded png files to be
.pngand not.png.png: 0xB10C/mainnet-observer#99 - reviewed PR adding support for tracking ephemeral dust: 0xB10C/mainnet-observer#103 and added charts for it in 0xB10C/mainnet-observer#119
- added a chart for BIP-54 Consensus Cleanup locktimes set by mining pools 0xB10C/mainnet-observer#112. Since all pools need to be forward-compatible with BIP-54, tracking the share of hashrate being forward-compatible is interesting. Sadly, no pools are forward compatible yet (as of writing). See https://mainnet.observer/charts/transactions-coinbase-locktime-bip54/. At the same time, it’s interesting to track what percentage of hashrate sets a non-BIP-54 locktime on in their coinbase transaction: https://mainnet.observer/charts/transactions-coinbase-locktime/
- Added a Cumulative OP_RETURN bytes chart in 0xB10C/mainnet-observer#111. See https://mainnet.observer/charts/outputs-cumulative-opreturn-data-bytes/.
- Added a
stats_versionto improve 1) re-scanning of blocks when we add or change a stat and 2) make sure we have all blocks in the database, by improving the way we determine which blocks to insert: 0xB10C/mainnet-observer#113. This uncovered a bug in the database insertion, which I fixed in 0xB10C/mainnet-observer#120. - Beefed up the CI a bit in 0xB10C/mainnet-observer#116 and added linting support. As part of this, addressed all linter warnings first 0xB10C/mainnet-observer#115.
- Added a chart and a table for ephemeral dust usage in 0xB10C/mainnet-observer#119 and for P2A in 0xB10C/mainnet-observer#123. See https://mainnet.observer/charts/mining-pools-mining-p2a/ and https://mainnet.observer/charts/mining-pools-mining-ephemeral-dust/. These were requested by people working on LN implementations using P2A and ephemeral anchors. This was also useful for https://bnoc.xyz/t/bitcoin-core-versions-run-by-mining-pools/57/5.
- Reviewed PRs by contributors (thank you!):
- Coinbase output type and count stats: 0xB10C/mainnet-observer#118
- Fix: add bzip2.dev and clippy to shell.nix: 0xB10C/mainnet-observer#108
- Total number of inputs and outputs by script type over time: 0xB10C/mainnet-observer#107
- Add OP_RETURN bytes chart: 0xB10C/mainnet-observer#106
- Update type name order of segwit inputs: 0xB10C/mainnet-observer#105
- add: track ephemeral dust 0xB10C/mainnet-observer#103
misc
rust-bitcoin/bip324
I plan to use this library in an upcoming project. Playing around with it to test it, fixing some low-hanging bugs, and getting more familiar with it made sense.
- I noticed a bug where reading on a closed bip324 connection (e.g. the other side went offline), didn’t produce an error. This was a bug in the implementation and I fixed it in: rust-bitcoin/bip324#160. I also added a integration test for coverage of this bug in the async code.
- I ported that test to the sync code (from async) and added it in rust-bitcoin/bip324#163.
- I went ahead and picked up an issue to update the bip324 test vectors from the BIP in the bip324 library in rust-bitcoin/bip324#162.
nixos/nixpkgs
- I updated Bitcoin Core from v30.1 to v30.2 shortly after release NixOS/nixpkgs#478769. Bitcoin Core v30.0 and v30.1 had a wallet bug, so getting the update in quickly was a priority.
0xb10c/nix
Next to keeping my packages up-to-date and maintaining existing packages and modules, I also:
- added a new package and module for @jamesob’s discourse-archive in 0xB10C/nix#283 to be able to automatically backup delvingbitcoin.org and bnoc.xyz discourse instances.
rust-bitcoin/corepc
I use rust-bitcoin/corepc in some of my monitoring tools, so it makes sense to spent some of my time adding features & tests, reporting bugs, and implementing fixes.
- Added support for the hidden
getorphantxsRPC to corepc along with integration test rust-bitcoin/corepc#435. This RPC is needed for peer-observer: peer-observer/peer-observer#340. - Added support for Bitcoin Core v30.2 and use it in integration tests. v30.x wasn’t covered by integration tests before rust-bitcoin/corepc#469.
- Reported a bug that the
GetMempoolInfomodel FeeRate conversion is broken with a clear reproducer: rust-bitcoin/corepc#482
0xb10c/github-metadata-backup
- 0xB10C/github-metadata-backup#11: Reviewed and tested a contribution that added support for saving incremental progress on failure.
- 0xB10C/github-metadata-backup#13: Reviewed and tested a contribution that mitigated some backup failures when an issue or PR has not-yet-handled events.
- 0xB10C/github-metadata-backup#14: Upgraded the octocrab dependency to support not-yet-handled events.
bitcoin-data/block-arrival-times
- Added block arrival timestamps for about 100k blocks from 6 nodes to the block-arrival-times dataset after a request from a researcher: bitcoin-data/block-arrival-times#25
bitcoin-data/stale-blocks
- changed the
get-data.pyscript to always fetch the full block, if possible: bitcoin-data/stale-blocks#54 - added stale blocks at height:
- 922047 bitcoin-data/stale-blocks#53
- 923067 bitcoin-data/stale-blocks#56
- 925051 bitcoin-data/stale-blocks#57
- 926056 & 925605 bitcoin-data/stale-blocks#58
- 926981 bitcoin-data/stale-blocks#59
- 928484 & 928222 bitcoin-data/stale-blocks#60
- 929868 & 929872 bitcoin-data/stale-blocks#61
My open-source work is currently funded by an OpenSats LTS grant. You can learn more about my funding and how to support my work on my funding page.
Text and images on this page are licensed under the Creative Commons Attribution-ShareAlike 4.0 International License