forked from lthn/blockchain
wallet: Zarcanum PoS (work in progress, scan_pos refactoring)
This commit is contained in:
parent
6b85159119
commit
bc88d0d642
4 changed files with 77 additions and 46 deletions
|
|
@ -1138,7 +1138,6 @@ namespace currency
|
||||||
uint64_t starter_timestamp;
|
uint64_t starter_timestamp;
|
||||||
crypto::hash last_block_hash;
|
crypto::hash last_block_hash;
|
||||||
bool is_pos_allowed;
|
bool is_pos_allowed;
|
||||||
uint64_t iterations_processed;
|
|
||||||
|
|
||||||
BEGIN_KV_SERIALIZE_MAP()
|
BEGIN_KV_SERIALIZE_MAP()
|
||||||
KV_SERIALIZE(status)
|
KV_SERIALIZE(status)
|
||||||
|
|
@ -1146,7 +1145,6 @@ namespace currency
|
||||||
KV_SERIALIZE(block_timestamp)
|
KV_SERIALIZE(block_timestamp)
|
||||||
KV_SERIALIZE(height)
|
KV_SERIALIZE(height)
|
||||||
KV_SERIALIZE(is_pos_allowed)
|
KV_SERIALIZE(is_pos_allowed)
|
||||||
KV_SERIALIZE(iterations_processed)
|
|
||||||
KV_SERIALIZE(starter_timestamp)
|
KV_SERIALIZE(starter_timestamp)
|
||||||
KV_SERIALIZE_VAL_POD_AS_BLOB(last_block_hash);
|
KV_SERIALIZE_VAL_POD_AS_BLOB(last_block_hash);
|
||||||
END_KV_SERIALIZE_MAP()
|
END_KV_SERIALIZE_MAP()
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ using namespace epee;
|
||||||
|
|
||||||
#include "storages/levin_abstract_invoke2.h"
|
#include "storages/levin_abstract_invoke2.h"
|
||||||
#include "common/variant_helper.h"
|
#include "common/variant_helper.h"
|
||||||
|
#include "currency_core/crypto_config.h"
|
||||||
|
|
||||||
using namespace currency;
|
using namespace currency;
|
||||||
|
|
||||||
|
|
@ -3635,10 +3636,18 @@ bool wallet2::fill_mining_context(mining_context& ctx)
|
||||||
return false;
|
return false;
|
||||||
ctx.basic_diff.assign(pos_details_resp.pos_basic_difficulty);
|
ctx.basic_diff.assign(pos_details_resp.pos_basic_difficulty);
|
||||||
ctx.sm = pos_details_resp.sm;
|
ctx.sm = pos_details_resp.sm;
|
||||||
|
|
||||||
|
if (get_core_runtime_config().hard_forks.is_hardfork_active_for_height(4, get_top_block_height() + 1))
|
||||||
|
{
|
||||||
|
// Zarcanum (PoS with hidden amounts)
|
||||||
|
ctx.zarcanum = true;
|
||||||
|
ctx.last_pow_block_id_hashed = crypto::hash_helper_t::hs(CRYPTO_HDS_ZARCANUM_LAST_POW_HASH, ctx.sm.last_pow_id);
|
||||||
|
}
|
||||||
|
|
||||||
ctx.rsp.last_block_hash = pos_details_resp.last_block_hash;
|
ctx.rsp.last_block_hash = pos_details_resp.last_block_hash;
|
||||||
ctx.rsp.status = API_RETURN_CODE_OK;
|
|
||||||
ctx.rsp.is_pos_allowed = pos_details_resp.pos_mining_allowed;
|
ctx.rsp.is_pos_allowed = pos_details_resp.pos_mining_allowed;
|
||||||
ctx.rsp.starter_timestamp = pos_details_resp.starter_timestamp;
|
ctx.rsp.starter_timestamp = pos_details_resp.starter_timestamp;
|
||||||
|
ctx.rsp.status = API_RETURN_CODE_OK;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
@ -3679,10 +3688,64 @@ bool wallet2::try_mint_pos(const currency::account_public_address& miner_address
|
||||||
build_minted_block(ctx.sp, ctx.rsp, miner_address);
|
build_minted_block(ctx.sp, ctx.rsp, miner_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
WLT_LOG_L0("PoS mining: " << ctx.rsp.iterations_processed << " iterations finished, status: " << ctx.rsp.status << ", used " << ctx.sp.pos_entries.size() << " entries with total amount: " << print_money_brief(pos_entries_amount));
|
WLT_LOG_L0("PoS mining: " << ctx.iterations_processed << " iterations finished, status: " << ctx.rsp.status << ", used " << ctx.sp.pos_entries.size() << " entries with total amount: " << print_money_brief(pos_entries_amount));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
void wallet2::do_pos_mining_prepare_entry(mining_context& cxt, size_t pos_entry_index)
|
||||||
|
{
|
||||||
|
if (cxt.zarcanum)
|
||||||
|
{
|
||||||
|
//uint64_t pos_entry_wallet_index = cxt.sp.pos_entries[pos_entry_index].wallet_index;
|
||||||
|
//CHECK_AND_ASSERT_MES_NO_RET(pos_entry_wallet_index < m_transfers.size(), "invalid pos_entry_wallet_index = " << pos_entry_wallet_index << ", m_transfers: " << m_transfers.size());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
bool wallet2::do_pos_mining_iteration(mining_context& cxt, size_t pos_entry_index, uint64_t ts)
|
||||||
|
{
|
||||||
|
currency::stake_kernel sk = AUTO_VAL_INIT(sk);
|
||||||
|
build_kernel(cxt.sp.pos_entries[pos_entry_index], cxt.sm, ts, sk);
|
||||||
|
|
||||||
|
crypto::hash kernel_hash;
|
||||||
|
{
|
||||||
|
PROFILE_FUNC("calc_hash");
|
||||||
|
kernel_hash = crypto::cn_fast_hash(&sk, sizeof(sk));
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t stake_amount = cxt.sp.pos_entries[pos_entry_index].amount;
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
if (cxt.zarcanum)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// old PoS with non-hidden amounts
|
||||||
|
currency::wide_difficulty_type final_diff = cxt.basic_diff / stake_amount;
|
||||||
|
{
|
||||||
|
PROFILE_FUNC("check_hash");
|
||||||
|
found = currency::check_hash(kernel_hash, final_diff);
|
||||||
|
++cxt.iterations_processed;
|
||||||
|
}
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
cxt.rsp.index = pos_entry_index;
|
||||||
|
cxt.rsp.block_timestamp = ts;
|
||||||
|
|
||||||
|
LOG_PRINT_GREEN("Found kernel: amount: " << currency::print_money_brief(stake_amount) << ENDL
|
||||||
|
<< "difficulty: " << cxt.basic_diff << ", final_diff: " << final_diff << ENDL
|
||||||
|
<< "index: " << cxt.sp.pos_entries[pos_entry_index].index << ENDL
|
||||||
|
<< "kernel info: " << ENDL
|
||||||
|
<< print_stake_kernel_info(sk) << ENDL
|
||||||
|
<< "kernel_hash(proof): " << kernel_hash,
|
||||||
|
LOG_LEVEL_0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
//-------------------------------
|
//-------------------------------
|
||||||
bool wallet2::reset_history()
|
bool wallet2::reset_history()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -449,6 +449,11 @@ namespace tools
|
||||||
currency::COMMAND_RPC_SCAN_POS::response rsp;
|
currency::COMMAND_RPC_SCAN_POS::response rsp;
|
||||||
currency::wide_difficulty_type basic_diff;
|
currency::wide_difficulty_type basic_diff;
|
||||||
currency::stake_modifier_type sm;
|
currency::stake_modifier_type sm;
|
||||||
|
|
||||||
|
bool zarcanum;
|
||||||
|
crypto::scalar_t last_pow_block_id_hashed; // Zarcanum notation: f'
|
||||||
|
|
||||||
|
uint64_t iterations_processed;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct expiration_entry_info
|
struct expiration_entry_info
|
||||||
|
|
@ -687,7 +692,8 @@ namespace tools
|
||||||
bool check_connection();
|
bool check_connection();
|
||||||
|
|
||||||
// PoS mining
|
// PoS mining
|
||||||
static bool do_pos_mining_iteration(mining_context& cxt, uint64_t ts, size_t pos_entry_index);
|
static void do_pos_mining_prepare_entry(mining_context& cxt, size_t pos_entry_index);
|
||||||
|
static bool do_pos_mining_iteration(mining_context& cxt, size_t pos_entry_index, uint64_t ts);
|
||||||
template<typename idle_condition_cb_t> //do refresh as external callback
|
template<typename idle_condition_cb_t> //do refresh as external callback
|
||||||
static bool scan_pos(mining_context& cxt, std::atomic<bool>& stop, idle_condition_cb_t idle_condition_cb, const currency::core_runtime_config &runtime_config);
|
static bool scan_pos(mining_context& cxt, std::atomic<bool>& stop, idle_condition_cb_t idle_condition_cb, const currency::core_runtime_config &runtime_config);
|
||||||
bool fill_mining_context(mining_context& ctx);
|
bool fill_mining_context(mining_context& ctx);
|
||||||
|
|
@ -1294,41 +1300,6 @@ namespace tools
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool wallet2::do_pos_mining_iteration(mining_context& cxt, uint64_t ts, size_t pos_entry_index)
|
|
||||||
{
|
|
||||||
currency::stake_kernel sk = AUTO_VAL_INIT(sk);
|
|
||||||
build_kernel(cxt.sp.pos_entries[pos_entry_index], cxt.sm, ts, sk);
|
|
||||||
|
|
||||||
crypto::hash kernel_hash;
|
|
||||||
{
|
|
||||||
PROFILE_FUNC("calc_hash");
|
|
||||||
kernel_hash = crypto::cn_fast_hash(&sk, sizeof(sk));
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint64_t stake_amount = cxt.sp.pos_entries[pos_entry_index].amount;
|
|
||||||
currency::wide_difficulty_type final_diff = cxt.basic_diff / stake_amount;
|
|
||||||
|
|
||||||
bool check_hash_res = false;
|
|
||||||
{
|
|
||||||
PROFILE_FUNC("check_hash");
|
|
||||||
check_hash_res = currency::check_hash(kernel_hash, final_diff);
|
|
||||||
++cxt.rsp.iterations_processed;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (check_hash_res)
|
|
||||||
{
|
|
||||||
LOG_PRINT_GREEN("Found kernel: amount: " << currency::print_money_brief(stake_amount) << ENDL
|
|
||||||
<< "difficulty: " << cxt.basic_diff << ", final_diff: " << final_diff << ENDL
|
|
||||||
<< "index: " << cxt.sp.pos_entries[pos_entry_index].index << ENDL
|
|
||||||
<< "kernel info: " << ENDL
|
|
||||||
<< print_stake_kernel_info(sk) << ENDL
|
|
||||||
<< "kernel_hash(proof): " << kernel_hash,
|
|
||||||
LOG_LEVEL_0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return check_hash_res;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename idle_condition_cb_t> //do refresh as external callback
|
template<typename idle_condition_cb_t> //do refresh as external callback
|
||||||
bool wallet2::scan_pos(mining_context& cxt,
|
bool wallet2::scan_pos(mining_context& cxt,
|
||||||
std::atomic<bool>& stop,
|
std::atomic<bool>& stop,
|
||||||
|
|
@ -1337,7 +1308,7 @@ namespace tools
|
||||||
{
|
{
|
||||||
cxt.rsp.status = API_RETURN_CODE_NOT_FOUND;
|
cxt.rsp.status = API_RETURN_CODE_NOT_FOUND;
|
||||||
uint64_t timstamp_last_idle_call = runtime_config.get_core_time();
|
uint64_t timstamp_last_idle_call = runtime_config.get_core_time();
|
||||||
cxt.rsp.iterations_processed = 0;
|
cxt.iterations_processed = 0;
|
||||||
|
|
||||||
uint64_t ts_from = cxt.rsp.starter_timestamp; // median ts of last BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW blocks
|
uint64_t ts_from = cxt.rsp.starter_timestamp; // median ts of last BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW blocks
|
||||||
ts_from = ts_from - (ts_from % POS_SCAN_STEP) + POS_SCAN_STEP;
|
ts_from = ts_from - (ts_from % POS_SCAN_STEP) + POS_SCAN_STEP;
|
||||||
|
|
@ -1369,6 +1340,8 @@ namespace tools
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
do_pos_mining_prepare_entry(cxt, i);
|
||||||
|
|
||||||
while(step <= ts_window)
|
while(step <= ts_window)
|
||||||
{
|
{
|
||||||
//check every WALLET_POS_MINT_CHECK_HEIGHT_INTERVAL seconds wheither top block changed, if so - break the loop
|
//check every WALLET_POS_MINT_CHECK_HEIGHT_INTERVAL seconds wheither top block changed, if so - break the loop
|
||||||
|
|
@ -1394,11 +1367,8 @@ namespace tools
|
||||||
if (stop)
|
if (stop)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (do_pos_mining_iteration(cxt, ts, i))
|
if (do_pos_mining_iteration(cxt, i, ts))
|
||||||
{
|
{
|
||||||
//found kernel
|
|
||||||
cxt.rsp.index = i;
|
|
||||||
cxt.rsp.block_timestamp = ts;
|
|
||||||
cxt.rsp.status = API_RETURN_CODE_OK;
|
cxt.rsp.status = API_RETURN_CODE_OK;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2005,7 +2005,7 @@ void wallets_manager::wallet_vs_options::worker_func()
|
||||||
{
|
{
|
||||||
w->get()->build_minted_block(ctx.sp, ctx.rsp);
|
w->get()->build_minted_block(ctx.sp, ctx.rsp);
|
||||||
}
|
}
|
||||||
LOG_PRINT_L1(get_log_prefix() << " PoS mining iteration finished, status: " << ctx.rsp.status << ", used " << ctx.sp.pos_entries.size() << " entries with total amount: " << currency::print_money_brief(pos_entries_amount) << ", processed: " << ctx.rsp.iterations_processed << " iter.");
|
LOG_PRINT_L1(get_log_prefix() << " PoS mining iteration finished, status: " << ctx.rsp.status << ", used " << ctx.sp.pos_entries.size() << " entries with total amount: " << currency::print_money_brief(pos_entries_amount) << ", processed: " << ctx.iterations_processed << " iter.");
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue