mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-05 14:06:27 -05:00
multiprocess: add interfaces::ExternalSigner class
Add interfaces::ExternalSigner to let signer objects be passed between processes and signer code to run in the original process, without multiple processes linking and running signer code.
This commit is contained in:
parent
113b863f07
commit
a032fa30d2
5 changed files with 41 additions and 12 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -274,9 +274,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());
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue