IPC server crashes on early client connection (assertion failure in proxy.h and interfaces.cpp) #34664

issue plebhash openend this issue on February 24, 2026
  1. plebhash commented at 7:19 pm on February 24, 2026: none

    this was originally reported on #33994 (see #33994 (comment) for a summarized context)


    we are seeing Bitcoin Core crash when connected to SRI JDC

    here’s how we reproduced it on a macos with arm64 apple silicon:

    • enter https://stratumprotocol.org/
    • click “Start Mining”
    • follow the wizard to run JDC with docker
    • make sure you’re connecting to SRI community mainnet deployment
    • make sure you launch JDC while Bitcoin Core v30.2 is still doing IBD

    then bitcoin Core crashes with similar logs:

      0p@MacBook-Pro Downloads % ./bitcoin-30.2/bin/bitcoin -m node -ipcbind=unix
      12026-02-23T16:23:17Z Bitcoin Core version v30.2.0 (release build)
      22026-02-23T16:23:17Z Using the 'sse4(1way);sse41(4way)' SHA256 implementation
      32026-02-23T16:23:17Z Default data directory /Users/p/Library/Application Support/Bitcoin
      42026-02-23T16:23:17Z Using data directory /Users/p/Library/Application Support/Bitcoin
      52026-02-23T16:23:17Z Config file: /Users/p/Library/Application Support/Bitcoin/bitcoin.conf
      62026-02-23T16:23:17Z Config file arg: prune="200"
      72026-02-23T16:23:17Z Config file arg: rpcallowip="0.0.0.0/0"
      82026-02-23T16:23:17Z Config file arg: rpcbind="0.0.0.0"
      92026-02-23T16:23:17Z Config file arg: rpcpassword=****
     102026-02-23T16:23:17Z Config file arg: rpcuser=****
     112026-02-23T16:23:17Z Config file arg: server="1"
     122026-02-23T16:23:17Z Setting file arg: prune = "57220"
     132026-02-23T16:23:17Z Setting file arg: wallet = ["novcanik"]
     142026-02-23T16:23:17Z Command-line arg: ipcbind="unix"
     152026-02-23T16:23:17Z Using at most 125 automatic connections (285 file descriptors available)
     162026-02-23T16:23:17Z scheduler thread start
     172026-02-23T16:23:17Z Listening for IPC requests on address unix:/Users/p/Library/Application Support/Bitcoin/node.sock
     182026-02-23T16:23:17Z Binding RPC on address 0.0.0.0 port 8332
     192026-02-23T16:23:17Z WARNING: the RPC server is not safe to expose to untrusted networks such as the public internet
     202026-02-23T16:23:17Z Using rpcuser/rpcpassword authentication.
     212026-02-23T16:23:17Z [warning] The use of rpcuser/rpcpassword is less secure, because credentials are configured in plain text. It is recommended that locally-run instances switch to cookie-based auth, or otherwise to use hashed rpcauth credentials. See share/rpcauth in the source directory for more information.
     222026-02-23T16:23:17Z Starting HTTP server with 16 worker threads
     232026-02-23T16:23:17Z Using wallet directory /Users/p/Library/Application Support/Bitcoin/wallets
     242026-02-23T16:23:17Z init message: Verifying wallet(s)
     252026-02-23T16:23:17Z Using SQLite Version 3.46.1
     262026-02-23T16:23:17Z Using wallet /Users/p/Library/Application Support/Bitcoin/wallets/novcanik
     272026-02-23T16:23:17Z Using /16 prefix for IP bucketing
     282026-02-23T16:23:17Z init message: Loading P2P addresses
     292026-02-23T16:23:17Z Loaded 66288 addresses from peers.dat  166ms
     302026-02-23T16:23:17Z init message: Loading banlist
     312026-02-23T16:23:17Z SetNetworkActive: true
     322026-02-23T16:23:17Z Cache configuration:
     332026-02-23T16:23:17Z * Using 2.0 MiB for block index database
     342026-02-23T16:23:17Z * Using 8.0 MiB for chain state database
     352026-02-23T16:23:17Z * Using 440.0 MiB for in-memory UTXO set (plus up to 286.1 MiB of unused mempool space)
     362026-02-23T16:23:17Z Script verification uses 11 additional threads
     372026-02-23T16:23:17Z Using obfuscation key for blocksdir *.dat files (/Users/p/Library/Application Support/Bitcoin/blocks): '0000000000000000'
     382026-02-23T16:23:17Z Opening LevelDB in /Users/p/Library/Application Support/Bitcoin/blocks/index
     392026-02-23T16:23:17Z Opened LevelDB successfully
     402026-02-23T16:23:17Z Using obfuscation key for /Users/p/Library/Application Support/Bitcoin/blocks/index: 0000000000000000
     412026-02-23T16:23:17Z Using 16 MiB out of 16 MiB requested for signature cache, able to store 524288 elements
     422026-02-23T16:23:17Z Using 16 MiB out of 16 MiB requested for script execution cache, able to store 524288 elements
     432026-02-23T16:23:17Z init message: Loading block index
     442026-02-23T16:23:17Z Assuming ancestors of block 00000000000000000000611fd22f2df7c8fbd0688745c3a6c3bb5109cc2a12cb have valid signatures.
     452026-02-23T16:23:17Z Setting nMinimumChainWork=0000000000000000000000000000000000000000dee8e2a309ad8a9820433c68
     462026-02-23T16:23:17Z Prune configured to target 57220 MiB on disk for block and undo files.
     472026-02-23T16:23:19Z Loading block index db: last block file = 5409
     482026-02-23T16:23:19Z Loading block index db: last block file info: CBlockFileInfo(blocks=47, size=65771086, heights=937945...937991, time=2026-02-23...2026-02-23)
     492026-02-23T16:23:19Z Checking all blk files are present...
     502026-02-23T16:23:19Z Loading block index db: Block files have previously been pruned
     512026-02-23T16:23:20Z Initializing chainstate Chainstate [ibd] @ height -1 (null)
     522026-02-23T16:23:20Z Opening LevelDB in /Users/p/Library/Application Support/Bitcoin/chainstate
     532026-02-23T16:23:20Z Opened LevelDB successfully
     542026-02-23T16:23:20Z Using obfuscation key for /Users/p/Library/Application Support/Bitcoin/chainstate: ce0efc211ec92aaf
     552026-02-23T16:23:20Z Loaded best chain: hashBestChain=00000000000000000001bd96c5201616a5c58aa6460f0d926cae714223666c93 height=937991 date=2026-02-23T16:17:08Z progress=0.999998
     562026-02-23T16:23:20Z init message: Verifying blocks
     572026-02-23T16:23:20Z CreateNewBlock(): block weight: 812 txs: 0 fees: 0 sigops 0
     582026-02-23T16:23:20Z Verifying last 6 blocks at level 3
     592026-02-23T16:23:20Z Verification progress: 0%
     602026-02-23T16:23:20Z Verification progress: 16%
     612026-02-23T16:23:20Z Verification progress: 33%
     622026-02-23T16:23:21Z Verification progress: 50%
     632026-02-23T16:23:21Z Verification progress: 66%
     642026-02-23T16:23:21Z [ipc:info] {bitcoin-node-32628/b-capnp-loop-621785} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages6MiningEEE
     652026-02-23T16:23:21Z [ipc:info] {bitcoin-node-32628/b-capnp-loop-621785} IPC server: socket disconnected.
     662026-02-23T16:23:21Z [ipc:info] {bitcoin-node-32628/b-capnp-loop-621785} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages4InitEEE
     672026-02-23T16:23:21Z Verification progress: 83%
     682026-02-23T16:23:21Z Verification progress: 99%
     692026-02-23T16:23:21Z Verification: No coin database inconsistencies in last 6 blocks (8097 transactions)
     702026-02-23T16:23:21Z Block index and chainstate loaded
     712026-02-23T16:23:21Z CreateNewBlock(): block weight: 812 txs: 0 fees: 0 sigops 0
     722026-02-23T16:23:21Z Using SQLite Version 3.46.1
     732026-02-23T16:23:21Z Using wallet /Users/p/Library/Application Support/Bitcoin/wallets/novcanik
     742026-02-23T16:23:21Z init message: Loading wallet
     752026-02-23T16:23:21Z [novcanik] Last client version = 300200
     762026-02-23T16:23:21Z [novcanik] Descriptors: 8, Descriptor Keys: 0 plaintext, 1 encrypted, 1 total.
     772026-02-23T16:23:21Z [novcanik] Setting spkMan to active: id = edb28fd27a4b47ae0e316603d3991cafad2f7e6fdcb096a89fdafcd34627702c, type = legacy, internal = false
     782026-02-23T16:23:21Z [novcanik] Setting spkMan to active: id = f7aada836e876af423ca3e80339506f90d3bbf4a8c024b353967dd3161ff8be5, type = p2sh-segwit, internal = false
     792026-02-23T16:23:21Z [novcanik] Setting spkMan to active: id = 1fcb15c6c2ee3a63f4a890bfdc69bc97a17d1f32a46337603511fcc8a37e95b3, type = bech32, internal = false
     802026-02-23T16:23:21Z [novcanik] Setting spkMan to active: id = 995dd7b253d565466fba909ffe67ca8ab2cb1794f7fc604fcce7e36ff8b0f8c8, type = bech32m, internal = false
     812026-02-23T16:23:21Z [novcanik] Setting spkMan to active: id = ad8668ef94ea7747a80402b8f466852bfca8780e321dcb67418cb4584f6b9978, type = legacy, internal = true
     822026-02-23T16:23:21Z [novcanik] Setting spkMan to active: id = 4375208e97ac934895c2cce4e70a04193ab53cd445dfc00ba92d96136eba7fa1, type = p2sh-segwit, internal = true
     832026-02-23T16:23:21Z [novcanik] Setting spkMan to active: id = 951c97ac022ad382ea68f3ec073fd41c5170513d0e8c430ad51320bb313abff7, type = bech32, internal = true
     842026-02-23T16:23:21Z [novcanik] Setting spkMan to active: id = dfba5b81e3aa1473f58553f63eea5ba12b7ef5fe2f209ec665701b0d8292ab42, type = bech32m, internal = true
     852026-02-23T16:23:21Z [novcanik] Wallet completed loading in             235ms
     862026-02-23T16:23:21Z [novcanik] setKeyPool.size() = 8000
     872026-02-23T16:23:21Z [novcanik] mapWallet.size() = 0
     882026-02-23T16:23:21Z [novcanik] m_address_book.size() = 2
     892026-02-23T16:23:21Z init message: Pruning blockstore
     902026-02-23T16:23:21Z initload thread start
     912026-02-23T16:23:21Z block tree size = 937993
     922026-02-23T16:23:21Z nBestHeight = 937991
     932026-02-23T16:23:21Z mapport thread start
     942026-02-23T16:23:21Z Loading 1814 mempool transactions from file...
     952026-02-23T16:23:21Z torcontrol thread start
     962026-02-23T16:23:21Z Bound to 127.0.0.1:8334
     972026-02-23T16:23:21Z Bound to [::]:8333
     982026-02-23T16:23:21Z Leaving InitialBlockDownload (latching to false)
     992026-02-23T16:23:21Z Bound to 0.0.0.0:8333
    1002026-02-23T16:23:21Z Loaded 2 addresses from "anchors.dat"
    1012026-02-23T16:23:21Z 2 block-relay-only anchors will be tried for connections.
    1022026-02-23T16:23:21Z init message: Starting network threads
    1032026-02-23T16:23:21Z net thread start
    1042026-02-23T16:23:21Z dnsseed thread start
    1052026-02-23T16:23:21Z addcon thread start
    1062026-02-23T16:23:21Z Waiting 300 seconds before querying DNS seeds.
    1072026-02-23T16:23:21Z init message: Done loading
    1082026-02-23T16:23:21Z msghand thread start
    1092026-02-23T16:23:21Z opencon thread start
    1102026-02-23T16:23:21Z tor: The only supported authentication mechanism left is password, but no password provided with -torpassword
    1112026-02-23T16:23:22Z Progress loading mempool transactions from file: 10% (tried 182, 1632 remaining)
    1122026-02-23T16:23:22Z Progress loading mempool transactions from file: 20% (tried 363, 1451 remaining)
    1132026-02-23T16:23:22Z Progress loading mempool transactions from file: 30% (tried 545, 1269 remaining)
    1142026-02-23T16:23:22Z Progress loading mempool transactions from file: 40% (tried 726, 1088 remaining)
    1152026-02-23T16:23:22Z Progress loading mempool transactions from file: 50% (tried 907, 907 remaining)
    1162026-02-23T16:23:22Z Progress loading mempool transactions from file: 60% (tried 1089, 725 remaining)
    1172026-02-23T16:23:22Z Progress loading mempool transactions from file: 70% (tried 1270, 544 remaining)
    1182026-02-23T16:23:22Z Progress loading mempool transactions from file: 80% (tried 1452, 362 remaining)
    1192026-02-23T16:23:22Z Progress loading mempool transactions from file: 90% (tried 1633, 181 remaining)
    1202026-02-23T16:23:22Z Imported mempool transactions from file: 1814 succeeded, 0 failed, 0 expired, 0 already there, 0 waiting for initial broadcast
    1212026-02-23T16:23:22Z initload thread exit
    1222026-02-23T16:23:22Z CreateNewBlock(): block weight: 2269527 txs: 1814 fees: 1045954 sigops 3946
    123Assertion failed: (m_loop), function operator*, file proxy.h, line 59.
    124zsh: abort      ./bitcoin-30.2/bin/bitcoin -m node -ipcbind=unix
    

    another way to crash it is to run JDC first, and immediately start Bitcoin Core v30.2 with these logs on tail:

     02026-02-23T16:30:08Z Config file arg: rpcpassword=****
     12026-02-23T16:30:08Z Config file arg: rpcuser=****
     22026-02-23T16:30:08Z Config file arg: server="1"
     32026-02-23T16:30:08Z Setting file arg: prune = "57220"
     42026-02-23T16:30:08Z Setting file arg: wallet = ["novcanik"]
     52026-02-23T16:30:08Z Command-line arg: ipcbind="unix"
     62026-02-23T16:30:08Z Using at most 125 automatic connections (285 file descriptors available)
     72026-02-23T16:30:08Z scheduler thread start
     82026-02-23T16:30:08Z Listening for IPC requests on address unix:/Users/p/Library/Application Support/Bitcoin/node.sock
     9node/interfaces.cpp:980 chainman: Assertion `m_node.chainman' failed.
    10zsh: abort      ./bitcoin-30.2/bin/bitcoin -m node -ipcbind=unix
    

    as inquired by @Sjors and clarified by @ryanofsky :

    neither #34184 nor #34422 fix the root cause


    @jbesraa also faces it

  2. ryanofsky commented at 8:28 pm on February 24, 2026: contributor

    Thanks for the report. An earlier comment #33994 (comment) breaks down some of the differences between the two crashes in the issue description Assertion failed: (m_loop), function operator*, file proxy.h, line 59 vs chainman: Assertion `m_node.chainman' failed. but hopefully #34661 should fix both of these (testing welcome!).

    There was also a slightly different Assertion failed: (m_loop) crash-after-disconnect case reported in a screenshot #33994 (comment) which hopefully should be fixed by #34422

  3. enirox001 commented at 2:29 pm on March 2, 2026: contributor

    I pulled the latest master branch (which includes the recently merged #34661) to verify if it patches the Assertion failed: (m_loop), function operator*, file proxy.h, line 59 and chainman: Assertion \m_node.chainman' failed. assertions on a Linux environment.

    Environment:

    • OS: Fedora Linux (x86_64)
    • Node: Bitcoin Core (built with multiprocess enabled). Tested with testnet4
    • Client: Native SV2 jd-client

    To ensure the race conditions were thoroughly tested, specifically early connection behavior noted by @plebhash and @jbesraa, I wrote bash scripts to hammer the IPC unix socket during the node’s startup phases.

    The script stress-tests the node by performing an aggressive operation, and then performing a strict cleanup (killing client processes and deleting the socket file) so the next test can be performed from a clean slate without any overlapping state from the previous one.

    • The first test fires 50 concurrent JDC connections the exact millisecond bitcoin boots. This is to test the new wait_loaded flag and the m_tip_block_cv condition variable added to interfaces.cpp. It ensures that when massive amounts of IPC clients ask for the mining interface early, they safely wait for chainstate_loaded to be true instead of crashing on a null chainman.
    • The second test runs a rapid connect/disconnect loop (connecting for 0.05s, then dropping) during the initload phase. This tests the m_loop assertion by simulating broken pipes, verifying that the node handles sudden client disconnects cleanly while waiting in the early startup lock.
    • The third test bypasses JDC entirely and pipes thousands of bytes of /dev/urandom directly into the socket via nc the microsecond the socket appears. This verifies that the Cap’n Proto layer safely catches malformed garbage payloads during early boot and drops the proxy instance without bringing down the main node.

    The node survived all these test cases cleanly without throwing m_loop or m_node.chainman assertions. The merged #34661 properly addresses the issues mentioned.

    I have uploaded the bash test script and the resulting clean boot logs to a gist here should one want to take a look at it


github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-03-03 03:13 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me