Other node relay settings like fullrbf and minrelaytxfee are already returned, makes sense to add these two too.
RPC: Return `permitbaremultisig` and `maxdatacarriersize` in `getmempoolinfo` #29954
pull kristapsk wants to merge 1 commits into bitcoin:master from kristapsk:getmempoolinfo-permitbaremultisig-maxdatacarriersize changing 3 files +18 −1-
kristapsk commented at 8:29 PM on April 24, 2024: contributor
-
DrahtBot commented at 8:29 PM on April 24, 2024: contributor
<!--e57a25ab6845829454e8d69fc972939a-->
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.
<!--006a51241073e994b41acfe9ec718e94-->
Code Coverage & Benchmarks
For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/29954.
<!--021abf342d371248e50ceaed478a90ca-->
Reviews
See the guideline for information on the review process.
Type Reviewers ACK ajtowns, maflcko, theStack Concept ACK tdb3 Stale ACK TheCharlatan If your review is incorrectly listed, please react with 👎 to this comment and the bot will ignore it on the next update.
<!--174a7506f384e20aa4161008e828411d-->
Conflicts
No conflicts as of last run.
<!--5faf32d7da4f0f540f40219e4f7537a3-->
- DrahtBot added the label RPC/REST/ZMQ on Apr 24, 2024
-
in src/rpc/mempool.cpp:704 in 5b4c7a2212 outdated
700 | @@ -699,6 +701,8 @@ static RPCHelpMan getmempoolinfo() 701 | {RPCResult::Type::NUM, "incrementalrelayfee", "minimum fee rate increment for mempool limiting or replacement in " + CURRENCY_UNIT + "/kvB"}, 702 | {RPCResult::Type::NUM, "unbroadcastcount", "Current number of transactions that haven't passed initial broadcast yet"}, 703 | {RPCResult::Type::BOOL, "fullrbf", "True if the mempool accepts RBF without replaceability signaling inspection"}, 704 | + {RPCResult::Type::BOOL, "permitbaremultisig", "True if the mempool accepts bare multisig transactions"},
andrewtoth commented at 1:39 PM on April 25, 2024:To avoid any confusion
{RPCResult::Type::BOOL, "permitbaremultisig", "True if the mempool accepts transactions with bare multisig outputs"},in test/functional/mempool_accept.py:81 in 5b4c7a2212 outdated
69 | @@ -70,6 +70,8 @@ def run_test(self): 70 | node = self.nodes[0] 71 | self.wallet = MiniWallet(node) 72 | 73 | + assert_equal(node.getmempoolinfo()['permitbaremultisig'], False)
andrewtoth commented at 1:40 PM on April 25, 2024:Could have a test with the
Truecase?
tdb3 commented at 9:49 PM on April 28, 2024:I second this. It would add value to have tests that cover:
- permitbaremultisig disabled
- permitbaremultisig enabled
This might be accomplished through the use of a second node (
self.num_nodes) or perhaps through stopping the node, modifying configuration withreplace_in_config(), and restarting it. Typically num_nodes is to be minimized and start/stops avoided when possible, but I do not immediately see how differentpermitbaremultisigstates could be tested without doing one of the two (see https://github.com/bitcoin/bitcoin/blob/master/test/functional/README.md#general-test-writing-advice). Maybe it's a bit overkill, but we would want to know that the code behind the RPC on bitcoind still works if there are changes in the future.
ajtowns commented at 6:33 PM on May 20, 2024:Just adding the true check in
mempool_datacarrierseems like it would be easy?
tdb3 commented at 9:51 PM on April 28, 2024: contributorConcept ACK. Thank you. Appears to work well. Seems helpful to me for clients to have this information provided through RPC. I took a quick look at other RPC calls (in https://bitcoincore.org/en/doc/27.0.0/), but didn't see any that had
permitbaremultisigandmaxdatacarriersize.Recently, Issue #29912 was opened, which discusses implementing a formal specification for the RPC API. RPC API changes have the potential to adjust the meaning, fields/types, and/or values used in or returned by the API (see also #29845 (review) for a recent discussion on a type change). Overall, it's a reasonable idea to be very careful when changing the RPC API, as there is a ripple effect to downstream clients and can cause issues/bugs for them.
That being said, the specific change in this PR seems pretty low risk to me, since it is adding two items to the existing
resultobject returned, rather than changing the type returned, the meaning/value, or the other fields. Per https://github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md#versioning, we already declare that RPC can change in major releases. I wrote this comment to increase awareness in case others have input.This PR:
$ src/bitcoin-cli getmempoolinfo { "loaded": true, "size": 0, "bytes": 0, "usage": 32, "total_fee": 0.00000000, "maxmempool": 300000000, "mempoolminfee": 0.00001000, "minrelaytxfee": 0.00001000, "incrementalrelayfee": 0.00001000, "unbroadcastcount": 0, "fullrbf": false, "permitbaremultisig": true, "maxdatacarriersize": 83 } $ curl --user __cookie__ --data-binary '{"id": "curltest", "method": "getmempoolinfo", "params": []}' -H 'content-type: text/plain;' http://127.0.0.1:38332/ Enter host password for user '__cookie__': {"result":{"loaded":true,"size":0,"bytes":0,"usage":32,"total_fee":0.00000000,"maxmempool":300000000,"mempoolminfee":0.00001000,"minrelaytxfee":0.00001000,"incrementalrelayfee":0.00001000,"unbroadcastcount":0,"fullrbf":false,"permitbaremultisig":true,"maxdatacarriersize":83},"error":null,"id":"curltest"}Master branch (3aaf7328eb656b642e5f0f74f3e4d51645a1d0ab at the the time):
$ src/bitcoin-cli getmempoolinfo { "loaded": true, "size": 0, "bytes": 0, "usage": 32, "total_fee": 0.00000000, "maxmempool": 300000000, "mempoolminfee": 0.00001000, "minrelaytxfee": 0.00001000, "incrementalrelayfee": 0.00001000, "unbroadcastcount": 0, "fullrbf": false } $ curl --user __cookie__ --data-binary '{"id": "curltest", "method": "getmempoolinfo", "params": []}' -H 'content-type: text/plain;' http://127.0.0.1:38332/ Enter host password for user '__cookie__': {"result":{"loaded":true,"size":0,"bytes":0,"usage":32,"total_fee":0.00000000,"maxmempool":300000000,"mempoolminfee":0.00001000,"minrelaytxfee":0.00001000,"incrementalrelayfee":0.00001000,"unbroadcastcount":0,"fullrbf":false},"error":null,"id":"curltest"}Also left some inline comments/suggestions.
DrahtBot added the label CI failed on Apr 28, 2024DrahtBot removed the label CI failed on May 4, 2024in src/rpc/mempool.cpp:681 in f562477973 outdated
676 | @@ -677,6 +677,8 @@ UniValue MempoolInfoToJSON(const CTxMemPool& pool) 677 | ret.pushKV("incrementalrelayfee", ValueFromAmount(pool.m_incremental_relay_feerate.GetFeePerK())); 678 | ret.pushKV("unbroadcastcount", uint64_t{pool.GetUnbroadcastTxs().size()}); 679 | ret.pushKV("fullrbf", pool.m_full_rbf); 680 | + ret.pushKV("permitbaremultisig", pool.m_permit_bare_multisig); 681 | + ret.pushKV("maxdatacarriersize", (pool.m_max_datacarrier_bytes ? *pool.m_max_datacarrier_bytes : 0));
luke-jr commented at 3:46 PM on May 7, 2024:Is there a reason to name it something different here? Especially while the option is still broken and doesn't actually limit datacarriers?
kristapsk commented at 6:39 PM on May 7, 2024:I was expecting this comment from you. :)
Named it same way as existing startup / config option (
-datacarriersize), but I'm open to other names, as in fact it only limitsOP_RETURN. What name seems to be good from Knots perspective? It would be good to not unnecessary break compatibility between Core and Knots.
luke-jr commented at 2:31 PM on May 8, 2024:Well, you added "max" in front. I guess it makes sense, but might be surprising.
It's not clear what compatibility would mean before Core has fixed it to actually work.
glozow commented at 5:05 PM on May 8, 2024:I slightly prefer it being called datacarriersize to match the config option, but don't feel strongly
luke-jr commented at 2:30 PM on May 8, 2024: memberI wonder if a sub-object would be a good idea before we start adding more settings here. There's at least also
m_expirythat would make sense to add too.luke-jr commented at 3:02 PM on May 8, 2024: memberActually, since these don't change on their own... maybe a separate RPC altogether? (later extended to allow some changes?)
glozow commented at 5:06 PM on May 8, 2024: memberThis seems useful, and makes sense as a field of
getmempoolinfolike the otherstdb3 commented at 12:08 AM on May 10, 2024: contributorI wonder if a sub-object would be a good idea before we start adding more settings here. There's at least also
m_expirythat would make sense to add too.Implementing as a sub-object makes sense to me as well. If it is decided to adjust this RPC, then I'm thinking we'd also need a
-deprecatedrpcoption to retain the existing behavior, so we don't break RPC for downstream clients.See also: #29845 (review)
tdb3 commented at 12:11 AM on May 10, 2024: contributorActually, since these don't change on their own... maybe a separate RPC altogether? (later extended to allow some changes?)
This option also makes sense to me. Maybe something like
getmempoolpolicyor similar?kristapsk commented at 6:08 PM on May 10, 2024: contributorActually, since these don't change on their own... maybe a separate RPC altogether? (later extended to allow some changes?)
I'm not sure it's worth breaking compatibility here. Stuff like
minrelaytxfeeandmempoolminfeeis checked by a lots of wallet software, Lightning nodes, etc.DrahtBot added the label Needs rebase on May 15, 2024kristapsk force-pushed on May 16, 2024kristapsk commented at 1:09 AM on May 16, 2024: contributorRebased.
DrahtBot removed the label Needs rebase on May 16, 2024DrahtBot added the label CI failed on May 16, 2024DrahtBot commented at 4:55 AM on May 16, 2024: contributor<!--85328a0da195eb286784d51f73fa0af9-->
🚧 At least one of the CI tasks failed. Make sure to run all tests locally, according to the documentation.
Possibly this is due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.
Leave a comment here, if you need help tracking down a confusing failure.
<sub>Debug: https://github.com/bitcoin/bitcoin/runs/25029460423</sub>
kristapsk force-pushed on May 16, 2024DrahtBot removed the label CI failed on May 16, 2024theStack commented at 4:21 PM on May 17, 2024: contributorConcept ACK
Can you squash the two commits? (Currently compiling d06227fd6b87b5a427441a212c04a0ba64edc142 fails).
kristapsk force-pushed on May 17, 2024DrahtBot added the label CI failed on Jun 18, 2024DrahtBot removed the label CI failed on Jun 18, 2024DrahtBot added the label CI failed on Sep 10, 2024DrahtBot removed the label CI failed on Sep 14, 2024achow101 requested review from tdb3 on Oct 15, 2024achow101 removed review request from tdb3 on Oct 15, 2024achow101 requested review from theStack on Oct 15, 2024achow101 commented at 2:52 PM on October 15, 2024: memberPlease rebase for cmake if you are still interested in working on this.
kristapsk force-pushed on Oct 23, 2024kristapsk commented at 9:20 AM on October 23, 2024: contributorRebased.
in src/rpc/mempool.cpp:687 in ff808d80d6 outdated
682 | @@ -683,6 +683,8 @@ UniValue MempoolInfoToJSON(const CTxMemPool& pool) 683 | ret.pushKV("incrementalrelayfee", ValueFromAmount(pool.m_opts.incremental_relay_feerate.GetFeePerK())); 684 | ret.pushKV("unbroadcastcount", uint64_t{pool.GetUnbroadcastTxs().size()}); 685 | ret.pushKV("fullrbf", pool.m_opts.full_rbf); 686 | + ret.pushKV("permitbaremultisig", pool.m_opts.permit_bare_multisig); 687 | + ret.pushKV("maxdatacarriersize", (pool.m_opts.max_datacarrier_bytes ? *pool.m_opts.max_datacarrier_bytes : 0));
theStack commented at 10:11 PM on October 23, 2024:nit, a little shorter:
ret.pushKV("maxdatacarriersize", pool.m_opts.max_datacarrier_bytes.value_or(0));in test/functional/mempool_datacarrier.py:16 in ff808d80d6 outdated
12 | @@ -13,7 +13,7 @@ 13 | ) 14 | from test_framework.test_framework import BitcoinTestFramework 15 | from test_framework.test_node import TestNode 16 | -from test_framework.util import assert_raises_rpc_error 17 | +from test_framework.util import assert_equal, assert_raises_rpc_error
theStack commented at 10:12 PM on October 23, 2024:from test_framework.util import ( assert_equal, assert_raises_rpc_error, )(we prefer multi-line imports, see style guidelines in ./test/functional/README.md)
theStack approvedtheStack commented at 10:16 PM on October 23, 2024: contributorACK modulo nits
As others have expressed before, I'd also slightly prefer to name the options exactly like their command line option (i.e. "datacarriersize" without the "max" prefix), but no blocker.
maflcko commented at 8:38 AM on October 24, 2024: memberPlease squash your commits according to https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#squashing-commits
DrahtBot added the label Needs rebase on Nov 8, 2024kristapsk force-pushed on Nov 14, 2024kristapsk force-pushed on Nov 14, 2024kristapsk commented at 6:42 AM on November 14, 2024: contributorRebased and squashed commits.
DrahtBot removed the label Needs rebase on Nov 14, 2024fanquake referenced this in commit b43cfa20fd on Mar 21, 2025TheCharlatan approvedTheCharlatan commented at 12:53 PM on May 24, 2025: contributorACK d165ac8779b2b692007a7474c19cee4194946e75
DrahtBot requested review from theStack on May 24, 2025DrahtBot requested review from tdb3 on May 24, 2025DrahtBot added the label Needs rebase on Jun 9, 2025ajtowns commented at 5:09 AM on July 25, 2025: contributorStill working on this? Rebase is just https://github.com/ajtowns/bitcoin/commit/d6055bdc77552f395be1a4f90b8b98c0bec5a0af
1c10b7351eRPC: Return permitbaremultisig and maxdatacarriersize in getmempoolinfo
Co-authored-by: Andrew Toth <andrewstoth@gmail.com> Co-authored-by: Sebastian Falbesoner <sebastian.falbesoner@gmail.com> Co-authored-by: Anthony Towns <aj@erisian.com.au>
kristapsk force-pushed on Jul 26, 2025kristapsk commented at 12:28 PM on July 26, 2025: contributorRebased
DrahtBot removed the label Needs rebase on Jul 26, 2025ajtowns commented at 4:03 AM on July 28, 2025: contributorACK 1c10b7351e194fc788766347f65f4512f61f05e8
DrahtBot requested review from TheCharlatan on Jul 28, 2025in src/rpc/mempool.cpp:695 in 1c10b7351e
690 | @@ -691,6 +691,8 @@ UniValue MempoolInfoToJSON(const CTxMemPool& pool) 691 | ret.pushKV("incrementalrelayfee", ValueFromAmount(pool.m_opts.incremental_relay_feerate.GetFeePerK())); 692 | ret.pushKV("unbroadcastcount", uint64_t{pool.GetUnbroadcastTxs().size()}); 693 | ret.pushKV("fullrbf", true); 694 | + ret.pushKV("permitbaremultisig", pool.m_opts.permit_bare_multisig); 695 | + ret.pushKV("maxdatacarriersize", pool.m_opts.max_datacarrier_bytes.value_or(0));
maflcko commented at 6:45 AM on July 28, 2025:nit: Seems a bit odd to use
0andnulloptinterchangeably to mean the same (and require call sites to do the conversion manually). It would be easier to just flatten the optional and have a single dimension, directly translating two-way to the-datacarriersizeoption.Diff:
diff --git a/src/kernel/mempool_options.h b/src/kernel/mempool_options.h index d57dbb393f..cf873dd48d 100644 --- a/src/kernel/mempool_options.h +++ b/src/kernel/mempool_options.h @@ -48,9 +48,8 @@ struct MemPoolOptions { * type is designated as TxoutType::NULL_DATA. * * Maximum size of TxoutType::NULL_DATA scripts that this node considers standard. - * If nullopt, any size is nonstandard. */ - std::optional<unsigned> max_datacarrier_bytes{DEFAULT_ACCEPT_DATACARRIER ? std::optional{MAX_OP_RETURN_RELAY} : std::nullopt}; + unsigned max_datacarrier_bytes{DEFAULT_ACCEPT_DATACARRIER ? MAX_OP_RETURN_RELAY : 0}; bool permit_bare_multisig{DEFAULT_PERMIT_BAREMULTISIG}; bool require_standard{true}; bool persist_v1_dat{DEFAULT_PERSIST_V1_DAT}; diff --git a/src/node/mempool_args.cpp b/src/node/mempool_args.cpp index 11c77ff561..2f79dd3670 100644 --- a/src/node/mempool_args.cpp +++ b/src/node/mempool_args.cpp @@ -93,7 +93,7 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& argsman, const CChainP if (argsman.GetBoolArg("-datacarrier", DEFAULT_ACCEPT_DATACARRIER)) { mempool_opts.max_datacarrier_bytes = argsman.GetIntArg("-datacarriersize", MAX_OP_RETURN_RELAY); } else { - mempool_opts.max_datacarrier_bytes = std::nullopt; + mempool_opts.max_datacarrier_bytes = 0; } mempool_opts.require_standard = !argsman.GetBoolArg("-acceptnonstdtxn", DEFAULT_ACCEPT_NON_STD_TXN); diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp index 48f2a6a744..f4a2ee66d1 100644 --- a/src/policy/policy.cpp +++ b/src/policy/policy.cpp @@ -96,7 +96,7 @@ bool IsStandard(const CScript& scriptPubKey, TxoutType& whichType) return true; } -bool IsStandardTx(const CTransaction& tx, const std::optional<unsigned>& max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason) +bool IsStandardTx(const CTransaction& tx, unsigned max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason) { if (tx.version > TX_MAX_STANDARD_VERSION || tx.version < 1) { reason = "version"; @@ -133,7 +133,7 @@ bool IsStandardTx(const CTransaction& tx, const std::optional<unsigned>& max_dat } } - unsigned int datacarrier_bytes_left = max_datacarrier_bytes.value_or(0); + unsigned int datacarrier_bytes_left{max_datacarrier_bytes}; TxoutType whichType; for (const CTxOut& txout : tx.vout) { if (!::IsStandard(txout.scriptPubKey, whichType)) { diff --git a/src/policy/policy.h b/src/policy/policy.h index f9a18561bc..0104aaff1c 100644 --- a/src/policy/policy.h +++ b/src/policy/policy.h @@ -151,7 +151,7 @@ static constexpr decltype(CTransaction::version) TX_MAX_STANDARD_VERSION{3}; * Check for standard transaction types * [@return](/bitcoin-bitcoin/contributor/return/) True if all outputs (scriptPubKeys) use only standard transaction forms */ -bool IsStandardTx(const CTransaction& tx, const std::optional<unsigned>& max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason); +bool IsStandardTx(const CTransaction& tx, unsigned max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason); /** * Check for standard transaction types * [@param](/bitcoin-bitcoin/contributor/param/)[in] mapInputs Map of previous transactions that have outputs we're spending diff --git a/src/test/fuzz/transaction.cpp b/src/test/fuzz/transaction.cpp index c9eb11222f..f5cbacfb78 100644 --- a/src/test/fuzz/transaction.cpp +++ b/src/test/fuzz/transaction.cpp @@ -61,8 +61,8 @@ FUZZ_TARGET(transaction, .init = initialize_transaction) const CFeeRate dust_relay_fee{DUST_RELAY_TX_FEE}; std::string reason; - const bool is_standard_with_permit_bare_multisig = IsStandardTx(tx, std::nullopt, /* permit_bare_multisig= */ true, dust_relay_fee, reason); - const bool is_standard_without_permit_bare_multisig = IsStandardTx(tx, std::nullopt, /* permit_bare_multisig= */ false, dust_relay_fee, reason); + const bool is_standard_with_permit_bare_multisig = IsStandardTx(tx, /*max_datacarrier_bytes=*/0, /* permit_bare_multisig= */ true, dust_relay_fee, reason); + const bool is_standard_without_permit_bare_multisig = IsStandardTx(tx, /*max_datacarrier_bytes=*/0, /* permit_bare_multisig= */ false, dust_relay_fee, reason); if (is_standard_without_permit_bare_multisig) { assert(is_standard_with_permit_bare_multisig); } diff --git a/src/test/script_p2sh_tests.cpp b/src/test/script_p2sh_tests.cpp index b46411185c..6cb6b682b1 100644 --- a/src/test/script_p2sh_tests.cpp +++ b/src/test/script_p2sh_tests.cpp @@ -21,13 +21,13 @@ // Helpers: static bool IsStandardTx(const CTransaction& tx, bool permit_bare_multisig, std::string& reason) { - return IsStandardTx(tx, std::nullopt, permit_bare_multisig, CFeeRate{DUST_RELAY_TX_FEE}, reason); + return IsStandardTx(tx, /*max_datacarrier_bytes=*/0, permit_bare_multisig, CFeeRate{DUST_RELAY_TX_FEE}, reason); } static bool IsStandardTx(const CTransaction& tx, std::string& reason) { - return IsStandardTx(tx, std::nullopt, /*permit_bare_multisig=*/true, CFeeRate{DUST_RELAY_TX_FEE}, reason) && - IsStandardTx(tx, std::nullopt, /*permit_bare_multisig=*/false, CFeeRate{DUST_RELAY_TX_FEE}, reason); + return IsStandardTx(tx, /*max_datacarrier_bytes=*/0, /*permit_bare_multisig=*/true, CFeeRate{DUST_RELAY_TX_FEE}, reason) && + IsStandardTx(tx, /*max_datacarrier_bytes=*/0, /*permit_bare_multisig=*/false, CFeeRate{DUST_RELAY_TX_FEE}, reason); } static std::vector<unsigned char> Serialize(const CScript& s)
ajtowns commented at 7:10 AM on July 28, 2025:FWIW, that cleanup doesn't seem worthwhile for an option that's already deprecated to me
in src/rpc/mempool.cpp:719 in 1c10b7351e
714 | @@ -713,6 +715,8 @@ static RPCHelpMan getmempoolinfo() 715 | {RPCResult::Type::NUM, "incrementalrelayfee", "minimum fee rate increment for mempool limiting or replacement in " + CURRENCY_UNIT + "/kvB"}, 716 | {RPCResult::Type::NUM, "unbroadcastcount", "Current number of transactions that haven't passed initial broadcast yet"}, 717 | {RPCResult::Type::BOOL, "fullrbf", "True if the mempool accepts RBF without replaceability signaling inspection (DEPRECATED)"}, 718 | + {RPCResult::Type::BOOL, "permitbaremultisig", "True if the mempool accepts transactions with bare multisig outputs"}, 719 | + {RPCResult::Type::NUM, "maxdatacarriersize", "Maximum number of bytes that can be used by OP_RETURN outputs in the mempool"},
maflcko commented at 6:49 AM on July 28, 2025:I don't think this is accurate. The limit is no longer per output (or possibly per mempool). The limit is now over the total size of all datacarrier output scripts in a single transaction in the mempool.
ajtowns commented at 7:11 AM on July 28, 2025:It already uses the plural "outputs" though?
maflcko commented at 7:21 AM on July 28, 2025: memberlgtm ACK 1c10b7351e194fc788766347f65f4512f61f05e8
theStack approvedtheStack commented at 12:52 PM on July 28, 2025: contributorACK 1c10b7351e194fc788766347f65f4512f61f05e8
glozow merged this on Jul 28, 2025glozow closed this on Jul 28, 2025kristapsk deleted the branch on Jul 28, 2025alexanderwiederin referenced this in commit 28fe919bf7 on Aug 6, 2025TheCharlatan referenced this in commit b98d982d79 on Aug 7, 2025alexanderwiederin referenced this in commit 4152176d02 on Aug 8, 2025alexanderwiederin referenced this in commit 9ef94c31db on Aug 8, 2025stringintech referenced this in commit 71275a1b5e on Aug 17, 2025yuvicc referenced this in commit 22f55cf11d on Aug 26, 2025dergoegge commented at 2:58 PM on September 18, 2025: memberAdded this to the release notes: https://github.com/bitcoin-core/bitcoin-devwiki/wiki/v30.0-Release-Notes-Draft
github-metadata-mirror
This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-04-28 03:13 UTC
This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me