mirror of
https://github.com/monero-project/monero.git
synced 2024-10-01 11:49:47 -04:00
Merge pull request #3247
89ad162a
wallet2: remove unused m_subaddresses_inv (moneromooo-monero)f2c4c399
wallet2: speed up subaddress generation (by about a third) (moneromooo-monero)
This commit is contained in:
commit
cfa3af4078
@ -172,6 +172,45 @@ namespace cryptonote
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
|
std::vector<crypto::public_key> get_subaddress_spend_public_keys(const cryptonote::account_keys &keys, uint32_t account, uint32_t begin, uint32_t end)
|
||||||
|
{
|
||||||
|
CHECK_AND_ASSERT_THROW_MES(begin <= end, "begin > end");
|
||||||
|
|
||||||
|
std::vector<crypto::public_key> pkeys;
|
||||||
|
pkeys.reserve(end - begin);
|
||||||
|
cryptonote::subaddress_index index = {account, begin};
|
||||||
|
|
||||||
|
ge_p3 p3;
|
||||||
|
ge_cached cached;
|
||||||
|
CHECK_AND_ASSERT_THROW_MES(ge_frombytes_vartime(&p3, (const unsigned char*)keys.m_account_address.m_spend_public_key.data) == 0,
|
||||||
|
"ge_frombytes_vartime failed to convert spend public key");
|
||||||
|
ge_p3_to_cached(&cached, &p3);
|
||||||
|
|
||||||
|
for (uint32_t idx = begin; idx < end; ++idx)
|
||||||
|
{
|
||||||
|
index.minor = idx;
|
||||||
|
if (index.is_zero())
|
||||||
|
{
|
||||||
|
pkeys.push_back(keys.m_account_address.m_spend_public_key);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const crypto::secret_key m = cryptonote::get_subaddress_secret_key(keys.m_view_secret_key, index);
|
||||||
|
|
||||||
|
// M = m*G
|
||||||
|
ge_scalarmult_base(&p3, (const unsigned char*)m.data);
|
||||||
|
|
||||||
|
// D = B + M
|
||||||
|
crypto::public_key D;
|
||||||
|
ge_p1p1 p1p1;
|
||||||
|
ge_add(&p1p1, &p3, &cached);
|
||||||
|
ge_p1p1_to_p3(&p3, &p1p1);
|
||||||
|
ge_p3_tobytes((unsigned char*)D.data, &p3);
|
||||||
|
|
||||||
|
pkeys.push_back(D);
|
||||||
|
}
|
||||||
|
return pkeys;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------
|
||||||
bool generate_key_image_helper(const account_keys& ack, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, const crypto::public_key& out_key, const crypto::public_key& tx_public_key, const std::vector<crypto::public_key>& additional_tx_public_keys, size_t real_output_index, keypair& in_ephemeral, crypto::key_image& ki)
|
bool generate_key_image_helper(const account_keys& ack, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, const crypto::public_key& out_key, const crypto::public_key& tx_public_key, const std::vector<crypto::public_key>& additional_tx_public_keys, size_t real_output_index, keypair& in_ephemeral, crypto::key_image& ki)
|
||||||
{
|
{
|
||||||
crypto::key_derivation recv_derivation = AUTO_VAL_INIT(recv_derivation);
|
crypto::key_derivation recv_derivation = AUTO_VAL_INIT(recv_derivation);
|
||||||
|
@ -93,6 +93,7 @@ namespace cryptonote
|
|||||||
bool get_tx_fee(const transaction& tx, uint64_t & fee);
|
bool get_tx_fee(const transaction& tx, uint64_t & fee);
|
||||||
uint64_t get_tx_fee(const transaction& tx);
|
uint64_t get_tx_fee(const transaction& tx);
|
||||||
crypto::secret_key get_subaddress_secret_key(const crypto::secret_key& a, const subaddress_index& index);
|
crypto::secret_key get_subaddress_secret_key(const crypto::secret_key& a, const subaddress_index& index);
|
||||||
|
std::vector<crypto::public_key> get_subaddress_spend_public_keys(const cryptonote::account_keys &keys, uint32_t account, uint32_t begin, uint32_t end);
|
||||||
bool generate_key_image_helper(const account_keys& ack, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, const crypto::public_key& out_key, const crypto::public_key& tx_public_key, const std::vector<crypto::public_key>& additional_tx_public_keys, size_t real_output_index, keypair& in_ephemeral, crypto::key_image& ki);
|
bool generate_key_image_helper(const account_keys& ack, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, const crypto::public_key& out_key, const crypto::public_key& tx_public_key, const std::vector<crypto::public_key>& additional_tx_public_keys, size_t real_output_index, keypair& in_ephemeral, crypto::key_image& ki);
|
||||||
bool generate_key_image_helper_precomp(const account_keys& ack, const crypto::public_key& out_key, const crypto::key_derivation& recv_derivation, size_t real_output_index, const subaddress_index& received_index, keypair& in_ephemeral, crypto::key_image& ki);
|
bool generate_key_image_helper_precomp(const account_keys& ack, const crypto::public_key& out_key, const crypto::key_derivation& recv_derivation, size_t real_output_index, const subaddress_index& received_index, keypair& in_ephemeral, crypto::key_image& ki);
|
||||||
void get_blob_hash(const blobdata& blob, crypto::hash& res);
|
void get_blob_hash(const blobdata& blob, crypto::hash& res);
|
||||||
|
@ -888,14 +888,12 @@ void wallet2::expand_subaddresses(const cryptonote::subaddress_index& index)
|
|||||||
cryptonote::subaddress_index index2;
|
cryptonote::subaddress_index index2;
|
||||||
for (index2.major = m_subaddress_labels.size(); index2.major < index.major + m_subaddress_lookahead_major; ++index2.major)
|
for (index2.major = m_subaddress_labels.size(); index2.major < index.major + m_subaddress_lookahead_major; ++index2.major)
|
||||||
{
|
{
|
||||||
for (index2.minor = 0; index2.minor < (index2.major == index.major ? index.minor : 0) + m_subaddress_lookahead_minor; ++index2.minor)
|
const uint32_t end = (index2.major == index.major ? index.minor : 0) + m_subaddress_lookahead_minor;
|
||||||
|
const std::vector<crypto::public_key> pkeys = cryptonote::get_subaddress_spend_public_keys(m_account.get_keys(), index2.major, 0, end);
|
||||||
|
for (index2.minor = 0; index2.minor < end; ++index2.minor)
|
||||||
{
|
{
|
||||||
if (m_subaddresses_inv.count(index2) == 0)
|
const crypto::public_key &D = pkeys[index2.minor];
|
||||||
{
|
m_subaddresses[D] = index2;
|
||||||
crypto::public_key D = get_subaddress_spend_public_key(index2);
|
|
||||||
m_subaddresses[D] = index2;
|
|
||||||
m_subaddresses_inv[index2] = D;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_subaddress_labels.resize(index.major + 1, {"Untitled account"});
|
m_subaddress_labels.resize(index.major + 1, {"Untitled account"});
|
||||||
@ -904,15 +902,14 @@ void wallet2::expand_subaddresses(const cryptonote::subaddress_index& index)
|
|||||||
else if (m_subaddress_labels[index.major].size() <= index.minor)
|
else if (m_subaddress_labels[index.major].size() <= index.minor)
|
||||||
{
|
{
|
||||||
// add new subaddresses
|
// add new subaddresses
|
||||||
cryptonote::subaddress_index index2 = index;
|
const uint32_t end = index.minor + m_subaddress_lookahead_minor;
|
||||||
for (index2.minor = m_subaddress_labels[index.major].size(); index2.minor < index.minor + m_subaddress_lookahead_minor; ++index2.minor)
|
const uint32_t begin = m_subaddress_labels[index.major].size();
|
||||||
|
cryptonote::subaddress_index index2 = {index.major, begin};
|
||||||
|
const std::vector<crypto::public_key> pkeys = cryptonote::get_subaddress_spend_public_keys(m_account.get_keys(), index2.major, index2.minor, end);
|
||||||
|
for (; index2.minor < end; ++index2.minor)
|
||||||
{
|
{
|
||||||
if (m_subaddresses_inv.count(index2) == 0)
|
const crypto::public_key &D = pkeys[index2.minor - begin];
|
||||||
{
|
m_subaddresses[D] = index2;
|
||||||
crypto::public_key D = get_subaddress_spend_public_key(index2);
|
|
||||||
m_subaddresses[D] = index2;
|
|
||||||
m_subaddresses_inv[index2] = D;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
m_subaddress_labels[index.major].resize(index.minor + 1);
|
m_subaddress_labels[index.major].resize(index.minor + 1);
|
||||||
}
|
}
|
||||||
@ -2352,7 +2349,6 @@ bool wallet2::clear()
|
|||||||
m_address_book.clear();
|
m_address_book.clear();
|
||||||
m_local_bc_height = 1;
|
m_local_bc_height = 1;
|
||||||
m_subaddresses.clear();
|
m_subaddresses.clear();
|
||||||
m_subaddresses_inv.clear();
|
|
||||||
m_subaddress_labels.clear();
|
m_subaddress_labels.clear();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -3194,7 +3190,6 @@ bool wallet2::finalize_multisig(const epee::wipeable_string &password, std::unor
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_subaddresses.clear();
|
m_subaddresses.clear();
|
||||||
m_subaddresses_inv.clear();
|
|
||||||
m_subaddress_labels.clear();
|
m_subaddress_labels.clear();
|
||||||
add_subaddress_account(tr("Primary account"));
|
add_subaddress_account(tr("Primary account"));
|
||||||
|
|
||||||
|
@ -605,6 +605,7 @@ namespace tools
|
|||||||
cryptonote::account_public_address get_subaddress(const cryptonote::subaddress_index& index) const;
|
cryptonote::account_public_address get_subaddress(const cryptonote::subaddress_index& index) const;
|
||||||
cryptonote::account_public_address get_address() const { return get_subaddress({0,0}); }
|
cryptonote::account_public_address get_address() const { return get_subaddress({0,0}); }
|
||||||
crypto::public_key get_subaddress_spend_public_key(const cryptonote::subaddress_index& index) const;
|
crypto::public_key get_subaddress_spend_public_key(const cryptonote::subaddress_index& index) const;
|
||||||
|
std::vector<crypto::public_key> get_subaddress_spend_public_keys(uint32_t account, uint32_t begin, uint32_t end) const;
|
||||||
std::string get_subaddress_as_str(const cryptonote::subaddress_index& index) const;
|
std::string get_subaddress_as_str(const cryptonote::subaddress_index& index) const;
|
||||||
std::string get_address_as_str() const { return get_subaddress_as_str({0, 0}); }
|
std::string get_address_as_str() const { return get_subaddress_as_str({0, 0}); }
|
||||||
std::string get_integrated_address_as_str(const crypto::hash8& payment_id) const;
|
std::string get_integrated_address_as_str(const crypto::hash8& payment_id) const;
|
||||||
@ -782,7 +783,8 @@ namespace tools
|
|||||||
if (ver < 20)
|
if (ver < 20)
|
||||||
return;
|
return;
|
||||||
a & m_subaddresses;
|
a & m_subaddresses;
|
||||||
a & m_subaddresses_inv;
|
std::unordered_map<cryptonote::subaddress_index, crypto::public_key> dummy_subaddresses_inv;
|
||||||
|
a & dummy_subaddresses_inv;
|
||||||
a & m_subaddress_labels;
|
a & m_subaddress_labels;
|
||||||
a & m_additional_tx_keys;
|
a & m_additional_tx_keys;
|
||||||
if(ver < 21)
|
if(ver < 21)
|
||||||
@ -1089,7 +1091,6 @@ namespace tools
|
|||||||
std::unordered_map<crypto::public_key, size_t> m_pub_keys;
|
std::unordered_map<crypto::public_key, size_t> m_pub_keys;
|
||||||
cryptonote::account_public_address m_account_public_address;
|
cryptonote::account_public_address m_account_public_address;
|
||||||
std::unordered_map<crypto::public_key, cryptonote::subaddress_index> m_subaddresses;
|
std::unordered_map<crypto::public_key, cryptonote::subaddress_index> m_subaddresses;
|
||||||
std::unordered_map<cryptonote::subaddress_index, crypto::public_key> m_subaddresses_inv;
|
|
||||||
std::vector<std::vector<std::string>> m_subaddress_labels;
|
std::vector<std::vector<std::string>> m_subaddress_labels;
|
||||||
std::unordered_map<crypto::hash, std::string> m_tx_notes;
|
std::unordered_map<crypto::hash, std::string> m_tx_notes;
|
||||||
std::unordered_map<std::string, std::string> m_attributes;
|
std::unordered_map<std::string, std::string> m_attributes;
|
||||||
|
Loading…
Reference in New Issue
Block a user