1
0
Fork 0
forked from lthn/blockchain

fixed conditions for deffered outs fetch

This commit is contained in:
cryptozoidberg 2020-06-14 02:17:10 +02:00
parent 0f98b6d990
commit a4cb3e6a32
No known key found for this signature in database
GPG key ID: 22DEB97A54C6FDEC
3 changed files with 36 additions and 42 deletions

View file

@ -35,7 +35,24 @@ using namespace currency;
ENABLE_CHANNEL_BY_DEFAULT("wallet")
namespace tools
{
wallet2::wallet2() : m_stop(false),
m_wcallback(new i_wallet2_callback()), //stub
m_core_proxy(new default_http_core_proxy()),
m_upper_transaction_size_limit(0),
m_height_of_start_sync(0),
m_last_sync_percent(0),
m_fake_outputs_count(0),
m_do_rise_transfer(false),
m_log_prefix("???"),
m_watch_only(false),
m_last_pow_block_h(0),
m_minimum_height(WALLET_MINIMUM_HEIGHT_UNSET_CONST),
m_pos_mint_packing_size(WALLET_DEFAULT_POS_MINT_PACKING_SIZE),
m_current_wallet_file_size(0),
m_use_deffered_global_outputs(false)
{
m_core_runtime_config = currency::get_default_core_runtime_config();
}
//---------------------------------------------------------------
uint64_t wallet2::get_max_unlock_time_from_receive_indices(const currency::transaction& tx, const money_transfer2_details& td)
{
@ -415,9 +432,13 @@ void wallet2::process_new_transaction(const currency::transaction& tx, uint64_t
}
std::vector<uint64_t> outputs_index_local;
if (!pglobal_indexes)
if (!pglobal_indexes || (pglobal_indexes->size() == 0 && tx.vout.size() != 0))
{
if (!m_use_deffered_global_outputs)
if (m_use_deffered_global_outputs)
{
pglobal_indexes = nullptr;
}
else
{
fetch_tx_global_indixes(tx, outputs_index_local);
pglobal_indexes = &outputs_index_local;
@ -501,6 +522,7 @@ void wallet2::process_new_transaction(const currency::transaction& tx, uint64_t
td.m_ptx_wallet_info = pwallet_info;
td.m_internal_output_index = o;
td.m_key_image = ki;
LOG_PRINT_L0("pglobal_indexes = " << pglobal_indexes);
if (m_use_deffered_global_outputs)
{
if (pglobal_indexes && pglobal_indexes->size() > o)
@ -511,6 +533,7 @@ void wallet2::process_new_transaction(const currency::transaction& tx, uint64_t
else
{
WLT_THROW_IF_FALSE_WALLET_INT_ERR_EX(pglobal_indexes, "pglobal_indexes IS NULL in non mobile wallet");
WLT_THROW_IF_FALSE_WALLET_INT_ERR_EX(pglobal_indexes->size() > o, "pglobal_indexes size()(" << pglobal_indexes->size() << ") <= o " << o );
td.m_global_output_index = (*pglobal_indexes)[o];
}
if (coin_base_tx)
@ -4768,9 +4791,9 @@ void wallet2::sweep_below(size_t fake_outs_count, const currency::account_public
amount_total = 0;
outs_swept = 0;
std::vector<size_t> selected_transfers;
std::vector<uint64_t> selected_transfers;
selected_transfers.reserve(m_transfers.size());
for (size_t i = 0; i < m_transfers.size(); ++i)
for (uint64_t i = 0; i < m_transfers.size(); ++i)
{
const transfer_details& td = m_transfers[i];
uint64_t amount = td.amount();
@ -4786,15 +4809,13 @@ void wallet2::sweep_below(size_t fake_outs_count, const currency::account_public
WLT_THROW_IF_FALSE_WALLET_CMN_ERR_EX(!selected_transfers.empty(), "No spendable outputs meet the criterion");
// sort by amount descending in order to spend bigger outputs first
std::sort(selected_transfers.begin(), selected_transfers.end(), [this](size_t a, size_t b) { return m_transfers[b].amount() < m_transfers[a].amount(); });
std::sort(selected_transfers.begin(), selected_transfers.end(), [this](uint64_t a, uint64_t b) { return m_transfers[b].amount() < m_transfers[a].amount(); });
// limit RPC request with reasonable number of sources
if (selected_transfers.size() > tx_sources_for_querying_random_outs_max)
selected_transfers.erase(selected_transfers.begin() + tx_sources_for_querying_random_outs_max, selected_transfers.end());
//
// TODO: prefetch gindexes here for each element of selected_transfers
//
prefetch_global_indicies_if_needed(selected_transfers);
typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::out_entry out_entry;
typedef currency::tx_source_entry::output_entry tx_output_entry;
@ -4805,7 +4826,7 @@ void wallet2::sweep_below(size_t fake_outs_count, const currency::account_public
COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request req = AUTO_VAL_INIT(req);
req.use_forced_mix_outs = false;
req.outs_count = fake_outs_count + 1;
for (size_t i : selected_transfers)
for (uint64_t i : selected_transfers)
req.amounts.push_back(m_transfers[i].amount());
r = m_core_proxy->call_COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS(req, rpc_get_random_outs_resp);
@ -4858,7 +4879,7 @@ void wallet2::sweep_below(size_t fake_outs_count, const currency::account_public
for (size_t st_index = 0; st_index < st_index_upper_boundary; ++st_index)
{
currency::tx_source_entry& src = ftp.sources[st_index];
size_t tr_index = selected_transfers[st_index];
uint64_t tr_index = selected_transfers[st_index];
transfer_details& td = m_transfers[tr_index];
src.transfer_index = tr_index;
src.amount = td.amount();

View file

@ -324,37 +324,9 @@ namespace tools
class wallet2
{
wallet2(const wallet2&) : m_stop(false),
m_wcallback(new i_wallet2_callback()),
m_height_of_start_sync(0),
m_last_sync_percent(0),
m_do_rise_transfer(false),
m_watch_only(false),
m_last_pow_block_h(0),
m_minimum_height(WALLET_MINIMUM_HEIGHT_UNSET_CONST),
m_pos_mint_packing_size(WALLET_DEFAULT_POS_MINT_PACKING_SIZE),
m_current_wallet_file_size(0),
m_use_deffered_global_outputs(false)
{};
wallet2(const wallet2&) = delete;
public:
wallet2() : m_stop(false),
m_wcallback(new i_wallet2_callback()), //stub
m_core_proxy(new default_http_core_proxy()),
m_upper_transaction_size_limit(0),
m_height_of_start_sync(0),
m_last_sync_percent(0),
m_fake_outputs_count(0),
m_do_rise_transfer(false),
m_log_prefix("???"),
m_watch_only(false),
m_last_pow_block_h(0),
m_minimum_height(WALLET_MINIMUM_HEIGHT_UNSET_CONST),
m_pos_mint_packing_size(WALLET_DEFAULT_POS_MINT_PACKING_SIZE),
m_current_wallet_file_size(0)
{
m_core_runtime_config = currency::get_default_core_runtime_config();
};
wallet2();
static std::string transfer_flags_to_str(uint32_t flags);
static std::string transform_tx_to_str(const currency::transaction& tx);

View file

@ -104,6 +104,8 @@ bool wallet_test_core_proxy::call_COMMAND_RPC_GET_BLOCKS_DIRECT(const currency::
{
currency::COMMAND_RPC_GET_BLOCKS_FAST::request req = AUTO_VAL_INIT(req);
req.block_ids = rqt.block_ids;
req.minimum_height = rqt.minimum_height;
req.need_global_indexes = rqt.need_global_indexes;
currency::COMMAND_RPC_GET_BLOCKS_FAST::response res = AUTO_VAL_INIT(res);
bool r = this->call_COMMAND_RPC_GET_BLOCKS_FAST(req, res);
rsp.status = res.status;
@ -114,7 +116,6 @@ bool wallet_test_core_proxy::call_COMMAND_RPC_GET_BLOCKS_DIRECT(const currency::
r = unserialize_block_complete_entry(res, rsp);
}
return r;
}
bool wallet_test_core_proxy::call_COMMAND_RPC_GET_EST_HEIGHT_FROM_DATE(const currency::COMMAND_RPC_GET_EST_HEIGHT_FROM_DATE::request& rqt, currency::COMMAND_RPC_GET_EST_HEIGHT_FROM_DATE::response& rsp)