aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_core
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2019-01-18 19:12:58 +0200
committerRiccardo Spagni <ric@spagni.net>2019-01-18 19:12:58 +0200
commit4e723843183b12308bce2ef560385ea885ad0174 (patch)
tree86796c708d53a72f73e20360c87ff5991b1c0ee2 /src/cryptonote_core
parentMerge pull request #5050 (diff)
parentcore: include a dummy encrypted payment id when no payment is used (diff)
downloadmonero-4e723843183b12308bce2ef560385ea885ad0174.tar.xz
Merge pull request #5008
c6d38718 core: include a dummy encrypted payment id when no payment is used (moneromooo-monero) b7441c4a core, wallet: remember original text version of destination address (moneromooo-monero) a9b1c04a crptonote_core: do not error out sending unparsable extra field (moneromooo-monero)
Diffstat (limited to 'src/cryptonote_core')
-rw-r--r--src/cryptonote_core/cryptonote_tx_utils.cpp50
-rw-r--r--src/cryptonote_core/cryptonote_tx_utils.h18
2 files changed, 57 insertions, 11 deletions
diff --git a/src/cryptonote_core/cryptonote_tx_utils.cpp b/src/cryptonote_core/cryptonote_tx_utils.cpp
index f443d638c..b8ede32cf 100644
--- a/src/cryptonote_core/cryptonote_tx_utils.cpp
+++ b/src/cryptonote_core/cryptonote_tx_utils.cpp
@@ -226,13 +226,15 @@ namespace cryptonote
std::vector<tx_extra_field> tx_extra_fields;
if (parse_tx_extra(tx.extra, tx_extra_fields))
{
+ bool add_dummy_payment_id = true;
tx_extra_nonce extra_nonce;
if (find_tx_extra_field_by_type(tx_extra_fields, extra_nonce))
{
- crypto::hash8 payment_id = null_hash8;
- if (get_encrypted_payment_id_from_tx_extra_nonce(extra_nonce.nonce, payment_id))
+ crypto::hash payment_id = null_hash;
+ crypto::hash8 payment_id8 = null_hash8;
+ if (get_encrypted_payment_id_from_tx_extra_nonce(extra_nonce.nonce, payment_id8))
{
- LOG_PRINT_L2("Encrypting payment id " << payment_id);
+ LOG_PRINT_L2("Encrypting payment id " << payment_id8);
crypto::public_key view_key_pub = get_destination_view_key_pub(destinations, change_addr);
if (view_key_pub == null_pkey)
{
@@ -240,28 +242,60 @@ namespace cryptonote
return false;
}
- if (!hwdev.encrypt_payment_id(payment_id, view_key_pub, tx_key))
+ if (!hwdev.encrypt_payment_id(payment_id8, view_key_pub, tx_key))
{
LOG_ERROR("Failed to encrypt payment id");
return false;
}
std::string extra_nonce;
- set_encrypted_payment_id_to_tx_extra_nonce(extra_nonce, payment_id);
+ set_encrypted_payment_id_to_tx_extra_nonce(extra_nonce, payment_id8);
remove_field_from_tx_extra(tx.extra, typeid(tx_extra_nonce));
if (!add_extra_nonce_to_tx_extra(tx.extra, extra_nonce))
{
LOG_ERROR("Failed to add encrypted payment id to tx extra");
return false;
}
- LOG_PRINT_L1("Encrypted payment ID: " << payment_id);
+ LOG_PRINT_L1("Encrypted payment ID: " << payment_id8);
+ add_dummy_payment_id = false;
+ }
+ else if (get_payment_id_from_tx_extra_nonce(extra_nonce.nonce, payment_id))
+ {
+ add_dummy_payment_id = false;
+ }
+ }
+
+ // we don't add one if we've got more than the usual 1 destination plus change
+ if (destinations.size() > 2)
+ add_dummy_payment_id = false;
+
+ if (add_dummy_payment_id)
+ {
+ // if we have neither long nor short payment id, add a dummy short one,
+ // this should end up being the vast majority of txes as time goes on
+ std::string extra_nonce;
+ crypto::hash8 payment_id8 = null_hash8;
+ crypto::public_key view_key_pub = get_destination_view_key_pub(destinations, change_addr);
+ if (view_key_pub == null_pkey)
+ {
+ LOG_ERROR("Failed to get key to encrypt dummy payment id with");
+ }
+ else
+ {
+ hwdev.encrypt_payment_id(payment_id8, view_key_pub, tx_key);
+ set_encrypted_payment_id_to_tx_extra_nonce(extra_nonce, payment_id8);
+ if (!add_extra_nonce_to_tx_extra(tx.extra, extra_nonce))
+ {
+ LOG_ERROR("Failed to add dummy encrypted payment id to tx extra");
+ // continue anyway
+ }
}
}
}
else
{
- LOG_ERROR("Failed to parse tx extra");
- return false;
+ MWARNING("Failed to parse tx extra");
+ tx_extra_fields.clear();
}
struct input_generation_context_data
diff --git a/src/cryptonote_core/cryptonote_tx_utils.h b/src/cryptonote_core/cryptonote_tx_utils.h
index 87edafe9d..7fbd184fa 100644
--- a/src/cryptonote_core/cryptonote_tx_utils.h
+++ b/src/cryptonote_core/cryptonote_tx_utils.h
@@ -73,17 +73,22 @@ namespace cryptonote
struct tx_destination_entry
{
+ std::string original;
uint64_t amount; //money
account_public_address addr; //destination address
bool is_subaddress;
+ bool is_integrated;
- tx_destination_entry() : amount(0), addr(AUTO_VAL_INIT(addr)), is_subaddress(false) { }
- tx_destination_entry(uint64_t a, const account_public_address &ad, bool is_subaddress) : amount(a), addr(ad), is_subaddress(is_subaddress) { }
+ tx_destination_entry() : amount(0), addr(AUTO_VAL_INIT(addr)), is_subaddress(false), is_integrated(false) { }
+ tx_destination_entry(uint64_t a, const account_public_address &ad, bool is_subaddress) : amount(a), addr(ad), is_subaddress(is_subaddress), is_integrated(false) { }
+ tx_destination_entry(const std::string &o, uint64_t a, const account_public_address &ad, bool is_subaddress) : original(o), amount(a), addr(ad), is_subaddress(is_subaddress), is_integrated(false) { }
BEGIN_SERIALIZE_OBJECT()
+ FIELD(original)
VARINT_FIELD(amount)
FIELD(addr)
FIELD(is_subaddress)
+ FIELD(is_integrated)
END_SERIALIZE()
};
@@ -102,7 +107,7 @@ namespace cryptonote
}
BOOST_CLASS_VERSION(cryptonote::tx_source_entry, 1)
-BOOST_CLASS_VERSION(cryptonote::tx_destination_entry, 1)
+BOOST_CLASS_VERSION(cryptonote::tx_destination_entry, 2)
namespace boost
{
@@ -132,6 +137,13 @@ namespace boost
if (ver < 1)
return;
a & x.is_subaddress;
+ if (ver < 2)
+ {
+ x.is_integrated = false;
+ return;
+ }
+ a & x.original;
+ a & x.is_integrated;
}
}
}