aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2015-03-27 10:34:48 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2015-04-01 13:03:39 +0200
commit6f252627b2843ff5072cb702b47e241f4ffbed92 (patch)
treea9898b0f2db439fadd759f5b3b3b99456128f49d /src
parent41113e33ad62333d99fd8cc6bf717c0794681d86 (diff)
wallet: make it possible to disable transaction broadcast
This is an advanced feature which will disable any kind of automatic transaction broadcasting in the wallet. This gives the user full control of how the transaction is sent. For example they can broadcast new transactions through some other mechanism themselves, after getting the transaction hex through `gettransaction`. This just adds the option `-walletbroadcast=<0,1>`. Right now these transactions will get the status Status: conflicted, has not been successfully broadcast yet They shouldn't be shown as conflicted at all (`walletconflicts` is empty). This status will go away when the transaction is received through the network.
Diffstat (limited to 'src')
-rw-r--r--src/init.cpp2
-rw-r--r--src/wallet/wallet.cpp21
-rw-r--r--src/wallet/wallet.h7
3 files changed, 23 insertions, 7 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 2a13af6690..9445e2fa10 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -337,6 +337,7 @@ std::string HelpMessage(HelpMessageMode mode)
FormatMoney(maxTxFee)));
strUsage += HelpMessageOpt("-upgradewallet", _("Upgrade wallet to latest format") + " " + _("on startup"));
strUsage += HelpMessageOpt("-wallet=<file>", _("Specify wallet file (within data directory)") + " " + strprintf(_("(default: %s)"), "wallet.dat"));
+ strUsage += HelpMessageOpt("-walletbroadcast", _("Make the wallet broadcast transactions") + " " + strprintf(_("(default: %u)"), true));
strUsage += HelpMessageOpt("-walletnotify=<cmd>", _("Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)"));
strUsage += HelpMessageOpt("-zapwallettxes=<mode>", _("Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup") +
" " + _("(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)"));
@@ -1242,6 +1243,7 @@ bool AppInit2(boost::thread_group& threadGroup)
}
}
}
+ pwalletMain->SetBroadcastTransactions(GetBoolArg("-walletbroadcast", true));
} // (!fDisableWallet)
#else // ENABLE_WALLET
LogPrintf("No wallet compiled in!\n");
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index a10123002e..2566b2712b 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -1096,6 +1096,9 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
void CWallet::ReacceptWalletTransactions()
{
+ // If transcations aren't broadcasted, don't let them into local mempool either
+ if (!fBroadcastTransactions)
+ return;
LOCK2(cs_main, cs_wallet);
BOOST_FOREACH(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet)
{
@@ -1116,6 +1119,7 @@ void CWallet::ReacceptWalletTransactions()
bool CWalletTx::RelayWalletTransaction()
{
+ assert(pwallet->GetBroadcastTransactions());
if (!IsCoinBase())
{
if (GetDepthInMainChain() == 0) {
@@ -1354,7 +1358,7 @@ void CWallet::ResendWalletTransactions(int64_t nBestBlockTime)
{
// Do this infrequently and randomly to avoid giving away
// that these are our transactions.
- if (GetTime() < nNextResend)
+ if (GetTime() < nNextResend || !fBroadcastTransactions)
return;
bool fFirst = (nNextResend == 0);
nNextResend = GetTime() + GetRand(30 * 60);
@@ -1979,14 +1983,17 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
// Track how many getdata requests our transaction gets
mapRequestCount[wtxNew.GetHash()] = 0;
- // Broadcast
- if (!wtxNew.AcceptToMemoryPool(false))
+ if (fBroadcastTransactions)
{
- // This must not fail. The transaction has already been signed and recorded.
- LogPrintf("CommitTransaction(): Error: Transaction not valid");
- return false;
+ // Broadcast
+ if (!wtxNew.AcceptToMemoryPool(false))
+ {
+ // This must not fail. The transaction has already been signed and recorded.
+ LogPrintf("CommitTransaction(): Error: Transaction not valid");
+ return false;
+ }
+ wtxNew.RelayWalletTransaction();
}
- wtxNew.RelayWalletTransaction();
}
return true;
}
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index 6ae1c87b1d..4dbb0e2e57 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -455,6 +455,7 @@ private:
int64_t nNextResend;
int64_t nLastResend;
+ bool fBroadcastTransactions;
/**
* Used to keep track of spent outpoints, and
@@ -518,6 +519,7 @@ public:
nNextResend = 0;
nLastResend = 0;
nTimeFirstKey = 0;
+ fBroadcastTransactions = false;
}
std::map<uint256, CWalletTx> mapWallet;
@@ -723,6 +725,11 @@ public:
/** Watch-only address added */
boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
+
+ /** Inquire whether this wallet broadcasts transactions. */
+ bool GetBroadcastTransactions() const { return fBroadcastTransactions; }
+ /** Set whether this wallet broadcasts transactions. */
+ void SetBroadcastTransactions(bool broadcast) { fBroadcastTransactions = broadcast; }
};
/** A key allocated from the key pool. */