40
40
#include " carrot_impl/tx_builder_outputs.h"
41
41
#include " carrot_impl/format_utils.h"
42
42
#include " carrot_impl/input_selection.h"
43
+ #include " common/apply_permutation.h"
43
44
#include " common/container_helpers.h"
44
45
#include " common/perf_timer.h"
45
46
#include " common/threadpool.h"
@@ -817,10 +818,6 @@ std::unordered_map<crypto::key_image, fcmp_pp::FcmpPpSalProof> sign_carrot_trans
817
818
CHECK_AND_ASSERT_THROW_MES (rerandomized_outputs.size () == n_inputs,
818
819
__func__ << " : wrong size for rerandomized_outputs" );
819
820
820
- std::unordered_map<crypto::key_image, fcmp_pp::FcmpPpSalProof> sal_proofs_by_ki;
821
-
822
- const auto best_transfer_by_ota = collect_non_burned_transfers_by_onetime_address (transfers);
823
-
824
821
// ! @TODO: carrot hierarchy
825
822
const carrot::cryptonote_hierarchy_address_device_ram_borrowed addr_dev (
826
823
acc_keys.m_account_address .m_spend_public_key ,
@@ -839,6 +836,7 @@ std::unordered_map<crypto::key_image, fcmp_pp::FcmpPpSalProof> sign_carrot_trans
839
836
key_image_dev,
840
837
signable_tx_hash);
841
838
839
+ std::unordered_map<crypto::key_image, fcmp_pp::FcmpPpSalProof> sal_proofs_by_ki;
842
840
for (size_t input_idx = 0 ; input_idx < n_inputs; ++input_idx)
843
841
{
844
842
// ! @TODO: spend device
@@ -941,7 +939,7 @@ cryptonote::transaction finalize_all_proofs_from_transfer_details(
941
939
__func__ << " : cannot find transfer by onetime address" );
942
940
const size_t transfer_idx = ota_it->second ;
943
941
CHECK_AND_ASSERT_THROW_MES (transfer_idx < transfers.size (),
944
- " finalize_all_proofs_from_transfer_details : transfer index out of range" );
942
+ __func__ << " : transfer index out of range" );
945
943
const wallet2_basic::transfer_details &td = transfers.at (transfer_idx);
946
944
const fcmp_pp::curve_trees::OutputPair input_pair = td.get_output_pair ();
947
945
input_onetime_addresses.push_back (input_pair.output_pubkey );
@@ -1057,11 +1055,15 @@ cryptonote::transaction finalize_all_proofs_from_transfer_details(
1057
1055
// ! @TODO: parallelize jobs
1058
1056
std::vector<fcmp_pp::FcmpPpSalProof> sal_proofs (n_inputs);
1059
1057
tpool.submit (&pre_membership_waiter,
1060
- [&tx_proposal, &sorted_input_key_images, &rerandomized_outputs, &transfers, &acc_keys, &sal_proofs](){
1058
+ [&tx_proposal, &sorted_input_key_images, &rerandomized_outputs, &transfers, &acc_keys, &sal_proofs, &key_image_order]() {
1059
+ // hacky: permutate tx proposal input proposals in key image order
1060
+ carrot::CarrotTransactionProposalV1 tx_proposal_sorted_ins = tx_proposal;
1061
+ tools::apply_permutation (key_image_order, tx_proposal_sorted_ins.input_proposals );
1062
+
1061
1063
PERF_TIMER (sign_carrot_transaction_proposal_from_transfer_details);
1062
1064
std::unordered_map<crypto::key_image, fcmp_pp::FcmpPpSalProof> sal_proofs_by_ki =
1063
1065
sign_carrot_transaction_proposal_from_transfer_details (
1064
- tx_proposal , rerandomized_outputs, transfers, acc_keys);
1066
+ tx_proposal_sorted_ins , rerandomized_outputs, transfers, acc_keys);
1065
1067
1066
1068
CHECK_AND_ASSERT_THROW_MES (sal_proofs.size () == sorted_input_key_images.size (),
1067
1069
__func__ << " : bad SA/L result buffer size" );
0 commit comments