Browse Source

Bugfix: don't overuse limited ExtractAddress

ExtractAddress was called with the keystore as argument in RPC and
UI, limiting results to own keys. This caused empty "address"
fields.
miguelfreitas
Pieter Wuille 14 years ago
parent
commit
b63241d451
  1. 17
      src/script.cpp
  2. 8
      src/ui.cpp
  3. 2
      src/wallet.cpp

17
src/script.cpp

@ -1122,18 +1122,15 @@ bool IsMine(const CKeyStore &keystore, const CScript& scriptPubKey)
return true; return true;
} }
// requires either keystore==0, or a lock on keystore->cs_KeyStore
bool ExtractAddress(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet) bool static ExtractAddressInner(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet)
{ {
vector<pair<opcodetype, valtype> > vSolution; vector<pair<opcodetype, valtype> > vSolution;
if (!Solver(scriptPubKey, vSolution)) if (!Solver(scriptPubKey, vSolution))
return false; 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) if (item.first == OP_PUBKEY)
addressRet.SetPubKey(item.second); addressRet.SetPubKey(item.second);
else if (item.first == OP_PUBKEYHASH) else if (item.first == OP_PUBKEYHASH)
@ -1141,7 +1138,17 @@ bool ExtractAddress(const CScript& scriptPubKey, const CKeyStore* keystore, CBit
if (keystore == NULL || keystore->HaveKey(addressRet)) if (keystore == NULL || keystore->HaveKey(addressRet))
return true; 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; return false;
} }

8
src/ui.cpp

@ -776,6 +776,7 @@ bool CMainFrame::InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex)
if (pwalletMain->IsMine(txout)) if (pwalletMain->IsMine(txout))
continue; continue;
CBitcoinAddress address;
string strAddress; string strAddress;
if (!mapValue["to"].empty()) if (!mapValue["to"].empty())
{ {
@ -785,15 +786,14 @@ bool CMainFrame::InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex)
else else
{ {
// Sent to Bitcoin Address // Sent to Bitcoin Address
CBitcoinAddress address; if (ExtractAddress(txout.scriptPubKey, NULL, address))
if (ExtractAddress(txout.scriptPubKey, pwalletMain, address))
strAddress = address.ToString(); strAddress = address.ToString();
} }
string strDescription = _("To: "); string strDescription = _("To: ");
CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook) CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
if (pwalletMain->mapAddressBook.count(strAddress) && !pwalletMain->mapAddressBook[strAddress].empty()) if (pwalletMain->mapAddressBook.count(address) && !pwalletMain->mapAddressBook[address].empty())
strDescription += pwalletMain->mapAddressBook[strAddress] + " "; strDescription += pwalletMain->mapAddressBook[address] + " ";
strDescription += strAddress; strDescription += strAddress;
if (!mapValue["message"].empty()) if (!mapValue["message"].empty())
{ {

2
src/wallet.cpp

@ -437,7 +437,7 @@ void CWalletTx::GetAmounts(int64& nGeneratedImmature, int64& nGeneratedMature, l
{ {
CBitcoinAddress address; CBitcoinAddress address;
vector<unsigned char> vchPubKey; vector<unsigned char> vchPubKey;
if (!ExtractAddress(txout.scriptPubKey, pwallet, address)) if (!ExtractAddress(txout.scriptPubKey, NULL, address))
{ {
printf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n", printf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n",
this->GetHash().ToString().c_str()); this->GetHash().ToString().c_str());

Loading…
Cancel
Save