mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 19:42:46 +01:00
Merge pull request #4245 from PastaPastaPasta/backport-triv-pr9
backport: 'trivial' pr9
This commit is contained in:
commit
3004c3498b
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,9 +1,14 @@
|
||||
<!--
|
||||
*** Please remove the following help text before submitting: ***
|
||||
|
||||
Pull requests without a rationale and clear improvement may be closed
|
||||
immediately.
|
||||
-->
|
||||
|
||||
<!--
|
||||
Please provide clear motivation for your patch and explain how it improves
|
||||
Dash Core user experience or Dash Core developer experience
|
||||
significantly.
|
||||
significantly:
|
||||
|
||||
* Any test improvements or new tests that improve coverage are always welcome.
|
||||
* All other changes should have accompanying unit tests (see `src/test/`) or
|
||||
@ -16,3 +21,4 @@ significantly.
|
||||
* Features are welcome, but might be rejected due to design or scope issues.
|
||||
If a feature is based on a lot of dependencies, contributors should first
|
||||
consider building the system outside of Dash Core, if possible.
|
||||
-->
|
||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -40,6 +40,7 @@ libtool
|
||||
src/config/dash-config.h
|
||||
src/config/dash-config.h.in
|
||||
src/config/stamp-h1
|
||||
src/obj
|
||||
share/setup.nsi
|
||||
share/qt/Info.plist
|
||||
|
||||
@ -90,6 +91,9 @@ Dash-Qt.app
|
||||
background.tiff*
|
||||
!/depends/Makefile
|
||||
|
||||
# Qt Creator
|
||||
Makefile.am.user
|
||||
|
||||
# Unit-tests
|
||||
Makefile.test
|
||||
dash-qt_test
|
||||
|
@ -27,7 +27,7 @@ facilitates social contribution, easy testing and peer review.
|
||||
|
||||
To contribute a patch, the workflow is as follows:
|
||||
|
||||
1. Fork repository
|
||||
1. Fork repository ([only the first time](https://help.github.com/en/articles/fork-a-repo)).
|
||||
1. Create topic branch
|
||||
1. Commit patches
|
||||
|
||||
|
@ -3,6 +3,10 @@
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
# Pattern rule to print variables, e.g. make print-top_srcdir
|
||||
print-%:
|
||||
@echo $* = $($*)
|
||||
|
||||
ACLOCAL_AMFLAGS = -I build-aux/m4
|
||||
SUBDIRS = src
|
||||
if ENABLE_MAN
|
||||
|
@ -33,7 +33,7 @@
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 45
|
||||
#serial 47
|
||||
|
||||
# example boost program (need to pass version)
|
||||
m4_define([_AX_BOOST_BASE_PROGRAM],
|
||||
@ -113,6 +113,7 @@ AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[
|
||||
dnl are found, e.g. when only header-only libraries are installed!
|
||||
AS_CASE([${host_cpu}],
|
||||
[x86_64],[libsubdirs="lib64 libx32 lib lib64"],
|
||||
[mips*64*],[libsubdirs="lib64 lib32 lib lib64"],
|
||||
[ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64],[libsubdirs="lib64 lib lib64"],
|
||||
[libsubdirs="lib"]
|
||||
)
|
||||
|
@ -29,7 +29,7 @@
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 4
|
||||
#serial 5
|
||||
|
||||
AC_DEFUN([AX_BOOST_CHRONO],
|
||||
[
|
||||
@ -105,7 +105,7 @@ AC_DEFUN([AX_BOOST_CHRONO],
|
||||
|
||||
fi
|
||||
if test "x$ax_lib" = "x"; then
|
||||
AC_MSG_ERROR(Could not find a version of the library!)
|
||||
AC_MSG_ERROR(Could not find a version of the Boost::Chrono library!)
|
||||
fi
|
||||
if test "x$link_chrono" = "xno"; then
|
||||
AC_MSG_ERROR(Could not link against $ax_lib !)
|
||||
|
@ -1,5 +1,5 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html
|
||||
# https://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
@ -31,7 +31,7 @@
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 26
|
||||
#serial 28
|
||||
|
||||
AC_DEFUN([AX_BOOST_FILESYSTEM],
|
||||
[
|
||||
@ -80,7 +80,6 @@ AC_DEFUN([AX_BOOST_FILESYSTEM],
|
||||
if test "x$ax_cv_boost_filesystem" = "xyes"; then
|
||||
AC_DEFINE(HAVE_BOOST_FILESYSTEM,,[define if the Boost::Filesystem library is available])
|
||||
BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
|
||||
ax_lib=
|
||||
if test "x$ax_boost_user_filesystem_lib" = "x"; then
|
||||
for libextension in `ls -r $BOOSTLIBDIR/libboost_filesystem* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do
|
||||
ax_lib=${libextension}
|
||||
@ -105,7 +104,7 @@ AC_DEFUN([AX_BOOST_FILESYSTEM],
|
||||
|
||||
fi
|
||||
if test "x$ax_lib" = "x"; then
|
||||
AC_MSG_ERROR(Could not find a version of the boost_filesystem library!)
|
||||
AC_MSG_ERROR(Could not find a version of the Boost::Filesystem library!)
|
||||
fi
|
||||
if test "x$link_filesystem" != "xyes"; then
|
||||
AC_MSG_ERROR(Could not link against $ax_lib !)
|
||||
|
@ -31,7 +31,7 @@
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 19
|
||||
#serial 20
|
||||
|
||||
AC_DEFUN([AX_BOOST_SYSTEM],
|
||||
[
|
||||
@ -108,7 +108,7 @@ AC_DEFUN([AX_BOOST_SYSTEM],
|
||||
|
||||
fi
|
||||
if test "x$ax_lib" = "x"; then
|
||||
AC_MSG_ERROR(Could not find a version of the library!)
|
||||
AC_MSG_ERROR(Could not find a version of the Boost::System library!)
|
||||
fi
|
||||
if test "x$link_system" = "xno"; then
|
||||
AC_MSG_ERROR(Could not link against $ax_lib !)
|
||||
|
@ -1,5 +1,5 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_boost_thread.html
|
||||
# https://www.gnu.org/software/autoconf-archive/ax_boost_thread.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
@ -30,73 +30,75 @@
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 27
|
||||
#serial 32
|
||||
|
||||
AC_DEFUN([AX_BOOST_THREAD],
|
||||
[
|
||||
AC_ARG_WITH([boost-thread],
|
||||
AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@],
|
||||
[use the Thread library from boost - it is possible to specify a certain library for the linker
|
||||
e.g. --with-boost-thread=boost_thread-gcc-mt ]),
|
||||
AC_ARG_WITH([boost-thread],
|
||||
AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@],
|
||||
[use the Thread library from boost -
|
||||
it is possible to specify a certain library for the linker
|
||||
e.g. --with-boost-thread=boost_thread-gcc-mt ]),
|
||||
[
|
||||
if test "$withval" = "no"; then
|
||||
want_boost="no"
|
||||
elif test "$withval" = "yes"; then
|
||||
if test "$withval" = "yes"; then
|
||||
want_boost="yes"
|
||||
ax_boost_user_thread_lib=""
|
||||
else
|
||||
want_boost="yes"
|
||||
ax_boost_user_thread_lib="$withval"
|
||||
fi
|
||||
want_boost="yes"
|
||||
ax_boost_user_thread_lib="$withval"
|
||||
fi
|
||||
],
|
||||
[want_boost="yes"]
|
||||
)
|
||||
)
|
||||
|
||||
if test "x$want_boost" = "xyes"; then
|
||||
if test "x$want_boost" = "xyes"; then
|
||||
AC_REQUIRE([AC_PROG_CC])
|
||||
AC_REQUIRE([AC_CANONICAL_BUILD])
|
||||
CPPFLAGS_SAVED="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||
export CPPFLAGS
|
||||
CPPFLAGS_SAVED="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||
export CPPFLAGS
|
||||
|
||||
LDFLAGS_SAVED="$LDFLAGS"
|
||||
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||
export LDFLAGS
|
||||
LDFLAGS_SAVED="$LDFLAGS"
|
||||
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||
export LDFLAGS
|
||||
|
||||
AC_CACHE_CHECK(whether the Boost::Thread library is available,
|
||||
ax_cv_boost_thread,
|
||||
ax_cv_boost_thread,
|
||||
[AC_LANG_PUSH([C++])
|
||||
CXXFLAGS_SAVE=$CXXFLAGS
|
||||
CXXFLAGS_SAVE=$CXXFLAGS
|
||||
|
||||
if test "x$host_os" = "xsolaris" ; then
|
||||
CXXFLAGS="-pthreads $CXXFLAGS"
|
||||
elif test "x$host_os" = "xmingw32" ; then
|
||||
CXXFLAGS="-mthreads $CXXFLAGS"
|
||||
else
|
||||
CXXFLAGS="-pthread $CXXFLAGS"
|
||||
fi
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/thread/thread.hpp>]],
|
||||
[[boost::thread_group thrds;
|
||||
return 0;]])],
|
||||
ax_cv_boost_thread=yes, ax_cv_boost_thread=no)
|
||||
CXXFLAGS=$CXXFLAGS_SAVE
|
||||
if test "x$host_os" = "xsolaris" ; then
|
||||
CXXFLAGS="-pthreads $CXXFLAGS"
|
||||
elif test "x$host_os" = "xmingw32" ; then
|
||||
CXXFLAGS="-mthreads $CXXFLAGS"
|
||||
else
|
||||
CXXFLAGS="-pthread $CXXFLAGS"
|
||||
fi
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM(
|
||||
[[@%:@include <boost/thread/thread.hpp>]],
|
||||
[[boost::thread_group thrds;
|
||||
return 0;]])],
|
||||
ax_cv_boost_thread=yes, ax_cv_boost_thread=no)
|
||||
CXXFLAGS=$CXXFLAGS_SAVE
|
||||
AC_LANG_POP([C++])
|
||||
])
|
||||
if test "x$ax_cv_boost_thread" = "xyes"; then
|
||||
])
|
||||
if test "x$ax_cv_boost_thread" = "xyes"; then
|
||||
if test "x$host_os" = "xsolaris" ; then
|
||||
BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS"
|
||||
elif test "x$host_os" = "xmingw32" ; then
|
||||
BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS"
|
||||
else
|
||||
BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS"
|
||||
fi
|
||||
BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS"
|
||||
elif test "x$host_os" = "xmingw32" ; then
|
||||
BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS"
|
||||
else
|
||||
BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS"
|
||||
fi
|
||||
|
||||
AC_SUBST(BOOST_CPPFLAGS)
|
||||
AC_SUBST(BOOST_CPPFLAGS)
|
||||
|
||||
AC_DEFINE(HAVE_BOOST_THREAD,,[define if the Boost::Thread library is available])
|
||||
AC_DEFINE(HAVE_BOOST_THREAD,,
|
||||
[define if the Boost::Thread library is available])
|
||||
BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
|
||||
|
||||
LDFLAGS_SAVE=$LDFLAGS
|
||||
LDFLAGS_SAVE=$LDFLAGS
|
||||
case "x$host_os" in
|
||||
*bsd* )
|
||||
LDFLAGS="-pthread $LDFLAGS"
|
||||
@ -104,47 +106,58 @@ AC_DEFUN([AX_BOOST_THREAD],
|
||||
;;
|
||||
esac
|
||||
if test "x$ax_boost_user_thread_lib" = "x"; then
|
||||
ax_lib=
|
||||
for libextension in `ls -r $BOOSTLIBDIR/libboost_thread* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'`; do
|
||||
ax_lib=${libextension}
|
||||
AC_CHECK_LIB($ax_lib, exit,
|
||||
[BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break],
|
||||
AC_CHECK_LIB($ax_lib, exit,
|
||||
[link_thread="yes"; break],
|
||||
[link_thread="no"])
|
||||
done
|
||||
done
|
||||
if test "x$link_thread" != "xyes"; then
|
||||
for libextension in `ls -r $BOOSTLIBDIR/boost_thread* 2>/dev/null | sed 's,.*/,,' | sed 's,\..*,,'`; do
|
||||
ax_lib=${libextension}
|
||||
AC_CHECK_LIB($ax_lib, exit,
|
||||
[BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break],
|
||||
AC_CHECK_LIB($ax_lib, exit,
|
||||
[link_thread="yes"; break],
|
||||
[link_thread="no"])
|
||||
done
|
||||
done
|
||||
fi
|
||||
|
||||
else
|
||||
for ax_lib in $ax_boost_user_thread_lib boost_thread-$ax_boost_user_thread_lib; do
|
||||
AC_CHECK_LIB($ax_lib, exit,
|
||||
[BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break],
|
||||
AC_CHECK_LIB($ax_lib, exit,
|
||||
[link_thread="yes"; break],
|
||||
[link_thread="no"])
|
||||
done
|
||||
|
||||
fi
|
||||
if test "x$ax_lib" = "x"; then
|
||||
AC_MSG_ERROR(Could not find a version of the boost_thread library!)
|
||||
AC_MSG_ERROR(Could not find a version of the Boost::Thread library!)
|
||||
fi
|
||||
if test "x$link_thread" = "xno"; then
|
||||
AC_MSG_ERROR(Could not link against $ax_lib !)
|
||||
else
|
||||
case "x$host_os" in
|
||||
*bsd* )
|
||||
BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS"
|
||||
break;
|
||||
;;
|
||||
esac
|
||||
if test "x$link_thread" = "xno"; then
|
||||
AC_MSG_ERROR(Could not link against $ax_lib !)
|
||||
else
|
||||
BOOST_THREAD_LIB="-l$ax_lib"
|
||||
case "x$host_os" in
|
||||
*bsd* )
|
||||
BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS"
|
||||
break;
|
||||
;;
|
||||
xsolaris )
|
||||
BOOST_THREAD_LIB="$BOOST_THREAD_LIB -lpthread"
|
||||
break;
|
||||
;;
|
||||
xmingw32 )
|
||||
break;
|
||||
;;
|
||||
* )
|
||||
BOOST_THREAD_LIB="$BOOST_THREAD_LIB -lpthread"
|
||||
break;
|
||||
;;
|
||||
esac
|
||||
AC_SUBST(BOOST_THREAD_LIB)
|
||||
fi
|
||||
fi
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||
LDFLAGS="$LDFLAGS_SAVED"
|
||||
fi
|
||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||
LDFLAGS="$LDFLAGS_SAVED"
|
||||
fi
|
||||
])
|
||||
|
@ -29,7 +29,7 @@
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 21
|
||||
#serial 22
|
||||
|
||||
AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK],
|
||||
[
|
||||
@ -124,7 +124,7 @@ AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK],
|
||||
done
|
||||
fi
|
||||
if test "x$ax_lib" = "x"; then
|
||||
AC_MSG_ERROR(Could not find a version of the library!)
|
||||
AC_MSG_ERROR(Could not find a version of the Boost::Unit_Test_Framework library!)
|
||||
fi
|
||||
if test "x$link_unit_test_framework" != "xyes"; then
|
||||
AC_MSG_ERROR(Could not link against $ax_lib !)
|
||||
|
43
configure.ac
43
configure.ac
@ -86,6 +86,10 @@ fi
|
||||
AC_PROG_OBJCXX
|
||||
])
|
||||
|
||||
dnl Since libtool 1.5.2 (released 2004-01-25), on Linux libtool no longer
|
||||
dnl sets RPATH for any directories in the dynamic linker search path.
|
||||
dnl See more: https://wiki.debian.org/RpathIssue
|
||||
LT_PREREQ([1.5.2])
|
||||
dnl Libtool init checks.
|
||||
LT_INIT([pic-only])
|
||||
|
||||
@ -228,7 +232,7 @@ AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
|
||||
# Enable debug
|
||||
AC_ARG_ENABLE([debug],
|
||||
[AS_HELP_STRING([--enable-debug],
|
||||
[use debug compiler flags and macros (default is no)])],
|
||||
[use compiler flags and macros suited for debugging (default is no)])],
|
||||
[enable_debug=$enableval],
|
||||
[enable_debug=no])
|
||||
|
||||
@ -285,12 +289,9 @@ if test "x$enable_debug" = xyes; then
|
||||
if test "x$CXXFLAGS_overridden" = xno; then
|
||||
CXXFLAGS=""
|
||||
fi
|
||||
# Prefer -Og, fall back to -O0 if that is unavailable.
|
||||
AX_CHECK_COMPILE_FLAG(
|
||||
[-Og],
|
||||
[[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -Og"]],
|
||||
[AX_CHECK_COMPILE_FLAG([-O0],[[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -O0"]],,[[$CXXFLAG_WERROR]])],
|
||||
[[$CXXFLAG_WERROR]])
|
||||
|
||||
# Disable all optimizations
|
||||
AX_CHECK_COMPILE_FLAG([-O0], [[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -O0"]],,[[$CXXFLAG_WERROR]])
|
||||
|
||||
# Prefer -g3, fall back to -g if that is unavailable.
|
||||
AX_CHECK_COMPILE_FLAG(
|
||||
@ -795,12 +796,17 @@ if test x$use_hardening != xno; then
|
||||
AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"])
|
||||
AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"])
|
||||
|
||||
AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[
|
||||
AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[
|
||||
HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE"
|
||||
# When enable_debug is yes, all optimizations are disabled.
|
||||
# However, FORTIFY_SOURCE requires that there is some level of optimization, otherwise it does nothing and just creates a compiler warning.
|
||||
# Since FORTIFY_SOURCE is a no-op without optimizations, do not enable it when enable_debug is yes.
|
||||
if test x$enable_debug != xyes; then
|
||||
AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[
|
||||
AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[
|
||||
HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE"
|
||||
])
|
||||
HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"
|
||||
])
|
||||
HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"
|
||||
])
|
||||
fi
|
||||
|
||||
AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"])
|
||||
AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"])
|
||||
@ -1589,22 +1595,11 @@ if test x$need_bundled_univalue = xyes; then
|
||||
AC_CONFIG_SUBDIRS([src/univalue])
|
||||
fi
|
||||
|
||||
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no --enable-module-recovery --disable-jni"
|
||||
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --with-bignum=no --enable-module-recovery --disable-jni"
|
||||
AC_CONFIG_SUBDIRS([src/secp256k1])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
dnl Taken from https://wiki.debian.org/RpathIssue
|
||||
case $host in
|
||||
*-*-linux-gnu)
|
||||
AC_MSG_RESULT([Fixing libtool for -rpath problems.])
|
||||
sed < libtool > libtool-2 \
|
||||
's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/'
|
||||
mv libtool-2 libtool
|
||||
chmod 755 libtool
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl Replace the BUILDDIR path with the correct Windows path if compiling on Native Windows
|
||||
case ${OS} in
|
||||
*Windows*)
|
||||
|
@ -63,8 +63,8 @@
|
||||
# server=1 tells Dash-Qt and dashd to accept JSON-RPC commands
|
||||
#server=0
|
||||
|
||||
# Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6.
|
||||
# This option can be specified multiple times (default: bind to all interfaces)
|
||||
# Bind to given address to listen for JSON-RPC connections.
|
||||
# Refer to the manpage or dashd -help for further details.
|
||||
#rpcbind=<addr>
|
||||
|
||||
# If no rpcpassword is set, rpc cookie auth is sought. The default `-rpccookiefile` name
|
||||
|
@ -1,5 +1,9 @@
|
||||
.NOTPARALLEL :
|
||||
|
||||
# Pattern rule to print variables, e.g. make print-top_srcdir
|
||||
print-%:
|
||||
@echo $* = $($*)
|
||||
|
||||
SOURCES_PATH ?= $(BASEDIR)/sources
|
||||
WORK_PATH = $(BASEDIR)/work
|
||||
BASE_CACHE ?= $(BASEDIR)/built
|
||||
|
@ -6,7 +6,7 @@ $(package)_sha256_hash=b449a3e10c47e1d1c7a6ec6e2016cca73d3bd68fbbd4f0ae5cc6b573f
|
||||
$(package)_dependencies=freetype expat
|
||||
|
||||
define $(package)_set_vars
|
||||
$(package)_config_opts=--disable-docs --disable-static
|
||||
$(package)_config_opts=--disable-docs --disable-static --disable-libxml2 --disable-iconv
|
||||
endef
|
||||
|
||||
define $(package)_config_cmds
|
||||
|
@ -5,8 +5,10 @@ $(package)_file_name=$(package)-$($(package)_version).tar.bz2
|
||||
$(package)_sha256_hash=fdd477320aeb5cdd67272838722d6b7d544887dfe7de46e1e7cc0c27c2bea4f2
|
||||
$(package)_dependencies=xproto
|
||||
|
||||
# When updating this package, check the default value of
|
||||
# --disable-xthreads. It is currently enabled.
|
||||
define $(package)_set_vars
|
||||
$(package)_config_opts=--disable-shared
|
||||
$(package)_config_opts=--disable-shared --disable-lint-library --without-lint
|
||||
$(package)_config_opts_linux=--with-pic
|
||||
endef
|
||||
|
||||
|
@ -6,7 +6,19 @@ $(package)_sha256_hash=98d9ab05b636dd088603b64229dd1ab2d2cc02ab807892e107d674f9c
|
||||
$(package)_dependencies=xcb_proto libXau
|
||||
|
||||
define $(package)_set_vars
|
||||
$(package)_config_opts=--disable-static
|
||||
$(package)_config_opts=--disable-static --disable-build-docs --without-doxygen --without-launchd
|
||||
# Because we pass -qt-xcb to Qt, it will compile in a set of xcb helper libraries and extensions,
|
||||
# so we skip building all of the extensions here.
|
||||
# More info is available from: https://doc.qt.io/qt-5.9/linux-requirements.html
|
||||
$(package)_config_opts += --disable-composite --disable-damage --disable-dpms
|
||||
$(package)_config_opts += --disable-dri2 --disable-dri3 --disable-glx
|
||||
$(package)_config_opts += --disable-present --disable-randr --disable-record
|
||||
$(package)_config_opts += --disable-render --disable-resource --disable-screensaver
|
||||
$(package)_config_opts += --disable-shape --disable-shm --disable-sync
|
||||
$(package)_config_opts += --disable-xevie --disable-xfixes --disable-xfree86-dri
|
||||
$(package)_config_opts += --disable-xinerama --disable-xinput --disable-xkb
|
||||
$(package)_config_opts += --disable-xprint --disable-selinux --disable-xtest
|
||||
$(package)_config_opts += --disable-xv --disable-xvmc
|
||||
endef
|
||||
|
||||
define $(package)_preprocess_cmds
|
||||
|
@ -5,7 +5,8 @@ $(package)_file_name=$(package)-$($(package)_version).tar.bz2
|
||||
$(package)_sha256_hash=efe5188b1ddbcbf98763b819b146be6a90481aac30cfc8d858ab78a19cde1fa5
|
||||
|
||||
define $(package)_set_vars
|
||||
$(package)_config_opts=--disable-shared -without-tools --disable-sdltest
|
||||
$(package)_config_opts=--disable-shared --without-tools --without-tests --disable-sdltest
|
||||
$(package)_config_opts += --disable-gprof --disable-gcov --disable-mudflap
|
||||
$(package)_config_opts_linux=--with-pic
|
||||
endef
|
||||
|
||||
|
@ -126,9 +126,7 @@ define $(package)_preprocess_cmds
|
||||
sed -i.old "s|updateqm.commands = \$$$$\$$$$LRELEASE|updateqm.commands = $($(package)_extract_dir)/qttools/bin/lrelease|" qttranslations/translations/translations.pro && \
|
||||
sed -i.old "/updateqm.depends =/d" qttranslations/translations/translations.pro && \
|
||||
sed -i.old "s/src_plugins.depends = src_sql src_network/src_plugins.depends = src_network/" qtbase/src/src.pro && \
|
||||
sed -i.old "s|X11/extensions/XIproto.h|X11/X.h|" qtbase/src/plugins/platforms/xcb/qxcbxsettings.cpp && \
|
||||
sed -i.old -e 's/if \[ "$$$$XPLATFORM_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/if \[ "$$$$BUILD_ON_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/' -e 's|/bin/pwd|pwd|' qtbase/configure && \
|
||||
sed -i.old 's/CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, 0)/CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, kCGMouseButtonLeft)/' qtbase/src/plugins/platforms/cocoa/qcocoacursor.mm && \
|
||||
mkdir -p qtbase/mkspecs/macx-clang-linux &&\
|
||||
cp -f qtbase/mkspecs/macx-clang/Info.plist.lib qtbase/mkspecs/macx-clang-linux/ &&\
|
||||
cp -f qtbase/mkspecs/macx-clang/Info.plist.app qtbase/mkspecs/macx-clang-linux/ &&\
|
||||
|
@ -5,7 +5,7 @@ $(package)_file_name=$(package)-$($(package)_version).tar.bz2
|
||||
$(package)_sha256_hash=636162c1759805a5a0114a369dffdeccb8af8c859ef6e1445f26a4e6e046514f
|
||||
|
||||
define $(package)_set_vars
|
||||
$(package)_config_opts=--disable-shared
|
||||
$(package)_config_opts=--without-fop --without-xmlto --without-xsltproc --disable-specs
|
||||
endef
|
||||
|
||||
define $(package)_config_cmds
|
||||
|
@ -6,7 +6,9 @@ $(package)_sha256_hash=8f1e2b2aade4dbfde98d82366d61baef2f62e812530160d2e6d0a5bb2
|
||||
$(package)_patches=0001-fix-build-with-older-mingw64.patch 0002-disable-pthread_set_name_np.patch
|
||||
|
||||
define $(package)_set_vars
|
||||
$(package)_config_opts=--without-docs --disable-shared --without-libsodium --disable-curve --disable-curve-keygen --disable-perf --disable-Werror
|
||||
$(package)_config_opts=--without-docs --disable-shared --disable-curve --disable-curve-keygen --disable-perf --disable-Werror --disable-drafts
|
||||
$(package)_config_opts += --without-libsodium --without-libgssapi_krb5 --without-pgm --without-norm --without-vmci
|
||||
$(package)_config_opts += --disable-libunwind --disable-radix-tree --without-gcov
|
||||
$(package)_config_opts_linux=--with-pic
|
||||
$(package)_cxxflags=-std=c++11
|
||||
endef
|
||||
|
@ -5,23 +5,26 @@ $(package)_file_name=$(package)-$($(package)_version).tar.gz
|
||||
$(package)_sha256_hash=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
|
||||
|
||||
define $(package)_set_vars
|
||||
$(package)_build_opts= CC="$($(package)_cc)"
|
||||
$(package)_build_opts+=CFLAGS="$($(package)_cflags) $($(package)_cppflags) -fPIC"
|
||||
$(package)_build_opts+=RANLIB="$($(package)_ranlib)"
|
||||
$(package)_build_opts+=AR="$($(package)_ar)"
|
||||
$(package)_build_opts_darwin+=AR="$($(package)_libtool)"
|
||||
$(package)_build_opts_darwin+=ARFLAGS="-o"
|
||||
$(package)_config_opts= CC="$($(package)_cc)"
|
||||
$(package)_config_opts+=CFLAGS="$($(package)_cflags) $($(package)_cppflags) -fPIC"
|
||||
$(package)_config_opts+=RANLIB="$($(package)_ranlib)"
|
||||
$(package)_config_opts+=AR="$($(package)_ar)"
|
||||
$(package)_config_opts_darwin+=AR="$($(package)_libtool)"
|
||||
$(package)_config_opts_darwin+=ARFLAGS="-o"
|
||||
endef
|
||||
|
||||
# zlib has its own custom configure script that takes in options like CC,
|
||||
# CFLAGS, RANLIB, AR, and ARFLAGS from the environment rather than from
|
||||
# command-line arguments.
|
||||
define $(package)_config_cmds
|
||||
./configure --static --prefix=$(host_prefix)
|
||||
env $($(package)_config_opts) ./configure --static --prefix=$(host_prefix)
|
||||
endef
|
||||
|
||||
define $(package)_build_cmds
|
||||
$(MAKE) $($(package)_build_opts) libz.a
|
||||
$(MAKE) libz.a
|
||||
endef
|
||||
|
||||
define $(package)_stage_cmds
|
||||
$(MAKE) DESTDIR=$($(package)_staging_dir) install $($(package)_build_opts)
|
||||
$(MAKE) DESTDIR=$($(package)_staging_dir) install
|
||||
endef
|
||||
|
||||
|
@ -30,8 +30,33 @@ Network specific options can be:
|
||||
- placed into sections with headers `[main]` (not `[mainnet]`), `[test]` (not `[testnet]`) or `[regtest]`;
|
||||
- prefixed with a chain name; e.g., `regtest.maxmempool=100`.
|
||||
|
||||
Network specific options take precedence over non-network specific options.
|
||||
If multiple values for the same option are found with the same precedence, the
|
||||
first one is generally chosen.
|
||||
|
||||
This means that given the following configuration, `regtest.rpcport` is set to `3000`:
|
||||
|
||||
```
|
||||
regtest=1
|
||||
rpcport=2000
|
||||
regtest.rpcport=3000
|
||||
|
||||
[regtest]
|
||||
rpcport=4000
|
||||
```
|
||||
|
||||
## Configuration File Path
|
||||
|
||||
The configuration file is not automatically created; you can create it using your favorite text editor. By default, the configuration file name is `dash.conf` and it is located in the Dash data directory, but both the dash data directory and the configuration file path may be changed using the `-datadir` and `-conf` command-line options.
|
||||
|
||||
The `includeconf=<file>` option in the `dash.conf` file can be used to include additional configuration files.
|
||||
|
||||
### Default configuration file locations
|
||||
|
||||
Operating System | Data Directory | Example Path
|
||||
-- | -- | --
|
||||
Windows | `%APPDATA%\DashCore\` | `C:\Users\username\AppData\Roaming\DashCore\dash.conf`
|
||||
Linux | `$HOME/.dashcore/` | `/home/username/.dashcore/dash.conf`
|
||||
macOS | `$HOME/Library/Application Support/DashCore/` | `/Users/username/Library/Application Support/DashCore/dash.conf`
|
||||
|
||||
You can find an example dash.conf file in [share/examples/dash.conf](../share/examples/dash.conf).
|
||||
|
@ -26,7 +26,7 @@ Developer Notes
|
||||
- [General C++](#general-c)
|
||||
- [C++ data structures](#c-data-structures)
|
||||
- [Strings and formatting](#strings-and-formatting)
|
||||
- [Variable names](#variable-names)
|
||||
- [Shadowing](#shadowing)
|
||||
- [Threads and synchronization](#threads-and-synchronization)
|
||||
- [Source code organization](#source-code-organization)
|
||||
- [GUI](#gui)
|
||||
@ -189,7 +189,7 @@ Documentation can be generated with `make docs` and cleaned up with `make clean-
|
||||
|
||||
Before running `make docs`, you will need to install dependencies `doxygen` and `dot`. For example, on MacOS via Homebrew:
|
||||
```
|
||||
brew install doxygen --with-graphviz
|
||||
brew install graphviz doxygen
|
||||
```
|
||||
|
||||
Development tips and tricks
|
||||
@ -576,27 +576,13 @@ Strings and formatting
|
||||
|
||||
- *Rationale*: Dash Core uses tinyformat, which is type safe. Leave them out to avoid confusion
|
||||
|
||||
Variable names
|
||||
Shadowing
|
||||
--------------
|
||||
|
||||
Although the shadowing warning (`-Wshadow`) is not enabled by default (it prevents issues rising
|
||||
from using a different variable with the same name),
|
||||
please name variables so that their names do not shadow variables defined in the source code.
|
||||
|
||||
E.g. in member initializers, prepend `_` to the argument name shadowing the
|
||||
member name:
|
||||
|
||||
```c++
|
||||
class AddressBookPage
|
||||
{
|
||||
Mode m_mode;
|
||||
}
|
||||
|
||||
AddressBookPage::AddressBookPage(Mode _mode)
|
||||
: m_mode(_mode)
|
||||
...
|
||||
```
|
||||
|
||||
When using nested cycles, do not name the inner cycle variable the same as in
|
||||
upper cycle etc.
|
||||
|
||||
|
5
doc/release-notes-16695.md
Normal file
5
doc/release-notes-16695.md
Normal file
@ -0,0 +1,5 @@
|
||||
Updated RPCs
|
||||
------------
|
||||
|
||||
- The `getchaintxstats` RPC now returns the additional key of
|
||||
`window_final_block_height`.
|
@ -100,7 +100,7 @@ Section -post SEC0001
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "@PACKAGE_VERSION@"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}"
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\dash-qt.exe
|
||||
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe
|
||||
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1
|
||||
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1
|
||||
|
@ -5,6 +5,8 @@
|
||||
#include <bech32.h>
|
||||
#include <util/vector.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
@ -52,7 +54,7 @@ uint32_t PolyMod(const data& v)
|
||||
|
||||
// During the course of the loop below, `c` contains the bitpacked coefficients of the
|
||||
// polynomial constructed from just the values of v that were processed so far, mod g(x). In
|
||||
// the above example, `c` initially corresponds to 1 mod (x), and after processing 2 inputs of
|
||||
// the above example, `c` initially corresponds to 1 mod g(x), and after processing 2 inputs of
|
||||
// v, it corresponds to x^2 + v0*x + v1 mod g(x). As 1 mod g(x) = 1, that is the starting value
|
||||
// for `c`.
|
||||
uint32_t c = 1;
|
||||
@ -139,6 +141,10 @@ namespace bech32
|
||||
|
||||
/** Encode a Bech32 string. */
|
||||
std::string Encode(const std::string& hrp, const data& values) {
|
||||
// First ensure that the HRP is all lowercase. BIP-173 requires an encoder
|
||||
// to return a lowercase Bech32 string, but if given an uppercase HRP, the
|
||||
// result will always be invalid.
|
||||
for (const char& c : hrp) assert(c < 'A' || c > 'Z');
|
||||
data checksum = CreateChecksum(hrp, values);
|
||||
data combined = Cat(values, checksum);
|
||||
std::string ret = hrp + '1';
|
||||
|
@ -19,7 +19,7 @@
|
||||
namespace bech32
|
||||
{
|
||||
|
||||
/** Encode a Bech32 string. Returns the empty string in case of failure. */
|
||||
/** Encode a Bech32 string. If hrp contains uppercase characters, this will cause an assertion error. */
|
||||
std::string Encode(const std::string& hrp, const std::vector<uint8_t>& values);
|
||||
|
||||
/** Decode a Bech32 string. Returns (hrp, data). Empty hrp means failure. */
|
||||
|
78
src/chain.h
78
src/chain.h
@ -121,8 +121,8 @@ enum BlockStatus: uint32_t {
|
||||
//! Unused.
|
||||
BLOCK_VALID_UNKNOWN = 0,
|
||||
|
||||
//! Parsed, version ok, hash satisfies claimed PoW, 1 <= vtx count <= max, timestamp not in future
|
||||
BLOCK_VALID_HEADER = 1,
|
||||
//! Reserved (was BLOCK_VALID_HEADER).
|
||||
BLOCK_VALID_RESERVED = 1,
|
||||
|
||||
//! All parent headers found, difficulty matches, timestamp >= median previous, checkpoint. Implies all parents
|
||||
//! are also at least TREE.
|
||||
@ -143,7 +143,7 @@ enum BlockStatus: uint32_t {
|
||||
BLOCK_VALID_SCRIPTS = 5,
|
||||
|
||||
//! All validity bits.
|
||||
BLOCK_VALID_MASK = BLOCK_VALID_HEADER | BLOCK_VALID_TREE | BLOCK_VALID_TRANSACTIONS |
|
||||
BLOCK_VALID_MASK = BLOCK_VALID_RESERVED | BLOCK_VALID_TREE | BLOCK_VALID_TRANSACTIONS |
|
||||
BLOCK_VALID_CHAIN | BLOCK_VALID_SCRIPTS,
|
||||
|
||||
BLOCK_HAVE_DATA = 8, //!< full block available in blk*.dat
|
||||
@ -166,91 +166,65 @@ class CBlockIndex
|
||||
{
|
||||
public:
|
||||
//! pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
|
||||
const uint256* phashBlock;
|
||||
const uint256* phashBlock{nullptr};
|
||||
|
||||
//! pointer to the index of the predecessor of this block
|
||||
CBlockIndex* pprev;
|
||||
CBlockIndex* pprev{nullptr};
|
||||
|
||||
//! pointer to the index of some further predecessor of this block
|
||||
CBlockIndex* pskip;
|
||||
CBlockIndex* pskip{nullptr};
|
||||
|
||||
//! height of the entry in the chain. The genesis block has height 0
|
||||
int nHeight;
|
||||
int nHeight{0};
|
||||
|
||||
//! Which # file this block is stored in (blk?????.dat)
|
||||
int nFile;
|
||||
int nFile{0};
|
||||
|
||||
//! Byte offset within blk?????.dat where this block's data is stored
|
||||
unsigned int nDataPos;
|
||||
unsigned int nDataPos{0};
|
||||
|
||||
//! Byte offset within rev?????.dat where this block's undo data is stored
|
||||
unsigned int nUndoPos;
|
||||
unsigned int nUndoPos{0};
|
||||
|
||||
//! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block
|
||||
arith_uint256 nChainWork;
|
||||
arith_uint256 nChainWork{};
|
||||
|
||||
//! Number of transactions in this block.
|
||||
//! Note: in a potential headers-first mode, this number cannot be relied upon
|
||||
unsigned int nTx;
|
||||
unsigned int nTx{0};
|
||||
|
||||
//! (memory only) Number of transactions in the chain up to and including this block.
|
||||
//! This value will be non-zero only if and only if transactions for this block and all its parents are available.
|
||||
//! Change to 64-bit type when necessary; won't happen before 2030
|
||||
unsigned int nChainTx;
|
||||
unsigned int nChainTx{0};
|
||||
|
||||
//! Verification status of this block. See enum BlockStatus
|
||||
uint32_t nStatus;
|
||||
uint32_t nStatus{0};
|
||||
|
||||
//! block header
|
||||
int32_t nVersion;
|
||||
uint256 hashMerkleRoot;
|
||||
uint32_t nTime;
|
||||
uint32_t nBits;
|
||||
uint32_t nNonce;
|
||||
int32_t nVersion{0};
|
||||
uint256 hashMerkleRoot{};
|
||||
uint32_t nTime{0};
|
||||
uint32_t nBits{0};
|
||||
uint32_t nNonce{0};
|
||||
|
||||
//! (memory only) Sequential id assigned to distinguish order in which blocks are received.
|
||||
int32_t nSequenceId;
|
||||
int32_t nSequenceId{0};
|
||||
|
||||
//! (memory only) Maximum nTime in the chain up to and including this block.
|
||||
unsigned int nTimeMax;
|
||||
|
||||
void SetNull()
|
||||
{
|
||||
phashBlock = nullptr;
|
||||
pprev = nullptr;
|
||||
pskip = nullptr;
|
||||
nHeight = 0;
|
||||
nFile = 0;
|
||||
nDataPos = 0;
|
||||
nUndoPos = 0;
|
||||
nChainWork = arith_uint256();
|
||||
nTx = 0;
|
||||
nChainTx = 0;
|
||||
nStatus = 0;
|
||||
nSequenceId = 0;
|
||||
nTimeMax = 0;
|
||||
|
||||
nVersion = 0;
|
||||
hashMerkleRoot = uint256();
|
||||
nTime = 0;
|
||||
nBits = 0;
|
||||
nNonce = 0;
|
||||
}
|
||||
unsigned int nTimeMax{0};
|
||||
|
||||
CBlockIndex()
|
||||
{
|
||||
SetNull();
|
||||
}
|
||||
|
||||
explicit CBlockIndex(const CBlockHeader& block)
|
||||
: nVersion{block.nVersion},
|
||||
hashMerkleRoot{block.hashMerkleRoot},
|
||||
nTime{block.nTime},
|
||||
nBits{block.nBits},
|
||||
nNonce{block.nNonce}
|
||||
{
|
||||
SetNull();
|
||||
|
||||
nVersion = block.nVersion;
|
||||
hashMerkleRoot = block.hashMerkleRoot;
|
||||
nTime = block.nTime;
|
||||
nBits = block.nBits;
|
||||
nNonce = block.nNonce;
|
||||
}
|
||||
|
||||
CDiskBlockPos GetBlockPos() const {
|
||||
|
10
src/coins.h
10
src/coins.h
@ -94,8 +94,16 @@ public:
|
||||
* This *must* return size_t. With Boost 1.46 on 32-bit systems the
|
||||
* unordered_map will behave unpredictably if the custom hasher returns a
|
||||
* uint64_t, resulting in failures when syncing the chain (#4634).
|
||||
*
|
||||
* Having the hash noexcept allows libstdc++'s unordered_map to recalculate
|
||||
* the hash during rehash, so it does not have to cache the value. This
|
||||
* reduces node's memory by sizeof(size_t). The required recalculation has
|
||||
* a slight performance penalty (around 1.6%), but this is compensated by
|
||||
* memory savings of about 9% which allow for a larger dbcache setting.
|
||||
*
|
||||
* @see https://gcc.gnu.org/onlinedocs/gcc-9.2.0/libstdc++/manual/manual/unordered_associative.html
|
||||
*/
|
||||
size_t operator()(const COutPoint& id) const {
|
||||
size_t operator()(const COutPoint& id) const noexcept {
|
||||
return SipHashUint256Extra(k0, k1, id.hash, id.n);
|
||||
}
|
||||
};
|
||||
|
@ -14,42 +14,40 @@
|
||||
#include <vector>
|
||||
|
||||
|
||||
/** namespace CuckooCache provides high performance cache primitives
|
||||
/** High-performance cache primitives.
|
||||
*
|
||||
* Summary:
|
||||
*
|
||||
* 1) bit_packed_atomic_flags is bit-packed atomic flags for garbage collection
|
||||
* 1. @ref bit_packed_atomic_flags is bit-packed atomic flags for garbage collection
|
||||
*
|
||||
* 2) cache is a cache which is performant in memory usage and lookup speed. It
|
||||
* is lockfree for erase operations. Elements are lazily erased on the next
|
||||
* insert.
|
||||
* 2. @ref cache is a cache which is performant in memory usage and lookup speed. It
|
||||
* is lockfree for erase operations. Elements are lazily erased on the next insert.
|
||||
*/
|
||||
namespace CuckooCache
|
||||
{
|
||||
/** bit_packed_atomic_flags implements a container for garbage collection flags
|
||||
/** @ref bit_packed_atomic_flags implements a container for garbage collection flags
|
||||
* that is only thread unsafe on calls to setup. This class bit-packs collection
|
||||
* flags for memory efficiency.
|
||||
*
|
||||
* All operations are std::memory_order_relaxed so external mechanisms must
|
||||
* All operations are `std::memory_order_relaxed` so external mechanisms must
|
||||
* ensure that writes and reads are properly synchronized.
|
||||
*
|
||||
* On setup(n), all bits up to n are marked as collected.
|
||||
* On setup(n), all bits up to `n` are marked as collected.
|
||||
*
|
||||
* Under the hood, because it is an 8-bit type, it makes sense to use a multiple
|
||||
* of 8 for setup, but it will be safe if that is not the case as well.
|
||||
*
|
||||
*/
|
||||
class bit_packed_atomic_flags
|
||||
{
|
||||
std::unique_ptr<std::atomic<uint8_t>[]> mem;
|
||||
|
||||
public:
|
||||
/** No default constructor as there must be some size */
|
||||
/** No default constructor, as there must be some size. */
|
||||
bit_packed_atomic_flags() = delete;
|
||||
|
||||
/**
|
||||
* bit_packed_atomic_flags constructor creates memory to sufficiently
|
||||
* keep track of garbage collection information for size entries.
|
||||
* keep track of garbage collection information for `size` entries.
|
||||
*
|
||||
* @param size the number of elements to allocate space for
|
||||
*
|
||||
@ -68,7 +66,7 @@ public:
|
||||
};
|
||||
|
||||
/** setup marks all entries and ensures that bit_packed_atomic_flags can store
|
||||
* at least size entries
|
||||
* at least `b` entries.
|
||||
*
|
||||
* @param b the number of elements to allocate space for
|
||||
* @post bit_set, bit_unset, and bit_is_set function properly forall x. x <
|
||||
@ -84,19 +82,18 @@ public:
|
||||
|
||||
/** bit_set sets an entry as discardable.
|
||||
*
|
||||
* @param s the index of the entry to bit_set.
|
||||
* @param s the index of the entry to bit_set
|
||||
* @post immediately subsequent call (assuming proper external memory
|
||||
* ordering) to bit_is_set(s) == true.
|
||||
*
|
||||
*/
|
||||
inline void bit_set(uint32_t s)
|
||||
{
|
||||
mem[s >> 3].fetch_or(1 << (s & 7), std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
/** bit_unset marks an entry as something that should not be overwritten
|
||||
/** bit_unset marks an entry as something that should not be overwritten.
|
||||
*
|
||||
* @param s the index of the entry to bit_unset.
|
||||
* @param s the index of the entry to bit_unset
|
||||
* @post immediately subsequent call (assuming proper external memory
|
||||
* ordering) to bit_is_set(s) == false.
|
||||
*/
|
||||
@ -105,10 +102,10 @@ public:
|
||||
mem[s >> 3].fetch_and(~(1 << (s & 7)), std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
/** bit_is_set queries the table for discardability at s
|
||||
/** bit_is_set queries the table for discardability at `s`.
|
||||
*
|
||||
* @param s the index of the entry to read.
|
||||
* @returns if the bit at index s was set.
|
||||
* @param s the index of the entry to read
|
||||
* @returns true if the bit at index `s` was set, false otherwise
|
||||
* */
|
||||
inline bool bit_is_set(uint32_t s) const
|
||||
{
|
||||
@ -116,15 +113,15 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/** cache implements a cache with properties similar to a cuckoo-set
|
||||
/** @ref cache implements a cache with properties similar to a cuckoo-set.
|
||||
*
|
||||
* The cache is able to hold up to (~(uint32_t)0) - 1 elements.
|
||||
* The cache is able to hold up to `(~(uint32_t)0) - 1` elements.
|
||||
*
|
||||
* Read Operations:
|
||||
* - contains(*, false)
|
||||
* - contains() for `erase=false`
|
||||
*
|
||||
* Read+Erase Operations:
|
||||
* - contains(*, true)
|
||||
* - contains() for `erase=true`
|
||||
*
|
||||
* Erase Operations:
|
||||
* - allow_erase()
|
||||
@ -141,10 +138,10 @@ public:
|
||||
*
|
||||
* User Must Guarantee:
|
||||
*
|
||||
* 1) Write Requires synchronized access (e.g., a lock)
|
||||
* 2) Read Requires no concurrent Write, synchronized with the last insert.
|
||||
* 3) Erase requires no concurrent Write, synchronized with last insert.
|
||||
* 4) An Erase caller must release all memory before allowing a new Writer.
|
||||
* 1. Write requires synchronized access (e.g. a lock)
|
||||
* 2. Read requires no concurrent Write, synchronized with last insert.
|
||||
* 3. Erase requires no concurrent Write, synchronized with last insert.
|
||||
* 4. An Erase caller must release all memory before allowing a new Writer.
|
||||
*
|
||||
*
|
||||
* Note on function names:
|
||||
@ -177,7 +174,7 @@ private:
|
||||
mutable std::vector<bool> epoch_flags;
|
||||
|
||||
/** epoch_heuristic_counter is used to determine when an epoch might be aged
|
||||
* & an expensive scan should be done. epoch_heuristic_counter is
|
||||
* & an expensive scan should be done. epoch_heuristic_counter is
|
||||
* decremented on insert and reset to the new number of inserts which would
|
||||
* cause the epoch to reach epoch_size when it reaches zero.
|
||||
*/
|
||||
@ -194,24 +191,25 @@ private:
|
||||
uint32_t epoch_size;
|
||||
|
||||
/** depth_limit determines how many elements insert should try to replace.
|
||||
* Should be set to log2(n)*/
|
||||
* Should be set to log2(n).
|
||||
*/
|
||||
uint8_t depth_limit;
|
||||
|
||||
/** hash_function is a const instance of the hash function. It cannot be
|
||||
* static or initialized at call time as it may have internal state (such as
|
||||
* a nonce).
|
||||
* */
|
||||
*/
|
||||
const Hash hash_function;
|
||||
|
||||
/** compute_hashes is convenience for not having to write out this
|
||||
* expression everywhere we use the hash values of an Element.
|
||||
*
|
||||
* We need to map the 32-bit input hash onto a hash bucket in a range [0, size) in a
|
||||
* manner which preserves as much of the hash's uniformity as possible. Ideally
|
||||
* manner which preserves as much of the hash's uniformity as possible. Ideally
|
||||
* this would be done by bitmasking but the size is usually not a power of two.
|
||||
*
|
||||
* The naive approach would be to use a mod -- which isn't perfectly uniform but so
|
||||
* long as the hash is much larger than size it is not that bad. Unfortunately,
|
||||
* long as the hash is much larger than size it is not that bad. Unfortunately,
|
||||
* mod/division is fairly slow on ordinary microprocessors (e.g. 90-ish cycles on
|
||||
* haswell, ARM doesn't even have an instruction for it.); when the divisor is a
|
||||
* constant the compiler will do clever tricks to turn it into a multiply+add+shift,
|
||||
@ -223,10 +221,10 @@ private:
|
||||
* somewhat complicated and the result is still slower than other options:
|
||||
*
|
||||
* Instead we treat the 32-bit random number as a Q32 fixed-point number in the range
|
||||
* [0,1) and simply multiply it by the size. Then we just shift the result down by
|
||||
* 32-bits to get our bucket number. The result has non-uniformity the same as a
|
||||
* [0, 1) and simply multiply it by the size. Then we just shift the result down by
|
||||
* 32-bits to get our bucket number. The result has non-uniformity the same as a
|
||||
* mod, but it is much faster to compute. More about this technique can be found at
|
||||
* http://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/
|
||||
* http://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/ .
|
||||
*
|
||||
* The resulting non-uniformity is also more equally distributed which would be
|
||||
* advantageous for something like linear probing, though it shouldn't matter
|
||||
@ -237,8 +235,8 @@ private:
|
||||
* 32*32->64 multiply, which means the operation is reasonably fast even on a
|
||||
* typical 32-bit processor.
|
||||
*
|
||||
* @param e the element whose hashes will be returned
|
||||
* @returns std::array<uint32_t, 8> of deterministic hashes derived from e
|
||||
* @param e The element whose hashes will be returned
|
||||
* @returns Deterministic hashes derived from `e` uniformly mapped onto the range [0, size)
|
||||
*/
|
||||
inline std::array<uint32_t, 8> compute_hashes(const Element& e) const
|
||||
{
|
||||
@ -252,14 +250,14 @@ private:
|
||||
(uint32_t)(((uint64_t)hash_function.template operator()<7>(e) * (uint64_t)size) >> 32)}};
|
||||
}
|
||||
|
||||
/* end
|
||||
* @returns a constexpr index that can never be inserted to */
|
||||
/** invalid returns a special index that can never be inserted to
|
||||
* @returns the special constexpr index that can never be inserted to */
|
||||
constexpr uint32_t invalid() const
|
||||
{
|
||||
return ~(uint32_t)0;
|
||||
}
|
||||
|
||||
/** allow_erase marks the element at index n as discardable. Threadsafe
|
||||
/** allow_erase marks the element at index `n` as discardable. Threadsafe
|
||||
* without any concurrent insert.
|
||||
* @param n the index to allow erasure of
|
||||
*/
|
||||
@ -268,7 +266,7 @@ private:
|
||||
collection_flags.bit_set(n);
|
||||
}
|
||||
|
||||
/** please_keep marks the element at index n as an entry that should be kept.
|
||||
/** please_keep marks the element at index `n` as an entry that should be kept.
|
||||
* Threadsafe without any concurrent insert.
|
||||
* @param n the index to prioritize keeping
|
||||
*/
|
||||
@ -336,7 +334,7 @@ public:
|
||||
*
|
||||
* @param new_size the desired number of elements to store
|
||||
* @returns the maximum number of elements storable
|
||||
**/
|
||||
*/
|
||||
uint32_t setup(uint32_t new_size)
|
||||
{
|
||||
// depth_limit must be at least one otherwise errors can occur.
|
||||
@ -360,7 +358,7 @@ public:
|
||||
* negligible compared to the size of the elements.
|
||||
*
|
||||
* @param bytes the approximate number of bytes to use for this data
|
||||
* structure.
|
||||
* structure
|
||||
* @returns the maximum number of elements storable (see setup()
|
||||
* documentation for more detail)
|
||||
*/
|
||||
@ -376,10 +374,12 @@ public:
|
||||
* It drops the last tried element if it runs out of depth before
|
||||
* encountering an open slot.
|
||||
*
|
||||
* Thus
|
||||
* Thus:
|
||||
*
|
||||
* ```
|
||||
* insert(x);
|
||||
* return contains(x, false);
|
||||
* ```
|
||||
*
|
||||
* is not guaranteed to return true.
|
||||
*
|
||||
@ -387,7 +387,6 @@ public:
|
||||
* @post one of the following: All previously inserted elements and e are
|
||||
* now in the table, one previously inserted element is evicted from the
|
||||
* table, the entry attempted to be inserted is evicted.
|
||||
*
|
||||
*/
|
||||
inline void insert(Element e)
|
||||
{
|
||||
@ -416,9 +415,9 @@ public:
|
||||
/** Swap with the element at the location that was
|
||||
* not the last one looked at. Example:
|
||||
*
|
||||
* 1) On first iteration, last_loc == invalid(), find returns last, so
|
||||
* 1. On first iteration, last_loc == invalid(), find returns last, so
|
||||
* last_loc defaults to locs[0].
|
||||
* 2) On further iterations, where last_loc == locs[k], last_loc will
|
||||
* 2. On further iterations, where last_loc == locs[k], last_loc will
|
||||
* go to locs[k+1 % 8], i.e., next of the 8 indices wrapping around
|
||||
* to 0 if needed.
|
||||
*
|
||||
@ -439,17 +438,19 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
/* contains iterates through the hash locations for a given element
|
||||
/** contains iterates through the hash locations for a given element
|
||||
* and checks to see if it is present.
|
||||
*
|
||||
* contains does not check garbage collected state (in other words,
|
||||
* garbage is only collected when the space is needed), so:
|
||||
*
|
||||
* ```
|
||||
* insert(x);
|
||||
* if (contains(x, true))
|
||||
* return contains(x, false);
|
||||
* else
|
||||
* return true;
|
||||
* ```
|
||||
*
|
||||
* executed on a single thread will always return true!
|
||||
*
|
||||
@ -458,7 +459,7 @@ public:
|
||||
* contains returns a bool set true if the element was found.
|
||||
*
|
||||
* @param e the element to check
|
||||
* @param erase
|
||||
* @param erase whether to attempt setting the garbage collect flag
|
||||
*
|
||||
* @post if erase is true and the element is found, then the garbage collect
|
||||
* flag is set
|
||||
|
@ -278,6 +278,8 @@ public:
|
||||
result.pushKV("balance", batch[ID_WALLETINFO]["result"]["balance"]);
|
||||
}
|
||||
result.pushKV("blocks", batch[ID_BLOCKCHAININFO]["result"]["blocks"]);
|
||||
result.pushKV("headers", batch[ID_BLOCKCHAININFO]["result"]["headers"]);
|
||||
result.pushKV("verificationprogress", batch[ID_BLOCKCHAININFO]["result"]["verificationprogress"]);
|
||||
result.pushKV("timeoffset", batch[ID_NETWORKINFO]["result"]["timeoffset"]);
|
||||
result.pushKV("connections", batch[ID_NETWORKINFO]["result"]["connections"]);
|
||||
result.pushKV("proxy", batch[ID_NETWORKINFO]["result"]["networks"][0]["proxy"]);
|
||||
@ -336,7 +338,20 @@ static UniValue CallRPC(BaseRequestHandler *rh, const std::string& strMethod, co
|
||||
|
||||
// Synchronously look up hostname
|
||||
raii_evhttp_connection evcon = obtain_evhttp_connection_base(base.get(), host, port);
|
||||
evhttp_connection_set_timeout(evcon.get(), gArgs.GetArg("-rpcclienttimeout", DEFAULT_HTTP_CLIENT_TIMEOUT));
|
||||
|
||||
// Set connection timeout
|
||||
{
|
||||
const int timeout = gArgs.GetArg("-rpcclienttimeout", DEFAULT_HTTP_CLIENT_TIMEOUT);
|
||||
if (timeout > 0) {
|
||||
evhttp_connection_set_timeout(evcon.get(), timeout);
|
||||
} else {
|
||||
// Indefinite request timeouts are not possible in libevent-http, so we
|
||||
// set the timeout to a very long time period instead.
|
||||
|
||||
constexpr int YEAR_IN_SECONDS = 31556952; // Average length of year in Gregorian calendar
|
||||
evhttp_connection_set_timeout(evcon.get(), 5 * YEAR_IN_SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
HTTPReply response;
|
||||
raii_evhttp_request req = obtain_evhttp_request(http_request_done, (void*)&response);
|
||||
|
2
src/obj-test/.gitignore
vendored
2
src/obj-test/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
2
src/obj/.gitignore
vendored
2
src/obj/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
@ -11,6 +11,8 @@
|
||||
#include <interfaces/node.h>
|
||||
#include <key_io.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <QFont>
|
||||
#include <QDebug>
|
||||
|
||||
@ -87,18 +89,18 @@ public:
|
||||
QString::fromStdString(EncodeDestination(address.dest))));
|
||||
}
|
||||
}
|
||||
// qLowerBound() and qUpperBound() require our cachedAddressTable list to be sorted in asc order
|
||||
// std::lower_bound() and std::upper_bound() require our cachedAddressTable list to be sorted in asc order
|
||||
// Even though the map is already sorted this re-sorting step is needed because the originating map
|
||||
// is sorted by binary address, not by base58() address.
|
||||
qSort(cachedAddressTable.begin(), cachedAddressTable.end(), AddressTableEntryLessThan());
|
||||
std::sort(cachedAddressTable.begin(), cachedAddressTable.end(), AddressTableEntryLessThan());
|
||||
}
|
||||
|
||||
void updateEntry(const QString &address, const QString &label, bool isMine, const QString &purpose, int status)
|
||||
{
|
||||
// Find address / label in model
|
||||
QList<AddressTableEntry>::iterator lower = qLowerBound(
|
||||
QList<AddressTableEntry>::iterator lower = std::lower_bound(
|
||||
cachedAddressTable.begin(), cachedAddressTable.end(), address, AddressTableEntryLessThan());
|
||||
QList<AddressTableEntry>::iterator upper = qUpperBound(
|
||||
QList<AddressTableEntry>::iterator upper = std::upper_bound(
|
||||
cachedAddressTable.begin(), cachedAddressTable.end(), address, AddressTableEntryLessThan());
|
||||
int lowerIndex = (lower - cachedAddressTable.begin());
|
||||
int upperIndex = (upper - cachedAddressTable.begin());
|
||||
|
@ -12,6 +12,8 @@
|
||||
#include <sync.h>
|
||||
#include <util/time.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QList>
|
||||
|
||||
@ -63,7 +65,7 @@ public:
|
||||
|
||||
if (sortColumn >= 0)
|
||||
// sort cachedBanlist (use stable sort to prevent rows jumping around unnecessarily)
|
||||
qStableSort(cachedBanlist.begin(), cachedBanlist.end(), BannedNodeLessThan(sortColumn, sortOrder));
|
||||
std::stable_sort(cachedBanlist.begin(), cachedBanlist.end(), BannedNodeLessThan(sortColumn, sortOrder));
|
||||
}
|
||||
|
||||
int size() const
|
||||
|
@ -17,9 +17,6 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<widget class="QFrame" name="SendCoins">
|
||||
<property name="toolTip">
|
||||
<string>This is a normal payment.</string>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
@ -153,7 +150,11 @@
|
||||
<item row="2" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayoutAmount" stretch="0,1,0">
|
||||
<item>
|
||||
<widget class="BitcoinAmountField" name="payAmount"/>
|
||||
<widget class="BitcoinAmountField" name="payAmount">
|
||||
<property name="toolTip">
|
||||
<string>The amount to send in the selected unit</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkboxSubtractFeeFromAmount">
|
||||
|
@ -118,6 +118,9 @@
|
||||
<property name="toolTip">
|
||||
<string>Enter the message you want to sign here</string>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Enter the message you want to sign here</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@ -268,10 +271,24 @@
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="messageIn_VM"/>
|
||||
<widget class="QPlainTextEdit" name="messageIn_VM">
|
||||
<property name="toolTip">
|
||||
<string>The signed message to verify</string>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>The signed message to verify</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QValidatedLineEdit" name="signatureIn_VM"/>
|
||||
<widget class="QValidatedLineEdit" name="signatureIn_VM">
|
||||
<property name="toolTip">
|
||||
<string>The signature given when the message was signed</string>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>The signature given when the message was signed</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2_VM">
|
||||
|
@ -152,6 +152,7 @@ Intro::Intro(QWidget *parent) :
|
||||
storageRequiresMsg.arg(requiredSpace) + " " +
|
||||
tr("The wallet will also be stored in this directory.")
|
||||
);
|
||||
this->adjustSize();
|
||||
startThread();
|
||||
}
|
||||
|
||||
|
@ -92,7 +92,7 @@ static QString ipcServerName()
|
||||
// the main GUI window is up and ready to ask the user
|
||||
// to send payment.
|
||||
|
||||
static QList<QString> savedPaymentRequests;
|
||||
static QSet<QString> savedPaymentRequests;
|
||||
|
||||
static void ReportInvalidCertificate(const QSslCertificate& cert)
|
||||
{
|
||||
@ -205,7 +205,8 @@ void PaymentServer::ipcParseCommandLine(interfaces::Node& node, int argc, char*
|
||||
// will start a mainnet instance and throw a "wrong network" error.
|
||||
if (arg.startsWith(BITCOIN_IPC_PREFIX, Qt::CaseInsensitive)) // dash: URI
|
||||
{
|
||||
savedPaymentRequests.append(arg);
|
||||
if (savedPaymentRequests.contains(arg)) continue;
|
||||
savedPaymentRequests.insert(arg);
|
||||
|
||||
SendCoinsRecipient r;
|
||||
if (GUIUtil::parseBitcoinURI(arg, &r) && !r.address.isEmpty())
|
||||
@ -224,7 +225,8 @@ void PaymentServer::ipcParseCommandLine(interfaces::Node& node, int argc, char*
|
||||
}
|
||||
else if (QFile::exists(arg)) // Filename
|
||||
{
|
||||
savedPaymentRequests.append(arg);
|
||||
if (savedPaymentRequests.contains(arg)) continue;
|
||||
savedPaymentRequests.insert(arg);
|
||||
|
||||
PaymentRequestPlus request;
|
||||
if (readPaymentRequestFromFile(arg, request))
|
||||
@ -392,7 +394,7 @@ void PaymentServer::handleURIOrFile(const QString& s)
|
||||
{
|
||||
if (saveURIs)
|
||||
{
|
||||
savedPaymentRequests.append(s);
|
||||
savedPaymentRequests.insert(s);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,8 @@
|
||||
#include <validation.h> // for cs_main
|
||||
#include <sync.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QList>
|
||||
#include <QTimer>
|
||||
@ -78,7 +80,7 @@ public:
|
||||
|
||||
if (sortColumn >= 0)
|
||||
// sort cacheNodeStats (use stable sort to prevent rows jumping around unnecessarily)
|
||||
qStableSort(cachedNodeStats.begin(), cachedNodeStats.end(), NodeLessThan(sortColumn, sortOrder));
|
||||
std::stable_sort(cachedNodeStats.begin(), cachedNodeStats.end(), NodeLessThan(sortColumn, sortOrder));
|
||||
|
||||
// build index map
|
||||
mapNodeRows.clear();
|
||||
|
@ -11,6 +11,8 @@
|
||||
#include <clientversion.h>
|
||||
#include <streams.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
RecentRequestsTableModel::RecentRequestsTableModel(WalletModel *parent) :
|
||||
QAbstractTableModel(parent), walletModel(parent)
|
||||
@ -204,7 +206,7 @@ void RecentRequestsTableModel::addNewRequest(RecentRequestEntry &recipient)
|
||||
|
||||
void RecentRequestsTableModel::sort(int column, Qt::SortOrder order)
|
||||
{
|
||||
qSort(list.begin(), list.end(), RecentRequestEntryLessThan(column, order));
|
||||
std::sort(list.begin(), list.end(), RecentRequestEntryLessThan(column, order));
|
||||
Q_EMIT dataChanged(index(0, 0, QModelIndex()), index(list.size() - 1, NUMBER_OF_COLUMNS - 1, QModelIndex()));
|
||||
}
|
||||
|
||||
|
@ -248,8 +248,9 @@ void SendCoinsDialog::on_sendButton_clicked()
|
||||
{
|
||||
recipients.append(entry->getValue());
|
||||
}
|
||||
else
|
||||
else if (valid)
|
||||
{
|
||||
ui->scrollArea->ensureWidgetVisible(entry);
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
@ -996,11 +997,11 @@ void SendConfirmationDialog::updateYesButton()
|
||||
if(secDelay > 0)
|
||||
{
|
||||
yesButton->setEnabled(false);
|
||||
yesButton->setText(tr("Yes") + " (" + QString::number(secDelay) + ")");
|
||||
yesButton->setText(tr("Send") + " (" + QString::number(secDelay) + ")");
|
||||
}
|
||||
else
|
||||
{
|
||||
yesButton->setEnabled(true);
|
||||
yesButton->setText(tr("Yes"));
|
||||
yesButton->setText(tr("Send"));
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,8 @@
|
||||
#include <util/system.h>
|
||||
#include <validation.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <QColor>
|
||||
#include <QDateTime>
|
||||
#include <QDebug>
|
||||
@ -95,9 +97,9 @@ public:
|
||||
qDebug() << "TransactionTablePriv::updateWallet: " + QString::fromStdString(hash.ToString()) + " " + QString::number(status);
|
||||
|
||||
// Find bounds of this transaction in model
|
||||
QList<TransactionRecord>::iterator lower = qLowerBound(
|
||||
QList<TransactionRecord>::iterator lower = std::lower_bound(
|
||||
cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan());
|
||||
QList<TransactionRecord>::iterator upper = qUpperBound(
|
||||
QList<TransactionRecord>::iterator upper = std::upper_bound(
|
||||
cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan());
|
||||
int lowerIndex = (lower - cachedWallet.begin());
|
||||
int upperIndex = (upper - cachedWallet.begin());
|
||||
|
@ -1787,6 +1787,7 @@ static UniValue getchaintxstats(const JSONRPCRequest& request)
|
||||
" \"time\": xxxxx, (numeric) The timestamp for the final block in the window in UNIX format.\n"
|
||||
" \"txcount\": xxxxx, (numeric) The total number of transactions in the chain up to that point.\n"
|
||||
" \"window_final_block_hash\": \"...\", (string) The hash of the final block in the window.\n"
|
||||
" \"window_final_block_height\": xxxxx, (numeric) The height of the final block in the window.\n"
|
||||
" \"window_block_count\": xxxxx, (numeric) Size of the window in number of blocks.\n"
|
||||
" \"window_tx_count\": xxxxx, (numeric) The number of transactions in the window. Only returned if \"window_block_count\" is > 0.\n"
|
||||
" \"window_interval\": xxxxx, (numeric) The elapsed time in the window in seconds. Only returned if \"window_block_count\" is > 0.\n"
|
||||
@ -1835,6 +1836,7 @@ static UniValue getchaintxstats(const JSONRPCRequest& request)
|
||||
ret.pushKV("time", (int64_t)pindex->nTime);
|
||||
ret.pushKV("txcount", (int64_t)pindex->nChainTx);
|
||||
ret.pushKV("window_final_block_hash", pindex->GetBlockHash().GetHex());
|
||||
ret.pushKV("window_final_block_height", pindex->nHeight);
|
||||
ret.pushKV("window_block_count", blockcount);
|
||||
if (blockcount > 0) {
|
||||
ret.pushKV("window_tx_count", nTxDiff);
|
||||
|
@ -751,16 +751,17 @@ protected:
|
||||
size_t nBytes = fread((void*)&vchBuf[pos], 1, readNow, src);
|
||||
if (nBytes == 0) {
|
||||
throw std::ios_base::failure(feof(src) ? "CBufferedFile::Fill: end of file" : "CBufferedFile::Fill: fread failed");
|
||||
} else {
|
||||
nSrcPos += nBytes;
|
||||
return true;
|
||||
}
|
||||
nSrcPos += nBytes;
|
||||
return true;
|
||||
}
|
||||
|
||||
public:
|
||||
CBufferedFile(FILE *fileIn, uint64_t nBufSize, uint64_t nRewindIn, int nTypeIn, int nVersionIn) :
|
||||
nType(nTypeIn), nVersion(nVersionIn), nSrcPos(0), nReadPos(0), nReadLimit(std::numeric_limits<uint64_t>::max()), nRewind(nRewindIn), vchBuf(nBufSize, 0)
|
||||
{
|
||||
if (nRewindIn >= nBufSize)
|
||||
throw std::ios_base::failure("Rewind limit must be less than buffer size");
|
||||
src = fileIn;
|
||||
}
|
||||
|
||||
@ -793,8 +794,6 @@ public:
|
||||
void read(char *pch, size_t nSize) {
|
||||
if (nSize + nReadPos > nReadLimit)
|
||||
throw std::ios_base::failure("Read attempted past buffer limit");
|
||||
if (nSize + nRewind > vchBuf.size())
|
||||
throw std::ios_base::failure("Read larger than buffer size");
|
||||
while (nSize > 0) {
|
||||
if (nReadPos == nSrcPos)
|
||||
Fill();
|
||||
@ -818,16 +817,19 @@ public:
|
||||
|
||||
// rewind to a given reading position
|
||||
bool SetPos(uint64_t nPos) {
|
||||
nReadPos = nPos;
|
||||
if (nReadPos + nRewind < nSrcPos) {
|
||||
nReadPos = nSrcPos - nRewind;
|
||||
size_t bufsize = vchBuf.size();
|
||||
if (nPos + bufsize < nSrcPos) {
|
||||
// rewinding too far, rewind as far as possible
|
||||
nReadPos = nSrcPos - bufsize;
|
||||
return false;
|
||||
} else if (nReadPos > nSrcPos) {
|
||||
}
|
||||
if (nPos > nSrcPos) {
|
||||
// can't go this far forward, go as far as possible
|
||||
nReadPos = nSrcPos;
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
nReadPos = nPos;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Seek(uint64_t nPos) {
|
||||
|
@ -49,7 +49,3 @@ unit tests. The file naming convention is `<source_filename>_tests.cpp`
|
||||
and such files should wrap their tests in a test suite
|
||||
called `<source_filename>_tests`. For an example of this pattern,
|
||||
examine `uint256_tests.cpp`.
|
||||
|
||||
For further reading, I found the following website to be helpful in
|
||||
explaining how the boost unit test framework works:
|
||||
[http://www.alittlemadness.com/2009/03/31/c-unit-testing-with-boosttest/](http://archive.is/dRBGf).
|
||||
|
@ -10,11 +10,11 @@
|
||||
|
||||
/** Test Suite for CuckooCache
|
||||
*
|
||||
* 1) All tests should have a deterministic result (using insecure rand
|
||||
* 1. All tests should have a deterministic result (using insecure rand
|
||||
* with deterministic seeds)
|
||||
* 2) Some test methods are templated to allow for easier testing
|
||||
* 2. Some test methods are templated to allow for easier testing
|
||||
* against new versions / comparing
|
||||
* 3) Results should be treated as a regression test, i.e., did the behavior
|
||||
* 3. Results should be treated as a regression test, i.e., did the behavior
|
||||
* change significantly from what was expected. This can be OK, depending on
|
||||
* the nature of the change, but requires updating the tests to reflect the new
|
||||
* expected behavior. For example improving the hit rate may cause some tests
|
||||
@ -99,9 +99,9 @@ static double test_cache(size_t megabytes, double load)
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* 1) at load 0.5, we expect a perfect hit rate, so we multiply by
|
||||
* 1. at load 0.5, we expect a perfect hit rate, so we multiply by
|
||||
* 1.0
|
||||
* 2) at load 2.0, we expect to see half the entries, so a perfect hit rate
|
||||
* 2. at load 2.0, we expect to see half the entries, so a perfect hit rate
|
||||
* would be 0.5. Therefore, if we see a hit rate of 0.4, 0.4*2.0 = 0.8 is the
|
||||
* normalized hit rate.
|
||||
*
|
||||
|
@ -42,6 +42,86 @@ BOOST_AUTO_TEST_CASE(dbwrapper)
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(dbwrapper_basic_data)
|
||||
{
|
||||
// Perform tests both obfuscated and non-obfuscated.
|
||||
for (bool obfuscate : {false, true}) {
|
||||
fs::path ph = GetDataDir() / (obfuscate ? "dbwrapper_1_obfuscate_true" : "dbwrapper_1_obfuscate_false");
|
||||
CDBWrapper dbw(ph, (1 << 20), false, true, obfuscate);
|
||||
|
||||
uint256 res;
|
||||
uint32_t res_uint_32;
|
||||
bool res_bool;
|
||||
|
||||
// Ensure that we're doing real obfuscation when obfuscate=true
|
||||
BOOST_CHECK(obfuscate != is_null_key(dbwrapper_private::GetObfuscateKey(dbw)));
|
||||
|
||||
//Simulate block raw data - "b + block hash"
|
||||
std::string key_block = "b" + InsecureRand256().ToString();
|
||||
|
||||
uint256 in_block = InsecureRand256();
|
||||
BOOST_CHECK(dbw.Write(key_block, in_block));
|
||||
BOOST_CHECK(dbw.Read(key_block, res));
|
||||
BOOST_CHECK_EQUAL(res.ToString(), in_block.ToString());
|
||||
|
||||
//Simulate file raw data - "f + file_number"
|
||||
std::string key_file = strprintf("f%04x", InsecureRand32());
|
||||
|
||||
uint256 in_file_info = InsecureRand256();
|
||||
BOOST_CHECK(dbw.Write(key_file, in_file_info));
|
||||
BOOST_CHECK(dbw.Read(key_file, res));
|
||||
BOOST_CHECK_EQUAL(res.ToString(), in_file_info.ToString());
|
||||
|
||||
//Simulate transaction raw data - "t + transaction hash"
|
||||
std::string key_transaction = "t" + InsecureRand256().ToString();
|
||||
|
||||
uint256 in_transaction = InsecureRand256();
|
||||
BOOST_CHECK(dbw.Write(key_transaction, in_transaction));
|
||||
BOOST_CHECK(dbw.Read(key_transaction, res));
|
||||
BOOST_CHECK_EQUAL(res.ToString(), in_transaction.ToString());
|
||||
|
||||
//Simulate UTXO raw data - "c + transaction hash"
|
||||
std::string key_utxo = "c" + InsecureRand256().ToString();
|
||||
|
||||
uint256 in_utxo = InsecureRand256();
|
||||
BOOST_CHECK(dbw.Write(key_utxo, in_utxo));
|
||||
BOOST_CHECK(dbw.Read(key_utxo, res));
|
||||
BOOST_CHECK_EQUAL(res.ToString(), in_utxo.ToString());
|
||||
|
||||
//Simulate last block file number - "l"
|
||||
char key_last_blockfile_number = 'l';
|
||||
uint32_t lastblockfilenumber = InsecureRand32();
|
||||
BOOST_CHECK(dbw.Write(key_last_blockfile_number, lastblockfilenumber));
|
||||
BOOST_CHECK(dbw.Read(key_last_blockfile_number, res_uint_32));
|
||||
BOOST_CHECK_EQUAL(lastblockfilenumber, res_uint_32);
|
||||
|
||||
//Simulate Is Reindexing - "R"
|
||||
char key_IsReindexing = 'R';
|
||||
bool isInReindexing = InsecureRandBool();
|
||||
BOOST_CHECK(dbw.Write(key_IsReindexing, isInReindexing));
|
||||
BOOST_CHECK(dbw.Read(key_IsReindexing, res_bool));
|
||||
BOOST_CHECK_EQUAL(isInReindexing, res_bool);
|
||||
|
||||
//Simulate last block hash up to which UXTO covers - 'B'
|
||||
char key_lastblockhash_uxto = 'B';
|
||||
uint256 lastblock_hash = InsecureRand256();
|
||||
BOOST_CHECK(dbw.Write(key_lastblockhash_uxto, lastblock_hash));
|
||||
BOOST_CHECK(dbw.Read(key_lastblockhash_uxto, res));
|
||||
BOOST_CHECK_EQUAL(lastblock_hash, res);
|
||||
|
||||
//Simulate file raw data - "F + filename_number + filename"
|
||||
std::string file_option_tag = "F";
|
||||
uint8_t filename_length = InsecureRandBits(8);
|
||||
std::string filename = "randomfilename";
|
||||
std::string key_file_option = strprintf("%s%01x%s", file_option_tag,filename_length,filename);
|
||||
|
||||
bool in_file_bool = InsecureRandBool();
|
||||
BOOST_CHECK(dbw.Write(key_file_option, in_file_bool));
|
||||
BOOST_CHECK(dbw.Read(key_file_option, res_bool));
|
||||
BOOST_CHECK_EQUAL(res_bool, in_file_bool);
|
||||
}
|
||||
}
|
||||
|
||||
// Test batch operations
|
||||
BOOST_AUTO_TEST_CASE(dbwrapper_batch)
|
||||
{
|
||||
|
@ -179,6 +179,60 @@ BOOST_AUTO_TEST_CASE(get_next_work)
|
||||
// BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, chainParams->GetConsensus()), 0x1d00e1fdU);
|
||||
// }
|
||||
|
||||
BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_negative_target)
|
||||
{
|
||||
const auto consensus = CreateChainParams(CBaseChainParams::MAIN)->GetConsensus();
|
||||
uint256 hash;
|
||||
unsigned int nBits;
|
||||
nBits = UintToArith256(consensus.powLimit).GetCompact(true);
|
||||
hash.SetHex("0x1");
|
||||
BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_overflow_target)
|
||||
{
|
||||
const auto consensus = CreateChainParams(CBaseChainParams::MAIN)->GetConsensus();
|
||||
uint256 hash;
|
||||
unsigned int nBits = ~0x00800000;
|
||||
hash.SetHex("0x1");
|
||||
BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_too_easy_target)
|
||||
{
|
||||
const auto consensus = CreateChainParams(CBaseChainParams::MAIN)->GetConsensus();
|
||||
uint256 hash;
|
||||
unsigned int nBits;
|
||||
arith_uint256 nBits_arith = UintToArith256(consensus.powLimit);
|
||||
nBits_arith *= 2;
|
||||
nBits = nBits_arith.GetCompact();
|
||||
hash.SetHex("0x1");
|
||||
BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_biger_hash_than_target)
|
||||
{
|
||||
const auto consensus = CreateChainParams(CBaseChainParams::MAIN)->GetConsensus();
|
||||
uint256 hash;
|
||||
unsigned int nBits;
|
||||
arith_uint256 hash_arith = UintToArith256(consensus.powLimit);
|
||||
nBits = hash_arith.GetCompact();
|
||||
hash_arith *= 2; // hash > nBits
|
||||
hash = ArithToUint256(hash_arith);
|
||||
BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_zero_target)
|
||||
{
|
||||
const auto consensus = CreateChainParams(CBaseChainParams::MAIN)->GetConsensus();
|
||||
uint256 hash;
|
||||
unsigned int nBits;
|
||||
arith_uint256 hash_arith{0};
|
||||
nBits = hash_arith.GetCompact();
|
||||
hash = ArithToUint256(hash_arith);
|
||||
BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test)
|
||||
{
|
||||
const auto chainParams = CreateChainParams(CBaseChainParams::MAIN);
|
||||
|
@ -2,6 +2,7 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <random.h>
|
||||
#include <streams.h>
|
||||
#include <support/allocators/zeroafterfree.h>
|
||||
#include <test/test_dash.h>
|
||||
@ -203,4 +204,247 @@ BOOST_AUTO_TEST_CASE(streams_serializedata_xor)
|
||||
std::string(ds.begin(), ds.end()));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||
{
|
||||
FILE* file = fsbridge::fopen("streams_test_tmp", "w+b");
|
||||
// The value at each offset is the offset.
|
||||
for (uint8_t j = 0; j < 40; ++j) {
|
||||
fwrite(&j, 1, 1, file);
|
||||
}
|
||||
rewind(file);
|
||||
|
||||
// The buffer size (second arg) must be greater than the rewind
|
||||
// amount (third arg).
|
||||
try {
|
||||
CBufferedFile bfbad(file, 25, 25, 222, 333);
|
||||
BOOST_CHECK(false);
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_CHECK(strstr(e.what(),
|
||||
"Rewind limit must be less than buffer size") != nullptr);
|
||||
}
|
||||
|
||||
// The buffer is 25 bytes, allow rewinding 10 bytes.
|
||||
CBufferedFile bf(file, 25, 10, 222, 333);
|
||||
BOOST_CHECK(!bf.eof());
|
||||
|
||||
// These two members have no functional effect.
|
||||
BOOST_CHECK_EQUAL(bf.GetType(), 222);
|
||||
BOOST_CHECK_EQUAL(bf.GetVersion(), 333);
|
||||
|
||||
uint8_t i;
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, 0);
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, 1);
|
||||
|
||||
// After reading bytes 0 and 1, we're positioned at 2.
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 2);
|
||||
|
||||
// Rewind to offset 0, ok (within the 10 byte window).
|
||||
BOOST_CHECK(bf.SetPos(0));
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, 0);
|
||||
|
||||
// We can go forward to where we've been, but beyond may fail.
|
||||
BOOST_CHECK(bf.SetPos(2));
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, 2);
|
||||
|
||||
// If you know the maximum number of bytes that should be
|
||||
// read to deserialize the variable, you can limit the read
|
||||
// extent. The current file offset is 3, so the following
|
||||
// SetLimit() allows zero bytes to be read.
|
||||
BOOST_CHECK(bf.SetLimit(3));
|
||||
try {
|
||||
bf >> i;
|
||||
BOOST_CHECK(false);
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_CHECK(strstr(e.what(),
|
||||
"Read attempted past buffer limit") != nullptr);
|
||||
}
|
||||
// The default argument removes the limit completely.
|
||||
BOOST_CHECK(bf.SetLimit());
|
||||
// The read position should still be at 3 (no change).
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 3);
|
||||
|
||||
// Read from current offset, 3, forward until position 10.
|
||||
for (uint8_t j = 3; j < 10; ++j) {
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, j);
|
||||
}
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 10);
|
||||
|
||||
// We're guaranteed (just barely) to be able to rewind to zero.
|
||||
BOOST_CHECK(bf.SetPos(0));
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 0);
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, 0);
|
||||
|
||||
// We can set the position forward again up to the farthest
|
||||
// into the stream we've been, but no farther. (Attempting
|
||||
// to go farther may succeed, but it's not guaranteed.)
|
||||
BOOST_CHECK(bf.SetPos(10));
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, 10);
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 11);
|
||||
|
||||
// Now it's only guaranteed that we can rewind to offset 1
|
||||
// (current read position, 11, minus rewind amount, 10).
|
||||
BOOST_CHECK(bf.SetPos(1));
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 1);
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, 1);
|
||||
|
||||
// We can stream into large variables, even larger than
|
||||
// the buffer size.
|
||||
BOOST_CHECK(bf.SetPos(11));
|
||||
{
|
||||
uint8_t a[40 - 11];
|
||||
bf >> a;
|
||||
for (uint8_t j = 0; j < sizeof(a); ++j) {
|
||||
BOOST_CHECK_EQUAL(a[j], 11 + j);
|
||||
}
|
||||
}
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 40);
|
||||
|
||||
// We've read the entire file, the next read should throw.
|
||||
try {
|
||||
bf >> i;
|
||||
BOOST_CHECK(false);
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_CHECK(strstr(e.what(),
|
||||
"CBufferedFile::Fill: end of file") != nullptr);
|
||||
}
|
||||
// Attempting to read beyond the end sets the EOF indicator.
|
||||
BOOST_CHECK(bf.eof());
|
||||
|
||||
// Still at offset 40, we can go back 10, to 30.
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 40);
|
||||
BOOST_CHECK(bf.SetPos(30));
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, 30);
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 31);
|
||||
|
||||
// We're too far to rewind to position zero.
|
||||
BOOST_CHECK(!bf.SetPos(0));
|
||||
// But we should now be positioned at least as far back as allowed
|
||||
// by the rewind window (relative to our farthest read position, 40).
|
||||
BOOST_CHECK(bf.GetPos() <= 30);
|
||||
|
||||
// We can explicitly close the file, or the destructor will do it.
|
||||
bf.fclose();
|
||||
|
||||
fs::remove("streams_test_tmp");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
|
||||
{
|
||||
// Make this test deterministic.
|
||||
SeedInsecureRand(true);
|
||||
|
||||
for (int rep = 0; rep < 50; ++rep) {
|
||||
FILE* file = fsbridge::fopen("streams_test_tmp", "w+b");
|
||||
size_t fileSize = InsecureRandRange(256);
|
||||
for (uint8_t i = 0; i < fileSize; ++i) {
|
||||
fwrite(&i, 1, 1, file);
|
||||
}
|
||||
rewind(file);
|
||||
|
||||
size_t bufSize = InsecureRandRange(300) + 1;
|
||||
size_t rewindSize = InsecureRandRange(bufSize);
|
||||
CBufferedFile bf(file, bufSize, rewindSize, 222, 333);
|
||||
size_t currentPos = 0;
|
||||
size_t maxPos = 0;
|
||||
for (int step = 0; step < 100; ++step) {
|
||||
if (currentPos >= fileSize)
|
||||
break;
|
||||
|
||||
// We haven't read to the end of the file yet.
|
||||
BOOST_CHECK(!bf.eof());
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), currentPos);
|
||||
|
||||
// Pretend the file consists of a series of objects of varying
|
||||
// sizes; the boundaries of the objects can interact arbitrarily
|
||||
// with the CBufferFile's internal buffer. These first three
|
||||
// cases simulate objects of various sizes (1, 2, 5 bytes).
|
||||
switch (InsecureRandRange(5)) {
|
||||
case 0: {
|
||||
uint8_t a[1];
|
||||
if (currentPos + 1 > fileSize)
|
||||
continue;
|
||||
bf.SetLimit(currentPos + 1);
|
||||
bf >> a;
|
||||
for (uint8_t i = 0; i < 1; ++i) {
|
||||
BOOST_CHECK_EQUAL(a[i], currentPos);
|
||||
currentPos++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
uint8_t a[2];
|
||||
if (currentPos + 2 > fileSize)
|
||||
continue;
|
||||
bf.SetLimit(currentPos + 2);
|
||||
bf >> a;
|
||||
for (uint8_t i = 0; i < 2; ++i) {
|
||||
BOOST_CHECK_EQUAL(a[i], currentPos);
|
||||
currentPos++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
uint8_t a[5];
|
||||
if (currentPos + 5 > fileSize)
|
||||
continue;
|
||||
bf.SetLimit(currentPos + 5);
|
||||
bf >> a;
|
||||
for (uint8_t i = 0; i < 5; ++i) {
|
||||
BOOST_CHECK_EQUAL(a[i], currentPos);
|
||||
currentPos++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
// Find a byte value (that is at or ahead of the current position).
|
||||
size_t find = currentPos + InsecureRandRange(8);
|
||||
if (find >= fileSize)
|
||||
find = fileSize - 1;
|
||||
bf.FindByte(static_cast<char>(find));
|
||||
// The value at each offset is the offset.
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), find);
|
||||
currentPos = find;
|
||||
|
||||
bf.SetLimit(currentPos + 1);
|
||||
uint8_t i;
|
||||
bf >> i;
|
||||
BOOST_CHECK_EQUAL(i, currentPos);
|
||||
currentPos++;
|
||||
break;
|
||||
}
|
||||
case 4: {
|
||||
size_t requestPos = InsecureRandRange(maxPos + 4);
|
||||
bool okay = bf.SetPos(requestPos);
|
||||
// The new position may differ from the requested position
|
||||
// because we may not be able to rewind beyond the rewind
|
||||
// window, and we may not be able to move forward beyond the
|
||||
// farthest position we've reached so far.
|
||||
currentPos = bf.GetPos();
|
||||
BOOST_CHECK_EQUAL(okay, currentPos == requestPos);
|
||||
// Check that we can position within the rewind window.
|
||||
if (requestPos <= maxPos &&
|
||||
maxPos > rewindSize &&
|
||||
requestPos >= maxPos - rewindSize) {
|
||||
// We requested a position within the rewind window.
|
||||
BOOST_CHECK(okay);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (maxPos < currentPos)
|
||||
maxPos = currentPos;
|
||||
}
|
||||
}
|
||||
fs::remove("streams_test_tmp");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
@ -1266,12 +1266,12 @@ void SetupEnvironment()
|
||||
}
|
||||
#endif
|
||||
// On most POSIX systems (e.g. Linux, but not BSD) the environment's locale
|
||||
// may be invalid, in which case the "C" locale is used as fallback.
|
||||
// may be invalid, in which case the "C.UTF-8" locale is used as fallback.
|
||||
#if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
|
||||
try {
|
||||
std::locale(""); // Raises a runtime error if current locale is invalid
|
||||
} catch (const std::runtime_error&) {
|
||||
setenv("LC_ALL", "C", 1);
|
||||
setenv("LC_ALL", "C.UTF-8", 1);
|
||||
}
|
||||
#endif
|
||||
// The path locale is lazy initialized and to avoid deinitialization errors
|
||||
|
@ -4098,6 +4098,7 @@ DBErrors CWallet::ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256
|
||||
const auto& it = mapWallet.find(hash);
|
||||
wtxOrdered.erase(it->second.m_it_wtxOrdered);
|
||||
mapWallet.erase(it);
|
||||
NotifyTransactionChanged(this, hash, CT_DELETED);
|
||||
}
|
||||
|
||||
if (nZapSelectTxRet == DBErrors::NEED_REWRITE)
|
||||
|
@ -155,6 +155,7 @@ class BlockchainTest(BitcoinTestFramework):
|
||||
assert_equal(chaintxstats['time'], b200['time'])
|
||||
assert_equal(chaintxstats['txcount'], 201)
|
||||
assert_equal(chaintxstats['window_final_block_hash'], b200_hash)
|
||||
assert_equal(chaintxstats['window_final_block_height'], 200)
|
||||
assert_equal(chaintxstats['window_block_count'], 199)
|
||||
assert_equal(chaintxstats['window_tx_count'], 199)
|
||||
assert_equal(chaintxstats['window_interval'], time_diff)
|
||||
@ -164,6 +165,7 @@ class BlockchainTest(BitcoinTestFramework):
|
||||
assert_equal(chaintxstats['time'], b1['time'])
|
||||
assert_equal(chaintxstats['txcount'], 2)
|
||||
assert_equal(chaintxstats['window_final_block_hash'], b1_hash)
|
||||
assert_equal(chaintxstats['window_final_block_height'], 1)
|
||||
assert_equal(chaintxstats['window_block_count'], 0)
|
||||
assert('window_tx_count' not in chaintxstats)
|
||||
assert('window_interval' not in chaintxstats)
|
||||
|
@ -261,7 +261,7 @@ class PortSeed:
|
||||
# Must be initialized with a unique integer for each process
|
||||
n = None
|
||||
|
||||
def get_rpc_proxy(url, node_number, timeout=None, coveragedir=None):
|
||||
def get_rpc_proxy(url, node_number, *, timeout=None, coveragedir=None):
|
||||
"""
|
||||
Args:
|
||||
url (str): URL of the RPC server to call
|
||||
@ -269,6 +269,7 @@ def get_rpc_proxy(url, node_number, timeout=None, coveragedir=None):
|
||||
|
||||
Kwargs:
|
||||
timeout (int): HTTP timeout in seconds
|
||||
coveragedir (str): Directory
|
||||
|
||||
Returns:
|
||||
AuthServiceProxy. convenience object for making RPC calls.
|
||||
|
@ -11,6 +11,9 @@
|
||||
export LC_ALL=C
|
||||
IGNORE_REGEXP="/(leveldb|secp256k1|univalue)/"
|
||||
|
||||
# cd to root folder of git repo for git ls-files to work properly
|
||||
cd "$(dirname $0)/../.." || exit 1
|
||||
|
||||
filter_suffix() {
|
||||
git ls-files | grep -E "^src/.*\.${1}"'$' | grep -Ev "${IGNORE_REGEXP}"
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user