dgb: wire EmbeddedCoinNode into production CoinNode work source - #237
Merged
Conversation
Construct EmbeddedCoinNode(header_chain, subsidy_func) in run_node() and pass it as the embedded source of the run-loop CoinNode (was embedded= nullptr). The production CoinNode now serves get_work_view() from the in-process embedded chain + the coin subsidy schedule via the #207 -> subsidy_func SSOT, instead of returning an empty view. header_chain is hoisted ahead of coin_node so EmbeddedCoinNode (holds a HeaderChain&) and coin_node (holds the EmbeddedCoinNode*) both outlive the tracker callback captured below; DGBWorkSource keeps the same non-owning ref. transactions[]/bits stay held back truthfully (no mempool/next-target source yet); coinbasevalue is subsidy(next_height)+0 over the live chain. The #82 submit seam is unchanged: rpc=nullptr keeps has_rpc()==false so submit_block_hex returns false LOUDLY, independent of the embedded source (coin_node.cpp !m_rpc guard). Contract pinned by coin_node_seam_test #2/#3 (embedded present + rpc null) and dgb_embedded_coin_node_test 5/5. Build c2pool-dgb EXIT=0, --selftest OK.
This was referenced Jun 19, 2026
frstrtr
added a commit
that referenced
this pull request
Jun 20, 2026
… (surface-for-tap, consensus VALUE) (#248) * dgb: wire embedded mempool tx selection into the work template (fees -> coinbasevalue, transactions[]) EmbeddedCoinNode gains an injected EmbeddedTxSource: the embedded work template's transactions[] and fee total now come from the in-process Mempool instead of being hardcoded empty/0. The fee total folds into coinbasevalue through the #207 resolve_coinbase_value SSOT (subsidy(h) + total_fees); transactions[] passes through build_work_template verbatim. The source defaults empty, so the #237 EmbeddedCoinNode call site stays byte-identical (truthful absence preserved). The heavy tx/UTXO serialization codec (TX_WITH_WITNESS pack + Hash + HexStr) lives out-of-line in embedded_tx_select.cpp (make_mempool_tx_source, compiled into dgb_coin), NOT in embedded_coin_node.hpp -- keeping that header codec-free holds the #143 btclibs SCC trap shut for guard-weight TUs. Per-tx entry shape {data,txid,hash,fee} mirrors btc/coin and the p2pool-dgb-scrypt GBT consumer (fee null when unknown -> base_subsidy fallback; unknown-fee txs excluded to avoid coinbasevalue desync). Tests: dgb_embedded_tx_select_test (3/3) pins the Mempool -> GBT shaping + fee total over a real pool; dgb_embedded_coin_node_test (+2 -> 7/7) pins the fee->coinbasevalue fold (#207) and the empty-source byte-identical invariant. Both registered in ctest + the two build.yml --target allowlists. * dgb: inject make_mempool_tx_source into embedded run-loop work source Wire the #244 EmbeddedTxSource seam into the c2pool-dgb run loop. The EmbeddedCoinNode ctor now receives make_mempool_tx_source(mempool, BLOCK_MAX_WEIGHT): the served work template selects fee-sorted mempool transactions and folds their fees into coinbasevalue via the #207 SSOT, instead of emitting subsidy-only with an empty transactions[]. mempool is hoisted ahead of embedded_coin so the injected source (which captures it by reference) is outlived by the pool; reverse-order destruction tears the source down before the pool. The duplicate lower mempool declaration is removed. Consensus-VALUE: this changes the served template tx-selection path, so it is surface-for-tap, not auto-merge. It is byte-identical to the #237 subsidy-only baseline until the mempool is fed: wire_mempool_ingest (#245) needs an embedded coin-daemon ::dgb::interfaces::Node new_tx relay, and no such node is constructed in the run loop yet (the M3 embedded port; header_chain is likewise still unfed). So the source returns an empty selection today and the broadcast template is unchanged until live tx ingest lands. Build: c2pool-dgb links EXIT=0; --selftest OK. --------- Co-authored-by: frstrtr <frstrtr@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phase B: light up the embedded in-process work source in the c2pool-dgb run-loop.
What
run_node()(main_dgb.cpp) constructedCoinNode coin_node(/*embedded=*/nullptr, /*rpc=*/nullptr)— the embedded source was never wired, soget_work_view()returned an empty view. This constructsEmbeddedCoinNode(header_chain, params.subsidy_func)and passes it as the embedded source. The production CoinNode now serves templates from the live embedded chain + coin subsidy schedule via the #207 -> subsidy_func SSOT.Discipline
header_chainhoisted ahead ofcoin_nodeso EmbeddedCoinNode (HeaderChain&) and coin_node (EmbeddedCoinNode*) outlive the tracker callback; DGBWorkSource keeps the same non-owning ref.Scope / fences
Evidence
HOLD merge — integrator lands with operator push approval.