wallet2: extend fake out picks away from the gamma pick

in order to unbias selection from blocks with few txes
This commit is contained in:
moneromooo-monero 2018-10-22 20:57:58 +00:00
parent 2287fb9fb4
commit 61f83316b3
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -123,6 +123,8 @@ using namespace cryptonote;
#define FIRST_REFRESH_GRANULARITY 1024 #define FIRST_REFRESH_GRANULARITY 1024
#define GAMMA_PICK_HALF_WINDOW 5
static const std::string MULTISIG_SIGNATURE_MAGIC = "SigMultisigPkV1"; static const std::string MULTISIG_SIGNATURE_MAGIC = "SigMultisigPkV1";
static const std::string MULTISIG_EXTRA_INFO_MAGIC = "MultisigxV1"; static const std::string MULTISIG_EXTRA_INFO_MAGIC = "MultisigxV1";
@ -6795,10 +6797,29 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
error::get_output_distribution, "Decreasing offsets in rct distribution: " + error::get_output_distribution, "Decreasing offsets in rct distribution: " +
std::to_string(block_offset) + ": " + std::to_string(rct_offsets[block_offset]) + ", " + std::to_string(block_offset) + ": " + std::to_string(rct_offsets[block_offset]) + ", " +
std::to_string(block_offset + 1) + ": " + std::to_string(rct_offsets[block_offset + 1])); std::to_string(block_offset + 1) + ": " + std::to_string(rct_offsets[block_offset + 1]));
uint64_t n_rct = rct_offsets[block_offset + 1] - rct_offsets[block_offset]; uint64_t first_block_offset = block_offset, last_block_offset = block_offset;
for (size_t half_window = 0; half_window < GAMMA_PICK_HALF_WINDOW; ++half_window)
{
// end when we have a non empty block
uint64_t cum0 = first_block_offset > 0 ? rct_offsets[first_block_offset] - rct_offsets[first_block_offset - 1] : rct_offsets[0];
if (cum0 > 1)
break;
uint64_t cum1 = last_block_offset > 0 ? rct_offsets[last_block_offset] - rct_offsets[last_block_offset - 1] : rct_offsets[0];
if (cum1 > 1)
break;
if (first_block_offset == 0 && last_block_offset >= rct_offsets.size() - 2)
break;
// expand up to bounds
if (first_block_offset > 0)
--first_block_offset;
if (last_block_offset < rct_offsets.size() - 1)
++last_block_offset;
}
const uint64_t n_rct = rct_offsets[last_block_offset] - (first_block_offset == 0 ? 0 : rct_offsets[first_block_offset - 1]);
if (n_rct == 0) if (n_rct == 0)
return rct_offsets[block_offset] ? rct_offsets[block_offset] - 1 : 0; return rct_offsets[block_offset] ? rct_offsets[block_offset] - 1 : 0;
return rct_offsets[block_offset] + crypto::rand<uint64_t>() % n_rct; MDEBUG("Picking 1/" << n_rct << " in " << (last_block_offset - first_block_offset + 1) << " blocks centered around " << block_offset);
return rct_offsets[first_block_offset] + crypto::rand<uint64_t>() % n_rct;
}; };
size_t num_selected_transfers = 0; size_t num_selected_transfers = 0;