aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp11
-rw-r--r--src/main.h1
-rw-r--r--src/qt/addresstablemodel.cpp22
-rw-r--r--src/qt/addresstablemodel.h3
-rw-r--r--src/qt/clientmodel.cpp2
-rw-r--r--src/qt/editaddressdialog.cpp5
-rw-r--r--src/qt/transactiondesc.cpp4
-rw-r--r--src/qt/transactiontablemodel.cpp10
-rw-r--r--src/qt/walletmodel.cpp8
-rw-r--r--src/wallet.cpp2
10 files changed, 43 insertions, 25 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 5d29492fcb..59a6984288 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -31,6 +31,7 @@ map<uint256, CBlockIndex*> mapBlockIndex;
uint256 hashGenesisBlock("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f");
static CBigNum bnProofOfWorkLimit(~uint256(0) >> 32);
const int nTotalBlocksEstimate = 140700; // Conservative estimate of total nr of blocks on main chain
+int nMaxBlocksOfOtherNodes = 0; // Maximum amount of blocks that other nodes claim to have
const int nInitialBlockThreshold = 120; // Regard blocks up until N-threshold as "initial download"
CBlockIndex* pindexGenesisBlock = NULL;
int nBestHeight = -1;
@@ -726,6 +727,12 @@ int GetTotalBlocksEstimate()
}
}
+// Return maximum amount of blocks that other nodes claim to have
+int GetMaxBlocksOfOtherNodes()
+{
+ return nMaxBlocksOfOtherNodes;
+}
+
bool IsInitialBlockDownload()
{
if (pindexBest == NULL || nBestHeight < (GetTotalBlocksEstimate()-nInitialBlockThreshold))
@@ -1837,9 +1844,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
pfrom->fSuccessfullyConnected = true;
printf("version message: version %d, blocks=%d\n", pfrom->nVersion, pfrom->nStartingHeight);
- if(pfrom->nStartingHeight > nTotalBlocksEstimate)
+ if(pfrom->nStartingHeight > nMaxBlocksOfOtherNodes)
{
- nTotalBlocksEstimate = pfrom->nStartingHeight;
+ nMaxBlocksOfOtherNodes = pfrom->nStartingHeight;
}
}
diff --git a/src/main.h b/src/main.h
index 427067bc94..238cb5d8c2 100644
--- a/src/main.h
+++ b/src/main.h
@@ -99,6 +99,7 @@ void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash
bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
bool CheckProofOfWork(uint256 hash, unsigned int nBits);
int GetTotalBlocksEstimate();
+int GetMaxBlocksOfOtherNodes();
bool IsInitialBlockDownload();
std::string GetWarnings(std::string strFor);
diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp
index 6bda1e770c..8fd6d52b7e 100644
--- a/src/qt/addresstablemodel.cpp
+++ b/src/qt/addresstablemodel.cpp
@@ -39,8 +39,7 @@ struct AddressTablePriv
{
cachedAddressTable.clear();
- CRITICAL_BLOCK(wallet->cs_KeyStore)
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, std::string)& item, wallet->mapAddressBook)
{
@@ -170,7 +169,7 @@ bool AddressTableModel::setData(const QModelIndex & index, const QVariant & valu
// Double-check that we're not overwriting a receiving address
if(rec->type == AddressTableEntry::Sending)
{
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
// Remove old entry
wallet->DelAddressBookName(rec->address.toStdString());
@@ -255,7 +254,7 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
return QString();
}
// Check for duplicate addresses
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
if(wallet->mapAddressBook.count(strAddress))
{
@@ -274,15 +273,20 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
editStatus = WALLET_UNLOCK_FAILURE;
return QString();
}
-
- strAddress = CBitcoinAddress(wallet->GetOrReuseKeyFromPool()).ToString();
+ std::vector<unsigned char> newKey;
+ if(!wallet->GetKeyFromPool(newKey, true))
+ {
+ editStatus = KEY_GENERATION_FAILURE;
+ return QString();
+ }
+ strAddress = CBitcoinAddress(newKey).ToString();
}
else
{
return QString();
}
// Add entry and update list
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ CRITICAL_BLOCK(wallet->cs_wallet)
wallet->SetAddressBookName(strAddress, strLabel);
updateList();
return QString::fromStdString(strAddress);
@@ -298,7 +302,7 @@ bool AddressTableModel::removeRows(int row, int count, const QModelIndex & paren
// Also refuse to remove receiving addresses.
return false;
}
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
wallet->DelAddressBookName(rec->address.toStdString());
}
@@ -315,7 +319,7 @@ void AddressTableModel::update()
*/
QString AddressTableModel::labelForAddress(const QString &address) const
{
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
CBitcoinAddress address_parsed(address.toStdString());
std::map<CBitcoinAddress, std::string>::iterator mi = wallet->mapAddressBook.find(address_parsed);
diff --git a/src/qt/addresstablemodel.h b/src/qt/addresstablemodel.h
index bc505c48f0..f4a8dad845 100644
--- a/src/qt/addresstablemodel.h
+++ b/src/qt/addresstablemodel.h
@@ -29,7 +29,8 @@ public:
OK,
INVALID_ADDRESS,
DUPLICATE_ADDRESS,
- WALLET_UNLOCK_FAILURE
+ WALLET_UNLOCK_FAILURE,
+ KEY_GENERATION_FAILURE
};
static const QString Send; /* Send addres */
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index 5cf02eac7d..d307473102 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -61,7 +61,7 @@ bool ClientModel::inInitialBlockDownload() const
int ClientModel::getTotalBlocksEstimate() const
{
- return GetTotalBlocksEstimate();
+ return GetMaxBlocksOfOtherNodes();
}
OptionsModel *ClientModel::getOptionsModel()
diff --git a/src/qt/editaddressdialog.cpp b/src/qt/editaddressdialog.cpp
index 06e74db25a..b8e6fe4578 100644
--- a/src/qt/editaddressdialog.cpp
+++ b/src/qt/editaddressdialog.cpp
@@ -97,6 +97,11 @@ void EditAddressDialog::accept()
tr("Could not unlock wallet."),
QMessageBox::Ok, QMessageBox::Ok);
return;
+ case AddressTableModel::KEY_GENERATION_FAILURE:
+ QMessageBox::critical(this, windowTitle(),
+ tr("New key generation failed."),
+ QMessageBox::Ok, QMessageBox::Ok);
+ return;
}
return;
diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp
index 612b5d8974..6ca3ac8c4b 100644
--- a/src/qt/transactiondesc.cpp
+++ b/src/qt/transactiondesc.cpp
@@ -50,7 +50,7 @@ QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx)
QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
{
QString strHTML;
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
strHTML.reserve(4000);
strHTML += "<html><font face='verdana, arial, helvetica, sans-serif'>";
@@ -257,7 +257,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
strHTML += "<br><b>Inputs:</b>";
strHTML += "<ul>";
- CRITICAL_BLOCK(wallet->cs_mapWallet)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
BOOST_FOREACH(const CTxIn& txin, wtx.vin)
{
diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp
index 353cd79145..0e1733f156 100644
--- a/src/qt/transactiontablemodel.cpp
+++ b/src/qt/transactiontablemodel.cpp
@@ -69,7 +69,7 @@ struct TransactionTablePriv
qDebug() << "refreshWallet";
#endif
cachedWallet.clear();
- CRITICAL_BLOCK(wallet->cs_mapWallet)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
for(std::map<uint256, CWalletTx>::iterator it = wallet->mapWallet.begin(); it != wallet->mapWallet.end(); ++it)
{
@@ -95,7 +95,7 @@ struct TransactionTablePriv
QList<uint256> updated_sorted = updated;
qSort(updated_sorted);
- CRITICAL_BLOCK(wallet->cs_mapWallet)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
for(int update_idx = updated_sorted.size()-1; update_idx >= 0; --update_idx)
{
@@ -171,7 +171,7 @@ struct TransactionTablePriv
// simply re-use the cached status.
if(rec->statusUpdateNeeded())
{
- CRITICAL_BLOCK(wallet->cs_mapWallet)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
@@ -191,7 +191,7 @@ struct TransactionTablePriv
QString describe(TransactionRecord *rec)
{
- CRITICAL_BLOCK(wallet->cs_mapWallet)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
if(mi != wallet->mapWallet.end())
@@ -229,7 +229,7 @@ void TransactionTableModel::update()
QList<uint256> updated;
// Check if there are changes to wallet map
- TRY_CRITICAL_BLOCK(wallet->cs_mapWallet)
+ TRY_CRITICAL_BLOCK(wallet->cs_wallet)
{
if(!wallet->vWalletUpdated.empty())
{
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index dfededca93..2f989661f0 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -38,7 +38,7 @@ qint64 WalletModel::getUnconfirmedBalance() const
int WalletModel::getNumTransactions() const
{
int numTransactions = 0;
- CRITICAL_BLOCK(wallet->cs_mapWallet)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
numTransactions = wallet->mapWallet.size();
}
@@ -117,7 +117,7 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
}
CRITICAL_BLOCK(cs_main)
- CRITICAL_BLOCK(wallet->cs_mapWallet)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
// Sendmany
std::vector<std::pair<CScript, int64> > vecSend;
@@ -156,7 +156,7 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
foreach(const SendCoinsRecipient &rcp, recipients)
{
std::string strAddress = rcp.address.toStdString();
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
if (!wallet->mapAddressBook.count(strAddress))
wallet->SetAddressBookName(strAddress, rcp.label.toStdString());
@@ -231,7 +231,7 @@ bool WalletModel::setWalletLocked(bool locked, const std::string &passPhrase)
bool WalletModel::changePassphrase(const std::string &oldPass, const std::string &newPass)
{
bool retval;
- CRITICAL_BLOCK(wallet->cs_vMasterKey)
+ CRITICAL_BLOCK(wallet->cs_wallet)
{
wallet->Lock(); // Make sure wallet is locked before attempting pass change
retval = wallet->ChangeWalletPassphrase(oldPass, newPass);
diff --git a/src/wallet.cpp b/src/wallet.cpp
index 9c04e37fe6..d78e470396 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -731,7 +731,7 @@ int64 CWallet::GetBalance() const
int64 CWallet::GetUnconfirmedBalance() const
{
int64 nTotal = 0;
- CRITICAL_BLOCK(cs_mapWallet)
+ CRITICAL_BLOCK(cs_wallet)
{
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
{