mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-12-12 05:34:57 +01:00
Merge #10244: Refactor: separate gui from wallet and node
9960137Add developer notes about blocking GUI code (Russell Yanofsky)9a61eedUse WalletBalances struct in Qt (Russell Yanofsky)56f33caRemove direct bitcoin calls from qt/sendcoinsdialog.cpp (Russell Yanofsky)e872c93Remove direct bitcoin access from qt/guiutil.cpp (Russell Yanofsky)5884558Remove direct bitcoin calls from qt transaction table files (Russell Yanofsky)3cab2ceRemove direct bitcoin calls from qt/paymentserver.cpp (Russell Yanofsky)3ec2ebcRemove direct bitcoin calls from qt/addresstablemodel.cpp (Russell Yanofsky)827de03Remove direct bitcoin calls from qt/coincontroldialog.cpp (Russell Yanofsky)a0704a8Remove most direct bitcoin calls from qt/walletmodel.cpp (Russell Yanofsky)90d4640Remove direct bitcoin calls from qt/optionsdialog.cpp (Russell Yanofsky)582daf6Remove direct bitcoin calls from qt/rpcconsole.cpp (Russell Yanofsky)3034a46Remove direct bitcoin calls from qt/bantablemodel.cpp (Russell Yanofsky)e0b66a3Remove direct bitcoin calls from qt/peertablemodel.cpp (Russell Yanofsky)d7c2c95Remove direct bitcoin calls from qt/intro.cpp (Russell Yanofsky)fe6f27eRemove direct bitcoin calls from qt/clientmodel.cpp (Russell Yanofsky)5fba3afRemove direct bitcoin calls from qt/splashscreen.cpp (Russell Yanofsky)c2f672fRemove direct bitcoin calls from qt/utilitydialog.cpp (Russell Yanofsky)3d619e9Remove direct bitcoin calls from qt/bitcoingui.cpp (Russell Yanofsky)c0f2756Remove direct bitcoin calls from qt/optionsmodel.cpp (Russell Yanofsky)71e0d90Remove direct bitcoin calls from qt/bitcoin.cpp (Russell Yanofsky)ea73b84Add src/interface/README.md (Russell Yanofsky) Pull request description: This is a refactoring PR that does not change behavior in any way. This change: 1. Creates abstract [`Node`](https://github.com/ryanofsky/bitcoin/blob/pr/ipc-local/src/interface/node.h) and [`Wallet`](https://github.com/ryanofsky/bitcoin/blob/pr/ipc-local/src/interface/wallet.h) interfaces in [`src/interface/`](https://github.com/ryanofsky/bitcoin/tree/pr/ipc-local/src/interface) 1. Updates Qt code to call the new interfaces. This largely consists of diffs of the form: ```diff - InitLogging(); - InitParameterInteraction(); + node.initLogging(); + node.initParameterInteraction(); ``` This change allows followup PR #10102 (makes `bitcoin-qt` control `bitcoind` over an IPC socket) to work without any significant updates to Qt code. Additionally: * It provides a single place to describe the interface between GUI and daemon code. * It can make better GUI testing possible, because Node and Wallet objects have virtual methods that can be overloaded for mocking. * It can be used to help make the GUI more responsive (see https://github.com/bitcoin/bitcoin/issues/10504) Other notes: * I used python scripts [hide-globals.py](https://github.com/ryanofsky/home/blob/master/src/2017/hide-globals/hide-globals.py) and [replace-syms.py](https://github.com/ryanofsky/home/blob/master/src/2017/hide-globals/replace-syms.py) to identify all the places where Qt code was accessing libbitcoin global variables and calling functions accessing those global variables. * These changes were originally part of #10102. Thanks to @JeremyRubin for the suggestion of splitting them out. Commits: - [`ea73b84d2d` Add src/interface/README.md](ea73b84d2d) - [`71e0d90876` Remove direct bitcoin calls from qt/bitcoin.cpp](71e0d90876) - [`c0f2756be5` Remove direct bitcoin calls from qt/optionsmodel.cpp](c0f2756be5) - [`3d619e9d36` Remove direct bitcoin calls from qt/bitcoingui.cpp](3d619e9d36) - [`c2f672fb19` Remove direct bitcoin calls from qt/utilitydialog.cpp](c2f672fb19) - [`5fba3af21e` Remove direct bitcoin calls from qt/splashscreen.cpp](5fba3af21e) - [`fe6f27e6ea` Remove direct bitcoin calls from qt/clientmodel.cpp](fe6f27e6ea) - [`d7c2c95948` Remove direct bitcoin calls from qt/intro.cpp](d7c2c95948) - [`e0b66a3b7c` Remove direct bitcoin calls from qt/peertablemodel.cpp](e0b66a3b7c) - [`3034a462a5` Remove direct bitcoin calls from qt/bantablemodel.cpp](3034a462a5) - [`582daf6d22` Remove direct bitcoin calls from qt/rpcconsole.cpp](582daf6d22) - [`90d4640b7e` Remove direct bitcoin calls from qt/optionsdialog.cpp](90d4640b7e) - [`a0704a8996` Remove most direct bitcoin calls from qt/walletmodel.cpp](a0704a8996) - [`827de038ab` Remove direct bitcoin calls from qt/coincontroldialog.cpp](827de038ab) - [`3ec2ebcd9b` Remove direct bitcoin calls from qt/addresstablemodel.cpp](3ec2ebcd9b) - [`3cab2ce5f9` Remove direct bitcoin calls from qt/paymentserver.cpp](3cab2ce5f9) - [`58845587e1` Remove direct bitcoin calls from qt transaction table files](58845587e1) - [`e872c93ee8` Remove direct bitcoin access from qt/guiutil.cpp](e872c93ee8) - [`56f33ca349` Remove direct bitcoin calls from qt/sendcoinsdialog.cpp](56f33ca349) - [`9a61eed1fc` Use WalletBalances struct in Qt](9a61eed1fc) - [`9960137697` Add developer notes about blocking GUI code](9960137697) Tree-SHA512: 7b9eff2f37d4ea21972d7cc6a3dbe144248595d6c330524396d867f3cd2841d666cdc040fd3605af559dab51b075812402f61d628d16cf13719335c1d8bf8ed3
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include <qt/optionsmodel.h>
|
||||
|
||||
#include <chainparams.h>
|
||||
#include <interface/node.h>
|
||||
#include <policy/policy.h>
|
||||
#include <key_io.h>
|
||||
#include <ui_interface.h>
|
||||
@@ -200,7 +201,7 @@ void PaymentServer::LoadRootCAs(X509_STORE* _store)
|
||||
// Warning: ipcSendCommandLine() is called early in init,
|
||||
// so don't use "Q_EMIT message()", but "QMessageBox::"!
|
||||
//
|
||||
void PaymentServer::ipcParseCommandLine(int argc, char* argv[])
|
||||
void PaymentServer::ipcParseCommandLine(interface::Node& node, int argc, char* argv[])
|
||||
{
|
||||
for (int i = 1; i < argc; i++)
|
||||
{
|
||||
@@ -222,11 +223,11 @@ void PaymentServer::ipcParseCommandLine(int argc, char* argv[])
|
||||
auto tempChainParams = CreateChainParams(CBaseChainParams::MAIN);
|
||||
|
||||
if (IsValidDestinationString(r.address.toStdString(), *tempChainParams)) {
|
||||
SelectParams(CBaseChainParams::MAIN);
|
||||
node.selectParams(CBaseChainParams::MAIN);
|
||||
} else {
|
||||
tempChainParams = CreateChainParams(CBaseChainParams::TESTNET);
|
||||
if (IsValidDestinationString(r.address.toStdString(), *tempChainParams)) {
|
||||
SelectParams(CBaseChainParams::TESTNET);
|
||||
node.selectParams(CBaseChainParams::TESTNET);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -240,11 +241,11 @@ void PaymentServer::ipcParseCommandLine(int argc, char* argv[])
|
||||
{
|
||||
if (request.getDetails().network() == "main")
|
||||
{
|
||||
SelectParams(CBaseChainParams::MAIN);
|
||||
node.selectParams(CBaseChainParams::MAIN);
|
||||
}
|
||||
else if (request.getDetails().network() == "test")
|
||||
{
|
||||
SelectParams(CBaseChainParams::TESTNET);
|
||||
node.selectParams(CBaseChainParams::TESTNET);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -527,7 +528,7 @@ bool PaymentServer::processPaymentRequest(const PaymentRequestPlus& request, Sen
|
||||
|
||||
if (request.IsInitialized()) {
|
||||
// Payment request network matches client network?
|
||||
if (!verifyNetwork(request.getDetails())) {
|
||||
if (!verifyNetwork(optionsModel->node(), request.getDetails())) {
|
||||
Q_EMIT message(tr("Payment request rejected"), tr("Payment request network doesn't match client network."),
|
||||
CClientUIInterface::MSG_ERROR);
|
||||
|
||||
@@ -584,7 +585,7 @@ bool PaymentServer::processPaymentRequest(const PaymentRequestPlus& request, Sen
|
||||
|
||||
// Extract and check amounts
|
||||
CTxOut txOut(sendingTo.second, sendingTo.first);
|
||||
if (IsDust(txOut, ::dustRelayFee)) {
|
||||
if (IsDust(txOut, optionsModel->node().getDustRelayFee())) {
|
||||
Q_EMIT message(tr("Payment request error"), tr("Requested payment amount of %1 is too small (considered dust).")
|
||||
.arg(BitcoinUnits::formatWithUnit(optionsModel->getDisplayUnit(), sendingTo.second)),
|
||||
CClientUIInterface::MSG_ERROR);
|
||||
@@ -622,7 +623,7 @@ void PaymentServer::fetchRequest(const QUrl& url)
|
||||
netManager->get(netRequest);
|
||||
}
|
||||
|
||||
void PaymentServer::fetchPaymentACK(CWallet* wallet, const SendCoinsRecipient& recipient, QByteArray transaction)
|
||||
void PaymentServer::fetchPaymentACK(WalletModel* walletModel, const SendCoinsRecipient& recipient, QByteArray transaction)
|
||||
{
|
||||
const payments::PaymentDetails& details = recipient.paymentRequest.getDetails();
|
||||
if (!details.has_payment_url())
|
||||
@@ -641,17 +642,17 @@ void PaymentServer::fetchPaymentACK(CWallet* wallet, const SendCoinsRecipient& r
|
||||
|
||||
// Create a new refund address, or re-use:
|
||||
CPubKey newKey;
|
||||
if (wallet->GetKeyFromPool(newKey)) {
|
||||
if (walletModel->wallet().getKeyFromPool(false /* internal */, newKey)) {
|
||||
// BIP70 requests encode the scriptPubKey directly, so we are not restricted to address
|
||||
// types supported by the receiver. As a result, we choose the address format we also
|
||||
// use for change. Despite an actual payment and not change, this is a close match:
|
||||
// it's the output type we use subject to privacy issues, but not restricted by what
|
||||
// other software supports.
|
||||
const OutputType change_type = wallet->m_default_change_type != OutputType::NONE ? wallet->m_default_change_type : wallet->m_default_address_type;
|
||||
wallet->LearnRelatedScripts(newKey, change_type);
|
||||
const OutputType change_type = walletModel->wallet().getDefaultChangeType() != OutputType::NONE ? walletModel->wallet().getDefaultChangeType() : walletModel->wallet().getDefaultAddressType();
|
||||
walletModel->wallet().learnRelatedScripts(newKey, change_type);
|
||||
CTxDestination dest = GetDestinationForKey(newKey, change_type);
|
||||
std::string label = tr("Refund from %1").arg(recipient.authenticatedMerchant).toStdString();
|
||||
wallet->SetAddressBook(dest, label, "refund");
|
||||
walletModel->wallet().setAddressBook(dest, label, "refund");
|
||||
|
||||
CScript s = GetScriptForDestination(dest);
|
||||
payments::Output* refund_to = payment.add_refund_to();
|
||||
@@ -759,14 +760,14 @@ void PaymentServer::handlePaymentACK(const QString& paymentACKMsg)
|
||||
Q_EMIT message(tr("Payment acknowledged"), paymentACKMsg, CClientUIInterface::ICON_INFORMATION | CClientUIInterface::MODAL);
|
||||
}
|
||||
|
||||
bool PaymentServer::verifyNetwork(const payments::PaymentDetails& requestDetails)
|
||||
bool PaymentServer::verifyNetwork(interface::Node& node, const payments::PaymentDetails& requestDetails)
|
||||
{
|
||||
bool fVerified = requestDetails.network() == Params().NetworkIDString();
|
||||
bool fVerified = requestDetails.network() == node.getNetwork();
|
||||
if (!fVerified) {
|
||||
qWarning() << QString("PaymentServer::%1: Payment request network \"%2\" doesn't match client network \"%3\".")
|
||||
.arg(__func__)
|
||||
.arg(QString::fromStdString(requestDetails.network()))
|
||||
.arg(QString::fromStdString(Params().NetworkIDString()));
|
||||
.arg(QString::fromStdString(node.getNetwork()));
|
||||
}
|
||||
return fVerified;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user