mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-11 20:32:35 -03:00
Reduce inefficiency of GetAccountAddress()
Don't scan the wallet to see if the current key has been used if we're going to make a new key anyway. Stop scanning the wallet as soon as we see that the current key has been used. Don't call isValid() twice on the current key.
This commit is contained in:
parent
be9a9a3d22
commit
2409865e14
1 changed files with 15 additions and 16 deletions
|
@ -137,26 +137,25 @@ CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false)
|
|||
CAccount account;
|
||||
walletdb.ReadAccount(strAccount, account);
|
||||
|
||||
bool bKeyUsed = false;
|
||||
|
||||
// Check if the current key has been used
|
||||
if (account.vchPubKey.IsValid())
|
||||
{
|
||||
CScript scriptPubKey = GetScriptForDestination(account.vchPubKey.GetID());
|
||||
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin();
|
||||
it != pwalletMain->mapWallet.end() && account.vchPubKey.IsValid();
|
||||
++it)
|
||||
{
|
||||
const CWalletTx& wtx = (*it).second;
|
||||
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
|
||||
if (txout.scriptPubKey == scriptPubKey)
|
||||
bKeyUsed = true;
|
||||
if (!bForceNew) {
|
||||
if (!account.vchPubKey.IsValid())
|
||||
bForceNew = true;
|
||||
else {
|
||||
// Check if the current key has been used
|
||||
CScript scriptPubKey = GetScriptForDestination(account.vchPubKey.GetID());
|
||||
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin();
|
||||
it != pwalletMain->mapWallet.end() && account.vchPubKey.IsValid();
|
||||
++it)
|
||||
BOOST_FOREACH(const CTxOut& txout, (*it).second.vout)
|
||||
if (txout.scriptPubKey == scriptPubKey) {
|
||||
bForceNew = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Generate a new key
|
||||
if (!account.vchPubKey.IsValid() || bForceNew || bKeyUsed)
|
||||
{
|
||||
if (bForceNew) {
|
||||
if (!pwalletMain->GetKeyFromPool(account.vchPubKey))
|
||||
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
|
||||
|
||||
|
|
Loading…
Reference in a new issue