diff --git a/src/script.cpp b/src/script.cpp index 652240f6863..0fc4611fdad 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -1122,30 +1122,37 @@ bool IsMine(const CKeyStore &keystore, const CScript& scriptPubKey) return true; } - -bool ExtractAddress(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet) +// requires either keystore==0, or a lock on keystore->cs_KeyStore +bool static ExtractAddressInner(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet) { vector > vSolution; if (!Solver(scriptPubKey, vSolution)) return false; - CRITICAL_BLOCK(keystore->cs_KeyStore) + BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution) { - BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution) - { - uint160 hash160; - if (item.first == OP_PUBKEY) - addressRet.SetPubKey(item.second); - else if (item.first == OP_PUBKEYHASH) - addressRet.SetHash160((uint160)item.second); - if (keystore == NULL || keystore->HaveKey(addressRet)) - return true; - } + if (item.first == OP_PUBKEY) + addressRet.SetPubKey(item.second); + else if (item.first == OP_PUBKEYHASH) + addressRet.SetHash160((uint160)item.second); + if (keystore == NULL || keystore->HaveKey(addressRet)) + return true; } return false; } +bool ExtractAddress(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet) +{ + if (keystore) + CRITICAL_BLOCK(keystore->cs_KeyStore) + return ExtractAddressInner(scriptPubKey, keystore, addressRet); + else + return ExtractAddressInner(scriptPubKey, NULL, addressRet); + return false; +} + + bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, int nHashType) { vector > stack; diff --git a/src/ui.cpp b/src/ui.cpp index 7d06caaec4b..c3c234439c7 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -776,6 +776,7 @@ bool CMainFrame::InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex) if (pwalletMain->IsMine(txout)) continue; + CBitcoinAddress address; string strAddress; if (!mapValue["to"].empty()) { @@ -785,15 +786,14 @@ bool CMainFrame::InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex) else { // Sent to Bitcoin Address - CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, pwalletMain, address)) + if (ExtractAddress(txout.scriptPubKey, NULL, address)) strAddress = address.ToString(); } string strDescription = _("To: "); CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook) - if (pwalletMain->mapAddressBook.count(strAddress) && !pwalletMain->mapAddressBook[strAddress].empty()) - strDescription += pwalletMain->mapAddressBook[strAddress] + " "; + if (pwalletMain->mapAddressBook.count(address) && !pwalletMain->mapAddressBook[address].empty()) + strDescription += pwalletMain->mapAddressBook[address] + " "; strDescription += strAddress; if (!mapValue["message"].empty()) { diff --git a/src/wallet.cpp b/src/wallet.cpp index 8c4903b1984..1f3f44bfa0b 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -437,7 +437,7 @@ void CWalletTx::GetAmounts(int64& nGeneratedImmature, int64& nGeneratedMature, l { CBitcoinAddress address; vector vchPubKey; - if (!ExtractAddress(txout.scriptPubKey, pwallet, address)) + if (!ExtractAddress(txout.scriptPubKey, NULL, address)) { printf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n", this->GetHash().ToString().c_str());