Use `std::optional` in `CValidationInterface::GetAddressForMining`
The initial value for the provided return value is now `std::nullopt` instead of the default value of the `MinerAddress` variant. This makes it easier to distinguish "no miner address was provided" from "invalid miner address".
This commit is contained in:
parent
1732a50957
commit
1c31a1c7d8
|
@ -726,7 +726,7 @@ std::optional<MinerAddress> ExtractMinerAddress::operator()(const libzcash::Unif
|
|||
}
|
||||
|
||||
|
||||
void GetMinerAddress(MinerAddress &minerAddress)
|
||||
void GetMinerAddress(std::optional<MinerAddress> &minerAddress)
|
||||
{
|
||||
KeyIO keyIO(Params());
|
||||
|
||||
|
@ -804,8 +804,8 @@ void static BitcoinMiner(const CChainParams& chainparams)
|
|||
// Each thread has its own counter
|
||||
unsigned int nExtraNonce = 0;
|
||||
|
||||
MinerAddress minerAddress;
|
||||
GetMainSignals().AddressForMining(minerAddress);
|
||||
std::optional<MinerAddress> maybeMinerAddress;
|
||||
GetMainSignals().AddressForMining(maybeMinerAddress);
|
||||
|
||||
unsigned int n = chainparams.GetConsensus().nEquihashN;
|
||||
unsigned int k = chainparams.GetConsensus().nEquihashK;
|
||||
|
@ -826,9 +826,10 @@ void static BitcoinMiner(const CChainParams& chainparams)
|
|||
|
||||
try {
|
||||
// Throw an error if no address valid for mining was provided.
|
||||
if (!std::visit(IsValidMinerAddress(), minerAddress)) {
|
||||
if (!(maybeMinerAddress.has_value() && std::visit(IsValidMinerAddress(), maybeMinerAddress.value()))) {
|
||||
throw std::runtime_error("No miner address available (mining requires a wallet or -mineraddress)");
|
||||
}
|
||||
auto minerAddress = maybeMinerAddress.value();
|
||||
|
||||
while (true) {
|
||||
if (chainparams.MiningRequiresPeers()) {
|
||||
|
|
|
@ -89,7 +89,7 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const MinerAddre
|
|||
|
||||
#ifdef ENABLE_MINING
|
||||
/** Get -mineraddress */
|
||||
void GetMinerAddress(MinerAddress &minerAddress);
|
||||
void GetMinerAddress(std::optional<MinerAddress> &minerAddress);
|
||||
/** Modify the extranonce in a block */
|
||||
void IncrementExtraNonce(
|
||||
CBlockTemplate* pblocktemplate,
|
||||
|
|
|
@ -186,8 +186,14 @@ UniValue generate(const UniValue& params, bool fHelp)
|
|||
int nHeight = 0;
|
||||
int nGenerate = params[0].get_int();
|
||||
|
||||
MinerAddress minerAddress;
|
||||
GetMainSignals().AddressForMining(minerAddress);
|
||||
std::optional<MinerAddress> maybeMinerAddress;
|
||||
GetMainSignals().AddressForMining(maybeMinerAddress);
|
||||
|
||||
// Throw an error if no address valid for mining was provided.
|
||||
if (!(maybeMinerAddress.has_value() && std::visit(IsValidMinerAddress(), maybeMinerAddress.value()))) {
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "No miner address available (mining requires a wallet or -mineraddress)");
|
||||
}
|
||||
auto minerAddress = maybeMinerAddress.value();
|
||||
|
||||
// If the keypool is exhausted, no script is returned at all. Catch this.
|
||||
auto resv = std::get_if<boost::shared_ptr<CReserveScript>>(&minerAddress);
|
||||
|
@ -195,11 +201,6 @@ UniValue generate(const UniValue& params, bool fHelp)
|
|||
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
|
||||
}
|
||||
|
||||
// Throw an error if no address valid for mining was provided.
|
||||
if (!std::visit(IsValidMinerAddress(), minerAddress)) {
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "No miner address available (mining requires a wallet or -mineraddress)");
|
||||
}
|
||||
|
||||
{ // Don't keep cs_main locked
|
||||
LOCK(cs_main);
|
||||
nHeightStart = chainActive.Height();
|
||||
|
@ -569,9 +570,14 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
|
|||
if (IsInitialBlockDownload(Params().GetConsensus()))
|
||||
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Zcash is downloading blocks...");
|
||||
|
||||
std::optional<MinerAddress> maybeMinerAddress;
|
||||
GetMainSignals().AddressForMining(maybeMinerAddress);
|
||||
|
||||
MinerAddress minerAddress;
|
||||
GetMainSignals().AddressForMining(minerAddress);
|
||||
// Throw an error if no address valid for mining was provided.
|
||||
if (!(maybeMinerAddress.has_value() && std::visit(IsValidMinerAddress(), maybeMinerAddress.value()))) {
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "No miner address available (getblocktemplate requires a wallet or -mineraddress)");
|
||||
}
|
||||
auto minerAddress = maybeMinerAddress.value();
|
||||
|
||||
static unsigned int nTransactionsUpdatedLast;
|
||||
static std::optional<CMutableTransaction> cached_next_cb_mtx;
|
||||
|
|
|
@ -42,7 +42,7 @@ protected:
|
|||
virtual void Inventory(const uint256 &hash) {}
|
||||
virtual void ResendWalletTransactions(int64_t nBestBlockTime) {}
|
||||
virtual void BlockChecked(const CBlock&, const CValidationState&) {}
|
||||
virtual void GetAddressForMining(MinerAddress&) {};
|
||||
virtual void GetAddressForMining(std::optional<MinerAddress>&) {};
|
||||
virtual void ResetRequestCount(const uint256 &hash) {};
|
||||
friend void ::RegisterValidationInterface(CValidationInterface*);
|
||||
friend void ::UnregisterValidationInterface(CValidationInterface*);
|
||||
|
@ -67,7 +67,7 @@ struct CMainSignals {
|
|||
/** Notifies listeners of a block validation result */
|
||||
boost::signals2::signal<void (const CBlock&, const CValidationState&)> BlockChecked;
|
||||
/** Notifies listeners that an address for mining is required (coinbase) */
|
||||
boost::signals2::signal<void (MinerAddress&)> AddressForMining;
|
||||
boost::signals2::signal<void (std::optional<MinerAddress>&)> AddressForMining;
|
||||
/** Notifies listeners that a block has been successfully mined */
|
||||
boost::signals2::signal<void (const uint256 &)> BlockFound;
|
||||
};
|
||||
|
|
|
@ -5547,7 +5547,7 @@ void CWallet::UpdatedTransaction(const uint256 &hashTx)
|
|||
}
|
||||
}
|
||||
|
||||
void CWallet::GetAddressForMining(MinerAddress &minerAddress)
|
||||
void CWallet::GetAddressForMining(std::optional<MinerAddress> &minerAddress)
|
||||
{
|
||||
if (!GetArg("-mineraddress", "").empty()) {
|
||||
return;
|
||||
|
|
|
@ -1719,7 +1719,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void GetAddressForMining(MinerAddress &minerAddress);
|
||||
void GetAddressForMining(std::optional<MinerAddress> &minerAddress);
|
||||
void ResetRequestCount(const uint256 &hash)
|
||||
{
|
||||
LOCK(cs_wallet);
|
||||
|
|
Loading…
Reference in New Issue