aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/wallet2.cpp
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2018-07-03 15:51:41 +0200
committerRiccardo Spagni <ric@spagni.net>2018-07-03 15:51:41 +0200
commit40f85f478e646f363267850a7f37239e350e5d74 (patch)
tree65ef3c221c2d9e667f9acf8a23d7ed860b6adcd3 /src/wallet/wallet2.cpp
parentMerge pull request #4080 (diff)
parentwallet2: fix double counting outs if the tx pubkey is duplicated (diff)
downloadmonero-40f85f478e646f363267850a7f37239e350e5d74.tar.xz
Merge pull request #3985
58cceaad wallet2: fix double counting outs if the tx pubkey is duplicated (moneromooo-monero)
Diffstat (limited to 'src/wallet/wallet2.cpp')
-rw-r--r--src/wallet/wallet2.cpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 3a07523be..d99371673 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -1173,6 +1173,7 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
// Don't try to extract tx public key if tx has no ouputs
size_t pk_index = 0;
std::vector<tx_scan_info_t> tx_scan_info(tx.vout.size());
+ std::unordered_set<crypto::public_key> public_keys_seen;
while (!tx.vout.empty())
{
// if tx.vout is not empty, we loop through all tx pubkeys
@@ -1193,6 +1194,13 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
error::wallet_internal_error, "tx_cache_data is out of sync");
}
+ if (public_keys_seen.find(pub_key_field.pub_key) != public_keys_seen.end())
+ {
+ MWARNING("The same transaction pubkey is present more than once, ignoring extra instance");
+ continue;
+ }
+ public_keys_seen.insert(pub_key_field.pub_key);
+
int num_vouts_received = 0;
tx_pub_key = pub_key_field.pub_key;
tools::threadpool& tpool = tools::threadpool::getInstance();
@@ -1217,16 +1225,19 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
memcpy(&derivation, rct::identity().bytes, sizeof(derivation));
}
- // additional tx pubkeys and derivations for multi-destination transfers involving one or more subaddresses
- if (find_tx_extra_field_by_type(tx_extra_fields, additional_tx_pub_keys))
+ if (pk_index == 1)
{
- for (size_t i = 0; i < additional_tx_pub_keys.data.size(); ++i)
+ // additional tx pubkeys and derivations for multi-destination transfers involving one or more subaddresses
+ if (find_tx_extra_field_by_type(tx_extra_fields, additional_tx_pub_keys))
{
- additional_derivations.push_back({});
- if (!hwdev.generate_key_derivation(additional_tx_pub_keys.data[i], keys.m_view_secret_key, additional_derivations.back()))
+ for (size_t i = 0; i < additional_tx_pub_keys.data.size(); ++i)
{
- MWARNING("Failed to generate key derivation from additional tx pubkey in " << txid << ", skipping");
- memcpy(&additional_derivations.back(), rct::identity().bytes, sizeof(crypto::key_derivation));
+ additional_derivations.push_back({});
+ if (!hwdev.generate_key_derivation(additional_tx_pub_keys.data[i], keys.m_view_secret_key, additional_derivations.back()))
+ {
+ MWARNING("Failed to generate key derivation from additional tx pubkey in " << txid << ", skipping");
+ memcpy(&additional_derivations.back(), rct::identity().bytes, sizeof(crypto::key_derivation));
+ }
}
}
}
@@ -1237,10 +1248,13 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
error::wallet_internal_error, "pk_index out of range of tx_cache_data");
is_out_data_ptr = &tx_cache_data.primary[pk_index - 1];
derivation = tx_cache_data.primary[pk_index - 1].derivation;
- for (size_t n = 0; n < tx_cache_data.additional.size(); ++n)
+ if (pk_index == 1)
{
- additional_tx_pub_keys.data.push_back(tx_cache_data.additional[n].pkey);
- additional_derivations.push_back(tx_cache_data.additional[n].derivation);
+ for (size_t n = 0; n < tx_cache_data.additional.size(); ++n)
+ {
+ additional_tx_pub_keys.data.push_back(tx_cache_data.additional[n].pkey);
+ additional_derivations.push_back(tx_cache_data.additional[n].derivation);
+ }
}
}