From 3ad699215669c2ab49c971d89a50456ccb335fa3 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Thu, 7 Mar 2024 15:29:53 +0000 Subject: [PATCH] Change block::link to return an std::optional if the block actually contains the field. --- nano/core_test/block.cpp | 10 +++---- nano/core_test/wallet.cpp | 12 ++++----- nano/core_test/wallets.cpp | 2 +- nano/lib/blocks.cpp | 11 ++++---- nano/lib/blocks.hpp | 6 ++--- nano/nano_node/entry.cpp | 12 ++++----- nano/node/blockprocessor.cpp | 3 ++- nano/node/bootstrap_ascending/service.cpp | 2 +- nano/node/confirmation_height_bounded.cpp | 2 +- nano/node/confirmation_height_unbounded.cpp | 2 +- nano/node/ipc/flatbuffers_util.cpp | 6 ++--- nano/node/json_handler.cpp | 16 +++++------ nano/node/node.cpp | 6 ++--- nano/node/websocket.cpp | 4 +-- nano/rpc_test/receivable.cpp | 30 ++++++++++----------- nano/rpc_test/rpc.cpp | 22 +++++++-------- nano/secure/ledger.cpp | 2 +- 17 files changed, 74 insertions(+), 74 deletions(-) diff --git a/nano/core_test/block.cpp b/nano/core_test/block.cpp index 1f04bb680d..cab5e34a2d 100644 --- a/nano/core_test/block.cpp +++ b/nano/core_test/block.cpp @@ -659,7 +659,7 @@ TEST (block_builder, state) ASSERT_EQ (block->hash ().to_string (), "2D243F8F92CDD0AD94A1D456A6B15F3BE7A6FCBD98D4C5831D06D15C818CD81F"); ASSERT_FALSE (block->source_field ()); ASSERT_FALSE (block->destination_field ()); - ASSERT_EQ (block->link ().to_string (), "E16DD58C1EFA8B521545B0A74375AA994D9FC43828A4266D75ECF57F07A7EE86"); + ASSERT_EQ (block->link ().value ().to_string (), "E16DD58C1EFA8B521545B0A74375AA994D9FC43828A4266D75ECF57F07A7EE86"); } TEST (block_builder, state_missing_rep) @@ -732,7 +732,7 @@ TEST (block_builder, open) ASSERT_EQ (block->hash ().to_string (), "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948"); ASSERT_EQ (block->source_field ().value ().to_string (), "E89208DD038FBB269987689621D52292AE9C35941A7484756ECCED92A65093BA"); ASSERT_FALSE (block->destination_field ()); - ASSERT_TRUE (block->link ().is_zero ()); + ASSERT_FALSE (block->link ()); } TEST (block_builder, open_equality) @@ -771,7 +771,7 @@ TEST (block_builder, change) ASSERT_EQ (block->hash ().to_string (), "13552AC3928E93B5C6C215F61879358E248D4A5246B8B3D1EEC5A566EDCEE077"); ASSERT_FALSE (block->source_field ()); ASSERT_FALSE (block->destination_field ()); - ASSERT_TRUE (block->link ().is_zero ()); + ASSERT_FALSE (block->link ()); } TEST (block_builder, change_equality) @@ -810,7 +810,7 @@ TEST (block_builder, send) ASSERT_EQ (block->hash ().to_string (), "4560E7B1F3735D082700CFC2852F5D1F378F7418FD24CEF1AD45AB69316F15CD"); ASSERT_FALSE (block->source_field ()); ASSERT_EQ (block->destination_field ().value ().to_account (), "nano_1gys8r4crpxhp94n4uho5cshaho81na6454qni5gu9n53gksoyy1wcd4udyb"); - ASSERT_TRUE (block->link ().is_zero ()); + ASSERT_FALSE (block->link ()); } TEST (block_builder, send_equality) @@ -872,5 +872,5 @@ TEST (block_builder, receive) ASSERT_EQ (block->hash ().to_string (), "6C004BF911D9CF2ED75CF6EC45E795122AD5D093FF5A83EDFBA43EC4A3EDC722"); ASSERT_EQ (block->source_field ().value ().to_string (), "7B2B0A29C1B235FDF9B4DEF2984BB3573BD1A52D28246396FBB3E4C5FE662135"); ASSERT_FALSE (block->destination_field ()); - ASSERT_TRUE (block->link ().is_zero ()); + ASSERT_FALSE (block->link ()); } diff --git a/nano/core_test/wallet.cpp b/nano/core_test/wallet.cpp index ab107d56a4..c1a56fc5d5 100644 --- a/nano/core_test/wallet.cpp +++ b/nano/core_test/wallet.cpp @@ -1001,7 +1001,7 @@ TEST (wallet, epoch_2_validation) ASSERT_EQ (nano::epoch::epoch_2, send->sideband ().details.epoch); ASSERT_EQ (nano::epoch::epoch_0, send->sideband ().source_epoch); // Not used for send state blocks - auto receive = wallet.receive_action (send->hash (), nano::dev::genesis_key.pub, amount, send->link ().as_account (), 1); + auto receive = wallet.receive_action (send->hash (), nano::dev::genesis_key.pub, amount, send->link ().value ().as_account (), 1); ASSERT_NE (nullptr, receive); if (nano::dev::network_params.work.difficulty (*receive) < node.network_params.work.base) { @@ -1043,7 +1043,7 @@ TEST (wallet, epoch_2_receive_propagation) auto amount = node.config.receive_minimum.number (); auto send1 = wallet.send_action (nano::dev::genesis_key.pub, key.pub, amount, 1); ASSERT_NE (nullptr, send1); - ASSERT_NE (nullptr, wallet.receive_action (send1->hash (), nano::dev::genesis_key.pub, amount, send1->link ().as_account (), 1)); + ASSERT_NE (nullptr, wallet.receive_action (send1->hash (), nano::dev::genesis_key.pub, amount, send1->link ().value ().as_account (), 1)); // Upgrade the genesis account to epoch 2 auto epoch2 = system.upgrade_genesis_epoch (node, nano::epoch::epoch_2); @@ -1053,7 +1053,7 @@ TEST (wallet, epoch_2_receive_propagation) auto send2 = wallet.send_action (nano::dev::genesis_key.pub, key.pub, amount, 1); ASSERT_NE (nullptr, send2); - auto receive2 = wallet.receive_action (send2->hash (), key.pub, amount, send2->link ().as_account (), 1); + auto receive2 = wallet.receive_action (send2->hash (), key.pub, amount, send2->link ().value ().as_account (), 1); ASSERT_NE (nullptr, receive2); if (nano::dev::network_params.work.difficulty (*receive2) < node.network_params.work.base) { @@ -1106,7 +1106,7 @@ TEST (wallet, epoch_2_receive_unopened) wallet.insert_adhoc (key.prv, false); - auto receive1 = wallet.receive_action (send1->hash (), key.pub, amount, send1->link ().as_account (), 1); + auto receive1 = wallet.receive_action (send1->hash (), key.pub, amount, send1->link ().value ().as_account (), 1); ASSERT_NE (nullptr, receive1); if (nano::dev::network_params.work.difficulty (*receive1) < node.network_params.work.base) { @@ -1190,7 +1190,7 @@ TEST (wallet, search_receivable) auto receive = node.block (receive_hash); ASSERT_NE (nullptr, receive); ASSERT_EQ (receive->sideband ().height, 3); - ASSERT_EQ (send->hash (), receive->link ().as_block_hash ()); + ASSERT_EQ (send->hash (), receive->link ().value ().as_block_hash ()); } TEST (wallet, receive_pruned) @@ -1228,7 +1228,7 @@ TEST (wallet, receive_pruned) wallet2.insert_adhoc (key.prv, false); - auto open1 = wallet2.receive_action (send1->hash (), key.pub, amount, send1->link ().as_account (), 1); + auto open1 = wallet2.receive_action (send1->hash (), key.pub, amount, send1->link ().value ().as_account (), 1); ASSERT_NE (nullptr, open1); ASSERT_EQ (amount, node2.ledger.balance (node2.store.tx_begin_read (), open1->hash ())); ASSERT_TIMELY_EQ (5s, node2.ledger.cache.cemented_count, 4); diff --git a/nano/core_test/wallets.cpp b/nano/core_test/wallets.cpp index bbff7d287d..c596cad9c5 100644 --- a/nano/core_test/wallets.cpp +++ b/nano/core_test/wallets.cpp @@ -254,6 +254,6 @@ TEST (wallets, search_receivable) auto receive = node.block (receive_hash); ASSERT_NE (nullptr, receive); ASSERT_EQ (receive->sideband ().height, 3); - ASSERT_EQ (send->hash (), receive->link ().as_block_hash ()); + ASSERT_EQ (send->hash (), receive->link ().value ().as_block_hash ()); } } diff --git a/nano/lib/blocks.cpp b/nano/lib/blocks.cpp index 4618e1a793..c788cc4efc 100644 --- a/nano/lib/blocks.cpp +++ b/nano/lib/blocks.cpp @@ -177,10 +177,9 @@ std::optional nano::block::destination_field () const return std::nullopt; } -nano::link const & nano::block::link () const +std::optional nano::block::link () const { - static nano::link link{ 0 }; - return link; + return std::nullopt; } nano::account nano::block::account () const @@ -226,7 +225,7 @@ nano::account nano::block::destination () const return destination_field ().value (); case nano::block_type::state: release_assert (sideband ().details.is_send); - return link ().as_account (); + return link ().value ().as_account (); default: release_assert (false); } @@ -242,7 +241,7 @@ nano::block_hash nano::block::source () return source_field ().value (); case nano::block_type::state: release_assert (sideband ().details.is_receive); - return link ().as_block_hash (); + return link ().value ().as_block_hash (); default: release_assert (false); } @@ -1424,7 +1423,7 @@ nano::root const & nano::state_block::root () const } } -nano::link const & nano::state_block::link () const +std::optional nano::state_block::link () const { return hashables.link; } diff --git a/nano/lib/blocks.hpp b/nano/lib/blocks.hpp index 1251249c62..178721cfbb 100644 --- a/nano/lib/blocks.hpp +++ b/nano/lib/blocks.hpp @@ -39,8 +39,6 @@ class block virtual nano::root const & root () const = 0; // Qualified root value based on previous() and root() virtual nano::qualified_root qualified_root () const; - // Link field for state blocks, zero otherwise. - virtual nano::link const & link () const; virtual nano::account const & representative () const; virtual void serialize (nano::stream &) const = 0; virtual void serialize_json (std::string &, bool = false) const = 0; @@ -71,6 +69,8 @@ class block nano::account destination () const; // Destination account for send blocks virtual std::optional destination_field () const; + // Link field for state blocks + virtual std::optional link () const; // Returns the source block hash for open/receive/state blocks that are receives nano::block_hash source (); // Source block for open/receive blocks @@ -344,7 +344,6 @@ class state_block : public nano::block void block_work_set (uint64_t) override; nano::block_hash const & previous () const override; nano::root const & root () const override; - nano::link const & link () const override; nano::account const & representative () const override; void serialize (nano::stream &) const override; bool deserialize (nano::stream &); @@ -367,6 +366,7 @@ class state_block : public nano::block public: // State block fields std::optional account_field () const override; std::optional balance_field () const override; + std::optional link () const override; public: // Logging void operator() (nano::object_stream &) const override; diff --git a/nano/nano_node/entry.cpp b/nano/nano_node/entry.cpp index 3c5b79a6b8..a01d25b1f9 100644 --- a/nano/nano_node/entry.cpp +++ b/nano/nano_node/entry.cpp @@ -1501,7 +1501,7 @@ int main (int argc, char * const * argv) { if ((state_block.hashables.balance == prev_balance && !error_or_pruned) || (node->ledger.pruning && error_or_pruned && block->sideband ().details.is_epoch)) { - invalid = validate_message (node->ledger.epoch_signer (block->link ()), hash, block->block_signature ()); + invalid = validate_message (node->ledger.epoch_signer (block->link ().value ()), hash, block->block_signature ()); } } } @@ -1529,12 +1529,12 @@ int main (int argc, char * const * argv) } else { - if (block->link ().is_zero ()) + if (block->link ().value ().is_zero ()) { // State change block_details_error = sideband.details.is_send || sideband.details.is_receive || sideband.details.is_epoch; } - else if (block->balance () == prev_balance.value () && node->ledger.is_epoch_link (block->link ())) + else if (block->balance () == prev_balance.value () && node->ledger.is_epoch_link (block->link ().value ())) { // State epoch block_details_error = !sideband.details.is_epoch || sideband.details.is_send || sideband.details.is_receive; @@ -1543,7 +1543,7 @@ int main (int argc, char * const * argv) { // State receive block_details_error = !sideband.details.is_receive || sideband.details.is_send || sideband.details.is_epoch; - block_details_error |= !node->ledger.block_or_pruned_exists (transaction, block->link ().as_block_hash ()); + block_details_error |= !node->ledger.block_or_pruned_exists (transaction, block->link ().value ().as_block_hash ()); } } } @@ -1557,7 +1557,7 @@ int main (int argc, char * const * argv) print_error_message (boost::str (boost::format ("Incorrect sideband block details for block %1%\n") % hash.to_string ())); } // Check link epoch version - if (sideband.details.is_receive && (!node->ledger.pruning || !node->store.pruned.exists (transaction, block->link ().as_block_hash ()))) + if (sideband.details.is_receive && (!node->ledger.pruning || !node->store.pruned.exists (transaction, block->source ()))) { if (sideband.source_epoch != node->ledger.version (*block)) { @@ -1809,7 +1809,7 @@ int main (int argc, char * const * argv) std::cout << boost::str (boost::format ("%1% blocks retrieved") % count) << std::endl; } node.node->block_processor.add (block); - if (block->type () == nano::block_type::state && block->previous ().is_zero () && source_node->ledger.is_epoch_link (block->link ())) + if (block->type () == nano::block_type::state && block->previous ().is_zero () && source_node->ledger.is_epoch_link (block->link ().value ())) { // Epoch open blocks can be rejected without processed pending blocks to account, push it later again epoch_open_blocks.push_back (block); diff --git a/nano/node/blockprocessor.cpp b/nano/node/blockprocessor.cpp index 2ad55c09cc..d968a312e2 100644 --- a/nano/node/blockprocessor.cpp +++ b/nano/node/blockprocessor.cpp @@ -356,7 +356,8 @@ nano::block_status nano::block_processor::process_one (store::write_transaction } case nano::block_status::gap_source: { - node.unchecked.put (block->source_field ().value_or (block->link ().as_block_hash ()), block); + release_assert (block->source_field () || block->link ()); + node.unchecked.put (block->source_field ().value_or (block->link ().value_or (0).as_block_hash ()), block); node.stats.inc (nano::stat::type::ledger, nano::stat::detail::gap_source); break; } diff --git a/nano/node/bootstrap_ascending/service.cpp b/nano/node/bootstrap_ascending/service.cpp index 0643fd3149..a614f0e34b 100644 --- a/nano/node/bootstrap_ascending/service.cpp +++ b/nano/node/bootstrap_ascending/service.cpp @@ -152,7 +152,7 @@ void nano::bootstrap_ascending::service::inspect (store::transaction const & tx, case nano::block_status::gap_source: { const auto account = block.previous ().is_zero () ? block.account_field ().value () : ledger.account (tx, block.previous ()).value (); - const auto source = block.source_field ().value_or (block.link ().as_block_hash ()); + const auto source = block.source_field ().value_or (block.link ().value_or (0).as_block_hash ()); // Mark account as blocked because it is missing the source block accounts.block (account, source); diff --git a/nano/node/confirmation_height_bounded.cpp b/nano/node/confirmation_height_bounded.cpp index cce7747a9d..459b835abb 100644 --- a/nano/node/confirmation_height_bounded.cpp +++ b/nano/node/confirmation_height_bounded.cpp @@ -253,7 +253,7 @@ bool nano::confirmation_height_bounded::iterate (store::read_transaction const & // Once a receive is cemented, we can cement all blocks above it until the next receive, so store those details for later. ++num_blocks; auto block = ledger.block (transaction_a, hash); - auto source = block->source_field ().value_or (block->link ().as_block_hash ()); + auto source = block->source_field ().value_or (block->link ().value_or (0).as_block_hash ()); if (!source.is_zero () && !ledger.is_epoch_link (source) && ledger.block_exists (transaction_a, source)) { hit_receive = true; diff --git a/nano/node/confirmation_height_unbounded.cpp b/nano/node/confirmation_height_unbounded.cpp index 61aa6a9591..807743b76b 100644 --- a/nano/node/confirmation_height_unbounded.cpp +++ b/nano/node/confirmation_height_unbounded.cpp @@ -212,7 +212,7 @@ void nano::confirmation_height_unbounded::collect_unconfirmed_receive_and_source if (block) { - auto source = block->source_field ().value_or (block->link ().as_block_hash ()); + auto source = block->source_field ().value_or (block->link ().value_or (0).as_block_hash ()); if (!source.is_zero () && !ledger.is_epoch_link (source) && ledger.block_exists (transaction_a, source)) { if (!hit_receive && !block_callback_data_a.empty ()) diff --git a/nano/node/ipc/flatbuffers_util.cpp b/nano/node/ipc/flatbuffers_util.cpp index 57afdecf33..de252a0792 100644 --- a/nano/node/ipc/flatbuffers_util.cpp +++ b/nano/node/ipc/flatbuffers_util.cpp @@ -11,8 +11,8 @@ std::unique_ptr nano::ipc::flatbuffers_builder::from (nano block->previous = block_a.previous ().to_string (); block->representative = block_a.representative ().to_account (); block->balance = block_a.balance ().to_string_dec (); - block->link = block_a.link ().to_string (); - block->link_as_account = block_a.link ().to_account (); + block->link = block_a.link ().value ().to_string (); + block->link_as_account = block_a.link ().value ().to_account (); block_a.signature.encode_hex (block->signature); block->work = nano::to_string_hex (block_a.work); @@ -20,7 +20,7 @@ std::unique_ptr nano::ipc::flatbuffers_builder::from (nano { block->subtype = nanoapi::BlockSubType::BlockSubType_send; } - else if (block_a.link ().is_zero ()) + else if (block_a.link ().value ().is_zero ()) { block->subtype = nanoapi::BlockSubType::BlockSubType_change; } diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index 8c5acd755d..8a5e185fc6 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -411,12 +411,12 @@ uint64_t nano::json_handler::difficulty_ledger (nano::block const & block_a) { details.epoch = block_previous->sideband ().details.epoch; } - auto link (block_a.link ()); - if (!link.is_zero () && !details.is_send) + auto link = block_a.link (); + if (link && !details.is_send) { - auto block_link = node.ledger.block (transaction, link.as_block_hash ()); + auto block_link = node.ledger.block (transaction, link.value ().as_block_hash ()); auto account = block_a.account_field ().value (); // Link is non-zero therefore it's a state block and has an account field; - if (block_link != nullptr && node.store.pending.exists (transaction, nano::pending_key (account, link.as_block_hash ()))) + if (block_link != nullptr && node.store.pending.exists (transaction, nano::pending_key (account, link.value ().as_block_hash ()))) { details.epoch = std::max (details.epoch, block_link->sideband ().details.epoch); details.is_receive = true; @@ -1224,7 +1224,7 @@ void nano::json_handler::block_confirm () if (auto state = dynamic_cast (block_l.get ())) { is_state_send = node.ledger.is_send (transaction, *state); - is_state_epoch = amount.value () == 0 && node.ledger.is_epoch_link (state->link ()); + is_state_epoch = amount.value () == 0 && node.ledger.is_epoch_link (state->link ().value ()); } } node.observers.blocks.notify (status, {}, account, amount ? amount.value () : 0, is_state_send, is_state_epoch); @@ -2522,7 +2522,7 @@ class history_visitor : public nano::block_visitor if (raw && accounts_filter.empty ()) { tree.put ("subtype", "epoch"); - tree.put ("account", handler.node.ledger.epoch_signer (block_a.link ()).to_account ()); + tree.put ("account", handler.node.ledger.epoch_signer (block_a.link ().value ()).to_account ()); } } else @@ -3641,7 +3641,7 @@ void nano::json_handler::republish () block = node.ledger.block (transaction, hash); if (sources != 0) // Republish source chain { - nano::block_hash source = block->source_field ().value_or (block->link ().as_block_hash ()); + nano::block_hash source = block->source_field ().value_or (block->link ().value_or (0).as_block_hash ()); auto block_a = node.ledger.block (transaction, source); std::vector hashes; while (block_a != nullptr && hashes.size () < sources) @@ -3679,7 +3679,7 @@ void nano::json_handler::republish () while (block_d != nullptr && hash != source) { hashes.push_back (previous); - source = block_d->source_field ().value_or (block_d->sideband ().details.is_send ? 0 : block_d->link ().as_block_hash ()); + source = block_d->source_field ().value_or (block_d->sideband ().details.is_send ? 0 : block_d->link ().value_or (0).as_block_hash ()); previous = block_d->previous (); block_d = node.ledger.block (transaction, previous); } diff --git a/nano/node/node.cpp b/nano/node/node.cpp index fe292f7f7b..608fb375ca 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -260,13 +260,13 @@ nano::node::node (boost::asio::io_context & io_ctx_a, std::filesystem::path cons // Subtype field else if (block_a->type () == nano::block_type::state) { - if (block_a->link ().is_zero ()) + if (block_a->link ().value ().is_zero ()) { event.add ("subtype", "change"); } else if (is_state_epoch_a) { - debug_assert (amount_a == 0 && node_l->ledger.is_epoch_link (block_a->link ())); + debug_assert (amount_a == 0 && node_l->ledger.is_epoch_link (block_a->link ().value ())); event.add ("subtype", "epoch"); } else @@ -1252,7 +1252,7 @@ void nano::node::process_confirmed_data (store::transaction const & transaction_ { is_state_send_a = true; } - if (amount_a == 0 && network_params.ledger.epochs.is_epoch_link (state->link ())) + if (amount_a == 0 && network_params.ledger.epochs.is_epoch_link (state->link ().value ())) { is_state_epoch_a = true; } diff --git a/nano/node/websocket.cpp b/nano/node/websocket.cpp index dbd16637ab..eee9297fe8 100644 --- a/nano/node/websocket.cpp +++ b/nano/node/websocket.cpp @@ -1012,13 +1012,13 @@ nano::websocket_server::websocket_server (nano::websocket::config & config_a, na } else if (block_a->type () == nano::block_type::state) { - if (block_a->link ().is_zero ()) + if (block_a->link ().value ().is_zero ()) { subtype = "change"; } else if (is_state_epoch_a) { - debug_assert (amount_a == 0 && ledger.is_epoch_link (block_a->link ())); + debug_assert (amount_a == 0 && ledger.is_epoch_link (block_a->link ().value ())); subtype = "epoch"; } else diff --git a/nano/rpc_test/receivable.cpp b/nano/rpc_test/receivable.cpp index 236165745e..f7a0a45cbf 100644 --- a/nano/rpc_test/receivable.cpp +++ b/nano/rpc_test/receivable.cpp @@ -21,7 +21,7 @@ TEST (rpc, receivable) auto const rpc_ctx = add_rpc (system, node); boost::property_tree::ptree request; request.put ("action", "receivable"); - request.put ("account", block1->link ().to_account ()); + request.put ("account", block1->link ().value ().to_account ()); auto response = wait_response (system, rpc_ctx, request); auto & blocks_node = response.get_child ("blocks"); ASSERT_EQ (1, blocks_node.size ()); @@ -39,7 +39,7 @@ TEST (rpc, receivable_sorting) auto const rpc_ctx = add_rpc (system, node); boost::property_tree::ptree request; request.put ("action", "receivable"); - request.put ("account", block1->link ().to_account ()); + request.put ("account", block1->link ().value ().to_account ()); request.put ("sorting", "true"); // Sorting test auto response = wait_response (system, rpc_ctx, request); auto & blocks_node = response.get_child ("blocks"); @@ -60,7 +60,7 @@ TEST (rpc, receivable_threshold_sufficient) auto const rpc_ctx = add_rpc (system, node); boost::property_tree::ptree request; request.put ("action", "receivable"); - request.put ("account", block1->link ().to_account ()); + request.put ("account", block1->link ().value ().to_account ()); request.put ("threshold", "1"); // Threshold test auto response = wait_response (system, rpc_ctx, request); auto & blocks_node = response.get_child ("blocks"); @@ -91,7 +91,7 @@ TEST (rpc, receivable_threshold_insufficient) auto const rpc_ctx = add_rpc (system, node); boost::property_tree::ptree request; request.put ("action", "receivable"); - request.put ("account", block1->link ().to_account ()); + request.put ("account", block1->link ().value ().to_account ()); request.put ("threshold", "2"); // Chains are set up with 1 raw transfers therefore all blocks are less than 2 raw. auto response = wait_response (system, rpc_ctx, request, 10s); auto & blocks_node = response.get_child ("blocks"); @@ -108,7 +108,7 @@ TEST (rpc, receivable_source_min_version) auto const rpc_ctx = add_rpc (system, node); boost::property_tree::ptree request; request.put ("action", "receivable"); - request.put ("account", block1->link ().to_account ()); + request.put ("account", block1->link ().value ().to_account ()); request.put ("source", "true"); request.put ("min_version", "true"); auto response (wait_response (system, rpc_ctx, request)); @@ -140,7 +140,7 @@ TEST (rpc, receivable_unconfirmed) auto const rpc_ctx = add_rpc (system, node); boost::property_tree::ptree request; request.put ("action", "receivable"); - request.put ("account", block1->link ().to_account ()); + request.put ("account", block1->link ().value ().to_account ()); ASSERT_TRUE (check_block_response_count (system, rpc_ctx, request, 0)); request.put ("include_only_confirmed", "true"); ASSERT_TRUE (check_block_response_count (system, rpc_ctx, request, 0)); @@ -410,14 +410,14 @@ TEST (rpc, accounts_receivable_blocks) request.put ("action", "accounts_receivable"); boost::property_tree::ptree entry; boost::property_tree::ptree peers_l; - entry.put ("", block1->link ().to_account ()); + entry.put ("", block1->link ().value ().to_account ()); peers_l.push_back (std::make_pair ("", entry)); request.add_child ("accounts", peers_l); auto response = wait_response (system, rpc_ctx, request); for (auto & blocks : response.get_child ("blocks")) { std::string account_text{ blocks.first }; - ASSERT_EQ (block1->link ().to_account (), account_text); + ASSERT_EQ (block1->link ().value ().to_account (), account_text); nano::block_hash hash1{ blocks.second.begin ()->second.get ("") }; ASSERT_EQ (block1->hash (), hash1); } @@ -436,7 +436,7 @@ TEST (rpc, accounts_receivable_sorting) request.put ("action", "accounts_receivable"); boost::property_tree::ptree entry; boost::property_tree::ptree peers_l; - entry.put ("", block1->link ().to_account ()); + entry.put ("", block1->link ().value ().to_account ()); peers_l.push_back (std::make_pair ("", entry)); request.add_child ("accounts", peers_l); request.put ("sorting", "true"); // Sorting test @@ -444,7 +444,7 @@ TEST (rpc, accounts_receivable_sorting) for (auto & blocks : response.get_child ("blocks")) { std::string account_text{ blocks.first }; - ASSERT_EQ (block1->link ().to_account (), account_text); + ASSERT_EQ (block1->link ().value ().to_account (), account_text); nano::block_hash hash1{ blocks.second.begin ()->first }; ASSERT_EQ (block1->hash (), hash1); std::string amount{ blocks.second.begin ()->second.get ("") }; @@ -465,7 +465,7 @@ TEST (rpc, accounts_receivable_threshold) request.put ("action", "accounts_receivable"); boost::property_tree::ptree entry; boost::property_tree::ptree peers_l; - entry.put ("", block1->link ().to_account ()); + entry.put ("", block1->link ().value ().to_account ()); peers_l.push_back (std::make_pair ("", entry)); request.add_child ("accounts", peers_l); request.put ("threshold", "1"); // Threshold test @@ -474,7 +474,7 @@ TEST (rpc, accounts_receivable_threshold) for (auto & pending : response.get_child ("blocks")) { std::string account_text{ pending.first }; - ASSERT_EQ (block1->link ().to_account (), account_text); + ASSERT_EQ (block1->link ().value ().to_account (), account_text); for (auto i (pending.second.begin ()), j (pending.second.end ()); i != j; ++i) { nano::block_hash hash; @@ -501,7 +501,7 @@ TEST (rpc, accounts_receivable_source) request.put ("action", "accounts_receivable"); boost::property_tree::ptree entry; boost::property_tree::ptree peers_l; - entry.put ("", block1->link ().to_account ()); + entry.put ("", block1->link ().value ().to_account ()); peers_l.push_back (std::make_pair ("", entry)); request.add_child ("accounts", peers_l); request.put ("source", "true"); @@ -512,7 +512,7 @@ TEST (rpc, accounts_receivable_source) for (auto & pending : response.get_child ("blocks")) { std::string account_text (pending.first); - ASSERT_EQ (block1->link ().to_account (), account_text); + ASSERT_EQ (block1->link ().value ().to_account (), account_text); for (auto i (pending.second.begin ()), j (pending.second.end ()); i != j; ++i) { nano::block_hash hash; @@ -540,7 +540,7 @@ TEST (rpc, accounts_receivable_confirmed) request.put ("action", "accounts_receivable"); boost::property_tree::ptree entry; boost::property_tree::ptree peers_l; - entry.put ("", block1->link ().to_account ()); + entry.put ("", block1->link ().value ().to_account ()); peers_l.push_back (std::make_pair ("", entry)); request.add_child ("accounts", peers_l); diff --git a/nano/rpc_test/rpc.cpp b/nano/rpc_test/rpc.cpp index 16fd731465..b188faae14 100644 --- a/nano/rpc_test/rpc.cpp +++ b/nano/rpc_test/rpc.cpp @@ -923,7 +923,7 @@ TEST (rpc, history) ASSERT_NE (nullptr, change); auto send (system.wallet (0)->send_action (nano::dev::genesis_key.pub, nano::dev::genesis_key.pub, node0->config.receive_minimum.number ())); ASSERT_NE (nullptr, send); - auto receive (system.wallet (0)->receive_action (send->hash (), nano::dev::genesis_key.pub, node0->config.receive_minimum.number (), send->link ().as_account ())); + auto receive (system.wallet (0)->receive_action (send->hash (), nano::dev::genesis_key.pub, node0->config.receive_minimum.number (), send->link ().value ().as_account ())); ASSERT_NE (nullptr, receive); nano::block_builder builder; auto usend = builder @@ -1007,7 +1007,7 @@ TEST (rpc, account_history) ASSERT_NE (nullptr, change); auto send (system.wallet (0)->send_action (nano::dev::genesis_key.pub, nano::dev::genesis_key.pub, node0->config.receive_minimum.number ())); ASSERT_NE (nullptr, send); - auto receive (system.wallet (0)->receive_action (send->hash (), nano::dev::genesis_key.pub, node0->config.receive_minimum.number (), send->link ().as_account ())); + auto receive (system.wallet (0)->receive_action (send->hash (), nano::dev::genesis_key.pub, node0->config.receive_minimum.number (), send->link ().value ().as_account ())); ASSERT_NE (nullptr, receive); nano::block_builder builder; auto usend = builder @@ -1110,7 +1110,7 @@ TEST (rpc, account_history) auto account2 (system.wallet (0)->deterministic_insert ()); auto send2 (system.wallet (0)->send_action (nano::dev::genesis_key.pub, account2, node0->config.receive_minimum.number ())); ASSERT_NE (nullptr, send2); - auto receive2 (system.wallet (0)->receive_action (send2->hash (), account2, node0->config.receive_minimum.number (), send2->link ().as_account ())); + auto receive2 (system.wallet (0)->receive_action (send2->hash (), account2, node0->config.receive_minimum.number (), send2->link ().value ().as_account ())); // Test filter for send state blocks ASSERT_NE (nullptr, receive2); { @@ -1153,7 +1153,7 @@ TEST (rpc, history_count) ASSERT_NE (nullptr, change); auto send (system.wallet (0)->send_action (nano::dev::genesis_key.pub, nano::dev::genesis_key.pub, node->config.receive_minimum.number ())); ASSERT_NE (nullptr, send); - auto receive (system.wallet (0)->receive_action (send->hash (), nano::dev::genesis_key.pub, node->config.receive_minimum.number (), send->link ().as_account ())); + auto receive (system.wallet (0)->receive_action (send->hash (), nano::dev::genesis_key.pub, node->config.receive_minimum.number (), send->link ().value ().as_account ())); ASSERT_NE (nullptr, receive); auto const rpc_ctx = add_rpc (system, node); boost::property_tree::ptree request; @@ -4126,10 +4126,10 @@ TEST (rpc, blocks_info_receive_hash) auto send4 = system.wallet (0)->send_action (nano::dev::genesis_key.pub, key1.pub, 4); // do 4 receives, mix up the ordering a little - auto recv1 (system.wallet (0)->receive_action (send1->hash (), key1.pub, node->config.receive_minimum.number (), send1->link ().as_account ())); - auto recv4 (system.wallet (0)->receive_action (send4->hash (), key1.pub, node->config.receive_minimum.number (), send4->link ().as_account ())); - auto recv3 (system.wallet (0)->receive_action (send3->hash (), key1.pub, node->config.receive_minimum.number (), send3->link ().as_account ())); - auto recv2 (system.wallet (0)->receive_action (send2->hash (), key1.pub, node->config.receive_minimum.number (), send2->link ().as_account ())); + auto recv1 (system.wallet (0)->receive_action (send1->hash (), key1.pub, node->config.receive_minimum.number (), send1->link ().value ().as_account ())); + auto recv4 (system.wallet (0)->receive_action (send4->hash (), key1.pub, node->config.receive_minimum.number (), send4->link ().value ().as_account ())); + auto recv3 (system.wallet (0)->receive_action (send3->hash (), key1.pub, node->config.receive_minimum.number (), send3->link ().value ().as_account ())); + auto recv2 (system.wallet (0)->receive_action (send2->hash (), key1.pub, node->config.receive_minimum.number (), send2->link ().value ().as_account ())); // function to check that all 4 receive blocks are cemented auto all_blocks_cemented = [node, &key1] () -> bool { @@ -4192,7 +4192,7 @@ TEST (rpc, blocks_info_subtype) system.wallet (0)->insert_adhoc (key.prv); auto send (system.wallet (0)->send_action (nano::dev::genesis_key.pub, nano::dev::genesis_key.pub, nano::Gxrb_ratio)); ASSERT_NE (nullptr, send); - auto receive (system.wallet (0)->receive_action (send->hash (), key.pub, nano::Gxrb_ratio, send->link ().as_account ())); + auto receive (system.wallet (0)->receive_action (send->hash (), key.pub, nano::Gxrb_ratio, send->link ().value ().as_account ())); ASSERT_NE (nullptr, receive); auto change (system.wallet (0)->change_action (nano::dev::genesis_key.pub, key.pub)); ASSERT_NE (nullptr, change); @@ -5177,7 +5177,7 @@ TEST (rpc, online_reps) auto send (system.wallet (0)->send_action (nano::dev::genesis_key.pub, new_rep, node1->config.receive_minimum.number ())); ASSERT_NE (nullptr, send); ASSERT_TIMELY (10s, node2->block (send->hash ())); - auto receive (system.wallet (1)->receive_action (send->hash (), new_rep, node1->config.receive_minimum.number (), send->link ().as_account ())); + auto receive (system.wallet (1)->receive_action (send->hash (), new_rep, node1->config.receive_minimum.number (), send->link ().value ().as_account ())); ASSERT_NE (nullptr, receive); ASSERT_TIMELY (5s, node2->block (receive->hash ())); auto change (system.wallet (0)->change_action (nano::dev::genesis_key.pub, new_rep)); @@ -5666,7 +5666,7 @@ TEST (rpc, DISABLED_wallet_history) auto send (system.wallet (0)->send_action (nano::dev::genesis_key.pub, nano::dev::genesis_key.pub, node->config.receive_minimum.number ())); ASSERT_NE (nullptr, send); auto timestamp2 = nano::seconds_since_epoch (); - auto receive (system.wallet (0)->receive_action (send->hash (), nano::dev::genesis_key.pub, node->config.receive_minimum.number (), send->link ().as_account ())); + auto receive (system.wallet (0)->receive_action (send->hash (), nano::dev::genesis_key.pub, node->config.receive_minimum.number (), send->link ().value ().as_account ())); ASSERT_NE (nullptr, receive); nano::keypair key; auto timestamp3 = nano::seconds_since_epoch (); diff --git a/nano/secure/ledger.cpp b/nano/secure/ledger.cpp index d35a03d40a..49efbeae5f 100644 --- a/nano/secure/ledger.cpp +++ b/nano/secure/ledger.cpp @@ -224,7 +224,7 @@ bool ledger_processor::validate_epoch_block (nano::state_block const & block_a) if (validate_message (block_a.hashables.account, block_a.hash (), block_a.signature)) { // Is epoch block signed correctly - if (validate_message (ledger.epoch_signer (block_a.link ()), block_a.hash (), block_a.signature)) + if (validate_message (ledger.epoch_signer (block_a.link ().value ()), block_a.hash (), block_a.signature)) { result = nano::block_status::bad_signature; }