ipc mining: declare constants for default field values
What changed, and why it matters
This commit is a small, non-functional refactor. It declares new named constants for default values used in Bitcoin's mining inter-process communication (IPC) protocol and block template creation, and adds compile-time checks that those constants match existing values. No behavior changes; no security issue.
No action required. This is a preparatory refactor with no security relevance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change adds four Cap’n Proto constants in mining.capnp (maxMoney, maxDouble, defaultBlockReservedWeight, defaultCoinbaseOutputMaxAdditionalSigops), defines DEFAULT_COINBASE_OUTPUT_MAX_ADDITIONAL_SIGOPS in policy.h, uses it in node/types.h, and adds static_asserts in ipc_test.cpp verifying the new constants equal existing ones. The commit message explicitly states the constants are declared but not yet applied, because Cap’n Proto default field value changes are not backwards compatible.
Changed components
src/ipc/capnp/mining.capnpsrc/ipc/test/ipc_test.cppsrc/node/types.hsrc/policy/policy.hInspect captured patch +14 / −1
diff --git a/src/ipc/capnp/mining.capnp b/src/ipc/capnp/mining.capnp
index 25df1186..7e5cced6 100644
--- a/src/ipc/capnp/mining.capnp
+++ b/src/ipc/capnp/mining.capnp
@@ -12,6 +12,11 @@ using Proxy = import "/mp/proxy.capnp";
$Proxy.include("interfaces/mining.h");
$Proxy.includeTypes("ipc/capnp/mining-types.h");
+const maxMoney :Int64 = 2100000000000000;
+const maxDouble :Float64 = 1.7976931348623157e308;
+const defaultBlockReservedWeight :UInt32 = 8000;
+const defaultCoinbaseOutputMaxAdditionalSigops :UInt32 = 400;
+
interface Mining $Proxy.wrap("interfaces::Mining") {
isTestChain @0 (context :Proxy.Context) -> (result: Bool);
isInitialBlockDownload @1 (context :Proxy.Context) -> (result: Bool);
diff --git a/src/ipc/test/ipc_test.cpp b/src/ipc/test/ipc_test.cpp
index bec28881..31607299 100644
--- a/src/ipc/test/ipc_test.cpp
+++ b/src/ipc/test/ipc_test.cpp
@@ -8,6 +8,7 @@
#include <ipc/protocol.h>
#include <logging.h>
#include <mp/proxy-types.h>
+#include <ipc/capnp/mining.capnp.h>
#include <ipc/test/ipc_test.capnp.h>
#include <ipc/test/ipc_test.capnp.proxy.h>
#include <ipc/test/ipc_test.h>
@@ -23,6 +24,11 @@
#include <boost/test/unit_test.hpp>
+static_assert(ipc::capnp::messages::MAX_MONEY == MAX_MONEY);
+static_assert(ipc::capnp::messages::MAX_DOUBLE == std::numeric_limits<double>::max());
+static_assert(ipc::capnp::messages::DEFAULT_BLOCK_RESERVED_WEIGHT == DEFAULT_BLOCK_RESERVED_WEIGHT);
+static_assert(ipc::capnp::messages::DEFAULT_COINBASE_OUTPUT_MAX_ADDITIONAL_SIGOPS == DEFAULT_COINBASE_OUTPUT_MAX_ADDITIONAL_SIGOPS);
+
//! Remote init class.
class TestInit : public interfaces::Init
{
diff --git a/src/node/types.h b/src/node/types.h
index e3ee05dd..01e74528 100644
--- a/src/node/types.h
+++ b/src/node/types.h
@@ -55,7 +55,7 @@ struct BlockCreateOptions {
* The maximum additional sigops which the pool will add in coinbase
* transaction outputs.
*/
- size_t coinbase_output_max_additional_sigops{400};
+ size_t coinbase_output_max_additional_sigops{DEFAULT_COINBASE_OUTPUT_MAX_ADDITIONAL_SIGOPS};
/**
* Script to put in the coinbase transaction. The default is an
* anyone-can-spend dummy.
diff --git a/src/policy/policy.h b/src/policy/policy.h
index 35189d71..0bc7b327 100644
--- a/src/policy/policy.h
+++ b/src/policy/policy.h
@@ -24,6 +24,8 @@ class CScript;
static constexpr unsigned int DEFAULT_BLOCK_MAX_WEIGHT{MAX_BLOCK_WEIGHT};
/** Default for -blockreservedweight **/
static constexpr unsigned int DEFAULT_BLOCK_RESERVED_WEIGHT{8000};
+/** Default sigops cost to reserve for coinbase transaction outputs when creating block templates. */
+static constexpr unsigned int DEFAULT_COINBASE_OUTPUT_MAX_ADDITIONAL_SIGOPS{400};
/** This accounts for the block header, var_int encoding of the transaction count and a minimally viable
* coinbase transaction. It adds an additional safety margin, because even with a thorough understanding
* of block serialization, it's easy to make a costly mistake when trying to squeeze every last byte.
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.