Convert boost::optional to std::optional for distributed work generation.
This commit is contained in:
		
					parent
					
						
							
								5678e8ccb7
							
						
					
				
			
			
				commit
				
					
						76ebe9afa8
					
				
			
		
					 13 changed files with 78 additions and 74 deletions
				
			
		| 
						 | 
				
			
			@ -18,10 +18,10 @@ TEST (distributed_work, no_peers)
 | 
			
		|||
	nano::test::system system (1);
 | 
			
		||||
	auto node (system.nodes[0]);
 | 
			
		||||
	nano::block_hash hash{ 1 };
 | 
			
		||||
	boost::optional<uint64_t> work;
 | 
			
		||||
	std::optional<uint64_t> work;
 | 
			
		||||
	std::atomic<bool> done{ false };
 | 
			
		||||
	auto callback = [&work, &done] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
	auto callback = [&work, &done] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.has_value ());
 | 
			
		||||
		work = work_a;
 | 
			
		||||
		done = true;
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			@ -54,8 +54,8 @@ TEST (distributed_work, no_peers_cancel)
 | 
			
		|||
	auto & node = *system.add_node (node_config);
 | 
			
		||||
	nano::block_hash hash{ 1 };
 | 
			
		||||
	bool done{ false };
 | 
			
		||||
	auto callback_to_cancel = [&done] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_FALSE (work_a.is_initialized ());
 | 
			
		||||
	auto callback_to_cancel = [&done] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_FALSE (work_a.has_value ());
 | 
			
		||||
		done = true;
 | 
			
		||||
	};
 | 
			
		||||
	ASSERT_FALSE (node.distributed_work.make (nano::work_version::work_1, hash, node.config.work_peers, nano::difficulty::from_multiplier (1e6, node.network_params.work.base), callback_to_cancel));
 | 
			
		||||
| 
						 | 
				
			
			@ -83,8 +83,8 @@ TEST (distributed_work, no_peers_multi)
 | 
			
		|||
	nano::block_hash hash{ 1 };
 | 
			
		||||
	unsigned total{ 10 };
 | 
			
		||||
	std::atomic<unsigned> count{ 0 };
 | 
			
		||||
	auto callback = [&count] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
	auto callback = [&count] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.has_value ());
 | 
			
		||||
		++count;
 | 
			
		||||
	};
 | 
			
		||||
	// Test many works for the same root
 | 
			
		||||
| 
						 | 
				
			
			@ -125,10 +125,10 @@ TEST (distributed_work, peer)
 | 
			
		|||
	auto node (system.add_node (node_config));
 | 
			
		||||
	ASSERT_FALSE (node->local_work_generation_enabled ());
 | 
			
		||||
	nano::block_hash hash{ 1 };
 | 
			
		||||
	boost::optional<uint64_t> work;
 | 
			
		||||
	std::optional<uint64_t> work;
 | 
			
		||||
	std::atomic<bool> done{ false };
 | 
			
		||||
	auto callback = [&work, &done] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
	auto callback = [&work, &done] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.has_value ());
 | 
			
		||||
		work = work_a;
 | 
			
		||||
		done = true;
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			@ -151,10 +151,10 @@ TEST (distributed_work, peer_malicious)
 | 
			
		|||
	auto node (system.nodes[0]);
 | 
			
		||||
	ASSERT_TRUE (node->local_work_generation_enabled ());
 | 
			
		||||
	nano::block_hash hash{ 1 };
 | 
			
		||||
	boost::optional<uint64_t> work;
 | 
			
		||||
	std::optional<uint64_t> work;
 | 
			
		||||
	std::atomic<bool> done{ false };
 | 
			
		||||
	auto callback = [&work, &done] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
	auto callback = [&work, &done] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.has_value ());
 | 
			
		||||
		work = work_a;
 | 
			
		||||
		done = true;
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			@ -194,10 +194,10 @@ TEST (distributed_work, DISABLED_peer_multi)
 | 
			
		|||
	auto node (system.nodes[0]);
 | 
			
		||||
	ASSERT_TRUE (node->local_work_generation_enabled ());
 | 
			
		||||
	nano::block_hash hash{ 1 };
 | 
			
		||||
	boost::optional<uint64_t> work;
 | 
			
		||||
	std::optional<uint64_t> work;
 | 
			
		||||
	std::atomic<bool> done{ false };
 | 
			
		||||
	auto callback = [&work, &done] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
	auto callback = [&work, &done] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.has_value ());
 | 
			
		||||
		work = work_a;
 | 
			
		||||
		done = true;
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			@ -233,10 +233,10 @@ TEST (distributed_work, fail_resolve)
 | 
			
		|||
	nano::test::system system (1);
 | 
			
		||||
	auto node (system.nodes[0]);
 | 
			
		||||
	nano::block_hash hash{ 1 };
 | 
			
		||||
	boost::optional<uint64_t> work;
 | 
			
		||||
	std::optional<uint64_t> work;
 | 
			
		||||
	std::atomic<bool> done{ false };
 | 
			
		||||
	auto callback = [&work, &done] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
	auto callback = [&work, &done] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.has_value ());
 | 
			
		||||
		work = work_a;
 | 
			
		||||
		done = true;
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,19 +48,19 @@ TEST (node, work_generate)
 | 
			
		|||
	{
 | 
			
		||||
		auto difficulty = nano::difficulty::from_multiplier (1.5, node.network_params.work.base);
 | 
			
		||||
		auto work = node.work_generate_blocking (version, root, difficulty);
 | 
			
		||||
		ASSERT_TRUE (work.is_initialized ());
 | 
			
		||||
		ASSERT_GE (nano::dev::network_params.work.difficulty (version, root, *work), difficulty);
 | 
			
		||||
		ASSERT_TRUE (work.has_value ());
 | 
			
		||||
		ASSERT_GE (nano::dev::network_params.work.difficulty (version, root, work.value ()), difficulty);
 | 
			
		||||
	}
 | 
			
		||||
	{
 | 
			
		||||
		auto difficulty = nano::difficulty::from_multiplier (0.5, node.network_params.work.base);
 | 
			
		||||
		boost::optional<uint64_t> work;
 | 
			
		||||
		std::optional<uint64_t> work;
 | 
			
		||||
		do
 | 
			
		||||
		{
 | 
			
		||||
			work = node.work_generate_blocking (version, root, difficulty);
 | 
			
		||||
		} while (nano::dev::network_params.work.difficulty (version, root, *work) >= node.network_params.work.base);
 | 
			
		||||
		ASSERT_TRUE (work.is_initialized ());
 | 
			
		||||
		ASSERT_GE (nano::dev::network_params.work.difficulty (version, root, *work), difficulty);
 | 
			
		||||
		ASSERT_FALSE (nano::dev::network_params.work.difficulty (version, root, *work) >= node.network_params.work.base);
 | 
			
		||||
		} while (nano::dev::network_params.work.difficulty (version, root, work.value ()) >= node.network_params.work.base);
 | 
			
		||||
		ASSERT_TRUE (work.has_value ());
 | 
			
		||||
		ASSERT_GE (nano::dev::network_params.work.difficulty (version, root, work.value ()), difficulty);
 | 
			
		||||
		ASSERT_FALSE (nano::dev::network_params.work.difficulty (version, root, work.value ()) >= node.network_params.work.base);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -796,7 +796,7 @@ TEST (websocket, work)
 | 
			
		|||
	// Generate work
 | 
			
		||||
	nano::block_hash hash{ 1 };
 | 
			
		||||
	auto work (node1->work_generate_blocking (hash));
 | 
			
		||||
	ASSERT_TRUE (work.is_initialized ());
 | 
			
		||||
	ASSERT_TRUE (work.has_value ());
 | 
			
		||||
 | 
			
		||||
	// Wait for the work notification
 | 
			
		||||
	ASSERT_TIMELY_EQ (5s, future.wait_for (0s), std::future_status::ready);
 | 
			
		||||
| 
						 | 
				
			
			@ -827,7 +827,7 @@ TEST (websocket, work)
 | 
			
		|||
	nano::from_string_hex (result.get<std::string> ("difficulty"), result_difficulty);
 | 
			
		||||
	ASSERT_GE (result_difficulty, node1->default_difficulty (nano::work_version::work_1));
 | 
			
		||||
	ASSERT_NEAR (result.get<double> ("multiplier"), nano::difficulty::to_multiplier (result_difficulty, node1->default_difficulty (nano::work_version::work_1)), 1e-6);
 | 
			
		||||
	ASSERT_EQ (result.get<std::string> ("work"), nano::to_string_hex (work.get ()));
 | 
			
		||||
	ASSERT_EQ (result.get<std::string> ("work"), nano::to_string_hex (work.value ()));
 | 
			
		||||
 | 
			
		||||
	ASSERT_EQ (1, contents.count ("bad_peers"));
 | 
			
		||||
	auto & bad_peers = contents.get_child ("bad_peers");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ void nano::distributed_work::start ()
 | 
			
		|||
	else if (need_resolve.empty () && request.callback)
 | 
			
		||||
	{
 | 
			
		||||
		status = work_generation_status::failure_local;
 | 
			
		||||
		request.callback (boost::none);
 | 
			
		||||
		request.callback (std::nullopt);
 | 
			
		||||
	}
 | 
			
		||||
	for (auto const & peer : need_resolve)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ void nano::distributed_work::start_local ()
 | 
			
		|||
			this_l->status = work_generation_status::failure_local;
 | 
			
		||||
			if (this_l->request.callback)
 | 
			
		||||
			{
 | 
			
		||||
				this_l->request.callback (boost::none);
 | 
			
		||||
				this_l->request.callback (std::nullopt);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		this_l->stop_once (false);
 | 
			
		||||
| 
						 | 
				
			
			@ -143,9 +143,9 @@ void nano::distributed_work::do_request (nano::tcp_endpoint const & endpoint_a)
 | 
			
		|||
				rpc_request.put ("action", "work_generate");
 | 
			
		||||
				rpc_request.put ("hash", this_l->request.root.to_string ());
 | 
			
		||||
				rpc_request.put ("difficulty", nano::to_string_hex (this_l->request.difficulty));
 | 
			
		||||
				if (this_l->request.account.is_initialized ())
 | 
			
		||||
				if (this_l->request.account.has_value ())
 | 
			
		||||
				{
 | 
			
		||||
					rpc_request.put ("account", this_l->request.account.get ().to_account ());
 | 
			
		||||
					rpc_request.put ("account", this_l->request.account.value ().to_account ());
 | 
			
		||||
				}
 | 
			
		||||
				std::stringstream ostream;
 | 
			
		||||
				boost::property_tree::write_json (ostream, rpc_request);
 | 
			
		||||
| 
						 | 
				
			
			@ -373,7 +373,7 @@ void nano::distributed_work::cancel ()
 | 
			
		|||
		status = work_generation_status::cancelled;
 | 
			
		||||
		if (request.callback)
 | 
			
		||||
		{
 | 
			
		||||
			request.callback (boost::none);
 | 
			
		||||
			request.callback (std::nullopt);
 | 
			
		||||
		}
 | 
			
		||||
		stop_once (true);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -411,7 +411,7 @@ void nano::distributed_work::handle_failure ()
 | 
			
		|||
				}
 | 
			
		||||
				if (error_l && request_l.callback)
 | 
			
		||||
				{
 | 
			
		||||
					request_l.callback (boost::none);
 | 
			
		||||
					request_l.callback (std::nullopt);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,8 @@
 | 
			
		|||
#include <nano/lib/work.hpp>
 | 
			
		||||
#include <nano/node/common.hpp>
 | 
			
		||||
 | 
			
		||||
#include <optional>
 | 
			
		||||
 | 
			
		||||
using request_type = boost::beast::http::request<boost::beast::http::string_body>;
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
| 
						 | 
				
			
			@ -28,8 +30,8 @@ struct work_request final
 | 
			
		|||
	nano::work_version version;
 | 
			
		||||
	nano::root root;
 | 
			
		||||
	uint64_t difficulty;
 | 
			
		||||
	boost::optional<nano::account> const account;
 | 
			
		||||
	std::function<void (boost::optional<uint64_t>)> callback;
 | 
			
		||||
	std::optional<nano::account> const account;
 | 
			
		||||
	std::function<void (std::optional<uint64_t>)> callback;
 | 
			
		||||
	std::vector<std::pair<std::string, uint16_t>> const peers;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -107,4 +109,4 @@ private:
 | 
			
		|||
	std::atomic<bool> stopped{ false };
 | 
			
		||||
	std::atomic<bool> local_generation_started{ false };
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ nano::distributed_work_factory::~distributed_work_factory ()
 | 
			
		|||
	stop ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::distributed_work_factory::make (nano::work_version const version_a, nano::root const & root_a, std::vector<std::pair<std::string, uint16_t>> const & peers_a, uint64_t difficulty_a, std::function<void (boost::optional<uint64_t>)> const & callback_a, boost::optional<nano::account> const & account_a)
 | 
			
		||||
bool nano::distributed_work_factory::make (nano::work_version const version_a, nano::root const & root_a, std::vector<std::pair<std::string, uint16_t>> const & peers_a, uint64_t difficulty_a, std::function<void (std::optional<uint64_t>)> const & callback_a, std::optional<nano::account> const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	return make (std::chrono::seconds (1), nano::work_request{ version_a, root_a, difficulty_a, account_a, callback_a, peers_a });
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <optional>
 | 
			
		||||
#include <unordered_map>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +21,7 @@ class distributed_work_factory final
 | 
			
		|||
public:
 | 
			
		||||
	distributed_work_factory (nano::node &);
 | 
			
		||||
	~distributed_work_factory ();
 | 
			
		||||
	bool make (nano::work_version const, nano::root const &, std::vector<std::pair<std::string, uint16_t>> const &, uint64_t, std::function<void (boost::optional<uint64_t>)> const &, boost::optional<nano::account> const & = boost::none);
 | 
			
		||||
	bool make (nano::work_version const, nano::root const &, std::vector<std::pair<std::string, uint16_t>> const &, uint64_t, std::function<void (std::optional<uint64_t>)> const &, std::optional<nano::account> const & = std::nullopt);
 | 
			
		||||
	bool make (std::chrono::seconds const &, nano::work_request const &);
 | 
			
		||||
	void cancel (nano::root const &);
 | 
			
		||||
	void cleanup_finished ();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1613,10 +1613,10 @@ void nano::json_handler::block_create ()
 | 
			
		|||
		// Wrapper from argument to lambda capture, to extend the block's scope
 | 
			
		||||
		auto get_callback_l = [rpc_l, block_response_put_l] (std::shared_ptr<nano::block> const & block_a) {
 | 
			
		||||
			// Callback upon work generation success or failure
 | 
			
		||||
			return [block_a, rpc_l, block_response_put_l] (boost::optional<uint64_t> const & work_a) {
 | 
			
		||||
			return [block_a, rpc_l, block_response_put_l] (std::optional<uint64_t> const & work_a) {
 | 
			
		||||
				if (block_a != nullptr)
 | 
			
		||||
				{
 | 
			
		||||
					if (work_a.is_initialized ())
 | 
			
		||||
					if (work_a.has_value ())
 | 
			
		||||
					{
 | 
			
		||||
						block_a->block_work_set (*work_a);
 | 
			
		||||
						block_response_put_l (*block_a);
 | 
			
		||||
| 
						 | 
				
			
			@ -4994,7 +4994,7 @@ void nano::json_handler::wallet_work_get ()
 | 
			
		|||
 | 
			
		||||
void nano::json_handler::work_generate ()
 | 
			
		||||
{
 | 
			
		||||
	boost::optional<nano::account> account;
 | 
			
		||||
	std::optional<nano::account> account;
 | 
			
		||||
	auto account_opt (request.get_optional<std::string> ("account"));
 | 
			
		||||
	// Default to work_1 if not specified
 | 
			
		||||
	auto work_version (work_version_optional_impl (nano::work_version::work_1));
 | 
			
		||||
| 
						 | 
				
			
			@ -5046,7 +5046,7 @@ void nano::json_handler::work_generate ()
 | 
			
		|||
		{
 | 
			
		||||
			auto use_peers (request.get<bool> ("use_peers", false));
 | 
			
		||||
			auto rpc_l (shared_from_this ());
 | 
			
		||||
			auto callback = [rpc_l, hash, work_version, this] (boost::optional<uint64_t> const & work_a) {
 | 
			
		||||
			auto callback = [rpc_l, hash, work_version, this] (std::optional<uint64_t> const & work_a) {
 | 
			
		||||
				if (work_a)
 | 
			
		||||
				{
 | 
			
		||||
					boost::property_tree::ptree response_l;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1078,50 +1078,50 @@ bool nano::node::work_generation_enabled (std::vector<std::pair<std::string, uin
 | 
			
		|||
	return !peers_a.empty () || local_work_generation_enabled ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
boost::optional<uint64_t> nano::node::work_generate_blocking (nano::block & block_a, uint64_t difficulty_a)
 | 
			
		||||
std::optional<uint64_t> nano::node::work_generate_blocking (nano::block & block_a, uint64_t difficulty_a)
 | 
			
		||||
{
 | 
			
		||||
	auto opt_work_l (work_generate_blocking (block_a.work_version (), block_a.root (), difficulty_a, block_a.account ()));
 | 
			
		||||
	if (opt_work_l.is_initialized ())
 | 
			
		||||
	if (opt_work_l.has_value ())
 | 
			
		||||
	{
 | 
			
		||||
		block_a.block_work_set (*opt_work_l);
 | 
			
		||||
		block_a.block_work_set (opt_work_l.value ());
 | 
			
		||||
	}
 | 
			
		||||
	return opt_work_l;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::node::work_generate (nano::work_version const version_a, nano::root const & root_a, uint64_t difficulty_a, std::function<void (boost::optional<uint64_t>)> callback_a, boost::optional<nano::account> const & account_a, bool secondary_work_peers_a)
 | 
			
		||||
void nano::node::work_generate (nano::work_version const version_a, nano::root const & root_a, uint64_t difficulty_a, std::function<void (std::optional<uint64_t>)> callback_a, std::optional<nano::account> const & account_a, bool secondary_work_peers_a)
 | 
			
		||||
{
 | 
			
		||||
	auto const & peers_l (secondary_work_peers_a ? config.secondary_work_peers : config.work_peers);
 | 
			
		||||
	if (distributed_work.make (version_a, root_a, peers_l, difficulty_a, callback_a, account_a))
 | 
			
		||||
	{
 | 
			
		||||
		// Error in creating the job (either stopped or work generation is not possible)
 | 
			
		||||
		callback_a (boost::none);
 | 
			
		||||
		callback_a (std::nullopt);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
boost::optional<uint64_t> nano::node::work_generate_blocking (nano::work_version const version_a, nano::root const & root_a, uint64_t difficulty_a, boost::optional<nano::account> const & account_a)
 | 
			
		||||
std::optional<uint64_t> nano::node::work_generate_blocking (nano::work_version const version_a, nano::root const & root_a, uint64_t difficulty_a, std::optional<nano::account> const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	std::promise<boost::optional<uint64_t>> promise;
 | 
			
		||||
	std::promise<std::optional<uint64_t>> promise;
 | 
			
		||||
	work_generate (
 | 
			
		||||
	version_a, root_a, difficulty_a, [&promise] (boost::optional<uint64_t> opt_work_a) {
 | 
			
		||||
	version_a, root_a, difficulty_a, [&promise] (std::optional<uint64_t> opt_work_a) {
 | 
			
		||||
		promise.set_value (opt_work_a);
 | 
			
		||||
	},
 | 
			
		||||
	account_a);
 | 
			
		||||
	return promise.get_future ().get ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
boost::optional<uint64_t> nano::node::work_generate_blocking (nano::block & block_a)
 | 
			
		||||
std::optional<uint64_t> nano::node::work_generate_blocking (nano::block & block_a)
 | 
			
		||||
{
 | 
			
		||||
	debug_assert (network_params.network.is_dev_network ());
 | 
			
		||||
	return work_generate_blocking (block_a, default_difficulty (nano::work_version::work_1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
boost::optional<uint64_t> nano::node::work_generate_blocking (nano::root const & root_a)
 | 
			
		||||
std::optional<uint64_t> nano::node::work_generate_blocking (nano::root const & root_a)
 | 
			
		||||
{
 | 
			
		||||
	debug_assert (network_params.network.is_dev_network ());
 | 
			
		||||
	return work_generate_blocking (root_a, default_difficulty (nano::work_version::work_1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
boost::optional<uint64_t> nano::node::work_generate_blocking (nano::root const & root_a, uint64_t difficulty_a)
 | 
			
		||||
std::optional<uint64_t> nano::node::work_generate_blocking (nano::root const & root_a, uint64_t difficulty_a)
 | 
			
		||||
{
 | 
			
		||||
	debug_assert (network_params.network.is_dev_network ());
 | 
			
		||||
	return work_generate_blocking (nano::work_version::work_1, root_a, difficulty_a);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,6 +43,7 @@
 | 
			
		|||
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <optional>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
| 
						 | 
				
			
			@ -111,9 +112,9 @@ public:
 | 
			
		|||
	bool local_work_generation_enabled () const;
 | 
			
		||||
	bool work_generation_enabled () const;
 | 
			
		||||
	bool work_generation_enabled (std::vector<std::pair<std::string, uint16_t>> const &) const;
 | 
			
		||||
	boost::optional<uint64_t> work_generate_blocking (nano::block &, uint64_t);
 | 
			
		||||
	boost::optional<uint64_t> work_generate_blocking (nano::work_version const, nano::root const &, uint64_t, boost::optional<nano::account> const & = boost::none);
 | 
			
		||||
	void work_generate (nano::work_version const, nano::root const &, uint64_t, std::function<void (boost::optional<uint64_t>)>, boost::optional<nano::account> const & = boost::none, bool const = false);
 | 
			
		||||
	std::optional<uint64_t> work_generate_blocking (nano::block &, uint64_t);
 | 
			
		||||
	std::optional<uint64_t> work_generate_blocking (nano::work_version const, nano::root const &, uint64_t, std::optional<nano::account> const & = std::nullopt);
 | 
			
		||||
	void work_generate (nano::work_version const, nano::root const &, uint64_t, std::function<void (std::optional<uint64_t>)>, std::optional<nano::account> const & = std::nullopt, bool const = false);
 | 
			
		||||
	void add_initial_peers ();
 | 
			
		||||
	void start_election (std::shared_ptr<nano::block> const & block);
 | 
			
		||||
	bool block_confirmed (nano::block_hash const &);
 | 
			
		||||
| 
						 | 
				
			
			@ -199,11 +200,11 @@ public:
 | 
			
		|||
	// For tests only
 | 
			
		||||
	unsigned node_seq;
 | 
			
		||||
	// For tests only
 | 
			
		||||
	boost::optional<uint64_t> work_generate_blocking (nano::block &);
 | 
			
		||||
	std::optional<uint64_t> work_generate_blocking (nano::block &);
 | 
			
		||||
	// For tests only
 | 
			
		||||
	boost::optional<uint64_t> work_generate_blocking (nano::root const &, uint64_t);
 | 
			
		||||
	std::optional<uint64_t> work_generate_blocking (nano::root const &, uint64_t);
 | 
			
		||||
	// For tests only
 | 
			
		||||
	boost::optional<uint64_t> work_generate_blocking (nano::root const &);
 | 
			
		||||
	std::optional<uint64_t> work_generate_blocking (nano::root const &);
 | 
			
		||||
 | 
			
		||||
public: // Testing convenience functions
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1050,7 +1050,7 @@ bool nano::wallet::action_complete (std::shared_ptr<nano::block> const & block_a
 | 
			
		|||
			account_a.to_account ());
 | 
			
		||||
 | 
			
		||||
			debug_assert (required_difficulty <= wallets.node.max_work_generate_difficulty (block_a->work_version ()));
 | 
			
		||||
			error = !wallets.node.work_generate_blocking (*block_a, required_difficulty).is_initialized ();
 | 
			
		||||
			error = !wallets.node.work_generate_blocking (*block_a, required_difficulty).has_value ();
 | 
			
		||||
		}
 | 
			
		||||
		if (!error)
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -1298,12 +1298,12 @@ void nano::wallet::work_cache_blocking (nano::account const & account_a, nano::r
 | 
			
		|||
	{
 | 
			
		||||
		auto difficulty (wallets.node.default_difficulty (nano::work_version::work_1));
 | 
			
		||||
		auto opt_work_l (wallets.node.work_generate_blocking (nano::work_version::work_1, root_a, difficulty, account_a));
 | 
			
		||||
		if (opt_work_l.is_initialized ())
 | 
			
		||||
		if (opt_work_l.has_value ())
 | 
			
		||||
		{
 | 
			
		||||
			auto transaction_l (wallets.tx_begin_write ());
 | 
			
		||||
			if (live () && store.exists (transaction_l, account_a))
 | 
			
		||||
			{
 | 
			
		||||
				work_update (transaction_l, account_a, root_a, *opt_work_l);
 | 
			
		||||
				work_update (transaction_l, account_a, root_a, opt_work_l.value ());
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else if (!wallets.node.stopped)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2253,7 +2253,7 @@ void nano_qt::block_creation::create_send ()
 | 
			
		|||
						details.is_send = true;
 | 
			
		||||
						details.epoch = info.epoch ();
 | 
			
		||||
						auto const required_difficulty{ wallet.node.network_params.work.threshold (send.work_version (), details) };
 | 
			
		||||
						if (wallet.node.work_generate_blocking (send, required_difficulty).is_initialized ())
 | 
			
		||||
						if (wallet.node.work_generate_blocking (send, required_difficulty).has_value ())
 | 
			
		||||
						{
 | 
			
		||||
							std::string block_l;
 | 
			
		||||
							send.serialize_json (block_l);
 | 
			
		||||
| 
						 | 
				
			
			@ -2337,7 +2337,7 @@ void nano_qt::block_creation::create_receive ()
 | 
			
		|||
							details.is_receive = true;
 | 
			
		||||
							details.epoch = std::max (info.epoch (), pending.epoch);
 | 
			
		||||
							auto required_difficulty{ wallet.node.network_params.work.threshold (receive.work_version (), details) };
 | 
			
		||||
							if (wallet.node.work_generate_blocking (receive, required_difficulty).is_initialized ())
 | 
			
		||||
							if (wallet.node.work_generate_blocking (receive, required_difficulty).has_value ())
 | 
			
		||||
							{
 | 
			
		||||
								std::string block_l;
 | 
			
		||||
								receive.serialize_json (block_l);
 | 
			
		||||
| 
						 | 
				
			
			@ -2420,7 +2420,7 @@ void nano_qt::block_creation::create_change ()
 | 
			
		|||
					nano::block_details details;
 | 
			
		||||
					details.epoch = info.epoch ();
 | 
			
		||||
					auto const required_difficulty{ wallet.node.network_params.work.threshold (change.work_version (), details) };
 | 
			
		||||
					if (wallet.node.work_generate_blocking (change, required_difficulty).is_initialized ())
 | 
			
		||||
					if (wallet.node.work_generate_blocking (change, required_difficulty).has_value ())
 | 
			
		||||
					{
 | 
			
		||||
						std::string block_l;
 | 
			
		||||
						change.serialize_json (block_l);
 | 
			
		||||
| 
						 | 
				
			
			@ -2502,7 +2502,7 @@ void nano_qt::block_creation::create_open ()
 | 
			
		|||
								details.is_receive = true;
 | 
			
		||||
								details.epoch = pending.epoch;
 | 
			
		||||
								auto const required_difficulty{ wallet.node.network_params.work.threshold (open.work_version (), details) };
 | 
			
		||||
								if (wallet.node.work_generate_blocking (open, required_difficulty).is_initialized ())
 | 
			
		||||
								if (wallet.node.work_generate_blocking (open, required_difficulty).has_value ())
 | 
			
		||||
								{
 | 
			
		||||
									std::string block_l;
 | 
			
		||||
									open.serialize_json (block_l);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2088,9 +2088,9 @@ TEST (rpc, work_peer_bad)
 | 
			
		|||
	auto const rpc_ctx = add_rpc (system, node1);
 | 
			
		||||
	nano::block_hash hash1 (1);
 | 
			
		||||
	std::atomic<uint64_t> work (0);
 | 
			
		||||
	node2.work_generate (nano::work_version::work_1, hash1, node2.network_params.work.base, [&work] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
		work = *work_a;
 | 
			
		||||
	node2.work_generate (nano::work_version::work_1, hash1, node2.network_params.work.base, [&work] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.has_value ());
 | 
			
		||||
		work = work_a.value ();
 | 
			
		||||
	});
 | 
			
		||||
	ASSERT_TIMELY (5s, nano::dev::network_params.work.difficulty (nano::work_version::work_1, hash1, work) >= nano::dev::network_params.work.threshold_base (nano::work_version::work_1));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2107,9 +2107,9 @@ TEST (rpc, DISABLED_work_peer_one)
 | 
			
		|||
	node2.config.work_peers.emplace_back (node1->network.endpoint ().address ().to_string (), rpc_ctx.rpc->listening_port ());
 | 
			
		||||
	nano::keypair key1;
 | 
			
		||||
	std::atomic<uint64_t> work (0);
 | 
			
		||||
	node2.work_generate (nano::work_version::work_1, key1.pub, node1->network_params.work.base, [&work] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.is_initialized ());
 | 
			
		||||
		work = *work_a;
 | 
			
		||||
	node2.work_generate (nano::work_version::work_1, key1.pub, node1->network_params.work.base, [&work] (std::optional<uint64_t> work_a) {
 | 
			
		||||
		ASSERT_TRUE (work_a.has_value ());
 | 
			
		||||
		work = work_a.value ();
 | 
			
		||||
	});
 | 
			
		||||
	ASSERT_TIMELY (5s, nano::dev::network_params.work.difficulty (nano::work_version::work_1, key1.pub, work) >= nano::dev::network_params.work.threshold_base (nano::work_version::work_1));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2138,7 +2138,7 @@ TEST (rpc, DISABLED_work_peer_many)
 | 
			
		|||
	for (auto & work : works)
 | 
			
		||||
	{
 | 
			
		||||
		nano::keypair key1;
 | 
			
		||||
		node1.work_generate (nano::work_version::work_1, key1.pub, node1.network_params.work.base, [&work] (boost::optional<uint64_t> work_a) {
 | 
			
		||||
		node1.work_generate (nano::work_version::work_1, key1.pub, node1.network_params.work.base, [&work] (std::optional<uint64_t> work_a) {
 | 
			
		||||
			work = *work_a;
 | 
			
		||||
		});
 | 
			
		||||
		while (nano::dev::network_params.work.difficulty (nano::work_version::work_1, key1.pub, work) < nano::dev::network_params.work.threshold_base (nano::work_version::work_1))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue