|
|
@ -195,7 +195,7 @@ namespace cryptonote
|
|
|
|
return addr.m_view_public_key;
|
|
|
|
return addr.m_view_public_key;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
bool construct_tx_with_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, const std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, const crypto::secret_key &tx_key, const std::vector<crypto::secret_key> &additional_tx_keys, bool rct, bool bulletproof, rct::multisig_out *msout)
|
|
|
|
bool construct_tx_with_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, const crypto::secret_key &tx_key, const std::vector<crypto::secret_key> &additional_tx_keys, bool rct, bool bulletproof, rct::multisig_out *msout, bool shuffle_outs)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
hw::device &hwdev = sender_account_keys.get_device();
|
|
|
|
hw::device &hwdev = sender_account_keys.get_device();
|
|
|
|
|
|
|
|
|
|
|
@ -315,9 +315,10 @@ namespace cryptonote
|
|
|
|
tx.vin.push_back(input_to_key);
|
|
|
|
tx.vin.push_back(input_to_key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// "Shuffle" outs
|
|
|
|
if (shuffle_outs)
|
|
|
|
std::vector<tx_destination_entry> shuffled_dsts(destinations);
|
|
|
|
{
|
|
|
|
std::shuffle(shuffled_dsts.begin(), shuffled_dsts.end(), std::default_random_engine(crypto::rand<unsigned int>()));
|
|
|
|
std::shuffle(destinations.begin(), destinations.end(), std::default_random_engine(crypto::rand<unsigned int>()));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// sort ins by their key image
|
|
|
|
// sort ins by their key image
|
|
|
|
std::vector<size_t> ins_order(sources.size());
|
|
|
|
std::vector<size_t> ins_order(sources.size());
|
|
|
@ -364,7 +365,7 @@ namespace cryptonote
|
|
|
|
uint64_t summary_outs_money = 0;
|
|
|
|
uint64_t summary_outs_money = 0;
|
|
|
|
//fill outputs
|
|
|
|
//fill outputs
|
|
|
|
size_t output_index = 0;
|
|
|
|
size_t output_index = 0;
|
|
|
|
for(const tx_destination_entry& dst_entr: shuffled_dsts)
|
|
|
|
for(const tx_destination_entry& dst_entr: destinations)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
CHECK_AND_ASSERT_MES(dst_entr.amount > 0 || tx.version > 1, false, "Destination with wrong amount: " << dst_entr.amount);
|
|
|
|
CHECK_AND_ASSERT_MES(dst_entr.amount > 0 || tx.version > 1, false, "Destination with wrong amount: " << dst_entr.amount);
|
|
|
|
crypto::key_derivation derivation;
|
|
|
|
crypto::key_derivation derivation;
|
|
|
@ -600,7 +601,7 @@ namespace cryptonote
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
bool construct_tx_and_get_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, const std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, crypto::secret_key &tx_key, std::vector<crypto::secret_key> &additional_tx_keys, bool rct, bool bulletproof, rct::multisig_out *msout)
|
|
|
|
bool construct_tx_and_get_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, crypto::secret_key &tx_key, std::vector<crypto::secret_key> &additional_tx_keys, bool rct, bool bulletproof, rct::multisig_out *msout)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
hw::device &hwdev = sender_account_keys.get_device();
|
|
|
|
hw::device &hwdev = sender_account_keys.get_device();
|
|
|
|
hwdev.open_tx(tx_key);
|
|
|
|
hwdev.open_tx(tx_key);
|
|
|
@ -629,7 +630,8 @@ namespace cryptonote
|
|
|
|
subaddresses[sender_account_keys.m_account_address.m_spend_public_key] = {0,0};
|
|
|
|
subaddresses[sender_account_keys.m_account_address.m_spend_public_key] = {0,0};
|
|
|
|
crypto::secret_key tx_key;
|
|
|
|
crypto::secret_key tx_key;
|
|
|
|
std::vector<crypto::secret_key> additional_tx_keys;
|
|
|
|
std::vector<crypto::secret_key> additional_tx_keys;
|
|
|
|
return construct_tx_and_get_tx_key(sender_account_keys, subaddresses, sources, destinations, change_addr, extra, tx, unlock_time, tx_key, additional_tx_keys, false, false, NULL);
|
|
|
|
std::vector<tx_destination_entry> destinations_copy = destinations;
|
|
|
|
|
|
|
|
return construct_tx_and_get_tx_key(sender_account_keys, subaddresses, sources, destinations_copy, change_addr, extra, tx, unlock_time, tx_key, additional_tx_keys, false, false, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
bool generate_genesis_block(
|
|
|
|
bool generate_genesis_block(
|
|
|
|