Electroneum
tools::gamma_picker Class Reference

#include <wallet2.h>

Public Member Functions

uint64_t pick ()
 
 gamma_picker (const std::vector< uint64_t > &rct_offsets)
 
 gamma_picker (const std::vector< uint64_t > &rct_offsets, double shape, double scale)
 

Detailed Description

Definition at line 87 of file wallet2.h.

Constructor & Destructor Documentation

◆ gamma_picker() [1/2]

tools::gamma_picker::gamma_picker ( const std::vector< uint64_t > &  rct_offsets)

Definition at line 1010 of file wallet2.cpp.

1010 : gamma_picker(rct_offsets, GAMMA_SHAPE, GAMMA_SCALE) {}
gamma_picker(const std::vector< uint64_t > &rct_offsets)
Definition: wallet2.cpp:1010
#define GAMMA_SCALE
Definition: wallet2.cpp:134
#define GAMMA_SHAPE
Definition: wallet2.cpp:133

◆ gamma_picker() [2/2]

tools::gamma_picker::gamma_picker ( const std::vector< uint64_t > &  rct_offsets,
double  shape,
double  scale 
)

Definition at line 995 of file wallet2.cpp.

995  :
996  rct_offsets(rct_offsets)
997 {
998  gamma = std::gamma_distribution<double>(shape, scale);
999  THROW_WALLET_EXCEPTION_IF(rct_offsets.size() <= ETN_DEFAULT_TX_SPENDABLE_AGE_V8, error::wallet_internal_error, "Bad offset calculation");
1000  const size_t blocks_in_a_year = 86400 * 365 / DIFFICULTY_TARGET_V6;
1001  const size_t blocks_to_consider = std::min<size_t>(rct_offsets.size(), blocks_in_a_year);
1002  const size_t outputs_to_consider = rct_offsets.back() - (blocks_to_consider < rct_offsets.size() ? rct_offsets[rct_offsets.size() - blocks_to_consider - 1] : 0);
1003  begin = rct_offsets.data();
1004  end = rct_offsets.data() + rct_offsets.size() - ETN_DEFAULT_TX_SPENDABLE_AGE_V8;
1005  num_rct_outputs = *(end - 1);
1006  THROW_WALLET_EXCEPTION_IF(num_rct_outputs == 0, error::wallet_internal_error, "No rct outputs");
1007  average_output_time = DIFFICULTY_TARGET_V6 * blocks_to_consider / outputs_to_consider; // this assumes constant target over the whole rct range
1008 };
#define ETN_DEFAULT_TX_SPENDABLE_AGE_V8
#define DIFFICULTY_TARGET_V6
#define THROW_WALLET_EXCEPTION_IF(cond, err_type,...)

Member Function Documentation

◆ pick()

uint64_t tools::gamma_picker::pick ( )

Definition at line 1012 of file wallet2.cpp.

1013 {
1014  double x = gamma(engine);
1015  x = exp(x);
1016  uint64_t output_index = x / average_output_time;
1017  if (output_index >= num_rct_outputs)
1018  return std::numeric_limits<uint64_t>::max(); // bad pick
1019  output_index = num_rct_outputs - 1 - output_index;
1020 
1021  const uint64_t *it = std::lower_bound(begin, end, output_index);
1022  THROW_WALLET_EXCEPTION_IF(it == end, error::wallet_internal_error, "output_index not found");
1023  uint64_t index = std::distance(begin, it);
1024 
1025  const uint64_t first_rct = index == 0 ? 0 : rct_offsets[index - 1];
1026  const uint64_t n_rct = rct_offsets[index] - first_rct;
1027  if (n_rct == 0)
1028  return std::numeric_limits<uint64_t>::max(); // bad pick
1029  MTRACE("Picking 1/" << n_rct << " in block " << index);
1030  return first_rct + crypto::rand_idx(n_rct);
1031 };
#define MTRACE(x)
Definition: misc_log_ex.h:77
std::enable_if< std::is_unsigned< T >::value, T >::type rand_idx(T sz)
Definition: crypto.h:242
unsigned __int64 uint64_t
Definition: stdint.h:136
Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following files: