webrtc icon indicating copy to clipboard operation
webrtc copied to clipboard

A simple reader and write for MPEG-2 transport stream

Open JoTurk opened this issue 6 months ago • 0 comments

This is a tracking issue for making a simple MPEG transport stream (.ts) format for HEVC and AVC examples. I need it to make write and read from disk example for HEVC (I'm currently working on fixing the RTP de-packetizer).

JoTurk avatar Jun 29 '25 00:06 JoTurk

Turns out I was chasing a ghost. The reason destroy wasn't called by sv2-tp was not because of a missing context param, but because of an unrelated regression.

So the memory leak @plebhash is seeing is probably due to not calling destroy.

Sjors avatar Nov 24 '25 14:11 Sjors

re: https://github.com/bitcoin/bitcoin/issues/33899#issuecomment-3570523079

it looks like you found a real bug. Because BlockTemplate::createNewBlock doesn't have a context param, it looks like its destroy method is not invoked until sv2-tp disconnects.

I can imagine there's a bug causing the block template not to be freed until the disconnect happens, but I don't think createNewBlock method having a context parameter would affect this. Having a context parameter just allows the method to run on an asynchronous thread without blocking the event loop, instead of running on the event loop thread. But which thread the block was created on should not affect how it's destroyed

ryanofsky avatar Nov 24 '25 14:11 ryanofsky

re: https://github.com/bitcoin/bitcoin/issues/33899#issuecomment-3570541428

but do we have to explicitly call destroy or is it sufficient to drop the reference from memory on the client side?

from my understanding of capnp, I believe it should be sufficient to drop it from memory, but on the other hand there must be a reason for destroy to exist?

Your understanding is right, I think, but there are a lot of details here and I can imagine there being some bug where just dropping the reference on the client side does not delete the server side object right away. The reason for having an explicit destroy method is to give clients a way to destroy the server side-object and actually wait for it to be destroyed. If clients just drop their references to server side objects, the server side objects will get destroyed, but it will happen asynchronously.

ryanofsky avatar Nov 24 '25 14:11 ryanofsky

I ran two sessions with https://github.com/bitcoin/bitcoin/pull/33936 at a3a6861e131120eabf6e2f7ecd15e5ea805c66b2, where the client was our Sv2 Rust code

both of them had at least one chain tip update, which should trigger templates being flushed from memory (so I'd expect to see a sharp decline in RAM consumption)

in the first one, we're not calling destroy:

Image

in the second one, we're calling destroy after chain tip updates:

Image

I guess this indicates that @Sjors approach on https://github.com/bitcoin/bitcoin/pull/33936 isn't fully fixing the issue yet, which I guess is already known due to this comment https://github.com/bitcoin/bitcoin/pull/33936#issuecomment-3570998560

plebhash avatar Nov 24 '25 14:11 plebhash

re: https://github.com/bitcoin/bitcoin/issues/33899#issuecomment-3570541428

do we have to explicitly call destroy or is it sufficient to drop the reference from memory on the client side?

Following up on this, it's good practice to call destroy methods on objects which have them, to guarantee the objects are destroyed right away instead of asynchronously. This is most important if objects have nontrivial destructors, or if it matters what order objects get destroyed.

Block templates using a lot of memory in a memory-constrained environment could be another reason to call destroy explicitly. But if adding destroy calls to the client fixes a memory leak, this does sound like a bug, because memory should be freed soon after references are dropped even without explicit destroy calls.

re: https://github.com/bitcoin/bitcoin/issues/33899#issuecomment-3570523079

its destroy method is not invoked until sv2-tp disconnects

The reason destroy wasn't called by sv2-tp was not because of a missing context param, but because of an unrelated regression.

I was looking into this to remind myself what current behavior is. It actually changed sort of recently, but before the 30.0 release in https://github.com/bitcoin-core/libmultiprocess/commit/949573da84112388f68d1893f55aae0ca7f12d0c from https://github.com/bitcoin-core/libmultiprocess/pull/160. The commit mention there mentions "this change causes the ProxyServer::m_impl object to be freed shortly after the client is freed, instead of being delayed until the connection is closed."

Before that change, libmultiprocess would only delete server objects if the client explicitly called a destroy method, or when the connection was cleaned up. But currently it should delete them immediately even if a destroy method is never called. The previous behavior didn't matter very much for libmultiprocoess c++ clients call which destroy() internally in their own destructors, but could matter for rust and python clients which don't do that.

ryanofsky avatar Nov 24 '25 14:11 ryanofsky

here are some insights from the experiments I’ve been running over the past few days.

When I first reported this issue (https://github.com/stratum-mining/sv2-apps/pull/59#issuecomment-3568252007), my server was also running a few utility tools that I typically use during long test sessions.

To eliminate the “maybe it’s something else eating the memory” hypothesis, I started a fresh session with only the following running:

  • sv2-apps
  • Bitcoin Core v30 (mainnet)
  • The essential system processes (no extra utilities, no accessories)

Server specs (VPS):

  • 2 vCPUs

  • 2 GB RAM

  • Ubuntu 24.04 LTS

    Distributor ID: Ubuntu
    Description:    Ubuntu 24.04 LTS
    Release:        24.04
    Codename:       noble
    

Baseline Start

At startup, with the full SV2 stack running (two apps using IPC), the total memory usage hovered between 800 MB and 1 GB, with some expected minor spikes.

After letting it run overnight, the total VPS RAM usage sat around 1.5 GB.

During that same period:

  • Bitcoin Core increased by roughly 160 MB
  • But the rest of the increase could not be explained by Bitcoin Core alone
  • This made me suspect the sv2-apps were also growing over time
  • A few hours later, @plebhash confirmed with psrecord that the apps were indeed growing as well
Image

Next 8 Hours

Over the next 8 hours, total RAM usage climbed from 1.5 GB → 1.6 GB.

Since I had a bit of headroom left, I decided to stress things slightly.


Adding More Load

Alongside the already-running apps, I launched three more pool instances (also using IPC).

Within ~3 hours:

  • Bitcoin Core’s RAM usage increased (expected because of more IPC traffic, I think)
  • Total RAM climbed to 1.75 GB

I then shut down the extra pool instances.

However:

  • Bitcoin Core did not release the memory
  • Even by the next morning, RAM usage was still between 1.69–1.75 GB
  • So it seems Bitcoin Core doesn’t reduce its memory footprint after clients disconnect
Image The screenshot is half an hour after I closed the extra pool instances.

Final Incident (Today)

Since the VPS was close to running out of RAM again, I repeated the test: I spun up one more pool instance using IPC. RAM usage jumped to ~1.82 GB.

I closed the pool instance and waited to see if memory would drop. It didn’t.

A few hours later, the OS killed Bitcoin Core:

Tue Nov 25 14:51:01 2025] Out of memory: Killed process 2763434 (bitcoin-node) total-vm:13471820kB, anon-rss:1302224kB, file-rss:2916kB, shmem-rss:0kB, UID:0 pgtables:19496kB oom_score_adj:0

So at the moment, Bitcoin Core ends up consuming about 1 .3GB of RAM and never seems to shrink back down.

Why I’m Reporting This

I’m sharing these observations because they might help narrow down the behavior we’re seeing, both in Bitcoin Core and the SV2 apps.

I’m also willing to run another clean testing session. If you have recommendations for specific instrumentation or profiling tools to run, I can set them up. Right now, I avoided using things like psrecord during the run so I could rule out secondary tools affecting the memory footprint.

lucasbalieiro avatar Nov 25 '25 15:11 lucasbalieiro

@lucasbalieiro does Bitcoin Core behave better if you compile the 30.x branch from source? That's the equivalent of how v30.1 will behave when it comes out.

Sjors avatar Nov 25 '25 18:11 Sjors

@lucasbalieiro does Bitcoin Core behave better if you compile the 30.x branch from source? That's the equivalent of how v30.1 will behave when it comes out.

Built Bitcoin Core at commit a14e7b9dee9145920f93eab0254ce92942bd1e5e:

root@srv-f20833:~/Projects/bitcoin/build/bin# git log
commit a14e7b9dee9145920f93eab0254ce92942bd1e5e (HEAD -> 30.x, origin/30.x)
Merge: d0f6d9953a ae63cc4bf2
Author: merge-script <[email protected]>
Date:   Thu 

Ran the same stress test again (spawning multiple IPC-heavy apps).

Observed differences:

  • Core feels noticeably more tolerant. Baseline RAM usage is ~100 MB lower. I could spin up more apps simultaneously without Core hitting big spikes, looks like it’s using less memory per connected app.
  • However, after disconnecting the extra pool I used for stress testing, the RAM doesn’t drop back down to the original baseline (the level seen when only the SV2 apps + Core were running). It stays elevated, as if it’s still serving several pool apps.

Even when disconnecting all the apps. It does not return to its ~700MB of consumption

Image

lucasbalieiro avatar Nov 25 '25 21:11 lucasbalieiro

Thanks the the updates! If I'm understanding correctly, it seems like memory usage increasing 160MB overnight and 100MB over next 8 hours, and this would be pretty consistent with block templates not being freed. I think there are two key unknowns here:

  • We don't know whether the client is holding onto the block template references. If it is, then the memory usage going up would be expected and this is client bug, otherwise it is a server bug.
  • We don't know if server is failing to release block templates when the client disconnects. The fact that RSS number does not decrease when the client disconnects suggests that server is failing to release memory, but it's not a reliable indicator, because it only show much memory has been allocated by the OS to the process, but not how much memory is actually in use by the process. When the C library frees memory, it's normal for it to hold onto the pages that were in use and not return them to the OS. It's possible to see how much memory is actually in use using a tool like heaptrack

Probably a good next step would be to add log statements to BlockTemplateImpl constructor and destructor and write a python test program creating a template, and seeing if the destructor is actually called on sudden disconnect, or when calling the destroy method, or when just deleting the reference with del template; await asyncio.sleep(0). This could indicate if there's an obvious problem with the IPC server. It does seem like there is a real leak here, but it's not clear if it this is caused by a bug on the client side or server side.

ryanofsky avatar Nov 26 '25 01:11 ryanofsky

The node log messages should contain a destroy entry every time the client releases a template. It's probably also a good idea to have the client emit a log message when it discards a template. If the client waits until disconnect you'll see a flood of destroy methods at that point.

If the latter isn't happening, that could suggest a bug where Bitcoin Core doesn't release the memory after the client disconnects. As suggested by @ryanofsky adding logging to BlockTemplateImpl and ~BlockTemplateImpl should reveal this.

Sjors avatar Nov 26 '25 09:11 Sjors

we merged https://github.com/stratum-mining/sv2-apps/pull/59 so deploying SRI Pool and/or JDC for testing can be done from main branch

The node log messages should contain a destroy entry every time the client releases a template. It's probably also a good idea to have the client emit a log message when it discards a template.

I just did some tests with:

  • Bitcoin Core v30 binary downloaded from official website
  • mainnet (for frequent template updates)
  • SRI Pool from commit https://github.com/stratum-mining/sv2-apps/commit/ecf5f258766ac9e08bd8aaaa53b45b1c1bf961d8 (and also RUST_LOG=debug for extra verbosity)

on Pool logs, after block 0000000000000000000077e34472247575f4858357541269d56a8df5b429862b, we destroyed 84 stale templates:

2025-11-26T17:25:37.848442Z DEBUG bitcoin_core_sv2: Creating a dedicated thread IPC client for destroy_ipc_client
2025-11-26T17:25:37.848446Z DEBUG bitcoin_core_sv2: Creating new thread IPC client
...
2025-11-26T17:25:37.848727Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 53
2025-11-26T17:25:37.848961Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 40
2025-11-26T17:25:37.849116Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 2
2025-11-26T17:25:37.849244Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 28
2025-11-26T17:25:37.849361Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 30
2025-11-26T17:25:37.849469Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 38
2025-11-26T17:25:37.849572Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 83
2025-11-26T17:25:37.849681Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 56
2025-11-26T17:25:37.849784Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 74
2025-11-26T17:25:37.849892Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 78
2025-11-26T17:25:37.849985Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 11
2025-11-26T17:25:37.850105Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 62
2025-11-26T17:25:37.850412Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 33
2025-11-26T17:25:37.850624Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 4
2025-11-26T17:25:37.850733Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 9
2025-11-26T17:25:37.850827Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 60
2025-11-26T17:25:37.851049Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 41
2025-11-26T17:25:37.851254Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 58
2025-11-26T17:25:37.851392Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 19
2025-11-26T17:25:37.851487Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 20
2025-11-26T17:25:37.851582Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 66
2025-11-26T17:25:37.851836Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 7
2025-11-26T17:25:37.851976Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 65
2025-11-26T17:25:37.852159Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 34
2025-11-26T17:25:37.852310Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 61
2025-11-26T17:25:37.852428Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 72
2025-11-26T17:25:37.852529Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 80
2025-11-26T17:25:37.852681Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 1
2025-11-26T17:25:37.852807Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 84
2025-11-26T17:25:37.852913Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 51
2025-11-26T17:25:37.853050Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 76
2025-11-26T17:25:37.853141Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 24
2025-11-26T17:25:37.853236Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 25
2025-11-26T17:25:37.853330Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 67
2025-11-26T17:25:37.853433Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 81
2025-11-26T17:25:37.853538Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 52
2025-11-26T17:25:37.853635Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 16
2025-11-26T17:25:37.853744Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 54
2025-11-26T17:25:37.853838Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 71
2025-11-26T17:25:37.854109Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 43
2025-11-26T17:25:37.854312Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 26
2025-11-26T17:25:37.854399Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 59
2025-11-26T17:25:37.854538Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 63
2025-11-26T17:25:37.854842Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 5
2025-11-26T17:25:37.854982Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 47
2025-11-26T17:25:37.855140Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 31
2025-11-26T17:25:37.855235Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 48
2025-11-26T17:25:37.855347Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 50
2025-11-26T17:25:37.855592Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 32
2025-11-26T17:25:37.855800Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 3
2025-11-26T17:25:37.855927Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 12
2025-11-26T17:25:37.856130Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 18
2025-11-26T17:25:37.856264Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 79
2025-11-26T17:25:37.856481Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 14
2025-11-26T17:25:37.856598Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 73
2025-11-26T17:25:37.856811Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 15
2025-11-26T17:25:37.856966Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 8
2025-11-26T17:25:37.857177Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 23
2025-11-26T17:25:37.857442Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 45
2025-11-26T17:25:37.857652Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 17
2025-11-26T17:25:37.857810Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 22
2025-11-26T17:25:37.858028Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 69
2025-11-26T17:25:37.858241Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 36
2025-11-26T17:25:37.858478Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 37
2025-11-26T17:25:37.858753Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 6
2025-11-26T17:25:37.858937Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 10
2025-11-26T17:25:37.859114Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 68
2025-11-26T17:25:37.859342Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 35
2025-11-26T17:25:37.859488Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 44
2025-11-26T17:25:37.859668Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 57
2025-11-26T17:25:37.859808Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 29
2025-11-26T17:25:37.860018Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 55
2025-11-26T17:25:37.860223Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 75
2025-11-26T17:25:37.860526Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 82
2025-11-26T17:25:37.860771Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 21
2025-11-26T17:25:37.860934Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 77
2025-11-26T17:25:37.861091Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 27
2025-11-26T17:25:37.861339Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 46
2025-11-26T17:25:37.861568Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 39
2025-11-26T17:25:37.862058Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 13
2025-11-26T17:25:37.862436Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 42
2025-11-26T17:25:37.862732Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 64
2025-11-26T17:25:37.862947Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 70
2025-11-26T17:25:37.863187Z DEBUG bitcoin_core_sv2::template_data: Destroying template IPC client: 49

all of this come from the execution of TemplateData::destroy_ipc_client, where we allocate one dedicated server thread, and then destroy each template sequentially

and on Bitcoin Core logs, we also see 84 stale templates being destroyed:

2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #356 {bitcoin-node-50907/30921742 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #357 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #357 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #357 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #358 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #358 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #358 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #359 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #359 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #359 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #360 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #360 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #360 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #361 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #361 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #361 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #362 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #362 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #362 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #363 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #363 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #363 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #364 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #364 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #364 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #365 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #365 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #365 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #366 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #366 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #366 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #367 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #367 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #367 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #368 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #368 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #368 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #369 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #369 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #369 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #370 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #370 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #370 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #371 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #371 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #371 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #372 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #372 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #372 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #373 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #373 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #373 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #374 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #374 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #374 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #375 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #375 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #375 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #376 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #376 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #376 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #377 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #377 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #377 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #378 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #378 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #378 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #379 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #379 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #379 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #380 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #380 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #380 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #381 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #381 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #381 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #382 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #382 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #382 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #383 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #383 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #383 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #384 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #384 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #384 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #385 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #385 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #385 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #386 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #386 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #386 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #387 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #387 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #387 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #388 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #388 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #388 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #389 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #389 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #389 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #390 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #390 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #390 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #391 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #391 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #391 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #392 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #392 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #392 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #393 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #393 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #393 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #394 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #394 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #394 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #395 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #395 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #395 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #396 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #396 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #396 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #397 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #397 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #397 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #398 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #398 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #398 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #399 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #399 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #399 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #400 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #400 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #400 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #401 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #401 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #401 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #402 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #402 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #402 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #403 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #403 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #403 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #404 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #404 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #404 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #405 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #405 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #405 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #406 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #406 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #406 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #407 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #407 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #407 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #408 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #408 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #408 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #409 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #409 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #409 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #410 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #410 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #410 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #411 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #411 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #411 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #412 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #412 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #412 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #413 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #413 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #413 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #414 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #414 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #414 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #415 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #415 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #415 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #416 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #416 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #416 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #417 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #417 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #417 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #418 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #418 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #418 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #419 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #419 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #419 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #420 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #420 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #420 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #421 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #421 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #421 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #422 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #422 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #422 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #423 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #423 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #423 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #424 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #424 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #424 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #425 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #425 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #425 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #426 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #426 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #426 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #427 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #427 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #427 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #428 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #428 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #428 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #429 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #429 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #429 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #430 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #430 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #430 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #431 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #431 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #431 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #432 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #432 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #432 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #433 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #433 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #433 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #434 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #434 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #434 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #435 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #435 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #435 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #436 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #436 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #436 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #437 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #437 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #437 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #438 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #438 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #438 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #439 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #439 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #439 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server recv request  #440 BlockTemplate.destroy$Params (context = (thread = <external capability>))
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server post request  #440 {bitcoin-node-50907/30931699 (from )}
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server send response #440 BlockTemplate.destroy$Results ()
2025-11-26T17:25:37Z [ipc] {bitcoin-node-50907/b-capnp-loop-30920310} IPC server destroy N2mp11ProxyServerIN3ipc5capnp8messages13BlockTemplateEEE

plebhash avatar Nov 26 '25 18:11 plebhash

Following up on https://github.com/bitcoin/bitcoin/issues/33940#issuecomment-3578402033, I added log statements to the BlockTemplateImpl constructor and destructor and wrote a python test creating a block template object and calling the destroy method or not (DESTROY variable), and deleting the python template variable or not (DEL variable). As soon as either of these things were done, I could see the ~BlockTemplateImpl destructor being called. I could also see the destructor being called just disconnecting regardless of whether these things were done. I tested with current bitcoin master and with the v30.0 tag and saw the same behavior in both.

This test would seem to indicate that the leak is happening on the rust client side, and that when the bug happens, the client is probably not dropping references to all old templates or calling destroy on them, since doing either of these things should be sufficient to free memory on the server. It is possible there is a more subtle bug on the server side, and not a problem on the client, but so far I haven't seen behavior that looks like a problem. The test program looks like:

test-destroy.py

#!/usr/bin/env python3

import asyncio
from pathlib import Path
import shutil
import capnp

SRC_DIR = "/home/ryanofsky/work/bitcoin/src"
SOCK_PATH = "/home/ryanofsky/.bitcoin/regtest/node.sock"
DESTROY = 1
DEL = 1

class IPCInterfaceTest:
    def main(self):
        if capnp_bin := shutil.which("capnp"):
            capnp_dir = Path(capnp_bin).resolve().parent.parent / "include"
        else:
            capnp_dir = Path(capnp.__path__[0]).parent
        src_dir = Path(SRC_DIR)
        mp_dir = src_dir / "ipc" / "libmultiprocess" / "include"
        imports = [str(mp_dir), str(capnp_dir), str(src_dir)]
        self.capnp_modules = {
            "proxy": capnp.load(str(mp_dir / "mp" / "proxy.capnp"), imports=imports),
            "init": capnp.load(str(src_dir / "ipc" / "capnp" / "init.capnp"), imports=imports),
            "echo": capnp.load(str(src_dir / "ipc" / "capnp" / "echo.capnp"), imports=imports),
            "mining": capnp.load(str(src_dir / "ipc" / "capnp" / "mining.capnp"), imports=imports),
        }
        print("Running mining test")

        async def async_routine():
            ctx, init = await self.make_capnp_init_ctx()
            mining = init.makeMining(ctx)
            opts = self.capnp_modules['mining'].BlockCreateOptions()
            opts.useMempool = True
            opts.blockReservedWeight = 4000
            opts.coinbaseOutputMaxAdditionalSigops = 0
            template = await mining.result.createNewBlock(opts)
            print("Created template")
            if DESTROY:
                template.result.destroy(ctx)
                print("Destroyed template")
            if DEL:
                del template
                await asyncio.sleep(0)
                print("Deleted template")
            await asyncio.sleep(1000)

        asyncio.run(capnp.run(async_routine()))

    async def make_capnp_init_ctx(self):
        connection = await capnp.AsyncIoStream.create_unix_connection(SOCK_PATH)
        client = capnp.TwoPartyClient(connection)
        init = client.bootstrap().cast_as(self.capnp_modules['init'].Init)
        threadmap = init.construct().threadMap
        thread = threadmap.makeThread("pythread").result
        ctx = self.capnp_modules['proxy'].Context()
        ctx.thread = thread
        return ctx, init

if __name__ == '__main__':
    IPCInterfaceTest().main()

ryanofsky avatar Dec 02 '25 21:12 ryanofsky

re: https://github.com/bitcoin/bitcoin/issues/33940#issuecomment-3582775203

after block 0000000000000000000077e34472247575f4858357541269d56a8df5b429862b, we destroyed 84 stale templates: [...] all of this come from the execution of TemplateData::destroy_ipc_client, where we allocate one dedicated server thread, and then destroy each template sequentially

@plebhash, I'm trying to figure out what these logs mean. One thing I'm not sure about is why exactly the rust client is keeping 84 block template references. Is this because of lack of interruptWait method and inability to delete templates before waitNext() returns? Or are the references being kept because the blocks might need to be submitted? Or maybe some other reason?

I guess from looking at the rust code, it is currently designed to hold onto all templates and then free them when the tip changes. If so, this seems reasonable and should hopefully not use too much memory since the blocks should contain many of the same transactions. I guess the logs also indicate that rust code is able to trigger blocktemplate deletions on the server side, so this also seems good. If I'm understanding correctly, your logs here seem to show the rust client behaving well and deleting the templates it doesn't need.

ryanofsky avatar Dec 02 '25 21:12 ryanofsky

One thing I'm not sure about is why exactly the rust client is keeping 84 block template references.

We are conservatively keeping all templates in memory up until a chain tip update, because we could potentially receive a solution to any of them.

This might change with https://github.com/bitcoin/bitcoin/issues/33899, but the limit will remain something to be configured on Bitcoin Core, and whenever waitNext returns Overloaded error, we discard the oldest template.

Is this because of lack of interruptWait method and inability to delete templates before waitNext() returns?

no, so far I haven't noticed any meaningful limitations around deleting templates being imposed by the lack of interruptWait

I guess from looking at the rust code, it is currently designed to hold onto all templates and then free them when the tip changes.

correct.

If so, this seems reasonable and should hopefully not use too much memory since the blocks should contain many of the same transactions.

we don't keep transaction data on the client side... whenever it's needed, we fetch it via getBlock ad-hoc.

If I'm understanding correctly, your logs here seem to show the rust client behaving well and deleting the templates it doesn't need.

yes, that's also my understanding... the puzzling thing is that we're still having the memory leaks... so we're either missing some detail on this analysis, or the cause is related to something other than templates

plebhash avatar Dec 03 '25 12:12 plebhash

yes, that's also my understanding... the puzzling thing is that we're still having the memory leaks... so we're either missing some detail on this analysis, or the cause is related to something other than templates

I think at this point we've ruled out the obvious possible causes of leaks, and need to start debugging the issue more directly.

It would help to have some steps to reproduce. If someone can let me know what code to check out and build, and what commands to run that will show the increasing memory usage over time, that would be great. As long as we can observe it happening we should be able to figure out the cause.

ryanofsky avatar Dec 03 '25 15:12 ryanofsky

If someone can let me know what code to check out and build, and what commands to run that will show the increasing memory usage over time, that would be great.

  • launch Bitcoin Core on mainnet (for high mempool activity)
  • git clone https://github.com/stratum-mining/sv2-apps -b v0.1.0
  • edit sv2-apps/pool-apps/pool/config-examples/mainnet/pool-config-bitcoin-core-ipc-example.toml to make sure unix_socket_path is set correctly
  • cd sv2-apps/pool-apps/pool; cargo run -- -c config-examples/mainnet/pool-config-bitcoin-core-ipc-example.toml

at this point, you can start monitoring RAM

I used psrecord: psrecord $(pgrep bitcoin-node | head -1) --plot plot.png

but it also consumes a lot of RAM itself (so the OS might kill it if your system doesn't have enough and you run it for too long), so maybe there's more sophisticated ways to do this kind of instrumentation

plebhash avatar Dec 04 '25 09:12 plebhash

re: https://github.com/bitcoin/bitcoin/issues/33940#issuecomment-3611006053

  • git clone https://github.com/stratum-mining/sv2-apps -b v0.1.0

Thanks for the instructions. I've been experimenting with the v0.1.0 pool_sv2 app on regtest with a python script to generate transactions & connect blocks quickly to make a memory leak happen without needing to wait a long time.

So far, behavior has been mostly as expected, where generating lots of transactions without connecting new blocks causes block templates to accumulate and memory usage to go up, but when a new block is connected, the templates get released by the mining client.

One thing I saw that was surprising was that if the python client connected blocks too quickly, the mining client seemed to fall behind and only release templates after a delay. Like the mining client would be calling destroy method on the template from block height 5000 when block height 5015 was being connected. But pausing the python script would cause the mining client to catch up.

I guess I need to try letting the code run a longer time to see if memory usage will accumulate. But I think a slow & gradual leak could be pretty difficult to debug and fix. So if there's anything that can be done to trigger a leak quickly, it will make this debugging this issue a lot easier.

test/functional/test-generate.py

#!/usr/bin/env python3

from test_framework.authproxy import AuthServiceProxy
from test_framework.address import create_deterministic_address_bcrt1_p2tr_op_true
from test_framework.messages import (
    CTxOut,
)
from test_framework.script import (
    CScript,
    OP_RETURN,
)
from test_framework.util import (
    get_auth_cookie,
)
from test_framework.wallet import MiniWallet
from random import randbytes

SRC_DIR = "/home/ryanofsky/work/bitcoin/src"
DATADIR = "/home/ryanofsky/.bitcoin"
SOCK_PATH = "/home/ryanofsky/.bitcoin/regtest/node.sock"

INIT_BLOCKS = 200
BLOCKS_TO_MINE = 300
TXS_PER_BLOCK = 100
TX_BYTES = 50000

def main():
    rpc_u, rpc_p = get_auth_cookie(DATADIR, "regtest")
    host = '127.0.0.1'
    port = 18443
    url = "http://%s:%s@%s:%d" % (rpc_u, rpc_p, host, int(port))
    node = AuthServiceProxy(url)

    print(f"Generating {INIT_BLOCKS} blocks without transactions")
    node.generatetoaddress(1, create_deterministic_address_bcrt1_p2tr_op_true()[0])

    print("Creating wallet")
    wallet = MiniWallet(node)

    print(f"Generating {BLOCKS_TO_MINE} blocks with transactions")
    for i in range(BLOCKS_TO_MINE):
        bheight = node.getblockcount()
        bhash = node.getblockhash(bheight)
        print(f"block{i} height={bheight} hash={bhash}")
        for j in range(TXS_PER_BLOCK):
            tx = wallet.create_self_transfer(fee_rate=0)["tx"]
            tx_data = [randbytes(TX_BYTES)]
            tx.vout.append(CTxOut(nValue=0, scriptPubKey=CScript([OP_RETURN] + tx_data)))
            tx.vout[0].nValue -= tx.get_vsize()  # simply pay 1sat/vbyte fee
            txid = wallet.sendrawtransaction(from_node=node, tx_hex=tx.serialize().hex())
            assert txid == tx.txid_hex
            print(f"  {bheight=} {bhash=} {tx.txid_hex=}")
            assert tx.txid_hex in node.getrawmempool(True)
        node.generatetoaddress(1, create_deterministic_address_bcrt1_p2tr_op_true()[0])

if __name__ == '__main__':
    main()
diff

--- a/src/node/interfaces.cpp
+++ b/src/node/interfaces.cpp
@@ -858,11 +858,24 @@ class BlockTemplateImpl : public BlockTemplate
 public:
     explicit BlockTemplateImpl(BlockAssembler::Options assemble_options,
                                std::unique_ptr<CBlockTemplate> block_template,
+                               std::atomic<int>& count,
                                NodeContext& node) : m_assemble_options(std::move(assemble_options)),
                                                     m_block_template(std::move(block_template)),
+                                                    m_count(count),
                                                     m_node(node)
     {
         assert(m_block_template);
+        int c = ++m_count;
+        uint256 hash{m_block_template->block.hashPrevBlock};
+        CBlockIndex* block{WITH_LOCK(cs_main, return chainman().m_blockman.LookupBlockIndex(hash))};
+        LogError("==== CONSTRUCT BlockTemplateImpl() ptr=%p count=%i height=%i", this, c, block ? block->nHeight : -1);
+    }
+    ~BlockTemplateImpl() override
+    {
+        int c = --m_count;
+        uint256 hash{m_block_template->block.hashPrevBlock};
+        CBlockIndex* block{WITH_LOCK(cs_main, return chainman().m_blockman.LookupBlockIndex(hash))};
+        LogError("==== DESTROY BlockTemplateImpl() ptr=%p count=%i height=%i", this, c, block ? block->nHeight : -1);
     }
 
     CBlockHeader getBlockHeader() override
@@ -914,7 +927,7 @@ public:
     std::unique_ptr<BlockTemplate> waitNext(BlockWaitOptions options) override
     {
         auto new_template = WaitAndCreateNewBlock(chainman(), notifications(), m_node.mempool.get(), m_block_template, options, m_assemble_options, m_interrupt_wait);
-        if (new_template) return std::make_unique<BlockTemplateImpl>(m_assemble_options, std::move(new_template), m_node);
+        if (new_template) return std::make_unique<BlockTemplateImpl>(m_assemble_options, std::move(new_template), m_count, m_node);
         return nullptr;
     }
 
@@ -930,6 +943,7 @@ public:
     bool m_interrupt_wait{false};
     ChainstateManager& chainman() { return *Assert(m_node.chainman); }
     KernelNotifications& notifications() { return *Assert(m_node.notifications); }
+    std::atomic<int>& m_count;
     NodeContext& m_node;
 };
 
@@ -965,7 +979,7 @@ public:
 
         BlockAssembler::Options assemble_options{options};
         ApplyArgsManOptions(*Assert(m_node.args), assemble_options);
-        return std::make_unique<BlockTemplateImpl>(assemble_options, BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(), m_node);
+        return std::make_unique<BlockTemplateImpl>(assemble_options, BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(), m_template_count, m_node);
     }
 
     bool checkBlock(const CBlock& block, const node::BlockCheckOptions& options, std::string& reason, std::string& debug) override
@@ -981,6 +995,7 @@ public:
     ChainstateManager& chainman() { return *Assert(m_node.chainman); }
     KernelNotifications& notifications() { return *Assert(m_node.notifications); }
     NodeContext& m_node;
+    std::atomic<int> m_template_count{0};
 };
 } // namespace
 } // namespace node

ryanofsky avatar Dec 08 '25 17:12 ryanofsky

if the python client connected blocks too quickly, the mining client seemed to fall behind and only release templates after a delay

There's a hardcoded 10(?) second grace period where the Template Provider (both implementations) hold on to templates after a new tip is connected. It's there for two reasons:

  1. Trying to relay the block anyway (requires further node changes, since we currently honour the first-seen rule even when that means "our" block loses)
  2. Giving pools a chance to verify the template (via JDS) and award shares (especially in schemes that reward both hash power and total fees)

Sjors avatar Dec 08 '25 17:12 Sjors