Optionally allow ImportScripts to set script creation timestamp

Behavior changes:
* scripts imported in importmulti that are not explicilty scriptPubKeys will have timestamps set for them
This commit is contained in:
Andrew Chow 2019-06-27 21:17:42 -04:00
parent 94bf156f39
commit 78941da5ba
3 changed files with 13 additions and 5 deletions

View file

@ -194,7 +194,7 @@ UniValue importprivkey(const JSONRPCRequest& request)
// Add the wpkh script for this key if possible // Add the wpkh script for this key if possible
if (pubkey.IsCompressed()) { if (pubkey.IsCompressed()) {
pwallet->ImportScripts({GetScriptForDestination(WitnessV0KeyHash(vchAddress))}); pwallet->ImportScripts({GetScriptForDestination(WitnessV0KeyHash(vchAddress))}, 0 /* timestamp */);
} }
} }
} }
@ -316,7 +316,7 @@ UniValue importaddress(const JSONRPCRequest& request)
CScript redeem_script(data.begin(), data.end()); CScript redeem_script(data.begin(), data.end());
std::set<CScript> scripts = {redeem_script}; std::set<CScript> scripts = {redeem_script};
pwallet->ImportScripts(scripts); pwallet->ImportScripts(scripts, 0 /* timestamp */);
if (fP2SH) { if (fP2SH) {
scripts.insert(GetScriptForDestination(ScriptHash(CScriptID(redeem_script)))); scripts.insert(GetScriptForDestination(ScriptHash(CScriptID(redeem_script))));
@ -1251,7 +1251,7 @@ static UniValue ProcessImport(CWallet * const pwallet, const UniValue& data, con
// All good, time to import // All good, time to import
pwallet->MarkDirty(); pwallet->MarkDirty();
if (!pwallet->ImportScripts(import_data.import_scripts)) { if (!pwallet->ImportScripts(import_data.import_scripts, timestamp)) {
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding script to wallet"); throw JSONRPCError(RPC_WALLET_ERROR, "Error adding script to wallet");
} }
if (!pwallet->ImportPrivKeys(privkey_map, timestamp)) { if (!pwallet->ImportPrivKeys(privkey_map, timestamp)) {

View file

@ -1661,7 +1661,7 @@ bool CWallet::DummySignTx(CMutableTransaction &txNew, const std::vector<CTxOut>
return true; return true;
} }
bool CWallet::ImportScripts(const std::set<CScript> scripts) bool CWallet::ImportScripts(const std::set<CScript> scripts, int64_t timestamp)
{ {
WalletBatch batch(*database); WalletBatch batch(*database);
for (const auto& entry : scripts) { for (const auto& entry : scripts) {
@ -1673,7 +1673,15 @@ bool CWallet::ImportScripts(const std::set<CScript> scripts)
if (!AddCScriptWithDB(batch, entry)) { if (!AddCScriptWithDB(batch, entry)) {
return false; return false;
} }
if (timestamp > 0) {
m_script_metadata[CScriptID(entry)].nCreateTime = timestamp;
}
} }
if (timestamp > 0) {
UpdateTimeFirstKey(timestamp);
}
return true; return true;
} }

View file

@ -1092,7 +1092,7 @@ public:
bool DummySignTx(CMutableTransaction &txNew, const std::vector<CTxOut> &txouts, bool use_max_sig = false) const; bool DummySignTx(CMutableTransaction &txNew, const std::vector<CTxOut> &txouts, bool use_max_sig = false) const;
bool DummySignInput(CTxIn &tx_in, const CTxOut &txout, bool use_max_sig = false) const; bool DummySignInput(CTxIn &tx_in, const CTxOut &txout, bool use_max_sig = false) const;
bool ImportScripts(const std::set<CScript> scripts) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); bool ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool ImportScriptPubKeys(const std::string& label, const std::set<CScript>& script_pub_keys, const bool have_solving_data, const bool apply_label, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); bool ImportScriptPubKeys(const std::string& label, const std::set<CScript>& script_pub_keys, const bool have_solving_data, const bool apply_label, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);