Skip to content

Commit 33c2eee

Browse files
committed
multiprocess: Add IPC wrapper for Mining interface
1 parent 06882f8 commit 33c2eee

File tree

7 files changed

+106
-1
lines changed

7 files changed

+106
-1
lines changed

src/ipc/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@ add_library(bitcoin_ipc STATIC EXCLUDE_FROM_ALL
99
)
1010

1111
target_capnp_sources(bitcoin_ipc ${PROJECT_SOURCE_DIR}
12-
capnp/echo.capnp capnp/init.capnp
12+
capnp/common.capnp
13+
capnp/echo.capnp
14+
capnp/init.capnp
15+
capnp/mining.capnp
1316
)
1417

1518
target_link_libraries(bitcoin_ipc
1619
PRIVATE
1720
core_interface
21+
univalue
1822
)

src/ipc/capnp/common-types.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define BITCOIN_IPC_CAPNP_COMMON_TYPES_H
77

88
#include <clientversion.h>
9+
#include <interfaces/types.h>
910
#include <primitives/transaction.h>
1011
#include <serialize.h>
1112
#include <streams.h>
@@ -93,6 +94,26 @@ requires ipc::capnp::Deserializable<LocalType>
9394
return read_dest.construct(::deserialize, wrapper);
9495
}
9596

97+
//! Overload CustomBuildField and CustomReadField to serialize std::chrono
98+
//! parameters and return values as numbers.
99+
template <class Rep, class Period, typename Value, typename Output>
100+
void CustomBuildField(TypeList<std::chrono::duration<Rep, Period>>, Priority<1>, InvokeContext& invoke_context, Value&& value,
101+
Output&& output)
102+
{
103+
static_assert(std::numeric_limits<decltype(output.get())>::lowest() <= std::numeric_limits<Rep>::lowest(),
104+
"capnp type does not have enough range to hold lowest std::chrono::duration value");
105+
static_assert(std::numeric_limits<decltype(output.get())>::max() >= std::numeric_limits<Rep>::max(),
106+
"capnp type does not have enough range to hold highest std::chrono::duration value");
107+
output.set(value.count());
108+
}
109+
110+
template <class Rep, class Period, typename Input, typename ReadDest>
111+
decltype(auto) CustomReadField(TypeList<std::chrono::duration<Rep, Period>>, Priority<1>, InvokeContext& invoke_context,
112+
Input&& input, ReadDest&& read_dest)
113+
{
114+
return read_dest.construct(input.get());
115+
}
116+
96117
//! Overload CustomBuildField and CustomReadField to serialize UniValue
97118
//! parameters and return values as JSON strings.
98119
template <typename Value, typename Output>

src/ipc/capnp/common.capnp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Copyright (c) 2024 The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
@0xcd2c6232cb484a28;
6+
7+
using Cxx = import "/capnp/c++.capnp";
8+
$Cxx.namespace("ipc::capnp::messages");
9+
10+
using Proxy = import "/mp/proxy.capnp";
11+
$Proxy.includeTypes("ipc/capnp/common-types.h");
12+
13+
struct BlockRef $Proxy.wrap("interfaces::BlockRef") {
14+
hash @0 :Data;
15+
height @1 :Int32;
16+
}

src/ipc/capnp/init-types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
#define BITCOIN_IPC_CAPNP_INIT_TYPES_H
77

88
#include <ipc/capnp/echo.capnp.proxy-types.h>
9+
#include <ipc/capnp/mining.capnp.proxy-types.h>
910

1011
#endif // BITCOIN_IPC_CAPNP_INIT_TYPES_H

src/ipc/capnp/init.capnp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ $Cxx.namespace("ipc::capnp::messages");
1010
using Proxy = import "/mp/proxy.capnp";
1111
$Proxy.include("interfaces/echo.h");
1212
$Proxy.include("interfaces/init.h");
13+
$Proxy.include("interfaces/mining.h");
1314
$Proxy.includeTypes("ipc/capnp/init-types.h");
1415

1516
using Echo = import "echo.capnp";
17+
using Mining = import "mining.capnp";
1618

1719
interface Init $Proxy.wrap("interfaces::Init") {
1820
construct @0 (threadMap: Proxy.ThreadMap) -> (threadMap :Proxy.ThreadMap);
1921
makeEcho @1 (context :Proxy.Context) -> (result :Echo.Echo);
22+
makeMining @2 (context :Proxy.Context) -> (result :Mining.Mining);
2023
}

src/ipc/capnp/mining-types.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (c) 2024 The Bitcoin Core developers
2+
// Distributed under the MIT software license, see the accompanying
3+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
#ifndef BITCOIN_IPC_CAPNP_MINING_TYPES_H
6+
#define BITCOIN_IPC_CAPNP_MINING_TYPES_H
7+
8+
#include <interfaces/mining.h>
9+
#include <ipc/capnp/common.capnp.proxy-types.h>
10+
#include <ipc/capnp/common-types.h>
11+
#include <ipc/capnp/mining.capnp.proxy.h>
12+
#include <node/miner.h>
13+
#include <node/types.h>
14+
#include <validation.h>
15+
16+
#endif // BITCOIN_IPC_CAPNP_MINING_TYPES_H

src/ipc/capnp/mining.capnp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Copyright (c) 2024 The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
@0xc77d03df6a41b505;
6+
7+
using Cxx = import "/capnp/c++.capnp";
8+
$Cxx.namespace("ipc::capnp::messages");
9+
10+
using Common = import "common.capnp";
11+
using Proxy = import "/mp/proxy.capnp";
12+
$Proxy.include("interfaces/mining.h");
13+
$Proxy.includeTypes("ipc/capnp/mining-types.h");
14+
15+
interface Mining $Proxy.wrap("interfaces::Mining") {
16+
isTestChain @0 (context :Proxy.Context) -> (result: Bool);
17+
isInitialBlockDownload @1 (context :Proxy.Context) -> (result: Bool);
18+
getTip @2 (context :Proxy.Context) -> (result: Common.BlockRef, hasResult: Bool);
19+
waitTipChanged @3 (context :Proxy.Context, currentTip: Data, timeout: Float64) -> (result: Common.BlockRef);
20+
createNewBlock @4 (scriptPubKey: Data, options: BlockCreateOptions) -> (result: BlockTemplate);
21+
processNewBlock @5 (context :Proxy.Context, block: Data) -> (newBlock: Bool, result: Bool);
22+
getTransactionsUpdated @6 (context :Proxy.Context) -> (result: UInt32);
23+
testBlockValidity @7 (context :Proxy.Context, block: Data, checkMerkleRoot: Bool) -> (state: BlockValidationState, result: Bool);
24+
}
25+
26+
interface BlockTemplate $Proxy.wrap("interfaces::BlockTemplate") {
27+
getBlockHeader @0 (context: Proxy.Context) -> (result: Data);
28+
getBlock @1 (context: Proxy.Context) -> (result: Data);
29+
getTxFees @2 (context: Proxy.Context) -> (result: List(Int64));
30+
getTxSigops @3 (context: Proxy.Context) -> (result: List(Int64));
31+
getCoinbaseTx @4 (context: Proxy.Context) -> (result: Data);
32+
getCoinbaseCommitment @5 (context: Proxy.Context) -> (result: Data);
33+
getWitnessCommitmentIndex @6 (context: Proxy.Context) -> (result: Int32);
34+
}
35+
36+
struct BlockCreateOptions $Proxy.wrap("node::BlockCreateOptions") {
37+
useMempool @0 :Bool $Proxy.name("use_mempool");
38+
coinbaseMaxAdditionalWeight @1 :UInt64 $Proxy.name("coinbase_max_additional_weight");
39+
coinbaseOutputMaxAdditionalSigops @2 :UInt64 $Proxy.name("coinbase_output_max_additional_sigops");
40+
}
41+
42+
# TODO add fields to this struct
43+
struct BlockValidationState $Proxy.wrap("BlockValidationState") {
44+
}

0 commit comments

Comments
 (0)