--- /dev/null
+TOR SUPPORT IN NOVACOIN
+======================
+
+It is possible to run Novacoin as a Tor hidden service, and connect to such services.
+
+The following directions assume you have a Tor proxy running on port 9050. Many distributions default to having a SOCKS proxy listening on port 9050, but others may not. In particular, the Tor Browser Bundle defaults to listening on a random port. See [Tor Project FAQ:TBBSocksPort](https://www.torproject.org/docs/faq.html.en#TBBSocksPort) for how to properly
+configure Tor.
+
+
+1. Run novacoin behind a Tor proxy
+---------------------------------
+
+The first step is running Novacoin behind a Tor proxy. This will already make all
+outgoing connections be anonymized, but more is possible.
+
+ -proxy=ip:port Set the proxy server. If SOCKS5 is selected (default), this proxy
+ server will be used to try to reach .onion addresses as well.
+
+ -onion=ip:port Set the proxy server to use for tor hidden services. You do not
+ need to set this if it's the same as -proxy. You can use -noonion
+ to explicitly disable access to hidden service.
+
+ -listen When using -proxy, listening is disabled by default. If you want
+ to run a hidden service (see next section), you'll need to enable
+ it explicitly.
+
+ -connect=X When behind a Tor proxy, you can specify .onion addresses instead
+ -addnode=X of IP addresses or hostnames in these parameters. It requires
+ -seednode=X SOCKS5. In Tor mode, such addresses can also be exchanged with
+ other P2P nodes.
+
+In a typical situation, this suffices to run behind a Tor proxy:
+
+ ./novacoin -proxy=127.0.0.1:9050
+
+
+2. Run a novacoin hidden server
+------------------------------
+
+If you configure your Tor system accordingly, it is possible to make your node also
+reachable from the Tor network. Add these lines to your /etc/tor/torrc (or equivalent
+config file):
+
+ HiddenServiceDir /var/lib/tor/novacoin-service/
+ HiddenServicePort 7777 127.0.0.1:7777
+ HiddenServicePort 17777 127.0.0.1:17777
+
+The directory can be different of course, but (both) port numbers should be equal to
+your novacoind's P2P listen port (7777 by default, 17777 by default for testnet).
+
+ -externalip=X You can tell novacoin about its publicly reachable address using
+ this option, and this can be a .onion address. Given the above
+ configuration, you can find your onion address in
+ /var/lib/tor/novacoin-service/hostname. Onion addresses are given
+ preference for your node to advertize itself with, for connections
+ coming from unroutable addresses (such as 127.0.0.1, where the
+ Tor proxy typically runs).
+
+ -listen You'll need to enable listening for incoming connections, as this
+ is off by default behind a proxy.
+
+ -discover When -externalip is specified, no attempt is made to discover local
+ IPv4 or IPv6 addresses. If you want to run a dual stack, reachable
+ from both Tor and IPv4 (or IPv6), you'll need to either pass your
+ other addresses using -externalip, or explicitly enable -discover.
+ Note that both addresses of a dual-stack system may be easily
+ linkable using traffic analysis.
+
+In a typical situation, where you're only reachable via Tor, this should suffice:
+
+ ./novacoind -proxy=127.0.0.1:9050 -externalip=youraddress.onion -listen
+
+(obviously, replace the Onion address with your own). If you don't care too much
+about hiding your node, and want to be reachable on IPv4 as well, additionally
+specify:
+
+ ./novacoind ... -discover
+
+and open port 7777 on your firewall (or use -upnp).
+
+If you only want to use Tor to reach onion addresses, but not use it as a proxy
+for normal IPv4/IPv6 communication, use:
+
+ ./novacoin -onion=127.0.0.1:9050 -externalip=youraddress.onion -discover
+
+Known addresses of novacoin nodes
+
+ seedp4knqnoei57u.onion
+ seedr3hhlepyi7fd.onion
+ seed3uuomkclbiz4.onion
+ seedeh7qck3ouff5.onion
+ seedt3sraf53ajiy.onion
+ seedg4qyccsg42oq.onion
+ novaqrtoywpg7jly.onion
+ seed3d5wolqbgrcb.onion
+ seed24u5dwph3qw4.onion
+ mj26ulzbs2oskgym.onion
+ eqon4usunavt76m7.onion
+ 5rg3vq4jagckeckf.onion
bool Lock(const void *addr, size_t len)
{
#ifdef WIN32
- return VirtualLock(const_cast<void*>(addr), len);
+ return VirtualLock(const_cast<void*>(addr), len) != 0;
#else
return mlock(addr, len) == 0;
#endif
bool Unlock(const void *addr, size_t len)
{
#ifdef WIN32
- return VirtualUnlock(const_cast<void*>(addr), len);
+ return VirtualUnlock(const_cast<void*>(addr), len) != 0;
#else
return munlock(addr, len) == 0;
#endif
break;
}
} catch(std::exception &e) {
+ (void)e;
strLoadError = _("Error opening block database");
break;
}
// Put this in a block, so that the Model objects are cleaned up before
// calling Shutdown().
- optionsModel.Upgrade(); // Must be done after AppInit2
-
if (splashref)
splash.finish(&window);
labelMiningIcon->setToolTip(tr("No suitable inputs were found"));
}
-void BitcoinGUI::error(const QString &title, const QString &message, bool modal)
-{
- // Report errors from network/worker thread
- if(modal)
- {
- QMessageBox::critical(this, title, message, QMessageBox::Ok, QMessageBox::Ok);
- } else {
- notificator->notify(Notificator::Critical, title, message);
- }
-}
-
void BitcoinGUI::message(const QString &title, const QString &message, unsigned int style, const QString &detail)
{
QString strTitle = tr("NovaCoin") + " - ";
QString filename = QFileDialog::getSaveFileName(this, tr("Dump Wallet"), saveDir, tr("Wallet dump (*.txt)"));
if(!filename.isEmpty()) {
if(!walletModel->dumpWallet(filename)) {
- error(tr("Dump failed"),
+ message(tr("Dump failed"),
tr("An error happened while trying to save the keys to your location.\n"
"Keys were not saved.")
,CClientUIInterface::MSG_ERROR);
QString filename = QFileDialog::getOpenFileName(this, tr("Import Wallet"), openDir, tr("Wallet dump (*.txt)"));
if(!filename.isEmpty()) {
if(!walletModel->importWallet(filename)) {
- error(tr("Import Failed"),
+ message(tr("Import Failed"),
tr("An error happened while trying to import the keys.\n"
"Some or all keys from:\n %1,\n were not imported into your wallet.")
.arg(filename)
{
showNormalIfMinimized(true);
}
+
+void BitcoinGUI::error(const QString &title, const QString &message, bool modal)
+{
+ // Report errors from network/worker thread
+ if(modal)
+ {
+ QMessageBox::critical(this, title, message, QMessageBox::Ok, QMessageBox::Ok);
+ } else {
+ notificator->notify(Notificator::Critical, title, message);
+ }
+}
#include "txdb-bdb.h"
#endif
-#ifdef _MSC_VER
-#pragma warning( disable : 4101)
-#endif
-
MultisigDialog::MultisigDialog(QWidget *parent) : QWidget(parent), ui(new Ui::MultisigDialog), model(0)
{
ui->setupUi(this);
}
catch(std::exception &e)
{
+ (void)e;
return;
}
}
catch(std::exception &e)
{
+ (void)e;
return;
}
CTransaction mergedTx(tx);
}
catch(std::exception &e)
{
+ (void)e;
return;
}
uint256 txHash = tx.GetHash();
SoftSetArg("-lang", language.toStdString());
}
-bool OptionsModel::Upgrade()
-{
- QSettings settings;
-
- if (settings.contains("bImportFinished"))
- return false; // Already upgraded
-
- settings.setValue("bImportFinished", true);
-
- // Move settings from old wallet.dat (if any):
- CWalletDB walletdb(strWalletFileName);
-
- QList<QString> intOptions;
- intOptions << "nDisplayUnit" << "nTransactionFee";
- foreach(QString key, intOptions)
- {
- int value = 0;
- if (walletdb.ReadSetting(key.toStdString(), value))
- {
- settings.setValue(key, value);
- walletdb.EraseSetting(key.toStdString());
- }
- }
- QList<QString> boolOptions;
- boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseTor" << "fTorOnly" << "fUseUPnP";
- foreach(QString key, boolOptions)
- {
- bool value = false;
- if (walletdb.ReadSetting(key.toStdString(), value))
- {
- settings.setValue(key, value);
- walletdb.EraseSetting(key.toStdString());
- }
- }
- try
- {
- CAddress addrProxyAddress, addrTorAddress;
- if (walletdb.ReadSetting("addrProxy", addrProxyAddress))
- {
- settings.setValue("addrProxy", addrProxyAddress.ToStringIPPort().c_str());
- walletdb.EraseSetting("addrProxy");
- }
-
- if (walletdb.ReadSetting("addrTor", addrTorAddress))
- {
- settings.setValue("addrTor", addrTorAddress.ToStringIPPort().c_str());
- walletdb.EraseSetting("addrTor");
- }
- }
- catch (std::ios_base::failure &e)
- {
- // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress
- CService addrProxy, addrTor;
- if (walletdb.ReadSetting("addrProxy", addrProxy))
- {
- settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
- walletdb.EraseSetting("addrProxy");
- }
-
- if (walletdb.ReadSetting("addrTor", addrTor))
- {
- settings.setValue("addrTor", addrTor.ToStringIPPort().c_str());
- walletdb.EraseSetting("addrTor");
- }
- }
-
- ApplyProxySettings();
- ApplyTorSettings();
- Init();
-
- return true;
-}
-
-
int OptionsModel::rowCount(const QModelIndex & parent) const
{
return OptionIDRowCount;
void Init();
- /* Migrate settings from wallet.dat after app initialization */
- bool Upgrade(); /* returns true if settings upgraded */
-
int rowCount(const QModelIndex & parent = QModelIndex()) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
if (wtx->type == TransactionRecord::Generated)
{
- nNumConf = nCoinbaseMaturity;
+ nNumConf = nCoinbaseMaturity + 20;
}
switch(wtx->status.status)
std::string HelpRequiringPassphrase()
{
return pwalletMain->IsCrypted()
- ? "\nrequires wallet passphrase to be set with walletpassphrase first"
+ ? "\n\nRequires wallet passphrase to be set with walletpassphrase first"
: "";
}
if (fHelp || params.size() > 1)
throw runtime_error(
"keypoolrefill [new-size]\n"
- "Fills the keypool."
+ "Fills the keypool.\n"
+ "IMPORTANT: Any previous backups you have made of your wallet file "
+ "should be replaced with the newly generated one."
+ HelpRequiringPassphrase());
unsigned int nSize = max<unsigned int>(GetArg("-keypool", 100), 0);
if (fHelp || params.size() > 1)
throw runtime_error(
"keypoolreset [new-size]\n"
- "Resets the keypool."
+ "Resets the keypool.\n"
+ "IMPORTANT: Any previous backups you have made of your wallet file "
+ "should be replaced with the newly generated one."
+ HelpRequiringPassphrase());
unsigned int nSize = max<unsigned int>(GetArg("-keypool", 100), 0);
ssValue >> value;
}
catch (std::exception &e) {
+ (void)e;
return false;
}
return true;
if (fFileBacked)
{
CWalletDB* pwalletdb = pwalletdbIn ? pwalletdbIn : new CWalletDB(strWalletFile);
- if (nWalletVersion >= 40000)
- {
- // Versions prior to 0.4.0 did not support the "minversion" record.
- // Use a CCorruptAddress to make them crash instead.
- CCorruptAddress corruptAddress;
- pwalletdb->WriteSetting("addrIncoming", corruptAddress);
- }
if (nWalletVersion > 40000)
pwalletdb->WriteMinVersion(nWalletVersion);
if (!pwalletdbIn)
return Erase(std::make_pair(std::string("pool"), nPool));
}
- // Settings are no longer stored in wallet.dat; these are
- // used only for backwards compatibility:
- template<typename T>
- bool ReadSetting(const std::string& strKey, T& value)
- {
- return Read(std::make_pair(std::string("setting"), strKey), value);
- }
- template<typename T>
- bool WriteSetting(const std::string& strKey, const T& value)
- {
- nWalletDBUpdated++;
- return Write(std::make_pair(std::string("setting"), strKey), value);
- }
- bool EraseSetting(const std::string& strKey)
- {
- nWalletDBUpdated++;
- return Erase(std::make_pair(std::string("setting"), strKey));
- }
-
bool WriteMinVersion(int nVersion)
{
return Write(std::string("minversion"), nVersion);