mirror of
https://github.com/twisterarmy/twister-core.git
synced 2025-01-10 23:07:52 +00:00
starting wallet cleanup. added username, renamed to twisterwallet.dat
This commit is contained in:
parent
26bbd5614f
commit
fe57966e05
26
src/init.cpp
26
src/init.cpp
@ -229,7 +229,7 @@ std::string HelpMessage()
|
|||||||
strUsage += " -upgradewallet " + _("Upgrade wallet to latest format") + "\n";
|
strUsage += " -upgradewallet " + _("Upgrade wallet to latest format") + "\n";
|
||||||
strUsage += " -keypool=<n> " + _("Set key pool size to <n> (default: 100)") + "\n";
|
strUsage += " -keypool=<n> " + _("Set key pool size to <n> (default: 100)") + "\n";
|
||||||
strUsage += " -rescan " + _("Rescan the block chain for missing wallet transactions") + "\n";
|
strUsage += " -rescan " + _("Rescan the block chain for missing wallet transactions") + "\n";
|
||||||
strUsage += " -salvagewallet " + _("Attempt to recover private keys from a corrupt wallet.dat") + "\n";
|
strUsage += " -salvagewallet " + _("Attempt to recover private keys from a corrupt twisterwallet.dat") + "\n";
|
||||||
strUsage += " -checkblocks=<n> " + _("How many blocks to check at startup (default: 288, 0 = all)") + "\n";
|
strUsage += " -checkblocks=<n> " + _("How many blocks to check at startup (default: 288, 0 = all)") + "\n";
|
||||||
strUsage += " -checklevel=<n> " + _("How thorough the block verification is (0-4, default: 3)") + "\n";
|
strUsage += " -checklevel=<n> " + _("How thorough the block verification is (0-4, default: 3)") + "\n";
|
||||||
strUsage += " -txindex " + _("Maintain a full transaction index (default: 0)") + "\n";
|
strUsage += " -txindex " + _("Maintain a full transaction index (default: 0)") + "\n";
|
||||||
@ -518,23 +518,23 @@ bool AppInit2(boost::thread_group& threadGroup)
|
|||||||
if (GetBoolArg("-salvagewallet", false))
|
if (GetBoolArg("-salvagewallet", false))
|
||||||
{
|
{
|
||||||
// Recover readable keypairs:
|
// Recover readable keypairs:
|
||||||
if (!CWalletDB::Recover(bitdb, "wallet.dat", true))
|
if (!CWalletDB::Recover(bitdb, "twisterwallet.dat", true))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filesystem::exists(GetDataDir() / "wallet.dat"))
|
if (filesystem::exists(GetDataDir() / "twisterwallet.dat"))
|
||||||
{
|
{
|
||||||
CDBEnv::VerifyResult r = bitdb.Verify("wallet.dat", CWalletDB::Recover);
|
CDBEnv::VerifyResult r = bitdb.Verify("twisterwallet.dat", CWalletDB::Recover);
|
||||||
if (r == CDBEnv::RECOVER_OK)
|
if (r == CDBEnv::RECOVER_OK)
|
||||||
{
|
{
|
||||||
string msg = strprintf(_("Warning: wallet.dat corrupt, data salvaged!"
|
string msg = strprintf(_("Warning: twisterwallet.dat corrupt, data salvaged!"
|
||||||
" Original wallet.dat saved as wallet.{timestamp}.bak in %s; if"
|
" Original twisterwallet.dat saved as wallet.{timestamp}.bak in %s; if"
|
||||||
" your balance or transactions are incorrect you should"
|
" your balance or transactions are incorrect you should"
|
||||||
" restore from a backup."), strDataDir.c_str());
|
" restore from a backup."), strDataDir.c_str());
|
||||||
InitWarning(msg);
|
InitWarning(msg);
|
||||||
}
|
}
|
||||||
if (r == CDBEnv::RECOVER_FAIL)
|
if (r == CDBEnv::RECOVER_FAIL)
|
||||||
return InitError(_("wallet.dat corrupt, salvage failed"));
|
return InitError(_("twisterwallet.dat corrupt, salvage failed"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ********************************************************* Step 6: network initialization
|
// ********************************************************* Step 6: network initialization
|
||||||
@ -795,20 +795,20 @@ bool AppInit2(boost::thread_group& threadGroup)
|
|||||||
|
|
||||||
nStart = GetTimeMillis();
|
nStart = GetTimeMillis();
|
||||||
bool fFirstRun = true;
|
bool fFirstRun = true;
|
||||||
pwalletMain = new CWallet("wallet.dat");
|
pwalletMain = new CWallet("twisterwallet.dat");
|
||||||
DBErrors nLoadWalletRet = pwalletMain->LoadWallet(fFirstRun);
|
DBErrors nLoadWalletRet = pwalletMain->LoadWallet(fFirstRun);
|
||||||
if (nLoadWalletRet != DB_LOAD_OK)
|
if (nLoadWalletRet != DB_LOAD_OK)
|
||||||
{
|
{
|
||||||
if (nLoadWalletRet == DB_CORRUPT)
|
if (nLoadWalletRet == DB_CORRUPT)
|
||||||
strErrors << _("Error loading wallet.dat: Wallet corrupted") << "\n";
|
strErrors << _("Error loading twisterwallet.dat: Wallet corrupted") << "\n";
|
||||||
else if (nLoadWalletRet == DB_NONCRITICAL_ERROR)
|
else if (nLoadWalletRet == DB_NONCRITICAL_ERROR)
|
||||||
{
|
{
|
||||||
string msg(_("Warning: error reading wallet.dat! All keys read correctly, but transaction data"
|
string msg(_("Warning: error reading twisterwallet.dat! All keys read correctly, but transaction data"
|
||||||
" or address book entries might be missing or incorrect."));
|
" or address book entries might be missing or incorrect."));
|
||||||
InitWarning(msg);
|
InitWarning(msg);
|
||||||
}
|
}
|
||||||
else if (nLoadWalletRet == DB_TOO_NEW)
|
else if (nLoadWalletRet == DB_TOO_NEW)
|
||||||
strErrors << _("Error loading wallet.dat: Wallet requires newer version of Bitcoin") << "\n";
|
strErrors << _("Error loading twisterwallet.dat: Wallet requires newer version of Bitcoin") << "\n";
|
||||||
else if (nLoadWalletRet == DB_NEED_REWRITE)
|
else if (nLoadWalletRet == DB_NEED_REWRITE)
|
||||||
{
|
{
|
||||||
strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n";
|
strErrors << _("Wallet needed to be rewritten: restart Bitcoin to complete") << "\n";
|
||||||
@ -816,7 +816,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
|||||||
return InitError(strErrors.str());
|
return InitError(strErrors.str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
strErrors << _("Error loading wallet.dat") << "\n";
|
strErrors << _("Error loading twisterwallet.dat") << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetBoolArg("-upgradewallet", fFirstRun))
|
if (GetBoolArg("-upgradewallet", fFirstRun))
|
||||||
@ -860,7 +860,7 @@ bool AppInit2(boost::thread_group& threadGroup)
|
|||||||
pindexRescan = pindexGenesisBlock;
|
pindexRescan = pindexGenesisBlock;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CWalletDB walletdb("wallet.dat");
|
CWalletDB walletdb("twisterwallet.dat");
|
||||||
CBlockLocator locator;
|
CBlockLocator locator;
|
||||||
if (walletdb.ReadBestBlock(locator))
|
if (walletdb.ReadBestBlock(locator))
|
||||||
pindexRescan = locator.GetBlockIndex();
|
pindexRescan = locator.GetBlockIndex();
|
||||||
|
@ -26,31 +26,6 @@ bool CBasicKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CBasicKeyStore::AddCScript(const CScript& redeemScript)
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
mapScripts[redeemScript.GetID()] = redeemScript;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBasicKeyStore::HaveCScript(const CScriptID& hash) const
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
return mapScripts.count(hash) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBasicKeyStore::GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
ScriptMap::const_iterator mi = mapScripts.find(hash);
|
|
||||||
if (mi != mapScripts.end())
|
|
||||||
{
|
|
||||||
redeemScriptOut = (*mi).second;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCryptoKeyStore::SetCrypted()
|
bool CCryptoKeyStore::SetCrypted()
|
||||||
{
|
{
|
||||||
LOCK(cs_KeyStore);
|
LOCK(cs_KeyStore);
|
||||||
|
@ -29,22 +29,15 @@ public:
|
|||||||
virtual bool GetKey(const CKeyID &address, CKey& keyOut) const =0;
|
virtual bool GetKey(const CKeyID &address, CKey& keyOut) const =0;
|
||||||
virtual void GetKeys(std::set<CKeyID> &setAddress) const =0;
|
virtual void GetKeys(std::set<CKeyID> &setAddress) const =0;
|
||||||
virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
|
virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
|
||||||
|
|
||||||
// Support for BIP 0013 : see https://en.bitcoin.it/wiki/BIP_0013
|
|
||||||
virtual bool AddCScript(const CScript& redeemScript) =0;
|
|
||||||
virtual bool HaveCScript(const CScriptID &hash) const =0;
|
|
||||||
virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const =0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::map<CKeyID, CKey> KeyMap;
|
typedef std::map<CKeyID, CKey> KeyMap;
|
||||||
typedef std::map<CScriptID, CScript > ScriptMap;
|
|
||||||
|
|
||||||
/** Basic key store, that keeps keys in an address->secret map */
|
/** Basic key store, that keeps keys in an address->secret map */
|
||||||
class CBasicKeyStore : public CKeyStore
|
class CBasicKeyStore : public CKeyStore
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
KeyMap mapKeys;
|
KeyMap mapKeys;
|
||||||
ScriptMap mapScripts;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
|
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
|
||||||
@ -83,9 +76,6 @@ public:
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
virtual bool AddCScript(const CScript& redeemScript);
|
|
||||||
virtual bool HaveCScript(const CScriptID &hash) const;
|
|
||||||
virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
|
typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
|
||||||
|
@ -163,6 +163,7 @@ Value createrawtransaction(const Array& params, bool fHelp)
|
|||||||
vector<unsigned char> txData(ParseHexV(params[1], "pubkey"));
|
vector<unsigned char> txData(ParseHexV(params[1], "pubkey"));
|
||||||
rawTx.pubKey << txData;
|
rawTx.pubKey << txData;
|
||||||
} else {
|
} else {
|
||||||
|
pwalletMain->GenerateNewKey(username);
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "pubkey generation not implemented");
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "pubkey generation not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,17 +320,6 @@ Value signrawtransaction(const Array& params, bool fHelp)
|
|||||||
|
|
||||||
// if redeemScript given and not using the local wallet (private keys
|
// if redeemScript given and not using the local wallet (private keys
|
||||||
// given), add redeemScript to the tempKeystore so it can be signed:
|
// given), add redeemScript to the tempKeystore so it can be signed:
|
||||||
if (fGivenKeys && scriptPubKey.IsPayToScriptHash())
|
|
||||||
{
|
|
||||||
RPCTypeCheck(prevOut, map_list_of("txid", str_type)("vout", int_type)("scriptPubKey", str_type)("redeemScript",str_type));
|
|
||||||
Value v = find_value(prevOut, "redeemScript");
|
|
||||||
if (!(v == Value::null))
|
|
||||||
{
|
|
||||||
vector<unsigned char> rsData(ParseHexV(v, "redeemScript"));
|
|
||||||
CScript redeemScript(rsData.begin(), rsData.end());
|
|
||||||
tempKeystore.AddCScript(redeemScript);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -733,11 +733,10 @@ Value addmultisigaddress(const Array& params, bool fHelp)
|
|||||||
|
|
||||||
// Construct using pay-to-script-hash:
|
// Construct using pay-to-script-hash:
|
||||||
CScript inner = _createmultisig(params);
|
CScript inner = _createmultisig(params);
|
||||||
CScriptID innerID = inner.GetID();
|
|
||||||
pwalletMain->AddCScript(inner);
|
|
||||||
|
|
||||||
pwalletMain->SetAddressBookName(innerID, strAccount);
|
//pwalletMain->SetAddressBookName(innerID, strAccount);
|
||||||
return CBitcoinAddress(innerID).ToString();
|
//return CBitcoinAddress(innerID).ToString();
|
||||||
|
return CBitcoinAddress().ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value createmultisig(const Array& params, bool fHelp)
|
Value createmultisig(const Array& params, bool fHelp)
|
||||||
@ -1144,7 +1143,7 @@ Value backupwallet(const Array& params, bool fHelp)
|
|||||||
if (fHelp || params.size() != 1)
|
if (fHelp || params.size() != 1)
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
"backupwallet <destination>\n"
|
"backupwallet <destination>\n"
|
||||||
"Safely copies wallet.dat to destination, which can be a directory or a path with filename.");
|
"Safely copies twisterwallet.dat to destination, which can be a directory or a path with filename.");
|
||||||
|
|
||||||
string strDest = params[0].get_str();
|
string strDest = params[0].get_str();
|
||||||
if (!BackupWallet(*pwalletMain, strDest))
|
if (!BackupWallet(*pwalletMain, strDest))
|
||||||
@ -1321,25 +1320,6 @@ public:
|
|||||||
obj.push_back(Pair("iscompressed", vchPubKey.IsCompressed()));
|
obj.push_back(Pair("iscompressed", vchPubKey.IsCompressed()));
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object operator()(const CScriptID &scriptID) const {
|
|
||||||
Object obj;
|
|
||||||
obj.push_back(Pair("isscript", true));
|
|
||||||
CScript subscript;
|
|
||||||
pwalletMain->GetCScript(scriptID, subscript);
|
|
||||||
std::vector<CTxDestination> addresses;
|
|
||||||
txnouttype whichType;
|
|
||||||
int nRequired;
|
|
||||||
ExtractDestinations(subscript, whichType, addresses, nRequired);
|
|
||||||
obj.push_back(Pair("script", GetTxnOutputType(whichType)));
|
|
||||||
Array a;
|
|
||||||
BOOST_FOREACH(const CTxDestination& addr, addresses)
|
|
||||||
a.push_back(CBitcoinAddress(addr).ToString());
|
|
||||||
obj.push_back(Pair("addresses", a));
|
|
||||||
if (whichType == TX_MULTISIG)
|
|
||||||
obj.push_back(Pair("sigsrequired", nRequired));
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Value validateaddress(const Array& params, bool fHelp)
|
Value validateaddress(const Array& params, bool fHelp)
|
||||||
|
@ -77,7 +77,6 @@ const char* GetTxnOutputType(txnouttype t)
|
|||||||
case TX_NONSTANDARD: return "nonstandard";
|
case TX_NONSTANDARD: return "nonstandard";
|
||||||
case TX_PUBKEY: return "pubkey";
|
case TX_PUBKEY: return "pubkey";
|
||||||
case TX_PUBKEYHASH: return "pubkeyhash";
|
case TX_PUBKEYHASH: return "pubkeyhash";
|
||||||
case TX_SCRIPTHASH: return "scripthash";
|
|
||||||
case TX_MULTISIG: return "multisig";
|
case TX_MULTISIG: return "multisig";
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1135,16 +1134,6 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector<vector<unsi
|
|||||||
mTemplates.insert(make_pair(TX_MULTISIG, CScript() << OP_SMALLINTEGER << OP_PUBKEYS << OP_SMALLINTEGER << OP_CHECKMULTISIG));
|
mTemplates.insert(make_pair(TX_MULTISIG, CScript() << OP_SMALLINTEGER << OP_PUBKEYS << OP_SMALLINTEGER << OP_CHECKMULTISIG));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shortcut for pay-to-script-hash, which are more constrained than the other types:
|
|
||||||
// it is always OP_HASH160 20 [20 byte hash] OP_EQUAL
|
|
||||||
if (scriptPubKey.IsPayToScriptHash())
|
|
||||||
{
|
|
||||||
typeRet = TX_SCRIPTHASH;
|
|
||||||
vector<unsigned char> hashBytes(scriptPubKey.begin()+2, scriptPubKey.begin()+22);
|
|
||||||
vSolutionsRet.push_back(hashBytes);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scan templates
|
// Scan templates
|
||||||
const CScript& script1 = scriptPubKey;
|
const CScript& script1 = scriptPubKey;
|
||||||
BOOST_FOREACH(const PAIRTYPE(txnouttype, CScript)& tplate, mTemplates)
|
BOOST_FOREACH(const PAIRTYPE(txnouttype, CScript)& tplate, mTemplates)
|
||||||
@ -1294,8 +1283,6 @@ bool Solver(const CKeyStore& keystore, const CScript& scriptPubKey, uint256 hash
|
|||||||
scriptSigRet << vch;
|
scriptSigRet << vch;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case TX_SCRIPTHASH:
|
|
||||||
return keystore.GetCScript(uint160(vSolutions[0]), scriptSigRet);
|
|
||||||
|
|
||||||
case TX_MULTISIG:
|
case TX_MULTISIG:
|
||||||
scriptSigRet << OP_0; // workaround CHECKMULTISIG bug
|
scriptSigRet << OP_0; // workaround CHECKMULTISIG bug
|
||||||
@ -1318,8 +1305,6 @@ int ScriptSigArgsExpected(txnouttype t, const std::vector<std::vector<unsigned c
|
|||||||
if (vSolutions.size() < 1 || vSolutions[0].size() < 1)
|
if (vSolutions.size() < 1 || vSolutions[0].size() < 1)
|
||||||
return -1;
|
return -1;
|
||||||
return vSolutions[0][0] + 1;
|
return vSolutions[0][0] + 1;
|
||||||
case TX_SCRIPTHASH:
|
|
||||||
return 1; // doesn't include args needed by the script
|
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1367,7 +1352,6 @@ public:
|
|||||||
CKeyStoreIsMineVisitor(const CKeyStore *keystoreIn) : keystore(keystoreIn) { }
|
CKeyStoreIsMineVisitor(const CKeyStore *keystoreIn) : keystore(keystoreIn) { }
|
||||||
bool operator()(const CNoDestination &dest) const { return false; }
|
bool operator()(const CNoDestination &dest) const { return false; }
|
||||||
bool operator()(const CKeyID &keyID) const { return keystore->HaveKey(keyID); }
|
bool operator()(const CKeyID &keyID) const { return keystore->HaveKey(keyID); }
|
||||||
bool operator()(const CScriptID &scriptID) const { return keystore->HaveCScript(scriptID); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool IsMine(const CKeyStore &keystore, const CTxDestination &dest)
|
bool IsMine(const CKeyStore &keystore, const CTxDestination &dest)
|
||||||
@ -1393,13 +1377,6 @@ bool IsMine(const CKeyStore &keystore, const CScript& scriptPubKey)
|
|||||||
case TX_PUBKEYHASH:
|
case TX_PUBKEYHASH:
|
||||||
keyID = CKeyID(uint160(vSolutions[0]));
|
keyID = CKeyID(uint160(vSolutions[0]));
|
||||||
return keystore.HaveKey(keyID);
|
return keystore.HaveKey(keyID);
|
||||||
case TX_SCRIPTHASH:
|
|
||||||
{
|
|
||||||
CScript subscript;
|
|
||||||
if (!keystore.GetCScript(CScriptID(uint160(vSolutions[0])), subscript))
|
|
||||||
return false;
|
|
||||||
return IsMine(keystore, subscript);
|
|
||||||
}
|
|
||||||
case TX_MULTISIG:
|
case TX_MULTISIG:
|
||||||
{
|
{
|
||||||
// Only consider transactions "mine" if we own ALL the
|
// Only consider transactions "mine" if we own ALL the
|
||||||
@ -1431,11 +1408,6 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
|||||||
addressRet = CKeyID(uint160(vSolutions[0]));
|
addressRet = CKeyID(uint160(vSolutions[0]));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (whichType == TX_SCRIPTHASH)
|
|
||||||
{
|
|
||||||
addressRet = CScriptID(uint160(vSolutions[0]));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// Multisig txns have more than one address...
|
// Multisig txns have more than one address...
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1492,12 +1464,6 @@ public:
|
|||||||
vKeys.push_back(keyId);
|
vKeys.push_back(keyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator()(const CScriptID &scriptId) {
|
|
||||||
CScript script;
|
|
||||||
if (keystore.GetCScript(scriptId, script))
|
|
||||||
Process(script);
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator()(const CNoDestination &none) {}
|
void operator()(const CNoDestination &none) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1678,26 +1644,6 @@ static CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo,
|
|||||||
if (sigs1.empty() || sigs1[0].empty())
|
if (sigs1.empty() || sigs1[0].empty())
|
||||||
return PushAll(sigs2);
|
return PushAll(sigs2);
|
||||||
return PushAll(sigs1);
|
return PushAll(sigs1);
|
||||||
case TX_SCRIPTHASH:
|
|
||||||
if (sigs1.empty() || sigs1.back().empty())
|
|
||||||
return PushAll(sigs2);
|
|
||||||
else if (sigs2.empty() || sigs2.back().empty())
|
|
||||||
return PushAll(sigs1);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Recur to combine:
|
|
||||||
valtype spk = sigs1.back();
|
|
||||||
CScript pubKey2(spk.begin(), spk.end());
|
|
||||||
|
|
||||||
txnouttype txType2;
|
|
||||||
vector<vector<unsigned char> > vSolutions2;
|
|
||||||
Solver(pubKey2, txType2, vSolutions2);
|
|
||||||
sigs1.pop_back();
|
|
||||||
sigs2.pop_back();
|
|
||||||
CScript result = CombineSignatures(pubKey2, txTo, nIn, txType2, vSolutions2, sigs1, sigs2);
|
|
||||||
result << spk;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
case TX_MULTISIG:
|
case TX_MULTISIG:
|
||||||
return CombineMultisig(scriptPubKey, txTo, nIn, vSolutions, sigs1, sigs2);
|
return CombineMultisig(scriptPubKey, txTo, nIn, vSolutions, sigs1, sigs2);
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,6 @@ enum txnouttype
|
|||||||
// 'standard' transaction types:
|
// 'standard' transaction types:
|
||||||
TX_PUBKEY,
|
TX_PUBKEY,
|
||||||
TX_PUBKEYHASH,
|
TX_PUBKEYHASH,
|
||||||
TX_SCRIPTHASH,
|
|
||||||
TX_MULTISIG,
|
TX_MULTISIG,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ struct CompareValueOnly
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CPubKey CWallet::GenerateNewKey()
|
CPubKey CWallet::GenerateNewKey(std::string username)
|
||||||
{
|
{
|
||||||
bool fCompressed = CanSupportFeature(FEATURE_COMPRPUBKEY); // default to compressed public keys if we want 0.6.0 wallets
|
bool fCompressed = CanSupportFeature(FEATURE_COMPRPUBKEY); // default to compressed public keys if we want 0.6.0 wallets
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ CPubKey CWallet::GenerateNewKey()
|
|||||||
|
|
||||||
// Create new metadata
|
// Create new metadata
|
||||||
int64 nCreationTime = GetTime();
|
int64 nCreationTime = GetTime();
|
||||||
mapKeyMetadata[pubkey.GetID()] = CKeyMetadata(nCreationTime);
|
mapKeyMetadata[pubkey.GetID()] = CKeyMetadata(nCreationTime, username);
|
||||||
if (!nTimeFirstKey || nCreationTime < nTimeFirstKey)
|
if (!nTimeFirstKey || nCreationTime < nTimeFirstKey)
|
||||||
nTimeFirstKey = nCreationTime;
|
nTimeFirstKey = nCreationTime;
|
||||||
|
|
||||||
@ -101,15 +101,6 @@ bool CWallet::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigne
|
|||||||
return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret);
|
return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::AddCScript(const CScript& redeemScript)
|
|
||||||
{
|
|
||||||
if (!CCryptoKeyStore::AddCScript(redeemScript))
|
|
||||||
return false;
|
|
||||||
if (!fFileBacked)
|
|
||||||
return true;
|
|
||||||
return CWalletDB(strWalletFile).WriteCScript(Hash160(redeemScript), redeemScript);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CWallet::Unlock(const SecureString& strWalletPassphrase)
|
bool CWallet::Unlock(const SecureString& strWalletPassphrase)
|
||||||
{
|
{
|
||||||
CCrypter crypter;
|
CCrypter crypter;
|
||||||
@ -1247,6 +1238,7 @@ bool GetWalletFile(CWallet* pwallet, string &strWalletFileOut)
|
|||||||
//
|
//
|
||||||
bool CWallet::NewKeyPool()
|
bool CWallet::NewKeyPool()
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
CWalletDB walletdb(strWalletFile);
|
CWalletDB walletdb(strWalletFile);
|
||||||
@ -1266,11 +1258,13 @@ bool CWallet::NewKeyPool()
|
|||||||
}
|
}
|
||||||
printf("CWallet::NewKeyPool wrote %"PRI64d" new keys\n", nKeys);
|
printf("CWallet::NewKeyPool wrote %"PRI64d" new keys\n", nKeys);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::TopUpKeyPool()
|
bool CWallet::TopUpKeyPool()
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
|
|
||||||
@ -1292,6 +1286,7 @@ bool CWallet::TopUpKeyPool()
|
|||||||
printf("keypool added key %"PRI64d", size=%"PRIszu"\n", nEnd, setKeyPool.size());
|
printf("keypool added key %"PRI64d", size=%"PRIszu"\n", nEnd, setKeyPool.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1360,6 +1355,7 @@ void CWallet::ReturnKey(int64 nIndex)
|
|||||||
|
|
||||||
bool CWallet::GetKeyFromPool(CPubKey& result, bool fAllowReuse)
|
bool CWallet::GetKeyFromPool(CPubKey& result, bool fAllowReuse)
|
||||||
{
|
{
|
||||||
|
/* [MF] pool is going to die.
|
||||||
int64 nIndex = 0;
|
int64 nIndex = 0;
|
||||||
CKeyPool keypool;
|
CKeyPool keypool;
|
||||||
{
|
{
|
||||||
@ -1380,6 +1376,8 @@ bool CWallet::GetKeyFromPool(CPubKey& result, bool fAllowReuse)
|
|||||||
result = keypool.vchPubKey;
|
result = keypool.vchPubKey;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 CWallet::GetOldestKeyPoolTime()
|
int64 CWallet::GetOldestKeyPoolTime()
|
||||||
|
@ -135,7 +135,7 @@ public:
|
|||||||
|
|
||||||
// keystore implementation
|
// keystore implementation
|
||||||
// Generate a new key
|
// Generate a new key
|
||||||
CPubKey GenerateNewKey();
|
CPubKey GenerateNewKey(std::string username);
|
||||||
// Adds a key to the store, and saves it to disk.
|
// Adds a key to the store, and saves it to disk.
|
||||||
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
|
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
|
||||||
// Adds a key to the store, without saving it to disk (used by LoadWallet)
|
// Adds a key to the store, without saving it to disk (used by LoadWallet)
|
||||||
@ -149,8 +149,6 @@ public:
|
|||||||
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
|
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
|
||||||
// Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
|
// Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
|
||||||
bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
|
bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
|
||||||
bool AddCScript(const CScript& redeemScript);
|
|
||||||
bool LoadCScript(const CScript& redeemScript) { return CCryptoKeyStore::AddCScript(redeemScript); }
|
|
||||||
|
|
||||||
bool Unlock(const SecureString& strWalletPassphrase);
|
bool Unlock(const SecureString& strWalletPassphrase);
|
||||||
bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase);
|
bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase);
|
||||||
|
@ -374,7 +374,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
|||||||
// stored metadata for that key later, which is fine.
|
// stored metadata for that key later, which is fine.
|
||||||
CKeyID keyid = keypool.vchPubKey.GetID();
|
CKeyID keyid = keypool.vchPubKey.GetID();
|
||||||
if (pwallet->mapKeyMetadata.count(keyid) == 0)
|
if (pwallet->mapKeyMetadata.count(keyid) == 0)
|
||||||
pwallet->mapKeyMetadata[keyid] = CKeyMetadata(keypool.nTime);
|
pwallet->mapKeyMetadata[keyid] = CKeyMetadata(keypool.nTime, std::string());
|
||||||
}
|
}
|
||||||
else if (strType == "version")
|
else if (strType == "version")
|
||||||
{
|
{
|
||||||
@ -382,18 +382,6 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
|||||||
if (wss.nFileVersion == 10300)
|
if (wss.nFileVersion == 10300)
|
||||||
wss.nFileVersion = 300;
|
wss.nFileVersion = 300;
|
||||||
}
|
}
|
||||||
else if (strType == "cscript")
|
|
||||||
{
|
|
||||||
uint160 hash;
|
|
||||||
ssKey >> hash;
|
|
||||||
CScript script;
|
|
||||||
ssValue >> script;
|
|
||||||
if (!pwallet->LoadCScript(script))
|
|
||||||
{
|
|
||||||
strErr = "Error reading wallet database: LoadCScript failed";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strType == "orderposnext")
|
else if (strType == "orderposnext")
|
||||||
{
|
{
|
||||||
ssValue >> pwallet->nOrderPosNext;
|
ssValue >> pwallet->nOrderPosNext;
|
||||||
@ -557,7 +545,7 @@ void ThreadFlushWalletDB(const string& strFile)
|
|||||||
map<string, int>::iterator mi = bitdb.mapFileUseCount.find(strFile);
|
map<string, int>::iterator mi = bitdb.mapFileUseCount.find(strFile);
|
||||||
if (mi != bitdb.mapFileUseCount.end())
|
if (mi != bitdb.mapFileUseCount.end())
|
||||||
{
|
{
|
||||||
printf("Flushing wallet.dat\n");
|
printf("Flushing twisterwallet.dat\n");
|
||||||
nLastFlushed = nWalletDBUpdated;
|
nLastFlushed = nWalletDBUpdated;
|
||||||
int64 nStart = GetTimeMillis();
|
int64 nStart = GetTimeMillis();
|
||||||
|
|
||||||
@ -566,7 +554,7 @@ void ThreadFlushWalletDB(const string& strFile)
|
|||||||
bitdb.CheckpointLSN(strFile);
|
bitdb.CheckpointLSN(strFile);
|
||||||
|
|
||||||
bitdb.mapFileUseCount.erase(mi++);
|
bitdb.mapFileUseCount.erase(mi++);
|
||||||
printf("Flushed wallet.dat %"PRI64d"ms\n", GetTimeMillis() - nStart);
|
printf("Flushed twisterwallet.dat %"PRI64d"ms\n", GetTimeMillis() - nStart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -589,7 +577,7 @@ bool BackupWallet(const CWallet& wallet, const string& strDest)
|
|||||||
bitdb.CheckpointLSN(wallet.strWalletFile);
|
bitdb.CheckpointLSN(wallet.strWalletFile);
|
||||||
bitdb.mapFileUseCount.erase(wallet.strWalletFile);
|
bitdb.mapFileUseCount.erase(wallet.strWalletFile);
|
||||||
|
|
||||||
// Copy wallet.dat
|
// Copy twisterwallet.dat
|
||||||
filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;
|
filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;
|
||||||
filesystem::path pathDest(strDest);
|
filesystem::path pathDest(strDest);
|
||||||
if (filesystem::is_directory(pathDest))
|
if (filesystem::is_directory(pathDest))
|
||||||
@ -601,10 +589,10 @@ bool BackupWallet(const CWallet& wallet, const string& strDest)
|
|||||||
#else
|
#else
|
||||||
filesystem::copy_file(pathSrc, pathDest);
|
filesystem::copy_file(pathSrc, pathDest);
|
||||||
#endif
|
#endif
|
||||||
printf("copied wallet.dat to %s\n", pathDest.string().c_str());
|
printf("copied twisterwallet.dat to %s\n", pathDest.string().c_str());
|
||||||
return true;
|
return true;
|
||||||
} catch(const filesystem::filesystem_error &e) {
|
} catch(const filesystem::filesystem_error &e) {
|
||||||
printf("error copying wallet.dat to %s - %s\n", pathDest.string().c_str(), e.what());
|
printf("error copying twisterwallet.dat to %s - %s\n", pathDest.string().c_str(), e.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,15 +31,17 @@ public:
|
|||||||
static const int CURRENT_VERSION=1;
|
static const int CURRENT_VERSION=1;
|
||||||
int nVersion;
|
int nVersion;
|
||||||
int64 nCreateTime; // 0 means unknown
|
int64 nCreateTime; // 0 means unknown
|
||||||
|
std::string username;
|
||||||
|
|
||||||
CKeyMetadata()
|
CKeyMetadata()
|
||||||
{
|
{
|
||||||
SetNull();
|
SetNull();
|
||||||
}
|
}
|
||||||
CKeyMetadata(int64 nCreateTime_)
|
CKeyMetadata(int64 nCreateTime_, std::string username_)
|
||||||
{
|
{
|
||||||
nVersion = CKeyMetadata::CURRENT_VERSION;
|
nVersion = CKeyMetadata::CURRENT_VERSION;
|
||||||
nCreateTime = nCreateTime_;
|
nCreateTime = nCreateTime_;
|
||||||
|
username = username_;
|
||||||
}
|
}
|
||||||
|
|
||||||
IMPLEMENT_SERIALIZE
|
IMPLEMENT_SERIALIZE
|
||||||
@ -47,16 +49,18 @@ public:
|
|||||||
READWRITE(this->nVersion);
|
READWRITE(this->nVersion);
|
||||||
nVersion = this->nVersion;
|
nVersion = this->nVersion;
|
||||||
READWRITE(nCreateTime);
|
READWRITE(nCreateTime);
|
||||||
|
READWRITE(username);
|
||||||
)
|
)
|
||||||
|
|
||||||
void SetNull()
|
void SetNull()
|
||||||
{
|
{
|
||||||
nVersion = CKeyMetadata::CURRENT_VERSION;
|
nVersion = CKeyMetadata::CURRENT_VERSION;
|
||||||
nCreateTime = 0;
|
nCreateTime = 0;
|
||||||
|
username.clear();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Access to the wallet database (wallet.dat) */
|
/** Access to the wallet database (twisterwallet.dat) */
|
||||||
class CWalletDB : public CDB
|
class CWalletDB : public CDB
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -168,7 +172,7 @@ public:
|
|||||||
return Erase(std::make_pair(std::string("pool"), nPool));
|
return Erase(std::make_pair(std::string("pool"), nPool));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Settings are no longer stored in wallet.dat; these are
|
// Settings are no longer stored in twisterwallet.dat; these are
|
||||||
// used only for backwards compatibility:
|
// used only for backwards compatibility:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
bool ReadSetting(const std::string& strKey, T& value)
|
bool ReadSetting(const std::string& strKey, T& value)
|
||||||
|
Loading…
Reference in New Issue
Block a user