diff --git a/src/db.cpp b/src/db.cpp index 6692db239..9c8c9c4f7 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -528,7 +528,7 @@ bool CAddrDB::LoadAddresses() char psz[1000]; while (fgets(psz, sizeof(psz), filein)) { - CAddress addr(psz, NODE_NETWORK); + CAddress addr(psz, false, NODE_NETWORK); addr.nTime = 0; // so it won't relay unless successfully connected if (addr.IsValid()) AddAddress(addr); diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index 7f4bebb3f..625b8e3f5 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -211,7 +211,7 @@ string TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) { // Offline transaction CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, wallet, address)) + if (ExtractAddress(txout.scriptPubKey, 0, address)) { strHTML += _("To: "); if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty()) diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp index 50767d30f..77c5a0126 100644 --- a/src/qt/transactionrecord.cpp +++ b/src/qt/transactionrecord.cpp @@ -138,7 +138,7 @@ QList TransactionRecord::decomposeTransaction(const CWallet * // Sent to Bitcoin Address sub.type = TransactionRecord::SendToAddress; CBitcoinAddress address; - if (ExtractAddress(txout.scriptPubKey, wallet, address)) + if (ExtractAddress(txout.scriptPubKey, 0, address)) { sub.address = address.ToString(); } diff --git a/src/script.cpp b/src/script.cpp index d1e747251..f5ca87ced 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -1122,31 +1122,38 @@ 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 7d06caaec..c3c234439 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 1baf575a5..fcd49e66b 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());