diff --git a/rai/core_test/node.cpp b/rai/core_test/node.cpp index 97966955..a3f5654f 100644 --- a/rai/core_test/node.cpp +++ b/rai/core_test/node.cpp @@ -661,7 +661,7 @@ TEST (node, block_replace) auto block3 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Gxrb_ratio)); ASSERT_NE (nullptr, block1); auto initial_work (block1->block_work ()); - while (system.work.work_value (block1->root (), block1->block_work ()) <= system.work.work_value (block1->root (), initial_work)) + while (rai::work_value (block1->root (), block1->block_work ()) <= rai::work_value (block1->root (), initial_work)) { system.nodes [1]->generate_work (*block1); } @@ -694,7 +694,7 @@ TEST (node, block_replace) } ASSERT_NE (initial_work, block1->block_work ()); ASSERT_EQ (block1->block_work (), block2->block_work ()); - ASSERT_GT (system.work.work_value (block2->root (), block2->block_work ()), system.work.work_value (block1->root (), initial_work)); + ASSERT_GT (rai::work_value (block2->root (), block2->block_work ()), rai::work_value (block1->root (), initial_work)); } TEST (node, fork_publish) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 8190949a..f1ee58a0 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -1028,8 +1028,8 @@ TEST (rpc, payment_begin_end) auto root1 (system.nodes [0]->ledger.latest_root (rai::transaction (wallet->store.environment, nullptr, false), account)); uint64_t work (0); auto iteration (0); - ASSERT_TRUE (system.work.work_validate (root1, work)); - while (system.work.work_validate (root1, work)) + ASSERT_TRUE (rai::work_validate (root1, work)); + while (rai::work_validate (root1, work)) { system.poll (); ASSERT_FALSE (wallet->store.work_get (rai::transaction (wallet->store.environment, nullptr, false), account, work)); @@ -1413,7 +1413,7 @@ TEST (rpc, work_generate) auto work1 (response1.json.get ("work")); uint64_t work2; ASSERT_FALSE (rai::from_string_hex (work1, work2)); - ASSERT_FALSE (system.work.work_validate (hash1, work2)); + ASSERT_FALSE (rai::work_validate (hash1, work2)); } TEST (rpc, work_cancel) @@ -1462,7 +1462,7 @@ TEST (rpc, work_peer_bad) { work = work_a; }); - while (system.work.work_validate (hash1, work)) + while (rai::work_validate (hash1, work)) { system.poll (); } @@ -1486,7 +1486,7 @@ TEST (rpc, work_peer_one) { work = work_a; }); - while (system.work.work_validate (key1.pub, work)) + while (rai::work_validate (key1.pub, work)) { system.poll (); } @@ -1527,7 +1527,7 @@ TEST (rpc, work_peer_many) { work = work_a; }); - while (system1.work.work_validate (key1.pub, work)) + while (rai::work_validate (key1.pub, work)) { system1.poll (); system2.poll (); diff --git a/rai/core_test/wallet.cpp b/rai/core_test/wallet.cpp index e85855ee..2f343106 100644 --- a/rai/core_test/wallet.cpp +++ b/rai/core_test/wallet.cpp @@ -603,7 +603,7 @@ TEST (wallet, empty_work) rai::system system (24000, 1); auto wallet (system.wallet (0)); rai::transaction transaction (system.nodes [0]->store.environment, nullptr, true); - ASSERT_FALSE (system.work.work_validate (1, wallet->work_fetch (transaction, 0, 1))); + ASSERT_FALSE (rai::work_validate (1, wallet->work_fetch (transaction, 0, 1))); } // Test work is precached when a key is inserted @@ -621,10 +621,10 @@ TEST (wallet, work) root1 = system.nodes [0]->ledger.latest_root (transaction, account1); work4 = wallet->work_fetch (transaction, account1, root1); } - ASSERT_FALSE (system.work.work_validate (root1, work4)); + ASSERT_FALSE (rai::work_validate (root1, work4)); uint64_t work3 (0); auto iteration (0); - while (system.work.work_validate (root1, work3)) + while (rai::work_validate (root1, work3)) { system.poll (); rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); @@ -664,7 +664,7 @@ TEST (wallet, work_generate) ++iterations2; ASSERT_LT (iterations2, 200); rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); - again = wallet->store.work_get (transaction, account1, work1) || system.work.work_validate (system.nodes [0]->ledger.latest_root (transaction, account1), work1); + again = wallet->store.work_get (transaction, account1, work1) || rai::work_validate (system.nodes [0]->ledger.latest_root (transaction, account1), work1); } } @@ -675,7 +675,7 @@ TEST (wallet, unsynced_work) rai::transaction transaction (system.nodes [0]->store.environment, nullptr, true); wallet->store.work_put (transaction, 0, 0); auto work1 (wallet->work_fetch (transaction, 0, 1)); - ASSERT_FALSE (system.work.work_validate (1, work1)); + ASSERT_FALSE (rai::work_validate (1, work1)); } TEST (wallet, insert_locked) diff --git a/rai/core_test/work_pool.cpp b/rai/core_test/work_pool.cpp index aef1624b..2b997e88 100644 --- a/rai/core_test/work_pool.cpp +++ b/rai/core_test/work_pool.cpp @@ -9,16 +9,16 @@ TEST (work, one) rai::work_pool pool (std::numeric_limits ::max (), nullptr); rai::change_block block (1, 1, rai::keypair ().prv, 3, 4); block.block_work_set (pool.generate (block.root ())); - ASSERT_FALSE (pool.work_validate (block)); + ASSERT_FALSE (rai::work_validate (block)); } TEST (work, validate) { rai::work_pool pool (std::numeric_limits ::max (), nullptr); rai::send_block send_block (1, 1, 2, rai::keypair ().prv, 4, 6); - ASSERT_TRUE (pool.work_validate (send_block)); + ASSERT_TRUE (rai::work_validate (send_block)); send_block.block_work_set (pool.generate (send_block.root ())); - ASSERT_FALSE (pool.work_validate (send_block)); + ASSERT_FALSE (rai::work_validate (send_block)); } TEST (work, cancel) @@ -66,7 +66,7 @@ TEST (work, DISABLED_opencl) { rai::random_pool.GenerateBlock (root.bytes.data (), root.bytes.size ()); auto result (pool.generate (root)); - ASSERT_FALSE (pool.work_validate (root, result)); + ASSERT_FALSE (rai::work_validate (root, result)); } } } diff --git a/rai/node/common.cpp b/rai/node/common.cpp index 45051b0a..7cfe933a 100644 --- a/rai/node/common.cpp +++ b/rai/node/common.cpp @@ -164,7 +164,7 @@ void rai::message_parser::deserialize_publish (uint8_t const * buffer_a, size_t auto error_l (incoming.deserialize (stream)); if (!error_l && at_end (stream)) { - if (!pool.work_validate (*incoming.block)) + if (!rai::work_validate (*incoming.block)) { visitor.publish (incoming); } @@ -186,7 +186,7 @@ void rai::message_parser::deserialize_confirm_req (uint8_t const * buffer_a, siz auto error_l (incoming.deserialize (stream)); if (!error_l && at_end (stream)) { - if (!pool.work_validate (*incoming.block)) + if (!rai::work_validate (*incoming.block)) { visitor.confirm_req (incoming); } @@ -208,7 +208,7 @@ void rai::message_parser::deserialize_confirm_ack (uint8_t const * buffer_a, siz rai::confirm_ack incoming (error_l, stream); if (!error_l && at_end (stream)) { - if (!pool.work_validate (*incoming.vote->block)) + if (!rai::work_validate (*incoming.vote->block)) { visitor.confirm_ack (incoming); } diff --git a/rai/node/node.cpp b/rai/node/node.cpp index 7bda1a9a..fa111816 100755 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -1219,7 +1219,7 @@ rai::process_return rai::block_processor::process_receive_one (MDB_txn * transac if (existing != nullptr) { // Replace block with one that has higher work value - if (node.work.work_value (root, block_a->block_work ()) > node.work.work_value (root, existing->block_work ())) + if (rai::work_value (root, block_a->block_work ()) > rai::work_value (root, existing->block_work ())) { node.store.block_put (transaction_a, hash, *block_a, node.store.block_successor (transaction_a, hash)); } @@ -2096,7 +2096,7 @@ void success (std::string const & body_a, boost::asio::ip::address const & addre uint64_t work; if (!rai::from_string_hex (work_text, work)) { - if (!node->work.work_validate (root, work)) + if (!rai::work_validate (root, work)) { set_once (work); stop (); diff --git a/rai/node/openclwork.cpp b/rai/node/openclwork.cpp index d81b9b60..476ff692 100644 --- a/rai/node/openclwork.cpp +++ b/rai/node/openclwork.cpp @@ -713,7 +713,7 @@ boost::optional rai::opencl_work::generate_work (rai::work_pool & poo uint64_t result (0); unsigned thread_count (config.threads); size_t work_size [] = { thread_count, 0, 0 }; - while (pool_a.work_validate (root_a, result) && !error) + while (rai::work_validate (root_a, result) && !error) { result = rand.next (); cl_int write_error1 = clEnqueueWriteBuffer (queue, attempt_buffer, false, 0, sizeof (uint64_t), &result, 0, nullptr, nullptr); diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 786cd382..693a6b81 100755 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -578,7 +578,7 @@ void rai::rpc_handler::account_representative_set () rai::account_info info; if (!node.store.account_get (transaction, account, info)) { - if (!node.work.work_validate (info.head, work)) + if (!rai::work_validate (info.head, work)) { existing->second->store.work_put (transaction, account, work); } @@ -2363,7 +2363,7 @@ void rai::rpc_handler::process () auto block (rai::deserialize_block_json (block_l)); if (block != nullptr) { - if (!node.work.work_validate (*block)) + if (!rai::work_validate (*block)) { auto hash (block->hash ()); node.block_arrival.add (hash); @@ -2540,7 +2540,7 @@ void rai::rpc_handler::receive () { head = account; } - if (!node.work.work_validate (head, work)) + if (!rai::work_validate (head, work)) { rai::transaction transaction_a (node.store.environment, nullptr, true); existing->second->store.work_put (transaction_a, account, work); @@ -2912,7 +2912,7 @@ void rai::rpc_handler::send () } if (work) { - if (!node.work.work_validate (info.head, work)) + if (!rai::work_validate (info.head, work)) { existing->second->store.work_put (transaction, source, work); } @@ -3997,7 +3997,7 @@ void rai::rpc_handler::work_validate () auto work_error (rai::from_string_hex (work_text, work)); if (!work_error) { - auto validate (node.work.work_validate (hash, work)); + auto validate (rai::work_validate (hash, work)); boost::property_tree::ptree response_l; response_l.put ("valid", validate ? "0" : "1"); response (response_l); diff --git a/rai/node/wallet.cpp b/rai/node/wallet.cpp index 539227d7..681f80a9 100644 --- a/rai/node/wallet.cpp +++ b/rai/node/wallet.cpp @@ -1028,7 +1028,7 @@ void rai::wallet::send_async (rai::account const & source_a, rai::account const // Update work for account if latest root is root_a void rai::wallet::work_update (MDB_txn * transaction_a, rai::account const & account_a, rai::block_hash const & root_a, uint64_t work_a) { - assert (!node.work.work_validate (root_a, work_a)); + assert (!rai::work_validate (root_a, work_a)); assert (store.exists (transaction_a, account_a)); auto latest (node.ledger.latest_root (transaction_a, account_a)); if (latest == root_a) @@ -1052,7 +1052,7 @@ uint64_t rai::wallet::work_fetch (MDB_txn * transaction_a, rai::account const & } else { - if (node.work.work_validate (root_a, result)) + if (rai::work_validate (root_a, result)) { BOOST_LOG (node.log) << "Cached work invalid, regenerating"; result = node.generate_work (root_a); @@ -1068,7 +1068,7 @@ void rai::wallet::work_ensure (MDB_txn * transaction_a, rai::account const & acc uint64_t work; auto error (store.work_get (transaction_a, account_a, work)); assert (!error); - if (node.work.work_validate (root, work)) + if (rai::work_validate (root, work)) { auto this_l (shared_from_this ()); node.background ([this_l, account_a, root] () { diff --git a/rai/node/work.cpp b/rai/node/work.cpp index 1fb45064..ccb54bea 100644 --- a/rai/node/work.cpp +++ b/rai/node/work.cpp @@ -5,6 +5,28 @@ #include +bool rai::work_validate (rai::block_hash const & root_a, uint64_t work_a) +{ + auto result (rai::work_value (root_a, work_a) < rai::work_pool::publish_threshold); + return result; +} + +bool rai::work_validate (rai::block const & block_a) +{ + return work_validate (block_a.root (), block_a.block_work ()); +} + +uint64_t rai::work_value (rai::block_hash const & root_a, uint64_t work_a) +{ + uint64_t result; + blake2b_state hash; + blake2b_init (&hash, sizeof (result)); + blake2b_update (&hash, reinterpret_cast (&work_a), sizeof (work_a)); + blake2b_update (&hash, root_a.bytes.data (), root_a.bytes.size ()); + blake2b_final (&hash, reinterpret_cast (&result), sizeof (result)); + return result; +} + rai::work_pool::work_pool (unsigned max_threads_a, std::unique_ptr opencl_a) : ticket (0), done (false), @@ -32,17 +54,6 @@ rai::work_pool::~work_pool () } } -uint64_t rai::work_pool::work_value (rai::block_hash const & root_a, uint64_t work_a) -{ - uint64_t result; - blake2b_state hash; - blake2b_init (&hash, sizeof (result)); - blake2b_update (&hash, reinterpret_cast (&work_a), sizeof (work_a)); - blake2b_update (&hash, root_a.bytes.data (), root_a.bytes.size ()); - blake2b_final (&hash, reinterpret_cast (&result), sizeof (result)); - return result; -} - void rai::work_pool::loop (uint64_t thread) { // Quick RNG for work attempts. @@ -134,17 +145,6 @@ void rai::work_pool::cancel (rai::uint256_union const & root_a) }); } -bool rai::work_pool::work_validate (rai::block_hash const & root_a, uint64_t work_a) -{ - auto result (work_value (root_a, work_a) < rai::work_pool::publish_threshold); - return result; -} - -bool rai::work_pool::work_validate (rai::block & block_a) -{ - return work_validate (block_a.root (), block_a.block_work ()); -} - void rai::work_pool::stop () { std::lock_guard lock (mutex); diff --git a/rai/node/work.hpp b/rai/node/work.hpp index c6a97412..dd4b0166 100644 --- a/rai/node/work.hpp +++ b/rai/node/work.hpp @@ -10,6 +10,9 @@ namespace rai { +bool work_validate (rai::block_hash const &, uint64_t); +bool work_validate (rai::block const &); +uint64_t work_value (rai::block_hash const &, uint64_t); class block; class opencl_work; class work_pool @@ -22,9 +25,6 @@ public: void cancel (rai::uint256_union const &); void generate (rai::uint256_union const &, std::function const &)>); uint64_t generate (rai::uint256_union const &); - uint64_t work_value (rai::block_hash const &, uint64_t); - bool work_validate (rai::block &); - bool work_validate (rai::block_hash const &, uint64_t); std::atomic ticket; bool done; std::vector threads; diff --git a/rai/qt_test/qt.cpp b/rai/qt_test/qt.cpp index 4610fde9..f4b1edff 100644 --- a/rai/qt_test/qt.cpp +++ b/rai/qt_test/qt.cpp @@ -661,7 +661,7 @@ TEST (wallet, seed_work_generation) ++iterations; ASSERT_LT (iterations, 200); } - ASSERT_FALSE (system.work.work_validate (system.nodes [0]->ledger.latest_root (rai::transaction (system.wallet (0)->store.environment, nullptr, false), key1), work)); + ASSERT_FALSE (rai::work_validate (system.nodes [0]->ledger.latest_root (rai::transaction (system.wallet (0)->store.environment, nullptr, false), key1), work)); } TEST (wallet, backup_seed) diff --git a/rai/rai_node/entry.cpp b/rai/rai_node/entry.cpp index 30bdb623..c6ffbe4a 100644 --- a/rai/rai_node/entry.cpp +++ b/rai/rai_node/entry.cpp @@ -362,7 +362,7 @@ int main (int argc, char * const * argv) { block.hashables.previous.qwords [0] += 1; block.block_work_set (t); - work.work_validate (block); + rai::work_validate (block); } auto end1 (std::chrono::high_resolution_clock::now ()); std::cerr << boost::str (boost::format ("%|1$ 12d|\n") % std::chrono::duration_cast (end1 - begin1).count ());