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.
0.8
Pieter Wuille 14 years ago
parent
commit
b63241d451
  1. 33
      src/script.cpp
  2. 8
      src/ui.cpp
  3. 2
      src/wallet.cpp

33
src/script.cpp

@ -1122,30 +1122,37 @@ 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) if (item.first == OP_PUBKEY)
{ addressRet.SetPubKey(item.second);
uint160 hash160; else if (item.first == OP_PUBKEYHASH)
if (item.first == OP_PUBKEY) addressRet.SetHash160((uint160)item.second);
addressRet.SetPubKey(item.second); if (keystore == NULL || keystore->HaveKey(addressRet))
else if (item.first == OP_PUBKEYHASH) return true;
addressRet.SetHash160((uint160)item.second);
if (keystore == NULL || keystore->HaveKey(addressRet))
return true;
}
} }
return false; 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) bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, int nHashType)
{ {
vector<vector<unsigned char> > stack; vector<vector<unsigned char> > stack;

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