diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 5862e7ce..46f4ac9e 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -14,9 +14,9 @@ support.
BUG BOUNTY REPORT INFORMATION
---------------------------------------------------
-In the interest of further improving the security of the network, we have launched the RaiBlocks Bug Bounty Program.
+In the interest of further improving the security of the network, we have launched the Nano Bug Bounty Program.
-WARNING! Don't disclose any information for the Raiblocks bug bounty. First, please read the article about our Bug Bounty Program.
+WARNING! Don't disclose any information for the Nano bug bounty. First, please read the article about our Bug Bounty Program.
https://www.reddit.com/r/RaiBlocks/comments/7makm7/announcing_the_raiblocks_bug_bounty_program/
@@ -70,10 +70,10 @@ Briefly describe the problem you are having in a few paragraphs.
diff --git a/.gitignore b/.gitignore
index 5be957c0..c9d9bd6a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,8 +30,8 @@
core_test
!core_test/
qt_test
-rai_node
-rai_wallet
+nano_node
+nano_wallet
slow_test
# IDEs
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e27d2fef..fd50a40e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-## Raiblocks CI config
+## Nano CI config
image: ubuntu:xenial
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 68a7ea58..720123ad 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
cmake_minimum_required (VERSION 3.4)
-project (rai)
+project (nano-core)
set (CPACK_PACKAGE_VERSION_MAJOR "18")
set (CPACK_PACKAGE_VERSION_MINOR "0")
@@ -13,16 +13,16 @@ set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks")
# Create all libraries and executables in the root binary dir
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
-set (RAIBLOCKS_GUI OFF CACHE BOOL "")
-set (RAIBLOCKS_TEST OFF CACHE BOOL "")
-set (RAIBLOCKS_SECURE_RPC OFF CACHE BOOL "")
+set (NANO_GUI OFF CACHE BOOL "")
+set (NANO_TEST OFF CACHE BOOL "")
+set (NANO_SECURE_RPC OFF CACHE BOOL "")
-option(RAIBLOCKS_ASAN_INT "Enable ASan+UBSan+Integer overflow" OFF)
-option(RAIBLOCKS_ASAN "Enable ASan+UBSan" OFF)
-option(RAIBLOCKS_SIMD_OPTIMIZATIONS "Enable CPU-specific SIMD optimizations (SSE/AVX or NEON, e.g.)" OFF)
+option(NANO_ASAN_INT "Enable ASan+UBSan+Integer overflow" OFF)
+option(NANO_ASAN "Enable ASan+UBSan" OFF)
+option(NANO_SIMD_OPTIMIZATIONS "Enable CPU-specific SIMD optimizations (SSE/AVX or NEON, e.g.)" OFF)
-SET (ACTIVE_NETWORK rai_live_network CACHE STRING "Selects which network parameters are used")
-set_property (CACHE ACTIVE_NETWORK PROPERTY STRINGS rai_test_network rai_beta_network rai_live_network)
+SET (ACTIVE_NETWORK nano_live_network CACHE STRING "Selects which network parameters are used")
+set_property (CACHE ACTIVE_NETWORK PROPERTY STRINGS nano_test_network nano_beta_network nano_live_network)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
@@ -41,19 +41,19 @@ if (WIN32)
-DMINIUPNP_STATICLIB)
else ()
add_compile_options(-Werror=switch)
- if (RAIBLOCKS_ASAN)
+ if (NANO_ASAN OR RAIBLOCKS_ASAN)
add_compile_options(-fsanitize=address,undefined)
add_definitions(-DED25519_NO_INLINE_ASM)
- elseif (RAIBLOCKS_ASAN_INT)
+ elseif (NANO_ASAN_INT OR RAIBLOCKS_ASAN_INT)
add_compile_options(-fsanitize=address,undefined,integer)
add_definitions(-DED25519_NO_INLINE_ASM)
- elseif (RAIBLOCKS_TSAN)
+ elseif (NANO_TSAN OR RAIBLOCKS_TSAN)
add_compile_options(-fsanitize=thread)
add_definitions(-DED25519_NO_INLINE_ASM)
endif()
IF (CMAKE_SYSTEM_PROCESSOR MATCHES "^(i.86|x86(_64)?)$")
- if (RAIBLOCKS_SIMD_OPTIMIZATIONS)
+ if (NANO_SIMD_OPTIMIZATIONS OR RAIBLOCKS_SIMD_OPTIMIZATIONS)
add_compile_options(-msse4)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
add_compile_options(-msse2)
@@ -88,21 +88,21 @@ elseif (WIN32)
set (PLATFORM_LINK_FLAGS "")
else ()
set (PLATFORM_LINK_FLAGS "-static-libgcc -static-libstdc++")
- if (RAIBLOCKS_ASAN)
+ if (NANO_ASAN OR RAIBLOCKS_ASAN)
set (PLATFORM_LINK_FLAGS "${PLATFORM_LINK_FLAGS} -fsanitize=address,undefined")
- elseif (RAIBLOCKS_ASAN_INT)
+ elseif (NANO_ASAN_INT OR RAIBLOCKS_ASAN_INT)
set (PLATFORM_LINK_FLAGS "${PLATFORM_LINK_FLAGS} -fsanitize=address,undefined,integer")
- elseif (RAIBLOCKS_TSAN)
+ elseif (NANO_TSAN OR RAIBLOCKS_TSAN)
set (PLATFORM_LINK_FLAGS "${PLATFORM_LINK_FLAGS} -fsanitize=thread")
endif()
endif ()
SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PLATFORM_LINK_FLAGS}" )
-if (RAIBLOCKS_SECURE_RPC)
+if (NANO_SECURE_RPC OR RAIBLOCKS_SECURE_RPC)
find_package (OpenSSL 1.0 REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})
- add_definitions (-DRAIBLOCKS_SECURE_RPC)
+ add_definitions (-DNANO_SECURE_RPC)
message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}")
message("OpenSSL libraries: ${OPENSSL_LIBRARIES}")
message("OpenSSL lib: ${OPENSSL_SSL_LIBRARY}")
@@ -134,7 +134,7 @@ set_target_properties(libminiupnpc-static PROPERTIES INTERFACE_INCLUDE_DIRECTORI
set (BUILD_SHARED OFF CACHE BOOL "")
set (BUILD_TESTING OFF CACHE BOOL "")
set (USE_INTERMEDIATE_OBJECTS_TARGET OFF CACHE BOOL "")
-if (CRYPTOPP_CUSTOM OR NOT RAIBLOCKS_SIMD_OPTIMIZATIONS)
+if (CRYPTOPP_CUSTOM OR NOT (NANO_SIMD_OPTIMIZATIONS OR RAIBLOCKS_SIMD_OPTIMIZATIONS))
set (CRYPTOPP_LIBRARY cryptopp)
add_library (cryptopp
cryptopp/algparam.cpp
@@ -227,12 +227,12 @@ add_library (blake2
target_compile_definitions(blake2 PRIVATE -D__SSE2__)
-add_subdirectory(rai/secure)
-add_subdirectory(rai/lib)
-add_subdirectory(rai/node)
-add_subdirectory(rai/rai_node)
+add_subdirectory(nano/secure)
+add_subdirectory(nano/lib)
+add_subdirectory(nano/node)
+add_subdirectory(nano/nano_node)
-if (RAIBLOCKS_TEST)
+if (NANO_TEST OR RAIBLOCKS_TEST)
if(WIN32)
if(MSVC_VERSION)
if(MSVC_VERSION GREATER_EQUAL 1910)
@@ -252,11 +252,11 @@ if (RAIBLOCKS_TEST)
set_target_properties(gtest PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${CMAKE_SOURCE_DIR}/gtest/include")
- add_subdirectory(rai/core_test)
- add_subdirectory(rai/slow_test)
+ add_subdirectory(nano/core_test)
+ add_subdirectory(nano/slow_test)
endif ()
-if (RAIBLOCKS_GUI)
+if (NANO_GUI OR RAIBLOCKS_GUI)
if (WIN32)
set (PLATFORM_QT_PACKAGES WinExtras)
else ()
@@ -266,16 +266,16 @@ if (RAIBLOCKS_GUI)
find_package (Qt5 COMPONENTS Core Gui Widgets Test ${PLATFORM_QT_PACKAGES})
add_library (qt
- rai/qt/qt.cpp
- rai/qt/qt.hpp)
+ nano/qt/qt.cpp
+ nano/qt/qt.hpp)
target_link_libraries(qt
- secure rai_lib node libminiupnpc-static Qt5::Gui Qt5::Widgets)
+ secure nano_lib node libminiupnpc-static Qt5::Gui Qt5::Widgets)
target_compile_definitions(qt
PRIVATE
- -DRAIBLOCKS_VERSION_MAJOR=${CPACK_PACKAGE_VERSION_MAJOR}
- -DRAIBLOCKS_VERSION_MINOR=${CPACK_PACKAGE_VERSION_MINOR})
+ -DNANO_VERSION_MAJOR=${CPACK_PACKAGE_VERSION_MAJOR}
+ -DNANO_VERSION_MINOR=${CPACK_PACKAGE_VERSION_MINOR})
if (WIN32)
set (PLATFORM_GUI_TARGET_PROPERTIES WIN32)
@@ -284,13 +284,13 @@ if (RAIBLOCKS_GUI)
endif ()
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
- set (PLATFORM_WALLET_SOURCE rai/rai_wallet/plat/default/icon.cpp)
+ set (PLATFORM_WALLET_SOURCE nano/nano_wallet/plat/default/icon.cpp)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
- set (PLATFORM_WALLET_SOURCE rai/rai_wallet/plat/windows/icon.cpp RaiBlocks.rc)
+ set (PLATFORM_WALLET_SOURCE nano/nano_wallet/plat/windows/icon.cpp Nano.rc)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
- set (PLATFORM_WALLET_SOURCE rai/rai_wallet/plat/default/icon.cpp)
+ set (PLATFORM_WALLET_SOURCE nano/nano_wallet/plat/default/icon.cpp)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
- set (PLATFORM_WALLET_SOURCE rai/rai_wallet/plat/default/icon.cpp)
+ set (PLATFORM_WALLET_SOURCE nano/nano_wallet/plat/default/icon.cpp)
else ()
error ("Unknown platform: ${CMAKE_SYSTEM_NAME}")
endif ()
@@ -299,8 +299,8 @@ if (RAIBLOCKS_GUI)
add_executable (nano_wallet ${PLATFORM_GUI_TARGET_PROPERTIES}
${PLATFORM_WALLET_SOURCE}
- rai/rai_wallet/entry.cpp
- rai/rai_wallet/icon.hpp
+ nano/nano_wallet/entry.cpp
+ nano/nano_wallet/icon.hpp
${RES})
target_link_libraries (nano_wallet
@@ -312,16 +312,16 @@ if (RAIBLOCKS_GUI)
endif()
add_executable (qt_system
- rai/qt_system/entry.cpp)
+ nano/qt_system/entry.cpp)
target_link_libraries (qt_system qt node Qt5::Gui Qt5::Widgets)
set_target_properties (qt nano_wallet qt_system PROPERTIES COMPILE_FLAGS "-DQT_NO_KEYWORDS -DBOOST_ASIO_HAS_STD_ARRAY=1")
- if (RAIBLOCKS_TEST)
+ if (NANO_TEST OR RAIBLOCKS_TEST)
add_executable (qt_test
- rai/qt_test/entry.cpp
- rai/qt_test/qt.cpp)
+ nano/qt_test/entry.cpp
+ nano/qt_test/qt.cpp)
target_link_libraries(qt_test gtest gtest_main qt Qt5::Test)
@@ -338,7 +338,7 @@ if (RAIBLOCKS_GUI)
install (DIRECTORY ${Qt5_DIR}/../../QtTest.framework DESTINATION Nano.app/Contents/Frameworks)
install (DIRECTORY ${Qt5_DIR}/../../QtWidgets.framework DESTINATION Nano.app/Contents/Frameworks)
install (FILES "${Qt5_DIR}/../../../plugins/platforms/libqcocoa.dylib" DESTINATION Nano.app/Contents/PlugIns/platforms)
- install (FILES RaiBlocks.icns DESTINATION Nano.app/Contents/Resources)
+ install (FILES Nano.icns DESTINATION Nano.app/Contents/Resources)
elseif (WIN32)
if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
set (WIN_REDIST vc_redist.x64.exe)
@@ -346,7 +346,7 @@ if (RAIBLOCKS_GUI)
set (WIN_REDIST vc_redist.x86.exe)
endif ()
set (CPACK_NSIS_EXTRA_INSTALL_COMMANDS "ExecWait '\\\"$INSTDIR\\\\${WIN_REDIST}\\\" /quiet /norestart'")
- set (CPACK_NSIS_MUI_ICON ${CMAKE_SOURCE_DIR}/RaiBlocks.ico)
+ set (CPACK_NSIS_MUI_ICON ${CMAKE_SOURCE_DIR}/Nano.ico)
set (CPACK_NSIS_DISPLAY_NAME "Nano")
set (CPACK_PACKAGE_NAME "Nano_Installer")
set (CPACK_NSIS_PACKAGE_NAME "Nano ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
diff --git a/Info.plist b/Info.plist
index d9941d9c..c5ca4049 100644
--- a/Info.plist
+++ b/Info.plist
@@ -13,9 +13,9 @@
CFBundleInfoDictionaryVersion
6.0
CFBundleIconFile
- RaiBlocks.icns
+ Nano.icns
CFBundleIdentifier
- net.raiblocks.rai_wallet
+ org.nano.nano_wallet
NSRequiresAquaSystemAppearance
diff --git a/RaiBlocks.icns b/Nano.icns
similarity index 100%
rename from RaiBlocks.icns
rename to Nano.icns
diff --git a/RaiBlocks.ico b/Nano.ico
similarity index 100%
rename from RaiBlocks.ico
rename to Nano.ico
diff --git a/Nano.rc b/Nano.rc
new file mode 100644
index 00000000..d4a9c876
--- /dev/null
+++ b/Nano.rc
@@ -0,0 +1 @@
+1 ICON "Nano.ico"
\ No newline at end of file
diff --git a/README.md b/README.md
index 355e8c4c..ad174b5d 100644
--- a/README.md
+++ b/README.md
@@ -43,7 +43,7 @@ For more information, see [Nano.org](https://nano.org/) or read the [whitepaper]
* [Reddit](https://reddit.com/r/nanocurrency)
* [Medium](https://medium.com/nanocurrency)
* [Twitter](https://twitter.com/nano)
-* [Forum](https://forum.raiblocks.net/)
+* [Forum](https://forum.nano.org/)
* [GitHub wiki](https://github.com/nanocurrency/raiblocks/wiki)
### Want to Contribute?
diff --git a/RaiBlocks.rc b/RaiBlocks.rc
deleted file mode 100644
index f513adb6..00000000
--- a/RaiBlocks.rc
+++ /dev/null
@@ -1 +0,0 @@
-1 ICON "RaiBlocks.ico"
\ No newline at end of file
diff --git a/appveyor.yml b/appveyor.yml
index 6cfa2ce1..a1b50a16 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -8,8 +8,8 @@ configuration: Release
platform: x64
environment:
matrix:
- - network: rai_live_network
- - network: rai_beta_network
+ - network: nano_live_network
+ - network: nano_beta_network
clone_folder: C:\projects\myproject
install:
- cmd: >-
@@ -17,7 +17,7 @@ install:
git submodule update --init --recursive
- cmake -DRAIBLOCKS_GUI=ON -DACTIVE_NETWORK=%NETWORK% -DQt5_DIR="C:\Qt\5.9\msvc2017_64\lib\cmake\Qt5" -DRAIBLOCKS_SIMD_OPTIMIZATIONS=TRUE -DBoost_COMPILER="-vc141" -DBOOST_ROOT="C:/Libraries/boost_1_66_0" -DBOOST_LIBRARYDIR="C:/Libraries/boost_1_66_0/lib64-msvc-14.1" -G "Visual Studio 15 2017 Win64" -DIPHLPAPI_LIBRARY="C:/Program Files (x86)/Windows Kits/10/Lib/10.0.14393.0/um/x64/iphlpapi.lib" -DWINSOCK2_LIBRARY="C:/Program Files (x86)/Windows Kits/10/Lib/10.0.14393.0/um/x64/WS2_32.lib" -DGIT_COMMIT=%GIT_COMMIT%
+ cmake -DNANO_GUI=ON -DACTIVE_NETWORK=%NETWORK% -DQt5_DIR="C:\Qt\5.9\msvc2017_64\lib\cmake\Qt5" -DNANO_SIMD_OPTIMIZATIONS=TRUE -DBoost_COMPILER="-vc141" -DBOOST_ROOT="C:/Libraries/boost_1_66_0" -DBOOST_LIBRARYDIR="C:/Libraries/boost_1_66_0/lib64-msvc-14.1" -G "Visual Studio 15 2017 Win64" -DIPHLPAPI_LIBRARY="C:/Program Files (x86)/Windows Kits/10/Lib/10.0.14393.0/um/x64/iphlpapi.lib" -DWINSOCK2_LIBRARY="C:/Program Files (x86)/Windows Kits/10/Lib/10.0.14393.0/um/x64/WS2_32.lib" -DGIT_COMMIT=%GIT_COMMIT%
diff --git a/ci/build-gitlab.sh b/ci/build-gitlab.sh
index ec3f3ba0..e439c6df 100755
--- a/ci/build-gitlab.sh
+++ b/ci/build-gitlab.sh
@@ -6,7 +6,7 @@ DISTRO_CFG=""
if [[ "$OSTYPE" == "linux-gnu" ]]; then
CPACK_TYPE="TBZ2"
distro=$(lsb_release -i -c -s|tr '\n' '_')
- DISTRO_CFG="-DRAIBLOCKS_DISTRO_NAME=${distro}"
+ DISTRO_CFG="-DNANO_DISTRO_NAME=${distro}"
elif [[ "$OSTYPE" == "darwin"* ]]; then
CPACK_TYPE="DragNDrop"
elif [[ "$OSTYPE" == "cygwin" ]]; then
@@ -17,13 +17,13 @@ elif [[ "$OSTYPE" == "win32" ]]; then
CPACK_TYPE="NSIS"
elif [[ "$OSTYPE" == "freebsd"* ]]; then
CPACK_TYPE="TBZ2"
- DISTRO_CFG="-DRAIBLOCKS_DISTRO_NAME='freebsd'"
+ DISTRO_CFG="-DNANO_DISTRO_NAME='freebsd'"
else
CPACK_TYPE="TBZ2"
fi
if [[ ${SIMD} -eq 1 ]]; then
- SIMD_CFG="-DRAIBLOCKS_SIMD_OPTIMIZATIONS=ON"
+ SIMD_CFG="-DNANO_SIMD_OPTIMIZATIONS=ON"
CRYPTOPP_CFG=""
echo SIMD and other optimizations enabled
echo local CPU:
@@ -34,11 +34,11 @@ else
fi
if [[ ${ASAN_INT} -eq 1 ]]; then
- SANITIZERS="-DRAIBLOCKS_ASAN_INT=ON"
+ SANITIZERS="-DNANO_ASAN_INT=ON"
elif [[ ${ASAN} -eq 1 ]]; then
- SANITIZERS="-DRAIBLOCKS_ASAN=ON"
+ SANITIZERS="-DNANO_ASAN=ON"
elif [[ ${TSAN} -eq 1 ]]; then
- SANITIZERS="-DRAIBLOCKS_TSAN=ON"
+ SANITIZERS="-DNANO_TSAN=ON"
else
SANITIZERS=""
fi
@@ -55,9 +55,9 @@ if [[ ${FLAVOR-_} == "_" ]]; then
fi
if [[ "${BETA}" -eq 1 ]]; then
- NETWORK_CFG="-DACTIVE_NETWORK=rai_beta_network"
+ NETWORK_CFG="-DACTIVE_NETWORK=nano_beta_network"
else
- NETWORK_CFG="-DACTIVE_NETWORK=rai_live_network"
+ NETWORK_CFG="-DACTIVE_NETWORK=nano_live_network"
fi
set -o nounset
@@ -68,7 +68,7 @@ run_build() {
mkdir ${build_dir}
cd ${build_dir}
cmake -GNinja \
- -DRAIBLOCKS_GUI=ON \
+ -DNANO_GUI=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_VERBOSE_MAKEFILE=ON \
-DCMAKE_INSTALL_PREFIX="../install" \
diff --git a/ci/build-travis.sh b/ci/build-travis.sh
index 5d07bd16..b4fe76f5 100755
--- a/ci/build-travis.sh
+++ b/ci/build-travis.sh
@@ -12,20 +12,20 @@ mkdir build
pushd build
if [[ ${ASAN_INT-0} -eq 1 ]]; then
- SANITIZERS="-DRAIBLOCKS_ASAN_INT=ON"
+ SANITIZERS="-DNANO_ASAN_INT=ON"
elif [[ ${ASAN-0} -eq 1 ]]; then
- SANITIZERS="-DRAIBLOCKS_ASAN=ON"
+ SANITIZERS="-DNANO_ASAN=ON"
elif [[ ${TSAN-0} -eq 1 ]]; then
- SANITIZERS="-DRAIBLOCKS_TSAN=ON"
+ SANITIZERS="-DNANO_TSAN=ON"
else
SANITIZERS=""
fi
cmake \
-G'Unix Makefiles' \
- -DACTIVE_NETWORK=rai_test_network \
- -DRAIBLOCKS_TEST=ON \
- -DRAIBLOCKS_GUI=ON \
+ -DACTIVE_NETWORK=nano_test_network \
+ -DNANO_TEST=ON \
+ -DNANO_GUI=ON \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_VERBOSE_MAKEFILE=ON \
-DBOOST_ROOT=/usr/local \
@@ -46,6 +46,6 @@ popd
pushd load-tester
cargo build --release
popd
-cp ./load-tester/target/release/raiblocks-load-tester ./build/load_test
+cp ./load-tester/target/release/nano-load-tester ./build/load_test
./ci/test.sh ./build
diff --git a/ci/clang-format-all.sh b/ci/clang-format-all.sh
index 635681a4..17661f19 100755
--- a/ci/clang-format-all.sh
+++ b/ci/clang-format-all.sh
@@ -5,4 +5,4 @@ set -e
REPO_ROOT=$(git rev-parse --show-toplevel)
cd "${REPO_ROOT}"
./ci/update-clang-format
-find rai -iname '*.h' -o -iname '*.hpp' -o -iname '*.cpp' | xargs clang-format -i
+find nano -iname '*.h' -o -iname '*.hpp' -o -iname '*.cpp' | xargs clang-format -i
diff --git a/ci/test.sh b/ci/test.sh
index cb167f71..ebcc01db 100755
--- a/ci/test.sh
+++ b/ci/test.sh
@@ -68,7 +68,7 @@ run_tests() {
xvfb_run_ ./qt_test
qt_test_res=${?}
- ${TIMEOUT_CMD} ${TIMEOUT_TIME_ARG} ${TIMEOUT_SEC-${TIMEOUT_DEFAULT}} ./load_test ./rai_node -s 150
+ ${TIMEOUT_CMD} ${TIMEOUT_TIME_ARG} ${TIMEOUT_SEC-${TIMEOUT_DEFAULT}} ./load_test ./nano_node -s 150
load_test_res=${?}
echo "Core Test return code: ${core_test_res}"
diff --git a/docker/ci/build.sh b/docker/ci/build.sh
index e687ec77..bff9148a 100755
--- a/docker/ci/build.sh
+++ b/docker/ci/build.sh
@@ -1,5 +1,5 @@
#!/bin/bash
REPO_ROOT=`git rev-parse --show-toplevel`
pushd $REPO_ROOT
-docker build -f docker/ci/Dockerfile -t raiblocks-ci:latest .
+docker build -f docker/ci/Dockerfile -t nano-ci:latest .
popd
diff --git a/docker/node/Dockerfile b/docker/node/Dockerfile
index 81fe522d..13995c11 100644
--- a/docker/node/Dockerfile
+++ b/docker/node/Dockerfile
@@ -13,15 +13,15 @@ ADD ./ /tmp/src
RUN mkdir /tmp/build && \
cd /tmp/build && \
- cmake /tmp/src -DBOOST_ROOT=${BOOST_ROOT} -DACTIVE_NETWORK=rai_${NETWORK}_network && \
- make rai_node && \
+ cmake /tmp/src -DBOOST_ROOT=${BOOST_ROOT} -DACTIVE_NETWORK=nano_${NETWORK}_network && \
+ make nano_node && \
cd .. && \
echo ${NETWORK} > /etc/nano-network
FROM ubuntu:16.04
-COPY --from=0 /tmp/build/rai_node /usr/bin
+COPY --from=0 /tmp/build/nano_node /usr/bin
COPY --from=0 /etc/nano-network /etc
COPY docker/node/entry.sh /entry.sh
-COPY docker/node/config /usr/share/raiblocks/config
+COPY docker/node/config /usr/share/nano/config
RUN chmod +x /entry.sh
CMD ["/bin/bash", "/entry.sh"]
diff --git a/docker/node/build.sh b/docker/node/build.sh
index 7885e5eb..eac538e8 100755
--- a/docker/node/build.sh
+++ b/docker/node/build.sh
@@ -38,5 +38,5 @@ esac
REPO_ROOT=`git rev-parse --show-toplevel`
COMMIT_SHA=`git rev-parse --short HEAD`
pushd $REPO_ROOT
-docker build --build-arg NETWORK="${network}" -f docker/node/Dockerfile -t raiblocks-node${network_tag}:latest .
+docker build --build-arg NETWORK="${network}" -f docker/node/Dockerfile -t nano-node${network_tag}:latest .
popd
diff --git a/docker/node/entry.sh b/docker/node/entry.sh
index 1db90e29..1a44e0b9 100644
--- a/docker/node/entry.sh
+++ b/docker/node/entry.sh
@@ -20,12 +20,12 @@ case "${network}" in
;;
esac
-nanodir="${HOME}/RaiBlocks${dirSuffix}"
+nanodir="${HOME}/Nano${dirSuffix}"
dbFile="${nanodir}/data.ldb"
mkdir -p "${nanodir}"
if [ ! -f "${nanodir}/config.json" ]; then
echo "Config File not found, adding default."
- cp "/usr/share/raiblocks/config/${network}.json" "${nanodir}/config.json"
+ cp "/usr/share/nano/config/${network}.json" "${nanodir}/config.json"
fi
pid=''
@@ -48,7 +48,7 @@ while true; do
fi
done
- rai_node --vacuum
+ nano_node --vacuum
fi
fi
@@ -59,7 +59,7 @@ while true; do
fi
if [ -z "${pid}" ]; then
- rai_node --daemon &
+ nano_node --daemon &
pid="$!"
fi
done
diff --git a/doxygen.config b/doxygen.config
index 3ece9724..1801f583 100644
--- a/doxygen.config
+++ b/doxygen.config
@@ -791,7 +791,7 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
-INPUT = rai
+INPUT = nano
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/load-tester/Cargo.lock b/load-tester/Cargo.lock
index 1073cd52..249c05f0 100644
--- a/load-tester/Cargo.lock
+++ b/load-tester/Cargo.lock
@@ -380,7 +380,7 @@ version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
-name = "raiblocks-load-tester"
+name = "nano-load-tester"
version = "0.1.0"
dependencies = [
"clap 2.29.2 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/load-tester/Cargo.toml b/load-tester/Cargo.toml
index a4351537..7cf731ed 100644
--- a/load-tester/Cargo.toml
+++ b/load-tester/Cargo.toml
@@ -1,5 +1,5 @@
[package]
-name = "raiblocks-load-tester"
+name = "nano-load-tester"
version = "0.1.0"
[dependencies]
diff --git a/load-tester/src/launch_node.rs b/load-tester/src/launch_node.rs
index a07da1a6..8d4ab302 100644
--- a/load-tester/src/launch_node.rs
+++ b/load-tester/src/launch_node.rs
@@ -22,18 +22,18 @@ const RPC_PORT_START: u64 = 55000;
const PEERING_PORT_START: u64 = 54000;
pub fn launch_node(
- rai_node: &Path,
+ nano_node: &Path,
tmp_dir: &Path,
handle: Handle,
i: u64,
) -> Result<(Child, RpcClient)> {
- let data_dir = tmp_dir.join(format!("RaiBlocks_load_test_{}", i));
+ let data_dir = tmp_dir.join(format!("Nano_load_test_{}", i));
match fs::create_dir(&data_dir) {
Ok(_) => {}
Err(ref e) if e.kind() == io::ErrorKind::AlreadyExists => {
let _ = fs::remove_file(data_dir.join("data.ldb"));
}
- r => r.chain_err(|| "failed to create rai_node data directory")?,
+ r => r.chain_err(|| "failed to create nano_node data directory")?,
}
let rpc_port = RPC_PORT_START + i;
let peering_port = PEERING_PORT_START + i;
@@ -97,12 +97,12 @@ pub fn launch_node(
File::create(data_dir.join("config.json")).chain_err(|| "failed to create config.json")?;
serde_json::to_writer_pretty(config_writer, &config)
.chain_err(|| "failed to write config.json")?;
- let child = Command::new(rai_node)
+ let child = Command::new(nano_node)
.arg("--data_path")
.arg(&data_dir)
.arg("--daemon")
.spawn_async(&handle)
- .chain_err(|| "failed to spawn rai_node")?;
+ .chain_err(|| "failed to spawn nano_node")?;
let rpc_client = RpcClient::new(
handle,
format!("http://[::1]:{}/", rpc_port).parse().unwrap(),
@@ -119,7 +119,7 @@ pub fn connect_node(
"action": "keepalive",
"address": "::1",
"port": PEERING_PORT_START + i,
- })).then(|x| x.chain_err(|| "failed to call rai_node RPC"))
+ })).then(|x| x.chain_err(|| "failed to call nano_node RPC"))
.map(|_| ()),
) as _
}
diff --git a/load-tester/src/main.rs b/load-tester/src/main.rs
index 0c3cc124..035ed433 100644
--- a/load-tester/src/main.rs
+++ b/load-tester/src/main.rs
@@ -428,7 +428,7 @@ fn run(params: Parameters) -> Result<()> {
fn main() {
env_logger::init();
- let matches = clap::App::new("raiblocks-load-tester")
+ let matches = clap::App::new("nano-load-tester")
.version(env!("CARGO_PKG_VERSION"))
.arg(
Arg::with_name("node_count")
@@ -442,13 +442,13 @@ fn main() {
Arg::with_name("tmp_dir")
.long("tmp-dir")
.value_name("PATH")
- .help("The path to a temporary directory for rai_node data"),
+ .help("The path to a temporary directory for nano_node data"),
)
.arg(
Arg::with_name("node_path")
.value_name("PATH")
.required(true)
- .help("The path to the rai_node to test"),
+ .help("The path to the nano_node to test"),
)
.arg(
Arg::with_name("send_count")
diff --git a/rai/core_test/CMakeLists.txt b/nano/core_test/CMakeLists.txt
similarity index 80%
rename from rai/core_test/CMakeLists.txt
rename to nano/core_test/CMakeLists.txt
index 39c4301c..c5ad3a48 100644
--- a/rai/core_test/CMakeLists.txt
+++ b/nano/core_test/CMakeLists.txt
@@ -24,6 +24,6 @@ add_executable (core_test
target_compile_definitions(core_test
PRIVATE
- -DRAIBLOCKS_VERSION_MAJOR=${CPACK_PACKAGE_VERSION_MAJOR}
- -DRAIBLOCKS_VERSION_MINOR=${CPACK_PACKAGE_VERSION_MINOR})
+ -DNANO_VERSION_MAJOR=${CPACK_PACKAGE_VERSION_MAJOR}
+ -DNANO_VERSION_MINOR=${CPACK_PACKAGE_VERSION_MINOR})
target_link_libraries (core_test node secure gtest_main gtest libminiupnpc-static Boost::boost)
diff --git a/rai/core_test/block.cpp b/nano/core_test/block.cpp
similarity index 70%
rename from rai/core_test/block.cpp
rename to nano/core_test/block.cpp
index ecc56788..98b2dda0 100644
--- a/rai/core_test/block.cpp
+++ b/nano/core_test/block.cpp
@@ -3,20 +3,20 @@
#include
#include
-#include
+#include
-#include
-#include
-#include
+#include
+#include
+#include
#include
TEST (ed25519, signing)
{
- rai::uint256_union prv (0);
- rai::uint256_union pub (rai::pub_key (prv));
- rai::uint256_union message (0);
- rai::uint512_union signature;
+ nano::uint256_union prv (0);
+ nano::uint256_union pub (nano::pub_key (prv));
+ nano::uint256_union message (0);
+ nano::uint512_union signature;
ed25519_sign (message.bytes.data (), sizeof (message.bytes), prv.bytes.data (), pub.bytes.data (), signature.bytes.data ());
auto valid1 (ed25519_sign_open (message.bytes.data (), sizeof (message.bytes), pub.bytes.data (), signature.bytes.data ()));
ASSERT_EQ (0, valid1);
@@ -27,36 +27,36 @@ TEST (ed25519, signing)
TEST (transaction_block, empty)
{
- rai::keypair key1;
- rai::send_block block (0, 1, 13, key1.prv, key1.pub, 2);
- rai::uint256_union hash (block.hash ());
- ASSERT_FALSE (rai::validate_message (key1.pub, hash, block.signature));
+ nano::keypair key1;
+ nano::send_block block (0, 1, 13, key1.prv, key1.pub, 2);
+ nano::uint256_union hash (block.hash ());
+ ASSERT_FALSE (nano::validate_message (key1.pub, hash, block.signature));
block.signature.bytes[32] ^= 0x1;
- ASSERT_TRUE (rai::validate_message (key1.pub, hash, block.signature));
+ ASSERT_TRUE (nano::validate_message (key1.pub, hash, block.signature));
}
TEST (block, send_serialize)
{
- rai::send_block block1 (0, 1, 2, rai::keypair ().prv, 4, 5);
+ nano::send_block block1 (0, 1, 2, nano::keypair ().prv, 4, 5);
std::vector bytes;
{
- rai::vectorstream stream1 (bytes);
+ nano::vectorstream stream1 (bytes);
block1.serialize (stream1);
}
auto data (bytes.data ());
auto size (bytes.size ());
ASSERT_NE (nullptr, data);
ASSERT_NE (0, size);
- rai::bufferstream stream2 (data, size);
+ nano::bufferstream stream2 (data, size);
bool error (false);
- rai::send_block block2 (error, stream2);
+ nano::send_block block2 (error, stream2);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (block, send_serialize_json)
{
- rai::send_block block1 (0, 1, 2, rai::keypair ().prv, 4, 5);
+ nano::send_block block1 (0, 1, 2, nano::keypair ().prv, 4, 5);
std::string string1;
block1.serialize_json (string1);
ASSERT_NE (0, string1.size ());
@@ -64,30 +64,30 @@ TEST (block, send_serialize_json)
std::stringstream istream (string1);
boost::property_tree::read_json (istream, tree1);
bool error (false);
- rai::send_block block2 (error, tree1);
+ nano::send_block block2 (error, tree1);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (block, receive_serialize)
{
- rai::receive_block block1 (0, 1, rai::keypair ().prv, 3, 4);
- rai::keypair key1;
+ nano::receive_block block1 (0, 1, nano::keypair ().prv, 3, 4);
+ nano::keypair key1;
std::vector bytes;
{
- rai::vectorstream stream1 (bytes);
+ nano::vectorstream stream1 (bytes);
block1.serialize (stream1);
}
- rai::bufferstream stream2 (bytes.data (), bytes.size ());
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
bool error (false);
- rai::receive_block block2 (error, stream2);
+ nano::receive_block block2 (error, stream2);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (block, receive_serialize_json)
{
- rai::receive_block block1 (0, 1, rai::keypair ().prv, 3, 4);
+ nano::receive_block block1 (0, 1, nano::keypair ().prv, 3, 4);
std::string string1;
block1.serialize_json (string1);
ASSERT_NE (0, string1.size ());
@@ -95,14 +95,14 @@ TEST (block, receive_serialize_json)
std::stringstream istream (string1);
boost::property_tree::read_json (istream, tree1);
bool error (false);
- rai::receive_block block2 (error, tree1);
+ nano::receive_block block2 (error, tree1);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (block, open_serialize_json)
{
- rai::open_block block1 (0, 1, 0, rai::keypair ().prv, 0, 0);
+ nano::open_block block1 (0, 1, 0, nano::keypair ().prv, 0, 0);
std::string string1;
block1.serialize_json (string1);
ASSERT_NE (0, string1.size ());
@@ -110,14 +110,14 @@ TEST (block, open_serialize_json)
std::stringstream istream (string1);
boost::property_tree::read_json (istream, tree1);
bool error (false);
- rai::open_block block2 (error, tree1);
+ nano::open_block block2 (error, tree1);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (block, change_serialize_json)
{
- rai::change_block block1 (0, 1, rai::keypair ().prv, 3, 4);
+ nano::change_block block1 (0, 1, nano::keypair ().prv, 3, 4);
std::string string1;
block1.serialize_json (string1);
ASSERT_NE (0, string1.size ());
@@ -125,17 +125,17 @@ TEST (block, change_serialize_json)
std::stringstream istream (string1);
boost::property_tree::read_json (istream, tree1);
bool error (false);
- rai::change_block block2 (error, tree1);
+ nano::change_block block2 (error, tree1);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (uint512_union, parse_zero)
{
- rai::uint512_union input (rai::uint512_t (0));
+ nano::uint512_union input (nano::uint512_t (0));
std::string text;
input.encode_hex (text);
- rai::uint512_union output;
+ nano::uint512_union output;
auto error (output.decode_hex (text));
ASSERT_FALSE (error);
ASSERT_EQ (input, output);
@@ -145,7 +145,7 @@ TEST (uint512_union, parse_zero)
TEST (uint512_union, parse_zero_short)
{
std::string text ("0");
- rai::uint512_union output;
+ nano::uint512_union output;
auto error (output.decode_hex (text));
ASSERT_FALSE (error);
ASSERT_TRUE (output.number ().is_zero ());
@@ -153,10 +153,10 @@ TEST (uint512_union, parse_zero_short)
TEST (uint512_union, parse_one)
{
- rai::uint512_union input (rai::uint512_t (1));
+ nano::uint512_union input (nano::uint512_t (1));
std::string text;
input.encode_hex (text);
- rai::uint512_union output;
+ nano::uint512_union output;
auto error (output.decode_hex (text));
ASSERT_FALSE (error);
ASSERT_EQ (input, output);
@@ -165,148 +165,148 @@ TEST (uint512_union, parse_one)
TEST (uint512_union, parse_error_symbol)
{
- rai::uint512_union input (rai::uint512_t (1000));
+ nano::uint512_union input (nano::uint512_t (1000));
std::string text;
input.encode_hex (text);
text[5] = '!';
- rai::uint512_union output;
+ nano::uint512_union output;
auto error (output.decode_hex (text));
ASSERT_TRUE (error);
}
TEST (uint512_union, max)
{
- rai::uint512_union input (std::numeric_limits::max ());
+ nano::uint512_union input (std::numeric_limits::max ());
std::string text;
input.encode_hex (text);
- rai::uint512_union output;
+ nano::uint512_union output;
auto error (output.decode_hex (text));
ASSERT_FALSE (error);
ASSERT_EQ (input, output);
- ASSERT_EQ (rai::uint512_t ("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), output.number ());
+ ASSERT_EQ (nano::uint512_t ("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), output.number ());
}
TEST (uint512_union, parse_error_overflow)
{
- rai::uint512_union input (std::numeric_limits::max ());
+ nano::uint512_union input (std::numeric_limits::max ());
std::string text;
input.encode_hex (text);
text.push_back (0);
- rai::uint512_union output;
+ nano::uint512_union output;
auto error (output.decode_hex (text));
ASSERT_TRUE (error);
}
TEST (send_block, deserialize)
{
- rai::send_block block1 (0, 1, 2, rai::keypair ().prv, 4, 5);
+ nano::send_block block1 (0, 1, 2, nano::keypair ().prv, 4, 5);
ASSERT_EQ (block1.hash (), block1.hash ());
std::vector bytes;
{
- rai::vectorstream stream1 (bytes);
+ nano::vectorstream stream1 (bytes);
block1.serialize (stream1);
}
- ASSERT_EQ (rai::send_block::size, bytes.size ());
- rai::bufferstream stream2 (bytes.data (), bytes.size ());
+ ASSERT_EQ (nano::send_block::size, bytes.size ());
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
bool error (false);
- rai::send_block block2 (error, stream2);
+ nano::send_block block2 (error, stream2);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (receive_block, deserialize)
{
- rai::receive_block block1 (0, 1, rai::keypair ().prv, 3, 4);
+ nano::receive_block block1 (0, 1, nano::keypair ().prv, 3, 4);
ASSERT_EQ (block1.hash (), block1.hash ());
block1.hashables.previous = 2;
block1.hashables.source = 4;
std::vector bytes;
{
- rai::vectorstream stream1 (bytes);
+ nano::vectorstream stream1 (bytes);
block1.serialize (stream1);
}
- ASSERT_EQ (rai::receive_block::size, bytes.size ());
- rai::bufferstream stream2 (bytes.data (), bytes.size ());
+ ASSERT_EQ (nano::receive_block::size, bytes.size ());
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
bool error (false);
- rai::receive_block block2 (error, stream2);
+ nano::receive_block block2 (error, stream2);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (open_block, deserialize)
{
- rai::open_block block1 (0, 1, 0, rai::keypair ().prv, 0, 0);
+ nano::open_block block1 (0, 1, 0, nano::keypair ().prv, 0, 0);
ASSERT_EQ (block1.hash (), block1.hash ());
std::vector bytes;
{
- rai::vectorstream stream (bytes);
+ nano::vectorstream stream (bytes);
block1.serialize (stream);
}
- ASSERT_EQ (rai::open_block::size, bytes.size ());
- rai::bufferstream stream (bytes.data (), bytes.size ());
+ ASSERT_EQ (nano::open_block::size, bytes.size ());
+ nano::bufferstream stream (bytes.data (), bytes.size ());
bool error (false);
- rai::open_block block2 (error, stream);
+ nano::open_block block2 (error, stream);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (change_block, deserialize)
{
- rai::change_block block1 (1, 2, rai::keypair ().prv, 4, 5);
+ nano::change_block block1 (1, 2, nano::keypair ().prv, 4, 5);
ASSERT_EQ (block1.hash (), block1.hash ());
std::vector bytes;
{
- rai::vectorstream stream1 (bytes);
+ nano::vectorstream stream1 (bytes);
block1.serialize (stream1);
}
- ASSERT_EQ (rai::change_block::size, bytes.size ());
+ ASSERT_EQ (nano::change_block::size, bytes.size ());
auto data (bytes.data ());
auto size (bytes.size ());
ASSERT_NE (nullptr, data);
ASSERT_NE (0, size);
- rai::bufferstream stream2 (data, size);
+ nano::bufferstream stream2 (data, size);
bool error (false);
- rai::change_block block2 (error, stream2);
+ nano::change_block block2 (error, stream2);
ASSERT_FALSE (error);
ASSERT_EQ (block1, block2);
}
TEST (frontier_req, serialization)
{
- rai::frontier_req request1;
+ nano::frontier_req request1;
request1.start = 1;
request1.age = 2;
request1.count = 3;
std::vector bytes;
{
- rai::vectorstream stream (bytes);
+ nano::vectorstream stream (bytes);
request1.serialize (stream);
}
auto error (false);
- rai::bufferstream stream (bytes.data (), bytes.size ());
- rai::message_header header (error, stream);
+ nano::bufferstream stream (bytes.data (), bytes.size ());
+ nano::message_header header (error, stream);
ASSERT_FALSE (error);
- rai::frontier_req request2 (error, stream, header);
+ nano::frontier_req request2 (error, stream, header);
ASSERT_FALSE (error);
ASSERT_EQ (request1, request2);
}
TEST (block, publish_req_serialization)
{
- rai::keypair key1;
- rai::keypair key2;
- auto block (std::make_shared (0, key2.pub, 200, rai::keypair ().prv, 2, 3));
- rai::publish req (block);
+ nano::keypair key1;
+ nano::keypair key2;
+ auto block (std::make_shared (0, key2.pub, 200, nano::keypair ().prv, 2, 3));
+ nano::publish req (block);
std::vector bytes;
{
- rai::vectorstream stream (bytes);
+ nano::vectorstream stream (bytes);
req.serialize (stream);
}
auto error (false);
- rai::bufferstream stream2 (bytes.data (), bytes.size ());
- rai::message_header header (error, stream2);
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
+ nano::message_header header (error, stream2);
ASSERT_FALSE (error);
- rai::publish req2 (error, stream2, header);
+ nano::publish req2 (error, stream2, header);
ASSERT_FALSE (error);
ASSERT_EQ (req, req2);
ASSERT_EQ (*req.block, *req2.block);
@@ -314,19 +314,19 @@ TEST (block, publish_req_serialization)
TEST (block, confirm_req_serialization)
{
- rai::keypair key1;
- rai::keypair key2;
- auto block (std::make_shared (0, key2.pub, 200, rai::keypair ().prv, 2, 3));
- rai::confirm_req req (block);
+ nano::keypair key1;
+ nano::keypair key2;
+ auto block (std::make_shared (0, key2.pub, 200, nano::keypair ().prv, 2, 3));
+ nano::confirm_req req (block);
std::vector bytes;
{
- rai::vectorstream stream (bytes);
+ nano::vectorstream stream (bytes);
req.serialize (stream);
}
auto error (false);
- rai::bufferstream stream2 (bytes.data (), bytes.size ());
- rai::message_header header (error, stream2);
- rai::confirm_req req2 (error, stream2, header);
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
+ nano::message_header header (error, stream2);
+ nano::confirm_req req2 (error, stream2, header);
ASSERT_FALSE (error);
ASSERT_EQ (req, req2);
ASSERT_EQ (*req.block, *req2.block);
@@ -334,24 +334,24 @@ TEST (block, confirm_req_serialization)
TEST (state_block, serialization)
{
- rai::keypair key1;
- rai::keypair key2;
- rai::state_block block1 (key1.pub, 1, key2.pub, 2, 4, key1.prv, key1.pub, 5);
+ nano::keypair key1;
+ nano::keypair key2;
+ nano::state_block block1 (key1.pub, 1, key2.pub, 2, 4, key1.prv, key1.pub, 5);
ASSERT_EQ (key1.pub, block1.hashables.account);
- ASSERT_EQ (rai::block_hash (1), block1.previous ());
+ ASSERT_EQ (nano::block_hash (1), block1.previous ());
ASSERT_EQ (key2.pub, block1.hashables.representative);
- ASSERT_EQ (rai::amount (2), block1.hashables.balance);
- ASSERT_EQ (rai::uint256_union (4), block1.hashables.link);
+ ASSERT_EQ (nano::amount (2), block1.hashables.balance);
+ ASSERT_EQ (nano::uint256_union (4), block1.hashables.link);
std::vector bytes;
{
- rai::vectorstream stream (bytes);
+ nano::vectorstream stream (bytes);
block1.serialize (stream);
}
ASSERT_EQ (0x5, bytes[215]); // Ensure work is serialized big-endian
- ASSERT_EQ (rai::state_block::size, bytes.size ());
+ ASSERT_EQ (nano::state_block::size, bytes.size ());
bool error1 (false);
- rai::bufferstream stream (bytes.data (), bytes.size ());
- rai::state_block block2 (error1, stream);
+ nano::bufferstream stream (bytes.data (), bytes.size ());
+ nano::state_block block2 (error1, stream);
ASSERT_FALSE (error1);
ASSERT_EQ (block1, block2);
block2.hashables.account.clear ();
@@ -361,7 +361,7 @@ TEST (state_block, serialization)
block2.hashables.link.clear ();
block2.signature.clear ();
block2.work = 0;
- rai::bufferstream stream2 (bytes.data (), bytes.size ());
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
ASSERT_FALSE (block2.deserialize (stream2));
ASSERT_EQ (block1, block2);
std::string json;
@@ -370,7 +370,7 @@ TEST (state_block, serialization)
boost::property_tree::ptree tree;
boost::property_tree::read_json (body, tree);
bool error2 (false);
- rai::state_block block3 (error2, tree);
+ nano::state_block block3 (error2, tree);
ASSERT_FALSE (error2);
ASSERT_EQ (block1, block3);
block3.hashables.account.clear ();
@@ -386,8 +386,8 @@ TEST (state_block, serialization)
TEST (state_block, hashing)
{
- rai::keypair key;
- rai::state_block block (key.pub, 0, key.pub, 0, 0, key.prv, key.pub, 0);
+ nano::keypair key;
+ nano::state_block block (key.pub, 0, key.pub, 0, 0, key.prv, key.pub, 0);
auto hash (block.hash ());
block.hashables.account.bytes[0] ^= 0x1;
ASSERT_NE (hash, block.hash ());
@@ -413,20 +413,20 @@ TEST (state_block, hashing)
TEST (block_uniquer, null)
{
- rai::block_uniquer uniquer;
+ nano::block_uniquer uniquer;
ASSERT_EQ (nullptr, uniquer.unique (nullptr));
}
TEST (block_uniquer, single)
{
- rai::keypair key;
- auto block1 (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0));
- auto block2 (std::make_shared (*block1));
+ nano::keypair key;
+ auto block1 (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0));
+ auto block2 (std::make_shared (*block1));
ASSERT_NE (block1, block2);
ASSERT_EQ (*block1, *block2);
- std::weak_ptr block3 (block2);
+ std::weak_ptr block3 (block2);
ASSERT_NE (nullptr, block3.lock ());
- rai::block_uniquer uniquer;
+ nano::block_uniquer uniquer;
auto block4 (uniquer.unique (block1));
ASSERT_EQ (block1, block4);
auto block5 (uniquer.unique (block2));
@@ -437,10 +437,10 @@ TEST (block_uniquer, single)
TEST (block_uniquer, cleanup)
{
- rai::keypair key;
- auto block1 (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0));
- auto block2 (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 1));
- rai::block_uniquer uniquer;
+ nano::keypair key;
+ auto block1 (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0));
+ auto block2 (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 1));
+ nano::block_uniquer uniquer;
auto block3 (uniquer.unique (block1));
auto block4 (uniquer.unique (block2));
block2.reset ();
@@ -457,20 +457,20 @@ TEST (block_uniquer, cleanup)
TEST (block_builder, zeroed_state_block)
{
std::error_code ec;
- rai::block_builder builder;
- rai::keypair key;
+ nano::block_builder builder;
+ nano::keypair key;
// Make sure manually- and builder constructed all-zero blocks have equal hashes, and check signature.
- auto zero_block_manual (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0));
+ auto zero_block_manual (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0));
auto zero_block_build = builder.state ().zero ().sign (key.prv, key.pub).build ();
ASSERT_TRUE (zero_block_manual->hash () == zero_block_build->hash ());
- ASSERT_FALSE (rai::validate_message (key.pub, zero_block_build->hash (), zero_block_build->signature));
+ ASSERT_FALSE (nano::validate_message (key.pub, zero_block_build->hash (), zero_block_build->signature));
}
TEST (block_builder, state)
{
// Test against a random hash from the live network
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
auto block = builder
.state ()
.account_address ("xrb_15nhh1kzw3x8ohez6s75wy3jr6dqgq65oaede1fzk5hqxk4j8ehz7iqtb3to")
@@ -486,7 +486,7 @@ TEST (block_builder, state_missing_rep)
{
// Test against a random hash from the live network
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
auto block = builder
.state ()
.account_address ("xrb_15nhh1kzw3x8ohez6s75wy3jr6dqgq65oaede1fzk5hqxk4j8ehz7iqtb3to")
@@ -502,11 +502,11 @@ TEST (block_builder, state_missing_rep)
TEST (block_builder, state_equality)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
// With constructor
- rai::keypair key1, key2;
- rai::state_block block1 (key1.pub, 1, key2.pub, 2, 4, key1.prv, key1.pub, 5);
+ nano::keypair key1, key2;
+ nano::state_block block1 (key1.pub, 1, key2.pub, 2, 4, key1.prv, key1.pub, 5);
// With builder
auto block2 = builder
@@ -528,7 +528,7 @@ TEST (block_builder, state_equality)
TEST (block_builder, state_errors)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
// Make sure we assert when building a block without an std::error_code
EXPECT_DEATH (builder
@@ -549,7 +549,7 @@ TEST (block_builder, open)
{
// Test built block's hash against the Genesis open block from the live network
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
auto block = builder
.open ()
.account_address ("xrb_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3")
@@ -562,11 +562,11 @@ TEST (block_builder, open)
TEST (block_builder, open_equality)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
// With constructor
- rai::keypair key1, key2;
- rai::open_block block1 (1, key1.pub, key2.pub, key1.prv, key1.pub, 5);
+ nano::keypair key1, key2;
+ nano::open_block block1 (1, key1.pub, key2.pub, key1.prv, key1.pub, 5);
// With builder
auto block2 = builder
@@ -586,7 +586,7 @@ TEST (block_builder, open_equality)
TEST (block_builder, change)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
auto block = builder
.change ()
.representative_address ("xrb_3rropjiqfxpmrrkooej4qtmm1pueu36f9ghinpho4esfdor8785a455d16nf")
@@ -598,11 +598,11 @@ TEST (block_builder, change)
TEST (block_builder, change_equality)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
// With constructor
- rai::keypair key1, key2;
- rai::change_block block1 (1, key1.pub, key1.prv, key1.pub, 5);
+ nano::keypair key1, key2;
+ nano::change_block block1 (1, key1.pub, key1.prv, key1.pub, 5);
// With builder
auto block2 = builder
@@ -621,7 +621,7 @@ TEST (block_builder, change_equality)
TEST (block_builder, send)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
auto block = builder
.send ()
.destination_address ("xrb_1gys8r4crpxhp94n4uho5cshaho81na6454qni5gu9n53gksoyy1wcd4udyb")
@@ -634,11 +634,11 @@ TEST (block_builder, send)
TEST (block_builder, send_equality)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
// With constructor
- rai::keypair key1, key2;
- rai::send_block block1 (1, key1.pub, 2, key1.prv, key1.pub, 5);
+ nano::keypair key1, key2;
+ nano::send_block block1 (1, key1.pub, 2, key1.prv, key1.pub, 5);
// With builder
auto block2 = builder
@@ -658,11 +658,11 @@ TEST (block_builder, send_equality)
TEST (block_builder, receive_equality)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
// With constructor
- rai::keypair key1;
- rai::receive_block block1 (1, 2, key1.prv, key1.pub, 5);
+ nano::keypair key1;
+ nano::receive_block block1 (1, 2, key1.prv, key1.pub, 5);
// With builder
auto block2 = builder
@@ -681,7 +681,7 @@ TEST (block_builder, receive_equality)
TEST (block_builder, receive)
{
std::error_code ec;
- rai::block_builder builder;
+ nano::block_builder builder;
auto block = builder
.receive ()
.previous_hex ("59660153194CAC5DAC08509D87970BF86F6AEA943025E2A7ED7460930594950E")
diff --git a/rai/core_test/block_store.cpp b/nano/core_test/block_store.cpp
similarity index 63%
rename from rai/core_test/block_store.cpp
rename to nano/core_test/block_store.cpp
index 4622d2dc..e372a078 100644
--- a/rai/core_test/block_store.cpp
+++ b/nano/core_test/block_store.cpp
@@ -1,27 +1,27 @@
#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
#include
TEST (block_store, construction)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- auto now (rai::seconds_since_epoch ());
+ auto now (nano::seconds_since_epoch ());
ASSERT_GT (now, 1408074640);
}
TEST (block_store, add_item)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::open_block block (0, 1, 0, rai::keypair ().prv, 0, 0);
- rai::uint256_union hash1 (block.hash ());
+ nano::open_block block (0, 1, 0, nano::keypair ().prv, 0, 0);
+ nano::uint256_union hash1 (block.hash ());
auto transaction (store.tx_begin (true));
auto latest1 (store.block_get (transaction, hash1));
ASSERT_EQ (nullptr, latest1);
@@ -40,12 +40,12 @@ TEST (block_store, add_item)
TEST (block_store, add_nonempty_block)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::keypair key1;
- rai::open_block block (0, 1, 0, rai::keypair ().prv, 0, 0);
- rai::uint256_union hash1 (block.hash ());
- block.signature = rai::sign_message (key1.prv, key1.pub, hash1);
+ nano::keypair key1;
+ nano::open_block block (0, 1, 0, nano::keypair ().prv, 0, 0);
+ nano::uint256_union hash1 (block.hash ());
+ block.signature = nano::sign_message (key1.prv, key1.pub, hash1);
auto transaction (store.tx_begin (true));
auto latest1 (store.block_get (transaction, hash1));
ASSERT_EQ (nullptr, latest1);
@@ -58,19 +58,19 @@ TEST (block_store, add_nonempty_block)
TEST (block_store, add_two_items)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::keypair key1;
- rai::open_block block (0, 1, 1, rai::keypair ().prv, 0, 0);
- rai::uint256_union hash1 (block.hash ());
- block.signature = rai::sign_message (key1.prv, key1.pub, hash1);
+ nano::keypair key1;
+ nano::open_block block (0, 1, 1, nano::keypair ().prv, 0, 0);
+ nano::uint256_union hash1 (block.hash ());
+ block.signature = nano::sign_message (key1.prv, key1.pub, hash1);
auto transaction (store.tx_begin (true));
auto latest1 (store.block_get (transaction, hash1));
ASSERT_EQ (nullptr, latest1);
- rai::open_block block2 (0, 1, 3, rai::keypair ().prv, 0, 0);
+ nano::open_block block2 (0, 1, 3, nano::keypair ().prv, 0, 0);
block2.hashables.account = 3;
- rai::uint256_union hash2 (block2.hash ());
- block2.signature = rai::sign_message (key1.prv, key1.pub, hash2);
+ nano::uint256_union hash2 (block2.hash ());
+ block2.signature = nano::sign_message (key1.prv, key1.pub, hash2);
auto latest2 (store.block_get (transaction, hash2));
ASSERT_EQ (nullptr, latest2);
store.block_put (transaction, hash1, block);
@@ -87,15 +87,15 @@ TEST (block_store, add_two_items)
TEST (block_store, add_receive)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::keypair key1;
- rai::keypair key2;
- rai::open_block block1 (0, 1, 0, rai::keypair ().prv, 0, 0);
+ nano::keypair key1;
+ nano::keypair key2;
+ nano::open_block block1 (0, 1, 0, nano::keypair ().prv, 0, 0);
auto transaction (store.tx_begin (true));
store.block_put (transaction, block1.hash (), block1);
- rai::receive_block block (block1.hash (), 1, rai::keypair ().prv, 2, 3);
- rai::block_hash hash1 (block.hash ());
+ nano::receive_block block (block1.hash (), 1, nano::keypair ().prv, 2, 3);
+ nano::block_hash hash1 (block.hash ());
auto latest1 (store.block_get (transaction, hash1));
ASSERT_EQ (nullptr, latest1);
store.block_put (transaction, hash1, block);
@@ -107,15 +107,15 @@ TEST (block_store, add_receive)
TEST (block_store, add_pending)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::keypair key1;
- rai::pending_key key2 (0, 0);
- rai::pending_info pending1;
+ nano::keypair key1;
+ nano::pending_key key2 (0, 0);
+ nano::pending_info pending1;
auto transaction (store.tx_begin (true));
ASSERT_TRUE (store.pending_get (transaction, key2, pending1));
store.pending_put (transaction, key2, pending1);
- rai::pending_info pending2;
+ nano::pending_info pending2;
ASSERT_FALSE (store.pending_get (transaction, key2, pending2));
ASSERT_EQ (pending1, pending2);
store.pending_del (transaction, key2);
@@ -125,20 +125,20 @@ TEST (block_store, add_pending)
TEST (block_store, pending_iterator)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
auto transaction (store.tx_begin (true));
ASSERT_EQ (store.pending_end (), store.pending_begin (transaction));
- store.pending_put (transaction, rai::pending_key (1, 2), { 2, 3, rai::epoch::epoch_1 });
+ store.pending_put (transaction, nano::pending_key (1, 2), { 2, 3, nano::epoch::epoch_1 });
auto current (store.pending_begin (transaction));
ASSERT_NE (store.pending_end (), current);
- rai::pending_key key1 (current->first);
- ASSERT_EQ (rai::account (1), key1.account);
- ASSERT_EQ (rai::block_hash (2), key1.hash);
- rai::pending_info pending (current->second);
- ASSERT_EQ (rai::account (2), pending.source);
- ASSERT_EQ (rai::amount (3), pending.amount);
- ASSERT_EQ (rai::epoch::epoch_1, pending.epoch);
+ nano::pending_key key1 (current->first);
+ ASSERT_EQ (nano::account (1), key1.account);
+ ASSERT_EQ (nano::block_hash (2), key1.hash);
+ nano::pending_info pending (current->second);
+ ASSERT_EQ (nano::account (2), pending.source);
+ ASSERT_EQ (nano::amount (3), pending.amount);
+ ASSERT_EQ (nano::epoch::epoch_1, pending.epoch);
}
/**
@@ -150,25 +150,25 @@ TEST (block_store, pending_iterator)
TEST (block_store, pending_iterator_comparison)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::stat stats;
+ nano::stat stats;
auto transaction (store.tx_begin (true));
// Populate pending
- store.pending_put (transaction, rai::pending_key (rai::account (3), rai::block_hash (1)), rai::pending_info (rai::account (10), rai::amount (1), rai::epoch::epoch_0));
- store.pending_put (transaction, rai::pending_key (rai::account (3), rai::block_hash (4)), rai::pending_info (rai::account (10), rai::amount (0), rai::epoch::epoch_0));
+ store.pending_put (transaction, nano::pending_key (nano::account (3), nano::block_hash (1)), nano::pending_info (nano::account (10), nano::amount (1), nano::epoch::epoch_0));
+ store.pending_put (transaction, nano::pending_key (nano::account (3), nano::block_hash (4)), nano::pending_info (nano::account (10), nano::amount (0), nano::epoch::epoch_0));
// Populate pending_v1
- store.pending_put (transaction, rai::pending_key (rai::account (2), rai::block_hash (2)), rai::pending_info (rai::account (10), rai::amount (2), rai::epoch::epoch_1));
- store.pending_put (transaction, rai::pending_key (rai::account (2), rai::block_hash (3)), rai::pending_info (rai::account (10), rai::amount (3), rai::epoch::epoch_1));
+ store.pending_put (transaction, nano::pending_key (nano::account (2), nano::block_hash (2)), nano::pending_info (nano::account (10), nano::amount (2), nano::epoch::epoch_1));
+ store.pending_put (transaction, nano::pending_key (nano::account (2), nano::block_hash (3)), nano::pending_info (nano::account (10), nano::amount (3), nano::epoch::epoch_1));
// Iterate account 3 (pending)
{
size_t count = 0;
- rai::account begin (3);
- rai::account end (begin.number () + 1);
- for (auto i (store.pending_begin (transaction, rai::pending_key (begin, 0))), n (store.pending_begin (transaction, rai::pending_key (end, 0))); i != n; ++i, ++count)
+ nano::account begin (3);
+ nano::account end (begin.number () + 1);
+ for (auto i (store.pending_begin (transaction, nano::pending_key (begin, 0))), n (store.pending_begin (transaction, nano::pending_key (end, 0))); i != n; ++i, ++count)
{
- rai::pending_key key (i->first);
+ nano::pending_key key (i->first);
ASSERT_EQ (key.account, begin);
ASSERT_LT (count, 3);
}
@@ -178,11 +178,11 @@ TEST (block_store, pending_iterator_comparison)
// Iterate account 2 (pending_v1)
{
size_t count = 0;
- rai::account begin (2);
- rai::account end (begin.number () + 1);
- for (auto i (store.pending_begin (transaction, rai::pending_key (begin, 0))), n (store.pending_begin (transaction, rai::pending_key (end, 0))); i != n; ++i, ++count)
+ nano::account begin (2);
+ nano::account end (begin.number () + 1);
+ for (auto i (store.pending_begin (transaction, nano::pending_key (begin, 0))), n (store.pending_begin (transaction, nano::pending_key (end, 0))); i != n; ++i, ++count)
{
- rai::pending_key key (i->first);
+ nano::pending_key key (i->first);
ASSERT_EQ (key.account, begin);
ASSERT_LT (count, 3);
}
@@ -193,32 +193,32 @@ TEST (block_store, pending_iterator_comparison)
TEST (block_store, genesis)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::genesis genesis;
+ nano::genesis genesis;
auto hash (genesis.hash ());
auto transaction (store.tx_begin (true));
store.initialize (transaction, genesis);
- rai::account_info info;
- ASSERT_FALSE (store.account_get (transaction, rai::genesis_account, info));
+ nano::account_info info;
+ ASSERT_FALSE (store.account_get (transaction, nano::genesis_account, info));
ASSERT_EQ (hash, info.head);
auto block1 (store.block_get (transaction, info.head));
ASSERT_NE (nullptr, block1);
- auto receive1 (dynamic_cast (block1.get ()));
+ auto receive1 (dynamic_cast (block1.get ()));
ASSERT_NE (nullptr, receive1);
- ASSERT_LE (info.modified, rai::seconds_since_epoch ());
- auto test_pub_text (rai::test_genesis_key.pub.to_string ());
- auto test_pub_account (rai::test_genesis_key.pub.to_account ());
- auto test_prv_text (rai::test_genesis_key.prv.data.to_string ());
- ASSERT_EQ (rai::genesis_account, rai::test_genesis_key.pub);
+ ASSERT_LE (info.modified, nano::seconds_since_epoch ());
+ auto test_pub_text (nano::test_genesis_key.pub.to_string ());
+ auto test_pub_account (nano::test_genesis_key.pub.to_account ());
+ auto test_prv_text (nano::test_genesis_key.prv.data.to_string ());
+ ASSERT_EQ (nano::genesis_account, nano::test_genesis_key.pub);
}
TEST (representation, changes)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::keypair key1;
+ nano::keypair key1;
auto transaction (store.tx_begin (true));
ASSERT_EQ (0, store.representation_get (transaction, key1.pub));
store.representation_put (transaction, key1.pub, 1);
@@ -230,9 +230,9 @@ TEST (representation, changes)
TEST (bootstrap, simple)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- auto block1 (std::make_shared (0, 1, 2, rai::keypair ().prv, 4, 5));
+ auto block1 (std::make_shared (0, 1, 2, nano::keypair ().prv, 4, 5));
auto transaction (store.tx_begin (true));
auto block2 (store.unchecked_get (transaction, block1->previous ()));
ASSERT_TRUE (block2.empty ());
@@ -240,7 +240,7 @@ TEST (bootstrap, simple)
auto block3 (store.unchecked_get (transaction, block1->previous ()));
ASSERT_FALSE (block3.empty ());
ASSERT_EQ (*block1, *block3[0]);
- store.unchecked_del (transaction, rai::unchecked_key (block1->previous (), block1->hash ()));
+ store.unchecked_del (transaction, nano::unchecked_key (block1->previous (), block1->hash ()));
auto block4 (store.unchecked_get (transaction, block1->previous ()));
ASSERT_TRUE (block4.empty ());
}
@@ -248,9 +248,9 @@ TEST (bootstrap, simple)
TEST (unchecked, multiple)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- auto block1 (std::make_shared (4, 1, 2, rai::keypair ().prv, 4, 5));
+ auto block1 (std::make_shared (4, 1, 2, nano::keypair ().prv, 4, 5));
auto transaction (store.tx_begin (true));
auto block2 (store.unchecked_get (transaction, block1->previous ()));
ASSERT_TRUE (block2.empty ());
@@ -265,9 +265,9 @@ TEST (unchecked, multiple)
TEST (unchecked, double_put)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- auto block1 (std::make_shared (4, 1, 2, rai::keypair ().prv, 4, 5));
+ auto block1 (std::make_shared (4, 1, 2, nano::keypair ().prv, 4, 5));
auto transaction (store.tx_begin (true));
auto block2 (store.unchecked_get (transaction, block1->previous ()));
ASSERT_TRUE (block2.empty ());
@@ -280,11 +280,11 @@ TEST (unchecked, double_put)
TEST (unchecked, multiple_get)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- auto block1 (std::make_shared (4, 1, 2, rai::keypair ().prv, 4, 5));
- auto block2 (std::make_shared (3, 1, 2, rai::keypair ().prv, 4, 5));
- auto block3 (std::make_shared (5, 1, 2, rai::keypair ().prv, 4, 5));
+ auto block1 (std::make_shared (4, 1, 2, nano::keypair ().prv, 4, 5));
+ auto block2 (std::make_shared (3, 1, 2, nano::keypair ().prv, 4, 5));
+ auto block3 (std::make_shared (5, 1, 2, nano::keypair ().prv, 4, 5));
{
auto transaction (store.tx_begin (true));
store.unchecked_put (transaction, block1->previous (), block1); // unchecked1
@@ -299,7 +299,7 @@ TEST (unchecked, multiple_get)
auto transaction (store.tx_begin ());
auto unchecked_count (store.unchecked_count (transaction));
ASSERT_EQ (unchecked_count, 8);
- std::vector unchecked1;
+ std::vector unchecked1;
auto unchecked1_blocks (store.unchecked_get (transaction, block1->previous ()));
ASSERT_EQ (unchecked1_blocks.size (), 3);
for (auto & i : unchecked1_blocks)
@@ -309,7 +309,7 @@ TEST (unchecked, multiple_get)
ASSERT_TRUE (std::find (unchecked1.begin (), unchecked1.end (), block1->hash ()) != unchecked1.end ());
ASSERT_TRUE (std::find (unchecked1.begin (), unchecked1.end (), block2->hash ()) != unchecked1.end ());
ASSERT_TRUE (std::find (unchecked1.begin (), unchecked1.end (), block3->hash ()) != unchecked1.end ());
- std::vector unchecked2;
+ std::vector unchecked2;
auto unchecked2_blocks (store.unchecked_get (transaction, block1->hash ()));
ASSERT_EQ (unchecked2_blocks.size (), 2);
for (auto & i : unchecked2_blocks)
@@ -331,25 +331,25 @@ TEST (unchecked, multiple_get)
TEST (checksum, simple)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::block_hash hash0 (0);
+ nano::block_hash hash0 (0);
auto transaction (store.tx_begin (true));
ASSERT_TRUE (store.checksum_get (transaction, 0x100, 0x10, hash0));
- rai::block_hash hash1 (0);
+ nano::block_hash hash1 (0);
store.checksum_put (transaction, 0x100, 0x10, hash1);
- rai::block_hash hash2;
+ nano::block_hash hash2;
ASSERT_FALSE (store.checksum_get (transaction, 0x100, 0x10, hash2));
ASSERT_EQ (hash1, hash2);
store.checksum_del (transaction, 0x100, 0x10);
- rai::block_hash hash3;
+ nano::block_hash hash3;
ASSERT_TRUE (store.checksum_get (transaction, 0x100, 0x10, hash3));
}
TEST (block_store, empty_accounts)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
auto transaction (store.tx_begin ());
auto begin (store.latest_begin (transaction));
@@ -360,9 +360,9 @@ TEST (block_store, empty_accounts)
TEST (block_store, one_block)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::open_block block1 (0, 1, 0, rai::keypair ().prv, 0, 0);
+ nano::open_block block1 (0, 1, 0, nano::keypair ().prv, 0, 0);
auto transaction (store.tx_begin (true));
store.block_put (transaction, block1.hash (), block1);
ASSERT_TRUE (store.block_exists (transaction, block1.hash ()));
@@ -371,7 +371,7 @@ TEST (block_store, one_block)
TEST (block_store, empty_bootstrap)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
auto transaction (store.tx_begin ());
auto begin (store.unchecked_begin (transaction));
@@ -382,16 +382,16 @@ TEST (block_store, empty_bootstrap)
TEST (block_store, one_bootstrap)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- auto block1 (std::make_shared (0, 1, 2, rai::keypair ().prv, 4, 5));
+ auto block1 (std::make_shared (0, 1, 2, nano::keypair ().prv, 4, 5));
auto transaction (store.tx_begin (true));
store.unchecked_put (transaction, block1->hash (), block1);
store.flush (transaction);
auto begin (store.unchecked_begin (transaction));
auto end (store.unchecked_end ());
ASSERT_NE (end, begin);
- rai::uint256_union hash1 (begin->first.key ());
+ nano::uint256_union hash1 (begin->first.key ());
ASSERT_EQ (block1->hash (), hash1);
auto blocks (store.unchecked_get (transaction, hash1));
ASSERT_EQ (1, blocks.size ());
@@ -404,23 +404,23 @@ TEST (block_store, one_bootstrap)
TEST (block_store, unchecked_begin_search)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::keypair key0;
- rai::send_block block1 (0, 1, 2, key0.prv, key0.pub, 3);
- rai::send_block block2 (5, 6, 7, key0.prv, key0.pub, 8);
+ nano::keypair key0;
+ nano::send_block block1 (0, 1, 2, key0.prv, key0.pub, 3);
+ nano::send_block block2 (5, 6, 7, key0.prv, key0.pub, 8);
}
TEST (block_store, frontier_retrieval)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::account account1 (0);
- rai::account_info info1 (0, 0, 0, 0, 0, 0, rai::epoch::epoch_0);
+ nano::account account1 (0);
+ nano::account_info info1 (0, 0, 0, 0, 0, 0, nano::epoch::epoch_0);
auto transaction (store.tx_begin (true));
store.account_put (transaction, account1, info1);
- rai::account_info info2;
+ nano::account_info info2;
store.account_get (transaction, account1, info2);
ASSERT_EQ (info1, info2);
}
@@ -428,17 +428,17 @@ TEST (block_store, frontier_retrieval)
TEST (block_store, one_account)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::account account (0);
- rai::block_hash hash (0);
+ nano::account account (0);
+ nano::block_hash hash (0);
auto transaction (store.tx_begin (true));
- store.account_put (transaction, account, { hash, account, hash, 42, 100, 200, rai::epoch::epoch_0 });
+ store.account_put (transaction, account, { hash, account, hash, 42, 100, 200, nano::epoch::epoch_0 });
auto begin (store.latest_begin (transaction));
auto end (store.latest_end ());
ASSERT_NE (end, begin);
- ASSERT_EQ (account, rai::account (begin->first));
- rai::account_info info (begin->second);
+ ASSERT_EQ (account, nano::account (begin->first));
+ nano::account_info info (begin->second);
ASSERT_EQ (hash, info.head);
ASSERT_EQ (42, info.balance.number ());
ASSERT_EQ (100, info.modified);
@@ -450,17 +450,17 @@ TEST (block_store, one_account)
TEST (block_store, two_block)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::open_block block1 (0, 1, 1, rai::keypair ().prv, 0, 0);
+ nano::open_block block1 (0, 1, 1, nano::keypair ().prv, 0, 0);
block1.hashables.account = 1;
- std::vector hashes;
- std::vector blocks;
+ std::vector hashes;
+ std::vector blocks;
hashes.push_back (block1.hash ());
blocks.push_back (block1);
auto transaction (store.tx_begin (true));
store.block_put (transaction, hashes[0], block1);
- rai::open_block block2 (0, 1, 2, rai::keypair ().prv, 0, 0);
+ nano::open_block block2 (0, 1, 2, nano::keypair ().prv, 0, 0);
hashes.push_back (block2.hash ());
blocks.push_back (block2);
store.block_put (transaction, hashes[1], block2);
@@ -471,28 +471,28 @@ TEST (block_store, two_block)
TEST (block_store, two_account)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::account account1 (1);
- rai::block_hash hash1 (2);
- rai::account account2 (3);
- rai::block_hash hash2 (4);
+ nano::account account1 (1);
+ nano::block_hash hash1 (2);
+ nano::account account2 (3);
+ nano::block_hash hash2 (4);
auto transaction (store.tx_begin (true));
- store.account_put (transaction, account1, { hash1, account1, hash1, 42, 100, 300, rai::epoch::epoch_0 });
- store.account_put (transaction, account2, { hash2, account2, hash2, 84, 200, 400, rai::epoch::epoch_0 });
+ store.account_put (transaction, account1, { hash1, account1, hash1, 42, 100, 300, nano::epoch::epoch_0 });
+ store.account_put (transaction, account2, { hash2, account2, hash2, 84, 200, 400, nano::epoch::epoch_0 });
auto begin (store.latest_begin (transaction));
auto end (store.latest_end ());
ASSERT_NE (end, begin);
- ASSERT_EQ (account1, rai::account (begin->first));
- rai::account_info info1 (begin->second);
+ ASSERT_EQ (account1, nano::account (begin->first));
+ nano::account_info info1 (begin->second);
ASSERT_EQ (hash1, info1.head);
ASSERT_EQ (42, info1.balance.number ());
ASSERT_EQ (100, info1.modified);
ASSERT_EQ (300, info1.block_count);
++begin;
ASSERT_NE (end, begin);
- ASSERT_EQ (account2, rai::account (begin->first));
- rai::account_info info2 (begin->second);
+ ASSERT_EQ (account2, nano::account (begin->first));
+ nano::account_info info2 (begin->second);
ASSERT_EQ (hash2, info2.head);
ASSERT_EQ (84, info2.balance.number ());
ASSERT_EQ (200, info2.modified);
@@ -504,15 +504,15 @@ TEST (block_store, two_account)
TEST (block_store, latest_find)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::account account1 (1);
- rai::block_hash hash1 (2);
- rai::account account2 (3);
- rai::block_hash hash2 (4);
+ nano::account account1 (1);
+ nano::block_hash hash1 (2);
+ nano::account account2 (3);
+ nano::block_hash hash2 (4);
auto transaction (store.tx_begin (true));
- store.account_put (transaction, account1, { hash1, account1, hash1, 100, 0, 300, rai::epoch::epoch_0 });
- store.account_put (transaction, account2, { hash2, account2, hash2, 200, 0, 400, rai::epoch::epoch_0 });
+ store.account_put (transaction, account1, { hash1, account1, hash1, 100, 0, 300, nano::epoch::epoch_0 });
+ store.account_put (transaction, account2, { hash2, account2, hash2, 200, 0, 400, nano::epoch::epoch_0 });
auto first (store.latest_begin (transaction));
auto second (store.latest_begin (transaction));
++second;
@@ -527,84 +527,84 @@ TEST (block_store, latest_find)
TEST (block_store, bad_path)
{
bool init (false);
- rai::mdb_store store (init, boost::filesystem::path ("///"));
+ nano::mdb_store store (init, boost::filesystem::path ("///"));
ASSERT_TRUE (init);
}
TEST (block_store, DISABLED_already_open) // File can be shared
{
- auto path (rai::unique_path ());
+ auto path (nano::unique_path ());
boost::filesystem::create_directories (path.parent_path ());
- rai::set_secure_perm_directory (path.parent_path ());
+ nano::set_secure_perm_directory (path.parent_path ());
std::ofstream file;
file.open (path.string ().c_str ());
ASSERT_TRUE (file.is_open ());
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_TRUE (init);
}
TEST (block_store, roots)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::send_block send_block (0, 1, 2, rai::keypair ().prv, 4, 5);
+ nano::send_block send_block (0, 1, 2, nano::keypair ().prv, 4, 5);
ASSERT_EQ (send_block.hashables.previous, send_block.root ());
- rai::change_block change_block (0, 1, rai::keypair ().prv, 3, 4);
+ nano::change_block change_block (0, 1, nano::keypair ().prv, 3, 4);
ASSERT_EQ (change_block.hashables.previous, change_block.root ());
- rai::receive_block receive_block (0, 1, rai::keypair ().prv, 3, 4);
+ nano::receive_block receive_block (0, 1, nano::keypair ().prv, 3, 4);
ASSERT_EQ (receive_block.hashables.previous, receive_block.root ());
- rai::open_block open_block (0, 1, 2, rai::keypair ().prv, 4, 5);
+ nano::open_block open_block (0, 1, 2, nano::keypair ().prv, 4, 5);
ASSERT_EQ (open_block.hashables.account, open_block.root ());
}
TEST (block_store, pending_exists)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::pending_key two (2, 0);
- rai::pending_info pending;
+ nano::pending_key two (2, 0);
+ nano::pending_info pending;
auto transaction (store.tx_begin (true));
store.pending_put (transaction, two, pending);
- rai::pending_key one (1, 0);
+ nano::pending_key one (1, 0);
ASSERT_FALSE (store.pending_exists (transaction, one));
}
TEST (block_store, latest_exists)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::block_hash two (2);
- rai::account_info info;
+ nano::block_hash two (2);
+ nano::account_info info;
auto transaction (store.tx_begin (true));
store.account_put (transaction, two, info);
- rai::block_hash one (1);
+ nano::block_hash one (1);
ASSERT_FALSE (store.account_exists (transaction, one));
}
TEST (block_store, large_iteration)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- std::unordered_set accounts1;
+ std::unordered_set accounts1;
for (auto i (0); i < 1000; ++i)
{
auto transaction (store.tx_begin (true));
- rai::account account;
- rai::random_pool.GenerateBlock (account.bytes.data (), account.bytes.size ());
+ nano::account account;
+ nano::random_pool.GenerateBlock (account.bytes.data (), account.bytes.size ());
accounts1.insert (account);
- store.account_put (transaction, account, rai::account_info ());
+ store.account_put (transaction, account, nano::account_info ());
}
- std::unordered_set accounts2;
- rai::account previous (0);
+ std::unordered_set accounts2;
+ nano::account previous (0);
auto transaction (store.tx_begin ());
for (auto i (store.latest_begin (transaction, 0)), n (store.latest_end ()); i != n; ++i)
{
- rai::account current (i->first);
+ nano::account current (i->first);
assert (current.number () > previous.number ());
accounts2.insert (current);
previous = current;
@@ -615,11 +615,11 @@ TEST (block_store, large_iteration)
TEST (block_store, frontier)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
auto transaction (store.tx_begin (true));
- rai::block_hash hash (100);
- rai::account account (200);
+ nano::block_hash hash (100);
+ nano::account account (200);
ASSERT_TRUE (store.frontier_get (transaction, hash).is_zero ());
store.frontier_put (transaction, hash, account);
ASSERT_EQ (account, store.frontier_get (transaction, hash));
@@ -630,10 +630,10 @@ TEST (block_store, frontier)
TEST (block_store, block_replace)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::send_block send1 (0, 0, 0, rai::keypair ().prv, 0, 1);
- rai::send_block send2 (0, 0, 0, rai::keypair ().prv, 0, 2);
+ nano::send_block send1 (0, 0, 0, nano::keypair ().prv, 0, 1);
+ nano::send_block send2 (0, 0, 0, nano::keypair ().prv, 0, 2);
auto transaction (store.tx_begin (true));
store.block_put (transaction, 0, send1);
store.block_put (transaction, 0, send2);
@@ -645,12 +645,12 @@ TEST (block_store, block_replace)
TEST (block_store, block_count)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
auto transaction (store.tx_begin (true));
ASSERT_EQ (0, store.block_count (transaction).sum ());
- rai::open_block block (0, 1, 0, rai::keypair ().prv, 0, 0);
- rai::uint256_union hash1 (block.hash ());
+ nano::open_block block (0, 1, 0, nano::keypair ().prv, 0, 0);
+ nano::uint256_union hash1 (block.hash ());
store.block_put (transaction, hash1, block);
ASSERT_EQ (1, store.block_count (transaction).sum ());
}
@@ -658,23 +658,23 @@ TEST (block_store, block_count)
TEST (block_store, account_count)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
auto transaction (store.tx_begin (true));
ASSERT_EQ (0, store.account_count (transaction));
- rai::account account (200);
- store.account_put (transaction, account, rai::account_info ());
+ nano::account account (200);
+ store.account_put (transaction, account, nano::account_info ());
ASSERT_EQ (1, store.account_count (transaction));
}
TEST (block_store, sequence_increment)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::keypair key1;
- rai::keypair key2;
- auto block1 (std::make_shared (0, 1, 0, rai::keypair ().prv, 0, 0));
+ nano::keypair key1;
+ nano::keypair key2;
+ auto block1 (std::make_shared (0, 1, 0, nano::keypair ().prv, 0, 0));
auto transaction (store.tx_begin (true));
auto vote1 (store.vote_generate (transaction, key1.pub, key1.prv, block1));
ASSERT_EQ (1, vote1->sequence);
@@ -698,117 +698,117 @@ TEST (block_store, sequence_increment)
TEST (block_store, upgrade_v2_v3)
{
- rai::keypair key1;
- rai::keypair key2;
- rai::block_hash change_hash;
- auto path (rai::unique_path ());
+ nano::keypair key1;
+ nano::keypair key2;
+ nano::block_hash change_hash;
+ auto path (nano::unique_path ());
{
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_TRUE (!init);
auto transaction (store.tx_begin (true));
- rai::genesis genesis;
+ nano::genesis genesis;
auto hash (genesis.hash ());
store.initialize (transaction, genesis);
- rai::stat stats;
- rai::ledger ledger (store, stats);
- rai::change_block change (hash, key1.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::change_block change (hash, key1.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
change_hash = change.hash ();
- ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, change).code);
- ASSERT_EQ (0, ledger.weight (transaction, rai::test_genesis_key.pub));
- ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, key1.pub));
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, change).code);
+ ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, key1.pub));
store.version_put (transaction, 2);
store.representation_put (transaction, key1.pub, 7);
ASSERT_EQ (7, ledger.weight (transaction, key1.pub));
ASSERT_EQ (2, store.version_get (transaction));
store.representation_put (transaction, key2.pub, 6);
ASSERT_EQ (6, ledger.weight (transaction, key2.pub));
- rai::account_info info;
- ASSERT_FALSE (store.account_get (transaction, rai::test_genesis_key.pub, info));
+ nano::account_info info;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info));
info.rep_block = 42;
- rai::account_info_v5 info_old (info.head, info.rep_block, info.open_block, info.balance, info.modified);
- auto status (mdb_put (store.env.tx (transaction), store.accounts_v0, rai::mdb_val (rai::test_genesis_key.pub), info_old.val (), 0));
+ nano::account_info_v5 info_old (info.head, info.rep_block, info.open_block, info.balance, info.modified);
+ auto status (mdb_put (store.env.tx (transaction), store.accounts_v0, nano::mdb_val (nano::test_genesis_key.pub), info_old.val (), 0));
assert (status == 0);
}
bool init (false);
- rai::mdb_store store (init, path);
- rai::stat stats;
- rai::ledger ledger (store, stats);
+ nano::mdb_store store (init, path);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
auto transaction (store.tx_begin (true));
ASSERT_TRUE (!init);
ASSERT_LT (2, store.version_get (transaction));
- ASSERT_EQ (rai::genesis_amount, ledger.weight (transaction, key1.pub));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, key1.pub));
ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
- rai::account_info info;
- ASSERT_FALSE (store.account_get (transaction, rai::test_genesis_key.pub, info));
+ nano::account_info info;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info));
ASSERT_EQ (change_hash, info.rep_block);
}
TEST (block_store, upgrade_v3_v4)
{
- rai::keypair key1;
- rai::keypair key2;
- rai::keypair key3;
- auto path (rai::unique_path ());
+ nano::keypair key1;
+ nano::keypair key2;
+ nano::keypair key3;
+ auto path (nano::unique_path ());
{
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin (true));
store.version_put (transaction, 3);
- rai::pending_info_v3 info (key1.pub, 100, key2.pub);
- auto status (mdb_put (store.env.tx (transaction), store.pending_v0, rai::mdb_val (key3.pub), info.val (), 0));
+ nano::pending_info_v3 info (key1.pub, 100, key2.pub);
+ auto status (mdb_put (store.env.tx (transaction), store.pending_v0, nano::mdb_val (key3.pub), info.val (), 0));
ASSERT_EQ (0, status);
}
bool init (false);
- rai::mdb_store store (init, path);
- rai::stat stats;
- rai::ledger ledger (store, stats);
+ nano::mdb_store store (init, path);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
auto transaction (store.tx_begin (true));
ASSERT_FALSE (init);
ASSERT_LT (3, store.version_get (transaction));
- rai::pending_key key (key2.pub, key3.pub);
- rai::pending_info info;
+ nano::pending_key key (key2.pub, key3.pub);
+ nano::pending_info info;
auto error (store.pending_get (transaction, key, info));
ASSERT_FALSE (error);
ASSERT_EQ (key1.pub, info.source);
- ASSERT_EQ (rai::amount (100), info.amount);
- ASSERT_EQ (rai::epoch::epoch_0, info.epoch);
+ ASSERT_EQ (nano::amount (100), info.amount);
+ ASSERT_EQ (nano::epoch::epoch_0, info.epoch);
}
TEST (block_store, upgrade_v4_v5)
{
- rai::block_hash genesis_hash (0);
- rai::block_hash hash (0);
- auto path (rai::unique_path ());
+ nano::block_hash genesis_hash (0);
+ nano::block_hash hash (0);
+ auto path (nano::unique_path ());
{
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin (true));
- rai::genesis genesis;
- rai::stat stats;
- rai::ledger ledger (store, stats);
+ nano::genesis genesis;
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
store.initialize (transaction, genesis);
store.version_put (transaction, 4);
- rai::account_info info;
- store.account_get (transaction, rai::test_genesis_key.pub, info);
- rai::keypair key0;
- rai::send_block block0 (info.head, key0.pub, rai::genesis_amount - rai::Gxrb_ratio, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
- ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, block0).code);
+ nano::account_info info;
+ store.account_get (transaction, nano::test_genesis_key.pub, info);
+ nano::keypair key0;
+ nano::send_block block0 (info.head, key0.pub, nano::genesis_amount - nano::Gxrb_ratio, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block0).code);
hash = block0.hash ();
auto original (store.block_get (transaction, info.head));
genesis_hash = info.head;
store.block_successor_clear (transaction, info.head);
ASSERT_TRUE (store.block_successor (transaction, genesis_hash).is_zero ());
- rai::account_info info2;
- store.account_get (transaction, rai::test_genesis_key.pub, info2);
- rai::account_info_v5 info_old (info2.head, info2.rep_block, info2.open_block, info2.balance, info2.modified);
- auto status (mdb_put (store.env.tx (transaction), store.accounts_v0, rai::mdb_val (rai::test_genesis_key.pub), info_old.val (), 0));
+ nano::account_info info2;
+ store.account_get (transaction, nano::test_genesis_key.pub, info2);
+ nano::account_info_v5 info_old (info2.head, info2.rep_block, info2.open_block, info2.balance, info2.modified);
+ auto status (mdb_put (store.env.tx (transaction), store.accounts_v0, nano::mdb_val (nano::test_genesis_key.pub), info_old.val (), 0));
assert (status == 0);
}
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin ());
ASSERT_EQ (hash, store.block_successor (transaction, genesis_hash));
@@ -817,9 +817,9 @@ TEST (block_store, upgrade_v4_v5)
TEST (block_store, block_random)
{
bool init (false);
- rai::mdb_store store (init, rai::unique_path ());
+ nano::mdb_store store (init, nano::unique_path ());
ASSERT_TRUE (!init);
- rai::genesis genesis;
+ nano::genesis genesis;
auto transaction (store.tx_begin (true));
store.initialize (transaction, genesis);
auto block (store.block_random (transaction));
@@ -829,48 +829,48 @@ TEST (block_store, block_random)
TEST (block_store, upgrade_v5_v6)
{
- auto path (rai::unique_path ());
+ auto path (nano::unique_path ());
{
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin (true));
- rai::genesis genesis;
+ nano::genesis genesis;
store.initialize (transaction, genesis);
store.version_put (transaction, 5);
- rai::account_info info;
- store.account_get (transaction, rai::test_genesis_key.pub, info);
- rai::account_info_v5 info_old (info.head, info.rep_block, info.open_block, info.balance, info.modified);
- auto status (mdb_put (store.env.tx (transaction), store.accounts_v0, rai::mdb_val (rai::test_genesis_key.pub), info_old.val (), 0));
+ nano::account_info info;
+ store.account_get (transaction, nano::test_genesis_key.pub, info);
+ nano::account_info_v5 info_old (info.head, info.rep_block, info.open_block, info.balance, info.modified);
+ auto status (mdb_put (store.env.tx (transaction), store.accounts_v0, nano::mdb_val (nano::test_genesis_key.pub), info_old.val (), 0));
assert (status == 0);
}
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin ());
- rai::account_info info;
- store.account_get (transaction, rai::test_genesis_key.pub, info);
+ nano::account_info info;
+ store.account_get (transaction, nano::test_genesis_key.pub, info);
ASSERT_EQ (1, info.block_count);
}
TEST (block_store, upgrade_v6_v7)
{
- auto path (rai::unique_path ());
+ auto path (nano::unique_path ());
{
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin (true));
- rai::genesis genesis;
+ nano::genesis genesis;
store.initialize (transaction, genesis);
store.version_put (transaction, 6);
- auto send1 (std::make_shared (0, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
+ auto send1 (std::make_shared (0, 0, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
store.unchecked_put (transaction, send1->hash (), send1);
store.flush (transaction);
ASSERT_NE (store.unchecked_end (), store.unchecked_begin (transaction));
}
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin ());
ASSERT_EQ (store.unchecked_end (), store.unchecked_begin (transaction));
@@ -879,14 +879,14 @@ TEST (block_store, upgrade_v6_v7)
// Databases need to be dropped in order to convert to dupsort compatible
TEST (block_store, DISABLED_change_dupsort) // Unchecked is no longer dupsort table
{
- auto path (rai::unique_path ());
+ auto path (nano::unique_path ());
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
auto transaction (store.tx_begin (true));
ASSERT_EQ (0, mdb_drop (store.env.tx (transaction), store.unchecked, 1));
ASSERT_EQ (0, mdb_dbi_open (store.env.tx (transaction), "unchecked", MDB_CREATE, &store.unchecked));
- auto send1 (std::make_shared (0, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
- auto send2 (std::make_shared (1, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
+ auto send1 (std::make_shared (0, 0, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ auto send2 (std::make_shared (1, 0, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
ASSERT_NE (send1->hash (), send2->hash ());
store.unchecked_put (transaction, send1->hash (), send1);
store.unchecked_put (transaction, send1->hash (), send2);
@@ -923,21 +923,21 @@ TEST (block_store, DISABLED_change_dupsort) // Unchecked is no longer dupsort ta
TEST (block_store, upgrade_v7_v8)
{
- auto path (rai::unique_path ());
+ auto path (nano::unique_path ());
{
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
auto transaction (store.tx_begin (true));
ASSERT_EQ (0, mdb_drop (store.env.tx (transaction), store.unchecked, 1));
ASSERT_EQ (0, mdb_dbi_open (store.env.tx (transaction), "unchecked", MDB_CREATE, &store.unchecked));
store.version_put (transaction, 7);
}
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin (true));
- auto send1 (std::make_shared (0, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
- auto send2 (std::make_shared (1, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
+ auto send1 (std::make_shared (0, 0, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ auto send2 (std::make_shared (1, 0, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
store.unchecked_put (transaction, send1->hash (), send1);
store.unchecked_put (transaction, send1->hash (), send2);
store.flush (transaction);
@@ -952,13 +952,13 @@ TEST (block_store, upgrade_v7_v8)
TEST (block_store, sequence_flush)
{
- auto path (rai::unique_path ());
+ auto path (nano::unique_path ());
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin (true));
- rai::keypair key1;
- auto send1 (std::make_shared (0, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0));
+ nano::keypair key1;
+ auto send1 (std::make_shared (0, 0, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
auto vote1 (store.vote_generate (transaction, key1.pub, key1.prv, send1));
auto seq2 (store.vote_get (transaction, vote1->account));
ASSERT_EQ (nullptr, seq2);
@@ -969,14 +969,14 @@ TEST (block_store, sequence_flush)
TEST (block_store, sequence_flush_by_hash)
{
- auto path (rai::unique_path ());
+ auto path (nano::unique_path ());
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin_write ());
- rai::keypair key1;
- std::vector blocks1;
- blocks1.push_back (rai::genesis ().hash ());
+ nano::keypair key1;
+ std::vector blocks1;
+ blocks1.push_back (nano::genesis ().hash ());
blocks1.push_back (1234);
blocks1.push_back (5678);
auto vote1 (store.vote_generate (transaction, key1.pub, key1.prv, blocks1));
@@ -990,20 +990,20 @@ TEST (block_store, sequence_flush_by_hash)
// Upgrading tracking block sequence numbers to whole vote.
TEST (block_store, upgrade_v8_v9)
{
- auto path (rai::unique_path ());
- rai::keypair key;
+ auto path (nano::unique_path ());
+ nano::keypair key;
{
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
auto transaction (store.tx_begin (true));
ASSERT_EQ (0, mdb_drop (store.env.tx (transaction), store.vote, 1));
ASSERT_EQ (0, mdb_dbi_open (store.env.tx (transaction), "sequence", MDB_CREATE, &store.vote));
uint64_t sequence (10);
- ASSERT_EQ (0, mdb_put (store.env.tx (transaction), store.vote, rai::mdb_val (key.pub), rai::mdb_val (sizeof (sequence), &sequence), 0));
+ ASSERT_EQ (0, mdb_put (store.env.tx (transaction), store.vote, nano::mdb_val (key.pub), nano::mdb_val (sizeof (sequence), &sequence), 0));
store.version_put (transaction, 8);
}
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin ());
ASSERT_LT (8, store.version_get (transaction));
@@ -1014,60 +1014,60 @@ TEST (block_store, upgrade_v8_v9)
TEST (block_store, upgrade_v9_v10)
{
- auto path (rai::unique_path ());
- rai::block_hash hash (0);
+ auto path (nano::unique_path ());
+ nano::block_hash hash (0);
{
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin (true));
- rai::genesis genesis;
- rai::stat stats;
- rai::ledger ledger (store, stats);
+ nano::genesis genesis;
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
store.initialize (transaction, genesis);
store.version_put (transaction, 9);
- rai::account_info info;
- store.account_get (transaction, rai::test_genesis_key.pub, info);
- rai::keypair key0;
- rai::uint128_t balance (rai::genesis_amount);
+ nano::account_info info;
+ store.account_get (transaction, nano::test_genesis_key.pub, info);
+ nano::keypair key0;
+ nano::uint128_t balance (nano::genesis_amount);
hash = info.head;
for (auto i (1); i < 32; ++i) // Making 31 send blocks (+ 1 open = 32 total)
{
- balance = balance - rai::Gxrb_ratio;
- rai::send_block block0 (hash, key0.pub, balance, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
- ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, block0).code);
+ balance = balance - nano::Gxrb_ratio;
+ nano::send_block block0 (hash, key0.pub, balance, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block0).code);
hash = block0.hash ();
}
- rai::block_info block_info_auto; // Checking automatic block_info creation for block 32
+ nano::block_info block_info_auto; // Checking automatic block_info creation for block 32
store.block_info_get (transaction, hash, block_info_auto);
- ASSERT_EQ (block_info_auto.account, rai::test_genesis_key.pub);
+ ASSERT_EQ (block_info_auto.account, nano::test_genesis_key.pub);
ASSERT_EQ (block_info_auto.balance.number (), balance);
ASSERT_EQ (0, mdb_drop (store.env.tx (transaction), store.blocks_info, 0)); // Cleaning blocks_info subdatabase
bool block_info_exists (store.block_info_exists (transaction, hash));
ASSERT_EQ (block_info_exists, 0); // Checking if automatic block_info is deleted
}
bool init (false);
- rai::mdb_store store (init, path);
+ nano::mdb_store store (init, path);
ASSERT_FALSE (init);
auto transaction (store.tx_begin ());
ASSERT_LT (9, store.version_get (transaction));
- rai::block_info block_info;
+ nano::block_info block_info;
store.block_info_get (transaction, hash, block_info);
- ASSERT_EQ (block_info.account, rai::test_genesis_key.pub);
- ASSERT_EQ (block_info.balance.number (), rai::genesis_amount - rai::Gxrb_ratio * 31);
+ ASSERT_EQ (block_info.account, nano::test_genesis_key.pub);
+ ASSERT_EQ (block_info.balance.number (), nano::genesis_amount - nano::Gxrb_ratio * 31);
}
TEST (block_store, state_block)
{
bool error (false);
- rai::mdb_store store (error, rai::unique_path ());
+ nano::mdb_store store (error, nano::unique_path ());
ASSERT_FALSE (error);
- rai::genesis genesis;
+ nano::genesis genesis;
auto transaction (store.tx_begin (true));
store.initialize (transaction, genesis);
- rai::keypair key1;
- rai::state_block block1 (1, genesis.hash (), 3, 4, 6, key1.prv, key1.pub, 7);
- ASSERT_EQ (rai::block_type::state, block1.type ());
+ nano::keypair key1;
+ nano::state_block block1 (1, genesis.hash (), 3, 4, 6, key1.prv, key1.pub, 7);
+ ASSERT_EQ (nano::block_type::state, block1.type ());
store.block_put (transaction, block1.hash (), block1);
ASSERT_TRUE (store.block_exists (transaction, block1.hash ()));
auto block2 (store.block_get (transaction, block1.hash ()));
diff --git a/nano/core_test/conflicts.cpp b/nano/core_test/conflicts.cpp
new file mode 100644
index 00000000..590dcd40
--- /dev/null
+++ b/nano/core_test/conflicts.cpp
@@ -0,0 +1,175 @@
+#include
+#include
+
+TEST (conflicts, start_stop)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ ASSERT_EQ (nano::process_result::progress, node1.process (*send1).code);
+ ASSERT_EQ (0, node1.active.roots.size ());
+ node1.active.start (send1);
+ ASSERT_EQ (1, node1.active.roots.size ());
+ auto root1 (send1->root ());
+ auto existing1 (node1.active.roots.find (root1));
+ ASSERT_NE (node1.active.roots.end (), existing1);
+ auto votes1 (existing1->election);
+ ASSERT_NE (nullptr, votes1);
+ ASSERT_EQ (1, votes1->last_votes.size ());
+}
+
+TEST (conflicts, add_existing)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ ASSERT_EQ (nano::process_result::progress, node1.process (*send1).code);
+ node1.active.start (send1);
+ nano::keypair key2;
+ auto send2 (std::make_shared (genesis.hash (), key2.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.active.start (send2);
+ ASSERT_EQ (1, node1.active.roots.size ());
+ auto vote1 (std::make_shared (key2.pub, key2.prv, 0, send2));
+ node1.active.vote (vote1);
+ ASSERT_EQ (1, node1.active.roots.size ());
+ auto votes1 (node1.active.roots.find (send2->root ())->election);
+ ASSERT_NE (nullptr, votes1);
+ ASSERT_EQ (2, votes1->last_votes.size ());
+ ASSERT_NE (votes1->last_votes.end (), votes1->last_votes.find (key2.pub));
+}
+
+TEST (conflicts, add_two)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ ASSERT_EQ (nano::process_result::progress, node1.process (*send1).code);
+ node1.active.start (send1);
+ nano::keypair key2;
+ auto send2 (std::make_shared (send1->hash (), key2.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send2);
+ ASSERT_EQ (nano::process_result::progress, node1.process (*send2).code);
+ node1.active.start (send2);
+ ASSERT_EQ (2, node1.active.roots.size ());
+}
+
+TEST (vote_uniquer, null)
+{
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer uniquer (block_uniquer);
+ ASSERT_EQ (nullptr, uniquer.unique (nullptr));
+}
+
+// Show that an identical vote can be uniqued
+TEST (vote_uniquer, same_vote)
+{
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer uniquer (block_uniquer);
+ nano::keypair key;
+ auto vote1 (std::make_shared (key.pub, key.prv, 0, std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0)));
+ auto vote2 (std::make_shared (*vote1));
+ ASSERT_EQ (vote1, uniquer.unique (vote1));
+ ASSERT_EQ (vote1, uniquer.unique (vote2));
+}
+
+// Show that a different vote for the same block will have the block uniqued
+TEST (vote_uniquer, same_block)
+{
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer uniquer (block_uniquer);
+ nano::keypair key1;
+ nano::keypair key2;
+ auto block1 (std::make_shared (0, 0, 0, 0, 0, key1.prv, key1.pub, 0));
+ auto block2 (std::make_shared (*block1));
+ auto vote1 (std::make_shared (key1.pub, key1.prv, 0, block1));
+ auto vote2 (std::make_shared (key1.pub, key1.prv, 0, block2));
+ ASSERT_EQ (vote1, uniquer.unique (vote1));
+ ASSERT_EQ (vote2, uniquer.unique (vote2));
+ ASSERT_NE (vote1, vote2);
+ ASSERT_EQ (boost::get> (vote1->blocks[0]), boost::get> (vote2->blocks[0]));
+}
+
+TEST (vote_uniquer, vbh_one)
+{
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer uniquer (block_uniquer);
+ nano::keypair key;
+ auto block (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0));
+ std::vector hashes;
+ hashes.push_back (block->hash ());
+ auto vote1 (std::make_shared (key.pub, key.prv, 0, hashes));
+ auto vote2 (std::make_shared (*vote1));
+ ASSERT_EQ (vote1, uniquer.unique (vote1));
+ ASSERT_EQ (vote1, uniquer.unique (vote2));
+}
+
+TEST (vote_uniquer, vbh_two)
+{
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer uniquer (block_uniquer);
+ nano::keypair key;
+ auto block1 (std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0));
+ std::vector hashes1;
+ hashes1.push_back (block1->hash ());
+ auto block2 (std::make_shared (1, 0, 0, 0, 0, key.prv, key.pub, 0));
+ std::vector hashes2;
+ hashes2.push_back (block2->hash ());
+ auto vote1 (std::make_shared (key.pub, key.prv, 0, hashes1));
+ auto vote2 (std::make_shared (key.pub, key.prv, 0, hashes2));
+ ASSERT_EQ (vote1, uniquer.unique (vote1));
+ ASSERT_EQ (vote2, uniquer.unique (vote2));
+}
+
+TEST (vote_uniquer, cleanup)
+{
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer uniquer (block_uniquer);
+ nano::keypair key;
+ auto vote1 (std::make_shared (key.pub, key.prv, 0, std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0)));
+ auto vote2 (std::make_shared (key.pub, key.prv, 1, std::make_shared (0, 0, 0, 0, 0, key.prv, key.pub, 0)));
+ auto vote3 (uniquer.unique (vote1));
+ auto vote4 (uniquer.unique (vote2));
+ vote2.reset ();
+ vote4.reset ();
+ ASSERT_EQ (2, uniquer.size ());
+ auto iterations (0);
+ while (uniquer.size () == 2)
+ {
+ auto vote5 (uniquer.unique (vote1));
+ ASSERT_LT (iterations++, 200);
+ }
+}
+
+TEST (conflicts, reprioritize)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ uint64_t difficulty1;
+ nano::work_validate (*send1, &difficulty1);
+ node1.process_active (send1);
+ node1.block_processor.flush ();
+ auto existing1 (node1.active.roots.find (send1->root ()));
+ ASSERT_NE (node1.active.roots.end (), existing1);
+ ASSERT_EQ (difficulty1, existing1->difficulty);
+ node1.work_generate_blocking (*send1, difficulty1);
+ uint64_t difficulty2;
+ nano::work_validate (*send1, &difficulty2);
+ node1.process_active (send1);
+ node1.block_processor.flush ();
+ auto existing2 (node1.active.roots.find (send1->root ()));
+ ASSERT_NE (node1.active.roots.end (), existing2);
+ ASSERT_EQ (difficulty2, existing2->difficulty);
+}
diff --git a/rai/core_test/daemon.cpp b/nano/core_test/daemon.cpp
similarity index 100%
rename from rai/core_test/daemon.cpp
rename to nano/core_test/daemon.cpp
diff --git a/rai/core_test/entry.cpp b/nano/core_test/entry.cpp
similarity index 100%
rename from rai/core_test/entry.cpp
rename to nano/core_test/entry.cpp
diff --git a/rai/core_test/gap_cache.cpp b/nano/core_test/gap_cache.cpp
similarity index 56%
rename from rai/core_test/gap_cache.cpp
rename to nano/core_test/gap_cache.cpp
index d68a1b8b..7a30cc48 100644
--- a/rai/core_test/gap_cache.cpp
+++ b/nano/core_test/gap_cache.cpp
@@ -1,23 +1,23 @@
#include
-#include
-#include
+#include
+#include
using namespace std::chrono_literals;
TEST (gap_cache, add_new)
{
- rai::system system (24000, 1);
- rai::gap_cache cache (*system.nodes[0]);
- auto block1 (std::make_shared (0, 1, 2, rai::keypair ().prv, 4, 5));
+ nano::system system (24000, 1);
+ nano::gap_cache cache (*system.nodes[0]);
+ auto block1 (std::make_shared (0, 1, 2, nano::keypair ().prv, 4, 5));
auto transaction (system.nodes[0]->store.tx_begin (true));
cache.add (transaction, block1);
}
TEST (gap_cache, add_existing)
{
- rai::system system (24000, 1);
- rai::gap_cache cache (*system.nodes[0]);
- auto block1 (std::make_shared (0, 1, 2, rai::keypair ().prv, 4, 5));
+ nano::system system (24000, 1);
+ nano::gap_cache cache (*system.nodes[0]);
+ auto block1 (std::make_shared (0, 1, 2, nano::keypair ().prv, 4, 5));
auto transaction (system.nodes[0]->store.tx_begin (true));
cache.add (transaction, block1);
auto existing1 (cache.blocks.get<1> ().find (block1->hash ()));
@@ -34,9 +34,9 @@ TEST (gap_cache, add_existing)
TEST (gap_cache, comparison)
{
- rai::system system (24000, 1);
- rai::gap_cache cache (*system.nodes[0]);
- auto block1 (std::make_shared (1, 0, 2, rai::keypair ().prv, 4, 5));
+ nano::system system (24000, 1);
+ nano::gap_cache cache (*system.nodes[0]);
+ auto block1 (std::make_shared (1, 0, 2, nano::keypair ().prv, 4, 5));
auto transaction (system.nodes[0]->store.tx_begin (true));
cache.add (transaction, block1);
auto existing1 (cache.blocks.get<1> ().find (block1->hash ()));
@@ -44,7 +44,7 @@ TEST (gap_cache, comparison)
auto arrival (existing1->arrival);
while (std::chrono::steady_clock::now () == arrival)
;
- auto block3 (std::make_shared (0, 42, 1, rai::keypair ().prv, 3, 4));
+ auto block3 (std::make_shared (0, 42, 1, nano::keypair ().prv, 3, 4));
cache.add (transaction, block3);
ASSERT_EQ (2, cache.blocks.size ());
auto existing2 (cache.blocks.get<1> ().find (block3->hash ()));
@@ -55,22 +55,22 @@ TEST (gap_cache, comparison)
TEST (gap_cache, gap_bootstrap)
{
- rai::system system (24000, 2);
- rai::block_hash latest (system.nodes[0]->latest (rai::test_genesis_key.pub));
- rai::keypair key;
- auto send (std::make_shared (latest, key.pub, rai::genesis_amount - 100, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (latest)));
+ nano::system system (24000, 2);
+ nano::block_hash latest (system.nodes[0]->latest (nano::test_genesis_key.pub));
+ nano::keypair key;
+ auto send (std::make_shared (latest, key.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (latest)));
{
auto transaction (system.nodes[0]->store.tx_begin (true));
- ASSERT_EQ (rai::process_result::progress, system.nodes[0]->block_processor.process_receive_one (transaction, send).code);
+ ASSERT_EQ (nano::process_result::progress, system.nodes[0]->block_processor.process_receive_one (transaction, send).code);
}
- ASSERT_EQ (rai::genesis_amount - 100, system.nodes[0]->balance (rai::genesis_account));
- ASSERT_EQ (rai::genesis_amount, system.nodes[1]->balance (rai::genesis_account));
- system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv);
+ ASSERT_EQ (nano::genesis_amount - 100, system.nodes[0]->balance (nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, system.nodes[1]->balance (nano::genesis_account));
+ system.wallet (0)->insert_adhoc (nano::test_genesis_key.prv);
system.wallet (0)->insert_adhoc (key.prv);
- auto latest_block (system.wallet (0)->send_action (rai::test_genesis_key.pub, key.pub, 100));
+ auto latest_block (system.wallet (0)->send_action (nano::test_genesis_key.pub, key.pub, 100));
ASSERT_NE (nullptr, latest_block);
- ASSERT_EQ (rai::genesis_amount - 200, system.nodes[0]->balance (rai::genesis_account));
- ASSERT_EQ (rai::genesis_amount, system.nodes[1]->balance (rai::genesis_account));
+ ASSERT_EQ (nano::genesis_amount - 200, system.nodes[0]->balance (nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, system.nodes[1]->balance (nano::genesis_account));
system.deadline_set (10s);
{
// The separate publish and vote system doesn't work very well here because it's instantly confirmed.
@@ -78,7 +78,7 @@ TEST (gap_cache, gap_bootstrap)
auto transaction (system.nodes[0]->store.tx_begin ());
system.nodes[0]->network.republish_block (latest_block);
}
- while (system.nodes[1]->balance (rai::genesis_account) != rai::genesis_amount - 200)
+ while (system.nodes[1]->balance (nano::genesis_account) != nano::genesis_amount - 200)
{
ASSERT_NO_ERROR (system.poll ());
}
@@ -86,12 +86,12 @@ TEST (gap_cache, gap_bootstrap)
TEST (gap_cache, two_dependencies)
{
- rai::system system (24000, 1);
- rai::keypair key;
- rai::genesis genesis;
- auto send1 (std::make_shared (genesis.hash (), key.pub, 1, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (genesis.hash ())));
- auto send2 (std::make_shared (send1->hash (), key.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (send1->hash ())));
- auto open (std::make_shared (send1->hash (), key.pub, key.pub, key.prv, key.pub, system.work.generate (key.pub)));
+ nano::system system (24000, 1);
+ nano::keypair key;
+ nano::genesis genesis;
+ auto send1 (std::make_shared (genesis.hash (), key.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (genesis.hash ())));
+ auto send2 (std::make_shared (send1->hash (), key.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (send1->hash ())));
+ auto open (std::make_shared (send1->hash (), key.pub, key.pub, key.prv, key.pub, system.work.generate (key.pub)));
ASSERT_EQ (0, system.nodes[0]->gap_cache.blocks.size ());
system.nodes[0]->block_processor.add (send2, std::chrono::steady_clock::now ());
system.nodes[0]->block_processor.flush ();
diff --git a/rai/core_test/interface.cpp b/nano/core_test/interface.cpp
similarity index 79%
rename from rai/core_test/interface.cpp
rename to nano/core_test/interface.cpp
index c6e2ce03..560cd3b4 100644
--- a/rai/core_test/interface.cpp
+++ b/nano/core_test/interface.cpp
@@ -2,14 +2,14 @@
#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
TEST (interface, xrb_uint128_to_dec)
{
- rai::uint128_union zero (0);
+ nano::uint128_union zero (0);
char text[40] = { 0 };
xrb_uint128_to_dec (zero.bytes.data (), text);
ASSERT_STREQ ("0", text);
@@ -17,7 +17,7 @@ TEST (interface, xrb_uint128_to_dec)
TEST (interface, xrb_uint256_to_string)
{
- rai::uint256_union zero (0);
+ nano::uint256_union zero (0);
char text[65] = { 0 };
xrb_uint256_to_string (zero.bytes.data (), text);
ASSERT_STREQ ("0000000000000000000000000000000000000000000000000000000000000000", text);
@@ -25,7 +25,7 @@ TEST (interface, xrb_uint256_to_string)
TEST (interface, xrb_uint256_to_address)
{
- rai::uint256_union zero (0);
+ nano::uint256_union zero (0);
char text[65] = { 0 };
xrb_uint256_to_address (zero.bytes.data (), text);
ASSERT_STREQ ("xrb_1111111111111111111111111111111111111111111111111111hifc8npp", text);
@@ -33,7 +33,7 @@ TEST (interface, xrb_uint256_to_address)
TEST (interface, xrb_uint512_to_string)
{
- rai::uint512_union zero (0);
+ nano::uint512_union zero (0);
char text[129] = { 0 };
xrb_uint512_to_string (zero.bytes.data (), text);
ASSERT_STREQ ("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", text);
@@ -41,7 +41,7 @@ TEST (interface, xrb_uint512_to_string)
TEST (interface, xrb_uint128_from_dec)
{
- rai::uint128_union zero (0);
+ nano::uint128_union zero (0);
ASSERT_EQ (0, xrb_uint128_from_dec ("340282366920938463463374607431768211455", zero.bytes.data ()));
ASSERT_EQ (1, xrb_uint128_from_dec ("340282366920938463463374607431768211456", zero.bytes.data ()));
ASSERT_EQ (1, xrb_uint128_from_dec ("3402823669209384634633%4607431768211455", zero.bytes.data ()));
@@ -49,7 +49,7 @@ TEST (interface, xrb_uint128_from_dec)
TEST (interface, xrb_uint256_from_string)
{
- rai::uint256_union zero (0);
+ nano::uint256_union zero (0);
ASSERT_EQ (0, xrb_uint256_from_string ("0000000000000000000000000000000000000000000000000000000000000000", zero.bytes.data ()));
ASSERT_EQ (1, xrb_uint256_from_string ("00000000000000000000000000000000000000000000000000000000000000000", zero.bytes.data ()));
ASSERT_EQ (1, xrb_uint256_from_string ("000000000000000000000000000%000000000000000000000000000000000000", zero.bytes.data ()));
@@ -57,7 +57,7 @@ TEST (interface, xrb_uint256_from_string)
TEST (interface, xrb_uint512_from_string)
{
- rai::uint512_union zero (0);
+ nano::uint512_union zero (0);
ASSERT_EQ (0, xrb_uint512_from_string ("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", zero.bytes.data ()));
ASSERT_EQ (1, xrb_uint512_from_string ("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", zero.bytes.data ()));
ASSERT_EQ (1, xrb_uint512_from_string ("0000000000000000000000000000000000000000000000000000000000%000000000000000000000000000000000000000000000000000000000000000000000", zero.bytes.data ()));
@@ -72,48 +72,48 @@ TEST (interface, xrb_valid_address)
TEST (interface, xrb_seed_create)
{
- rai::uint256_union seed;
+ nano::uint256_union seed;
xrb_generate_random (seed.bytes.data ());
ASSERT_FALSE (seed.is_zero ());
}
TEST (interface, xrb_seed_key)
{
- rai::uint256_union seed (0);
- rai::uint256_union prv;
+ nano::uint256_union seed (0);
+ nano::uint256_union prv;
xrb_seed_key (seed.bytes.data (), 0, prv.bytes.data ());
ASSERT_FALSE (prv.is_zero ());
}
TEST (interface, xrb_key_account)
{
- rai::uint256_union prv (0);
- rai::uint256_union pub;
+ nano::uint256_union prv (0);
+ nano::uint256_union pub;
xrb_key_account (prv.bytes.data (), pub.bytes.data ());
ASSERT_FALSE (pub.is_zero ());
}
TEST (interface, sign_transaction)
{
- rai::raw_key key;
+ nano::raw_key key;
xrb_generate_random (key.data.bytes.data ());
- rai::uint256_union pub;
+ nano::uint256_union pub;
xrb_key_account (key.data.bytes.data (), pub.bytes.data ());
- rai::send_block send (0, 0, 0, key, pub, 0);
- ASSERT_FALSE (rai::validate_message (pub, send.hash (), send.signature));
+ nano::send_block send (0, 0, 0, key, pub, 0);
+ ASSERT_FALSE (nano::validate_message (pub, send.hash (), send.signature));
send.signature.bytes[0] ^= 1;
- ASSERT_TRUE (rai::validate_message (pub, send.hash (), send.signature));
+ ASSERT_TRUE (nano::validate_message (pub, send.hash (), send.signature));
auto send_json (send.to_json ());
auto transaction (xrb_sign_transaction (send_json.c_str (), key.data.bytes.data ()));
boost::property_tree::ptree block_l;
std::string transaction_l (transaction);
std::stringstream block_stream (transaction_l);
boost::property_tree::read_json (block_stream, block_l);
- auto block (rai::deserialize_block_json (block_l));
+ auto block (nano::deserialize_block_json (block_l));
ASSERT_NE (nullptr, block);
- auto send1 (dynamic_cast (block.get ()));
+ auto send1 (dynamic_cast (block.get ()));
ASSERT_NE (nullptr, send1);
- ASSERT_FALSE (rai::validate_message (pub, send.hash (), send1->signature));
+ ASSERT_FALSE (nano::validate_message (pub, send.hash (), send1->signature));
// Signatures should be non-deterministic
auto transaction2 (xrb_sign_transaction (send_json.c_str (), key.data.bytes.data ()));
ASSERT_NE (0, strcmp (transaction, transaction2));
@@ -123,30 +123,30 @@ TEST (interface, sign_transaction)
TEST (interface, fail_sign_transaction)
{
- rai::uint256_union data (0);
+ nano::uint256_union data (0);
xrb_sign_transaction ("", data.bytes.data ());
}
TEST (interface, work_transaction)
{
- rai::raw_key key;
+ nano::raw_key key;
xrb_generate_random (key.data.bytes.data ());
- rai::uint256_union pub;
+ nano::uint256_union pub;
xrb_key_account (key.data.bytes.data (), pub.bytes.data ());
- rai::send_block send (1, 0, 0, key, pub, 0);
+ nano::send_block send (1, 0, 0, key, pub, 0);
auto transaction (xrb_work_transaction (send.to_json ().c_str ()));
boost::property_tree::ptree block_l;
std::string transaction_l (transaction);
std::stringstream block_stream (transaction_l);
boost::property_tree::read_json (block_stream, block_l);
- auto block (rai::deserialize_block_json (block_l));
+ auto block (nano::deserialize_block_json (block_l));
ASSERT_NE (nullptr, block);
- ASSERT_FALSE (rai::work_validate (*block));
+ ASSERT_FALSE (nano::work_validate (*block));
free (transaction);
}
TEST (interface, fail_work_transaction)
{
- rai::uint256_union data (0);
+ nano::uint256_union data (0);
xrb_work_transaction ("");
}
diff --git a/nano/core_test/ledger.cpp b/nano/core_test/ledger.cpp
new file mode 100644
index 00000000..30922fcc
--- /dev/null
+++ b/nano/core_test/ledger.cpp
@@ -0,0 +1,2434 @@
+#include
+#include
+#include
+#include
+#include
+#include
+
+using namespace std::chrono_literals;
+
+// Init returns an error if it can't open files at the path
+TEST (ledger, store_error)
+{
+ bool init (false);
+ nano::mdb_store store (init, boost::filesystem::path ("///"));
+ ASSERT_FALSE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+}
+
+// Ledger can be initialized and returns a basic query for an empty account
+TEST (ledger, empty)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::account account;
+ auto transaction (store.tx_begin ());
+ auto balance (ledger.account_balance (transaction, account));
+ ASSERT_TRUE (balance.is_zero ());
+}
+
+// Genesis account should have the max balance on empty initialization
+TEST (ledger, genesis_balance)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ auto balance (ledger.account_balance (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, balance);
+ auto amount (ledger.amount (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, amount);
+ nano::account_info info;
+ ASSERT_FALSE (store.account_get (transaction, nano::genesis_account, info));
+ // Frontier time should have been updated when genesis balance was added
+ ASSERT_GE (nano::seconds_since_epoch (), info.modified);
+ ASSERT_LT (nano::seconds_since_epoch () - info.modified, 10);
+}
+
+// Make sure the checksum is the same when ledger reloaded
+TEST (ledger, checksum_persistence)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::uint256_union checksum1;
+ nano::uint256_union max;
+ max.qwords[0] = 0;
+ max.qwords[0] = ~max.qwords[0];
+ max.qwords[1] = 0;
+ max.qwords[1] = ~max.qwords[1];
+ max.qwords[2] = 0;
+ max.qwords[2] = ~max.qwords[2];
+ max.qwords[3] = 0;
+ max.qwords[3] = ~max.qwords[3];
+ nano::stat stats;
+ auto transaction (store.tx_begin (true));
+ {
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ store.initialize (transaction, genesis);
+ checksum1 = ledger.checksum (transaction, 0, max);
+ }
+ nano::ledger ledger (store, stats);
+ ASSERT_EQ (checksum1, ledger.checksum (transaction, 0, max));
+}
+
+// All nodes in the system should agree on the genesis balance
+TEST (system, system_genesis)
+{
+ nano::system system (24000, 2);
+ for (auto & i : system.nodes)
+ {
+ auto transaction (i->store.tx_begin ());
+ ASSERT_EQ (nano::genesis_amount, i->ledger.account_balance (transaction, nano::genesis_account));
+ }
+}
+
+// Create a send block and publish it.
+TEST (ledger, process_send)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ auto transaction (store.tx_begin (true));
+ nano::genesis genesis;
+ store.initialize (transaction, genesis);
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::keypair key2;
+ nano::send_block send (info1.head, key2.pub, 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ nano::block_hash hash1 (send.hash ());
+ ASSERT_EQ (nano::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
+ ASSERT_EQ (1, info1.block_count);
+ // This was a valid block, it should progress.
+ auto return1 (ledger.process (transaction, send));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.amount (transaction, hash1));
+ ASSERT_TRUE (store.frontier_get (transaction, info1.head).is_zero ());
+ ASSERT_EQ (nano::test_genesis_key.pub, store.frontier_get (transaction, hash1));
+ ASSERT_EQ (nano::process_result::progress, return1.code);
+ ASSERT_EQ (nano::test_genesis_key.pub, return1.account);
+ ASSERT_EQ (nano::genesis_amount - 50, return1.amount.number ());
+ ASSERT_EQ (50, ledger.account_balance (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.account_pending (transaction, key2.pub));
+ nano::account_info info2;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info2));
+ ASSERT_EQ (2, info2.block_count);
+ auto latest6 (store.block_get (transaction, info2.head));
+ ASSERT_NE (nullptr, latest6);
+ auto latest7 (dynamic_cast (latest6.get ()));
+ ASSERT_NE (nullptr, latest7);
+ ASSERT_EQ (send, *latest7);
+ // Create an open block opening an account accepting the send we just created
+ nano::open_block open (hash1, key2.pub, key2.pub, key2.prv, key2.pub, 0);
+ nano::block_hash hash2 (open.hash ());
+ // This was a valid block, it should progress.
+ auto return2 (ledger.process (transaction, open));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.amount (transaction, hash2));
+ ASSERT_EQ (nano::process_result::progress, return2.code);
+ ASSERT_EQ (key2.pub, return2.account);
+ ASSERT_EQ (nano::genesis_amount - 50, return2.amount.number ());
+ ASSERT_EQ (key2.pub, store.frontier_get (transaction, hash2));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.account_balance (transaction, key2.pub));
+ ASSERT_EQ (0, ledger.account_pending (transaction, key2.pub));
+ ASSERT_EQ (50, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, key2.pub));
+ nano::account_info info3;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info3));
+ auto latest2 (store.block_get (transaction, info3.head));
+ ASSERT_NE (nullptr, latest2);
+ auto latest3 (dynamic_cast (latest2.get ()));
+ ASSERT_NE (nullptr, latest3);
+ ASSERT_EQ (send, *latest3);
+ nano::account_info info4;
+ ASSERT_FALSE (store.account_get (transaction, key2.pub, info4));
+ auto latest4 (store.block_get (transaction, info4.head));
+ ASSERT_NE (nullptr, latest4);
+ auto latest5 (dynamic_cast (latest4.get ()));
+ ASSERT_NE (nullptr, latest5);
+ ASSERT_EQ (open, *latest5);
+ ledger.rollback (transaction, hash2);
+ ASSERT_TRUE (store.frontier_get (transaction, hash2).is_zero ());
+ nano::account_info info5;
+ ASSERT_TRUE (ledger.store.account_get (transaction, key2.pub, info5));
+ nano::pending_info pending1;
+ ASSERT_FALSE (ledger.store.pending_get (transaction, nano::pending_key (key2.pub, hash1), pending1));
+ ASSERT_EQ (nano::test_genesis_key.pub, pending1.source);
+ ASSERT_EQ (nano::genesis_amount - 50, pending1.amount.number ());
+ ASSERT_EQ (0, ledger.account_balance (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.account_pending (transaction, key2.pub));
+ ASSERT_EQ (50, ledger.account_balance (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (50, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ nano::account_info info6;
+ ASSERT_FALSE (ledger.store.account_get (transaction, nano::test_genesis_key.pub, info6));
+ ASSERT_EQ (hash1, info6.head);
+ ledger.rollback (transaction, info6.head);
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
+ ASSERT_TRUE (store.frontier_get (transaction, hash1).is_zero ());
+ nano::account_info info7;
+ ASSERT_FALSE (ledger.store.account_get (transaction, nano::test_genesis_key.pub, info7));
+ ASSERT_EQ (1, info7.block_count);
+ ASSERT_EQ (info1.head, info7.head);
+ nano::pending_info pending2;
+ ASSERT_TRUE (ledger.store.pending_get (transaction, nano::pending_key (key2.pub, hash1), pending2));
+ ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.account_pending (transaction, key2.pub));
+}
+
+TEST (ledger, process_receive)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::keypair key2;
+ nano::send_block send (info1.head, key2.pub, 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ nano::block_hash hash1 (send.hash ());
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send).code);
+ nano::keypair key3;
+ nano::open_block open (hash1, key3.pub, key2.pub, key2.prv, key2.pub, 0);
+ nano::block_hash hash2 (open.hash ());
+ auto return1 (ledger.process (transaction, open));
+ ASSERT_EQ (nano::process_result::progress, return1.code);
+ ASSERT_EQ (key2.pub, return1.account);
+ ASSERT_EQ (nano::genesis_amount - 50, return1.amount.number ());
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, key3.pub));
+ nano::send_block send2 (hash1, key2.pub, 25, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ nano::block_hash hash3 (send2.hash ());
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send2).code);
+ nano::receive_block receive (hash2, hash3, key2.prv, key2.pub, 0);
+ auto hash4 (receive.hash ());
+ ASSERT_EQ (key2.pub, store.frontier_get (transaction, hash2));
+ auto return2 (ledger.process (transaction, receive));
+ ASSERT_EQ (25, ledger.amount (transaction, hash4));
+ ASSERT_TRUE (store.frontier_get (transaction, hash2).is_zero ());
+ ASSERT_EQ (key2.pub, store.frontier_get (transaction, hash4));
+ ASSERT_EQ (nano::process_result::progress, return2.code);
+ ASSERT_EQ (key2.pub, return2.account);
+ ASSERT_EQ (25, return2.amount.number ());
+ ASSERT_EQ (hash4, ledger.latest (transaction, key2.pub));
+ ASSERT_EQ (25, ledger.account_balance (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.account_pending (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount - 25, ledger.account_balance (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount - 25, ledger.weight (transaction, key3.pub));
+ ledger.rollback (transaction, hash4);
+ ASSERT_TRUE (store.block_successor (transaction, hash2).is_zero ());
+ ASSERT_EQ (key2.pub, store.frontier_get (transaction, hash2));
+ ASSERT_TRUE (store.frontier_get (transaction, hash4).is_zero ());
+ ASSERT_EQ (25, ledger.account_balance (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (25, ledger.account_pending (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.account_balance (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, key3.pub));
+ ASSERT_EQ (hash2, ledger.latest (transaction, key2.pub));
+ nano::pending_info pending1;
+ ASSERT_FALSE (ledger.store.pending_get (transaction, nano::pending_key (key2.pub, hash3), pending1));
+ ASSERT_EQ (nano::test_genesis_key.pub, pending1.source);
+ ASSERT_EQ (25, pending1.amount.number ());
+}
+
+TEST (ledger, rollback_receiver)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::keypair key2;
+ nano::send_block send (info1.head, key2.pub, 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ nano::block_hash hash1 (send.hash ());
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send).code);
+ nano::keypair key3;
+ nano::open_block open (hash1, key3.pub, key2.pub, key2.prv, key2.pub, 0);
+ nano::block_hash hash2 (open.hash ());
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open).code);
+ ASSERT_EQ (hash2, ledger.latest (transaction, key2.pub));
+ ASSERT_EQ (50, ledger.account_balance (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.account_balance (transaction, key2.pub));
+ ASSERT_EQ (50, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, key3.pub));
+ ledger.rollback (transaction, hash1);
+ ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.account_balance (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
+ nano::account_info info2;
+ ASSERT_TRUE (ledger.store.account_get (transaction, key2.pub, info2));
+ nano::pending_info pending1;
+ ASSERT_TRUE (ledger.store.pending_get (transaction, nano::pending_key (key2.pub, info2.head), pending1));
+}
+
+TEST (ledger, rollback_representation)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key5;
+ nano::change_block change1 (genesis.hash (), key5.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, change1).code);
+ nano::keypair key3;
+ nano::change_block change2 (change1.hash (), key3.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, change2).code);
+ nano::keypair key2;
+ nano::send_block send1 (change2.hash (), key2.pub, 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::keypair key4;
+ nano::open_block open (send1.hash (), key4.pub, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open).code);
+ nano::send_block send2 (send1.hash (), key2.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send2).code);
+ nano::receive_block receive1 (open.hash (), send2.hash (), key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
+ ASSERT_EQ (1, ledger.weight (transaction, key3.pub));
+ ASSERT_EQ (nano::genesis_amount - 1, ledger.weight (transaction, key4.pub));
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, key2.pub, info1));
+ ASSERT_EQ (open.hash (), info1.rep_block);
+ ledger.rollback (transaction, receive1.hash ());
+ nano::account_info info2;
+ ASSERT_FALSE (store.account_get (transaction, key2.pub, info2));
+ ASSERT_EQ (open.hash (), info2.rep_block);
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, key4.pub));
+ ledger.rollback (transaction, open.hash ());
+ ASSERT_EQ (1, ledger.weight (transaction, key3.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key4.pub));
+ ledger.rollback (transaction, send1.hash ());
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, key3.pub));
+ nano::account_info info3;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info3));
+ ASSERT_EQ (change2.hash (), info3.rep_block);
+ ledger.rollback (transaction, change2.hash ());
+ nano::account_info info4;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info4));
+ ASSERT_EQ (change1.hash (), info4.rep_block);
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, key5.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
+}
+
+TEST (ledger, receive_rollback)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::send_block send (genesis.hash (), nano::test_genesis_key.pub, nano::genesis_amount - nano::Gxrb_ratio, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send).code);
+ nano::receive_block receive (send.hash (), send.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive).code);
+ ledger.rollback (transaction, receive.hash ());
+}
+
+TEST (ledger, process_duplicate)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::keypair key2;
+ nano::send_block send (info1.head, key2.pub, 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ nano::block_hash hash1 (send.hash ());
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send).code);
+ ASSERT_EQ (nano::process_result::old, ledger.process (transaction, send).code);
+ nano::open_block open (hash1, 1, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open).code);
+ ASSERT_EQ (nano::process_result::old, ledger.process (transaction, open).code);
+}
+
+TEST (ledger, representative_genesis)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ auto latest (ledger.latest (transaction, nano::test_genesis_key.pub));
+ ASSERT_FALSE (latest.is_zero ());
+ ASSERT_EQ (genesis.open->hash (), ledger.representative (transaction, latest));
+}
+
+TEST (ledger, weight)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
+}
+
+TEST (ledger, representative_change)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::keypair key2;
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::change_block block (info1.head, key2.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
+ auto return1 (ledger.process (transaction, block));
+ ASSERT_EQ (0, ledger.amount (transaction, block.hash ()));
+ ASSERT_TRUE (store.frontier_get (transaction, info1.head).is_zero ());
+ ASSERT_EQ (nano::test_genesis_key.pub, store.frontier_get (transaction, block.hash ()));
+ ASSERT_EQ (nano::process_result::progress, return1.code);
+ ASSERT_EQ (nano::test_genesis_key.pub, return1.account);
+ ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, key2.pub));
+ nano::account_info info2;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info2));
+ ASSERT_EQ (block.hash (), info2.head);
+ ledger.rollback (transaction, info2.head);
+ ASSERT_EQ (nano::test_genesis_key.pub, store.frontier_get (transaction, info1.head));
+ ASSERT_TRUE (store.frontier_get (transaction, block.hash ()).is_zero ());
+ nano::account_info info3;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info3));
+ ASSERT_EQ (info1.head, info3.head);
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+}
+
+TEST (ledger, send_fork)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::keypair key2;
+ nano::keypair key3;
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::send_block block (info1.head, key2.pub, 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block).code);
+ nano::send_block block2 (info1.head, key3.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, block2).code);
+}
+
+TEST (ledger, receive_fork)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::keypair key2;
+ nano::keypair key3;
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::send_block block (info1.head, key2.pub, 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block).code);
+ nano::open_block block2 (block.hash (), key2.pub, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block2).code);
+ nano::change_block block3 (block2.hash (), key3.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block3).code);
+ nano::send_block block4 (block.hash (), key2.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block4).code);
+ nano::receive_block block5 (block2.hash (), block4.hash (), key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, block5).code);
+}
+
+TEST (ledger, open_fork)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::keypair key2;
+ nano::keypair key3;
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::send_block block (info1.head, key2.pub, 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block).code);
+ nano::open_block block2 (block.hash (), key2.pub, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block2).code);
+ nano::open_block block3 (block.hash (), key3.pub, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, block3).code);
+}
+
+TEST (ledger, checksum_single)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ store.initialize (transaction, genesis);
+ store.checksum_put (transaction, 0, 0, genesis.hash ());
+ ASSERT_EQ (genesis.hash (), ledger.checksum (transaction, 0, std::numeric_limits::max ()));
+ nano::change_block block1 (ledger.latest (transaction, nano::test_genesis_key.pub), nano::account (1), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ nano::checksum check1 (ledger.checksum (transaction, 0, std::numeric_limits::max ()));
+ ASSERT_EQ (genesis.hash (), check1);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::checksum check2 (ledger.checksum (transaction, 0, std::numeric_limits::max ()));
+ ASSERT_EQ (block1.hash (), check2);
+}
+
+TEST (ledger, checksum_two)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ store.initialize (transaction, genesis);
+ store.checksum_put (transaction, 0, 0, genesis.hash ());
+ nano::keypair key2;
+ nano::send_block block1 (ledger.latest (transaction, nano::test_genesis_key.pub), key2.pub, 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::checksum check1 (ledger.checksum (transaction, 0, std::numeric_limits::max ()));
+ nano::open_block block2 (block1.hash (), 1, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block2).code);
+ nano::checksum check2 (ledger.checksum (transaction, 0, std::numeric_limits::max ()));
+ ASSERT_EQ (check1, check2 ^ block2.hash ());
+}
+
+TEST (ledger, DISABLED_checksum_range)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ auto transaction (store.tx_begin ());
+ nano::checksum check1 (ledger.checksum (transaction, 0, std::numeric_limits::max ()));
+ ASSERT_TRUE (check1.is_zero ());
+ nano::block_hash hash1 (42);
+ nano::checksum check2 (ledger.checksum (transaction, 0, 42));
+ ASSERT_TRUE (check2.is_zero ());
+ nano::checksum check3 (ledger.checksum (transaction, 42, std::numeric_limits::max ()));
+ ASSERT_EQ (hash1, check3);
+}
+
+TEST (system, DISABLED_generate_send_existing)
+{
+ nano::system system (24000, 1);
+ nano::thread_runner runner (system.io_ctx, system.nodes[0]->config.io_threads);
+ system.wallet (0)->insert_adhoc (nano::test_genesis_key.prv);
+ nano::keypair stake_preserver;
+ auto send_block (system.wallet (0)->send_action (nano::genesis_account, stake_preserver.pub, nano::genesis_amount / 3 * 2, true));
+ nano::account_info info1;
+ {
+ auto transaction (system.wallet (0)->wallets.tx_begin ());
+ ASSERT_FALSE (system.nodes[0]->store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ }
+ std::vector accounts;
+ accounts.push_back (nano::test_genesis_key.pub);
+ system.generate_send_existing (*system.nodes[0], accounts);
+ // Have stake_preserver receive funds after generate_send_existing so it isn't chosen as the destination
+ {
+ auto transaction (system.nodes[0]->store.tx_begin (true));
+ auto open_block (std::make_shared (send_block->hash (), nano::genesis_account, stake_preserver.pub, stake_preserver.prv, stake_preserver.pub, 0));
+ system.nodes[0]->work_generate_blocking (*open_block);
+ ASSERT_EQ (nano::process_result::progress, system.nodes[0]->ledger.process (transaction, *open_block).code);
+ }
+ ASSERT_GT (system.nodes[0]->balance (stake_preserver.pub), system.nodes[0]->balance (nano::genesis_account));
+ nano::account_info info2;
+ {
+ auto transaction (system.wallet (0)->wallets.tx_begin ());
+ ASSERT_FALSE (system.nodes[0]->store.account_get (transaction, nano::test_genesis_key.pub, info2));
+ }
+ ASSERT_NE (info1.head, info2.head);
+ system.deadline_set (15s);
+ while (info2.block_count < info1.block_count + 2)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ auto transaction (system.wallet (0)->wallets.tx_begin ());
+ ASSERT_FALSE (system.nodes[0]->store.account_get (transaction, nano::test_genesis_key.pub, info2));
+ }
+ ASSERT_EQ (info1.block_count + 2, info2.block_count);
+ ASSERT_EQ (info2.balance, nano::genesis_amount / 3);
+ {
+ auto transaction (system.wallet (0)->wallets.tx_begin ());
+ ASSERT_NE (system.nodes[0]->ledger.amount (transaction, info2.head), 0);
+ }
+ system.stop ();
+ runner.join ();
+}
+
+TEST (system, generate_send_new)
+{
+ nano::system system (24000, 1);
+ nano::thread_runner runner (system.io_ctx, system.nodes[0]->config.io_threads);
+ system.wallet (0)->insert_adhoc (nano::test_genesis_key.prv);
+ {
+ auto transaction (system.nodes[0]->store.tx_begin ());
+ auto iterator1 (system.nodes[0]->store.latest_begin (transaction));
+ ASSERT_NE (system.nodes[0]->store.latest_end (), iterator1);
+ ++iterator1;
+ ASSERT_EQ (system.nodes[0]->store.latest_end (), iterator1);
+ }
+ nano::keypair stake_preserver;
+ auto send_block (system.wallet (0)->send_action (nano::genesis_account, stake_preserver.pub, nano::genesis_amount / 3 * 2, true));
+ {
+ auto transaction (system.nodes[0]->store.tx_begin (true));
+ auto open_block (std::make_shared (send_block->hash (), nano::genesis_account, stake_preserver.pub, stake_preserver.prv, stake_preserver.pub, 0));
+ system.nodes[0]->work_generate_blocking (*open_block);
+ ASSERT_EQ (nano::process_result::progress, system.nodes[0]->ledger.process (transaction, *open_block).code);
+ }
+ ASSERT_GT (system.nodes[0]->balance (stake_preserver.pub), system.nodes[0]->balance (nano::genesis_account));
+ std::vector accounts;
+ accounts.push_back (nano::test_genesis_key.pub);
+ system.generate_send_new (*system.nodes[0], accounts);
+ nano::account new_account (0);
+ {
+ auto transaction (system.nodes[0]->store.tx_begin ());
+ auto iterator2 (system.wallet (0)->store.begin (transaction));
+ if (nano::uint256_union (iterator2->first) != nano::test_genesis_key.pub)
+ {
+ new_account = nano::uint256_union (iterator2->first);
+ }
+ ++iterator2;
+ ASSERT_NE (system.wallet (0)->store.end (), iterator2);
+ if (nano::uint256_union (iterator2->first) != nano::test_genesis_key.pub)
+ {
+ new_account = nano::uint256_union (iterator2->first);
+ }
+ ++iterator2;
+ ASSERT_EQ (system.wallet (0)->store.end (), iterator2);
+ ASSERT_FALSE (new_account.is_zero ());
+ }
+ system.deadline_set (10s);
+ while (system.nodes[0]->balance (new_account) == 0)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ system.stop ();
+ runner.join ();
+}
+
+TEST (ledger, representation)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ ASSERT_EQ (nano::genesis_amount, store.representation_get (transaction, nano::test_genesis_key.pub));
+ nano::keypair key2;
+ nano::send_block block1 (genesis.hash (), key2.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ ASSERT_EQ (nano::genesis_amount - 100, store.representation_get (transaction, nano::test_genesis_key.pub));
+ nano::keypair key3;
+ nano::open_block block2 (block1.hash (), key3.pub, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block2).code);
+ ASSERT_EQ (nano::genesis_amount - 100, store.representation_get (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
+ ASSERT_EQ (100, store.representation_get (transaction, key3.pub));
+ nano::send_block block3 (block1.hash (), key2.pub, nano::genesis_amount - 200, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block3).code);
+ ASSERT_EQ (nano::genesis_amount - 200, store.representation_get (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
+ ASSERT_EQ (100, store.representation_get (transaction, key3.pub));
+ nano::receive_block block4 (block2.hash (), block3.hash (), key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block4).code);
+ ASSERT_EQ (nano::genesis_amount - 200, store.representation_get (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
+ ASSERT_EQ (200, store.representation_get (transaction, key3.pub));
+ nano::keypair key4;
+ nano::change_block block5 (block4.hash (), key4.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block5).code);
+ ASSERT_EQ (nano::genesis_amount - 200, store.representation_get (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key3.pub));
+ ASSERT_EQ (200, store.representation_get (transaction, key4.pub));
+ nano::keypair key5;
+ nano::send_block block6 (block5.hash (), key5.pub, 100, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block6).code);
+ ASSERT_EQ (nano::genesis_amount - 200, store.representation_get (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key3.pub));
+ ASSERT_EQ (100, store.representation_get (transaction, key4.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key5.pub));
+ nano::keypair key6;
+ nano::open_block block7 (block6.hash (), key6.pub, key5.pub, key5.prv, key5.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block7).code);
+ ASSERT_EQ (nano::genesis_amount - 200, store.representation_get (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key3.pub));
+ ASSERT_EQ (100, store.representation_get (transaction, key4.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key5.pub));
+ ASSERT_EQ (100, store.representation_get (transaction, key6.pub));
+ nano::send_block block8 (block6.hash (), key5.pub, 0, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block8).code);
+ ASSERT_EQ (nano::genesis_amount - 200, store.representation_get (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key3.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key4.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key5.pub));
+ ASSERT_EQ (100, store.representation_get (transaction, key6.pub));
+ nano::receive_block block9 (block7.hash (), block8.hash (), key5.prv, key5.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block9).code);
+ ASSERT_EQ (nano::genesis_amount - 200, store.representation_get (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key2.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key3.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key4.pub));
+ ASSERT_EQ (0, store.representation_get (transaction, key5.pub));
+ ASSERT_EQ (200, store.representation_get (transaction, key6.pub));
+}
+
+TEST (ledger, double_open)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key2;
+ nano::send_block send1 (genesis.hash (), key2.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::open_block open1 (send1.hash (), key2.pub, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ nano::open_block open2 (send1.hash (), nano::test_genesis_key.pub, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, open2).code);
+}
+
+TEST (ledegr, double_receive)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key2;
+ nano::send_block send1 (genesis.hash (), key2.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::open_block open1 (send1.hash (), key2.pub, key2.pub, key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ nano::receive_block receive1 (open1.hash (), send1.hash (), key2.prv, key2.pub, 0);
+ ASSERT_EQ (nano::process_result::unreceivable, ledger.process (transaction, receive1).code);
+}
+
+TEST (votes, check_signature)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ auto transaction (node1.store.tx_begin (true));
+ ASSERT_EQ (nano::process_result::progress, node1.ledger.process (transaction, *send1).code);
+ auto node_l (system.nodes[0]);
+ node1.active.start (send1);
+ auto votes1 (node1.active.roots.find (send1->root ())->election);
+ ASSERT_EQ (1, votes1->last_votes.size ());
+ std::unique_lock lock (node1.active.mutex);
+ auto vote1 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 1, send1));
+ vote1->signature.bytes[0] ^= 1;
+ ASSERT_EQ (nano::vote_code::invalid, node1.vote_processor.vote_blocking (transaction, vote1, nano::endpoint (boost::asio::ip::address_v6 (), 0)));
+ vote1->signature.bytes[0] ^= 1;
+ ASSERT_EQ (nano::vote_code::vote, node1.vote_processor.vote_blocking (transaction, vote1, nano::endpoint (boost::asio::ip::address_v6 (), 0)));
+ ASSERT_EQ (nano::vote_code::replay, node1.vote_processor.vote_blocking (transaction, vote1, nano::endpoint (boost::asio::ip::address_v6 (), 0)));
+}
+
+TEST (votes, add_one)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ auto transaction (node1.store.tx_begin (true));
+ ASSERT_EQ (nano::process_result::progress, node1.ledger.process (transaction, *send1).code);
+ node1.active.start (send1);
+ auto votes1 (node1.active.roots.find (send1->root ())->election);
+ ASSERT_EQ (1, votes1->last_votes.size ());
+ auto vote1 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 1, send1));
+ ASSERT_FALSE (node1.active.vote (vote1));
+ auto vote2 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 2, send1));
+ ASSERT_FALSE (node1.active.vote (vote2));
+ ASSERT_EQ (2, votes1->last_votes.size ());
+ auto existing1 (votes1->last_votes.find (nano::test_genesis_key.pub));
+ ASSERT_NE (votes1->last_votes.end (), existing1);
+ ASSERT_EQ (send1->hash (), existing1->second.hash);
+ auto winner (*votes1->tally (transaction).begin ());
+ ASSERT_EQ (*send1, *winner.second);
+ ASSERT_EQ (nano::genesis_amount - 100, winner.first);
+}
+
+TEST (votes, add_two)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ auto transaction (node1.store.tx_begin (true));
+ ASSERT_EQ (nano::process_result::progress, node1.ledger.process (transaction, *send1).code);
+ node1.active.start (send1);
+ auto votes1 (node1.active.roots.find (send1->root ())->election);
+ auto vote1 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 1, send1));
+ ASSERT_FALSE (node1.active.vote (vote1));
+ nano::keypair key2;
+ auto send2 (std::make_shared (genesis.hash (), key2.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ auto vote2 (std::make_shared (key2.pub, key2.prv, 1, send2));
+ ASSERT_FALSE (node1.active.vote (vote2));
+ ASSERT_EQ (3, votes1->last_votes.size ());
+ ASSERT_NE (votes1->last_votes.end (), votes1->last_votes.find (nano::test_genesis_key.pub));
+ ASSERT_EQ (send1->hash (), votes1->last_votes[nano::test_genesis_key.pub].hash);
+ ASSERT_NE (votes1->last_votes.end (), votes1->last_votes.find (key2.pub));
+ ASSERT_EQ (send2->hash (), votes1->last_votes[key2.pub].hash);
+ auto winner (*votes1->tally (transaction).begin ());
+ ASSERT_EQ (*send1, *winner.second);
+}
+
+// Higher sequence numbers change the vote
+TEST (votes, add_existing)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, nano::genesis_amount - nano::Gxrb_ratio, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ auto transaction (node1.store.tx_begin (true));
+ ASSERT_EQ (nano::process_result::progress, node1.ledger.process (transaction, *send1).code);
+ node1.active.start (send1);
+ auto votes1 (node1.active.roots.find (send1->root ())->election);
+ auto vote1 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 1, send1));
+ ASSERT_FALSE (node1.active.vote (vote1));
+ ASSERT_FALSE (node1.active.publish (send1));
+ ASSERT_EQ (1, votes1->last_votes[nano::test_genesis_key.pub].sequence);
+ nano::keypair key2;
+ auto send2 (std::make_shared (genesis.hash (), key2.pub, nano::genesis_amount - nano::Gxrb_ratio, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ auto vote2 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 2, send2));
+ // Pretend we've waited the timeout
+ votes1->last_votes[nano::test_genesis_key.pub].time = std::chrono::steady_clock::now () - std::chrono::seconds (20);
+ ASSERT_FALSE (node1.active.vote (vote2));
+ ASSERT_FALSE (node1.active.publish (send2));
+ ASSERT_EQ (2, votes1->last_votes[nano::test_genesis_key.pub].sequence);
+ // Also resend the old vote, and see if we respect the sequence number
+ votes1->last_votes[nano::test_genesis_key.pub].time = std::chrono::steady_clock::now () - std::chrono::seconds (20);
+ ASSERT_TRUE (node1.active.vote (vote1));
+ ASSERT_EQ (2, votes1->last_votes[nano::test_genesis_key.pub].sequence);
+ ASSERT_EQ (2, votes1->last_votes.size ());
+ ASSERT_NE (votes1->last_votes.end (), votes1->last_votes.find (nano::test_genesis_key.pub));
+ ASSERT_EQ (send2->hash (), votes1->last_votes[nano::test_genesis_key.pub].hash);
+ auto winner (*votes1->tally (transaction).begin ());
+ ASSERT_EQ (*send2, *winner.second);
+}
+
+// Lower sequence numbers are ignored
+TEST (votes, add_old)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ auto transaction (node1.store.tx_begin (true));
+ ASSERT_EQ (nano::process_result::progress, node1.ledger.process (transaction, *send1).code);
+ node1.active.start (send1);
+ auto votes1 (node1.active.roots.find (send1->root ())->election);
+ auto vote1 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 2, send1));
+ std::unique_lock lock (node1.active.mutex);
+ node1.vote_processor.vote_blocking (transaction, vote1, node1.network.endpoint ());
+ lock.unlock ();
+ nano::keypair key2;
+ auto send2 (std::make_shared (genesis.hash (), key2.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ auto vote2 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 1, send2));
+ votes1->last_votes[nano::test_genesis_key.pub].time = std::chrono::steady_clock::now () - std::chrono::seconds (20);
+ lock.lock ();
+ node1.vote_processor.vote_blocking (transaction, vote2, node1.network.endpoint ());
+ lock.unlock ();
+ ASSERT_EQ (2, votes1->last_votes.size ());
+ ASSERT_NE (votes1->last_votes.end (), votes1->last_votes.find (nano::test_genesis_key.pub));
+ ASSERT_EQ (send1->hash (), votes1->last_votes[nano::test_genesis_key.pub].hash);
+ auto winner (*votes1->tally (transaction).begin ());
+ ASSERT_EQ (*send1, *winner.second);
+}
+
+// Lower sequence numbers are accepted for different accounts
+TEST (votes, add_old_different_account)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ auto send2 (std::make_shared (send1->hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send2);
+ auto transaction (node1.store.tx_begin (true));
+ ASSERT_EQ (nano::process_result::progress, node1.ledger.process (transaction, *send1).code);
+ ASSERT_EQ (nano::process_result::progress, node1.ledger.process (transaction, *send2).code);
+ node1.active.start (send1);
+ node1.active.start (send2);
+ auto votes1 (node1.active.roots.find (send1->root ())->election);
+ auto votes2 (node1.active.roots.find (send2->root ())->election);
+ ASSERT_EQ (1, votes1->last_votes.size ());
+ ASSERT_EQ (1, votes2->last_votes.size ());
+ auto vote1 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 2, send1));
+ std::unique_lock lock (node1.active.mutex);
+ auto vote_result1 (node1.vote_processor.vote_blocking (transaction, vote1, node1.network.endpoint ()));
+ lock.unlock ();
+ ASSERT_EQ (nano::vote_code::vote, vote_result1);
+ ASSERT_EQ (2, votes1->last_votes.size ());
+ ASSERT_EQ (1, votes2->last_votes.size ());
+ lock.lock ();
+ auto vote2 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 1, send2));
+ auto vote_result2 (node1.vote_processor.vote_blocking (transaction, vote2, node1.network.endpoint ()));
+ lock.unlock ();
+ ASSERT_EQ (nano::vote_code::vote, vote_result2);
+ ASSERT_EQ (2, votes1->last_votes.size ());
+ ASSERT_EQ (2, votes2->last_votes.size ());
+ ASSERT_NE (votes1->last_votes.end (), votes1->last_votes.find (nano::test_genesis_key.pub));
+ ASSERT_NE (votes2->last_votes.end (), votes2->last_votes.find (nano::test_genesis_key.pub));
+ ASSERT_EQ (send1->hash (), votes1->last_votes[nano::test_genesis_key.pub].hash);
+ ASSERT_EQ (send2->hash (), votes2->last_votes[nano::test_genesis_key.pub].hash);
+ auto winner1 (*votes1->tally (transaction).begin ());
+ ASSERT_EQ (*send1, *winner1.second);
+ auto winner2 (*votes2->tally (transaction).begin ());
+ ASSERT_EQ (*send2, *winner2.second);
+}
+
+// The voting cooldown is respected
+TEST (votes, add_cooldown)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ nano::keypair key1;
+ auto send1 (std::make_shared (genesis.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send1);
+ auto transaction (node1.store.tx_begin (true));
+ ASSERT_EQ (nano::process_result::progress, node1.ledger.process (transaction, *send1).code);
+ node1.active.start (send1);
+ auto votes1 (node1.active.roots.find (send1->root ())->election);
+ auto vote1 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 1, send1));
+ std::unique_lock lock (node1.active.mutex);
+ node1.vote_processor.vote_blocking (transaction, vote1, node1.network.endpoint ());
+ lock.unlock ();
+ nano::keypair key2;
+ auto send2 (std::make_shared (genesis.hash (), key2.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*send2);
+ auto vote2 (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 2, send2));
+ lock.lock ();
+ node1.vote_processor.vote_blocking (transaction, vote2, node1.network.endpoint ());
+ lock.unlock ();
+ ASSERT_EQ (2, votes1->last_votes.size ());
+ ASSERT_NE (votes1->last_votes.end (), votes1->last_votes.find (nano::test_genesis_key.pub));
+ ASSERT_EQ (send1->hash (), votes1->last_votes[nano::test_genesis_key.pub].hash);
+ auto winner (*votes1->tally (transaction).begin ());
+ ASSERT_EQ (*send1, *winner.second);
+}
+
+// Query for block successor
+TEST (ledger, successor)
+{
+ nano::system system (24000, 1);
+ nano::keypair key1;
+ nano::genesis genesis;
+ nano::send_block send1 (genesis.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto transaction (system.nodes[0]->store.tx_begin (true));
+ ASSERT_EQ (nano::process_result::progress, system.nodes[0]->ledger.process (transaction, send1).code);
+ ASSERT_EQ (send1, *system.nodes[0]->ledger.successor (transaction, genesis.hash ()));
+ ASSERT_EQ (*genesis.open, *system.nodes[0]->ledger.successor (transaction, genesis.open->root ()));
+ ASSERT_EQ (nullptr, system.nodes[0]->ledger.successor (transaction, 0));
+}
+
+TEST (ledger, fail_change_old)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::change_block block (genesis.hash (), key1.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ auto result2 (ledger.process (transaction, block));
+ ASSERT_EQ (nano::process_result::old, result2.code);
+}
+
+TEST (ledger, fail_change_gap_previous)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::change_block block (1, key1.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block));
+ ASSERT_EQ (nano::process_result::gap_previous, result1.code);
+}
+
+TEST (ledger, fail_change_bad_signature)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::change_block block (genesis.hash (), key1.pub, nano::keypair ().prv, 0, 0);
+ auto result1 (ledger.process (transaction, block));
+ ASSERT_EQ (nano::process_result::bad_signature, result1.code);
+}
+
+TEST (ledger, fail_change_fork)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::change_block block1 (genesis.hash (), key1.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block1));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ nano::keypair key2;
+ nano::change_block block2 (genesis.hash (), key2.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result2 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::fork, result2.code);
+}
+
+TEST (ledger, fail_send_old)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ auto result2 (ledger.process (transaction, block));
+ ASSERT_EQ (nano::process_result::old, result2.code);
+}
+
+TEST (ledger, fail_send_gap_previous)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block (1, key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block));
+ ASSERT_EQ (nano::process_result::gap_previous, result1.code);
+}
+
+TEST (ledger, fail_send_bad_signature)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block (genesis.hash (), key1.pub, 1, nano::keypair ().prv, 0, 0);
+ auto result1 (ledger.process (transaction, block));
+ ASSERT_EQ (nano::process_result::bad_signature, result1.code);
+}
+
+TEST (ledger, fail_send_negative_spend)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::keypair key2;
+ nano::send_block block2 (block1.hash (), key2.pub, 2, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::negative_spend, ledger.process (transaction, block2).code);
+}
+
+TEST (ledger, fail_send_fork)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::keypair key2;
+ nano::send_block block2 (genesis.hash (), key2.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, block2).code);
+}
+
+TEST (ledger, fail_open_old)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::open_block block2 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block2).code);
+ ASSERT_EQ (nano::process_result::old, ledger.process (transaction, block2).code);
+}
+
+TEST (ledger, fail_open_gap_source)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::open_block block2 (1, 1, key1.pub, key1.prv, key1.pub, 0);
+ auto result2 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::gap_source, result2.code);
+}
+
+TEST (ledger, fail_open_bad_signature)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::open_block block2 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ block2.signature.clear ();
+ ASSERT_EQ (nano::process_result::bad_signature, ledger.process (transaction, block2).code);
+}
+
+TEST (ledger, fail_open_fork_previous)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::send_block block2 (block1.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block2).code);
+ nano::open_block block3 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block3).code);
+ nano::open_block block4 (block2.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, block4).code);
+}
+
+TEST (ledger, fail_open_account_mismatch)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::keypair badkey;
+ nano::open_block block2 (block1.hash (), 1, badkey.pub, badkey.prv, badkey.pub, 0);
+ ASSERT_NE (nano::process_result::progress, ledger.process (transaction, block2).code);
+}
+
+TEST (ledger, fail_receive_old)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ nano::send_block block2 (block1.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block2).code);
+ nano::open_block block3 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block3).code);
+ nano::receive_block block4 (block3.hash (), block2.hash (), key1.prv, key1.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block4).code);
+ ASSERT_EQ (nano::process_result::old, ledger.process (transaction, block4).code);
+}
+
+TEST (ledger, fail_receive_gap_source)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block1));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ nano::send_block block2 (block1.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result2 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::progress, result2.code);
+ nano::open_block block3 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ auto result3 (ledger.process (transaction, block3));
+ ASSERT_EQ (nano::process_result::progress, result3.code);
+ nano::receive_block block4 (block3.hash (), 1, key1.prv, key1.pub, 0);
+ auto result4 (ledger.process (transaction, block4));
+ ASSERT_EQ (nano::process_result::gap_source, result4.code);
+}
+
+TEST (ledger, fail_receive_overreceive)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block1));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ nano::open_block block2 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ auto result3 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::progress, result3.code);
+ nano::receive_block block3 (block2.hash (), block1.hash (), key1.prv, key1.pub, 0);
+ auto result4 (ledger.process (transaction, block3));
+ ASSERT_EQ (nano::process_result::unreceivable, result4.code);
+}
+
+TEST (ledger, fail_receive_bad_signature)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block1));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ nano::send_block block2 (block1.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result2 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::progress, result2.code);
+ nano::open_block block3 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ auto result3 (ledger.process (transaction, block3));
+ ASSERT_EQ (nano::process_result::progress, result3.code);
+ nano::receive_block block4 (block3.hash (), block2.hash (), nano::keypair ().prv, 0, 0);
+ auto result4 (ledger.process (transaction, block4));
+ ASSERT_EQ (nano::process_result::bad_signature, result4.code);
+}
+
+TEST (ledger, fail_receive_gap_previous_opened)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block1));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ nano::send_block block2 (block1.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result2 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::progress, result2.code);
+ nano::open_block block3 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ auto result3 (ledger.process (transaction, block3));
+ ASSERT_EQ (nano::process_result::progress, result3.code);
+ nano::receive_block block4 (1, block2.hash (), key1.prv, key1.pub, 0);
+ auto result4 (ledger.process (transaction, block4));
+ ASSERT_EQ (nano::process_result::gap_previous, result4.code);
+}
+
+TEST (ledger, fail_receive_gap_previous_unopened)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block1));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ nano::send_block block2 (block1.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result2 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::progress, result2.code);
+ nano::receive_block block3 (1, block2.hash (), key1.prv, key1.pub, 0);
+ auto result3 (ledger.process (transaction, block3));
+ ASSERT_EQ (nano::process_result::gap_previous, result3.code);
+}
+
+TEST (ledger, fail_receive_fork_previous)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block1));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ nano::send_block block2 (block1.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result2 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::progress, result2.code);
+ nano::open_block block3 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ auto result3 (ledger.process (transaction, block3));
+ ASSERT_EQ (nano::process_result::progress, result3.code);
+ nano::keypair key2;
+ nano::send_block block4 (block3.hash (), key1.pub, 1, key1.prv, key1.pub, 0);
+ auto result4 (ledger.process (transaction, block4));
+ ASSERT_EQ (nano::process_result::progress, result4.code);
+ nano::receive_block block5 (block3.hash (), block2.hash (), key1.prv, key1.pub, 0);
+ auto result5 (ledger.process (transaction, block5));
+ ASSERT_EQ (nano::process_result::fork, result5.code);
+}
+
+TEST (ledger, fail_receive_received_source)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key1;
+ nano::send_block block1 (genesis.hash (), key1.pub, 2, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result1 (ledger.process (transaction, block1));
+ ASSERT_EQ (nano::process_result::progress, result1.code);
+ nano::send_block block2 (block1.hash (), key1.pub, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result2 (ledger.process (transaction, block2));
+ ASSERT_EQ (nano::process_result::progress, result2.code);
+ nano::send_block block6 (block2.hash (), key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto result6 (ledger.process (transaction, block6));
+ ASSERT_EQ (nano::process_result::progress, result6.code);
+ nano::open_block block3 (block1.hash (), 1, key1.pub, key1.prv, key1.pub, 0);
+ auto result3 (ledger.process (transaction, block3));
+ ASSERT_EQ (nano::process_result::progress, result3.code);
+ nano::keypair key2;
+ nano::send_block block4 (block3.hash (), key1.pub, 1, key1.prv, key1.pub, 0);
+ auto result4 (ledger.process (transaction, block4));
+ ASSERT_EQ (nano::process_result::progress, result4.code);
+ nano::receive_block block5 (block4.hash (), block2.hash (), key1.prv, key1.pub, 0);
+ auto result5 (ledger.process (transaction, block5));
+ ASSERT_EQ (nano::process_result::progress, result5.code);
+ nano::receive_block block7 (block3.hash (), block2.hash (), key1.prv, key1.pub, 0);
+ auto result7 (ledger.process (transaction, block7));
+ ASSERT_EQ (nano::process_result::fork, result7.code);
+}
+
+TEST (ledger, latest_empty)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::keypair key;
+ auto transaction (store.tx_begin ());
+ auto latest (ledger.latest (transaction, key.pub));
+ ASSERT_TRUE (latest.is_zero ());
+}
+
+TEST (ledger, latest_root)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_FALSE (init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key;
+ ASSERT_EQ (key.pub, ledger.latest_root (transaction, key.pub));
+ auto hash1 (ledger.latest (transaction, nano::test_genesis_key.pub));
+ nano::send_block send (hash1, 0, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send).code);
+ ASSERT_EQ (send.hash (), ledger.latest_root (transaction, nano::test_genesis_key.pub));
+}
+
+TEST (ledger, change_representative_move_representation)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::keypair key1;
+ auto transaction (store.tx_begin (true));
+ nano::genesis genesis;
+ store.initialize (transaction, genesis);
+ auto hash1 (genesis.hash ());
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::test_genesis_key.pub));
+ nano::send_block send (hash1, key1.pub, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send).code);
+ ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
+ nano::keypair key2;
+ nano::change_block change (send.hash (), key2.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, change).code);
+ nano::keypair key3;
+ nano::open_block open (send.hash (), key3.pub, key1.pub, key1.prv, key1.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open).code);
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, key3.pub));
+}
+
+TEST (ledger, send_open_receive_rollback)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ auto transaction (store.tx_begin (true));
+ nano::genesis genesis;
+ store.initialize (transaction, genesis);
+ nano::account_info info1;
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::keypair key1;
+ nano::send_block send1 (info1.head, key1.pub, nano::genesis_amount - 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto return1 (ledger.process (transaction, send1));
+ ASSERT_EQ (nano::process_result::progress, return1.code);
+ nano::send_block send2 (send1.hash (), key1.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto return2 (ledger.process (transaction, send2));
+ ASSERT_EQ (nano::process_result::progress, return2.code);
+ nano::keypair key2;
+ nano::open_block open (send2.hash (), key2.pub, key1.pub, key1.prv, key1.pub, 0);
+ auto return4 (ledger.process (transaction, open));
+ ASSERT_EQ (nano::process_result::progress, return4.code);
+ nano::receive_block receive (open.hash (), send1.hash (), key1.prv, key1.pub, 0);
+ auto return5 (ledger.process (transaction, receive));
+ ASSERT_EQ (nano::process_result::progress, return5.code);
+ nano::keypair key3;
+ ASSERT_EQ (100, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
+ nano::change_block change1 (send2.hash (), key3.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ auto return6 (ledger.process (transaction, change1));
+ ASSERT_EQ (nano::process_result::progress, return6.code);
+ ASSERT_EQ (100, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, key3.pub));
+ ledger.rollback (transaction, receive.hash ());
+ ASSERT_EQ (50, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, key3.pub));
+ ledger.rollback (transaction, open.hash ());
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, key3.pub));
+ ledger.rollback (transaction, change1.hash ());
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
+ ASSERT_EQ (nano::genesis_amount - 100, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ledger.rollback (transaction, send2.hash ());
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
+ ASSERT_EQ (nano::genesis_amount - 50, ledger.weight (transaction, nano::test_genesis_key.pub));
+ ledger.rollback (transaction, send1.hash ());
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key3.pub));
+ ASSERT_EQ (nano::genesis_amount - 0, ledger.weight (transaction, nano::test_genesis_key.pub));
+}
+
+TEST (ledger, bootstrap_rep_weight)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::account_info info1;
+ nano::keypair key2;
+ nano::genesis genesis;
+ {
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::send_block send (info1.head, key2.pub, std::numeric_limits::max () - 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ledger.process (transaction, send);
+ }
+ {
+ auto transaction (store.tx_begin ());
+ ledger.bootstrap_weight_max_blocks = 3;
+ ledger.bootstrap_weights[key2.pub] = 1000;
+ ASSERT_EQ (1000, ledger.weight (transaction, key2.pub));
+ }
+ {
+ auto transaction (store.tx_begin (true));
+ ASSERT_FALSE (store.account_get (transaction, nano::test_genesis_key.pub, info1));
+ nano::send_block send (info1.head, key2.pub, std::numeric_limits::max () - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ledger.process (transaction, send);
+ }
+ {
+ auto transaction (store.tx_begin ());
+ ASSERT_EQ (0, ledger.weight (transaction, key2.pub));
+ }
+}
+
+TEST (ledger, block_destination_source)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair dest;
+ nano::uint128_t balance (nano::genesis_amount);
+ balance -= nano::Gxrb_ratio;
+ nano::send_block block1 (genesis.hash (), dest.pub, balance, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ balance -= nano::Gxrb_ratio;
+ nano::send_block block2 (block1.hash (), nano::genesis_account, balance, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ balance += nano::Gxrb_ratio;
+ nano::receive_block block3 (block2.hash (), block2.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ balance -= nano::Gxrb_ratio;
+ nano::state_block block4 (nano::genesis_account, block3.hash (), nano::genesis_account, balance, dest.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ balance -= nano::Gxrb_ratio;
+ nano::state_block block5 (nano::genesis_account, block4.hash (), nano::genesis_account, balance, nano::genesis_account, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ balance += nano::Gxrb_ratio;
+ nano::state_block block6 (nano::genesis_account, block5.hash (), nano::genesis_account, balance, block5.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block1).code);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block2).code);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block3).code);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block4).code);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block5).code);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, block6).code);
+ ASSERT_EQ (balance, ledger.balance (transaction, block6.hash ()));
+ ASSERT_EQ (dest.pub, ledger.block_destination (transaction, block1));
+ ASSERT_TRUE (ledger.block_source (transaction, block1).is_zero ());
+ ASSERT_EQ (nano::genesis_account, ledger.block_destination (transaction, block2));
+ ASSERT_TRUE (ledger.block_source (transaction, block2).is_zero ());
+ ASSERT_TRUE (ledger.block_destination (transaction, block3).is_zero ());
+ ASSERT_EQ (block2.hash (), ledger.block_source (transaction, block3));
+ ASSERT_EQ (dest.pub, ledger.block_destination (transaction, block4));
+ ASSERT_TRUE (ledger.block_source (transaction, block4).is_zero ());
+ ASSERT_EQ (nano::genesis_account, ledger.block_destination (transaction, block5));
+ ASSERT_TRUE (ledger.block_source (transaction, block5).is_zero ());
+ ASSERT_TRUE (ledger.block_destination (transaction, block6).is_zero ());
+ ASSERT_EQ (block5.hash (), ledger.block_source (transaction, block6));
+}
+
+TEST (ledger, state_account)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ ASSERT_EQ (nano::genesis_account, ledger.account (transaction, send1.hash ()));
+}
+
+TEST (ledger, state_send_receive)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ ASSERT_TRUE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, send1.hash ())));
+ 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, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ ASSERT_FALSE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, send1.hash ())));
+}
+
+TEST (ledger, state_receive)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::send_block send1 (genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ 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, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+}
+
+TEST (ledger, state_rep_change)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair rep;
+ 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, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, rep.pub));
+}
+
+TEST (ledger, state_open)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ ASSERT_TRUE (store.pending_exists (transaction, nano::pending_key (destination.pub, send1.hash ())));
+ nano::state_block open1 (destination.pub, 0, nano::genesis_account, nano::Gxrb_ratio, send1.hash (), destination.prv, destination.pub, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+}
+
+// Make sure old block types can't be inserted after a state block.
+TEST (ledger, send_after_state_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::send_block send2 (send1.hash (), nano::genesis_account, nano::genesis_amount - (2 * nano::Gxrb_ratio), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::block_position, ledger.process (transaction, send2).code);
+}
+
+// Make sure old block types can't be inserted after a state block.
+TEST (ledger, receive_after_state_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::receive_block receive1 (send1.hash (), send1.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::block_position, ledger.process (transaction, receive1).code);
+}
+
+// Make sure old block types can't be inserted after a state block.
+TEST (ledger, change_after_state_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::keypair rep;
+ nano::change_block change1 (send1.hash (), rep.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::block_position, ledger.process (transaction, change1).code);
+}
+
+TEST (ledger, state_unreceivable_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::send_block send1 (genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ nano::state_block receive1 (nano::genesis_account, send1.hash (), nano::genesis_account, nano::genesis_amount, 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::gap_source, ledger.process (transaction, receive1).code);
+}
+
+TEST (ledger, state_receive_bad_amount_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::send_block send1 (genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ nano::state_block receive1 (nano::genesis_account, send1.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, send1.hash (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::balance_mismatch, ledger.process (transaction, receive1).code);
+}
+
+TEST (ledger, state_no_link_amount_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::keypair rep;
+ nano::state_block change1 (nano::genesis_account, send1.hash (), rep.pub, nano::genesis_amount, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::balance_mismatch, ledger.process (transaction, change1).code);
+}
+
+TEST (ledger, state_receive_wrong_account_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ nano::keypair key;
+ nano::state_block receive1 (key.pub, 0, nano::genesis_account, nano::Gxrb_ratio, send1.hash (), key.prv, key.pub, 0);
+ ASSERT_EQ (nano::process_result::unreceivable, ledger.process (transaction, receive1).code);
+}
+
+TEST (ledger, state_open_state_fork)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::state_block open1 (destination.pub, 0, nano::genesis_account, nano::Gxrb_ratio, send1.hash (), destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ nano::open_block open2 (send1.hash (), nano::genesis_account, destination.pub, destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, open2).code);
+ ASSERT_EQ (open1.root (), open2.root ());
+}
+
+TEST (ledger, state_state_open_fork)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::open_block open1 (send1.hash (), nano::genesis_account, destination.pub, destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ nano::state_block open2 (destination.pub, 0, nano::genesis_account, nano::Gxrb_ratio, send1.hash (), destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, open2).code);
+ ASSERT_EQ (open1.root (), open2.root ());
+}
+
+TEST (ledger, state_open_previous_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::state_block open1 (destination.pub, destination.pub, nano::genesis_account, nano::Gxrb_ratio, send1.hash (), destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::gap_previous, ledger.process (transaction, open1).code);
+}
+
+TEST (ledger, state_open_source_fail)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::state_block open1 (destination.pub, 0, nano::genesis_account, 0, 0, destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::gap_source, ledger.process (transaction, open1).code);
+}
+
+TEST (ledger, state_send_change)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair rep;
+ 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, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (transaction, rep.pub));
+}
+
+TEST (ledger, state_receive_change)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ nano::keypair rep;
+ 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, 0);
+ 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 ()));
+ 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 (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, rep.pub));
+}
+
+TEST (ledger, state_open_old)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::open_block open1 (send1.hash (), nano::genesis_account, destination.pub, destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ 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 (transaction, nano::genesis_account));
+}
+
+TEST (ledger, state_receive_old)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::state_block send2 (nano::genesis_account, send1.hash (), nano::genesis_account, nano::genesis_amount - (2 * nano::Gxrb_ratio), destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send2).code);
+ nano::open_block open1 (send1.hash (), nano::genesis_account, destination.pub, destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ nano::receive_block receive1 (open1.hash (), send2.hash (), destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
+ ASSERT_EQ (2 * nano::Gxrb_ratio, ledger.balance (transaction, receive1.hash ()));
+ ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, receive1.hash ()));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
+}
+
+TEST (ledger, state_rollback_send)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ 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 ()));
+ ASSERT_NE (nullptr, send2);
+ ASSERT_EQ (send1, *send2);
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.account_balance (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (transaction, nano::genesis_account));
+ nano::pending_info info;
+ ASSERT_FALSE (store.pending_get (transaction, nano::pending_key (nano::genesis_account, send1.hash ()), info));
+ ASSERT_EQ (nano::genesis_account, info.source);
+ ASSERT_EQ (nano::Gxrb_ratio, info.amount.number ());
+ ledger.rollback (transaction, send1.hash ());
+ ASSERT_FALSE (store.block_exists (transaction, send1.hash ()));
+ ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
+ ASSERT_FALSE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, send1.hash ())));
+ ASSERT_TRUE (store.block_successor (transaction, genesis.hash ()).is_zero ());
+}
+
+TEST (ledger, state_rollback_receive)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
+ ASSERT_FALSE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, receive1.hash ())));
+ ledger.rollback (transaction, receive1.hash ());
+ nano::pending_info info;
+ ASSERT_FALSE (store.pending_get (transaction, nano::pending_key (nano::genesis_account, send1.hash ()), info));
+ ASSERT_EQ (nano::genesis_account, info.source);
+ ASSERT_EQ (nano::Gxrb_ratio, info.amount.number ());
+ ASSERT_FALSE (store.block_exists (transaction, receive1.hash ()));
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.account_balance (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (transaction, nano::genesis_account));
+}
+
+TEST (ledger, state_rollback_received_send)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair key;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, key.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::state_block receive1 (key.pub, 0, key.pub, nano::Gxrb_ratio, send1.hash (), key.prv, key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
+ ASSERT_FALSE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, receive1.hash ())));
+ ledger.rollback (transaction, send1.hash ());
+ ASSERT_FALSE (store.pending_exists (transaction, nano::pending_key (nano::genesis_account, send1.hash ())));
+ ASSERT_FALSE (store.block_exists (transaction, send1.hash ()));
+ ASSERT_FALSE (store.block_exists (transaction, receive1.hash ()));
+ ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
+ ASSERT_EQ (0, ledger.account_balance (transaction, key.pub));
+ ASSERT_EQ (0, ledger.weight (transaction, key.pub));
+}
+
+TEST (ledger, state_rep_change_rollback)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair rep;
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, change1).code);
+ ledger.rollback (transaction, change1.hash ());
+ ASSERT_FALSE (store.block_exists (transaction, change1.hash ()));
+ ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
+ ASSERT_EQ (0, ledger.weight (transaction, rep.pub));
+}
+
+TEST (ledger, state_open_rollback)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::state_block open1 (destination.pub, 0, nano::genesis_account, nano::Gxrb_ratio, send1.hash (), destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ ledger.rollback (transaction, open1.hash ());
+ ASSERT_FALSE (store.block_exists (transaction, open1.hash ()));
+ ASSERT_EQ (0, ledger.account_balance (transaction, destination.pub));
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (transaction, nano::genesis_account));
+ nano::pending_info info;
+ ASSERT_FALSE (store.pending_get (transaction, nano::pending_key (destination.pub, send1.hash ()), info));
+ ASSERT_EQ (nano::genesis_account, info.source);
+ ASSERT_EQ (nano::Gxrb_ratio, info.amount.number ());
+}
+
+TEST (ledger, state_send_change_rollback)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair rep;
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ ledger.rollback (transaction, send1.hash ());
+ ASSERT_FALSE (store.block_exists (transaction, send1.hash ()));
+ ASSERT_EQ (nano::genesis_amount, ledger.account_balance (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount, ledger.weight (transaction, nano::genesis_account));
+ ASSERT_EQ (0, ledger.weight (transaction, rep.pub));
+}
+
+TEST (ledger, state_receive_change_rollback)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::ledger ledger (store, stats);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::keypair rep;
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
+ ledger.rollback (transaction, receive1.hash ());
+ ASSERT_FALSE (store.block_exists (transaction, receive1.hash ()));
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.account_balance (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (transaction, nano::genesis_account));
+ ASSERT_EQ (0, ledger.weight (transaction, rep.pub));
+}
+
+TEST (ledger, epoch_blocks_general)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::keypair epoch_key;
+ nano::ledger ledger (store, stats, 123, epoch_key.pub);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block epoch1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount, 123, epoch_key.prv, epoch_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, epoch1).code);
+ nano::state_block epoch2 (nano::genesis_account, epoch1.hash (), nano::genesis_account, nano::genesis_amount, 123, epoch_key.prv, epoch_key.pub, 0);
+ ASSERT_EQ (nano::process_result::block_position, ledger.process (transaction, epoch2).code);
+ nano::account_info genesis_info;
+ ASSERT_FALSE (ledger.store.account_get (transaction, nano::genesis_account, genesis_info));
+ ASSERT_EQ (genesis_info.epoch, nano::epoch::epoch_1);
+ ledger.rollback (transaction, epoch1.hash ());
+ ASSERT_FALSE (ledger.store.account_get (transaction, nano::genesis_account, genesis_info));
+ ASSERT_EQ (genesis_info.epoch, nano::epoch::epoch_0);
+ 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::change_block change1 (epoch1.hash (), nano::genesis_account, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::open_block open1 (send1.hash (), nano::genesis_account, destination.pub, destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::unreceivable, ledger.process (transaction, open1).code);
+ nano::state_block epoch3 (destination.pub, 0, nano::genesis_account, 0, 123, epoch_key.prv, epoch_key.pub, 0);
+ ASSERT_EQ (nano::process_result::representative_mismatch, ledger.process (transaction, epoch3).code);
+ nano::state_block epoch4 (destination.pub, 0, 0, 0, 123, epoch_key.prv, epoch_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, epoch4).code);
+ nano::receive_block receive1 (epoch4.hash (), send1.hash (), destination.prv, destination.pub, 0);
+ 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, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive2).code);
+ ASSERT_EQ (0, ledger.balance (transaction, epoch4.hash ()));
+ ASSERT_EQ (nano::Gxrb_ratio, ledger.balance (transaction, receive2.hash ()));
+ ASSERT_EQ (nano::Gxrb_ratio, ledger.amount (transaction, receive2.hash ()));
+ ASSERT_EQ (nano::genesis_amount - nano::Gxrb_ratio, ledger.weight (transaction, nano::genesis_account));
+ ASSERT_EQ (nano::Gxrb_ratio, ledger.weight (transaction, destination.pub));
+}
+
+TEST (ledger, epoch_blocks_receive_upgrade)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::keypair epoch_key;
+ nano::ledger ledger (store, stats, 123, epoch_key.pub);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::state_block send1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::state_block epoch1 (nano::genesis_account, send1.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio, 123, epoch_key.prv, epoch_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, epoch1).code);
+ nano::state_block send2 (nano::genesis_account, epoch1.hash (), nano::genesis_account, nano::genesis_amount - nano::Gxrb_ratio * 2, destination.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send2).code);
+ nano::open_block open1 (send1.hash (), destination.pub, destination.pub, destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ nano::receive_block receive1 (open1.hash (), send2.hash (), destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::unreceivable, ledger.process (transaction, receive1).code);
+ nano::state_block receive2 (destination.pub, open1.hash (), destination.pub, nano::Gxrb_ratio * 2, send2.hash (), destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive2).code);
+ nano::account_info destination_info;
+ ASSERT_FALSE (ledger.store.account_get (transaction, destination.pub, destination_info));
+ ASSERT_EQ (destination_info.epoch, nano::epoch::epoch_1);
+ ledger.rollback (transaction, receive2.hash ());
+ ASSERT_FALSE (ledger.store.account_get (transaction, destination.pub, destination_info));
+ ASSERT_EQ (destination_info.epoch, nano::epoch::epoch_0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive2).code);
+ ASSERT_FALSE (ledger.store.account_get (transaction, destination.pub, destination_info));
+ ASSERT_EQ (destination_info.epoch, nano::epoch::epoch_1);
+ nano::keypair destination2;
+ nano::state_block send3 (destination.pub, receive2.hash (), destination.pub, nano::Gxrb_ratio, destination2.pub, destination.prv, destination.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send3).code);
+ nano::open_block open2 (send3.hash (), destination2.pub, destination2.pub, destination2.prv, destination2.pub, 0);
+ ASSERT_EQ (nano::process_result::unreceivable, ledger.process (transaction, open2).code);
+}
+
+TEST (ledger, epoch_blocks_fork)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::keypair epoch_key;
+ nano::ledger ledger (store, stats, 123, epoch_key.pub);
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ nano::send_block send1 (genesis.hash (), nano::account (0), nano::genesis_amount, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send1).code);
+ nano::state_block epoch1 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount, 123, epoch_key.prv, epoch_key.pub, 0);
+ ASSERT_EQ (nano::process_result::fork, ledger.process (transaction, epoch1).code);
+}
+
+TEST (ledger, could_fit)
+{
+ bool init (false);
+ nano::mdb_store store (init, nano::unique_path ());
+ ASSERT_TRUE (!init);
+ nano::stat stats;
+ nano::keypair epoch_key;
+ nano::ledger ledger (store, stats, 123, epoch_key.pub);
+ nano::keypair epoch_signer;
+ ledger.epoch_link = 123;
+ ledger.epoch_signer = epoch_signer.pub;
+ nano::genesis genesis;
+ auto transaction (store.tx_begin (true));
+ store.initialize (transaction, genesis);
+ nano::keypair destination;
+ // Test legacy and state change blocks could_fit
+ nano::change_block change1 (genesis.hash (), nano::genesis_account, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ nano::state_block change2 (nano::genesis_account, genesis.hash (), nano::genesis_account, nano::genesis_amount, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_TRUE (ledger.could_fit (transaction, change1));
+ ASSERT_TRUE (ledger.could_fit (transaction, change2));
+ // Test legacy and state send
+ nano::keypair key1;
+ nano::send_block send1 (change1.hash (), key1.pub, nano::genesis_amount - 1, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ nano::state_block send2 (nano::genesis_account, change1.hash (), nano::genesis_account, nano::genesis_amount - 1, key1.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ ASSERT_FALSE (ledger.could_fit (transaction, send1));
+ ASSERT_FALSE (ledger.could_fit (transaction, send2));
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, change1).code);
+ ASSERT_TRUE (ledger.could_fit (transaction, change1));
+ ASSERT_TRUE (ledger.could_fit (transaction, change2));
+ ASSERT_TRUE (ledger.could_fit (transaction, send1));
+ ASSERT_TRUE (ledger.could_fit (transaction, send2));
+ // Test legacy and state open
+ nano::open_block open1 (send2.hash (), nano::genesis_account, key1.pub, key1.prv, key1.pub, 0);
+ nano::state_block open2 (key1.pub, 0, nano::genesis_account, 1, send2.hash (), key1.prv, key1.pub, 0);
+ ASSERT_FALSE (ledger.could_fit (transaction, open1));
+ ASSERT_FALSE (ledger.could_fit (transaction, open2));
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send2).code);
+ ASSERT_TRUE (ledger.could_fit (transaction, send1));
+ ASSERT_TRUE (ledger.could_fit (transaction, send2));
+ ASSERT_TRUE (ledger.could_fit (transaction, open1));
+ ASSERT_TRUE (ledger.could_fit (transaction, open2));
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, open1).code);
+ ASSERT_TRUE (ledger.could_fit (transaction, open1));
+ ASSERT_TRUE (ledger.could_fit (transaction, open2));
+ // Create another send to receive
+ nano::state_block send3 (nano::genesis_account, send2.hash (), nano::genesis_account, nano::genesis_amount - 2, key1.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0);
+ // Test legacy and state receive
+ nano::receive_block receive1 (open1.hash (), send3.hash (), key1.prv, key1.pub, 0);
+ nano::state_block receive2 (key1.pub, open1.hash (), nano::genesis_account, 2, send3.hash (), key1.prv, key1.pub, 0);
+ ASSERT_FALSE (ledger.could_fit (transaction, receive1));
+ ASSERT_FALSE (ledger.could_fit (transaction, receive2));
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, send3).code);
+ ASSERT_TRUE (ledger.could_fit (transaction, receive1));
+ ASSERT_TRUE (ledger.could_fit (transaction, receive2));
+ // Test epoch (state)
+ nano::state_block epoch1 (key1.pub, receive1.hash (), nano::genesis_account, 2, ledger.epoch_link, epoch_signer.prv, epoch_signer.pub, 0);
+ ASSERT_FALSE (ledger.could_fit (transaction, epoch1));
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, receive1).code);
+ ASSERT_TRUE (ledger.could_fit (transaction, receive1));
+ ASSERT_TRUE (ledger.could_fit (transaction, receive2));
+ ASSERT_TRUE (ledger.could_fit (transaction, epoch1));
+ ASSERT_EQ (nano::process_result::progress, ledger.process (transaction, epoch1).code);
+ ASSERT_TRUE (ledger.could_fit (transaction, epoch1));
+}
diff --git a/nano/core_test/message.cpp b/nano/core_test/message.cpp
new file mode 100644
index 00000000..85c18fcc
--- /dev/null
+++ b/nano/core_test/message.cpp
@@ -0,0 +1,85 @@
+#include
+
+#include
+
+TEST (message, keepalive_serialization)
+{
+ nano::keepalive request1;
+ std::vector bytes;
+ {
+ nano::vectorstream stream (bytes);
+ request1.serialize (stream);
+ }
+ auto error (false);
+ nano::bufferstream stream (bytes.data (), bytes.size ());
+ nano::message_header header (error, stream);
+ ASSERT_FALSE (error);
+ nano::keepalive request2 (error, stream, header);
+ ASSERT_FALSE (error);
+ ASSERT_EQ (request1, request2);
+}
+
+TEST (message, keepalive_deserialize)
+{
+ nano::keepalive message1;
+ message1.peers[0] = nano::endpoint (boost::asio::ip::address_v6::loopback (), 10000);
+ std::vector bytes;
+ {
+ nano::vectorstream stream (bytes);
+ message1.serialize (stream);
+ }
+ nano::bufferstream stream (bytes.data (), bytes.size ());
+ auto error (false);
+ nano::message_header header (error, stream);
+ ASSERT_FALSE (error);
+ ASSERT_EQ (nano::message_type::keepalive, header.type);
+ nano::keepalive message2 (error, stream, header);
+ ASSERT_FALSE (error);
+ ASSERT_EQ (message1.peers, message2.peers);
+}
+
+TEST (message, publish_serialization)
+{
+ nano::publish publish (std::make_shared (0, 1, 2, nano::keypair ().prv, 4, 5));
+ ASSERT_EQ (nano::block_type::send, publish.header.block_type ());
+ std::vector bytes;
+ {
+ nano::vectorstream stream (bytes);
+ publish.header.serialize (stream);
+ }
+ ASSERT_EQ (8, bytes.size ());
+ ASSERT_EQ (0x52, bytes[0]);
+ ASSERT_EQ (0x41, bytes[1]);
+ ASSERT_EQ (nano::protocol_version, bytes[2]);
+ ASSERT_EQ (nano::protocol_version, bytes[3]);
+ ASSERT_EQ (nano::protocol_version_min, bytes[4]);
+ ASSERT_EQ (static_cast (nano::message_type::publish), bytes[5]);
+ ASSERT_EQ (0x00, bytes[6]); // extensions
+ ASSERT_EQ (static_cast (nano::block_type::send), bytes[7]);
+ nano::bufferstream stream (bytes.data (), bytes.size ());
+ auto error (false);
+ nano::message_header header (error, stream);
+ ASSERT_FALSE (error);
+ ASSERT_EQ (nano::protocol_version_min, header.version_min);
+ ASSERT_EQ (nano::protocol_version, header.version_using);
+ ASSERT_EQ (nano::protocol_version, header.version_max);
+ ASSERT_EQ (nano::message_type::publish, header.type);
+}
+
+TEST (message, confirm_ack_serialization)
+{
+ nano::keypair key1;
+ auto vote (std::make_shared (key1.pub, key1.prv, 0, std::make_shared (0, 1, 2, key1.prv, 4, 5)));
+ nano::confirm_ack con1 (vote);
+ std::vector bytes;
+ {
+ nano::vectorstream stream1 (bytes);
+ con1.serialize (stream1);
+ }
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
+ bool error (false);
+ nano::message_header header (error, stream2);
+ nano::confirm_ack con2 (error, stream2, header);
+ ASSERT_FALSE (error);
+ ASSERT_EQ (con1, con2);
+}
diff --git a/nano/core_test/message_parser.cpp b/nano/core_test/message_parser.cpp
new file mode 100644
index 00000000..5b00a651
--- /dev/null
+++ b/nano/core_test/message_parser.cpp
@@ -0,0 +1,200 @@
+#include
+#include
+
+namespace
+{
+class test_visitor : public nano::message_visitor
+{
+public:
+ test_visitor () :
+ keepalive_count (0),
+ publish_count (0),
+ confirm_req_count (0),
+ confirm_ack_count (0),
+ bulk_pull_count (0),
+ bulk_pull_account_count (0),
+ bulk_pull_blocks_count (0),
+ bulk_push_count (0),
+ frontier_req_count (0)
+ {
+ }
+ void keepalive (nano::keepalive const &) override
+ {
+ ++keepalive_count;
+ }
+ void publish (nano::publish const &) override
+ {
+ ++publish_count;
+ }
+ void confirm_req (nano::confirm_req const &) override
+ {
+ ++confirm_req_count;
+ }
+ void confirm_ack (nano::confirm_ack const &) override
+ {
+ ++confirm_ack_count;
+ }
+ void bulk_pull (nano::bulk_pull const &) override
+ {
+ ++bulk_pull_count;
+ }
+ void bulk_pull_account (nano::bulk_pull_account const &) override
+ {
+ ++bulk_pull_account_count;
+ }
+ void bulk_pull_blocks (nano::bulk_pull_blocks const &) override
+ {
+ ++bulk_pull_blocks_count;
+ }
+ void bulk_push (nano::bulk_push const &) override
+ {
+ ++bulk_push_count;
+ }
+ void frontier_req (nano::frontier_req const &) override
+ {
+ ++frontier_req_count;
+ }
+ void node_id_handshake (nano::node_id_handshake const &) override
+ {
+ ++node_id_handshake_count;
+ }
+ uint64_t keepalive_count;
+ uint64_t publish_count;
+ uint64_t confirm_req_count;
+ uint64_t confirm_ack_count;
+ uint64_t bulk_pull_count;
+ uint64_t bulk_pull_account_count;
+ uint64_t bulk_pull_blocks_count;
+ uint64_t bulk_push_count;
+ uint64_t frontier_req_count;
+ uint64_t node_id_handshake_count;
+};
+}
+
+TEST (message_parser, exact_confirm_ack_size)
+{
+ nano::system system (24000, 1);
+ test_visitor visitor;
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer vote_uniquer (block_uniquer);
+ nano::message_parser parser (block_uniquer, vote_uniquer, visitor, system.work);
+ auto block (std::make_shared (1, 1, 2, nano::keypair ().prv, 4, system.work.generate (1)));
+ auto vote (std::make_shared (0, nano::keypair ().prv, 0, std::move (block)));
+ nano::confirm_ack message (vote);
+ std::vector bytes;
+ {
+ nano::vectorstream stream (bytes);
+ message.serialize (stream);
+ }
+ ASSERT_EQ (0, visitor.confirm_ack_count);
+ ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
+ auto error (false);
+ nano::bufferstream stream1 (bytes.data (), bytes.size ());
+ nano::message_header header1 (error, stream1);
+ ASSERT_FALSE (error);
+ parser.deserialize_confirm_ack (stream1, header1);
+ ASSERT_EQ (1, visitor.confirm_ack_count);
+ ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
+ bytes.push_back (0);
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
+ nano::message_header header2 (error, stream2);
+ ASSERT_FALSE (error);
+ parser.deserialize_confirm_ack (stream2, header2);
+ ASSERT_EQ (1, visitor.confirm_ack_count);
+ ASSERT_NE (parser.status, nano::message_parser::parse_status::success);
+}
+
+TEST (message_parser, exact_confirm_req_size)
+{
+ nano::system system (24000, 1);
+ test_visitor visitor;
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer vote_uniquer (block_uniquer);
+ nano::message_parser parser (block_uniquer, vote_uniquer, visitor, system.work);
+ auto block (std::make_shared (1, 1, 2, nano::keypair ().prv, 4, system.work.generate (1)));
+ nano::confirm_req message (std::move (block));
+ std::vector bytes;
+ {
+ nano::vectorstream stream (bytes);
+ message.serialize (stream);
+ }
+ ASSERT_EQ (0, visitor.confirm_req_count);
+ ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
+ auto error (false);
+ nano::bufferstream stream1 (bytes.data (), bytes.size ());
+ nano::message_header header1 (error, stream1);
+ ASSERT_FALSE (error);
+ parser.deserialize_confirm_req (stream1, header1);
+ ASSERT_EQ (1, visitor.confirm_req_count);
+ ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
+ bytes.push_back (0);
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
+ nano::message_header header2 (error, stream2);
+ ASSERT_FALSE (error);
+ parser.deserialize_confirm_req (stream2, header2);
+ ASSERT_EQ (1, visitor.confirm_req_count);
+ ASSERT_NE (parser.status, nano::message_parser::parse_status::success);
+}
+
+TEST (message_parser, exact_publish_size)
+{
+ nano::system system (24000, 1);
+ test_visitor visitor;
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer vote_uniquer (block_uniquer);
+ nano::message_parser parser (block_uniquer, vote_uniquer, visitor, system.work);
+ auto block (std::make_shared (1, 1, 2, nano::keypair ().prv, 4, system.work.generate (1)));
+ nano::publish message (std::move (block));
+ std::vector bytes;
+ {
+ nano::vectorstream stream (bytes);
+ message.serialize (stream);
+ }
+ ASSERT_EQ (0, visitor.publish_count);
+ ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
+ auto error (false);
+ nano::bufferstream stream1 (bytes.data (), bytes.size ());
+ nano::message_header header1 (error, stream1);
+ ASSERT_FALSE (error);
+ parser.deserialize_publish (stream1, header1);
+ ASSERT_EQ (1, visitor.publish_count);
+ ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
+ bytes.push_back (0);
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
+ nano::message_header header2 (error, stream2);
+ ASSERT_FALSE (error);
+ parser.deserialize_publish (stream2, header2);
+ ASSERT_EQ (1, visitor.publish_count);
+ ASSERT_NE (parser.status, nano::message_parser::parse_status::success);
+}
+
+TEST (message_parser, exact_keepalive_size)
+{
+ nano::system system (24000, 1);
+ test_visitor visitor;
+ nano::block_uniquer block_uniquer;
+ nano::vote_uniquer vote_uniquer (block_uniquer);
+ nano::message_parser parser (block_uniquer, vote_uniquer, visitor, system.work);
+ nano::keepalive message;
+ std::vector bytes;
+ {
+ nano::vectorstream stream (bytes);
+ message.serialize (stream);
+ }
+ ASSERT_EQ (0, visitor.keepalive_count);
+ ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
+ auto error (false);
+ nano::bufferstream stream1 (bytes.data (), bytes.size ());
+ nano::message_header header1 (error, stream1);
+ ASSERT_FALSE (error);
+ parser.deserialize_keepalive (stream1, header1);
+ ASSERT_EQ (1, visitor.keepalive_count);
+ ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
+ bytes.push_back (0);
+ nano::bufferstream stream2 (bytes.data (), bytes.size ());
+ nano::message_header header2 (error, stream2);
+ ASSERT_FALSE (error);
+ parser.deserialize_keepalive (stream2, header2);
+ ASSERT_EQ (1, visitor.keepalive_count);
+ ASSERT_NE (parser.status, nano::message_parser::parse_status::success);
+}
diff --git a/nano/core_test/network.cpp b/nano/core_test/network.cpp
new file mode 100644
index 00000000..7fafdf96
--- /dev/null
+++ b/nano/core_test/network.cpp
@@ -0,0 +1,1275 @@
+#include
+#include
+#include
+#include
+
+using namespace std::chrono_literals;
+
+TEST (network, tcp_connection)
+{
+ boost::asio::io_context io_ctx;
+ boost::asio::ip::tcp::acceptor acceptor (io_ctx);
+ boost::asio::ip::tcp::endpoint endpoint (boost::asio::ip::address_v4::any (), 24000);
+ acceptor.open (endpoint.protocol ());
+ acceptor.set_option (boost::asio::ip::tcp::acceptor::reuse_address (true));
+ acceptor.bind (endpoint);
+ acceptor.listen ();
+ boost::asio::ip::tcp::socket incoming (io_ctx);
+ auto done1 (false);
+ std::string message1;
+ acceptor.async_accept (incoming,
+ [&done1, &message1](boost::system::error_code const & ec_a) {
+ if (ec_a)
+ {
+ message1 = ec_a.message ();
+ std::cerr << message1;
+ }
+ done1 = true; });
+ boost::asio::ip::tcp::socket connector (io_ctx);
+ auto done2 (false);
+ std::string message2;
+ connector.async_connect (boost::asio::ip::tcp::endpoint (boost::asio::ip::address_v4::loopback (), 24000),
+ [&done2, &message2](boost::system::error_code const & ec_a) {
+ if (ec_a)
+ {
+ message2 = ec_a.message ();
+ std::cerr << message2;
+ }
+ done2 = true;
+ });
+ while (!done1 || !done2)
+ {
+ io_ctx.poll ();
+ }
+ ASSERT_EQ (0, message1.size ());
+ ASSERT_EQ (0, message2.size ());
+}
+
+TEST (network, construction)
+{
+ nano::system system (24000, 1);
+ ASSERT_EQ (1, system.nodes.size ());
+ ASSERT_EQ (24000, system.nodes[0]->network.socket.local_endpoint ().port ());
+}
+
+TEST (network, self_discard)
+{
+ nano::system system (24000, 1);
+ nano::udp_data data;
+ data.endpoint = system.nodes[0]->network.endpoint ();
+ ASSERT_EQ (0, system.nodes[0]->stats.count (nano::stat::type::error, nano::stat::detail::bad_sender));
+ system.nodes[0]->network.receive_action (&data);
+ ASSERT_EQ (1, system.nodes[0]->stats.count (nano::stat::type::error, nano::stat::detail::bad_sender));
+}
+
+TEST (network, send_node_id_handshake)
+{
+ nano::system system (24000, 1);
+ auto list1 (system.nodes[0]->peers.list ());
+ ASSERT_EQ (0, list1.size ());
+ nano::node_init init1;
+ auto node1 (std::make_shared (init1, system.io_ctx, 24001, nano::unique_path (), system.alarm, system.logging, system.work));
+ node1->start ();
+ system.nodes.push_back (node1);
+ auto initial (system.nodes[0]->stats.count (nano::stat::type::message, nano::stat::detail::node_id_handshake, nano::stat::dir::in));
+ auto initial_node1 (node1->stats.count (nano::stat::type::message, nano::stat::detail::node_id_handshake, nano::stat::dir::in));
+ system.nodes[0]->network.send_keepalive (node1->network.endpoint ());
+ ASSERT_EQ (0, system.nodes[0]->peers.list ().size ());
+ ASSERT_EQ (0, node1->peers.list ().size ());
+ system.deadline_set (10s);
+ while (node1->stats.count (nano::stat::type::message, nano::stat::detail::node_id_handshake, nano::stat::dir::in) == initial_node1)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ ASSERT_EQ (0, system.nodes[0]->peers.list ().size ());
+ ASSERT_EQ (1, node1->peers.list ().size ());
+ system.deadline_set (10s);
+ while (system.nodes[0]->stats.count (nano::stat::type::message, nano::stat::detail::node_id_handshake, nano::stat::dir::in) < initial + 2)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ auto peers1 (system.nodes[0]->peers.list ());
+ auto peers2 (node1->peers.list ());
+ ASSERT_EQ (1, peers1.size ());
+ ASSERT_EQ (1, peers2.size ());
+ ASSERT_EQ (node1->network.endpoint (), peers1[0]);
+ ASSERT_EQ (system.nodes[0]->network.endpoint (), peers2[0]);
+ node1->stop ();
+}
+
+TEST (network, keepalive_ipv4)
+{
+ nano::system system (24000, 1);
+ auto list1 (system.nodes[0]->peers.list ());
+ ASSERT_EQ (0, list1.size ());
+ nano::node_init init1;
+ auto node1 (std::make_shared (init1, system.io_ctx, 24001, nano::unique_path (), system.alarm, system.logging, system.work));
+ node1->start ();
+ system.nodes.push_back (node1);
+ node1->send_keepalive (nano::endpoint (boost::asio::ip::address_v4::loopback (), 24000));
+ auto initial (system.nodes[0]->stats.count (nano::stat::type::message, nano::stat::detail::keepalive, nano::stat::dir::in));
+ system.deadline_set (10s);
+ while (system.nodes[0]->stats.count (nano::stat::type::message, nano::stat::detail::keepalive, nano::stat::dir::in) == initial)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ node1->stop ();
+}
+
+TEST (network, multi_keepalive)
+{
+ nano::system system (24000, 1);
+ auto list1 (system.nodes[0]->peers.list ());
+ ASSERT_EQ (0, list1.size ());
+ nano::node_init init1;
+ auto node1 (std::make_shared (init1, system.io_ctx, 24001, nano::unique_path (), system.alarm, system.logging, system.work));
+ ASSERT_FALSE (init1.error ());
+ node1->start ();
+ system.nodes.push_back (node1);
+ ASSERT_EQ (0, node1->peers.size ());
+ node1->network.send_keepalive (system.nodes[0]->network.endpoint ());
+ ASSERT_EQ (0, node1->peers.size ());
+ ASSERT_EQ (0, system.nodes[0]->peers.size ());
+ system.deadline_set (10s);
+ while (system.nodes[0]->peers.size () != 1)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ nano::node_init init2;
+ auto node2 (std::make_shared (init2, system.io_ctx, 24002, nano::unique_path (), system.alarm, system.logging, system.work));
+ ASSERT_FALSE (init2.error ());
+ node2->start ();
+ system.nodes.push_back (node2);
+ node2->network.send_keepalive (system.nodes[0]->network.endpoint ());
+ system.deadline_set (10s);
+ while (node1->peers.size () != 2 || system.nodes[0]->peers.size () != 2 || node2->peers.size () != 2)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ node1->stop ();
+ node2->stop ();
+}
+
+TEST (network, send_discarded_publish)
+{
+ nano::system system (24000, 2);
+ auto block (std::make_shared (1, 1, 2, nano::keypair ().prv, 4, system.work.generate (1)));
+ nano::genesis genesis;
+ {
+ auto transaction (system.nodes[0]->store.tx_begin ());
+ system.nodes[0]->network.republish_block (block);
+ ASSERT_EQ (genesis.hash (), system.nodes[0]->ledger.latest (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (genesis.hash (), system.nodes[1]->latest (nano::test_genesis_key.pub));
+ }
+ system.deadline_set (10s);
+ while (system.nodes[1]->stats.count (nano::stat::type::message, nano::stat::detail::publish, nano::stat::dir::in) == 0)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ auto transaction (system.nodes[0]->store.tx_begin ());
+ ASSERT_EQ (genesis.hash (), system.nodes[0]->ledger.latest (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (genesis.hash (), system.nodes[1]->latest (nano::test_genesis_key.pub));
+}
+
+TEST (network, send_invalid_publish)
+{
+ nano::system system (24000, 2);
+ nano::genesis genesis;
+ auto block (std::make_shared (1, 1, 20, nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (1)));
+ {
+ auto transaction (system.nodes[0]->store.tx_begin ());
+ system.nodes[0]->network.republish_block (block);
+ ASSERT_EQ (genesis.hash (), system.nodes[0]->ledger.latest (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (genesis.hash (), system.nodes[1]->latest (nano::test_genesis_key.pub));
+ }
+ system.deadline_set (10s);
+ while (system.nodes[1]->stats.count (nano::stat::type::message, nano::stat::detail::publish, nano::stat::dir::in) == 0)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ auto transaction (system.nodes[0]->store.tx_begin ());
+ ASSERT_EQ (genesis.hash (), system.nodes[0]->ledger.latest (transaction, nano::test_genesis_key.pub));
+ ASSERT_EQ (genesis.hash (), system.nodes[1]->latest (nano::test_genesis_key.pub));
+}
+
+TEST (network, send_valid_confirm_ack)
+{
+ nano::system system (24000, 2);
+ nano::keypair key2;
+ system.wallet (0)->insert_adhoc (nano::test_genesis_key.prv);
+ system.wallet (1)->insert_adhoc (key2.prv);
+ nano::block_hash latest1 (system.nodes[0]->latest (nano::test_genesis_key.pub));
+ nano::send_block block2 (latest1, key2.pub, 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (latest1));
+ nano::block_hash latest2 (system.nodes[1]->latest (nano::test_genesis_key.pub));
+ system.nodes[0]->process_active (std::make_shared (block2));
+ system.deadline_set (10s);
+ // Keep polling until latest block changes
+ while (system.nodes[1]->latest (nano::test_genesis_key.pub) == latest2)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ // Make sure the balance has decreased after processing the block.
+ ASSERT_EQ (50, system.nodes[1]->balance (nano::test_genesis_key.pub));
+}
+
+TEST (network, send_valid_publish)
+{
+ nano::system system (24000, 2);
+ system.nodes[0]->bootstrap_initiator.stop ();
+ system.nodes[1]->bootstrap_initiator.stop ();
+ system.wallet (0)->insert_adhoc (nano::test_genesis_key.prv);
+ nano::keypair key2;
+ system.wallet (1)->insert_adhoc (key2.prv);
+ nano::block_hash latest1 (system.nodes[0]->latest (nano::test_genesis_key.pub));
+ nano::send_block block2 (latest1, key2.pub, 50, nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (latest1));
+ auto hash2 (block2.hash ());
+ nano::block_hash latest2 (system.nodes[1]->latest (nano::test_genesis_key.pub));
+ system.nodes[1]->process_active (std::make_shared (block2));
+ system.deadline_set (10s);
+ while (system.nodes[0]->stats.count (nano::stat::type::message, nano::stat::detail::publish, nano::stat::dir::in) == 0)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ ASSERT_NE (hash2, latest2);
+ system.deadline_set (10s);
+ while (system.nodes[1]->latest (nano::test_genesis_key.pub) == latest2)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ ASSERT_EQ (50, system.nodes[1]->balance (nano::test_genesis_key.pub));
+}
+
+TEST (network, send_insufficient_work)
+{
+ nano::system system (24000, 2);
+ auto block (std::make_shared (0, 1, 20, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ nano::publish publish (std::move (block));
+ std::shared_ptr> bytes (new std::vector);
+ {
+ nano::vectorstream stream (*bytes);
+ publish.serialize (stream);
+ }
+ auto node1 (system.nodes[1]->shared ());
+ system.nodes[0]->network.send_buffer (bytes->data (), bytes->size (), system.nodes[1]->network.endpoint (), [bytes, node1](boost::system::error_code const & ec, size_t size) {});
+ ASSERT_EQ (0, system.nodes[0]->stats.count (nano::stat::type::error, nano::stat::detail::insufficient_work));
+ system.deadline_set (10s);
+ while (system.nodes[1]->stats.count (nano::stat::type::error, nano::stat::detail::insufficient_work) == 0)
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ ASSERT_EQ (1, system.nodes[1]->stats.count (nano::stat::type::error, nano::stat::detail::insufficient_work));
+}
+
+TEST (receivable_processor, confirm_insufficient_pos)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ auto block1 (std::make_shared (genesis.hash (), 0, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*block1);
+ ASSERT_EQ (nano::process_result::progress, node1.process (*block1).code);
+ auto node_l (system.nodes[0]);
+ node1.active.start (block1);
+ nano::keypair key1;
+ auto vote (std::make_shared (key1.pub, key1.prv, 0, block1));
+ nano::confirm_ack con1 (vote);
+ node1.process_message (con1, node1.network.endpoint ());
+}
+
+TEST (receivable_processor, confirm_sufficient_pos)
+{
+ nano::system system (24000, 1);
+ auto & node1 (*system.nodes[0]);
+ nano::genesis genesis;
+ auto block1 (std::make_shared (genesis.hash (), 0, 0, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));
+ node1.work_generate_blocking (*block1);
+ ASSERT_EQ (nano::process_result::progress, node1.process (*block1).code);
+ auto node_l (system.nodes[0]);
+ node1.active.start (block1);
+ auto vote (std::make_shared (nano::test_genesis_key.pub, nano::test_genesis_key.prv, 0, block1));
+ nano::confirm_ack con1 (vote);
+ node1.process_message (con1, node1.network.endpoint ());
+}
+
+TEST (receivable_processor, send_with_receive)
+{
+ auto amount (std::numeric_limits::max ());
+ nano::system system (24000, 2);
+ nano::keypair key2;
+ system.wallet (0)->insert_adhoc (nano::test_genesis_key.prv);
+ nano::block_hash latest1 (system.nodes[0]->latest (nano::test_genesis_key.pub));
+ system.wallet (1)->insert_adhoc (key2.prv);
+ auto block1 (std::make_shared (latest1, key2.pub, amount - system.nodes[0]->config.receive_minimum.number (), nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (latest1)));
+ ASSERT_EQ (amount, system.nodes[0]->balance (nano::test_genesis_key.pub));
+ ASSERT_EQ (0, system.nodes[0]->balance (key2.pub));
+ ASSERT_EQ (amount, system.nodes[1]->balance (nano::test_genesis_key.pub));
+ ASSERT_EQ (0, system.nodes[1]->balance (key2.pub));
+ system.nodes[0]->process_active (block1);
+ system.nodes[0]->block_processor.flush ();
+ system.nodes[1]->process_active (block1);
+ system.nodes[1]->block_processor.flush ();
+ ASSERT_EQ (amount - system.nodes[0]->config.receive_minimum.number (), system.nodes[0]->balance (nano::test_genesis_key.pub));
+ ASSERT_EQ (0, system.nodes[0]->balance (key2.pub));
+ ASSERT_EQ (amount - system.nodes[0]->config.receive_minimum.number (), system.nodes[1]->balance (nano::test_genesis_key.pub));
+ ASSERT_EQ (0, system.nodes[1]->balance (key2.pub));
+ system.deadline_set (10s);
+ while (system.nodes[0]->balance (key2.pub) != system.nodes[0]->config.receive_minimum.number ())
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+ ASSERT_EQ (amount - system.nodes[0]->config.receive_minimum.number (), system.nodes[0]->balance (nano::test_genesis_key.pub));
+ ASSERT_EQ (system.nodes[0]->config.receive_minimum.number (), system.nodes[0]->balance (key2.pub));
+ ASSERT_EQ (amount - system.nodes[0]->config.receive_minimum.number (), system.nodes[1]->balance (nano::test_genesis_key.pub));
+ ASSERT_EQ (system.nodes[0]->config.receive_minimum.number (), system.nodes[1]->balance (key2.pub));
+}
+
+TEST (network, receive_weight_change)
+{
+ nano::system system (24000, 2);
+ system.wallet (0)->insert_adhoc (nano::test_genesis_key.prv);
+ nano::keypair key2;
+ system.wallet (1)->insert_adhoc (key2.prv);
+ {
+ auto transaction (system.nodes[1]->store.tx_begin (true));
+ system.wallet (1)->store.representative_set (transaction, key2.pub);
+ }
+ ASSERT_NE (nullptr, system.wallet (0)->send_action (nano::test_genesis_key.pub, key2.pub, system.nodes[0]->config.receive_minimum.number ()));
+ system.deadline_set (10s);
+ while (std::any_of (system.nodes.begin (), system.nodes.end (), [&](std::shared_ptr const & node_a) { return node_a->weight (key2.pub) != system.nodes[0]->config.receive_minimum.number (); }))
+ {
+ ASSERT_NO_ERROR (system.poll ());
+ }
+}
+
+TEST (parse_endpoint, valid)
+{
+ std::string string ("::1:24000");
+ nano::endpoint endpoint;
+ ASSERT_FALSE (nano::parse_endpoint (string, endpoint));
+ ASSERT_EQ (boost::asio::ip::address_v6::loopback (), endpoint.address ());
+ ASSERT_EQ (24000, endpoint.port ());
+}
+
+TEST (parse_endpoint, invalid_port)
+{
+ std::string string ("::1:24a00");
+ nano::endpoint endpoint;
+ ASSERT_TRUE (nano::parse_endpoint (string, endpoint));
+}
+
+TEST (parse_endpoint, invalid_address)
+{
+ std::string string ("::q:24000");
+ nano::endpoint endpoint;
+ ASSERT_TRUE (nano::parse_endpoint (string, endpoint));
+}
+
+TEST (parse_endpoint, no_address)
+{
+ std::string string (":24000");
+ nano::endpoint endpoint;
+ ASSERT_TRUE (nano::parse_endpoint (string, endpoint));
+}
+
+TEST (parse_endpoint, no_port)
+{
+ std::string string ("::1:");
+ nano::endpoint endpoint;
+ ASSERT_TRUE (nano::parse_endpoint (string, endpoint));
+}
+
+TEST (parse_endpoint, no_colon)
+{
+ std::string string ("::1");
+ nano::endpoint endpoint;
+ ASSERT_TRUE (nano::parse_endpoint (string, endpoint));
+}
+
+// If the account doesn't exist, current == end so there's no iteration
+TEST (bulk_pull, no_address)
+{
+ nano::system system (24000, 1);
+ auto connection (std::make_shared