From 5b15d790f9cd09779b7c842ce4eb01cadeafa4a1 Mon Sep 17 00:00:00 2001 From: Duke Leto Date: Sun, 11 Sep 2022 21:56:21 -0400 Subject: [PATCH] Parse sweep+consolidation intervals on startup, add consolidationinterval config option, change consolidation interval default to 25, only validate consolidatesaplingaddress if consolidation is enabled --- src/init.cpp | 38 ++++++++++++++++++------ src/wallet/asyncrpcoperation_sweep.cpp | 7 +---- src/wallet/rpcwallet.cpp | 25 ++-------------- src/wallet/wallet.cpp | 40 +++++++++++++------------- src/wallet/wallet.h | 1 + 5 files changed, 54 insertions(+), 57 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 31073cf16..f71423e2a 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -2052,16 +2052,28 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) //Set Sapling Consolidation pwalletMain->fSaplingConsolidationEnabled = GetBoolArg("-consolidation", false); - fConsolidationTxFee = GetArg("-consolidationtxfee", DEFAULT_CONSOLIDATION_FEE); - fConsolidationMapUsed = !mapMultiArgs["-consolidatesaplingaddress"].empty(); + if(pwalletMain->fSaplingConsolidationEnabled) { + fConsolidationTxFee = GetArg("-consolidationtxfee", DEFAULT_CONSOLIDATION_FEE); + fConsolidationMapUsed = !mapMultiArgs["-consolidatesaplingaddress"].empty(); - //Validate Sapling Addresses - vector& vaddresses = mapMultiArgs["-consolidatesaplingaddress"]; - for (int i = 0; i < vaddresses.size(); i++) { - LogPrintf("Consolidating Sapling Address: %s\n", vaddresses[i]); - auto zAddress = DecodePaymentAddress(vaddresses[i]); - if (!IsValidPaymentAddress(zAddress)) { - return InitError("Invalid consolidation address"); + int consolidationInterval = GetArg("-consolidationinterval", 25); + if (consolidationInterval < 5) { + fprintf(stderr,"%s: Invalid consolidation interval of %d < 5, setting to default of 25\n", __func__, consolidationInterval); + consolidationInterval = 25; + } + + pwalletMain->consolidationInterval = consolidationInterval; + pwalletMain->nextConsolidation = pwalletMain->consolidationInterval + chainActive.Tip()->GetHeight(); + LogPrintf("%s: set nextConsolidation=%d\n", __func__, pwalletMain->nextConsolidation ); + + //Validate Sapling Addresses + vector& vaddresses = mapMultiArgs["-consolidatesaplingaddress"]; + for (int i = 0; i < vaddresses.size(); i++) { + LogPrintf("Consolidating Sapling Address: %s\n", vaddresses[i]); + auto zAddress = DecodePaymentAddress(vaddresses[i]); + if (!IsValidPaymentAddress(zAddress)) { + return InitError("Invalid consolidation address"); + } } } @@ -2069,6 +2081,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) pwalletMain->fSweepEnabled = GetBoolArg("-zsweep", false); if (pwalletMain->fSweepEnabled) { + int sweepInterval = GetArg("-zsweepinterval", 10); + if (sweepInterval < 5) { + fprintf(stderr,"%s: Invalid sweep interval of %d, setting to default of 10\n", __func__, sweepInterval); + sweepInterval = 10; + } + pwalletMain->sweepInterval = sweepInterval; + pwalletMain->nextSweep = pwalletMain->sweepInterval + chainActive.Tip()->GetHeight(); + LogPrintf("%s: set nextSweep=%d with sweepInterval=%d\n", __func__, pwalletMain->nextSweep, pwalletMain->sweepInterval ); fSweepTxFee = GetArg("-zsweepfee", DEFAULT_SWEEP_FEE); fSweepMapUsed = !mapMultiArgs["-zsweepaddress"].empty(); diff --git a/src/wallet/asyncrpcoperation_sweep.cpp b/src/wallet/asyncrpcoperation_sweep.cpp index 6045cf46f..1e7d324af 100644 --- a/src/wallet/asyncrpcoperation_sweep.cpp +++ b/src/wallet/asyncrpcoperation_sweep.cpp @@ -284,12 +284,7 @@ bool AsyncRPCOperation_sweep::main_impl() { } if (sweepComplete) { - int sweepInterval = GetArg("-zsweepinterval", 10); - if (sweepInterval < 5) { - fprintf(stderr,"%s: Invalid sweep interval of %d, setting to default of 10\n", __func__, sweepInterval); - sweepInterval = 10; - } - pwalletMain->nextSweep = sweepInterval + chainActive.Tip()->GetHeight(); + pwalletMain->nextSweep = pwalletMain->sweepInterval + chainActive.Tip()->GetHeight(); pwalletMain->fSweepRunning = false; } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ced9b19b2..eaa9e436a 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3337,18 +3337,8 @@ UniValue z_consolidationstatus(const UniValue& params, bool fHelp, const CPubKey ret.push_back(Pair("consolidation", pwalletMain->fSaplingConsolidationEnabled)); ret.push_back(Pair("running", pwalletMain->fConsolidationRunning)); ret.push_back(Pair("amount_consolidated", pwalletMain->amountConsolidated)); - - if (pwalletMain->fConsolidationRunning) { - // TODO: set a static consolidationInterval instead of it being non-deterministic - // ret.push_back(Pair("next_consolidation", pwalletMain->consolidationInterval + chainActive.Tip()->GetHeight())); - } else { - if (pwalletMain->nextConsolidation == 0) { - ret.push_back(Pair("next_consolidation", chainActive.Tip()->GetHeight() + 1)); - } else { - ret.push_back(Pair("next_consolidation", pwalletMain->nextConsolidation)); - } - } - // ret.push_back(Pair("consolidationinterval", pwalletMain->consolidationInterval)); + ret.push_back(Pair("next_consolidation", pwalletMain->nextConsolidation)); + ret.push_back(Pair("consolidationinterval", pwalletMain->consolidationInterval)); ret.push_back(Pair("consolidationaddress", pwalletMain->consolidationAddress)); ret.push_back(Pair("consolidationtxfee",(int)fConsolidationTxFee)); @@ -3377,16 +3367,7 @@ UniValue z_sweepstatus(const UniValue& params, bool fHelp, const CPubKey& mypk) ret.push_back(Pair("zsweep", pwalletMain->fSweepEnabled)); ret.push_back(Pair("running", pwalletMain->fSweepRunning)); ret.push_back(Pair("amount_swept", pwalletMain->amountSwept)); - - if (pwalletMain->fConsolidationRunning) { - ret.push_back(Pair("next_zsweep", pwalletMain->sweepInterval + chainActive.Tip()->GetHeight())); - } else { - if (pwalletMain->nextSweep == 0) { - ret.push_back(Pair("next_zsweep", chainActive.Tip()->GetHeight() + 1)); - } else { - ret.push_back(Pair("next_zsweep", pwalletMain->nextSweep)); - } - } + ret.push_back(Pair("next_zsweep", pwalletMain->nextSweep)); ret.push_back(Pair("zsweepinterval", pwalletMain->sweepInterval)); ret.push_back(Pair("zsweepaddress", pwalletMain->sweepAddress)); ret.push_back(Pair("zsweepmaxinputs", pwalletMain->sweepMaxInputs)); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index e8434afcf..85faac38b 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -515,10 +515,11 @@ void CWallet::RunSaplingSweep(int blockHeight) { return; } - LogPrintf("%s: Sweep enabled at blockHeight=%d nextSweep=%d\n", __func__, blockHeight, nextSweep); if (nextSweep > blockHeight) { + LogPrintf("%s: Not time to sweep yet at blockHeight=%d nextSweep=%d\n", __func__, blockHeight, nextSweep); return; } + LogPrintf("%s: Sweep enabled at blockHeight=%d nextSweep=%d\n", __func__, blockHeight, nextSweep); //Don't Run if consolidation will run soon. if (fSaplingConsolidationEnabled && nextConsolidation - 5 <= blockHeight) { @@ -528,7 +529,7 @@ void CWallet::RunSaplingSweep(int blockHeight) { //Don't Run While consolidation is running. if (fConsolidationRunning) { - LogPrintf("%s: not sweeping since consolidation is currently running\n", __func__); + LogPrintf("%s: not sweeping since consolidation is currently running at height=%d\n", __func__, blockHeight); return; } @@ -557,29 +558,28 @@ void CWallet::RunSaplingConsolidation(int blockHeight) { return; } - LogPrintf("%s: consolidation enabled at blockHeight=%d fSweepRunning=%d\n", __func__, blockHeight, fSweepRunning ); - - if (fSweepRunning) { + if (nextConsolidation > blockHeight) { + LogPrintf("%s: Not time to consolidate yet at blockHeight=%d nextConsolidation=%d\n", __func__, blockHeight, nextConsolidation); return; } - int consolidateInterval = 45; + LogPrintf("%s: consolidation enabled at blockHeight=%d fSweepRunning=%d\n", __func__, blockHeight, fSweepRunning ); - if(fZdebug) - fprintf(stderr,"%s: height=%d interval=%d\n", __func__, blockHeight, consolidateInterval); - - if (blockHeight % consolidateInterval == 0) { - LogPrintf("%s: creating consolidation operation at blockHeight=%d\n", __func__, blockHeight); - std::shared_ptr q = getAsyncRPCQueue(); - std::shared_ptr lastOperation = q->getOperationForId(saplingConsolidationOperationId); - if (lastOperation != nullptr) { - lastOperation->cancel(); - } - pendingSaplingConsolidationTxs.clear(); - std::shared_ptr operation(new AsyncRPCOperation_saplingconsolidation(blockHeight + 5)); - saplingConsolidationOperationId = operation->getId(); - q->addOperation(operation); + if (fSweepRunning) { + LogPrintf("%s: not consolidating since sweep is currently running at height=%d\n", __func__, blockHeight); + return; } + + LogPrintf("%s: creating consolidation operation at blockHeight=%d\n", __func__, blockHeight); + std::shared_ptr q = getAsyncRPCQueue(); + std::shared_ptr lastOperation = q->getOperationForId(saplingConsolidationOperationId); + if (lastOperation != nullptr) { + lastOperation->cancel(); + } + pendingSaplingConsolidationTxs.clear(); + std::shared_ptr operation(new AsyncRPCOperation_saplingconsolidation(blockHeight + 5)); + saplingConsolidationOperationId = operation->getId(); + q->addOperation(operation); } bool CWallet::CommitAutomatedTx(const CTransaction& tx) { diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 147ed6dbc..f5e07e9da 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -811,6 +811,7 @@ public: int amountSwept = 0; int amountConsolidated = 0; int sweepInterval = 10; + int consolidationInterval = 25; int sweepFee = 10000; int sweepMaxInputs = 200; std::string sweepAddress = "";