aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_core
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2018-08-13 16:18:32 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2018-09-14 10:51:45 +0000
commitbe001326d1baac0b00d79d2d0a7f42662dc1be1f (patch)
tree30251dca497acdbf0a51ddfdbe4be7ab5d39e50c /src/cryptonote_core
parentMerge pull request #4178 (diff)
downloadmonero-be001326d1baac0b00d79d2d0a7f42662dc1be1f.tar.xz
remove obsolete daemon selection of fake outs and old tx construction
Diffstat (limited to 'src/cryptonote_core')
-rw-r--r--src/cryptonote_core/blockchain.cpp242
-rw-r--r--src/cryptonote_core/blockchain.h61
-rw-r--r--src/cryptonote_core/cryptonote_core.cpp10
-rw-r--r--src/cryptonote_core/cryptonote_core.h15
4 files changed, 0 insertions, 328 deletions
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp
index b20fe9869..c7e2f5a65 100644
--- a/src/cryptonote_core/blockchain.cpp
+++ b/src/cryptonote_core/blockchain.cpp
@@ -1717,17 +1717,6 @@ size_t Blockchain::get_alternative_blocks_count() const
//------------------------------------------------------------------
// This function adds the output specified by <amount, i> to the result_outs container
// unlocked and other such checks should be done by here.
-void Blockchain::add_out_to_get_random_outs(COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount& result_outs, uint64_t amount, size_t i) const
-{
- LOG_PRINT_L3("Blockchain::" << __func__);
- CRITICAL_REGION_LOCAL(m_blockchain_lock);
-
- COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::out_entry& oen = *result_outs.outs.insert(result_outs.outs.end(), COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::out_entry());
- oen.global_amount_index = i;
- output_data_t data = m_db->get_output_key(amount, i);
- oen.out_key = data.pubkey;
-}
-
uint64_t Blockchain::get_num_mature_outputs(uint64_t amount) const
{
uint64_t num_outs = m_db->get_num_outputs(amount);
@@ -1745,74 +1734,6 @@ uint64_t Blockchain::get_num_mature_outputs(uint64_t amount) const
return num_outs;
}
-std::vector<uint64_t> Blockchain::get_random_outputs(uint64_t amount, uint64_t count) const
-{
- uint64_t num_outs = get_num_mature_outputs(amount);
-
- std::vector<uint64_t> indices;
-
- std::unordered_set<uint64_t> seen_indices;
-
- // if there aren't enough outputs to mix with (or just enough),
- // use all of them. Eventually this should become impossible.
- if (num_outs <= count)
- {
- for (uint64_t i = 0; i < num_outs; i++)
- {
- // get tx_hash, tx_out_index from DB
- tx_out_index toi = m_db->get_output_tx_and_index(amount, i);
-
- // if tx is unlocked, add output to indices
- if (is_tx_spendtime_unlocked(m_db->get_tx_unlock_time(toi.first)))
- {
- indices.push_back(i);
- }
- }
- }
- else
- {
- // while we still need more mixins
- while (indices.size() < count)
- {
- // if we've gone through every possible output, we've gotten all we can
- if (seen_indices.size() == num_outs)
- {
- break;
- }
-
- // get a random output index from the DB. If we've already seen it,
- // return to the top of the loop and try again, otherwise add it to the
- // list of output indices we've seen.
-
- // triangular distribution over [a,b) with a=0, mode c=b=up_index_limit
- uint64_t r = crypto::rand<uint64_t>() % ((uint64_t)1 << 53);
- double frac = std::sqrt((double)r / ((uint64_t)1 << 53));
- uint64_t i = (uint64_t)(frac*num_outs);
- // just in case rounding up to 1 occurs after sqrt
- if (i == num_outs)
- --i;
-
- if (seen_indices.count(i))
- {
- continue;
- }
- seen_indices.emplace(i);
-
- // get tx_hash, tx_out_index from DB
- tx_out_index toi = m_db->get_output_tx_and_index(amount, i);
-
- // if the output's transaction is unlocked, add the output's index to
- // our list.
- if (is_tx_spendtime_unlocked(m_db->get_tx_unlock_time(toi.first)))
- {
- indices.push_back(i);
- }
- }
- }
-
- return indices;
-}
-
crypto::public_key Blockchain::get_output_key(uint64_t amount, uint64_t global_index) const
{
output_data_t data = m_db->get_output_key(amount, global_index);
@@ -1820,169 +1741,6 @@ crypto::public_key Blockchain::get_output_key(uint64_t amount, uint64_t global_i
}
//------------------------------------------------------------------
-// This function takes an RPC request for mixins and creates an RPC response
-// with the requested mixins.
-// TODO: figure out why this returns boolean / if we should be returning false
-// in some cases
-bool Blockchain::get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res) const
-{
- LOG_PRINT_L3("Blockchain::" << __func__);
- CRITICAL_REGION_LOCAL(m_blockchain_lock);
-
- // for each amount that we need to get mixins for, get <n> random outputs
- // from BlockchainDB where <n> is req.outs_count (number of mixins).
- for (uint64_t amount : req.amounts)
- {
- // create outs_for_amount struct and populate amount field
- COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount& result_outs = *res.outs.insert(res.outs.end(), COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount());
- result_outs.amount = amount;
-
- std::vector<uint64_t> indices = get_random_outputs(amount, req.outs_count);
-
- for (auto i : indices)
- {
- COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::out_entry& oe = *result_outs.outs.insert(result_outs.outs.end(), COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::out_entry());
-
- oe.global_amount_index = i;
- oe.out_key = get_output_key(amount, i);
- }
- }
- return true;
-}
-//------------------------------------------------------------------
-// This function adds the ringct output at index i to the list
-// unlocked and other such checks should be done by here.
-void Blockchain::add_out_to_get_rct_random_outs(std::list<COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::out_entry>& outs, uint64_t amount, size_t i) const
-{
- LOG_PRINT_L3("Blockchain::" << __func__);
- CRITICAL_REGION_LOCAL(m_blockchain_lock);
-
- COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::out_entry& oen = *outs.insert(outs.end(), COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::out_entry());
- oen.amount = amount;
- oen.global_amount_index = i;
- output_data_t data = m_db->get_output_key(amount, i);
- oen.out_key = data.pubkey;
- oen.commitment = data.commitment;
-}
-//------------------------------------------------------------------
-// This function takes an RPC request for mixins and creates an RPC response
-// with the requested mixins.
-// TODO: figure out why this returns boolean / if we should be returning false
-// in some cases
-bool Blockchain::get_random_rct_outs(const COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::request& req, COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::response& res) const
-{
- LOG_PRINT_L3("Blockchain::" << __func__);
- CRITICAL_REGION_LOCAL(m_blockchain_lock);
-
- // for each amount that we need to get mixins for, get <n> random outputs
- // from BlockchainDB where <n> is req.outs_count (number of mixins).
- auto num_outs = m_db->get_num_outputs(0);
- // ensure we don't include outputs that aren't yet eligible to be used
- // outpouts are sorted by height
- while (num_outs > 0)
- {
- const tx_out_index toi = m_db->get_output_tx_and_index(0, num_outs - 1);
- const uint64_t height = m_db->get_tx_block_height(toi.first);
- if (height + CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE <= m_db->height())
- break;
- --num_outs;
- }
-
- std::unordered_set<uint64_t> seen_indices;
-
- // if there aren't enough outputs to mix with (or just enough),
- // use all of them. Eventually this should become impossible.
- if (num_outs <= req.outs_count)
- {
- for (uint64_t i = 0; i < num_outs; i++)
- {
- // get tx_hash, tx_out_index from DB
- tx_out_index toi = m_db->get_output_tx_and_index(0, i);
-
- // if tx is unlocked, add output to result_outs
- if (is_tx_spendtime_unlocked(m_db->get_tx_unlock_time(toi.first)))
- {
- add_out_to_get_rct_random_outs(res.outs, 0, i);
- }
- }
- }
- else
- {
- // while we still need more mixins
- while (res.outs.size() < req.outs_count)
- {
- // if we've gone through every possible output, we've gotten all we can
- if (seen_indices.size() == num_outs)
- {
- break;
- }
-
- // get a random output index from the DB. If we've already seen it,
- // return to the top of the loop and try again, otherwise add it to the
- // list of output indices we've seen.
-
- // triangular distribution over [a,b) with a=0, mode c=b=up_index_limit
- uint64_t r = crypto::rand<uint64_t>() % ((uint64_t)1 << 53);
- double frac = std::sqrt((double)r / ((uint64_t)1 << 53));
- uint64_t i = (uint64_t)(frac*num_outs);
- // just in case rounding up to 1 occurs after sqrt
- if (i == num_outs)
- --i;
-
- if (seen_indices.count(i))
- {
- continue;
- }
- seen_indices.emplace(i);
-
- // get tx_hash, tx_out_index from DB
- tx_out_index toi = m_db->get_output_tx_and_index(0, i);
-
- // if the output's transaction is unlocked, add the output's index to
- // our list.
- if (is_tx_spendtime_unlocked(m_db->get_tx_unlock_time(toi.first)))
- {
- add_out_to_get_rct_random_outs(res.outs, 0, i);
- }
- }
- }
-
- if (res.outs.size() < req.outs_count)
- return false;
-#if 0
- // if we do not have enough RCT inputs, we can pick from the non RCT ones
- // which will have a zero mask
- if (res.outs.size() < req.outs_count)
- {
- LOG_PRINT_L0("Out of RCT inputs (" << res.outs.size() << "/" << req.outs_count << "), using regular ones");
-
- // TODO: arbitrary selection, needs better
- COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request req2 = AUTO_VAL_INIT(req2);
- COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response res2 = AUTO_VAL_INIT(res2);
- req2.outs_count = req.outs_count - res.outs.size();
- static const uint64_t amounts[] = {1, 10, 20, 50, 100, 200, 500, 1000, 10000};
- for (uint64_t a: amounts)
- req2.amounts.push_back(a);
- if (!get_random_outs_for_amounts(req2, res2))
- return false;
-
- // pick random ones from there
- while (res.outs.size() < req.outs_count)
- {
- int list_idx = rand() % (sizeof(amounts)/sizeof(amounts[0]));
- if (!res2.outs[list_idx].outs.empty())
- {
- const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::out_entry oe = res2.outs[list_idx].outs.back();
- res2.outs[list_idx].outs.pop_back();
- add_out_to_get_rct_random_outs(res.outs, res2.outs[list_idx].amount, oe.global_amount_index);
- }
- }
- }
-#endif
-
- return true;
-}
-//------------------------------------------------------------------
bool Blockchain::get_outs(const COMMAND_RPC_GET_OUTPUTS_BIN::request& req, COMMAND_RPC_GET_OUTPUTS_BIN::response& res) const
{
LOG_PRINT_L3("Blockchain::" << __func__);
diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h
index 7e2ba7a39..50ceccd0f 100644
--- a/src/cryptonote_core/blockchain.h
+++ b/src/cryptonote_core/blockchain.h
@@ -447,16 +447,6 @@ namespace cryptonote
uint64_t get_num_mature_outputs(uint64_t amount) const;
/**
- * @brief get random outputs (indices) for an amount
- *
- * @param amount the amount
- * @param count the number of random outputs to choose
- *
- * @return the outputs' amount-global indices
- */
- std::vector<uint64_t> get_random_outputs(uint64_t amount, uint64_t count) const;
-
- /**
* @brief get the public key for an output
*
* @param amount the output amount
@@ -467,22 +457,6 @@ namespace cryptonote
crypto::public_key get_output_key(uint64_t amount, uint64_t global_index) const;
/**
- * @brief gets random outputs to mix with
- *
- * This function takes an RPC request for outputs to mix with
- * and creates an RPC response with the resultant output indices.
- *
- * Outputs to mix with are randomly selected from the utxo set
- * for each output amount in the request.
- *
- * @param req the output amounts and number of mixins to select
- * @param res return-by-reference the resultant output indices
- *
- * @return true
- */
- bool get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res) const;
-
- /**
* @brief gets specific outputs to mix with
*
* This function takes an RPC request for outputs to mix with
@@ -509,23 +483,6 @@ namespace cryptonote
void get_output_key_mask_unlocked(const uint64_t& amount, const uint64_t& index, crypto::public_key& key, rct::key& mask, bool& unlocked) const;
/**
- * @brief gets random ringct outputs to mix with
- *
- * This function takes an RPC request for outputs to mix with
- * and creates an RPC response with the resultant output indices
- * and the matching keys.
- *
- * Outputs to mix with are randomly selected from the utxo set
- * for each output amount in the request.
- *
- * @param req the output amounts and number of mixins to select
- * @param res return-by-reference the resultant output indices
- *
- * @return true
- */
- bool get_random_rct_outs(const COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::request& req, COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::response& res) const;
-
- /**
* @brief gets per block distribution of outputs of a given amount
*
* @param amount the amount to get a ditribution for
@@ -1272,24 +1229,6 @@ namespace cryptonote
void get_last_n_blocks_weights(std::vector<size_t>& weights, size_t count) const;
/**
- * @brief adds the given output to the requested set of random outputs
- *
- * @param result_outs return-by-reference the set the output is to be added to
- * @param amount the output amount
- * @param i the output index (indexed to amount)
- */
- void add_out_to_get_random_outs(COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount& result_outs, uint64_t amount, size_t i) const;
-
- /**
- * @brief adds the given output to the requested set of random ringct outputs
- *
- * @param outs return-by-reference the set the output is to be added to
- * @param amount the output amount (0 for rct inputs)
- * @param i the rct output index
- */
- void add_out_to_get_rct_random_outs(std::list<COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::out_entry>& outs, uint64_t amount, size_t i) const;
-
- /**
* @brief checks if a transaction is unlocked (its outputs spendable)
*
* This function checks to see if a transaction is unlocked.
diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp
index c4eaa0cc4..7cbf414b7 100644
--- a/src/cryptonote_core/cryptonote_core.cpp
+++ b/src/cryptonote_core/cryptonote_core.cpp
@@ -1181,21 +1181,11 @@ namespace cryptonote
return m_blockchain_storage.find_blockchain_supplement(req_start_block, qblock_ids, blocks, total_height, start_height, pruned, get_miner_tx_hash, max_count);
}
//-----------------------------------------------------------------------------------------------
- bool core::get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res) const
- {
- return m_blockchain_storage.get_random_outs_for_amounts(req, res);
- }
- //-----------------------------------------------------------------------------------------------
bool core::get_outs(const COMMAND_RPC_GET_OUTPUTS_BIN::request& req, COMMAND_RPC_GET_OUTPUTS_BIN::response& res) const
{
return m_blockchain_storage.get_outs(req, res);
}
//-----------------------------------------------------------------------------------------------
- bool core::get_random_rct_outs(const COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::request& req, COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::response& res) const
- {
- return m_blockchain_storage.get_random_rct_outs(req, res);
- }
- //-----------------------------------------------------------------------------------------------
bool core::get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const
{
return m_blockchain_storage.get_output_distribution(amount, from_height, to_height, start_height, distribution, base);
diff --git a/src/cryptonote_core/cryptonote_core.h b/src/cryptonote_core/cryptonote_core.h
index 8b68f5e2b..b40575ae9 100644
--- a/src/cryptonote_core/cryptonote_core.h
+++ b/src/cryptonote_core/cryptonote_core.h
@@ -551,13 +551,6 @@ namespace cryptonote
difficulty_type get_block_cumulative_difficulty(uint64_t height) const;
/**
- * @copydoc Blockchain::get_random_outs_for_amounts
- *
- * @note see Blockchain::get_random_outs_for_amounts
- */
- bool get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res) const;
-
- /**
* @copydoc Blockchain::get_outs
*
* @note see Blockchain::get_outs
@@ -565,14 +558,6 @@ namespace cryptonote
bool get_outs(const COMMAND_RPC_GET_OUTPUTS_BIN::request& req, COMMAND_RPC_GET_OUTPUTS_BIN::response& res) const;
/**
- *
- * @copydoc Blockchain::get_random_rct_outs
- *
- * @note see Blockchain::get_random_rct_outs
- */
- bool get_random_rct_outs(const COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::request& req, COMMAND_RPC_GET_RANDOM_RCT_OUTPUTS::response& res) const;
-
- /**
* @copydoc Blockchain::get_output_distribution
*
* @brief get per block distribution of outputs of a given amount