This commit is contained in:
Evan Duffield 2015-01-26 15:56:02 -07:00
commit 61b3ce76eb
2 changed files with 180 additions and 1 deletions

155
doc/guide-startmany.md Normal file
View File

@ -0,0 +1,155 @@
#start-many Setup Guide
## Two Options for Setting up your Wallet
There are many ways to setup a wallet to support start-many. This guide will walk through two of them.
1. [Importing an existing wallet (recommended if you are consolidating wallets).](#option1)
2. [Sending 1,000 DRK to new wallet addresses.](#option2)
## <a name="option1"></a>Option 1. Importing an existing wallet
This is the way to go if you are consolidating multiple wallets into one that supports start-many.
### From your single-instance MasterNode Wallet
Open your QT Wallet and go to console (from the menu select Tools => Debug Console)
Dump the private key from your MasterNode's pulic key.
```
walletpassphrase [your_wallet_passphrase] 600
dumpprivkey [mn_public_key]
```
Copy the resulting priviate key. You'll use it in the next step.
### From your multi-instance MasterNode Wallet
Open your QT Wallet and go to console (from the menu select Tools => Debug Console)
Import the private key from the step above.
```
walletpassphrase [your_wallet_passphrase] 600
importprivkey [single_instance_private_key]
```
The wallet will re-scan and you will see your available balance increase by the amount that was in the imported wallet.
[Skip Option 2. and go to Create masternode.conf file](#masternodeconf)
## <a name="option2"></a>Option 2. Starting with a new wallet
[If you used Option 1 above, then you can skip down to Create masternode.conf file.](#masternodeconf)
### Create New Wallet Addresses
1. Open the QT Wallet.
2. Click the Receive tab.
3. Fill in the form to request a payment.
* Label: mn01
* Amount: 1000 (optional)
* Click *Request payment*
5. Click the *Copy Address* button
Create a new wallet address for each MasterNode.
Close your QT Wallet.
### Send 1,000 DRK to New Addresses
Just like setting up a standard MN. Send exactly 1,000 DRK to each new address created above.
### Create New Masternode Private Keys
Open your QT Wallet and go to console (from the menu select Tools => Debug Console)
Issue the following:
```masternode genkey```
*Note: A masternode private key will need to be created for each MasterNode you run. You should not use the same masternode private key for multiple MasterNodes.*
Close your QT Wallet.
## <a name="masternodeconf"></a>Create masternode.conf file
Remember... this is local. Make sure your QT is not running.
Create the masternode.conf file in the same directory as your wallet.dat.
Copy the masternode private key and correspondig collateral output transaction that holds the 1K DRK.
The masternode private key may be an existing key from [Option 1](#option1), or a newly generated key from [Option 2](#option2).
*Please note, the masternode priviate key is not the same as a wallet private key. Never put your wallet private key in the masternode.conf file. That is equivalent to putting your 1,000 DRK on the remote server and defeats the purpose of a hot/cold setup.*
### Get the collateral output
Open your QT Wallet and go to console (from the menu select Tools => Debug Console)
Issue the following:
```masternode outputs```
Make note of the hash (which is your collaterla_output) and index.
### Enter your MasterNode details into your masternode.conf file
[From the darkcoin github repo](https://github.com/darkcoin/darkcoin/blob/master/doc/masternode_conf.md)
The new masternode.conf format consists of a space seperated text file. Each line consisting of an alias, IP address followed by port, masternode private key, collateral output transaction id and collateral output index.
```
alias ipaddress:port masternode_private_key collateral_output collateral_output_index
```
Example:
```
mn01 127.0.0.1:9999 93HaYBVUCYjEMeeH1Y4sBGLALQZE1Yc1K64xiqgX37tGBDQL8Xg 2bcd3c84c84f87eaa86e4e56834c92927a07f9e18718810b92e0d0324456a67c 0
mn02 127.0.0.2:9999 93WaAb3htPJEV8E9aQcN23Jt97bPex7YvWfgMDTUdWJvzmrMqey aa9f1034d973377a5e733272c3d0eced1de22555ad45d6b24abadff8087948d4 0
```
## What about the darkcoin.conf file?
If you are using a masternode.conf file you no longer need the darkcoin.conf file. The exception is if you need custom settings (thanks oblox).
## Update darkcoin.conf on server
If you generated a new masternode private key, you will need to update the remote darkcoin.conf files.
Shut down the daemon and then edit the file.
```sudo nano .darkcoin/darkcoin.conf```
### Edit the masternodeprivkey
If you generated a new masternode private key, you will need to update the masternodeprivkey value in your remote darkcoin.conf file.
## Start your MasterNodes
### Remote
If your remote server is not running, start your remote daemon as you normally would.
I usually confirm that remote is on the correct block by issuing:
```darkcoind getinfo```
And compare with the official explorer at http://explorer.darkcoin.io/chain/Darkcoin
### Local
Finally... time to start from local.
#### Open up your QT Wallet
From the menu select Tools => Debug Console
If you want to review your masternode.conf setting before starting the MasterNodes, issue the following in the Debug Console:
```masternode list-conf```
Give it the eye-ball test. If satisfied, you can start your nodes one of two ways.
1. masternode start-alias [alias_from_masternode.conf]. Example ```masternode start-alias mn01```
2. masternode start-many

View File

@ -106,7 +106,28 @@ bool ShutdownRequested()
return fRequestShutdown;
}
class CCoinsViewErrorCatcher : public CCoinsViewBacked
{
public:
CCoinsViewErrorCatcher(CCoinsView& view) : CCoinsViewBacked(view) {}
bool GetCoins(const uint256 &txid, CCoins &coins) {
try {
return CCoinsViewBacked::GetCoins(txid, coins);
} catch(const std::runtime_error& e) {
uiInterface.ThreadSafeMessageBox(_("Error reading from database, shutting down."), "", CClientUIInterface::MSG_ERROR);
LogPrintf("Error reading from database: %s\n", e.what());
// Starting the shutdown sequence and returning false to the caller would be
// interpreted as 'entry not found' (as opposed to unable to read data), and
// could lead to invalid interpration. Just exit immediately, as we can't
// continue anyway, and all writes should be atomic.
abort();
}
}
// Writes do not need similar protection, as failure to write is handled by the caller.
};
static CCoinsViewDB *pcoinsdbview;
static CCoinsViewErrorCatcher *pcoinscatcher = NULL;
void Shutdown()
{
@ -137,6 +158,7 @@ void Shutdown()
if (pcoinsTip)
pcoinsTip->Flush();
delete pcoinsTip; pcoinsTip = NULL;
delete pcoinscatcher; pcoinscatcher = NULL;
delete pcoinsdbview; pcoinsdbview = NULL;
delete pblocktree; pblocktree = NULL;
}
@ -888,11 +910,13 @@ bool AppInit2(boost::thread_group& threadGroup)
UnloadBlockIndex();
delete pcoinsTip;
delete pcoinsdbview;
delete pcoinscatcher;
delete pblocktree;
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex);
pcoinsdbview = new CCoinsViewDB(nCoinDBCache, false, fReindex);
pcoinsTip = new CCoinsViewCache(*pcoinsdbview);
pcoinscatcher = new CCoinsViewErrorCatcher(*pcoinsdbview);
pcoinsTip = new CCoinsViewCache(*pcoinscatcher);
if (fReindex)
pblocktree->WriteReindexing(true);