aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorW. J. van der Laan <laanwj@protonmail.com>2021-11-15 17:12:05 +0100
committerW. J. van der Laan <laanwj@protonmail.com>2021-11-15 17:13:23 +0100
commit1ba74123f9319465381a4351c83d04aa97ac3707 (patch)
tree8073ec2766a812dcbada247a5c0200bc18137f25
parent36d184d0c876b0d296787a82de742a18d1c13015 (diff)
parenta032fa30d282fa69c304e0afd1f95f67c55d22e3 (diff)
downloadbitcoin-1ba74123f9319465381a4351c83d04aa97ac3707.tar.xz
Merge bitcoin/bitcoin#23004: multiprocess: add interfaces::ExternalSigner class
a032fa30d282fa69c304e0afd1f95f67c55d22e3 multiprocess: add interfaces::ExternalSigner class (Russell Yanofsky) Pull request description: Add `interfaces::ExternalSigner` class to let signer objects be passed between processes and let signer code run in the original process where the object was created. --- This PR is part of the [process separation project](https://github.com/bitcoin/bitcoin/projects/10). ACKs for top commit: laanwj: Concept and code review ACK a032fa30d282fa69c304e0afd1f95f67c55d22e3 hebasto: re-ACK a032fa30d282fa69c304e0afd1f95f67c55d22e3 Tree-SHA512: 99a729fb3a64d010e142cc778a9f1f358e58345b77faaf2664de7d2277715d59df3352326e8f0f2a6628038670eaa4556310a549079fb28af6d2eeb05aea1460
-rw-r--r--src/interfaces/node.h15
-rw-r--r--src/node/interfaces.cpp21
-rw-r--r--src/qt/createwalletdialog.cpp6
-rw-r--r--src/qt/createwalletdialog.h7
-rw-r--r--src/qt/walletcontroller.cpp4
5 files changed, 41 insertions, 12 deletions
diff --git a/src/interfaces/node.h b/src/interfaces/node.h
index 34fdde3774..48d4fd3ee2 100644
--- a/src/interfaces/node.h
+++ b/src/interfaces/node.h
@@ -6,7 +6,6 @@
#define BITCOIN_INTERFACES_NODE_H
#include <consensus/amount.h>
-#include <external_signer.h>
#include <net.h> // For NodeId
#include <net_types.h> // For banmap_t
#include <netaddress.h> // For Network
@@ -50,6 +49,16 @@ struct BlockAndHeaderTipInfo
double verification_progress;
};
+//! External signer interface used by the GUI.
+class ExternalSigner
+{
+public:
+ virtual ~ExternalSigner() {};
+
+ //! Get signer display name
+ virtual std::string getName() = 0;
+};
+
//! Top-level interface for a bitcoin node (bitcoind process).
class Node
{
@@ -111,8 +120,8 @@ public:
//! Disconnect node by id.
virtual bool disconnectById(NodeId id) = 0;
- //! List external signers
- virtual std::vector<ExternalSigner> externalSigners() = 0;
+ //! Return list of external signers (attached devices which can sign transactions).
+ virtual std::vector<std::unique_ptr<ExternalSigner>> listExternalSigners() = 0;
//! Get total bytes recv.
virtual int64_t getTotalBytesRecv() = 0;
diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp
index 192caf7994..9b4ba8eb97 100644
--- a/src/node/interfaces.cpp
+++ b/src/node/interfaces.cpp
@@ -67,6 +67,17 @@ using interfaces::WalletClient;
namespace node {
namespace {
+#ifdef ENABLE_EXTERNAL_SIGNER
+class ExternalSignerImpl : public interfaces::ExternalSigner
+{
+public:
+ ExternalSignerImpl(::ExternalSigner signer) : m_signer(std::move(signer)) {}
+ std::string getName() override { return m_signer.m_name; }
+private:
+ ::ExternalSigner m_signer;
+};
+#endif
+
class NodeImpl : public Node
{
private:
@@ -172,14 +183,18 @@ public:
}
return false;
}
- std::vector<ExternalSigner> externalSigners() override
+ std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners() override
{
#ifdef ENABLE_EXTERNAL_SIGNER
std::vector<ExternalSigner> signers = {};
const std::string command = gArgs.GetArg("-signer", "");
- if (command == "") return signers;
+ if (command == "") return {};
ExternalSigner::Enumerate(command, signers, Params().NetworkIDString());
- return signers;
+ std::vector<std::unique_ptr<interfaces::ExternalSigner>> result;
+ for (auto& signer : signers) {
+ result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(signer)));
+ }
+ return result;
#else
// This result is indistinguishable from a successful call that returns
// no signers. For the current GUI this doesn't matter, because the wallet
diff --git a/src/qt/createwalletdialog.cpp b/src/qt/createwalletdialog.cpp
index f9a61c3e60..eba70331f8 100644
--- a/src/qt/createwalletdialog.cpp
+++ b/src/qt/createwalletdialog.cpp
@@ -6,7 +6,7 @@
#include <config/bitcoin-config.h>
#endif
-#include <external_signer.h>
+#include <interfaces/node.h>
#include <qt/createwalletdialog.h>
#include <qt/forms/ui_createwalletdialog.h>
@@ -113,7 +113,7 @@ CreateWalletDialog::~CreateWalletDialog()
delete ui;
}
-void CreateWalletDialog::setSigners(const std::vector<ExternalSigner>& signers)
+void CreateWalletDialog::setSigners(const std::vector<std::unique_ptr<interfaces::ExternalSigner>>& signers)
{
m_has_signers = !signers.empty();
if (m_has_signers) {
@@ -126,7 +126,7 @@ void CreateWalletDialog::setSigners(const std::vector<ExternalSigner>& signers)
ui->blank_wallet_checkbox->setChecked(false);
ui->disable_privkeys_checkbox->setEnabled(false);
ui->disable_privkeys_checkbox->setChecked(true);
- const std::string label = signers[0].m_name;
+ const std::string label = signers[0]->getName();
ui->wallet_name_line_edit->setText(QString::fromStdString(label));
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
} else {
diff --git a/src/qt/createwalletdialog.h b/src/qt/createwalletdialog.h
index fc13cc44eb..63a5e012d8 100644
--- a/src/qt/createwalletdialog.h
+++ b/src/qt/createwalletdialog.h
@@ -7,7 +7,12 @@
#include <QDialog>
+#include <memory>
+
+namespace interfaces {
class ExternalSigner;
+} // namespace interfaces
+
class WalletModel;
namespace Ui {
@@ -24,7 +29,7 @@ public:
explicit CreateWalletDialog(QWidget* parent);
virtual ~CreateWalletDialog();
- void setSigners(const std::vector<ExternalSigner>& signers);
+ void setSigners(const std::vector<std::unique_ptr<interfaces::ExternalSigner>>& signers);
QString walletName() const;
bool isEncryptWalletChecked() const;
diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp
index a0ad59f12a..b9a9fcf3d1 100644
--- a/src/qt/walletcontroller.cpp
+++ b/src/qt/walletcontroller.cpp
@@ -280,9 +280,9 @@ void CreateWalletActivity::create()
{
m_create_wallet_dialog = new CreateWalletDialog(m_parent_widget);
- std::vector<ExternalSigner> signers;
+ std::vector<std::unique_ptr<interfaces::ExternalSigner>> signers;
try {
- signers = node().externalSigners();
+ signers = node().listExternalSigners();
} catch (const std::runtime_error& e) {
QMessageBox::critical(nullptr, tr("Can't list signers"), e.what());
}