Skip to content

Commit

Permalink
Merge branch 'develop' into solicitor/directed-broadcast
Browse files Browse the repository at this point in the history
  • Loading branch information
guilhermelawless committed Feb 12, 2020
2 parents c1a1e49 + ec177a2 commit 303ed24
Show file tree
Hide file tree
Showing 51 changed files with 3,092 additions and 3,479 deletions.
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
cmake_minimum_required (VERSION 3.4)

cmake_policy(SET CMP0074 NEW)
cmake_policy(SET CMP0077 NEW)
# compatibility for osx sierra and on
# needs to be set before project
set (CMAKE_OSX_DEPLOYMENT_TARGET 10.12 CACHE STRING "")
Expand Down
1 change: 1 addition & 0 deletions ci/actions/windows/build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ if (${env:artifact} -eq 1) {

mkdir build
Push-Location build
$env:BOOST_ROOT = ${env:BOOST_ROOT_1_69_0}

& ..\ci\actions\windows\configure.bat
if (${LastExitCode} -ne 0) {
Expand Down
4 changes: 3 additions & 1 deletion ci/actions/windows/configure.bat
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ cmake .. ^
-DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
-DACTIVE_NETWORK=nano_%NETWORK_CFG%_network ^
-DNANO_SIMD_OPTIMIZATIONS=TRUE ^
-Dgtest_force_shared_crt=on
-Dgtest_force_shared_crt=on ^
-DBoost_NO_SYSTEM_PATHS=TRUE ^
-DBoost_NO_BOOST_CMAKE=TRUE

set exit_code=%errorlevel%
if %exit_code% neq 0 goto exit
Expand Down
2,178 changes: 0 additions & 2,178 deletions cmake/Modules/FindBoost.cmake

This file was deleted.

1 change: 1 addition & 0 deletions nano/core_test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ add_executable (core_test
message_parser.cpp
memory_pool.cpp
network.cpp
network_filter.cpp
node.cpp
node_telemetry.cpp
processor_service.cpp
Expand Down
15 changes: 0 additions & 15 deletions nano/core_test/active_transactions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -547,21 +547,6 @@ TEST (active_transactions, update_difficulty)
send2 = std::shared_ptr<nano::state_block> (builder1.from (*send2).work (*work2).build (ec));
ASSERT_FALSE (ec);

auto modify_election = [&node1](auto block) {
auto hash (block->hash ());
nano::lock_guard<std::mutex> active_guard (node1.active.mutex);
auto existing (node1.active.roots.find (block->qualified_root ()));
ASSERT_NE (existing, node1.active.roots.end ());
auto election (existing->election);
ASSERT_EQ (election->status.winner->hash (), hash);
election->status.winner = block;
auto current (election->blocks.find (hash));
assert (current != election->blocks.end ());
current->second = block;
};

modify_election (send1);
modify_election (send2);
node1.process_active (send1);
node1.process_active (send2);
node1.block_processor.flush ();
Expand Down
301 changes: 282 additions & 19 deletions nano/core_test/block_store.cpp

Large diffs are not rendered by default.

331 changes: 228 additions & 103 deletions nano/core_test/confirmation_height.cpp

Large diffs are not rendered by default.

83 changes: 76 additions & 7 deletions nano/core_test/ledger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1695,24 +1695,32 @@ TEST (ledger, state_send_receive)
nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, nano::genesis_account, nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (genesis.hash ()));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
ASSERT_TRUE (store->block_exists (transaction, send1.hash ()));
auto send2 (store->block_get (transaction, send1.hash ()));
nano::block_sideband sideband;
auto send2 (store->block_get (transaction, send1.hash (), &sideband));
ASSERT_NE (nullptr, send2);
ASSERT_EQ (send1, *send2);
ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.balance (transaction, send1.hash ()));
ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, send1.hash ()));
ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (nano::genesis_account));
ASSERT_TRUE (store->pending_exists (transaction, nano::pending_key (nano::genesis_account, send1.hash ())));
ASSERT_TRUE (sideband.details.is_send);
ASSERT_FALSE (sideband.details.is_receive);
ASSERT_FALSE (sideband.details.is_epoch);
nano::state_block receive1 (nano::genesis_account, send1.hash (), nano::genesis_account, nano::genesis_amount, send1.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (send1.hash ()));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
ASSERT_TRUE (store->block_exists (transaction, receive1.hash ()));
auto receive2 (store->block_get (transaction, receive1.hash ()));
nano::block_sideband sideband2;
auto receive2 (store->block_get (transaction, receive1.hash (), &sideband2));
ASSERT_NE (nullptr, receive2);
ASSERT_EQ (receive1, *receive2);
ASSERT_EQ (nano::genesis_amount, ledger.balance (transaction, receive1.hash ()));
ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, receive1.hash ()));
ASSERT_EQ (nano::genesis_amount, ledger.weight (nano::genesis_account));
ASSERT_FALSE (store->pending_exists (transaction, nano::pending_key (nano::genesis_account, send1.hash ())));
ASSERT_EQ (store->account_count (transaction), ledger.cache.account_count);
ASSERT_FALSE (sideband2.details.is_send);
ASSERT_TRUE (sideband2.details.is_receive);
ASSERT_FALSE (sideband2.details.is_epoch);
}

TEST (ledger, state_receive)
Expand All @@ -1738,12 +1746,16 @@ TEST (ledger, state_receive)
nano::state_block receive1 (nano::genesis_account, send1.hash (), nano::genesis_account, nano::genesis_amount, send1.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (send1.hash ()));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
ASSERT_TRUE (store->block_exists (transaction, receive1.hash ()));
auto receive2 (store->block_get (transaction, receive1.hash ()));
nano::block_sideband sideband;
auto receive2 (store->block_get (transaction, receive1.hash (), &sideband));
ASSERT_NE (nullptr, receive2);
ASSERT_EQ (receive1, *receive2);
ASSERT_EQ (nano::genesis_amount, ledger.balance (transaction, receive1.hash ()));
ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, receive1.hash ()));
ASSERT_EQ (nano::genesis_amount, ledger.weight (nano::genesis_account));
ASSERT_FALSE (sideband.details.is_send);
ASSERT_TRUE (sideband.details.is_receive);
ASSERT_FALSE (sideband.details.is_epoch);
}

TEST (ledger, state_rep_change)
Expand All @@ -1761,13 +1773,17 @@ TEST (ledger, state_rep_change)
nano::state_block change1 (nano::genesis_account, genesis.hash (), rep.pub, nano::genesis_amount, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (genesis.hash ()));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, change1).code);
ASSERT_TRUE (store->block_exists (transaction, change1.hash ()));
auto change2 (store->block_get (transaction, change1.hash ()));
nano::block_sideband sideband;
auto change2 (store->block_get (transaction, change1.hash (), &sideband));
ASSERT_NE (nullptr, change2);
ASSERT_EQ (change1, *change2);
ASSERT_EQ (nano::genesis_amount, ledger.balance (transaction, change1.hash ()));
ASSERT_EQ (0, ledger.amount (transaction, change1.hash ()));
ASSERT_EQ (0, ledger.weight (nano::genesis_account));
ASSERT_EQ (nano::genesis_amount, ledger.weight (rep.pub));
ASSERT_FALSE (sideband.details.is_send);
ASSERT_FALSE (sideband.details.is_receive);
ASSERT_FALSE (sideband.details.is_epoch);
}

TEST (ledger, state_open)
Expand Down Expand Up @@ -1796,13 +1812,17 @@ TEST (ledger, state_open)
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
ASSERT_FALSE (store->pending_exists (transaction, nano::pending_key (destination.pub, send1.hash ())));
ASSERT_TRUE (store->block_exists (transaction, open1.hash ()));
auto open2 (store->block_get (transaction, open1.hash ()));
nano::block_sideband sideband;
auto open2 (store->block_get (transaction, open1.hash (), &sideband));
ASSERT_NE (nullptr, open2);
ASSERT_EQ (open1, *open2);
ASSERT_EQ (nano::Gxrb_ratio, ledger.balance (transaction, open1.hash ()));
ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, open1.hash ()));
ASSERT_EQ (nano::genesis_amount, ledger.weight (nano::genesis_account));
ASSERT_EQ (ledger.cache.account_count, store->account_count (transaction));
ASSERT_FALSE (sideband.details.is_send);
ASSERT_TRUE (sideband.details.is_receive);
ASSERT_FALSE (sideband.details.is_epoch);
}

// Make sure old block types can't be inserted after a state block.
Expand Down Expand Up @@ -2045,13 +2065,17 @@ TEST (ledger, state_send_change)
nano::state_block send1 (nano::genesis_account, genesis.hash (), rep.pub, nano::genesis_amount - nano::Gxrb_ratio, nano::genesis_account, nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (genesis.hash ()));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
ASSERT_TRUE (store->block_exists (transaction, send1.hash ()));
auto send2 (store->block_get (transaction, send1.hash ()));
nano::block_sideband sideband;
auto send2 (store->block_get (transaction, send1.hash (), &sideband));
ASSERT_NE (nullptr, send2);
ASSERT_EQ (send1, *send2);
ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.balance (transaction, send1.hash ()));
ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, send1.hash ()));
ASSERT_EQ (0, ledger.weight (nano::genesis_account));
ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (rep.pub));
ASSERT_TRUE (sideband.details.is_send);
ASSERT_FALSE (sideband.details.is_receive);
ASSERT_FALSE (sideband.details.is_epoch);
}

TEST (ledger, state_receive_change)
Expand All @@ -2078,13 +2102,17 @@ TEST (ledger, state_receive_change)
nano::state_block receive1 (nano::genesis_account, send1.hash (), rep.pub, nano::genesis_amount, send1.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (send1.hash ()));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
ASSERT_TRUE (store->block_exists (transaction, receive1.hash ()));
auto receive2 (store->block_get (transaction, receive1.hash ()));
nano::block_sideband sideband2;
auto receive2 (store->block_get (transaction, receive1.hash (), &sideband2));
ASSERT_NE (nullptr, receive2);
ASSERT_EQ (receive1, *receive2);
ASSERT_EQ (nano::genesis_amount, ledger.balance (transaction, receive1.hash ()));
ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, receive1.hash ()));
ASSERT_EQ (0, ledger.weight (nano::genesis_account));
ASSERT_EQ (nano::genesis_amount, ledger.weight (rep.pub));
ASSERT_FALSE (sideband2.details.is_send);
ASSERT_TRUE (sideband2.details.is_receive);
ASSERT_FALSE (sideband2.details.is_epoch);
}

TEST (ledger, state_open_old)
Expand Down Expand Up @@ -2328,6 +2356,13 @@ TEST (ledger, epoch_blocks_v1_general)
nano::keypair destination;
nano::state_block epoch1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount, ledger.epoch_link (nano::epoch::epoch_1), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (genesis.hash ()));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, epoch1).code);
{
nano::block_sideband sideband;
(void)ledger.store.block_get (transaction, epoch1.hash (), &sideband);
ASSERT_FALSE (sideband.details.is_send);
ASSERT_FALSE (sideband.details.is_receive);
ASSERT_TRUE (sideband.details.is_epoch);
}
nano::state_block epoch2 (nano::genesis_account, epoch1.hash (), nano::genesis_account, nano::genesis_amount, ledger.epoch_link (nano::epoch::epoch_1), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (epoch1.hash ()));
ASSERT_EQ (nano::process_result::block_position, ledger.process (transaction, epoch2).code);
nano::account_info genesis_info;
Expand All @@ -2339,16 +2374,37 @@ TEST (ledger, epoch_blocks_v1_general)
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, epoch1).code);
ASSERT_FALSE (ledger.store.account_get (transaction, nano::genesis_account, genesis_info));
ASSERT_EQ (genesis_info.epoch (), nano::epoch::epoch_1);
{
nano::block_sideband sideband;
(void)ledger.store.block_get (transaction, epoch1.hash (), &sideband);
ASSERT_FALSE (sideband.details.is_send);
ASSERT_FALSE (sideband.details.is_receive);
ASSERT_TRUE (sideband.details.is_epoch);
}
nano::change_block change1 (epoch1.hash (), nano::genesis_account, nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (epoch1.hash ()));
ASSERT_EQ (nano::process_result::block_position, ledger.process (transaction, change1).code);
nano::state_block send1 (nano::genesis_account, epoch1.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (epoch1.hash ()));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
{
nano::block_sideband sideband;
(void)ledger.store.block_get (transaction, send1.hash (), &sideband);
ASSERT_TRUE (sideband.details.is_send);
ASSERT_FALSE (sideband.details.is_receive);
ASSERT_FALSE (sideband.details.is_epoch);
}
nano::open_block open1 (send1.hash (), nano::genesis_account, destination.pub, destination.prv, destination.pub, *pool.generate (destination.pub));
ASSERT_EQ (nano::process_result::unreceivable, ledger.process (transaction, open1).code);
nano::state_block epoch3 (destination.pub, 0, nano::genesis_account, 0, ledger.epoch_link (nano::epoch::epoch_1), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (destination.pub));
ASSERT_EQ (nano::process_result::representative_mismatch, ledger.process (transaction, epoch3).code);
nano::state_block epoch4 (destination.pub, 0, 0, 0, ledger.epoch_link (nano::epoch::epoch_1), nano::test_genesis_key.prv, nano::test_genesis_key.pub, *pool.generate (destination.pub));
ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, epoch4).code);
{
nano::block_sideband sideband;
(void)ledger.store.block_get (transaction, epoch4.hash (), &sideband);
ASSERT_FALSE (sideband.details.is_send);
ASSERT_FALSE (sideband.details.is_receive);
ASSERT_TRUE (sideband.details.is_epoch);
}
nano::receive_block receive1 (epoch4.hash (), send1.hash (), destination.prv, destination.pub, *pool.generate (epoch4.hash ()));
ASSERT_EQ (nano::process_result::block_position, ledger.process (transaction, receive1).code);
nano::state_block receive2 (destination.pub, epoch4.hash (), destination.pub, nano::Gxrb_ratio, send1.hash (), destination.prv, destination.pub, *pool.generate (epoch4.hash ()));
Expand All @@ -2358,6 +2414,13 @@ TEST (ledger, epoch_blocks_v1_general)
ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, receive2.hash ()));
ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (nano::genesis_account));
ASSERT_EQ (nano::Gxrb_ratio, ledger.weight (destination.pub));
{
nano::block_sideband sideband;
(void)ledger.store.block_get (transaction, receive2.hash (), &sideband);
ASSERT_FALSE (sideband.details.is_send);
ASSERT_TRUE (sideband.details.is_receive);
ASSERT_FALSE (sideband.details.is_epoch);
}
}

TEST (ledger, epoch_blocks_v2_general)
Expand Down Expand Up @@ -2759,6 +2822,12 @@ TEST (ledger, unchecked_epoch_invalid)
nano::account_info info;
ASSERT_FALSE (node1.store.account_get (transaction, destination.pub, info));
ASSERT_NE (info.epoch (), nano::epoch::epoch_1);
nano::block_sideband sideband;
ASSERT_NE (nullptr, node1.store.block_get (transaction, epoch2->hash (), &sideband));
ASSERT_EQ (nano::epoch::epoch_0, sideband.details.epoch);
ASSERT_TRUE (sideband.details.is_send);
ASSERT_FALSE (sideband.details.is_epoch);
ASSERT_FALSE (sideband.details.is_receive);
}
}

Expand Down
111 changes: 111 additions & 0 deletions nano/core_test/network_filter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#include <nano/core_test/testutil.hpp>
#include <nano/node/common.hpp>
#include <nano/secure/buffer.hpp>
#include <nano/secure/common.hpp>
#include <nano/secure/network_filter.hpp>

#include <gtest/gtest.h>

TEST (network_filter, unit)
{
nano::genesis genesis;
nano::network_filter filter (1);
auto one_block = [&genesis, &filter](std::shared_ptr<nano::block> const & block_a, bool expect_duplicate_a) {
nano::publish message (block_a);
auto bytes (message.to_bytes ());
nano::bufferstream stream (bytes->data (), bytes->size ());

// First read the header
bool error{ false };
nano::message_header header (error, stream);
ASSERT_FALSE (error);

// This validates nano::message_header::size
ASSERT_EQ (bytes->size (), block_a->size (block_a->type ()) + header.size);

// Now filter the rest of the stream
bool duplicate (filter.apply (bytes->data (), bytes->size () - header.size));
ASSERT_EQ (expect_duplicate_a, duplicate);

// Make sure the stream was rewinded correctly
auto block (nano::deserialize_block (stream, header.block_type ()));
ASSERT_NE (nullptr, block);
ASSERT_EQ (*block, *block_a);
};
one_block (genesis.open, false);
for (int i = 0; i < 10; ++i)
{
one_block (genesis.open, true);
}
auto new_block (std::make_shared<nano::state_block> (nano::test_genesis_key.pub, genesis.open->hash (), nano::test_genesis_key.pub, nano::genesis_amount - 10 * nano::xrb_ratio, nano::public_key (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
one_block (new_block, false);
for (int i = 0; i < 10; ++i)
{
one_block (new_block, true);
}
for (int i = 0; i < 100; ++i)
{
one_block (genesis.open, false);
one_block (new_block, false);
}
}

TEST (network_filter, many)
{
nano::genesis genesis;
nano::network_filter filter (4);
nano::keypair key1;
for (int i = 0; i < 100; ++i)
{
auto block (std::make_shared<nano::state_block> (nano::test_genesis_key.pub, genesis.open->hash (), nano::test_genesis_key.pub, nano::genesis_amount - i * 10 * nano::xrb_ratio, key1.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));

nano::publish message (block);
auto bytes (message.to_bytes ());
nano::bufferstream stream (bytes->data (), bytes->size ());

// First read the header
bool error{ false };
nano::message_header header (error, stream);
ASSERT_FALSE (error);

// This validates nano::message_header::size
ASSERT_EQ (bytes->size (), block->size + header.size);

// Now filter the rest of the stream
// All blocks should pass through
ASSERT_FALSE (filter.apply (bytes->data (), block->size));
ASSERT_FALSE (error);

// Make sure the stream was rewinded correctly
auto deserialized_block (nano::deserialize_block (stream, header.block_type ()));
ASSERT_NE (nullptr, deserialized_block);
ASSERT_EQ (*block, *deserialized_block);
}
}

TEST (network_filter, clear)
{
nano::network_filter filter (1);
std::vector<uint8_t> bytes1{ 1, 2, 3 };
std::vector<uint8_t> bytes2{ 1 };
ASSERT_FALSE (filter.apply (bytes1.data (), bytes1.size ()));
ASSERT_TRUE (filter.apply (bytes1.data (), bytes1.size ()));
filter.clear (bytes1.data (), bytes1.size ());
ASSERT_FALSE (filter.apply (bytes1.data (), bytes1.size ()));
ASSERT_TRUE (filter.apply (bytes1.data (), bytes1.size ()));
filter.clear (bytes2.data (), bytes2.size ());
ASSERT_TRUE (filter.apply (bytes1.data (), bytes1.size ()));
ASSERT_FALSE (filter.apply (bytes2.data (), bytes2.size ()));
}

TEST (network_filter, optional_digest)
{
nano::network_filter filter (1);
std::vector<uint8_t> bytes1{ 1, 2, 3 };
nano::uint128_t digest{ 0 };
ASSERT_FALSE (filter.apply (bytes1.data (), bytes1.size (), &digest));
ASSERT_NE (0, digest);
ASSERT_TRUE (filter.apply (bytes1.data (), bytes1.size ()));
filter.clear (digest);
ASSERT_FALSE (filter.apply (bytes1.data (), bytes1.size ()));
}
Loading

0 comments on commit 303ed24

Please sign in to comment.