Moving work_difficulty free function on to work_thresholds class.
This commit is contained in:
		
					parent
					
						
							
								3d71605cfd
							
						
					
				
			
			
				commit
				
					
						243a4d93dd
					
				
			
		
					 19 changed files with 63 additions and 61 deletions
				
			
		| 
						 | 
				
			
			@ -312,7 +312,7 @@ TEST (block, publish_req_serialization)
 | 
			
		|||
TEST (block, difficulty)
 | 
			
		||||
{
 | 
			
		||||
	nano::send_block block (0, 1, 2, nano::keypair ().prv, 4, 5);
 | 
			
		||||
	ASSERT_EQ (block.difficulty (), nano::work_difficulty (block.work_version (), block.root (), block.block_work ()));
 | 
			
		||||
	ASSERT_EQ (block.difficulty (), nano::dev::network_params.network.publish_thresholds.difficulty (block.work_version (), block.root (), block.block_work ()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST (state_block, serialization)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ TEST (distributed_work, no_peers)
 | 
			
		|||
	};
 | 
			
		||||
	ASSERT_FALSE (node->distributed_work.make (nano::work_version::work_1, hash, node->config.work_peers, node->network_params.network.publish_thresholds.base, callback, nano::account ()));
 | 
			
		||||
	ASSERT_TIMELY (5s, done);
 | 
			
		||||
	ASSERT_GE (nano::work_difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	ASSERT_GE (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	// should only be removed after cleanup
 | 
			
		||||
	ASSERT_EQ (1, node->distributed_work.size ());
 | 
			
		||||
	while (node->distributed_work.size () > 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +138,7 @@ TEST (distributed_work, peer)
 | 
			
		|||
	peers.emplace_back ("::ffff:127.0.0.1", work_peer->port ());
 | 
			
		||||
	ASSERT_FALSE (node->distributed_work.make (nano::work_version::work_1, hash, peers, node->network_params.network.publish_thresholds.base, callback, nano::account ()));
 | 
			
		||||
	ASSERT_TIMELY (5s, done);
 | 
			
		||||
	ASSERT_GE (nano::work_difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	ASSERT_GE (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	ASSERT_EQ (1, work_peer->generations_good);
 | 
			
		||||
	ASSERT_EQ (0, work_peer->generations_bad);
 | 
			
		||||
	ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +164,7 @@ TEST (distributed_work, peer_malicious)
 | 
			
		|||
	peers.emplace_back ("::ffff:127.0.0.1", malicious_peer->port ());
 | 
			
		||||
	ASSERT_FALSE (node->distributed_work.make (nano::work_version::work_1, hash, peers, node->network_params.network.publish_thresholds.base, callback, nano::account ()));
 | 
			
		||||
	ASSERT_TIMELY (5s, done);
 | 
			
		||||
	ASSERT_GE (nano::work_difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	ASSERT_GE (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	ASSERT_TIMELY (5s, malicious_peer->generations_bad >= 1);
 | 
			
		||||
	// make sure it was *not* the malicious peer that replied
 | 
			
		||||
	ASSERT_EQ (0, malicious_peer->generations_good);
 | 
			
		||||
| 
						 | 
				
			
			@ -210,7 +210,7 @@ TEST (distributed_work, peer_multi)
 | 
			
		|||
	peers.emplace_back ("localhost", good_peer->port ());
 | 
			
		||||
	ASSERT_FALSE (node->distributed_work.make (nano::work_version::work_1, hash, peers, node->network_params.network.publish_thresholds.base, callback, nano::account ()));
 | 
			
		||||
	ASSERT_TIMELY (5s, done);
 | 
			
		||||
	ASSERT_GE (nano::work_difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	ASSERT_GE (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	ASSERT_TIMELY (5s, slow_peer->cancels == 1);
 | 
			
		||||
	ASSERT_EQ (0, malicious_peer->generations_good);
 | 
			
		||||
	ASSERT_EQ (1, malicious_peer->generations_bad);
 | 
			
		||||
| 
						 | 
				
			
			@ -241,5 +241,5 @@ TEST (distributed_work, fail_resolve)
 | 
			
		|||
	peers.emplace_back ("beeb.boop.123z", 0);
 | 
			
		||||
	ASSERT_FALSE (node->distributed_work.make (nano::work_version::work_1, hash, peers, node->network_params.network.publish_thresholds.base, callback, nano::account ()));
 | 
			
		||||
	ASSERT_TIMELY (5s, done);
 | 
			
		||||
	ASSERT_GE (nano::work_difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
	ASSERT_GE (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, *work), node->network_params.network.publish_thresholds.base);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -146,7 +146,8 @@ private:
 | 
			
		|||
			auto this_l (shared_from_this ());
 | 
			
		||||
			work_pool.generate (version, hash, request_difficulty, [this_l, hash] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
				auto result = work_a.value_or (0);
 | 
			
		||||
				auto result_difficulty (nano::work_difficulty (this_l->version, hash, result));
 | 
			
		||||
				static nano::network_constants constants;
 | 
			
		||||
				auto result_difficulty (constants.publish_thresholds.difficulty (this_l->version, hash, result));
 | 
			
		||||
				ptree::ptree message_l;
 | 
			
		||||
				message_l.put ("work", nano::to_string_hex (result));
 | 
			
		||||
				message_l.put ("difficulty", nano::to_string_hex (result_difficulty));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ TEST (node, work_generate)
 | 
			
		|||
		auto difficulty = nano::difficulty::from_multiplier (1.5, node.network_params.network.publish_thresholds.base);
 | 
			
		||||
		auto work = node.work_generate_blocking (version, root, difficulty);
 | 
			
		||||
		ASSERT_TRUE (work.is_initialized ());
 | 
			
		||||
		ASSERT_TRUE (nano::work_difficulty (version, root, *work) >= difficulty);
 | 
			
		||||
		ASSERT_TRUE (nano::dev::network_params.network.publish_thresholds.difficulty (version, root, *work) >= difficulty);
 | 
			
		||||
	}
 | 
			
		||||
	{
 | 
			
		||||
		auto difficulty = nano::difficulty::from_multiplier (0.5, node.network_params.network.publish_thresholds.base);
 | 
			
		||||
| 
						 | 
				
			
			@ -47,10 +47,10 @@ TEST (node, work_generate)
 | 
			
		|||
		do
 | 
			
		||||
		{
 | 
			
		||||
			work = node.work_generate_blocking (version, root, difficulty);
 | 
			
		||||
		} while (nano::work_difficulty (version, root, *work) >= node.network_params.network.publish_thresholds.base);
 | 
			
		||||
		} while (nano::dev::network_params.network.publish_thresholds.difficulty (version, root, *work) >= node.network_params.network.publish_thresholds.base);
 | 
			
		||||
		ASSERT_TRUE (work.is_initialized ());
 | 
			
		||||
		ASSERT_TRUE (nano::work_difficulty (version, root, *work) >= difficulty);
 | 
			
		||||
		ASSERT_FALSE (nano::work_difficulty (version, root, *work) >= node.network_params.network.publish_thresholds.base);
 | 
			
		||||
		ASSERT_TRUE (nano::dev::network_params.network.publish_thresholds.difficulty (version, root, *work) >= difficulty);
 | 
			
		||||
		ASSERT_FALSE (nano::dev::network_params.network.publish_thresholds.difficulty (version, root, *work) >= node.network_params.network.publish_thresholds.base);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ TEST (system, work_generate_limited)
 | 
			
		|||
	for (int i = 0; i < 5; ++i)
 | 
			
		||||
	{
 | 
			
		||||
		auto work = system.work_generate_limited (key, min, max);
 | 
			
		||||
		auto difficulty = nano::work_difficulty (nano::work_version::work_1, key, work);
 | 
			
		||||
		auto difficulty = nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, key, work);
 | 
			
		||||
		ASSERT_GE (difficulty, min);
 | 
			
		||||
		ASSERT_LT (difficulty, max);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -645,7 +645,7 @@ TEST (wallet, work)
 | 
			
		|||
		uint64_t work (0);
 | 
			
		||||
		if (!wallet->store.work_get (transaction, nano::dev::genesis_key.pub, work))
 | 
			
		||||
		{
 | 
			
		||||
			done = nano::work_difficulty (nano::dev::genesis->work_version (), nano::dev::genesis->hash (), work) >= system.nodes[0]->default_difficulty (nano::dev::genesis->work_version ());
 | 
			
		||||
			done = nano::dev::network_params.network.publish_thresholds.difficulty (nano::dev::genesis->work_version (), nano::dev::genesis->hash (), work) >= system.nodes[0]->default_difficulty (nano::dev::genesis->work_version ());
 | 
			
		||||
		}
 | 
			
		||||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -675,7 +675,7 @@ TEST (wallet, work_generate)
 | 
			
		|||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
		auto block_transaction (node1.store.tx_begin_read ());
 | 
			
		||||
		auto transaction (system.wallet (0)->wallets.tx_begin_read ());
 | 
			
		||||
		again = wallet->store.work_get (transaction, account1, work1) || nano::work_difficulty (block->work_version (), node1.ledger.latest_root (block_transaction, account1), work1) < node1.default_difficulty (block->work_version ());
 | 
			
		||||
		again = wallet->store.work_get (transaction, account1, work1) || nano::dev::network_params.network.publish_thresholds.difficulty (block->work_version (), node1.ledger.latest_root (block_transaction, account1), work1) < node1.default_difficulty (block->work_version ());
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -705,10 +705,10 @@ TEST (wallet, work_cache_delayed)
 | 
			
		|||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
		if (!wallet->store.work_get (node1.wallets.tx_begin_read (), account1, work1))
 | 
			
		||||
		{
 | 
			
		||||
			again = nano::work_difficulty (nano::work_version::work_1, block2->hash (), work1) < threshold;
 | 
			
		||||
			again = nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, block2->hash (), work1) < threshold;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	ASSERT_GE (nano::work_difficulty (nano::work_version::work_1, block2->hash (), work1), threshold);
 | 
			
		||||
	ASSERT_GE (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, block2->hash (), work1), threshold);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST (wallet, insert_locked)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ TEST (work, opencl)
 | 
			
		|||
			{
 | 
			
		||||
				nano::random_pool::generate_block (root.bytes.data (), root.bytes.size ());
 | 
			
		||||
				auto result (*pool.generate (nano::work_version::work_1, root, difficulty));
 | 
			
		||||
				ASSERT_GE (nano::work_difficulty (nano::work_version::work_1, root, result), difficulty);
 | 
			
		||||
				ASSERT_GE (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, root, result), difficulty);
 | 
			
		||||
				difficulty += difficulty_add;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -141,14 +141,14 @@ TEST (work, difficulty)
 | 
			
		|||
	do
 | 
			
		||||
	{
 | 
			
		||||
		auto work1 = *pool.generate (nano::work_version::work_1, root, difficulty1);
 | 
			
		||||
		result_difficulty1 = nano::work_difficulty (nano::work_version::work_1, root, work1);
 | 
			
		||||
		result_difficulty1 = nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, root, work1);
 | 
			
		||||
	} while (result_difficulty1 > difficulty2);
 | 
			
		||||
	ASSERT_GT (result_difficulty1, difficulty1);
 | 
			
		||||
	uint64_t result_difficulty2 (0);
 | 
			
		||||
	do
 | 
			
		||||
	{
 | 
			
		||||
		auto work2 = *pool.generate (nano::work_version::work_1, root, difficulty2);
 | 
			
		||||
		result_difficulty2 = nano::work_difficulty (nano::work_version::work_1, root, work2);
 | 
			
		||||
		result_difficulty2 = nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, root, work2);
 | 
			
		||||
	} while (result_difficulty2 > difficulty3);
 | 
			
		||||
	ASSERT_GT (result_difficulty2, difficulty2);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -170,7 +170,7 @@ TEST (work, eco_pow)
 | 
			
		|||
			do
 | 
			
		||||
			{
 | 
			
		||||
				auto work = *pool.generate (nano::work_version::work_1, root, difficulty1);
 | 
			
		||||
				result_difficulty = nano::work_difficulty (nano::work_version::work_1, root, work);
 | 
			
		||||
				result_difficulty = nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, root, work);
 | 
			
		||||
			} while (result_difficulty > difficulty2);
 | 
			
		||||
			ASSERT_GT (result_difficulty, difficulty1);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -85,7 +85,8 @@ nano::work_version nano::block::work_version () const
 | 
			
		|||
 | 
			
		||||
uint64_t nano::block::difficulty () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::work_difficulty (this->work_version (), this->root (), this->block_work ());
 | 
			
		||||
	static nano::network_constants constants;
 | 
			
		||||
	return constants.publish_thresholds.difficulty (this->work_version (), this->root (), this->block_work ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_hash nano::block::generate_hash () const
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -180,6 +180,20 @@ uint64_t nano::work_thresholds::threshold_base (nano::work_version const version
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t nano::work_thresholds::difficulty (nano::work_version const version_a, nano::root const & root_a, uint64_t const work_a)
 | 
			
		||||
{
 | 
			
		||||
	uint64_t result{ 0 };
 | 
			
		||||
	switch (version_a)
 | 
			
		||||
	{
 | 
			
		||||
		case nano::work_version::work_1:
 | 
			
		||||
			result = value (root_a, work_a);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			debug_assert (false && "Invalid version specified to work_difficulty");
 | 
			
		||||
	}
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
const char * network_constants::active_network_err_msg = "Invalid network. Valid values are live, test, beta and dev.";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,6 +118,7 @@ public:
 | 
			
		|||
	uint64_t value (nano::root const & root_a, uint64_t work_a);
 | 
			
		||||
	double normalized_multiplier (double const, uint64_t const);
 | 
			
		||||
	double denormalized_multiplier (double const, uint64_t const);
 | 
			
		||||
	uint64_t difficulty (nano::work_version const, nano::root const &, uint64_t const);
 | 
			
		||||
 | 
			
		||||
	/** Network work thresholds. Define these inline as constexpr when moving to cpp17. */
 | 
			
		||||
	static const nano::work_thresholds publish_full;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,22 +31,7 @@ bool nano::work_validate_entry (nano::block const & block_a)
 | 
			
		|||
bool nano::work_validate_entry (nano::work_version const version_a, nano::root const & root_a, uint64_t const work_a)
 | 
			
		||||
{
 | 
			
		||||
	static nano::network_constants network_constants;
 | 
			
		||||
	return nano::work_difficulty (version_a, root_a, work_a) < network_constants.publish_thresholds.threshold_entry (version_a, nano::block_type::state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t nano::work_difficulty (nano::work_version const version_a, nano::root const & root_a, uint64_t const work_a)
 | 
			
		||||
{
 | 
			
		||||
	static nano::network_constants network_constants;
 | 
			
		||||
	uint64_t result{ 0 };
 | 
			
		||||
	switch (version_a)
 | 
			
		||||
	{
 | 
			
		||||
		case nano::work_version::work_1:
 | 
			
		||||
			result = network_constants.publish_thresholds.value (root_a, work_a);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			debug_assert (false && "Invalid version specified to work_difficulty");
 | 
			
		||||
	}
 | 
			
		||||
	return result;
 | 
			
		||||
	return network_constants.publish_thresholds.difficulty (version_a, root_a, work_a) < network_constants.publish_thresholds.threshold_entry (version_a, nano::block_type::state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::work_pool::work_pool (nano::network_constants & network_constants, unsigned max_threads_a, std::chrono::nanoseconds pow_rate_limiter_a, std::function<boost::optional<uint64_t> (nano::work_version const, nano::root const &, uint64_t, std::atomic<int> &)> opencl_a) :
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,8 +21,6 @@ enum class block_type : uint8_t;
 | 
			
		|||
bool work_validate_entry (nano::block const &);
 | 
			
		||||
bool work_validate_entry (nano::work_version const, nano::root const &, uint64_t const);
 | 
			
		||||
 | 
			
		||||
uint64_t work_difficulty (nano::work_version const, nano::root const &, uint64_t const);
 | 
			
		||||
 | 
			
		||||
class opencl_work;
 | 
			
		||||
class work_item final
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -239,7 +239,7 @@ void nano::distributed_work::success (std::string const & body_a, nano::tcp_endp
 | 
			
		|||
		uint64_t work;
 | 
			
		||||
		if (!nano::from_string_hex (work_text, work))
 | 
			
		||||
		{
 | 
			
		||||
			if (nano::work_difficulty (request.version, request.root, work) >= request.difficulty)
 | 
			
		||||
			if (nano::dev::network_params.network.publish_thresholds.difficulty (request.version, request.root, work) >= request.difficulty)
 | 
			
		||||
			{
 | 
			
		||||
				error = false;
 | 
			
		||||
				node.unresponsive_work_peers = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -829,7 +829,7 @@ void nano::json_handler::account_representative_set ()
 | 
			
		|||
					if (!rpc_l->ec)
 | 
			
		||||
					{
 | 
			
		||||
						nano::block_details details (info.epoch (), false, false, false);
 | 
			
		||||
						if (nano::work_difficulty (nano::work_version::work_1, info.head, work) < rpc_l->node.network_params.network.publish_thresholds.threshold (nano::work_version::work_1, details))
 | 
			
		||||
						if (rpc_l->node.network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, info.head, work) < rpc_l->node.network_params.network.publish_thresholds.threshold (nano::work_version::work_1, details))
 | 
			
		||||
						{
 | 
			
		||||
							rpc_l->ec = nano::error_common::invalid_work;
 | 
			
		||||
						}
 | 
			
		||||
| 
						 | 
				
			
			@ -3284,7 +3284,7 @@ void nano::json_handler::receive ()
 | 
			
		|||
							head = account;
 | 
			
		||||
						}
 | 
			
		||||
						nano::block_details details (epoch, false, true, false);
 | 
			
		||||
						if (nano::work_difficulty (nano::work_version::work_1, head, work) < node.network_params.network.publish_thresholds.threshold (nano::work_version::work_1, details))
 | 
			
		||||
						if (node.network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, head, work) < node.network_params.network.publish_thresholds.threshold (nano::work_version::work_1, details))
 | 
			
		||||
						{
 | 
			
		||||
							ec = nano::error_common::invalid_work;
 | 
			
		||||
						}
 | 
			
		||||
| 
						 | 
				
			
			@ -3628,7 +3628,7 @@ void nano::json_handler::send ()
 | 
			
		|||
			if (!ec && work)
 | 
			
		||||
			{
 | 
			
		||||
				nano::block_details details (info.epoch (), true, false, false);
 | 
			
		||||
				if (nano::work_difficulty (nano::work_version::work_1, info.head, work) < node.network_params.network.publish_thresholds.threshold (nano::work_version::work_1, details))
 | 
			
		||||
				if (node.network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, info.head, work) < node.network_params.network.publish_thresholds.threshold (nano::work_version::work_1, details))
 | 
			
		||||
				{
 | 
			
		||||
					ec = nano::error_common::invalid_work;
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -4919,7 +4919,7 @@ void nano::json_handler::work_generate ()
 | 
			
		|||
					uint64_t work (work_a.value ());
 | 
			
		||||
					response_l.put ("work", nano::to_string_hex (work));
 | 
			
		||||
					std::stringstream ostream;
 | 
			
		||||
					auto result_difficulty (nano::work_difficulty (work_version, hash, work));
 | 
			
		||||
					auto result_difficulty (rpc_l->node.network_params.network.publish_thresholds.difficulty (work_version, hash, work));
 | 
			
		||||
					response_l.put ("difficulty", nano::to_string_hex (result_difficulty));
 | 
			
		||||
					auto result_multiplier = nano::difficulty::to_multiplier (result_difficulty, node.default_difficulty (work_version));
 | 
			
		||||
					response_l.put ("multiplier", nano::to_string (result_multiplier));
 | 
			
		||||
| 
						 | 
				
			
			@ -5045,7 +5045,7 @@ void nano::json_handler::work_validate ()
 | 
			
		|||
		 * * valid_receive: the work is valid for a receive block in an epoch_2 upgraded account
 | 
			
		||||
		 */
 | 
			
		||||
 | 
			
		||||
		auto result_difficulty (nano::work_difficulty (work_version, hash, work));
 | 
			
		||||
		auto result_difficulty (node.network_params.network.publish_thresholds.difficulty (work_version, hash, work));
 | 
			
		||||
		if (request.count ("difficulty"))
 | 
			
		||||
		{
 | 
			
		||||
			response_l.put ("valid", (result_difficulty >= difficulty) ? "1" : "0");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -455,7 +455,8 @@ boost::optional<uint64_t> nano::opencl_work::generate_work (nano::work_version c
 | 
			
		|||
	uint64_t result (0);
 | 
			
		||||
	unsigned thread_count (config.threads);
 | 
			
		||||
	size_t work_size[] = { thread_count, 0, 0 };
 | 
			
		||||
	while (nano::work_difficulty (version_a, root_a, result) < difficulty_a && !error && ticket_a == ticket_l)
 | 
			
		||||
	static nano::network_constants constants;
 | 
			
		||||
	while (constants.publish_thresholds.difficulty (version_a, root_a, result) < difficulty_a && !error && ticket_a == ticket_l)
 | 
			
		||||
	{
 | 
			
		||||
		result = rand.next ();
 | 
			
		||||
		cl_int write_error1 = clEnqueueWriteBuffer (queue, attempt_buffer, false, 0, sizeof (uint64_t), &result, 0, nullptr, nullptr);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -809,7 +809,7 @@ nano::websocket::message nano::websocket::message_builder::work_generation (nano
 | 
			
		|||
		boost::property_tree::ptree result_l;
 | 
			
		||||
		result_l.put ("source", peer_a);
 | 
			
		||||
		result_l.put ("work", nano::to_string_hex (work_a));
 | 
			
		||||
		auto result_difficulty_l (nano::work_difficulty (version_a, root_a, work_a));
 | 
			
		||||
		auto result_difficulty_l (nano::dev::network_params.network.publish_thresholds.difficulty (version_a, root_a, work_a));
 | 
			
		||||
		result_l.put ("difficulty", nano::to_string_hex (result_difficulty_l));
 | 
			
		||||
		auto result_multiplier_l (nano::difficulty::to_multiplier (result_difficulty_l, publish_threshold_a));
 | 
			
		||||
		result_l.put ("multiplier", nano::to_string (result_multiplier_l));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -835,7 +835,7 @@ TEST (wallet, seed_work_generation)
 | 
			
		|||
		ASSERT_NO_ERROR (ec);
 | 
			
		||||
	}
 | 
			
		||||
	auto transaction (system.nodes[0]->store.tx_begin_read ());
 | 
			
		||||
	ASSERT_GE (nano::work_difficulty (nano::work_version::work_1, system.nodes[0]->ledger.latest_root (transaction, pub), work), system.nodes[0]->default_difficulty (nano::work_version::work_1));
 | 
			
		||||
	ASSERT_GE (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, system.nodes[0]->ledger.latest_root (transaction, pub), work), system.nodes[0]->default_difficulty (nano::work_version::work_1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST (wallet, backup_seed)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1949,7 +1949,7 @@ TEST (rpc, work_generate)
 | 
			
		|||
		auto work_text (response.json.get<std::string> ("work"));
 | 
			
		||||
		uint64_t work;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (work_text, work));
 | 
			
		||||
		auto result_difficulty (nano::work_difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto result_difficulty (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto response_difficulty_text (response.json.get<std::string> ("difficulty"));
 | 
			
		||||
		uint64_t response_difficulty;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (response_difficulty_text, response_difficulty));
 | 
			
		||||
| 
						 | 
				
			
			@ -1980,7 +1980,7 @@ TEST (rpc, work_generate_difficulty)
 | 
			
		|||
		auto work_text (response.get<std::string> ("work"));
 | 
			
		||||
		uint64_t work;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (work_text, work));
 | 
			
		||||
		auto result_difficulty (nano::work_difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto result_difficulty (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto response_difficulty_text (response.get<std::string> ("difficulty"));
 | 
			
		||||
		uint64_t response_difficulty;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (response_difficulty_text, response_difficulty));
 | 
			
		||||
| 
						 | 
				
			
			@ -1997,7 +1997,7 @@ TEST (rpc, work_generate_difficulty)
 | 
			
		|||
		auto work_text (response.get<std::string> ("work"));
 | 
			
		||||
		uint64_t work;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (work_text, work));
 | 
			
		||||
		auto result_difficulty (nano::work_difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto result_difficulty (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		ASSERT_GE (result_difficulty, difficulty);
 | 
			
		||||
	}
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -2031,7 +2031,7 @@ TEST (rpc, work_generate_multiplier)
 | 
			
		|||
		ASSERT_TRUE (work_text.is_initialized ());
 | 
			
		||||
		uint64_t work;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (*work_text, work));
 | 
			
		||||
		auto result_difficulty (nano::work_difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto result_difficulty (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto response_difficulty_text (response.get<std::string> ("difficulty"));
 | 
			
		||||
		uint64_t response_difficulty;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (response_difficulty_text, response_difficulty));
 | 
			
		||||
| 
						 | 
				
			
			@ -2062,7 +2062,7 @@ TEST (rpc, work_generate_block_high)
 | 
			
		|||
	nano::keypair key;
 | 
			
		||||
	nano::state_block block (key.pub, 0, nano::dev::genesis_key.pub, nano::Gxrb_ratio, 123, key.prv, key.pub, *node->work_generate_blocking (key.pub));
 | 
			
		||||
	nano::block_hash hash (block.root ().as_block_hash ());
 | 
			
		||||
	auto block_difficulty (nano::work_difficulty (nano::work_version::work_1, hash, block.block_work ()));
 | 
			
		||||
	auto block_difficulty (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, block.block_work ()));
 | 
			
		||||
	boost::property_tree::ptree request;
 | 
			
		||||
	request.put ("action", "work_generate");
 | 
			
		||||
	request.put ("hash", hash.to_string ());
 | 
			
		||||
| 
						 | 
				
			
			@ -2103,7 +2103,7 @@ TEST (rpc, work_generate_block_low)
 | 
			
		|||
		uint64_t work;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (*work_text, work));
 | 
			
		||||
		ASSERT_NE (block.block_work (), work);
 | 
			
		||||
		auto result_difficulty (nano::work_difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto result_difficulty (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto response_difficulty_text (response.get<std::string> ("difficulty"));
 | 
			
		||||
		uint64_t response_difficulty;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (response_difficulty_text, response_difficulty));
 | 
			
		||||
| 
						 | 
				
			
			@ -2167,7 +2167,7 @@ TEST (rpc, work_generate_block_ledger_epoch_2)
 | 
			
		|||
		ASSERT_TRUE (work_text.is_initialized ());
 | 
			
		||||
		uint64_t work;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (*work_text, work));
 | 
			
		||||
		auto result_difficulty (nano::work_difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto result_difficulty (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, work));
 | 
			
		||||
		auto response_difficulty_text (response.get<std::string> ("difficulty"));
 | 
			
		||||
		uint64_t response_difficulty;
 | 
			
		||||
		ASSERT_FALSE (nano::from_string_hex (response_difficulty_text, response_difficulty));
 | 
			
		||||
| 
						 | 
				
			
			@ -2215,7 +2215,7 @@ TEST (rpc, work_peer_bad)
 | 
			
		|||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
		work = *work_a;
 | 
			
		||||
	});
 | 
			
		||||
	ASSERT_TIMELY (5s, nano::work_difficulty (nano::work_version::work_1, hash1, work) >= nano::dev::network_params.network.publish_thresholds.threshold_base (nano::work_version::work_1));
 | 
			
		||||
	ASSERT_TIMELY (5s, nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash1, work) >= nano::dev::network_params.network.publish_thresholds.threshold_base (nano::work_version::work_1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST (rpc, work_peer_one)
 | 
			
		||||
| 
						 | 
				
			
			@ -2231,7 +2231,7 @@ TEST (rpc, work_peer_one)
 | 
			
		|||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
		work = *work_a;
 | 
			
		||||
	});
 | 
			
		||||
	ASSERT_TIMELY (5s, nano::work_difficulty (nano::work_version::work_1, key1.pub, work) >= nano::dev::network_params.network.publish_thresholds.threshold_base (nano::work_version::work_1));
 | 
			
		||||
	ASSERT_TIMELY (5s, nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, key1.pub, work) >= nano::dev::network_params.network.publish_thresholds.threshold_base (nano::work_version::work_1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST (rpc, work_peer_many)
 | 
			
		||||
| 
						 | 
				
			
			@ -2258,7 +2258,7 @@ TEST (rpc, work_peer_many)
 | 
			
		|||
		node1.work_generate (nano::work_version::work_1, key1.pub, node1.network_params.network.publish_thresholds.base, [&work = works[i]] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
			work = *work_a;
 | 
			
		||||
		});
 | 
			
		||||
		while (nano::work_difficulty (nano::work_version::work_1, key1.pub, works[i]) < nano::dev::network_params.network.publish_thresholds.threshold_base (nano::work_version::work_1))
 | 
			
		||||
		while (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, key1.pub, works[i]) < nano::dev::network_params.network.publish_thresholds.threshold_base (nano::work_version::work_1))
 | 
			
		||||
		{
 | 
			
		||||
			system1.poll ();
 | 
			
		||||
			system2.poll ();
 | 
			
		||||
| 
						 | 
				
			
			@ -2744,7 +2744,7 @@ TEST (rpc, work_validate)
 | 
			
		|||
		double multiplier (response.get<double> ("multiplier"));
 | 
			
		||||
		ASSERT_NEAR (multiplier, nano::difficulty::to_multiplier (difficulty, node1->default_difficulty (nano::work_version::work_1)), 1e-6);
 | 
			
		||||
	}
 | 
			
		||||
	auto result_difficulty (nano::work_difficulty (nano::work_version::work_1, hash, work1));
 | 
			
		||||
	auto result_difficulty (nano::dev::network_params.network.publish_thresholds.difficulty (nano::work_version::work_1, hash, work1));
 | 
			
		||||
	ASSERT_GE (result_difficulty, node1->default_difficulty (nano::work_version::work_1));
 | 
			
		||||
	request.put ("work", nano::to_string_hex (work1));
 | 
			
		||||
	request.put ("difficulty", nano::to_string_hex (result_difficulty));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -202,10 +202,11 @@ uint64_t nano::system::work_generate_limited (nano::block_hash const & root_a, u
 | 
			
		|||
{
 | 
			
		||||
	debug_assert (min_a > 0);
 | 
			
		||||
	uint64_t result = 0;
 | 
			
		||||
	static nano::network_constants constants;
 | 
			
		||||
	do
 | 
			
		||||
	{
 | 
			
		||||
		result = *work.generate (root_a, min_a);
 | 
			
		||||
	} while (nano::work_difficulty (nano::work_version::work_1, root_a, result) >= max_a);
 | 
			
		||||
	} while (constants.publish_thresholds.difficulty (nano::work_version::work_1, root_a, result) >= max_a);
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +220,7 @@ std::unique_ptr<nano::state_block> nano::upgrade_epoch (nano::work_pool & pool_a
 | 
			
		|||
 | 
			
		||||
	nano::state_block_builder builder;
 | 
			
		||||
	std::error_code ec;
 | 
			
		||||
	nano::network_constants constants;
 | 
			
		||||
	static nano::network_constants constants;
 | 
			
		||||
	auto epoch = builder
 | 
			
		||||
				 .account (dev_genesis_key.pub)
 | 
			
		||||
				 .previous (latest)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue