diff --git a/Makefile.am b/Makefile.am index 6a8c1b761bc..4484bafc57f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -76,9 +76,6 @@ $(BITCOIN_WIN_INSTALLER): all-recursive echo error: could not build $@ @echo built $@ -$(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE - $(MAKE) -C src $(patsubst src/%,%,$@) - $(OSX_APP)/Contents/PkgInfo: $(MKDIR_P) $(@D) @echo "APPL????" > $@ diff --git a/build-aux/m4/ax_cxx_compile_stdcxx.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 index 2c18e49c56c..f147cee3b11 100644 --- a/build-aux/m4/ax_cxx_compile_stdcxx.m4 +++ b/build-aux/m4/ax_cxx_compile_stdcxx.m4 @@ -57,8 +57,14 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], [$3], [optional], [ax_cxx_compile_cxx$1_required=false], [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + m4_if([$4], [], [ax_cxx_compile_cxx$1_try_default=true], + [$4], [default], [ax_cxx_compile_cxx$1_try_default=true], + [$4], [nodefault], [ax_cxx_compile_cxx$1_try_default=false], + [m4_fatal([invalid fourth argument `$4' to AX_CXX_COMPILE_STDCXX])]) AC_LANG_PUSH([C++])dnl ac_success=no + + m4_if([$4], [nodefault], [], [dnl AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, ax_cv_cxx_compile_cxx$1, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], @@ -66,7 +72,7 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl [ax_cv_cxx_compile_cxx$1=no])]) if test x$ax_cv_cxx_compile_cxx$1 = xyes; then ac_success=yes - fi + fi]) m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then diff --git a/configure.ac b/configure.ac index 346695043d9..0894c7197c5 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 0) -define(_CLIENT_VERSION_MINOR, 13) -define(_CLIENT_VERSION_REVISION, 99) +define(_CLIENT_VERSION_MINOR, 14) +define(_CLIENT_VERSION_REVISION, 2) define(_CLIENT_VERSION_BUILD, 0) -define(_CLIENT_VERSION_IS_RELEASE, false) +define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2017) define(_COPYRIGHT_HOLDERS,[The %s developers]) define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Bitcoin Core]]) @@ -55,7 +55,7 @@ case $host in ;; esac dnl Require C++11 compiler (no GNU extensions) -AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory]) +AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory], [nodefault]) dnl Check if -latomic is required for CHECK_ATOMIC @@ -192,6 +192,13 @@ AC_ARG_ENABLE([debug], [enable_debug=$enableval], [enable_debug=no]) +# Turn warnings into errors +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--enable-werror], + [Treat certain compiler warnings as errors (default is no)])], + [enable_werror=$enableval], + [enable_werror=no]) + AC_LANG_PUSH([C++]) AX_CHECK_COMPILE_FLAG([-Werror],[CXXFLAG_WERROR="-Werror"],[CXXFLAG_WERROR=""]) @@ -206,10 +213,19 @@ if test "x$enable_debug" = xyes; then fi fi +ERROR_CXXFLAGS= +if test "x$enable_werror" = "xyes"; then + if test "x$CXXFLAG_WERROR" = "x"; then + AC_MSG_ERROR("enable-werror set but -Werror is not usable") + fi + AX_CHECK_COMPILE_FLAG([-Werror=vla],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=vla"],,[[$CXXFLAG_WERROR]]) +fi + if test "x$CXXFLAGS_overridden" = "xno"; then AX_CHECK_COMPILE_FLAG([-Wall],[CXXFLAGS="$CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wextra],[CXXFLAGS="$CXXFLAGS -Wextra"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wformat],[CXXFLAGS="$CXXFLAGS -Wformat"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wvla],[CXXFLAGS="$CXXFLAGS -Wvla"],,[[$CXXFLAG_WERROR]]) AX_CHECK_COMPILE_FLAG([-Wformat-security],[CXXFLAGS="$CXXFLAGS -Wformat-security"],,[[$CXXFLAG_WERROR]]) ## Some compilers (gcc) ignore unknown -Wno-* options, but warn about all @@ -541,6 +557,14 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [ AC_MSG_RESULT(no)] ) +dnl Check for mallopt(M_ARENA_MAX) (to set glibc arenas) +AC_MSG_CHECKING(for mallopt M_ARENA_MAX) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ mallopt(M_ARENA_MAX, 1); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MALLOPT_ARENA_MAX, 1,[Define this symbol if you have mallopt with M_ARENA_MAX]) ], + [ AC_MSG_RESULT(no)] +) + AC_MSG_CHECKING([for visibility attribute]) AC_LINK_IFELSE([AC_LANG_SOURCE([ int foo_def( void ) __attribute__((visibility("default"))); @@ -1066,6 +1090,7 @@ AC_SUBST(BITCOIN_CLI_NAME) AC_SUBST(BITCOIN_TX_NAME) AC_SUBST(RELDFLAGS) +AC_SUBST(ERROR_CXXFLAGS) AC_SUBST(HARDENED_CXXFLAGS) AC_SUBST(HARDENED_CPPFLAGS) AC_SUBST(HARDENED_LDFLAGS) @@ -1155,6 +1180,7 @@ echo " with test = $use_tests" echo " with bench = $use_bench" echo " with upnp = $use_upnp" echo " debug enabled = $enable_debug" +echo " werror = $enable_werror" echo echo " target os = $TARGET_OS" echo " build os = $BUILD_OS" diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 110bfe03eff..33dab9b6388 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,122 @@ +bitcoin (0.14.1-trusty4) trusty; urgency=medium + + * Re-enable UPnP support. + + -- Matt Corallo (BlueMatt) Fri, 05 May 2017 13:28:00 -0400 + +bitcoin (0.14.1-trusty3) trusty; urgency=medium + + * Build with qt5 if we are on a non-Ubuntu (ie non-Unity) distro. + + -- Matt Corallo (BlueMatt) Thu, 04 May 2017 17:13:00 -0400 + +bitcoin (0.14.1-trusty2) trusty; urgency=medium + + * Bump minimum boost version in deps. + + -- Matt Corallo (BlueMatt) Thu, 04 May 2017 17:12:00 -0400 + +bitcoin (0.14.1-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) Sat, 22 Apr 2017 17:10:00 -0400 + +bitcoin (0.14.0-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) Wed, 08 Mar 2017 10:30:00 -0500 + +bitcoin (0.13.2-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) Thu, 05 Jan 2017 09:59:00 -0500 + +bitcoin (0.13.1-trusty2) trusty; urgency=medium + + * Revert to Qt4, due to https://github.com/bitcoin/bitcoin/issues/9038 + + -- Matt Corallo (BlueMatt) Mon, 31 Oct 2016 11:16:00 -0400 + +bitcoin (0.13.1-trusty1) trusty; urgency=medium + + * New upstream release. + * Backport updated bitcoin-qt.desktop from upstream master + * Add zmq dependency + * Switch to Qt5 (breaks precise, but that was already broken by C++11) + + -- Matt Corallo (BlueMatt) Thu, 27 Oct 2016 17:32:00 -0400 + +bitcoin (0.13.0-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) Sun, 04 Sep 2016 22:09:00 -0400 + +bitcoin (0.12.1-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) Mon, 18 Apr 2016 14:26:00 -0700 + +bitcoin (0.12.0-trusty6) trusty; urgency=medium + + * Fix program-options dep. + + -- Matt Corallo (BlueMatt) Fri, 25 Mar 2016 21:41:00 -0700 + +bitcoin (0.12.0-trusty5) trusty; urgency=medium + + * Test explicit --with-gui + + -- Matt Corallo (BlueMatt) Tue, 23 Feb 2015 23:25:00 -0800 + +bitcoin (0.12.0-trusty4) trusty; urgency=medium + + * Fix libevent-dev dep. + + -- Matt Corallo (BlueMatt) Tue, 23 Feb 2015 23:25:00 -0800 + +bitcoin (0.12.0-trusty3) trusty; urgency=medium + + * Fix precise boost dep. + + -- Matt Corallo (BlueMatt) Tue, 23 Feb 2015 19:55:00 -0800 + +bitcoin (0.12.0-trusty2) trusty; urgency=medium + + * Fix libevent dep. + + -- Matt Corallo (BlueMatt) Tue, 23 Feb 2015 19:53:00 -0800 + +bitcoin (0.12.0-trusty1) trusty; urgency=medium + + * New upstream release + * Various updates to contrib/debian were merged, a few were not + + -- Matt Corallo (BlueMatt) Tue, 23 Feb 2015 19:29:00 -0800 + +bitcoin (0.11.2-trusty1) trusty; urgency=low + + * New upstream release. + + -- Matt Corallo (BlueMatt) Fri, 13 Nov 2015 18:39:00 -0800 + +bitcoin (0.11.1-trusty2) trusty; urgency=low + + * Remove minupnpc builddep. + + -- Matt Corallo (BlueMatt) Wed, 14 Oct 2015 23:06:00 -1000 + +bitcoin (0.11.1-trusty1) trusty; urgency=high + + * New upstream release. + * Disable all UPnP support. + + -- Matt Corallo (BlueMatt) Wed, 14 Oct 2015 13:57:00 -1000 + bitcoin (0.11.0-precise1) precise; urgency=medium * New upstream release. @@ -179,7 +298,7 @@ bitcoin (0.5.3-natty0) natty; urgency=low bitcoin (0.5.2-natty1) natty; urgency=low * Remove mentions on anonymity in package descriptions and manpage. - These should never have been there, bitcoin isn't anonymous without + These should never have been there, bitcoin isnt anonymous without a ton of work that virtually no users will ever be willing and capable of doing @@ -220,7 +339,7 @@ bitcoin (0.5.0~rc1-natty1) natty; urgency=low * Add test_bitcoin to build test * Fix clean - * Remove unnecessary build-dependancies + * Remove uneccessary build-dependancies -- Matt Corallo Wed, 26 Oct 2011 14:37:18 -0400 @@ -380,7 +499,7 @@ bitcoin (0.3.20.01~dfsg-1) unstable; urgency=low bitcoin (0.3.19~dfsg-6) unstable; urgency=low - * Fix override aggressive optimizations. + * Fix override agressive optimizations. * Fix tighten build-dependencies to really fit backporting to Lenny: + Add fallback build-dependency on libdb4.6++-dev. + Tighten unversioned Boost build-dependencies to recent versions, diff --git a/contrib/debian/control b/contrib/debian/control index fce6bc0118f..0d6ad25e249 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -1,27 +1,30 @@ Source: bitcoin Section: utils Priority: optional -Maintainer: Jonas Smedegaard -Uploaders: Micah Anderson +Maintainer: Matt Corallo +Uploaders: Matt Corallo Build-Depends: debhelper, devscripts, automake, libtool, bash-completion, - libboost-system-dev (>> 1.35) | libboost-system1.35-dev, libdb4.8++-dev, libssl-dev, pkg-config, - libminiupnpc8-dev | libminiupnpc-dev (>> 1.6), - libboost-filesystem-dev (>> 1.35) | libboost-filesystem1.35-dev, - libboost-program-options-dev (>> 1.35) | libboost-program-options1.35-dev, - libboost-thread-dev (>> 1.35) | libboost-thread1.35-dev, - libboost-test-dev (>> 1.35) | libboost-test1.35-dev, - qt4-qmake, - libqt4-dev, + libevent-dev, + libboost-system1.48-dev | libboost-system-dev (>> 1.47), + libboost-filesystem1.48-dev | libboost-filesystem-dev (>> 1.47), + libboost-program-options1.48-dev | libboost-program-options-dev (>> 1.47), + libboost-thread1.48-dev | libboost-thread-dev (>> 1.47), + libboost-test1.48-dev | libboost-test-dev (>> 1.47), + libboost-chrono1.48-dev | libboost-chrono-dev (>> 1.47), + libminiupnpc8-dev | libminiupnpc-dev, + qt4-qmake, libqt4-dev, + qttools5-dev-tools, qttools5-dev, libqrencode-dev, libprotobuf-dev, protobuf-compiler, - python + python, + libzmq3-dev Standards-Version: 3.9.2 Homepage: https://bitcoincore.org/ Vcs-Git: git://github.com/bitcoin/bitcoin.git @@ -31,11 +34,11 @@ Package: bitcoind Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: peer-to-peer network based digital currency - daemon - Bitcoin is an experimental new digital currency that enables instant - payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer - technology to operate with no central authority: managing transactions - and issuing money are carried out collectively by the network. Bitcoin Core - is the name of the open source software which enables the use of this currency. + Bitcoin is a free open source peer-to-peer electronic cash system that + is completely decentralized, without the need for a central server or + trusted parties. Users hold the crypto keys to their own money and + transact directly with each other, with the help of a P2P network to + check for double-spending. . This package provides the daemon, bitcoind, and the CLI tool bitcoin-cli to interact with the daemon. @@ -44,11 +47,11 @@ Package: bitcoin-qt Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: peer-to-peer network based digital currency - Qt GUI - Bitcoin is an experimental new digital currency that enables instant - payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer - technology to operate with no central authority: managing transactions - and issuing money are carried out collectively by the network. Bitcoin Core - is the name of the open source software which enables the use of this currency. + Bitcoin is a free open source peer-to-peer electronic cash system that + is completely decentralized, without the need for a central server or + trusted parties. Users hold the crypto keys to their own money and + transact directly with each other, with the help of a P2P network to + check for double-spending. . This package provides Bitcoin-Qt, a GUI for Bitcoin based on Qt. @@ -56,11 +59,11 @@ Package: bitcoin-tx Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: peer-to-peer digital currency - standalone transaction tool - Bitcoin is an experimental new digital currency that enables instant - payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer - technology to operate with no central authority: managing transactions - and issuing money are carried out collectively by the network. Bitcoin Core - is the name of the open source software which enables the use of this currency. + Bitcoin is a free open source peer-to-peer electronic cash system that + is completely decentralized, without the need for a central server or + trusted parties. Users hold the crypto keys to their own money and + transact directly with each other, with the help of a P2P network to + check for double-spending. . This package provides bitcoin-tx, a command-line transaction creation tool which can be used without a bitcoin daemon. Some means of diff --git a/contrib/debian/rules b/contrib/debian/rules index 3896d2caa31..6885e385212 100755 --- a/contrib/debian/rules +++ b/contrib/debian/rules @@ -12,10 +12,12 @@ override_dh_auto_clean: if [ -f Makefile ]; then $(MAKE) distclean; fi rm -rf Makefile.in aclocal.m4 configure src/Makefile.in src/bitcoin-config.h.in src/build-aux src/qt/Makefile.in src/qt/test/Makefile.in src/test/Makefile.in +QT=$(shell dpkg-vendor --derives-from Ubuntu && echo qt4 || echo qt5) + # Yea, autogen should be run on the source archive, but I like doing git archive override_dh_auto_configure: ./autogen.sh - ./configure + ./configure --with-gui=$(QT) override_dh_auto_test: make check diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 6f43119ba24..b126f83fee7 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-linux-0.13" +name: "bitcoin-linux-0.14" enable_cache: true suites: - "trusty" diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 991976d59ea..77381b86198 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-osx-0.13" +name: "bitcoin-osx-0.14" enable_cache: true suites: - "trusty" diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index fe01b5b9572..0bb4f23bfe3 100644 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-win-0.13" +name: "bitcoin-win-0.14" enable_cache: true suites: - "trusty" diff --git a/contrib/init/bitcoind.openrcconf b/contrib/init/bitcoind.openrcconf index 0cbff6d30d2..f70e25cb5fd 100644 --- a/contrib/init/bitcoind.openrcconf +++ b/contrib/init/bitcoind.openrcconf @@ -23,7 +23,7 @@ #BITCOIND_NICE=0 # Additional options (avoid -conf and -datadir, use flags above) -BITCOIND_OPTS="-disablewallet" +#BITCOIND_OPTS="" # The timeout in seconds OpenRC will wait for bitcoind to terminate # after a SIGTERM has been raised. diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md index afe902fd7f0..139c03181fc 100644 --- a/contrib/seeds/README.md +++ b/contrib/seeds/README.md @@ -8,7 +8,7 @@ and remove old versions as necessary. The seeds compiled into the release are created from sipa's DNS seed data, like this: - curl -s http://bitcoin.sipa.be/seeds.txt > seeds_main.txt + curl -s http://bitcoin.sipa.be/seeds.txt.gz | gzip -dc > seeds_main.txt python3 makeseeds.py < seeds_main.txt > nodes_main.txt python3 generate-seeds.py . > ../../src/chainparamsseeds.h diff --git a/contrib/verify-commits/allow-revsig-commits b/contrib/verify-commits/allow-revsig-commits index e69de29bb2d..f0088cdca4a 100644 --- a/contrib/verify-commits/allow-revsig-commits +++ b/contrib/verify-commits/allow-revsig-commits @@ -0,0 +1,104 @@ +a06ede9a138d0fb86b0de17c42b936d9fe6e2158 +923dc447eaa8e017985b2afbbb12dd1283fbea0e +71148b8947fe8b4d756822420a7f31c380159425 +6696b4635ceb9b47aaa63244bff9032fa7b08354 +812714fd80e96e28cd288c553c83838cecbfc2d9 +8a445c5651edb9a1f51497055b7ddf4402be9188 +e126d0c12ca66278d9e7b12187c5ff4fc02a7e6c +3908fc4728059719bed0e1c7b1c8b388c2d4a8da +8b66bf74e2a349e71eaa183af81fa63eaee76ad2 +05950427d310654774031764a7141a1a4fd9c6e4 +07fd147b9f12e9205afd66a624edce357977d615 +12e31127948fa4bb01c3bddc1b8c85b432f7465b +8c87f175d335e9d9e93f987d871ae9f05f6a10a7 +46b249e578e8a3dfbe85bc7253a12e82ef4b658b +a55716abe5662ec74c2f8af93023f1e7cca901fc +f646275b90b1de93bc62b4c4d045d75ac0b96eee +c252685aa5867631e9a5ef07ccae7c7c25cae8ff +a7d55c93385359952d85decd5037843ac70ba3d4 +7dac1e5e9e887f5f6ff146e812a05bd3bf281eae +2a524b8e8fe69ef487fd8ea1b4f7a03f473ed201 +ce5c1f4acae43477989cdf9a82ed33703919cda2 +2db4cbcc437f51f5dac82cc4de46f383b92e6f11 +7aa700424cbda387536373d8dfec88aee43f950e +b99a093afed880f23fb279c443cc6ae5e379cc43 +b83264d9c7a8ddb79f64bd9540caddc8632ef31f +57e337d40e94ba33d8cd265c134d6ef857b32b59 +a1dcf2e1087beaf3981739fd2bb74f35ecad630a +d38b0d7a6b6056cba26999b702815775e2437d87 +815640ec6af9a38d6a2da4a4400056e2f4105080 +09c4fd157c5b88df2d97fad4826c79b094db90c9 +2efcfa5acfacb958973d9e8125e1d81f102e2dfd +dc6dee41f7cf2ba93fcd0fea7c157e4b2775d439 +ad826b3df9f763b49f1e3e3d50c4efdd438c7547 +c1a52276848d8caa9a9789dff176408c1aa6b1ed +3bf06e9bac57b5b5a746677b75e297a7b154bdbd +72ae6f8cf0224370e8121d6769b21e612ca15d6f +a143b88dbd4971ecfdd1d39a494489c8f2db0344 +76fec09d878d6dbf214bdb6228d480bd9195db4c +93566e0c37c5ae104095474fea89f00dcb40f551 +407d9232ef5cb1ebf6cff21f3d13e07ea4158eeb +9346f8429957e356d21c665bab59fe45bcf1f74e +6eeac6e30d65f9a972067c1ea8c49978c8e631ac +dc6b9406bdfab2af8c86cb080cb3e6cf8f2385d8 +9f554e03ebe5701c1b75ff03b3d6152095c0cad3 +05009935f9ac070197113954d680bc2c9150b9b3 +508404de98a8a5435f52916cef8f328e82651961 +ed0cc50afed146c27f6d8129c683c225fb940093 +6429cfa8a70308241c576aeb92ffe3db5203b2ef +6898213409811b140843c3d89af43328c3b22fad +5b2ea29cf4fd298346437bb16a54407f8c1f9dca +e2a1a1ee895149c544d4ae295466611f0cec3094 +e82fb872ff5cc8fd22d43327c1ee3e755f61c562 +19b0f33de0efd9da788e8e4f3fdc2a9e159abdb1 +89de1538ce1f8c00f80e8d11f43e1b77e24d7dea +de07fdcf77e97b8613091285e4d0a734f5de7492 +01680195f8aa586c55c44767397380def3a23b54 +05e1c85fb687c82ae477c72d4a7e2d6b0c692167 +c072b8fd95cd4fa84f08189a0cd8b173ea2dbb8e +9a0ed08b40b15ae2b791aa8549b53e69934b4ea7 +53f8f226bd1d627c4a6dec5862a1d4ea5a933e45 +9d0f43b7ca7241d8a018fd35dd3bc01555235ec6 +f12d2b5a8ac397e4bcaefcc19898f8ff5705dea5 +8250de13587ed05ca45df3e12c5dc9bcb1500e2c +d727f77e390426e9e463336bda08d50c451c7086 +484312bda2d43e3ea60047be076332299463adf8 +c7e05b35ab0a791c7a8e2d863e716fdec6f3f671 +b9c1cd81848da9de1baf9c2f29c19c50e549de13 +8ea7d31e384975019733b5778feabbd9955c79d8 +f798b891bcecea9548eedacae70eeb9906c1ddbf +ebefe7a00b46579cdd1e033a8c7fd8ce9aa578e4 +ad087638ee4864d6244ec9381ff764bfa6ee5086 +66db2d62d59817320c9182fc18e75a93b76828ea +7ce9ac5c83b1844a518ef2e12e87aae3cacdfe58 +4286f43025149cf44207c3ad98e4a1f068520ada +cd0c5135ab2291aaa5410ac919bad3fc87249a4a +66ed450d771a8fc01c159a8402648ebd1c35eb4c +a82f03393a32842d49236e8666ee57805ca701f8 +f972b04d63eb8af79ff3cec1dc561ed13dfa6053 +ec45cc5e27668171b55271b0c735194c70e7da41 +715e9fd7454f7a48d7adba7d42f662c20a3e3367 +2e0a99037dcc35bc63ba0d54371bc678af737c8e +7fa8d758598407f3bf0beb0118dc122ea5340736 +6a22373771edbc3c7513cacb9355f880c73c2cbf +b89ef131147f71a96152a7b5c4374266cdf539b2 +01d8359983e2f77b5118fede3ffa947072c666c8 +58f0c929a3d70a4bff79cc200f1c186f71ef1675 +950be19727a581970591d8f8138dfe4725750382 +425278d17bd0edf8a3a7cc81e55016f7fd8e7726 +c028c7b7557da2baff7af8840108e8be4db8e0c6 +47a7cfb0aa2498f6801026d258a59f9de48f60b0 +f6b7df3155ddb4cedfbcf5d3eb3383d4614b3a85 +d72098038f3b55a714ed8adb34fab547b15eb0d5 +c49c825bd9f4764536b45df5a684d97173673fc7 +33799afe83eec4200ff140e9bf5eae83701a4d7f +5c3f8ddcaa1164079105c452429fccf8127b01b6 +1f01443567b03ac75a91c810f1733f5c21b5699d +b3e42b6d02e8d19658a9135e427ebceab5367779 +69b3a6dd9d9a0adf5506c8b9fde42187356bd4a8 +bafd075c5e6a1088ef0f1aa0b0b224e026a3d3e0 +7daa3adb242d9c8728fdb15c6af6596aaad5502f +514993554c370f4cf30a109ac28d5d64893dbf0a +c8d2473e6cb042e7275a10c49d3f6a4a91bf0166 +386f4385ab04b0b2c3d47bddc0dc0f2de7354964 +9f33dba05c01ecc5c56eb1284ab7d64d42f55171 diff --git a/contrib/verify-commits/gpg.sh b/contrib/verify-commits/gpg.sh index 09ff2375447..4b2649eaaaa 100755 --- a/contrib/verify-commits/gpg.sh +++ b/contrib/verify-commits/gpg.sh @@ -12,17 +12,13 @@ for LINE in $(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null); do case "$LINE" in "[GNUPG:] VALIDSIG "*) while read KEY; do - case "$LINE" in "[GNUPG:] VALIDSIG $KEY "*) VALID=true;; esac + [ "${LINE#?GNUPG:? VALIDSIG * * * * * * * * * }" = "$KEY" ] && VALID=true done < ./contrib/verify-commits/trusted-keys ;; "[GNUPG:] REVKEYSIG "*) [ "$BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG" != 1 ] && exit 1 - while read KEY; do - case "$LINE" in "[GNUPG:] REVKEYSIG ${KEY#????????????????????????} "*) - REVSIG=true - GOODREVSIG="[GNUPG:] GOODSIG ${KEY#????????????????????????} " - esac - done < ./contrib/verify-commits/trusted-keys + REVSIG=true + GOODREVSIG="[GNUPG:] GOODSIG ${LINE#* * *}" ;; esac done diff --git a/contrib/verify-commits/trusted-keys b/contrib/verify-commits/trusted-keys index 75242c2a976..5610692616e 100644 --- a/contrib/verify-commits/trusted-keys +++ b/contrib/verify-commits/trusted-keys @@ -1,4 +1,4 @@ 71A3B16735405025D447E8F274810B012346C9A6 -3F1888C6DCA92A6499C4911FDBA1A67379A1A931 +133EAC179436F14A5CF1B794860FEB804E669320 32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC -FE09B823E6D83A3BC7983EAA2D7F2372E50FE137 +B8B3F1C0E58C15DB6A81D30C3648A882F4316B9B diff --git a/depends/packages/miniupnpc.mk b/depends/packages/miniupnpc.mk index e34cf7be2f1..1bb8cb5d266 100644 --- a/depends/packages/miniupnpc.mk +++ b/depends/packages/miniupnpc.mk @@ -1,8 +1,8 @@ package=miniupnpc -$(package)_version=2.0 +$(package)_version=2.0.20170509 $(package)_download_path=http://miniupnp.free.fr/files $(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=d434ceb8986efbe199c5ca53f90ed53eab290b1e6d0530b717eb6fa49d61f93b +$(package)_sha256_hash=d3c368627f5cdfb66d3ebd64ca39ba54d6ff14a61966dbecb8dd296b7039f16a define $(package)_set_vars $(package)_build_opts=CC="$($(package)_cc)" diff --git a/depends/packages/native_cctools.mk b/depends/packages/native_cctools.mk index 797480c25eb..44d238cc4c2 100644 --- a/depends/packages/native_cctools.mk +++ b/depends/packages/native_cctools.mk @@ -38,7 +38,8 @@ $(package)_cxx=$($(package)_extract_dir)/toolchain/bin/clang++ endef define $(package)_preprocess_cmds - cd $($(package)_build_subdir); ./autogen.sh + cd $($(package)_build_subdir); ./autogen.sh && \ + sed -i.old "/define HAVE_PTHREADS/d" ld64/src/ld/InputFiles.h endef define $(package)_config_cmds diff --git a/depends/packages/zlib.mk b/depends/packages/zlib.mk index 7ff5d00bbdc..589490800f8 100644 --- a/depends/packages/zlib.mk +++ b/depends/packages/zlib.mk @@ -7,8 +7,10 @@ $(package)_sha256_hash=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca11 define $(package)_set_vars $(package)_build_opts= CC="$($(package)_cc)" $(package)_build_opts+=CFLAGS="$($(package)_cflags) $($(package)_cppflags) -fPIC" -$(package)_build_opts+=AR="$($(package)_ar)" $(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" endef define $(package)_config_cmds diff --git a/doc/Doxyfile b/doc/Doxyfile index ef55acdbc33..a76918df7b6 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "Bitcoin Core" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 0.13.99 +PROJECT_NUMBER = 0.14.2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/doc/README.md b/doc/README.md index 36684e54012..81ded9e10a4 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,4 +1,4 @@ -Bitcoin Core 0.13.99 +Bitcoin Core 0.14.2 ===================== Setup diff --git a/doc/README_windows.txt b/doc/README_windows.txt index 74a05138a42..ec365178a55 100644 --- a/doc/README_windows.txt +++ b/doc/README_windows.txt @@ -1,4 +1,4 @@ -Bitcoin Core 0.13.99 +Bitcoin Core 0.14.2 ===================== Intro diff --git a/doc/bips.md b/doc/bips.md index 4f416100891..bc8dcb6fb3c 100644 --- a/doc/bips.md +++ b/doc/bips.md @@ -20,6 +20,7 @@ BIPs that are implemented by Bitcoin Core (up-to-date up to **v0.13.0**): * [`BIP 66`](https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki): The strict DER rules and associated version 3 blocks have been implemented since **v0.10.0** ([PR #5713](https://github.com/bitcoin/bitcoin/pull/5713)). * [`BIP 68`](https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki): Sequence locks have been implemented as of **v0.12.1** ([PR #7184](https://github.com/bitcoin/bitcoin/pull/7184)), and have been activated since *block 419328*. * [`BIP 70`](https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki) [`71`](https://github.com/bitcoin/bips/blob/master/bip-0071.mediawiki) [`72`](https://github.com/bitcoin/bips/blob/master/bip-0072.mediawiki): Payment Protocol support has been available in Bitcoin Core GUI since **v0.9.0** ([PR #5216](https://github.com/bitcoin/bitcoin/pull/5216)). +* [`BIP 90`](https://github.com/bitcoin/bips/blob/master/bip-0090.mediawiki): Trigger mechanism for activation of BIPs 34, 65, and 66 has been simplified to block height checks since **v0.14.0** ([PR #8391](https://github.com/bitcoin/bitcoin/pull/8391)). * [`BIP 111`](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki): `NODE_BLOOM` service bit added, and enforced for all peer versions as of **v0.13.0** ([PR #6579](https://github.com/bitcoin/bitcoin/pull/6579) and [PR #6641](https://github.com/bitcoin/bitcoin/pull/6641)). * [`BIP 112`](https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki): The CHECKSEQUENCEVERIFY opcode has been implemented since **v0.12.1** ([PR #7524](https://github.com/bitcoin/bitcoin/pull/7524)) and has been activated since *block 419328*. * [`BIP 113`](https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki): Median time past lock-time calculations have been implemented since **v0.12.1** ([PR #6566](https://github.com/bitcoin/bitcoin/pull/6566)) and have been activated since *block 419328*. diff --git a/doc/build-osx.md b/doc/build-osx.md index a15bcd012c6..32d7dbd69e7 100644 --- a/doc/build-osx.md +++ b/doc/build-osx.md @@ -11,14 +11,14 @@ Install the OS X command line tools: When the popup appears, click `Install`. -Then install [Homebrew](http://brew.sh). +Then install [Homebrew](https://brew.sh). Dependencies ---------------------- - brew install automake berkeley-db4 libtool boost --c++11 miniupnpc openssl pkg-config protobuf --c++11 qt5 libevent + brew install automake berkeley-db4 libtool boost --c++11 miniupnpc openssl pkg-config protobuf qt libevent -In case you want to build the disk image with `make deploy` (.dmg / optional), you need RSVG +If you want to build the disk image with `make deploy` (.dmg / optional), you need RSVG brew install librsvg diff --git a/doc/build-unix.md b/doc/build-unix.md index 31a88a1b18c..b7eae2a630a 100644 --- a/doc/build-unix.md +++ b/doc/build-unix.md @@ -321,8 +321,10 @@ Clang is installed by default as `cc` compiler, this makes it easier to get started than on [OpenBSD](build-openbsd.md). Installing dependencies: pkg install autoconf automake libtool pkgconf - pkg install boost-libs openssl libevent2 + pkg install boost-libs openssl libevent + pkg install gmake +You need to use GNU make (`gmake`) instead of `make`. (`libressl` instead of `openssl` will also work) For the wallet (optional): @@ -338,7 +340,7 @@ Then build using: ./autogen.sh ./configure --with-incompatible-bdb BDB_CFLAGS="-I/usr/local/include/db5" BDB_LIBS="-L/usr/local/lib -ldb_cxx-5" - make + gmake *Note on debugging*: The version of `gdb` installed by default is [ancient and considered harmful](https://wiki.freebsd.org/GdbRetirement). It is not suitable for debugging a multi-threaded C++ program, not even for getting backtraces. Please install the package `gdb` and diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am index 5252ef4a19a..08ff4d6ac1d 100644 --- a/doc/man/Makefile.am +++ b/doc/man/Makefile.am @@ -1 +1,13 @@ -dist_man1_MANS=bitcoind.1 bitcoin-qt.1 bitcoin-cli.1 bitcoin-tx.1 +dist_man1_MANS= + +if BUILD_BITCOIND + dist_man1_MANS+=bitcoind.1 +endif + +if ENABLE_QT + dist_man1_MANS+=bitcoin-qt.1 +endif + +if BUILD_BITCOIN_UTILS + dist_man1_MANS+=bitcoin-cli.1 bitcoin-tx.1 +endif diff --git a/doc/man/bitcoin-cli.1 b/doc/man/bitcoin-cli.1 index 11b690cf856..77ee12f04a8 100644 --- a/doc/man/bitcoin-cli.1 +++ b/doc/man/bitcoin-cli.1 @@ -1,19 +1,17 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.5. -.TH BITCOIN-CLI "1" "September 2016" "bitcoin-cli v0.13.0.0" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH BITCOIN-CLI "1" "June 2017" "bitcoin-cli v0.14.2.0" "User Commands" .SH NAME -bitcoin-cli \- manual page for bitcoin-cli v0.13.0.0 +bitcoin-cli \- manual page for bitcoin-cli v0.14.2.0 .SH DESCRIPTION -Bitcoin Core RPC client version v0.13.0.0 +Bitcoin Core RPC client version v0.14.2.0 .SS "Usage:" .TP bitcoin\-cli [options] [params] Send command to Bitcoin Core -.TP -bitcoin\-cli [options] help -List commands -.TP -bitcoin\-cli [options] help -Get help for a command +.IP +bitcoin\-cli [options] \fB\-named\fR [name=value] ... Send command to Bitcoin Core (with named arguments) +bitcoin\-cli [options] help List commands +bitcoin\-cli [options] help Get help for a command .SH OPTIONS .HP \-? @@ -40,6 +38,10 @@ Enter regression test mode, which uses a special chain in which blocks can be solved instantly. This is intended for regression testing tools and app development. .HP +\fB\-named\fR +.IP +Pass named instead of positional arguments (default: false) +.HP \fB\-rpcconnect=\fR .IP Send commands to node running on (default: 127.0.0.1) @@ -69,7 +71,7 @@ Timeout during HTTP requests (default: 900) Read extra arguments from standard input, one per line until EOF/Ctrl\-D (recommended for sensitive information such as passphrases) .SH COPYRIGHT -Copyright (C) 2009-2016 The Bitcoin Core developers +Copyright (C) 2009-2017 The Bitcoin Core developers Please contribute if you find Bitcoin Core useful. Visit for further information about the software. @@ -77,8 +79,8 @@ The source code is available from . This is experimental software. Distributed under the MIT software license, see the accompanying file COPYING -or . +or This product includes software developed by the OpenSSL Project for use in the -OpenSSL Toolkit and cryptographic software written -by Eric Young and UPnP software written by Thomas Bernard. +OpenSSL Toolkit and cryptographic software written by +Eric Young and UPnP software written by Thomas Bernard. diff --git a/doc/man/bitcoin-qt.1 b/doc/man/bitcoin-qt.1 index 2129a151e2d..a51d4f63160 100644 --- a/doc/man/bitcoin-qt.1 +++ b/doc/man/bitcoin-qt.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.5. -.TH BITCOIN-QT "1" "September 2016" "bitcoin-qt v0.13.0.0" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH BITCOIN-QT "1" "June 2017" "bitcoin-qt v0.14.2.0" "User Commands" .SH NAME -bitcoin-qt \- manual page for bitcoin-qt v0.13.0.0 +bitcoin-qt \- manual page for bitcoin-qt v0.14.2.0 .SH DESCRIPTION -Bitcoin Core version v0.13.0.0 (64\-bit) +Bitcoin Core version v0.14.2.0 (64\-bit) Usage: .IP bitcoin\-qt [command\-line options] @@ -27,13 +27,14 @@ long fork (%s in cmd is replaced by message) Execute command when the best block changes (%s in cmd is replaced by block hash) .HP -\fB\-checkblocks=\fR +\fB\-assumevalid=\fR .IP -How many blocks to check at startup (default: 288, 0 = all) -.HP -\fB\-checklevel=\fR -.IP -How thorough the block verification of \fB\-checkblocks\fR is (0\-4, default: 3) +If this block is in the chain assume that it and its ancestors are valid +and potentially skip their script verification (0 to verify all, +default: +00000000000000000013176bf8d7dfeab4e1db31dc93bc311b436e82ab226b90, +testnet: +00000000000128796ee387cf110ccb9d2f36cffaf7f73079c995377c65ac0dcc) .HP \fB\-conf=\fR .IP @@ -45,7 +46,7 @@ Specify data directory .HP \fB\-dbcache=\fR .IP -Set database cache size in megabytes (4 to 16384, default: 300) +Set database cache size in megabytes (4 to 16384, default: 450) .HP \fB\-loadblock=\fR .IP @@ -62,11 +63,16 @@ Keep the transaction memory pool below megabytes (default: 300) \fB\-mempoolexpiry=\fR .IP Do not keep transactions in the mempool longer than hours (default: -72) +336) +.HP +\fB\-blockreconstructionextratxn=\fR +.IP +Extra transactions to keep in memory for compact block reconstructions +(default: 100) .HP \fB\-par=\fR .IP -Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 = +Set the number of script verification threads (\fB\-6\fR to 16, 0 = auto, <0 = leave that many cores free, default: 0) .HP \fB\-pid=\fR @@ -75,13 +81,15 @@ Specify pid file (default: bitcoind.pid) .HP \fB\-prune=\fR .IP -Reduce storage requirements by enabling pruning (deleting) of old blocks. -This allows the pruneblockchain RPC to be called to delete specific blocks, -and enables automatic pruning of old blocks if a target size in MiB is -provided. This mode is incompatible with \fB\-txindex\fR and \fB\-rescan\fR. -Warning: Reverting this setting requires re\-downloading the entire blockchain. -(default: 0 = disable pruning blocks, 1 = allow manual pruning via RPC, >550 = -automatically prune block files to stay under the specified target size in MiB) +Reduce storage requirements by enabling pruning (deleting) of old +blocks. This allows the pruneblockchain RPC to be called to +delete specific blocks, and enables automatic pruning of old +blocks if a target size in MiB is provided. This mode is +incompatible with \fB\-txindex\fR and \fB\-rescan\fR. Warning: Reverting this +setting requires re\-downloading the entire blockchain. (default: +0 = disable pruning blocks, 1 = allow manual pruning via RPC, +>550 = automatically prune block files to stay under the +specified target size in MiB) .HP \fB\-reindex\-chainstate\fR .IP @@ -123,7 +131,8 @@ for IPv6 .HP \fB\-connect=\fR .IP -Connect only to the specified node(s) +Connect only to the specified node(s); \fB\-noconnect\fR or \fB\-connect\fR=\fI\,0\/\fR alone to +disable automatic connections .HP \fB\-discover\fR .IP @@ -137,7 +146,7 @@ Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (def \fB\-dnsseed\fR .IP Query for peer addresses via DNS lookup, if low on addresses (default: 1 -unless \fB\-connect\fR) +unless \fB\-connect\fR/\-noconnect) .HP \fB\-externalip=\fR .IP @@ -149,7 +158,8 @@ Always query for peer addresses via DNS lookup (default: 0) .HP \fB\-listen\fR .IP -Accept connections from outside (default: 1 if no \fB\-proxy\fR or \fB\-connect\fR) +Accept connections from outside (default: 1 if no \fB\-proxy\fR or +\fB\-connect\fR/\-noconnect) .HP \fB\-listenonion\fR .IP @@ -204,6 +214,11 @@ Connect through SOCKS5 proxy Randomize credentials for every proxy connection. This enables Tor stream isolation (default: 1) .HP +\fB\-rpcserialversion\fR +.IP +Sets the serialization of raw transaction or block hex returned in +non\-verbose mode, non\-segwit(0) or segwit(1) (default: 1) +.HP \fB\-seednode=\fR .IP Connect to a node to retrieve peer addresses, and disconnect @@ -221,17 +236,22 @@ Tor control port to use if onion listening enabled (default: .IP Tor control port password (default: empty) .HP +\fB\-upnp\fR +.IP +Use UPnP to map the listening port (default: 0) +.HP \fB\-whitebind=\fR .IP Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6 .HP -\fB\-whitelist=\fR +\fB\-whitelist=\fR .IP -Whitelist peers connecting from the given netmask or IP address. Can be -specified multiple times. Whitelisted peers cannot be DoS banned -and their transactions are always relayed, even if they are -already in the mempool, useful e.g. for a gateway +Whitelist peers connecting from the given IP address (e.g. 1.2.3.4) or +CIDR notated network (e.g. 1.2.3.0/24). Can be specified multiple +times. Whitelisted peers cannot be DoS banned and their +transactions are always relayed, even if they are already in the +mempool, useful e.g. for a gateway .HP \fB\-whitelistrelay\fR .IP @@ -240,7 +260,7 @@ not relaying transactions (default: 1) .HP \fB\-whitelistforcerelay\fR .IP -Force relay of transactions from whitelisted peers even they violate +Force relay of transactions from whitelisted peers even if they violate local relay policy (default: 1) .HP \fB\-maxuploadtarget=\fR @@ -287,13 +307,17 @@ Spend unconfirmed change when sending transactions (default: 1) \fB\-txconfirmtarget=\fR .IP If paytxfee is not set, include enough fee so transactions begin -confirmation on average within n blocks (default: 2) +confirmation on average within n blocks (default: 6) .HP \fB\-usehd\fR .IP Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start (default: 1) .HP +\fB\-walletrbf\fR +.IP +Send transactions with full\-RBF opt\-in enabled (default: 0) +.HP \fB\-upgradewallet\fR .IP Upgrade wallet to latest format on startup @@ -347,9 +371,9 @@ Append comment to the user agent string Output debugging information (default: 0, supplying is optional). If is not supplied or if = 1, output all debugging information. can be: addrman, -alert, bench, coindb, db, http, libevent, lock, mempool, -mempoolrej, net, proxy, prune, rand, reindex, rpc, selectcoins, -tor, zmq, qt. +alert, bench, cmpctblock, coindb, db, http, libevent, lock, +mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, +selectcoins, tor, zmq, qt. .HP \fB\-help\-debug\fR .IP @@ -422,6 +446,11 @@ Set maximum block size in bytes (default: 750000) .IP Set maximum size of high\-priority/low\-fee transactions in bytes (default: 0) +.HP +\fB\-blockmintxfee=\fR +.IP +Set lowest fee rate (in BTC/kB) for transactions to be included in block +creation. (default: 0.00001) .PP RPC server options: .HP @@ -455,8 +484,10 @@ Password for JSON\-RPC connections .IP Username and hashed password for JSON\-RPC connections. The field comes in the format: :$. A -canonical python script is included in share/rpcuser. This option -can be specified multiple times +canonical python script is included in share/rpcuser. The client +then connects normally using the +rpcuser=/rpcpassword= pair of arguments. This +option can be specified multiple times .HP \fB\-rpcport=\fR .IP @@ -500,7 +531,7 @@ Show splash screen on startup (default: 1) .IP Reset all settings changed in the GUI .SH COPYRIGHT -Copyright (C) 2009-2016 The Bitcoin Core developers +Copyright (C) 2009-2017 The Bitcoin Core developers Please contribute if you find Bitcoin Core useful. Visit for further information about the software. @@ -508,8 +539,8 @@ The source code is available from . This is experimental software. Distributed under the MIT software license, see the accompanying file COPYING -or . +or This product includes software developed by the OpenSSL Project for use in the -OpenSSL Toolkit and cryptographic software written -by Eric Young and UPnP software written by Thomas Bernard. +OpenSSL Toolkit and cryptographic software written by +Eric Young and UPnP software written by Thomas Bernard. diff --git a/doc/man/bitcoin-tx.1 b/doc/man/bitcoin-tx.1 index 5c4e31e7f79..04ec7b95532 100644 --- a/doc/man/bitcoin-tx.1 +++ b/doc/man/bitcoin-tx.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.5. -.TH BITCOIN-TX "1" "September 2016" "bitcoin-tx v0.13.0.0" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH BITCOIN-TX "1" "June 2017" "bitcoin-tx v0.14.2.0" "User Commands" .SH NAME -bitcoin-tx \- manual page for bitcoin-tx v0.13.0.0 +bitcoin-tx \- manual page for bitcoin-tx v0.14.2.0 .SH DESCRIPTION -Bitcoin Core bitcoin\-tx utility version v0.13.0.0 +Bitcoin Core bitcoin\-tx utility version v0.14.2.0 .SS "Usage:" .TP bitcoin\-tx [options] [commands] @@ -67,13 +67,28 @@ outaddr=VALUE:ADDRESS .IP Add address\-based output to TX .IP +outpubkey=VALUE:PUBKEY[:FLAGS] +.IP +Add pay\-to\-pubkey output to TX. Optionally add the "W" flag to produce a +pay\-to\-witness\-pubkey\-hash output. Optionally add the "S" flag to +wrap the output in a pay\-to\-script\-hash. +.IP outdata=[VALUE:]DATA .IP Add data\-based output to TX .IP -outscript=VALUE:SCRIPT +outscript=VALUE:SCRIPT[:FLAGS] +.IP +Add raw script output to TX. Optionally add the "W" flag to produce a +pay\-to\-witness\-script\-hash output. Optionally add the "S" flag to +wrap the output in a pay\-to\-script\-hash. +.IP +outmultisig=VALUE:REQUIRED:PUBKEYS:PUBKEY1:PUBKEY2:....[:FLAGS] .IP -Add raw script output to TX +Add Pay To n\-of\-m Multi\-sig output to TX. n = REQUIRED, m = PUBKEYS. +Optionally add the "W" flag to produce a +pay\-to\-witness\-script\-hash output. Optionally add the "S" flag to +wrap the output in a pay\-to\-script\-hash. .IP sign=SIGHASH\-FLAGS .IP @@ -92,7 +107,7 @@ set=NAME:JSON\-STRING .IP Set register NAME to given JSON\-STRING .SH COPYRIGHT -Copyright (C) 2009-2016 The Bitcoin Core developers +Copyright (C) 2009-2017 The Bitcoin Core developers Please contribute if you find Bitcoin Core useful. Visit for further information about the software. @@ -100,8 +115,8 @@ The source code is available from . This is experimental software. Distributed under the MIT software license, see the accompanying file COPYING -or . +or This product includes software developed by the OpenSSL Project for use in the -OpenSSL Toolkit and cryptographic software written -by Eric Young and UPnP software written by Thomas Bernard. +OpenSSL Toolkit and cryptographic software written by +Eric Young and UPnP software written by Thomas Bernard. diff --git a/doc/man/bitcoind.1 b/doc/man/bitcoind.1 index 47539d81319..b3d8e0b9a33 100644 --- a/doc/man/bitcoind.1 +++ b/doc/man/bitcoind.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.5. -.TH BITCOIND "1" "September 2016" "bitcoind v0.13.0.0" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH BITCOIND "1" "June 2017" "bitcoind v0.14.2.0" "User Commands" .SH NAME -bitcoind \- manual page for bitcoind v0.13.0.0 +bitcoind \- manual page for bitcoind v0.14.2.0 .SH DESCRIPTION -Bitcoin Core Daemon version v0.13.0.0 +Bitcoin Core Daemon version v0.14.2.0 .SS "Usage:" .TP bitcoind [options] @@ -28,13 +28,14 @@ long fork (%s in cmd is replaced by message) Execute command when the best block changes (%s in cmd is replaced by block hash) .HP -\fB\-checkblocks=\fR +\fB\-assumevalid=\fR .IP -How many blocks to check at startup (default: 288, 0 = all) -.HP -\fB\-checklevel=\fR -.IP -How thorough the block verification of \fB\-checkblocks\fR is (0\-4, default: 3) +If this block is in the chain assume that it and its ancestors are valid +and potentially skip their script verification (0 to verify all, +default: +00000000000000000013176bf8d7dfeab4e1db31dc93bc311b436e82ab226b90, +testnet: +00000000000128796ee387cf110ccb9d2f36cffaf7f73079c995377c65ac0dcc) .HP \fB\-conf=\fR .IP @@ -50,7 +51,7 @@ Specify data directory .HP \fB\-dbcache=\fR .IP -Set database cache size in megabytes (4 to 16384, default: 300) +Set database cache size in megabytes (4 to 16384, default: 450) .HP \fB\-loadblock=\fR .IP @@ -67,11 +68,16 @@ Keep the transaction memory pool below megabytes (default: 300) \fB\-mempoolexpiry=\fR .IP Do not keep transactions in the mempool longer than hours (default: -72) +336) +.HP +\fB\-blockreconstructionextratxn=\fR +.IP +Extra transactions to keep in memory for compact block reconstructions +(default: 100) .HP \fB\-par=\fR .IP -Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 = +Set the number of script verification threads (\fB\-6\fR to 16, 0 = auto, <0 = leave that many cores free, default: 0) .HP \fB\-pid=\fR @@ -80,13 +86,15 @@ Specify pid file (default: bitcoind.pid) .HP \fB\-prune=\fR .IP -Reduce storage requirements by enabling pruning (deleting) of old blocks. -This allows the pruneblockchain RPC to be called to delete specific blocks, -and enables automatic pruning of old blocks if a target size in MiB is -provided. This mode is incompatible with \fB\-txindex\fR and \fB\-rescan\fR. -Warning: Reverting this setting requires re\-downloading the entire blockchain. -(default: 0 = disable pruning blocks, 1 = allow manual pruning via RPC, >550 = -automatically prune block files to stay under the specified target size in MiB) +Reduce storage requirements by enabling pruning (deleting) of old +blocks. This allows the pruneblockchain RPC to be called to +delete specific blocks, and enables automatic pruning of old +blocks if a target size in MiB is provided. This mode is +incompatible with \fB\-txindex\fR and \fB\-rescan\fR. Warning: Reverting this +setting requires re\-downloading the entire blockchain. (default: +0 = disable pruning blocks, 1 = allow manual pruning via RPC, +>550 = automatically prune block files to stay under the +specified target size in MiB) .HP \fB\-reindex\-chainstate\fR .IP @@ -128,7 +136,8 @@ for IPv6 .HP \fB\-connect=\fR .IP -Connect only to the specified node(s) +Connect only to the specified node(s); \fB\-noconnect\fR or \fB\-connect\fR=\fI\,0\/\fR alone to +disable automatic connections .HP \fB\-discover\fR .IP @@ -142,7 +151,7 @@ Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (def \fB\-dnsseed\fR .IP Query for peer addresses via DNS lookup, if low on addresses (default: 1 -unless \fB\-connect\fR) +unless \fB\-connect\fR/\-noconnect) .HP \fB\-externalip=\fR .IP @@ -154,7 +163,8 @@ Always query for peer addresses via DNS lookup (default: 0) .HP \fB\-listen\fR .IP -Accept connections from outside (default: 1 if no \fB\-proxy\fR or \fB\-connect\fR) +Accept connections from outside (default: 1 if no \fB\-proxy\fR or +\fB\-connect\fR/\-noconnect) .HP \fB\-listenonion\fR .IP @@ -209,6 +219,11 @@ Connect through SOCKS5 proxy Randomize credentials for every proxy connection. This enables Tor stream isolation (default: 1) .HP +\fB\-rpcserialversion\fR +.IP +Sets the serialization of raw transaction or block hex returned in +non\-verbose mode, non\-segwit(0) or segwit(1) (default: 1) +.HP \fB\-seednode=\fR .IP Connect to a node to retrieve peer addresses, and disconnect @@ -226,17 +241,22 @@ Tor control port to use if onion listening enabled (default: .IP Tor control port password (default: empty) .HP +\fB\-upnp\fR +.IP +Use UPnP to map the listening port (default: 0) +.HP \fB\-whitebind=\fR .IP Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6 .HP -\fB\-whitelist=\fR +\fB\-whitelist=\fR .IP -Whitelist peers connecting from the given netmask or IP address. Can be -specified multiple times. Whitelisted peers cannot be DoS banned -and their transactions are always relayed, even if they are -already in the mempool, useful e.g. for a gateway +Whitelist peers connecting from the given IP address (e.g. 1.2.3.4) or +CIDR notated network (e.g. 1.2.3.0/24). Can be specified multiple +times. Whitelisted peers cannot be DoS banned and their +transactions are always relayed, even if they are already in the +mempool, useful e.g. for a gateway .HP \fB\-whitelistrelay\fR .IP @@ -245,7 +265,7 @@ not relaying transactions (default: 1) .HP \fB\-whitelistforcerelay\fR .IP -Force relay of transactions from whitelisted peers even they violate +Force relay of transactions from whitelisted peers even if they violate local relay policy (default: 1) .HP \fB\-maxuploadtarget=\fR @@ -292,13 +312,17 @@ Spend unconfirmed change when sending transactions (default: 1) \fB\-txconfirmtarget=\fR .IP If paytxfee is not set, include enough fee so transactions begin -confirmation on average within n blocks (default: 2) +confirmation on average within n blocks (default: 6) .HP \fB\-usehd\fR .IP Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start (default: 1) .HP +\fB\-walletrbf\fR +.IP +Send transactions with full\-RBF opt\-in enabled (default: 0) +.HP \fB\-upgradewallet\fR .IP Upgrade wallet to latest format on startup @@ -352,9 +376,9 @@ Append comment to the user agent string Output debugging information (default: 0, supplying is optional). If is not supplied or if = 1, output all debugging information. can be: addrman, -alert, bench, coindb, db, http, libevent, lock, mempool, -mempoolrej, net, proxy, prune, rand, reindex, rpc, selectcoins, -tor, zmq. +alert, bench, cmpctblock, coindb, db, http, libevent, lock, +mempool, mempoolrej, net, proxy, prune, rand, reindex, rpc, +selectcoins, tor, zmq. .HP \fB\-help\-debug\fR .IP @@ -427,6 +451,11 @@ Set maximum block size in bytes (default: 750000) .IP Set maximum size of high\-priority/low\-fee transactions in bytes (default: 0) +.HP +\fB\-blockmintxfee=\fR +.IP +Set lowest fee rate (in BTC/kB) for transactions to be included in block +creation. (default: 0.00001) .PP RPC server options: .HP @@ -460,8 +489,10 @@ Password for JSON\-RPC connections .IP Username and hashed password for JSON\-RPC connections. The field comes in the format: :$. A -canonical python script is included in share/rpcuser. This option -can be specified multiple times +canonical python script is included in share/rpcuser. The client +then connects normally using the +rpcuser=/rpcpassword= pair of arguments. This +option can be specified multiple times .HP \fB\-rpcport=\fR .IP @@ -479,7 +510,7 @@ option can be specified multiple times .IP Set the number of threads to service RPC calls (default: 4) .SH COPYRIGHT -Copyright (C) 2009-2016 The Bitcoin Core developers +Copyright (C) 2009-2017 The Bitcoin Core developers Please contribute if you find Bitcoin Core useful. Visit for further information about the software. @@ -487,8 +518,8 @@ The source code is available from . This is experimental software. Distributed under the MIT software license, see the accompanying file COPYING -or . +or This product includes software developed by the OpenSSL Project for use in the -OpenSSL Toolkit and cryptographic software written -by Eric Young and UPnP software written by Thomas Bernard. +OpenSSL Toolkit and cryptographic software written by +Eric Young and UPnP software written by Thomas Bernard. diff --git a/doc/release-notes.md b/doc/release-notes.md index 0ea9e1949e3..9c8c62d1bd9 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -1,12 +1,9 @@ -(note: this is a temporary file, to be added-to by anybody, and moved to -release-notes at release time) +Bitcoin Core version 0.14.2 is now available from: -Bitcoin Core version *version* is now available from: + - - -This is a new major version release, including new features, various bugfixes -and performance improvements, as well as updated translations. +This is a new minor version release, including various bugfixes and +performance improvements, as well as updated translations. Please report bugs using the issue tracker at github: @@ -22,9 +19,9 @@ Compatibility Bitcoin Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.8+, and Windows Vista and later. -Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support). +Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), No attempt is made to prevent installing or running the software on Windows XP, you -can still do so at your own risk but be aware that there are known instabilities. +can still do so at your own risk but be aware that there are known instabilities and issues. Please do not report issues about Windows XP to the issue tracker. Bitcoin Core should also work on most other Unix-like systems but is not @@ -34,71 +31,79 @@ Notable changes =============== Low-level RPC changes ----------------------- - -- `importprunedfunds` only accepts two required arguments. Some versions accept - an optional third arg, which was always ignored. Make sure to never pass more - than two arguments. - -Fee Estimation Changes ----------------------- - -- Since 0.13.2 fee estimation for a confirmation target of 1 block has been - disabled. This is only a minor behavior change as there was often insufficient - data for this target anyway. `estimatefee 1` will now always return -1 and - `estimatesmartfee 1` will start searching at a target of 2. - -- The default target for fee estimation is changed to 6 blocks in both the GUI - (previously 25) and for RPC calls (previously 2). - -Removal of Priority Estimation -------------------------------- - -- Estimation of "priority" needed for a transaction to be included within a target - number of blocks has been removed. The rpc calls are deprecated and will either - return -1 or 1e24 appropriately. The format for `fee_estimates.dat` has also - changed to no longer save these priority estimates. It will automatically be - converted to the new format which is not readable by prior versions of the - software. - -- The concept of "priority" (coin age) transactions is planned to be removed in - the next major version. To prepare for this, the default for the rate limit of - priority transactions (`-limitfreerelay`) has been set to `0` kB/minute. This - is not to be confused with the `prioritisetransaction` RPC which will remain - supported for adding fee deltas to transactions. - -P2P connection management --------------------------- - -- Peers manually added through the addnode option or addnode RPC now have their own - limit of eight connections which does not compete with other inbound or outbound - connection usage and is not subject to the maxconnections limitation. - -- New connections to manually added peers are much faster. - -Introduction of assumed-valid blocks -------------------------------------- - -- A significant portion of the initial block download time is spent verifying - scripts/signatures. Although the verification must pass to ensure the security - of the system, no other result from this verification is needed: If the node - knew the history of a given block were valid it could skip checking scripts - for its ancestors. - -- A new configuration option 'assumevalid' is provided to express this knowledge - to the software. Unlike the 'checkpoints' in the past this setting does not - force the use of a particular chain: chains that are consistent with it are - processed quicker, but other chains are still accepted if they'd otherwise - be chosen as best. Also unlike 'checkpoints' the user can configure which - block history is assumed true, this means that even outdated software can - sync more quickly if the setting is updated by the user. - -- Because the validity of a chain history is a simple objective fact it is much - easier to review this setting. As a result the software ships with a default - value adjusted to match the current chain shortly before release. The use - of this default value can be disabled by setting -assumevalid=0 - -0.14.0 Change log +--------------------- + +- Error codes have been updated to be more accurate for the following error cases: + - `getblock` now returns RPC_MISC_ERROR if the block can't be found on disk (for + example if the block has been pruned). Previously returned RPC_INTERNAL_ERROR. + - `pruneblockchain` now returns RPC_MISC_ERROR if the blocks cannot be pruned + because the node is not in pruned mode. Previously returned RPC_METHOD_NOT_FOUND. + - `pruneblockchain` now returns RPC_INVALID_PARAMETER if the blocks cannot be pruned + because the supplied timestamp is too late. Previously returned RPC_INTERNAL_ERROR. + - `pruneblockchain` now returns RPC_MISC_ERROR if the blocks cannot be pruned + because the blockchain is too short. Previously returned RPC_INTERNAL_ERROR. + - `setban` now returns RPC_CLIENT_INVALID_IP_OR_SUBNET if the supplied IP address + or subnet is invalid. Previously returned RPC_CLIENT_NODE_ALREADY_ADDED. + - `setban` now returns RPC_CLIENT_INVALID_IP_OR_SUBNET if the user tries to unban + a node that has not previously been banned. Previously returned RPC_MISC_ERROR. + - `removeprunedfunds` now returns RPC_WALLET_ERROR if bitcoind is unable to remove + the transaction. Previously returned RPC_INTERNAL_ERROR. + - `removeprunedfunds` now returns RPC_INVALID_PARAMETER if the transaction does not + exist in the wallet. Previously returned RPC_INTERNAL_ERROR. + - `fundrawtransaction` now returns RPC_INVALID_ADDRESS_OR_KEY if an invalid change + address is provided. Previously returned RPC_INVALID_PARAMETER. + - `fundrawtransaction` now returns RPC_WALLET_ERROR if bitcoind is unable to create + the transaction. The error message provides further details. Previously returned + RPC_INTERNAL_ERROR. + - `bumpfee` now returns RPC_INVALID_PARAMETER if the provided transaction has + descendants in the wallet. Previously returned RPC_MISC_ERROR. + - `bumpfee` now returns RPC_INVALID_PARAMETER if the provided transaction has + descendants in the mempool. Previously returned RPC_MISC_ERROR. + - `bumpfee` now returns RPC_WALLET_ERROR if the provided transaction has + has been mined or conflicts with a mined transaction. Previously returned + RPC_INVALID_ADDRESS_OR_KEY. + - `bumpfee` now returns RPC_WALLET_ERROR if the provided transaction is not + BIP 125 replaceable. Previously returned RPC_INVALID_ADDRESS_OR_KEY. + - `bumpfee` now returns RPC_WALLET_ERROR if the provided transaction has already + been bumped by a different transaction. Previously returned RPC_INVALID_REQUEST. + - `bumpfee` now returns RPC_WALLET_ERROR if the provided transaction contains + inputs which don't belong to this wallet. Previously returned RPC_INVALID_ADDRESS_OR_KEY. + - `bumpfee` now returns RPC_WALLET_ERROR if the provided transaction has multiple change + outputs. Previously returned RPC_MISC_ERROR. + - `bumpfee` now returns RPC_WALLET_ERROR if the provided transaction has no change + output. Previously returned RPC_MISC_ERROR. + - `bumpfee` now returns RPC_WALLET_ERROR if the fee is too high. Previously returned + RPC_MISC_ERROR. + - `bumpfee` now returns RPC_WALLET_ERROR if the fee is too low. Previously returned + RPC_MISC_ERROR. + - `bumpfee` now returns RPC_WALLET_ERROR if the change output is too small to bump the + fee. Previously returned RPC_MISC_ERROR. + +miniupnp CVE-2017-8798 +---------------------------- + +Bundled miniupnpc was updated to 2.0.20170509. This fixes an integer signedness error +(present in MiniUPnPc v1.4.20101221 through v2.0) that allows remote attackers +(within the LAN) to cause a denial of service or possibly have unspecified +other impact. + +This only affects users that have explicitly enabled UPnP through the GUI +setting or through the `-upnp` option, as since the last UPnP vulnerability +(in Bitcoin Core 0.10.3) it has been disabled by default. + +If you use this option, it is recommended to upgrade to this version as soon as +possible. + +Known Bugs +========== + +Since 0.14.0 the approximate transaction fee shown in Bitcoin-Qt when using coin +control and smart fee estimation does not reflect any change in target from the +smart fee slider. It will only present an approximate fee calculated using the +default target. The fee calculated using the correct target is still applied to +the transaction and shown in the final send confirmation dialog. + +0.14.2 Change log ================= Detailed release notes follow. This overview includes changes that affect @@ -106,48 +111,41 @@ behavior, not code moves, refactors and string updates. For convenience in locat the code changes and accompanying discussion, both the pull request and git merge commit are mentioned. -### RPC and REST - -UTXO set query (`GET /rest/getutxos//-/-/.../-.`) responses -were changed to return status code HTTP_BAD_REQUEST (400) instead of HTTP_INTERNAL_SERVER_ERROR (500) when requests -contain invalid parameters. - -The first boolean argument to `getaddednodeinfo` has been removed. This is an incompatible change. - -Call "getmininginfo" loses the "testnet" field in favor of the more generic "chain" (which has been present for years). - -### Configuration and command-line options - -### Block and transaction handling +### RPC and other APIs +- #10410 `321419b` Fix importwallet edge case rescan bug (ryanofsky) ### P2P protocol and network code - -### Validation +- #10424 `37a8fc5` Populate services in GetLocalAddress (morcos) +- #10441 `9e3ad50` Only enforce expected services for half of outgoing connections (theuni) ### Build system +- #10414 `ffb0c4b` miniupnpc 2.0.20170509 (fanquake) +- #10228 `ae479bc` Regenerate bitcoin-config.h as necessary (theuni) -### Wallet - -0.14.0 Fundrawtransaction change address reuse -============================================== - -Before 0.14, `fundrawtransaction` was by default wallet stateless. In almost all cases `fundrawtransaction` does add a change-output to the outputs of the funded transaction. Before 0.14, the used keypool key was never marked as change-address key and directly returned to the keypool (leading to address reuse). -Before 0.14, calling `getnewaddress` directly after `fundrawtransaction` did generate the same address as the change-output address. - -Since 0.14, fundrawtransaction does reserve the change-output-key from the keypool by default (optional by setting `reserveChangeKey`, default = `true`) - -Users should also consider using `getrawchangeaddress()` in conjunction with `fundrawtransaction`'s `changeAddress` option. +### Miscellaneous +- #10245 `44a17f2` Minor fix in build documentation for FreeBSD 11 (shigeya) +- #10215 `0aee4a1` Check interruptNet during dnsseed lookups (TheBlueMatt) ### GUI +- #10231 `1e936d7` Reduce a significant cs_main lock freeze (jonasschnelli) -### Tests - -### Miscellaneous +### Wallet +- #10294 `1847642` Unset change position when there is no change (instagibbs) Credits ======= Thanks to everyone who directly contributed to this release: +- Alex Morcos +- Cory Fields +- fanquake +- Gregory Sanders +- Jonas Schnelli +- Matt Corallo +- Russell Yanofsky +- Shigeya Suzuki +- Wladimir J. van der Laan As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). + diff --git a/doc/release-notes/release-notes-0.14.1.md b/doc/release-notes/release-notes-0.14.1.md new file mode 100644 index 00000000000..ef072afd4d7 --- /dev/null +++ b/doc/release-notes/release-notes-0.14.1.md @@ -0,0 +1,143 @@ +Bitcoin Core version 0.14.1 is now available from: + + + +This is a new minor version release, including various bugfixes and +performance improvements, as well as updated translations. + +Please report bugs using the issue tracker at github: + + + +To receive security and update notifications, please subscribe to: + + + +Compatibility +============== + +Bitcoin Core is extensively tested on multiple operating systems using +the Linux kernel, macOS 10.8+, and Windows Vista and later. + +Microsoft ended support for Windows XP on [April 8th, 2014](https://www.microsoft.com/en-us/WindowsForBusiness/end-of-xp-support), +No attempt is made to prevent installing or running the software on Windows XP, you +can still do so at your own risk but be aware that there are known instabilities and issues. +Please do not report issues about Windows XP to the issue tracker. + +Bitcoin Core should also work on most other Unix-like systems but is not +frequently tested on them. + +Notable changes +=============== + +RPC changes +----------- + +- The first positional argument of `createrawtransaction` was renamed from + `transactions` to `inputs`. + +- The argument of `disconnectnode` was renamed from `node` to `address`. + +These interface changes break compatibility with 0.14.0, when the named +arguments functionality, introduced in 0.14.0, is used. Client software +using these calls with named arguments needs to be updated. + +Mining +------ + +In previous versions, getblocktemplate required segwit support from downstream +clients/miners once the feature activated on the network. In this version, it +now supports non-segwit clients even after activation, by removing all segwit +transactions from the returned block template. This allows non-segwit miners to +continue functioning correctly even after segwit has activated. + +Due to the limitations in previous versions, getblocktemplate also recommended +non-segwit clients to not signal for the segwit version-bit. Since this is no +longer an issue, getblocktemplate now always recommends signalling segwit for +all miners. This is safe because ability to enforce the rule is the only +required criteria for safe activation, not actually producing segwit-enabled +blocks. + +UTXO memory accounting +---------------------- + +Memory usage for the UTXO cache is being calculated more accurately, so that +the configured limit (`-dbcache`) will be respected when memory usage peaks +during cache flushes. The memory accounting in prior releases is estimated to +only account for half the actual peak utilization. + +The default `-dbcache` has also been changed in this release to 450MiB. Users +who currently set `-dbcache` to a high value (e.g. to keep the UTXO more fully +cached in memory) should consider increasing this setting in order to achieve +the same cache performance as prior releases. Users on low-memory systems +(such as systems with 1GB or less) should consider specifying a lower value for +this parameter. + +Additional information relating to running on low-memory systems can be found +here: +[reducing-bitcoind-memory-usage.md](https://gist.github.com/laanwj/efe29c7661ce9b6620a7). + +0.14.1 Change log +================= + +Detailed release notes follow. This overview includes changes that affect +behavior, not code moves, refactors and string updates. For convenience in locating +the code changes and accompanying discussion, both the pull request and +git merge commit are mentioned. + +### RPC and other APIs +- #10084 `142fbb2` Rename first named arg of createrawtransaction (MarcoFalke) +- #10139 `f15268d` Remove auth cookie on shutdown (practicalswift) +- #10146 `2fea10a` Better error handling for submitblock (rawodb, gmaxwell) +- #10144 `d947afc` Prioritisetransaction wasn't always updating ancestor fee (sdaftuar) +- #10204 `3c79602` Rename disconnectnode argument (jnewbery) + +### Block and transaction handling +- #10126 `0b5e162` Compensate for memory peak at flush time (sipa) +- #9912 `fc3d7db` Optimize GetWitnessHash() for non-segwit transactions (sdaftuar) +- #10133 `ab864d3` Clean up calculations of pcoinsTip memory usage (morcos) + +### P2P protocol and network code +- #9953/#10013 `d2548a4` Fix shutdown hang with >= 8 -addnodes set (TheBlueMatt) +- #10176 `30fa231` net: gracefully handle NodeId wrapping (theuni) + +### Build system +- #9973 `e9611d1` depends: fix zlib build on osx (theuni) + +### GUI +- #10060 `ddc2dd1` Ensure an item exists on the rpcconsole stack before adding (achow101) + +### Mining +- #9955/#10006 `569596c` Don't require segwit in getblocktemplate for segwit signalling or mining (sdaftuar) +- #9959/#10127 `b5c3440` Prevent slowdown in CreateNewBlock on large mempools (sdaftuar) + +### Tests and QA +- #10157 `55f641c` Fix the `mempool_packages.py` test (sdaftuar) + +### Miscellaneous +- #10037 `4d8e660` Trivial: Fix typo in help getrawtransaction RPC (keystrike) +- #10120 `e4c9a90` util: Work around (virtual) memory exhaustion on 32-bit w/ glibc (laanwj) +- #10130 `ecc5232` bitcoin-tx input verification (awemany, jnewbery) + +Credits +======= + +Thanks to everyone who directly contributed to this release: + +- Alex Morcos +- Andrew Chow +- Awemany +- Cory Fields +- Gregory Maxwell +- James Evans +- John Newbery +- MarcoFalke +- Matt Corallo +- Pieter Wuille +- practicalswift +- rawodb +- Suhas Daftuar +- Wladimir J. van der Laan + +As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/). + diff --git a/qa/rpc-tests/bumpfee.py b/qa/rpc-tests/bumpfee.py index ac282796c14..7ed2beb176e 100755 --- a/qa/rpc-tests/bumpfee.py +++ b/qa/rpc-tests/bumpfee.py @@ -129,7 +129,7 @@ def test_segwit_bumpfee_succeeds(rbf_node, dest_address): def test_nonrbf_bumpfee_fails(peer_node, dest_address): # cannot replace a non RBF transaction (from node which did not enable RBF) not_rbfid = create_fund_sign_send(peer_node, {dest_address: 0.00090000}) - assert_raises_message(JSONRPCException, "not BIP 125 replaceable", peer_node.bumpfee, not_rbfid) + assert_raises_jsonrpc(-4, "not BIP 125 replaceable", peer_node.bumpfee, not_rbfid) def test_notmine_bumpfee_fails(rbf_node, peer_node, dest_address): @@ -149,7 +149,7 @@ def test_notmine_bumpfee_fails(rbf_node, peer_node, dest_address): signedtx = rbf_node.signrawtransaction(rawtx) signedtx = peer_node.signrawtransaction(signedtx["hex"]) rbfid = rbf_node.sendrawtransaction(signedtx["hex"]) - assert_raises_message(JSONRPCException, "Transaction contains inputs that don't belong to this wallet", + assert_raises_jsonrpc(-4, "Transaction contains inputs that don't belong to this wallet", rbf_node.bumpfee, rbfid) @@ -160,7 +160,7 @@ def test_bumpfee_with_descendant_fails(rbf_node, rbf_node_address, dest_address) tx = rbf_node.createrawtransaction([{"txid": parent_id, "vout": 0}], {dest_address: 0.00020000}) tx = rbf_node.signrawtransaction(tx) txid = rbf_node.sendrawtransaction(tx["hex"]) - assert_raises_message(JSONRPCException, "Transaction has descendants in the wallet", rbf_node.bumpfee, parent_id) + assert_raises_jsonrpc(-8, "Transaction has descendants in the wallet", rbf_node.bumpfee, parent_id) def test_small_output_fails(rbf_node, dest_address): @@ -175,7 +175,7 @@ def test_small_output_fails(rbf_node, dest_address): Decimal("0.00100000"), {dest_address: 0.00080000, get_change_address(rbf_node): Decimal("0.00010000")}) - assert_raises_message(JSONRPCException, "Change output is too small", rbf_node.bumpfee, rbfid, {"totalFee": 20001}) + assert_raises_jsonrpc(-4, "Change output is too small", rbf_node.bumpfee, rbfid, {"totalFee": 20001}) def test_dust_to_fee(rbf_node, dest_address): @@ -210,7 +210,7 @@ def test_rebumping(rbf_node, dest_address): rbf_node.settxfee(Decimal("0.00001000")) rbfid = create_fund_sign_send(rbf_node, {dest_address: 0.00090000}) bumped = rbf_node.bumpfee(rbfid, {"totalFee": 1000}) - assert_raises_message(JSONRPCException, "already bumped", rbf_node.bumpfee, rbfid, {"totalFee": 2000}) + assert_raises_jsonrpc(-4, "already bumped", rbf_node.bumpfee, rbfid, {"totalFee": 2000}) rbf_node.bumpfee(bumped["txid"], {"totalFee": 2000}) @@ -218,7 +218,7 @@ def test_rebumping_not_replaceable(rbf_node, dest_address): # check that re-bumping a non-replaceable bump tx fails rbfid = create_fund_sign_send(rbf_node, {dest_address: 0.00090000}) bumped = rbf_node.bumpfee(rbfid, {"totalFee": 10000, "replaceable": False}) - assert_raises_message(JSONRPCException, "Transaction is not BIP 125 replaceable", rbf_node.bumpfee, bumped["txid"], + assert_raises_jsonrpc(-4, "Transaction is not BIP 125 replaceable", rbf_node.bumpfee, bumped["txid"], {"totalFee": 20000}) @@ -269,7 +269,7 @@ def test_bumpfee_metadata(rbf_node, dest_address): def test_locked_wallet_fails(rbf_node, dest_address): rbfid = create_fund_sign_send(rbf_node, {dest_address: 0.00090000}) rbf_node.walletlock() - assert_raises_message(JSONRPCException, "Please enter the wallet passphrase with walletpassphrase first.", + assert_raises_jsonrpc(-13, "Please enter the wallet passphrase with walletpassphrase first.", rbf_node.bumpfee, rbfid) @@ -316,9 +316,7 @@ def submit_block_with_tx(node, tx): block.rehash() block.hashMerkleRoot = block.calc_merkle_root() block.solve() - error = node.submitblock(bytes_to_hex_str(block.serialize(True))) - if error is not None: - raise Exception(error) + node.submitblock(bytes_to_hex_str(block.serialize(True))) return block diff --git a/qa/rpc-tests/fundrawtransaction.py b/qa/rpc-tests/fundrawtransaction.py index 7396ba46a4f..511faf740eb 100755 --- a/qa/rpc-tests/fundrawtransaction.py +++ b/qa/rpc-tests/fundrawtransaction.py @@ -54,6 +54,11 @@ def run_test(self): self.nodes[0].generate(121) self.sync_all() + # ensure that setting changePosition in fundraw with an exact match is handled properly + rawmatch = self.nodes[2].createrawtransaction([], {self.nodes[2].getnewaddress():50}) + rawmatch = self.nodes[2].fundrawtransaction(rawmatch, {"changePosition":1, "subtractFeeFromOutputs":[0]}) + assert_equal(rawmatch["changepos"], -1) + watchonly_address = self.nodes[0].getnewaddress() watchonly_pubkey = self.nodes[0].validateaddress(watchonly_address)["pubkey"] watchonly_amount = Decimal(200) @@ -181,12 +186,7 @@ def run_test(self): dec_tx = self.nodes[2].decoderawtransaction(rawtx) assert_equal(utx['txid'], dec_tx['vin'][0]['txid']) - try: - self.nodes[2].fundrawtransaction(rawtx, {'foo': 'bar'}) - raise AssertionError("Accepted invalid option foo") - except JSONRPCException as e: - assert("Unexpected key foo" in e.error['message']) - + assert_raises_jsonrpc(-3, "Unexpected key foo", self.nodes[2].fundrawtransaction, rawtx, {'foo':'bar'}) ############################################################ # test a fundrawtransaction with an invalid change address # @@ -199,12 +199,7 @@ def run_test(self): dec_tx = self.nodes[2].decoderawtransaction(rawtx) assert_equal(utx['txid'], dec_tx['vin'][0]['txid']) - try: - self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': 'foobar'}) - raise AssertionError("Accepted invalid bitcoin address") - except JSONRPCException as e: - assert("changeAddress must be a valid bitcoin address" in e.error['message']) - + assert_raises_jsonrpc(-5, "changeAddress must be a valid bitcoin address", self.nodes[2].fundrawtransaction, rawtx, {'changeAddress':'foobar'}) ############################################################ # test a fundrawtransaction with a provided change address # @@ -218,12 +213,7 @@ def run_test(self): assert_equal(utx['txid'], dec_tx['vin'][0]['txid']) change = self.nodes[2].getnewaddress() - try: - rawtxfund = self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': change, 'changePosition': 2}) - except JSONRPCException as e: - assert('changePosition out of bounds' == e.error['message']) - else: - assert(False) + assert_raises_jsonrpc(-8, "changePosition out of bounds", self.nodes[2].fundrawtransaction, rawtx, {'changeAddress':change, 'changePosition':2}) rawtxfund = self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': change, 'changePosition': 0}) dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex']) out = dec_tx['vout'][0] @@ -332,12 +322,7 @@ def run_test(self): rawtx = self.nodes[2].createrawtransaction(inputs, outputs) dec_tx = self.nodes[2].decoderawtransaction(rawtx) - try: - rawtxfund = self.nodes[2].fundrawtransaction(rawtx) - raise AssertionError("Spent more than available") - except JSONRPCException as e: - assert("Insufficient" in e.error['message']) - + assert_raises_jsonrpc(-4, "Insufficient funds", self.nodes[2].fundrawtransaction, rawtx) ############################################################ #compare fee of a standard pubkeyhash transaction @@ -469,7 +454,9 @@ def run_test(self): # locked wallet test self.nodes[1].encryptwallet("test") self.nodes.pop(1) - stop_nodes(self.nodes) + stop_node(self.nodes[0], 0) + stop_node(self.nodes[1], 2) + stop_node(self.nodes[2], 3) self.nodes = start_nodes(self.num_nodes, self.options.tmpdir) # This test is not meant to test fee estimation and we'd like @@ -491,21 +478,13 @@ def run_test(self): rawTx = self.nodes[1].createrawtransaction(inputs, outputs) # fund a transaction that requires a new key for the change output # creating the key must be impossible because the wallet is locked - try: - fundedTx = self.nodes[1].fundrawtransaction(rawTx) - raise AssertionError("Wallet unlocked without passphrase") - except JSONRPCException as e: - assert('Keypool ran out' in e.error['message']) + assert_raises_jsonrpc(-4, "Insufficient funds", self.nodes[1].fundrawtransaction, rawtx) #refill the keypool self.nodes[1].walletpassphrase("test", 100) self.nodes[1].walletlock() - try: - self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1.2) - raise AssertionError("Wallet unlocked without passphrase") - except JSONRPCException as e: - assert('walletpassphrase' in e.error['message']) + assert_raises_jsonrpc(-13, "walletpassphrase", self.nodes[1].sendtoaddress, self.nodes[0].getnewaddress(), 1.2) oldBalance = self.nodes[0].getbalance() diff --git a/qa/rpc-tests/import-rescan.py b/qa/rpc-tests/import-rescan.py index 54cc6d2642a..7f2c321746c 100755 --- a/qa/rpc-tests/import-rescan.py +++ b/qa/rpc-tests/import-rescan.py @@ -5,11 +5,11 @@ """Test rescan behavior of importaddress, importpubkey, importprivkey, and importmulti RPCs with different types of keys and rescan options. -In the first part of the test, node 0 creates an address for each type of -import RPC call and sends BTC to it. Then other nodes import the addresses, -and the test makes listtransactions and getbalance calls to confirm that the -importing node either did or did not execute rescans picking up the send -transactions. +In the first part of the test, node 1 creates an address for each type of +import RPC call and node 0 sends BTC to it. Then other nodes import the +addresses, and the test makes listtransactions and getbalance calls to confirm +that the importing node either did or did not execute rescans picking up the +send transactions. In the second part of the test, node 0 sends more BTC to each address, and the test makes more listtransactions and getbalance calls to confirm that the @@ -81,6 +81,12 @@ def check(self, txid=None, amount=None, confirmations=None): assert_equal(tx["txid"], txid) assert_equal(tx["confirmations"], confirmations) assert_equal("trusted" not in tx, True) + # Verify the transaction is correctly marked watchonly depending on + # whether the transaction pays to an imported public key or + # imported private key. The test setup ensures that transaction + # inputs will not be from watchonly keys (important because + # involvesWatchonly will be true if either the transaction output + # or inputs are watchonly). if self.data != Data.priv: assert_equal(tx["involvesWatchonly"], True) else: @@ -106,11 +112,11 @@ def check(self, txid=None, amount=None, confirmations=None): class ImportRescanTest(BitcoinTestFramework): def __init__(self): super().__init__() - self.num_nodes = 1 + len(IMPORT_NODES) + self.num_nodes = 2 + len(IMPORT_NODES) def setup_network(self): extra_args = [["-debug=1"] for _ in range(self.num_nodes)] - for i, import_node in enumerate(IMPORT_NODES, 1): + for i, import_node in enumerate(IMPORT_NODES, 2): if import_node.prune: extra_args[i] += ["-prune=1"] @@ -123,9 +129,9 @@ def run_test(self): # each possible type of wallet import RPC. for i, variant in enumerate(IMPORT_VARIANTS): variant.label = "label {} {}".format(i, variant) - variant.address = self.nodes[0].validateaddress(self.nodes[0].getnewaddress(variant.label)) - variant.key = self.nodes[0].dumpprivkey(variant.address["address"]) - variant.initial_amount = 25 - (i + 1) / 4.0 + variant.address = self.nodes[1].validateaddress(self.nodes[1].getnewaddress(variant.label)) + variant.key = self.nodes[1].dumpprivkey(variant.address["address"]) + variant.initial_amount = 10 - (i + 1) / 4.0 variant.initial_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.initial_amount) # Generate a block containing the initial transactions, then another @@ -142,7 +148,7 @@ def run_test(self): for variant in IMPORT_VARIANTS: variant.expect_disabled = variant.rescan == Rescan.yes and variant.prune and variant.call == Call.single expect_rescan = variant.rescan == Rescan.yes and not variant.expect_disabled - variant.node = self.nodes[1 + IMPORT_NODES.index(ImportNode(variant.prune, expect_rescan))] + variant.node = self.nodes[2 + IMPORT_NODES.index(ImportNode(variant.prune, expect_rescan))] variant.do_import(timestamp) if expect_rescan: variant.expected_balance = variant.initial_amount @@ -156,7 +162,7 @@ def run_test(self): # Create new transactions sending to each address. fee = self.nodes[0].getnetworkinfo()["relayfee"] for i, variant in enumerate(IMPORT_VARIANTS): - variant.sent_amount = 25 - (2 * i + 1) / 8.0 + variant.sent_amount = 10 - (2 * i + 1) / 8.0 variant.sent_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.sent_amount) # Generate a block containing the new transactions. diff --git a/qa/rpc-tests/importprunedfunds.py b/qa/rpc-tests/importprunedfunds.py index 0dee8ad4ec9..b289f9be575 100755 --- a/qa/rpc-tests/importprunedfunds.py +++ b/qa/rpc-tests/importprunedfunds.py @@ -76,12 +76,7 @@ def run_test(self): self.sync_all() #Import with no affiliated address - try: - self.nodes[1].importprunedfunds(rawtxn1, proof1) - except JSONRPCException as e: - assert('No addresses' in e.error['message']) - else: - assert(False) + assert_raises_jsonrpc(-5, "No addresses", self.nodes[1].importprunedfunds, rawtxn1, proof1) balance1 = self.nodes[1].getbalance("", 0, True) assert_equal(balance1, Decimal(0)) @@ -112,12 +107,7 @@ def run_test(self): assert_equal(address_info['ismine'], True) #Remove transactions - try: - self.nodes[1].removeprunedfunds(txnid1) - except JSONRPCException as e: - assert('does not exist' in e.error['message']) - else: - assert(False) + assert_raises_jsonrpc(-8, "Transaction does not exist in wallet.", self.nodes[1].removeprunedfunds, txnid1) balance1 = self.nodes[1].getbalance("*", 0, True) assert_equal(balance1, Decimal('0.075')) diff --git a/qa/rpc-tests/mempool_packages.py b/qa/rpc-tests/mempool_packages.py index f605e7524f7..99e01534d69 100755 --- a/qa/rpc-tests/mempool_packages.py +++ b/qa/rpc-tests/mempool_packages.py @@ -102,6 +102,18 @@ def run_test(self): assert_equal(mempool[x], v_descendants[x]) assert(chain[0] not in v_descendants.keys()) + # Check that ancestor modified fees includes fee deltas from + # prioritisetransaction + self.nodes[0].prioritisetransaction(chain[0], 0, 1000) + mempool = self.nodes[0].getrawmempool(True) + ancestor_fees = 0 + for x in chain: + ancestor_fees += mempool[x]['fee'] + assert_equal(mempool[x]['ancestorfees'], ancestor_fees * COIN + 1000) + + # Undo the prioritisetransaction for later tests + self.nodes[0].prioritisetransaction(chain[0], 0, -1000) + # Check that descendant modified fees includes fee deltas from # prioritisetransaction self.nodes[0].prioritisetransaction(chain[-1], 0, 1000) diff --git a/qa/rpc-tests/nodehandling.py b/qa/rpc-tests/nodehandling.py index 7313c79b54f..61be27ae2b6 100755 --- a/qa/rpc-tests/nodehandling.py +++ b/qa/rpc-tests/nodehandling.py @@ -7,79 +7,83 @@ # Test node handling # +from test_framework.mininode import wait_until from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import * +from test_framework.util import (assert_equal, + assert_raises_jsonrpc, + connect_nodes_bi, + start_node, + stop_node, + ) -import urllib.parse - -class NodeHandlingTest (BitcoinTestFramework): +class NodeHandlingTest(BitcoinTestFramework): def __init__(self): super().__init__() - self.num_nodes = 4 + self.num_nodes = 2 self.setup_clean_chain = False + def setup_network(self): + self.nodes = self.setup_nodes() + connect_nodes_bi(self.nodes, 0, 1) + def run_test(self): ########################### # setban/listbanned tests # ########################### - assert_equal(len(self.nodes[2].getpeerinfo()), 4) #we should have 4 nodes at this point - self.nodes[2].setban("127.0.0.1", "add") - time.sleep(3) #wait till the nodes are disconected - assert_equal(len(self.nodes[2].getpeerinfo()), 0) #all nodes must be disconnected at this point - assert_equal(len(self.nodes[2].listbanned()), 1) - self.nodes[2].clearbanned() - assert_equal(len(self.nodes[2].listbanned()), 0) - self.nodes[2].setban("127.0.0.0/24", "add") - assert_equal(len(self.nodes[2].listbanned()), 1) - try: - self.nodes[2].setban("127.0.0.1", "add") #throws exception because 127.0.0.1 is within range 127.0.0.0/24 - except: - pass - assert_equal(len(self.nodes[2].listbanned()), 1) #still only one banned ip because 127.0.0.1 is within the range of 127.0.0.0/24 - try: - self.nodes[2].setban("127.0.0.1", "remove") - except: - pass - assert_equal(len(self.nodes[2].listbanned()), 1) - self.nodes[2].setban("127.0.0.0/24", "remove") - assert_equal(len(self.nodes[2].listbanned()), 0) - self.nodes[2].clearbanned() - assert_equal(len(self.nodes[2].listbanned()), 0) + assert_equal(len(self.nodes[1].getpeerinfo()), 2) # node1 should have 2 connections to node0 at this point + self.nodes[1].setban("127.0.0.1", "add") + assert wait_until(lambda: len(self.nodes[1].getpeerinfo()) == 0, timeout=10) + assert_equal(len(self.nodes[1].getpeerinfo()), 0) # all nodes must be disconnected at this point + assert_equal(len(self.nodes[1].listbanned()), 1) + self.nodes[1].clearbanned() + assert_equal(len(self.nodes[1].listbanned()), 0) + self.nodes[1].setban("127.0.0.0/24", "add") + assert_equal(len(self.nodes[1].listbanned()), 1) + # This will throw an exception because 127.0.0.1 is within range 127.0.0.0/24 + assert_raises_jsonrpc(-23, "IP/Subnet already banned", self.nodes[1].setban, "127.0.0.1", "add") + # This will throw an exception because 127.0.0.1/42 is not a real subnet + assert_raises_jsonrpc(-30, "Error: Invalid IP/Subnet", self.nodes[1].setban, "127.0.0.1/42", "add") + assert_equal(len(self.nodes[1].listbanned()), 1) # still only one banned ip because 127.0.0.1 is within the range of 127.0.0.0/24 + # This will throw an exception because 127.0.0.1 was not added above + assert_raises_jsonrpc(-30, "Error: Unban failed", self.nodes[1].setban, "127.0.0.1", "remove") + assert_equal(len(self.nodes[1].listbanned()), 1) + self.nodes[1].setban("127.0.0.0/24", "remove") + assert_equal(len(self.nodes[1].listbanned()), 0) + self.nodes[1].clearbanned() + assert_equal(len(self.nodes[1].listbanned()), 0) - ##test persisted banlist - self.nodes[2].setban("127.0.0.0/32", "add") - self.nodes[2].setban("127.0.0.0/24", "add") - self.nodes[2].setban("192.168.0.1", "add", 1) #ban for 1 seconds - self.nodes[2].setban("2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/19", "add", 1000) #ban for 1000 seconds - listBeforeShutdown = self.nodes[2].listbanned() - assert_equal("192.168.0.1/32", listBeforeShutdown[2]['address']) #must be here - time.sleep(2) #make 100% sure we expired 192.168.0.1 node time + # test persisted banlist + self.nodes[1].setban("127.0.0.0/32", "add") + self.nodes[1].setban("127.0.0.0/24", "add") + self.nodes[1].setban("192.168.0.1", "add", 1) # ban for 1 seconds + self.nodes[1].setban("2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/19", "add", 1000) # ban for 1000 seconds + listBeforeShutdown = self.nodes[1].listbanned() + assert_equal("192.168.0.1/32", listBeforeShutdown[2]['address']) + assert wait_until(lambda: len(self.nodes[1].listbanned()) == 3, timeout=10) - #stop node - stop_node(self.nodes[2], 2) + stop_node(self.nodes[1], 1) - self.nodes[2] = start_node(2, self.options.tmpdir) - listAfterShutdown = self.nodes[2].listbanned() + self.nodes[1] = start_node(1, self.options.tmpdir) + listAfterShutdown = self.nodes[1].listbanned() assert_equal("127.0.0.0/24", listAfterShutdown[0]['address']) assert_equal("127.0.0.0/32", listAfterShutdown[1]['address']) assert_equal("/19" in listAfterShutdown[2]['address'], True) + # Clear ban lists + self.nodes[1].clearbanned() + connect_nodes_bi(self.nodes, 0, 1) + ########################### # RPC disconnectnode test # ########################### - url = urllib.parse.urlparse(self.nodes[1].url) - self.nodes[0].disconnectnode(url.hostname+":"+str(p2p_port(1))) - time.sleep(2) #disconnecting a node needs a little bit of time - for node in self.nodes[0].getpeerinfo(): - assert(node['addr'] != url.hostname+":"+str(p2p_port(1))) + address1 = self.nodes[0].getpeerinfo()[0]['addr'] + self.nodes[0].disconnectnode(address=address1) + assert wait_until(lambda: len(self.nodes[0].getpeerinfo()) == 1, timeout=10) + assert not [node for node in self.nodes[0].getpeerinfo() if node['addr'] == address1] - connect_nodes_bi(self.nodes,0,1) #reconnect the node - found = False - for node in self.nodes[0].getpeerinfo(): - if node['addr'] == url.hostname+":"+str(p2p_port(1)): - found = True - assert(found) + connect_nodes_bi(self.nodes, 0, 1) # reconnect the node + assert [node for node in self.nodes[0].getpeerinfo() if node['addr'] == address1] if __name__ == '__main__': - NodeHandlingTest ().main () + NodeHandlingTest().main() diff --git a/qa/rpc-tests/p2p-acceptblock.py b/qa/rpc-tests/p2p-acceptblock.py index 015ec34effa..4ebf2766202 100755 --- a/qa/rpc-tests/p2p-acceptblock.py +++ b/qa/rpc-tests/p2p-acceptblock.py @@ -199,11 +199,8 @@ def run_test(self): assert_equal(x['status'], "headers-only") # But this block should be accepted by node0 since it has more work. - try: - self.nodes[0].getblock(blocks_h3[0].hash) - print("Unrequested more-work block accepted from non-whitelisted peer") - except: - raise AssertionError("Unrequested more work block was not processed") + self.nodes[0].getblock(blocks_h3[0].hash) + print("Unrequested more-work block accepted from non-whitelisted peer") # Node1 should have accepted and reorged. assert_equal(self.nodes[1].getblockcount(), 3) @@ -227,26 +224,17 @@ def run_test(self): tips[j] = next_block time.sleep(2) - for x in all_blocks: - try: - self.nodes[0].getblock(x.hash) - if x == all_blocks[287]: - raise AssertionError("Unrequested block too far-ahead should have been ignored") - except: - if x == all_blocks[287]: - print("Unrequested block too far-ahead not processed") - else: - raise AssertionError("Unrequested block with more work should have been accepted") + # Blocks 1-287 should be accepted, block 288 should be ignored because it's too far ahead + for x in all_blocks[:-1]: + self.nodes[0].getblock(x.hash) + assert_raises_jsonrpc(-1, "Block not found on disk", self.nodes[0].getblock, all_blocks[-1].hash) headers_message.headers.pop() # Ensure the last block is unrequested white_node.send_message(headers_message) # Send headers leading to tip white_node.send_message(msg_block(tips[1])) # Now deliver the tip - try: - white_node.sync_with_ping() - self.nodes[1].getblock(tips[1].hash) - print("Unrequested block far ahead of tip accepted from whitelisted peer") - except: - raise AssertionError("Unrequested block from whitelisted peer not accepted") + white_node.sync_with_ping() + self.nodes[1].getblock(tips[1].hash) + print("Unrequested block far ahead of tip accepted from whitelisted peer") # 5. Test handling of unrequested block on the node that didn't process # Should still not be processed (even though it has a child that has more diff --git a/qa/rpc-tests/p2p-segwit.py b/qa/rpc-tests/p2p-segwit.py index 2f339bb54f6..479f1c6796b 100755 --- a/qa/rpc-tests/p2p-segwit.py +++ b/qa/rpc-tests/p2p-segwit.py @@ -1701,9 +1701,11 @@ def test_getblocktemplate_before_lockin(self): for node in [self.nodes[0], self.nodes[2]]: gbt_results = node.getblocktemplate() block_version = gbt_results['version'] - # If we're not indicating segwit support, we should not be signalling - # for segwit activation, nor should we get a witness commitment. - assert_equal(block_version & (1 << VB_WITNESS_BIT), 0) + # If we're not indicating segwit support, we will still be + # signalling for segwit activation. + assert_equal((block_version & (1 << VB_WITNESS_BIT) != 0), node == self.nodes[0]) + # If we don't specify the segwit rule, then we won't get a default + # commitment. assert('default_witness_commitment' not in gbt_results) # Workaround: diff --git a/qa/rpc-tests/prioritise_transaction.py b/qa/rpc-tests/prioritise_transaction.py index b7459c80cbd..16874a6b53b 100755 --- a/qa/rpc-tests/prioritise_transaction.py +++ b/qa/rpc-tests/prioritise_transaction.py @@ -16,7 +16,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework): def __init__(self): super().__init__() self.setup_clean_chain = True - self.num_nodes = 1 + self.num_nodes = 2 self.txouts = gen_return_txouts() @@ -25,8 +25,11 @@ def setup_network(self): self.is_network_split = False self.nodes.append(start_node(0, self.options.tmpdir, ["-debug", "-printpriority=1"])) + self.nodes.append(start_node(1, self.options.tmpdir, ["-debug", "-printpriority=1"])) + connect_nodes(self.nodes[0], 1) self.relayfee = self.nodes[0].getnetworkinfo()['relayfee'] + def run_test(self): utxo_count = 90 utxos = create_confirmed_utxos(self.relayfee, self.nodes[0], utxo_count) @@ -139,5 +142,16 @@ def run_test(self): assert_equal(self.nodes[0].sendrawtransaction(tx2_hex), tx2_id) assert(tx2_id in self.nodes[0].getrawmempool()) + # Test that calling prioritisetransaction is sufficient to trigger + # getblocktemplate to (eventually) return a new block. + mock_time = int(time.time()) + self.nodes[0].setmocktime(mock_time) + template = self.nodes[0].getblocktemplate() + self.nodes[0].prioritisetransaction(txid, 0, -int(self.relayfee*COIN)) + self.nodes[0].setmocktime(mock_time+10) + new_template = self.nodes[0].getblocktemplate() + + assert(template != new_template) + if __name__ == '__main__': PrioritiseTransactionTest().main() diff --git a/qa/rpc-tests/pruning.py b/qa/rpc-tests/pruning.py index 9d155478e25..3308bd1dc5e 100755 --- a/qa/rpc-tests/pruning.py +++ b/qa/rpc-tests/pruning.py @@ -18,6 +18,11 @@ MIN_BLOCKS_TO_KEEP = 288 +# Rescans start at the earliest block up to 2 hours before a key timestamp, so +# the manual prune RPC avoids pruning blocks in the same window to be +# compatible with pruning based on key creation time. +RESCAN_WINDOW = 2 * 60 * 60 + def calc_usage(blockdir): return sum(os.path.getsize(blockdir+f) for f in os.listdir(blockdir) if os.path.isfile(blockdir+f)) / (1024. * 1024.) @@ -181,11 +186,8 @@ def reorg_test(self): def reorg_back(self): # Verify that a block on the old main chain fork has been pruned away - try: - self.nodes[2].getblock(self.forkhash) - raise AssertionError("Old block wasn't pruned so can't test redownload") - except JSONRPCException as e: - print("Will need to redownload block",self.forkheight) + assert_raises_jsonrpc(-1, "Block not available (pruned data)", self.nodes[2].getblock, self.forkhash) + print("Will need to redownload block",self.forkheight) # Verify that we have enough history to reorg back to the fork point # Although this is more than 288 blocks, because this chain was written more recently @@ -230,7 +232,7 @@ def manual_test(self, node_number, use_timestamp): # at this point, node has 995 blocks and has not yet run in prune mode node = self.nodes[node_number] = start_node(node_number, self.options.tmpdir, ["-debug=0"], timewait=900) assert_equal(node.getblockcount(), 995) - assert_raises_message(JSONRPCException, "not in prune mode", node.pruneblockchain, 500) + assert_raises_jsonrpc(-1, "not in prune mode", node.pruneblockchain, 500) self.stop_node(node_number) # now re-start in manual pruning mode @@ -239,7 +241,7 @@ def manual_test(self, node_number, use_timestamp): def height(index): if use_timestamp: - return node.getblockheader(node.getblockhash(index))["time"] + return node.getblockheader(node.getblockhash(index))["time"] + RESCAN_WINDOW else: return index @@ -262,14 +264,14 @@ def has_block(index): return os.path.isfile(self.options.tmpdir + "/node{}/regtest/blocks/blk{:05}.dat".format(node_number, index)) # should not prune because chain tip of node 3 (995) < PruneAfterHeight (1000) - assert_raises_message(JSONRPCException, "Blockchain is too short for pruning", node.pruneblockchain, height(500)) + assert_raises_jsonrpc(-1, "Blockchain is too short for pruning", node.pruneblockchain, height(500)) # mine 6 blocks so we are at height 1001 (i.e., above PruneAfterHeight) node.generate(6) assert_equal(node.getblockchaininfo()["blocks"], 1001) # negative heights should raise an exception - assert_raises_message(JSONRPCException, "Negative", node.pruneblockchain, -10) + assert_raises_jsonrpc(-8, "Negative", node.pruneblockchain, -10) # height=100 too low to prune first block file so this is a no-op prune(100) @@ -315,12 +317,9 @@ def has_block(index): def wallet_test(self): # check that the pruning node's wallet is still in good shape print("Stop and start pruning node to trigger wallet rescan") - try: - self.stop_node(2) - start_node(2, self.options.tmpdir, ["-debug=1","-prune=550"]) - print("Success") - except Exception as detail: - raise AssertionError("Wallet test: unable to re-start the pruning node") + self.stop_node(2) + start_node(2, self.options.tmpdir, ["-debug=1","-prune=550"]) + print("Success") # check that wallet loads loads successfully when restarting a pruned node after IBD. # this was reported to fail in #7494. @@ -328,12 +327,9 @@ def wallet_test(self): connect_nodes(self.nodes[0], 5) nds = [self.nodes[0], self.nodes[5]] sync_blocks(nds, wait=5, timeout=300) - try: - self.stop_node(5) #stop and start to trigger rescan - start_node(5, self.options.tmpdir, ["-debug=1","-prune=550"]) - print ("Success") - except Exception as detail: - raise AssertionError("Wallet test: unable to re-start node5") + self.stop_node(5) #stop and start to trigger rescan + start_node(5, self.options.tmpdir, ["-debug=1","-prune=550"]) + print ("Success") def run_test(self): print("Warning! This test requires 4GB of disk space and takes over 30 mins (up to 2 hours)") diff --git a/qa/rpc-tests/rawtransactions.py b/qa/rpc-tests/rawtransactions.py index 33a6f2b0cca..2e27bbabb03 100755 --- a/qa/rpc-tests/rawtransactions.py +++ b/qa/rpc-tests/rawtransactions.py @@ -61,13 +61,8 @@ def run_test(self): rawtx = self.nodes[2].createrawtransaction(inputs, outputs) rawtx = self.nodes[2].signrawtransaction(rawtx) - try: - rawtx = self.nodes[2].sendrawtransaction(rawtx['hex']) - except JSONRPCException as e: - assert("Missing inputs" in e.error['message']) - else: - assert(False) - + # This will raise an exception since there are missing inputs + assert_raises_jsonrpc(-25, "Missing inputs", self.nodes[2].sendrawtransaction, rawtx['hex']) ######################### # RAW TX MULTISIG TESTS # @@ -161,13 +156,13 @@ def run_test(self): assert_equal(self.nodes[0].getrawtransaction(txHash, True)["hex"], rawTxSigned['hex']) # 6. invalid parameters - supply txid and string "Flase" - assert_raises(JSONRPCException, self.nodes[0].getrawtransaction, txHash, "Flase") + assert_raises_jsonrpc(-3,"Invalid type", self.nodes[0].getrawtransaction, txHash, "Flase") # 7. invalid parameters - supply txid and empty array - assert_raises(JSONRPCException, self.nodes[0].getrawtransaction, txHash, []) + assert_raises_jsonrpc(-3,"Invalid type", self.nodes[0].getrawtransaction, txHash, []) # 8. invalid parameters - supply txid and empty dict - assert_raises(JSONRPCException, self.nodes[0].getrawtransaction, txHash, {}) + assert_raises_jsonrpc(-3,"Invalid type", self.nodes[0].getrawtransaction, txHash, {}) inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 1000}] outputs = { self.nodes[0].getnewaddress() : 1 } @@ -175,13 +170,15 @@ def run_test(self): decrawtx= self.nodes[0].decoderawtransaction(rawtx) assert_equal(decrawtx['vin'][0]['sequence'], 1000) + # 9. invalid parameters - sequence number out of range inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : -1}] outputs = { self.nodes[0].getnewaddress() : 1 } - assert_raises(JSONRPCException, self.nodes[0].createrawtransaction, inputs, outputs) + assert_raises_jsonrpc(-8, 'Invalid parameter, sequence number is out of range', self.nodes[0].createrawtransaction, inputs, outputs) + # 10. invalid parameters - sequence number out of range inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 4294967296}] outputs = { self.nodes[0].getnewaddress() : 1 } - assert_raises(JSONRPCException, self.nodes[0].createrawtransaction, inputs, outputs) + assert_raises_jsonrpc(-8, 'Invalid parameter, sequence number is out of range', self.nodes[0].createrawtransaction, inputs, outputs) inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 4294967294}] outputs = { self.nodes[0].getnewaddress() : 1 } diff --git a/qa/rpc-tests/rpcbind_test.py b/qa/rpc-tests/rpcbind_test.py index d78d0b884e9..1010c54aa5c 100755 --- a/qa/rpc-tests/rpcbind_test.py +++ b/qa/rpc-tests/rpcbind_test.py @@ -35,11 +35,9 @@ def run_bind_test(self, allow_ips, connect_to, addresses, expected): base_args += ['-rpcallowip=' + x for x in allow_ips] binds = ['-rpcbind='+addr for addr in addresses] self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, [base_args + binds], connect_to) - try: - pid = bitcoind_processes[0].pid - assert_equal(set(get_bind_addrs(pid)), set(expected)) - finally: - stop_nodes(self.nodes) + pid = bitcoind_processes[0].pid + assert_equal(set(get_bind_addrs(pid)), set(expected)) + stop_nodes(self.nodes) def run_allowip_test(self, allow_ips, rpchost, rpcport): ''' @@ -48,13 +46,10 @@ def run_allowip_test(self, allow_ips, rpchost, rpcport): ''' base_args = ['-disablewallet', '-nolisten'] + ['-rpcallowip='+x for x in allow_ips] self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, [base_args]) - try: - # connect to node through non-loopback interface - node = get_rpc_proxy(rpc_url(0, "%s:%d" % (rpchost, rpcport)), 0) - node.getnetworkinfo() - finally: - node = None # make sure connection will be garbage collected and closed - stop_nodes(self.nodes) + # connect to node through non-loopback interface + node = get_rpc_proxy(rpc_url(0, "%s:%d" % (rpchost, rpcport)), 0) + node.getnetworkinfo() + stop_nodes(self.nodes) def run_test(self): # due to OS-specific network stats queries, this test works only on Linux diff --git a/qa/rpc-tests/segwit.py b/qa/rpc-tests/segwit.py index 299f5387e7c..c814399f922 100755 --- a/qa/rpc-tests/segwit.py +++ b/qa/rpc-tests/segwit.py @@ -11,9 +11,9 @@ from test_framework.util import * from test_framework.mininode import sha256, ripemd160, CTransaction, CTxIn, COutPoint, CTxOut from test_framework.address import script_to_p2sh, key_to_p2pkh -from test_framework.script import CScript, OP_HASH160, OP_CHECKSIG, OP_0, hash160, OP_EQUAL, OP_DUP, OP_EQUALVERIFY, OP_1, OP_2, OP_CHECKMULTISIG +from test_framework.script import CScript, OP_HASH160, OP_CHECKSIG, OP_0, hash160, OP_EQUAL, OP_DUP, OP_EQUALVERIFY, OP_1, OP_2, OP_CHECKMULTISIG, OP_TRUE from io import BytesIO -from test_framework.mininode import FromHex +from test_framework.mininode import ToHex, FromHex, COIN NODE_0 = 0 NODE_1 = 1 @@ -130,10 +130,14 @@ def run_test(self): print("Verify sigops are counted in GBT with pre-BIP141 rules before the fork") txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1) tmpl = self.nodes[0].getblocktemplate({}) + assert(tmpl['sizelimit'] == 1000000) + assert('weightlimit' not in tmpl) assert(tmpl['sigoplimit'] == 20000) assert(tmpl['transactions'][0]['hash'] == txid) assert(tmpl['transactions'][0]['sigops'] == 2) tmpl = self.nodes[0].getblocktemplate({'rules':['segwit']}) + assert(tmpl['sizelimit'] == 1000000) + assert('weightlimit' not in tmpl) assert(tmpl['sigoplimit'] == 20000) assert(tmpl['transactions'][0]['hash'] == txid) assert(tmpl['transactions'][0]['sigops'] == 2) @@ -241,22 +245,60 @@ def run_test(self): print("Verify sigops are counted in GBT with BIP141 rules after the fork") txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1) tmpl = self.nodes[0].getblocktemplate({'rules':['segwit']}) + assert(tmpl['sizelimit'] >= 3999577) # actual maximum size is lower due to minimum mandatory non-witness data + assert(tmpl['weightlimit'] == 4000000) assert(tmpl['sigoplimit'] == 80000) assert(tmpl['transactions'][0]['txid'] == txid) assert(tmpl['transactions'][0]['sigops'] == 8) - print("Verify non-segwit miners get a valid GBT response after the fork") - send_to_witness(1, self.nodes[0], find_unspent(self.nodes[0], 50), self.pubkey[0], False, Decimal("49.998")) - try: - tmpl = self.nodes[0].getblocktemplate({}) - assert(len(tmpl['transactions']) == 1) # Doesn't include witness tx - assert(tmpl['sigoplimit'] == 20000) - assert(tmpl['transactions'][0]['hash'] == txid) - assert(tmpl['transactions'][0]['sigops'] == 2) - assert(('!segwit' in tmpl['rules']) or ('segwit' not in tmpl['rules'])) - except JSONRPCException: - # This is an acceptable outcome - pass + self.nodes[0].generate(1) # Mine a block to clear the gbt cache + + print("Non-segwit miners are able to use GBT response after activation.") + # Create a 3-tx chain: tx1 (non-segwit input, paying to a segwit output) -> + # tx2 (segwit input, paying to a non-segwit output) -> + # tx3 (non-segwit input, paying to a non-segwit output). + # tx1 is allowed to appear in the block, but no others. + txid1 = send_to_witness(1, self.nodes[0], find_unspent(self.nodes[0], 50), self.pubkey[0], False, Decimal("49.996")) + hex_tx = self.nodes[0].gettransaction(txid)['hex'] + tx = FromHex(CTransaction(), hex_tx) + assert(tx.wit.is_null()) # This should not be a segwit input + assert(txid1 in self.nodes[0].getrawmempool()) + + # Now create tx2, which will spend from txid1. + tx = CTransaction() + tx.vin.append(CTxIn(COutPoint(int(txid1, 16), 0), b'')) + tx.vout.append(CTxOut(int(49.99*COIN), CScript([OP_TRUE]))) + tx2_hex = self.nodes[0].signrawtransaction(ToHex(tx))['hex'] + txid2 = self.nodes[0].sendrawtransaction(tx2_hex) + tx = FromHex(CTransaction(), tx2_hex) + assert(not tx.wit.is_null()) + + # Now create tx3, which will spend from txid2 + tx = CTransaction() + tx.vin.append(CTxIn(COutPoint(int(txid2, 16), 0), b"")) + tx.vout.append(CTxOut(int(49.95*COIN), CScript([OP_TRUE]))) # Huge fee + tx.calc_sha256() + txid3 = self.nodes[0].sendrawtransaction(ToHex(tx)) + assert(tx.wit.is_null()) + assert(txid3 in self.nodes[0].getrawmempool()) + + # Now try calling getblocktemplate() without segwit support. + template = self.nodes[0].getblocktemplate() + + # Check that tx1 is the only transaction of the 3 in the template. + template_txids = [ t['txid'] for t in template['transactions'] ] + assert(txid2 not in template_txids and txid3 not in template_txids) + assert(txid1 in template_txids) + + # Check that running with segwit support results in all 3 being included. + template = self.nodes[0].getblocktemplate({"rules": ["segwit"]}) + template_txids = [ t['txid'] for t in template['transactions'] ] + assert(txid1 in template_txids) + assert(txid2 in template_txids) + assert(txid3 in template_txids) + + # Mine a block to clear the gbt cache again. + self.nodes[0].generate(1) print("Verify behaviour of importaddress, addwitnessaddress and listunspent") diff --git a/qa/rpc-tests/test_framework/util.py b/qa/rpc-tests/test_framework/util.py index dc8555c44c0..ec151c2a65d 100644 --- a/qa/rpc-tests/test_framework/util.py +++ b/qa/rpc-tests/test_framework/util.py @@ -375,28 +375,19 @@ def stop_node(node, i): node.stop() except http.client.CannotSendRequest as e: print("WARN: Unable to stop node: " + repr(e)) - bitcoind_processes[i].wait(timeout=BITCOIND_PROC_WAIT_TIMEOUT) + return_code = bitcoind_processes[i].wait(timeout=BITCOIND_PROC_WAIT_TIMEOUT) + assert_equal(return_code, 0) del bitcoind_processes[i] def stop_nodes(nodes): - for node in nodes: - try: - node.stop() - except http.client.CannotSendRequest as e: - print("WARN: Unable to stop node: " + repr(e)) - del nodes[:] # Emptying array closes connections as a side effect - wait_bitcoinds() + for i, node in enumerate(nodes): + stop_node(node, i) + assert not bitcoind_processes.values() # All connections must be gone now def set_node_times(nodes, t): for node in nodes: node.setmocktime(t) -def wait_bitcoinds(): - # Wait for all bitcoinds to cleanly exit - for bitcoind in bitcoind_processes.values(): - bitcoind.wait(timeout=BITCOIND_PROC_WAIT_TIMEOUT) - bitcoind_processes.clear() - def connect_nodes(from_connection, node_num): ip_port = "127.0.0.1:"+str(p2p_port(node_num)) from_connection.addnode(ip_port, "onetry") diff --git a/src/Makefile.am b/src/Makefile.am index a2072865a34..76dbbced6cd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,7 +5,7 @@ DIST_SUBDIRS = secp256k1 univalue AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) -AM_CXXFLAGS = $(HARDENED_CXXFLAGS) +AM_CXXFLAGS = $(HARDENED_CXXFLAGS) $(ERROR_CXXFLAGS) AM_CPPFLAGS = $(HARDENED_CPPFLAGS) EXTRA_LIBRARIES = @@ -457,6 +457,14 @@ DISTCLEANFILES = obj/build.h EXTRA_DIST = $(CTAES_DIST) + +config/bitcoin-config.h: config/stamp-h1 + @$(MAKE) -C $(top_builddir) $(subdir)/$(@) +config/stamp-h1: $(top_srcdir)/$(subdir)/config/bitcoin-config.h.in $(top_builddir)/config.status + $(AM_V_at)$(MAKE) -C $(top_builddir) $(subdir)/$(@) +$(top_srcdir)/$(subdir)/config/bitcoin-config.h.in: $(am__configure_deps) + $(AM_V_at)$(MAKE) -C $(top_srcdir) $(subdir)/config/bitcoin-config.h.in + clean-local: -$(MAKE) -C secp256k1 clean -$(MAKE) -C univalue clean diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 4d44b35bb61..99c25a1d4d9 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -89,6 +89,7 @@ BITCOIN_TESTS =\ test/blockencodings_tests.cpp \ test/bloom_tests.cpp \ test/bswap_tests.cpp \ + test/checkqueue_tests.cpp \ test/coins_tests.cpp \ test/compress_tests.cpp \ test/crypto_tests.cpp \ diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 3c3646523a0..43fa3fdfb96 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -242,6 +242,9 @@ static void MutateTxAddOutAddr(CMutableTransaction& tx, const std::string& strIn std::vector vStrInputParts; boost::split(vStrInputParts, strInput, boost::is_any_of(":")); + if (vStrInputParts.size() != 2) + throw std::runtime_error("TX output missing or too many separators"); + // Extract and validate VALUE CAmount value = ExtractAndValidateValue(vStrInputParts[0]); @@ -264,6 +267,9 @@ static void MutateTxAddOutPubKey(CMutableTransaction& tx, const std::string& str std::vector vStrInputParts; boost::split(vStrInputParts, strInput, boost::is_any_of(":")); + if (vStrInputParts.size() < 2 || vStrInputParts.size() > 3) + throw std::runtime_error("TX output missing or too many separators"); + // Extract and validate VALUE CAmount value = ExtractAndValidateValue(vStrInputParts[0]); diff --git a/src/checkqueue.h b/src/checkqueue.h index 32e25d5c8c6..ea12df66dd0 100644 --- a/src/checkqueue.h +++ b/src/checkqueue.h @@ -127,6 +127,9 @@ class CCheckQueue } public: + //! Mutex to ensure only one concurrent CCheckQueueControl + boost::mutex ControlMutex; + //! Create a new check queue CCheckQueue(unsigned int nBatchSizeIn) : nIdle(0), nTotal(0), fAllOk(true), nTodo(0), fQuit(false), nBatchSize(nBatchSizeIn) {} @@ -161,12 +164,6 @@ class CCheckQueue { } - bool IsIdle() - { - boost::unique_lock lock(mutex); - return (nTotal == nIdle && nTodo == 0 && fAllOk == true); - } - }; /** @@ -177,16 +174,18 @@ template class CCheckQueueControl { private: - CCheckQueue* pqueue; + CCheckQueue * const pqueue; bool fDone; public: - CCheckQueueControl(CCheckQueue* pqueueIn) : pqueue(pqueueIn), fDone(false) + CCheckQueueControl() = delete; + CCheckQueueControl(const CCheckQueueControl&) = delete; + CCheckQueueControl& operator=(const CCheckQueueControl&) = delete; + explicit CCheckQueueControl(CCheckQueue * const pqueueIn) : pqueue(pqueueIn), fDone(false) { // passed queue is supposed to be unused, or NULL if (pqueue != NULL) { - bool isIdle = pqueue->IsIdle(); - assert(isIdle); + ENTER_CRITICAL_SECTION(pqueue->ControlMutex); } } @@ -209,6 +208,9 @@ class CCheckQueueControl { if (!fDone) Wait(); + if (pqueue != NULL) { + LEAVE_CRITICAL_SECTION(pqueue->ControlMutex); + } } }; diff --git a/src/clientversion.h b/src/clientversion.h index 0b27bb1bdfc..2a6c55cf98a 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -15,12 +15,12 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 0 -#define CLIENT_VERSION_MINOR 13 -#define CLIENT_VERSION_REVISION 99 +#define CLIENT_VERSION_MINOR 14 +#define CLIENT_VERSION_REVISION 2 #define CLIENT_VERSION_BUILD 0 //! Set to true for release, false for prerelease or test build -#define CLIENT_VERSION_IS_RELEASE false +#define CLIENT_VERSION_IS_RELEASE true /** * Copyright year (2009-this) diff --git a/src/hash.h b/src/hash.h index 3b86fcc033c..eacb8f04fef 100644 --- a/src/hash.h +++ b/src/hash.h @@ -25,9 +25,9 @@ class CHash256 { static const size_t OUTPUT_SIZE = CSHA256::OUTPUT_SIZE; void Finalize(unsigned char hash[OUTPUT_SIZE]) { - unsigned char buf[sha.OUTPUT_SIZE]; + unsigned char buf[CSHA256::OUTPUT_SIZE]; sha.Finalize(buf); - sha.Reset().Write(buf, sha.OUTPUT_SIZE).Finalize(hash); + sha.Reset().Write(buf, CSHA256::OUTPUT_SIZE).Finalize(hash); } CHash256& Write(const unsigned char *data, size_t len) { @@ -49,9 +49,9 @@ class CHash160 { static const size_t OUTPUT_SIZE = CRIPEMD160::OUTPUT_SIZE; void Finalize(unsigned char hash[OUTPUT_SIZE]) { - unsigned char buf[sha.OUTPUT_SIZE]; + unsigned char buf[CSHA256::OUTPUT_SIZE]; sha.Finalize(buf); - CRIPEMD160().Write(buf, sha.OUTPUT_SIZE).Finalize(hash); + CRIPEMD160().Write(buf, CSHA256::OUTPUT_SIZE).Finalize(hash); } CHash160& Write(const unsigned char *data, size_t len) { diff --git a/src/httprpc.cpp b/src/httprpc.cpp index daac7a0f1a7..8ac6925acda 100644 --- a/src/httprpc.cpp +++ b/src/httprpc.cpp @@ -112,7 +112,7 @@ static bool multiUserAuthorized(std::string strUserPass) std::string strSalt = vFields[1]; std::string strHash = vFields[2]; - unsigned int KEY_SIZE = 32; + static const unsigned int KEY_SIZE = 32; unsigned char out[KEY_SIZE]; CHMAC_SHA256(reinterpret_cast(strSalt.c_str()), strSalt.size()).Write(reinterpret_cast(strPass.c_str()), strPass.size()).Finalize(out); diff --git a/src/init.cpp b/src/init.cpp index 7c108ac4a63..5820d8f57c3 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -801,6 +801,19 @@ ServiceFlags nLocalServices = NODE_NETWORK; } +[[noreturn]] static void new_handler_terminate() +{ + // Rather than throwing std::bad-alloc if allocation fails, terminate + // immediately to (try to) avoid chain corruption. + // Since LogPrintf may itself allocate memory, set the handler directly + // to terminate first. + std::set_new_handler(std::terminate); + LogPrintf("Error: Out of memory. Terminating.\n"); + + // The log was successful, terminate now. + std::terminate(); +}; + bool AppInitBasicSetup() { // ********************************************************* Step 1: setup @@ -853,6 +866,9 @@ bool AppInitBasicSetup() // Ignore SIGPIPE, otherwise it will bring the daemon down if the client closes unexpectedly signal(SIGPIPE, SIG_IGN); #endif + + std::set_new_handler(new_handler_terminate); + return true; } diff --git a/src/merkleblock.cpp b/src/merkleblock.cpp index e3f3e4621ad..78d7cd60010 100644 --- a/src/merkleblock.cpp +++ b/src/merkleblock.cpp @@ -65,7 +65,7 @@ uint256 CPartialMerkleTree::CalcHash(int height, unsigned int pos, const std::ve } else { // calculate left hash uint256 left = CalcHash(height-1, pos*2, vTxid), right; - // calculate right hash if not beyond the end of the array - copy left hash otherwise1 + // calculate right hash if not beyond the end of the array - copy left hash otherwise if (pos*2+1 < CalcTreeWidth(height-1)) right = CalcHash(height-1, pos*2+1, vTxid); else diff --git a/src/merkleblock.h b/src/merkleblock.h index 73cbf670ee9..de4c5c8d29e 100644 --- a/src/merkleblock.h +++ b/src/merkleblock.h @@ -23,7 +23,7 @@ * storing a bit for each traversed node, signifying whether the node is the * parent of at least one matched leaf txid (or a matched txid itself). In * case we are at the leaf level, or this bit is 0, its merkle node hash is - * stored, and its children are not explorer further. Otherwise, no hash is + * stored, and its children are not explored further. Otherwise, no hash is * stored, but we recurse into both (or the only) child branch. During * decoding, the same depth-first traversal is performed, consuming bits and * hashes as they written during encoding. diff --git a/src/miner.cpp b/src/miner.cpp index d01edd93b52..a12dcec2ce7 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -127,8 +127,10 @@ void BlockAssembler::resetBlock() blockFinished = false; } -std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& scriptPubKeyIn) +std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& scriptPubKeyIn, bool fMineWitnessTx) { + int64_t nTimeStart = GetTimeMicros(); + resetBlock(); pblocktemplate.reset(new CBlockTemplate()); @@ -165,10 +167,14 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc // -promiscuousmempoolflags is used. // TODO: replace this with a call to main to assess validity of a mempool // transaction (which in most cases can be a no-op). - fIncludeWitness = IsWitnessEnabled(pindexPrev, chainparams.GetConsensus()); + fIncludeWitness = IsWitnessEnabled(pindexPrev, chainparams.GetConsensus()) && fMineWitnessTx; addPriorityTxs(); - addPackageTxs(); + int nPackagesSelected = 0; + int nDescendantsUpdated = 0; + addPackageTxs(nPackagesSelected, nDescendantsUpdated); + + int64_t nTime1 = GetTimeMicros(); nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; @@ -200,6 +206,9 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) { throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, FormatStateMessage(state))); } + int64_t nTime2 = GetTimeMicros(); + + LogPrint("bench", "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n", 0.001 * (nTime1 - nTimeStart), nPackagesSelected, nDescendantsUpdated, 0.001 * (nTime2 - nTime1), 0.001 * (nTime2 - nTimeStart)); return std::move(pblocktemplate); } @@ -340,9 +349,10 @@ void BlockAssembler::AddToBlock(CTxMemPool::txiter iter) } } -void BlockAssembler::UpdatePackagesForAdded(const CTxMemPool::setEntries& alreadyAdded, +int BlockAssembler::UpdatePackagesForAdded(const CTxMemPool::setEntries& alreadyAdded, indexed_modified_transaction_set &mapModifiedTx) { + int nDescendantsUpdated = 0; BOOST_FOREACH(const CTxMemPool::txiter it, alreadyAdded) { CTxMemPool::setEntries descendants; mempool.CalculateDescendants(it, descendants); @@ -350,6 +360,7 @@ void BlockAssembler::UpdatePackagesForAdded(const CTxMemPool::setEntries& alread BOOST_FOREACH(CTxMemPool::txiter desc, descendants) { if (alreadyAdded.count(desc)) continue; + ++nDescendantsUpdated; modtxiter mit = mapModifiedTx.find(desc); if (mit == mapModifiedTx.end()) { CTxMemPoolModifiedEntry modEntry(desc); @@ -362,6 +373,7 @@ void BlockAssembler::UpdatePackagesForAdded(const CTxMemPool::setEntries& alread } } } + return nDescendantsUpdated; } // Skip entries in mapTx that are already in a block or are present @@ -402,7 +414,7 @@ void BlockAssembler::SortForBlock(const CTxMemPool::setEntries& package, CTxMemP // Each time through the loop, we compare the best transaction in // mapModifiedTxs with the next transaction in the mempool to decide what // transaction package to work on next. -void BlockAssembler::addPackageTxs() +void BlockAssembler::addPackageTxs(int &nPackagesSelected, int &nDescendantsUpdated) { // mapModifiedTx will store sorted packages after they are modified // because some of their txs are already in the block @@ -416,6 +428,13 @@ void BlockAssembler::addPackageTxs() CTxMemPool::indexed_transaction_set::index::type::iterator mi = mempool.mapTx.get().begin(); CTxMemPool::txiter iter; + + // Limit the number of attempts to add transactions to the block when it is + // close to full; this is just a simple heuristic to finish quickly if the + // mempool has a lot of entries. + const int64_t MAX_CONSECUTIVE_FAILURES = 1000; + int64_t nConsecutiveFailed = 0; + while (mi != mempool.mapTx.get().end() || !mapModifiedTx.empty()) { // First try to find a new transaction in mapTx to evaluate. @@ -477,6 +496,14 @@ void BlockAssembler::addPackageTxs() mapModifiedTx.get().erase(modit); failedTx.insert(iter); } + + ++nConsecutiveFailed; + + if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight > + nBlockMaxWeight - 4000) { + // Give up if we're close to full and haven't succeeded in a while + break; + } continue; } @@ -497,6 +524,9 @@ void BlockAssembler::addPackageTxs() continue; } + // This transaction will make it in; reset the failed counter. + nConsecutiveFailed = 0; + // Package can be added. Sort the entries in a valid order. std::vector sortedEntries; SortForBlock(ancestors, iter, sortedEntries); @@ -507,8 +537,10 @@ void BlockAssembler::addPackageTxs() mapModifiedTx.erase(sortedEntries[i]); } + ++nPackagesSelected; + // Update transactions that depend on each of these - UpdatePackagesForAdded(ancestors, mapModifiedTx); + nDescendantsUpdated += UpdatePackagesForAdded(ancestors, mapModifiedTx); } } diff --git a/src/miner.h b/src/miner.h index 3ba92b16b8e..9ae2874927c 100644 --- a/src/miner.h +++ b/src/miner.h @@ -165,7 +165,7 @@ class BlockAssembler public: BlockAssembler(const CChainParams& chainparams); /** Construct a new block template with coinbase to scriptPubKeyIn */ - std::unique_ptr CreateNewBlock(const CScript& scriptPubKeyIn); + std::unique_ptr CreateNewBlock(const CScript& scriptPubKeyIn, bool fMineWitnessTx=true); private: // utility functions @@ -177,8 +177,10 @@ class BlockAssembler // Methods for how to add transactions to a block. /** Add transactions based on tx "priority" */ void addPriorityTxs(); - /** Add transactions based on feerate including unconfirmed ancestors */ - void addPackageTxs(); + /** Add transactions based on feerate including unconfirmed ancestors + * Increments nPackagesSelected / nDescendantsUpdated with corresponding + * statistics from the package selection (for logging statistics). */ + void addPackageTxs(int &nPackagesSelected, int &nDescendantsUpdated); // helper function for addPriorityTxs /** Test if tx will still "fit" in the block */ @@ -202,8 +204,9 @@ class BlockAssembler /** Sort the package in an order that is valid to appear in a block */ void SortForBlock(const CTxMemPool::setEntries& package, CTxMemPool::txiter entry, std::vector& sortedEntries); /** Add descendants of given transactions to mapModifiedTx with ancestor - * state updated assuming given transactions are inBlock. */ - void UpdatePackagesForAdded(const CTxMemPool::setEntries& alreadyAdded, indexed_modified_transaction_set &mapModifiedTx); + * state updated assuming given transactions are inBlock. Returns number + * of updated descendants. */ + int UpdatePackagesForAdded(const CTxMemPool::setEntries& alreadyAdded, indexed_modified_transaction_set &mapModifiedTx); }; /** Modify the extranonce in a block */ diff --git a/src/net.cpp b/src/net.cpp index de5fc29693e..5bc886c3408 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -143,7 +143,7 @@ static std::vector convertSeed6(const std::vector &vSeedsIn // one by discovery. CAddress GetLocalAddress(const CNetAddr *paddrPeer, ServiceFlags nLocalServices) { - CAddress ret(CService(CNetAddr(),GetListenPort()), NODE_NONE); + CAddress ret(CService(CNetAddr(),GetListenPort()), nLocalServices); CService addr; if (GetLocal(addr, paddrPeer)) { @@ -413,10 +413,10 @@ void CConnman::DumpBanlist() CBanDB bandb; banmap_t banmap; - SetBannedSetDirty(false); GetBanned(banmap); - if (!bandb.Write(banmap)) - SetBannedSetDirty(true); + if (bandb.Write(banmap)) { + SetBannedSetDirty(false); + } LogPrint("net", "Flushed %d banned node ips/subnets to banlist.dat %dms\n", banmap.size(), GetTimeMillis() - nStart); @@ -536,6 +536,8 @@ bool CConnman::Unban(const CSubNet &subNet) { void CConnman::GetBanned(banmap_t &banMap) { LOCK(cs_setBanned); + // Sweep the banlist so expired bans are not returned + SweepBanned(); banMap = setBanned; //create a thread safe copy } @@ -1579,6 +1581,9 @@ void CConnman::ThreadDNSAddressSeed() LogPrintf("Loading addresses from DNS seeds (could take a while)\n"); BOOST_FOREACH(const CDNSSeedData &seed, vSeeds) { + if (interruptNet) { + return; + } if (HaveNameProxy()) { AddOneShot(seed.host); } else { @@ -1596,6 +1601,9 @@ void CConnman::ThreadDNSAddressSeed() found++; } } + if (interruptNet) { + return; + } // TODO: The seed name resolve may fail, yielding an IP of [::], which results in // addrman assigning the same source to results from different seeds. // This should switch to a hard-coded stable dummy IP for each seed name, so that the @@ -1716,11 +1724,17 @@ void CConnman::ThreadOpenConnections() // Only connect out to one peer per network group (/16 for IPv4). // Do this here so we don't have to critsect vNodes inside mapAddresses critsect. int nOutbound = 0; + int nOutboundRelevant = 0; std::set > setConnected; { LOCK(cs_vNodes); BOOST_FOREACH(CNode* pnode, vNodes) { if (!pnode->fInbound && !pnode->fAddnode) { + + // Count the peers that have all relevant services + if (pnode->fSuccessfullyConnected && !pnode->fFeeler && ((pnode->nServices & nRelevantServices) == nRelevantServices)) { + nOutboundRelevant++; + } // Netgroups for inbound and addnode peers are not excluded because our goal here // is to not use multiple of our limited outbound slots on a single netgroup // but inbound and addnode peers do not use our outbound slots. Inbound peers @@ -1784,14 +1798,27 @@ void CConnman::ThreadOpenConnections() continue; // only consider nodes missing relevant services after 40 failed attempts and only if less than half the outbound are up. - if ((addr.nServices & nRelevantServices) != nRelevantServices && (nTries < 40 || nOutbound >= (nMaxOutbound >> 1))) + ServiceFlags nRequiredServices = nRelevantServices; + if (nTries >= 40 && nOutbound < (nMaxOutbound >> 1)) { + nRequiredServices = REQUIRED_SERVICES; + } + + if ((addr.nServices & nRequiredServices) != nRequiredServices) { continue; + } // do not allow non-default ports, unless after 50 invalid addresses selected already if (addr.GetPort() != Params().GetDefaultPort() && nTries < 50) continue; addrConnect = addr; + + // regardless of the services assumed to be available, only require the minimum if half or more outbound have relevant services + if (nOutboundRelevant >= (nMaxOutbound >> 1)) { + addrConnect.nServices = REQUIRED_SERVICES; + } else { + addrConnect.nServices = nRequiredServices; + } break; } @@ -2318,9 +2345,17 @@ void CConnman::Interrupt() interruptNet(); InterruptSocks5(true); - if (semOutbound) - for (int i=0; i<(nMaxOutbound + nMaxFeeler); i++) + if (semOutbound) { + for (int i=0; i<(nMaxOutbound + nMaxFeeler); i++) { semOutbound->post(); + } + } + + if (semAddnode) { + for (int i=0; ipost(); + } + } } void CConnman::Stop() @@ -2336,10 +2371,6 @@ void CConnman::Stop() if (threadSocketHandler.joinable()) threadSocketHandler.join(); - if (semAddnode) - for (int i=0; ipost(); - if (fAddressesInitialized) { DumpData(); diff --git a/src/net.h b/src/net.h index 29b6a44c88f..dc727152a34 100644 --- a/src/net.h +++ b/src/net.h @@ -92,7 +92,7 @@ static const ServiceFlags REQUIRED_SERVICES = NODE_NETWORK; // NOTE: When adjusting this, update rpcnet:setban's help ("24h") static const unsigned int DEFAULT_MISBEHAVING_BANTIME = 60 * 60 * 24; // Default 24-hour ban -typedef int NodeId; +typedef int64_t NodeId; struct AddedNodeInfo { diff --git a/src/prevector.h b/src/prevector.h index 6b2f578f5c8..cba2e30057a 100644 --- a/src/prevector.h +++ b/src/prevector.h @@ -5,6 +5,7 @@ #ifndef _BITCOIN_PREVECTOR_H_ #define _BITCOIN_PREVECTOR_H_ +#include #include #include #include @@ -170,10 +171,15 @@ class prevector { } } else { if (!is_direct()) { + /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert + success. These should instead use an allocator or new/delete so that handlers + are called as necessary, but performance would be slightly degraded by doing so. */ _union.indirect = static_cast(realloc(_union.indirect, ((size_t)sizeof(T)) * new_capacity)); + assert(_union.indirect); _union.capacity = new_capacity; } else { char* new_indirect = static_cast(malloc(((size_t)sizeof(T)) * new_capacity)); + assert(new_indirect); T* src = direct_ptr(0); T* dst = reinterpret_cast(new_indirect); memcpy(dst, src, size() * sizeof(T)); diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index 790bc71d14b..28ef1fb4640 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -69,6 +69,9 @@ uint256 CTransaction::ComputeHash() const uint256 CTransaction::GetWitnessHash() const { + if (!HasWitness()) { + return GetHash(); + } return SerializeHash(*this, SER_GETHASH, 0); } diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 1c1acb6b103..5c26baef9e8 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -478,6 +478,7 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel) connect(_clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int))); connect(_clientModel, SIGNAL(networkActiveChanged(bool)), this, SLOT(setNetworkActive(bool))); + modalOverlay->setKnownBestHeight(_clientModel->getHeaderTipHeight(), QDateTime::fromTime_t(_clientModel->getHeaderTipTime())); setNumBlocks(_clientModel->getNumBlocks(), _clientModel->getLastBlockDate(), _clientModel->getVerificationProgress(NULL), false); connect(_clientModel, SIGNAL(numBlocksChanged(int,QDateTime,double,bool)), this, SLOT(setNumBlocks(int,QDateTime,double,bool))); @@ -505,8 +506,6 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel) // initialize the disable state of the tray icon with the current value in the model. setTrayIconVisible(optionsModel->getHideTrayIcon()); } - - modalOverlay->setKnownBestHeight(clientModel->getHeaderTipHeight(), QDateTime::fromTime_t(clientModel->getHeaderTipTime())); } else { // Disable possibility to show main window via action toggleHideAction->setEnabled(false); @@ -518,7 +517,10 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel) // Propagate cleared model to child objects rpcConsole->setClientModel(nullptr); #ifdef ENABLE_WALLET - walletFrame->setClientModel(nullptr); + if (walletFrame) + { + walletFrame->setClientModel(nullptr); + } #endif // ENABLE_WALLET unitDisplayControl->setOptionsModel(nullptr); } diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index bb10e494220..20d4687971e 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -36,6 +36,8 @@ ClientModel::ClientModel(OptionsModel *_optionsModel, QObject *parent) : banTableModel(0), pollTimer(0) { + cachedBestHeaderHeight = -1; + cachedBestHeaderTime = -1; peerTableModel = new PeerTableModel(this); banTableModel = new BanTableModel(this); pollTimer = new QTimer(this); @@ -74,18 +76,28 @@ int ClientModel::getNumBlocks() const int ClientModel::getHeaderTipHeight() const { - LOCK(cs_main); - if (!pindexBestHeader) - return 0; - return pindexBestHeader->nHeight; + if (cachedBestHeaderHeight == -1) { + // make sure we initially populate the cache via a cs_main lock + // otherwise we need to wait for a tip update + LOCK(cs_main); + if (pindexBestHeader) { + cachedBestHeaderHeight = pindexBestHeader->nHeight; + cachedBestHeaderTime = pindexBestHeader->GetBlockTime(); + } + } + return cachedBestHeaderHeight; } int64_t ClientModel::getHeaderTipTime() const { - LOCK(cs_main); - if (!pindexBestHeader) - return 0; - return pindexBestHeader->GetBlockTime(); + if (cachedBestHeaderTime == -1) { + LOCK(cs_main); + if (pindexBestHeader) { + cachedBestHeaderHeight = pindexBestHeader->nHeight; + cachedBestHeaderTime = pindexBestHeader->GetBlockTime(); + } + } + return cachedBestHeaderTime; } quint64 ClientModel::getTotalBytesRecv() const @@ -283,6 +295,11 @@ static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CB int64_t& nLastUpdateNotification = fHeader ? nLastHeaderTipUpdateNotification : nLastBlockTipUpdateNotification; + if (fHeader) { + // cache best headers time and height to reduce future cs_main locks + clientmodel->cachedBestHeaderHeight = pIndex->nHeight; + clientmodel->cachedBestHeaderTime = pIndex->GetBlockTime(); + } // if we are in-sync, update the UI regardless of last update time if (!initialSync || now - nLastUpdateNotification > MODEL_UPDATE_DELAY) { //pass a async signal to the UI thread diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h index 2c10e633b84..4c92e2144e3 100644 --- a/src/qt/clientmodel.h +++ b/src/qt/clientmodel.h @@ -8,6 +8,8 @@ #include #include +#include + class AddressTableModel; class BanTableModel; class OptionsModel; @@ -81,6 +83,10 @@ class ClientModel : public QObject QString formatClientStartupTime() const; QString dataDir() const; + // caches for the best header + mutable std::atomic cachedBestHeaderHeight; + mutable std::atomic cachedBestHeaderTime; + private: OptionsModel *optionsModel; PeerTableModel *peerTableModel; diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui index ca8ecffafea..f13b0d9cf92 100644 --- a/src/qt/forms/sendcoinsdialog.ui +++ b/src/qt/forms/sendcoinsdialog.ui @@ -760,10 +760,32 @@ + + + Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until your have validated the complete chain. + + + + 75 + true + + + + Warning: Fee estimation is currently not possible. + + + false + + + + Qt::Horizontal + + QSizePolicy::MinimumExpanding + 40 diff --git a/src/qt/locale/bitcoin_af.ts b/src/qt/locale/bitcoin_af.ts index 9726987b63b..032d5cca4f9 100644 --- a/src/qt/locale/bitcoin_af.ts +++ b/src/qt/locale/bitcoin_af.ts @@ -74,6 +74,10 @@ &Dupliseer Adres + Copy &Label + Kopieer &Etiket + + &Edit &Verander @@ -200,6 +204,14 @@ U het die verkeerde wagwoord ingetik. + Wallet decryption failed + Beursie-dekripsie het misluk + + + Wallet passphrase was successfully changed. + Beursie wagwoordfrase is suksesvol verander. + + Warning: The Caps Lock key is on! WAARSKUWING: Outomatiese Kapitalisering is aktief op u sleutelbord! @@ -207,6 +219,10 @@ BanTableModel + IP/Netmask + IP/Netmasker + + Banned Until Verban tot @@ -214,6 +230,10 @@ BitcoinGUI + Sign &message... + Teken &boodskap... + + Synchronizing with network... Netwerk-sinkronisasie... @@ -294,6 +314,18 @@ Oop & URI... + Click to disable network activity. + Kliek om netwerkaktiwiteit af te skakel. + + + Network activity disabled. + Netwerkaktiwiteit gedeaktiveer. + + + Click to enable network activity again. + Kliek om netwerkaktiwiteit weer aan te skakel. + + Reindexing blocks on disk... Besig met herindeksering van blokke op hardeskyf... @@ -310,6 +342,14 @@ Verander die wagwoord wat ek vir kodifikasie van my beursie gebruik + &Debug window + &Ontfout venster + + + Open debugging and diagnostic console + Maak ontfouting en diagnostiese konsole oop + + Bitcoin Bitcoin diff --git a/src/qt/locale/bitcoin_af_ZA.ts b/src/qt/locale/bitcoin_af_ZA.ts index 1679482c771..432e8c3faf8 100644 --- a/src/qt/locale/bitcoin_af_ZA.ts +++ b/src/qt/locale/bitcoin_af_ZA.ts @@ -6,6 +6,10 @@ Skep 'n nuwe adres + &New + &Nuwe + + Copy the currently selected address to the system clipboard Maak 'n kopie van die huidige adres na die stelsel klipbord @@ -18,6 +22,14 @@ Verwyder die huidiglik gekieste address van die lys + Export the data in the current tab to a file + Voer inligting uit van die huidige blad na n lêer + + + &Export + &Uitvoer + + &Delete &Verwyder @@ -25,6 +37,42 @@ Choose the address to send coins to Kies die address na wie die muntstukke gestuur moet word + + C&hoose + K&ies + + + Sending addresses + Stuur adresse + + + Receiving addresses + Ontvang adresse + + + &Copy Address + &Kopie adres + + + Copy &Label + Kopie &Etiket + + + &Edit + &Wysig + + + Export Address List + Voer adres lys uit + + + Comma separated file (*.csv) + Koma geskeide lêers (*.csv) + + + Exporting Failed + Uitvoering Misluk + AddressTableModel @@ -661,6 +709,10 @@ Kopieer bedrag + Comma separated file (*.csv) + Koma geskeide lêers (*.csv) + + Date Datum @@ -681,6 +733,10 @@ ID + Exporting Failed + Uitvoering Misluk + + Range: Reeks: @@ -704,6 +760,14 @@ WalletView + + &Export + &Uitvoer + + + Export the data in the current tab to a file + Voer inligting uit van die huidige blad na n lêer + bitcoin-core diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts index 54ef4a2bdf5..bc3fcb278e6 100644 --- a/src/qt/locale/bitcoin_da.ts +++ b/src/qt/locale/bitcoin_da.ts @@ -3,7 +3,7 @@ AddressBookPage Right-click to edit address or label - Højreklik for at redigere adresse eller mærke + Højreklik for at redigere adresse eller mærkat Create a new address @@ -604,7 +604,7 @@ Received with label - Modtaget med mærke + Modtaget med mærkat Received with address @@ -3123,7 +3123,7 @@ Reduce storage requirements by enabling pruning (deleting) of old blocks. This allows the pruneblockchain RPC to be called to delete specific blocks, and enables automatic pruning of old blocks if a target size in MiB is provided. This mode is incompatible with -txindex and -rescan. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, 1 = allow manual pruning via RPC, >%u = automatically prune block files to stay under the specified target size in MiB) - Reducér pladskravene ved at beskære (slette, "prune") gamle blokke. Dette tillader pruneblockchain-RPC'en at blive kaldt for at slette specifikke blokke, og det aktiverer automatisk beskæring af gamle blokke, hvis en målstørrelse i MiB er angivet. Denne tilstand er ikke kompatibel med -txindex og -rescan. Advarsel: Fortrydelse af denne indstilling kræver download af hele blokkæden igen. (standard: 0 = slå beskæring af blokke fra, 1 = tillad manuel beskæring via RPC, >%u = beskær automatisk blokfiler for at bliver under den angivne målstørrelse i MiB) + Reducér pladskravene ved at beskære (slette, “prune”) gamle blokke. Dette tillader pruneblockchain-RPC'en at blive kaldt for at slette specifikke blokke, og det aktiverer automatisk beskæring af gamle blokke, hvis en målstørrelse i MiB er angivet. Denne tilstand er ikke kompatibel med -txindex og -rescan. Advarsel: Fortrydelse af denne indstilling kræver download af hele blokkæden igen. (standard: 0 = slå beskæring af blokke fra, 1 = tillad manuel beskæring via RPC, >%u = beskær automatisk blokfiler for at bliver under den angivne målstørrelse i MiB) Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s) diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts index af79d477363..1a6c9cc4bad 100644 --- a/src/qt/locale/bitcoin_de.ts +++ b/src/qt/locale/bitcoin_de.ts @@ -79,7 +79,7 @@ &Edit - &Editieren + B&earbeiten Export Address List @@ -133,7 +133,7 @@ Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. - Geben Sie die neue Passphrase für die Wallet ein.<br>Bitte benutzen Sie eine Passphrase bestehend aus <b>zehn oder mehr zufälligen Zeichen</b> oder <b>acht oder mehr Wörtern</b>. + Geben Sie die neue Passphrase für die Brieftasche ein.<br>Bitte benutzen Sie eine Passphrase bestehend aus <b>zehn oder mehr zufälligen Zeichen</b> oder <b>acht oder mehr Wörtern</b>. Encrypt wallet @@ -141,7 +141,7 @@ This operation needs your wallet passphrase to unlock the wallet. - Dieser Vorgang benötigt ihre Passphrase, um die Wallet zu entsperren. + Dieser Vorgang benötigt ihre Passphrase, um die Brieftasche zu entsperren. Unlock wallet @@ -149,11 +149,11 @@ This operation needs your wallet passphrase to decrypt the wallet. - Dieser Vorgang benötigt Ihre Passphrase, um die Wallet zu entschlüsseln. + Dieser Vorgang benötigt Ihre Passphrase, um die Brieftasche zu entschlüsseln. Decrypt wallet - Wallet entschlüsseln + Brieftasche entschlüsseln Change passphrase @@ -161,39 +161,39 @@ Enter the old passphrase and new passphrase to the wallet. - Geben Sie die alte und neue Wallet-Passphrase ein. + Geben Sie die alte und neue Brieftschen-Passphrase ein. Confirm wallet encryption - Wallet-Verschlüsselung bestätigen + Brieftaschen-Verschlüsselung bestätigen Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! - Warnung: Wenn Sie Ihre Wallet verschlüsseln und Ihre Passphrase verlieren, werden Sie <b>alle Ihre Bitcoins verlieren</b>! + Warnung: Wenn Sie Ihre Brieftasche verschlüsseln und Ihre Passphrase verlieren, werden Sie <b>alle Ihre Bitcoins verlieren</b>! Are you sure you wish to encrypt your wallet? - Sind Sie sich sicher, dass Sie Ihre Wallet verschlüsseln möchten? + Sind Sie sich sicher, dass Sie Ihre Brieftasche verschlüsseln möchten? Wallet encrypted - Wallet verschlüsselt + Brieftasche verschlüsselt %1 will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. - %1 wird jetzt beendet, um den Verschlüsselungsprozess abzuschließen. Bitte beachten Sie, dass die Wallet-Verschlüsselung nicht vollständig vor Diebstahl Ihrer Bitcoins durch Schadprogramme schützt, die Ihren Computer befällt. + %1 wird jetzt beendet, um den Verschlüsselungsprozess abzuschließen. Bitte beachten Sie, dass die Brieftaschen-Verschlüsselung nicht vollständig vor Diebstahl Ihrer Bitcoins durch Schadprogramme schützt, die Ihren Computer befällt. IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. - WICHTIG: Alle vorherigen Wallet-Sicherungen sollten durch die neu erzeugte, verschlüsselte Wallet ersetzt werden. Aus Sicherheitsgründen werden vorherige Sicherungen der unverschlüsselten Wallet nutzlos, sobald Sie die neue, verschlüsselte Wallet verwenden. + WICHTIG: Alle vorherigen Brieftaschen-Sicherungen sollten durch die neu erzeugte, verschlüsselte Brieftasche ersetzt werden. Aus Sicherheitsgründen werden vorherige Sicherungen der unverschlüsselten Brieftasche nutzlos, sobald Sie die neue, verschlüsselte Brieftasche verwenden. Wallet encryption failed - Wallet-Verschlüsselung fehlgeschlagen + Brieftaschen-Verschlüsselung fehlgeschlagen Wallet encryption failed due to an internal error. Your wallet was not encrypted. - Die Wallet-Verschlüsselung ist aufgrund eines internen Fehlers fehlgeschlagen. Ihre Wallet wurde nicht verschlüsselt. + Die Brieftaschen-Verschlüsselung ist aufgrund eines internen Fehlers fehlgeschlagen. Ihre Brieftasche wurde nicht verschlüsselt. The supplied passphrases do not match. @@ -201,19 +201,19 @@ Wallet unlock failed - Wallet-Entsperrung fehlgeschlagen + Brieftaschen-Entsperrung fehlgeschlagen The passphrase entered for the wallet decryption was incorrect. - Die eingegebene Passphrase zur Wallet-Entschlüsselung war nicht korrekt. + Die eingegebene Passphrase zur Brieftaschen-Entschlüsselung war nicht korrekt. Wallet decryption failed - Wallet-Entschlüsselung fehlgeschlagen + Brieftaschen-Entschlüsselung fehlgeschlagen Wallet passphrase was successfully changed. - Die Wallet-Passphrase wurde erfolgreich geändert. + Die Brieftaschen-Passphrase wurde erfolgreich geändert. Warning: The Caps Lock key is on! @@ -439,7 +439,7 @@ Indexing blocks on disk... - Reindiziere Blöcke auf Datenträger... + Indiziere Blöcke auf Datenträger... Processing blocks on disk... @@ -636,7 +636,7 @@ Copy transaction ID - Transaktionskennung kopieren + Transaktions-ID kopieren Lock unspent @@ -660,7 +660,7 @@ Copy bytes - Byte kopieren + Bytes kopieren Copy dust @@ -751,7 +751,7 @@ Could not unlock wallet. - Wallet konnte nicht entsperrt werden. + Brieftasche konnte nicht entsperrt werden. New key generation failed. @@ -817,7 +817,7 @@ Set language, for example "de_DE" (default: system locale) - Sprache einstellen, zum Beispiel "de_DE" (default: system locale) + Sprache einstellen, zum Beispiel "de_DE" (Standard: Systemgebietsschema) Start minimized @@ -825,7 +825,7 @@ Set SSL root certificates for payment request (default: -system-) - SSL-Wurzelzertifikate für Zahlungsanforderungen festlegen (Standard: -system-) + SSL-Wurzelzertifikate für Zahlungsanforderungen festlegen (Standard: Systemstandard) Show splash screen on startup (default: %u) @@ -886,6 +886,14 @@ Formular + Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below. + Neueste Transaktionen werden eventuell noch nicht angezeigt, daher könnte Ihr Kontostand veraltet sein. Er wird korrigiert, sobald Ihr Wallet die Synchronisation mit dem Bitcoin-Netzwerk erfolgreich abgeschlossen. Details dazu finden sich weiter unten. + + + Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. + Versuche, Bitcoins aus noch nicht angezeigten Transaktionen auszugeben, werden vom Netzwerk nicht akzeptiert. + + Number of blocks left Anzahl verbleibender Blöcke @@ -2201,6 +2209,10 @@ Bestätige benutzerdefinierte Wechselgeld-Adresse + The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure? + Die ausgewählte Wechselgeld-Adresse ist nicht Bestandteil dieses Wallets. Einige oder alle Mittel aus Ihrem Wallet könnten an diese Adresse gesendet werden. Wollen Sie das wirklich? + + (no label) (keine Bezeichnung) @@ -2998,6 +3010,10 @@ Eingehende Verbindungen annehmen (Standard: 1, wenn nicht -proxy oder -connect/-noconnect) + Connect only to the specified node(s); -noconnect or -connect=0 alone to disable automatic connections + Verbindungen nur zu spezifizierten Node(s); verwenden Sie -noconnect oder -connect=0 alleine um automatische Verbindungen zu deaktivieren + + Distributed under the MIT software license, see the accompanying file %s or %s Veröffentlicht unter der MIT-Softwarelizenz, siehe beiligende Datei %s oder %s. @@ -3074,6 +3090,14 @@ Befehl ausführen wenn sich eine Wallet-Transaktion verändert (%s im Befehl wird durch die Transaktions-ID ersetzt) + Extra transactions to keep in memory for compact block reconstructions (default: %u) + Zusätzliche Transaktionen für kompakten Block-Nachbau im Speicher vorhalten (default: %u) + + + If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: %s, testnet: %s) + Sofern dieser Block Bestandteil der Blockchain ist, nehme an das er und seine Vorgänger gültig sind und überspringe ggf. dessen Skriptverifikation (0 um alle zu verifizieren, default: %s, testnet: %s) + + Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds) Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds) @@ -3090,6 +3114,14 @@ Wenn sie %s nützlich finden, sind Helfer sehr gern gesehen. Besuchen Sie %s um mehr über das Softwareprojekt zu erfahren. + Reduce storage requirements by enabling pruning (deleting) of old blocks. This allows the pruneblockchain RPC to be called to delete specific blocks, and enables automatic pruning of old blocks if a target size in MiB is provided. This mode is incompatible with -txindex and -rescan. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, 1 = allow manual pruning via RPC, >%u = automatically prune block files to stay under the specified target size in MiB) + Speicherplatzanforderung durch Kürzen (Pruning) alter Blöcke reduzieren. Dies erlaubt das Aufrufen des sogenannten Pruneblockchain RPC zum Löschen spezifischer Blöcke und und aktiviert das automatische Pruning alter Blöcke, sofern eine Zielgröße in MIB angegeben wird. Dieser Modus ist nicht mit -txindex und -resacan kompatibel. Warnung: Das Rücksetzen dieser Einstellung erfordert das erneute Herunterladen der gesamten Blockchain. (Standard: 0 = deaktiviert das Pruning, 1 = erlaubt manuelles Pruning via RPC, >%u = automatisches Pruning der Blockdateien, um angegebene Maximalgröße nicht zu überschreiten) + + + Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s) + Niedrigste Gebühr (in %s/kB) für Transaktionen einstellen, die bei der Blockerzeugung berücksichtigt werden sollen. (default: %s) + + Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d) Maximale Anzahl an Skript-Verifizierungs-Threads festlegen (%u bis %d, 0 = automatisch, <0 = so viele Kerne frei lassen, Standard: %d) @@ -3114,6 +3146,10 @@ Benutzername und gehashtes Passwort für JSON-RPC Verbindungen. Das Feld <userpw> kommt im Format: <USERNAME>:<SALT>$<HASH>. Ein kanonisches Pythonskript ist in share/rpcuser inbegriffen. Der client benutzt wie gehabt, die rpcuser/rpcpassword Parameter. Diese Option kann mehrere Male spezifiziert werden + Wallet will not create transactions that violate mempool chain limits (default: %u) + Das Wallet erzeugt keine Transaktionen, die das Mempool Chain Limit überschreiten (Standardeinstellung: %u) + + Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues. Warnung: Das Netzwerk scheint nicht vollständig übereinzustimmen! Einige Miner scheinen Probleme zu haben. @@ -3154,6 +3190,10 @@ Kann Adresse in -%s nicht auflösen: '%s' + Chain selection options: + Chain Auswahloptionen: + + Change index out of range Position des Wechselgelds außerhalb des Bereichs @@ -3646,6 +3686,10 @@ Adressen von Gegenstellen via DNS-Namensauflösung finden, falls zu wenige Adressen verfügbar sind (Standard: 1, außer bei -connect/-noconnect) + Sets the serialization of raw transaction or block hex returned in non-verbose mode, non-segwit(0) or segwit(1) (default: %d) + Setzt die Serialisierung von Rohtransaktionen oder Block Hex-Daten auf non-verbose mode, nicht-Segwit(0) oder Segwit(1) (default: %d) + + Support filtering of blocks and transaction with bloom filters (default: %u) Unterstütze Blöcke und Transaktionen mit Bloomfiltern zu filtern (default: %u) @@ -3706,6 +3750,10 @@ Ungültige Adresse in -proxy: '%s' + Keypool ran out, please call keypoolrefill first + Der Keypool ist erschöpft. Bitte rufen Sie zunächst keypoolrefill auf. + + Listen for JSON-RPC connections on <port> (default: %u or testnet: %u) <port> nach JSON-RPC-Verbindungen abhören (Standard: %u oder Testnetz: %u) @@ -3774,6 +3822,14 @@ Unbestätigtes Wechselgeld darf beim Senden von Transaktionen ausgegeben werden (Standard: %u) + Starting network threads... + Netzwerk-Threads werden gestartet... + + + The wallet will avoid paying less than the minimum relay fee. + Das Wallet verhindert Zahlungen, die die Mindesttransaktionsgebühr nicht berücksichtigen. + + This is the minimum transaction fee you pay on every transaction. Dies ist die minimale Gebühr die beim Senden einer Transaktion fällig wird. @@ -3790,6 +3846,14 @@ Transaktionsbeträge dürfen nicht negativ sein. + Transaction has too long of a mempool chain + Die Speicherpoolkette der Transaktion ist zu lang. + + + Transaction must have at least one recipient + Die Transaktion muss mindestens einen Empfänger enthalten. + + Unknown network specified in -onlynet: '%s' Unbekannter Netztyp in -onlynet angegeben: '%s' diff --git a/src/qt/locale/bitcoin_el_GR.ts b/src/qt/locale/bitcoin_el_GR.ts index 0390a378e77..5c72b4d1585 100644 --- a/src/qt/locale/bitcoin_el_GR.ts +++ b/src/qt/locale/bitcoin_el_GR.ts @@ -41,10 +41,58 @@ &Delete &Διαγραφή + + Choose the address to send coins to + Επιλέξτε διεύθυνση αποστολής των νομισμάτων σας + + + Choose the address to receive coins with + Επιλέξτε διεύθυνση παραλαβής νομισμάτων + + + Sending addresses + Διευθύνσεις αποστολής + + + Receiving addresses + Διευθύνσεις λήψης + + + &Copy Address + &Αντιγραφή Διεύθυνσης + + + Copy &Label + Αντιγραφή&Ετικέτα + + + &Edit + &Διόρθωση + + + Export Address List + Εξαγωγή Λίστας Διεύθυνσεων + + + Exporting Failed + Αποτυχία Εξαγωγής + AddressTableModel - + + Label + Ετικέτα + + + Address + Διεύθυνση + + + (no label) + (χωρίς ετικέτα) + + AskPassphraseDialog @@ -63,6 +111,18 @@ Repeat new passphrase Επανέλαβε τον νέο κωδικό πρόσβασης + + Unlock wallet + Ξεκλειδωσε το πορτοφολι + + + Change passphrase + Αλλάξτε Φράση Πρόσβασης + + + Wallet unlock failed + Το Ξεκλείδωμα του Πορτοφολιού Απέτυχε + BanTableModel @@ -394,6 +454,26 @@ Confirmed Επικυρωμένες + + Copy address + Αντιγραφή διεύθυνσης + + + Copy label + Αντιγραφή ετικέτας + + + Copy amount + Αντιγραφή ποσού + + + Copy transaction ID + Αντιγραφή ταυτότητας συναλλαγής + + + (no label) + (χωρίς ετικέτα) + EditAddressDialog @@ -417,6 +497,18 @@ &Address &Διεύθυνση + + New receiving address + Νέα Διεύθυνση Λήψης + + + New sending address + Νέα Διεύθυνση Αποστολής + + + Edit receiving address + Διόρθωση Διεύθυνσης Λήψης + FreespaceChecker @@ -1064,7 +1156,15 @@ Remove Αφαίρεση - + + Copy label + Αντιγραφή ετικέτας + + + Copy amount + Αντιγραφή ποσού + + ReceiveRequestDialog @@ -1083,9 +1183,29 @@ &Save Image... &Αποθήκευση εικόνας... + + Address + Διεύθυνση + + + Label + Ετικέτα + RecentRequestsTableModel + + Date + Ημερομήνια + + + Label + Ετικέτα + + + (no label) + (χωρίς ετικέτα) + SendCoinsDialog @@ -1209,7 +1329,15 @@ S&end Αποστολη - + + Copy amount + Αντιγραφή ποσού + + + (no label) + (χωρίς ετικέτα) + + SendCoinsEntry @@ -1374,6 +1502,70 @@ TransactionDesc + + Open until %1 + Ανοιχτό μέχρι %1 + + + %1/offline + %1/αποσυνδεδεμένο + + + 0/unconfirmed, %1 + 0/ανεπιβεβαίωτο, %1 + + + Date + Ημερομηνία + + + Source + Πηγή + + + Generated + Παράχθηκε + + + From + Από + + + unknown + Άγνωστο + + + To + Προς + + + own address + δική σας διεύθυνση + + + watch-only + παρακολούθηση-μόνο + + + label + ετικέτα + + + Credit + Πίστωση + + + not accepted + μη έγκυρο + + + Total credit + Συνολική πίστωση + + + Transaction fee + Κόστος συναλλαγής + TransactionDescDialog @@ -1384,9 +1576,69 @@ TransactionTableModel + + Date + Ημερομήνια + + + Label + Ετικέτα + + + Open until %1 + Ανοιχτό μέχρι %1 + + + watch-only + παρακολούθηση-μόνο + + + (no label) + (χωρίς ετικέτα) + TransactionView + + Copy address + Αντιγραφή διεύθυνσης + + + Copy label + Αντιγραφή ετικέτας + + + Copy amount + Αντιγραφή ποσού + + + Copy transaction ID + Αντιγραφή ταυτότητας συναλλαγής + + + Copy raw transaction + Αντιγραφή ανεπεξέργαστης συναλλαγής + + + Edit label + Επεξεργασία ετικέτας + + + Date + Ημερομήνια + + + Label + Ετικέτα + + + Address + Διεύθυνση + + + Exporting Failed + Αποτυχία Εξαγωγής + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts index f62f1e4a734..b2019cf9aea 100644 --- a/src/qt/locale/bitcoin_en.ts +++ b/src/qt/locale/bitcoin_en.ts @@ -304,12 +304,12 @@ Sign &message... - + Synchronizing with network... Synchronizing with network... - + &Overview &Overview @@ -404,7 +404,7 @@ - + Click to disable network activity. @@ -429,7 +429,7 @@ Reindexing blocks on disk... - + Send coins to a Bitcoin address Send coins to a Bitcoin address @@ -459,12 +459,12 @@ &Verify message... - + Bitcoin Bitcoin - + Wallet Wallet @@ -549,7 +549,7 @@ - + %n active connection(s) to Bitcoin network %n active connection to Bitcoin network @@ -610,12 +610,12 @@ Up to date - + Show the %1 help message to get a list with possible Bitcoin command-line options - + %1 client @@ -849,7 +849,7 @@ - + yes @@ -1499,7 +1499,7 @@ - + The supplied proxy address is invalid. The supplied proxy address is invalid. @@ -1601,7 +1601,7 @@ PaymentServer - + @@ -1760,7 +1760,7 @@ - + %1 d @@ -2030,7 +2030,7 @@ - + Select a peer to view detailed information. diff --git a/src/qt/locale/bitcoin_eo.ts b/src/qt/locale/bitcoin_eo.ts index b4ed5e7fd50..16c584c4b10 100644 --- a/src/qt/locale/bitcoin_eo.ts +++ b/src/qt/locale/bitcoin_eo.ts @@ -41,10 +41,78 @@ &Delete &Forigi - + + Choose the address to send coins to + Elekti la adreson por sendi monerojn + + + Choose the address to receive coins with + Elekti la adreson ricevi monerojn kun + + + C&hoose + &Elekti + + + Sending addresses + Sendaj adresoj + + + Receiving addresses + Ricevaj adresoj + + + These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + Jen viaj Bitmon-adresoj por sendi pagojn. Zorge kontrolu la sumon kaj la alsendan adreson antaŭ ol sendi. + + + These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. + Jen viaj bitmonaj adresoj por ricevi pagojn. Estas konsilinde uzi apartan ricevan adreson por ĉiu transakcio. + + + &Copy Address + &Kopii Adreson + + + Copy &Label + Kopii &Etikedon + + + &Edit + &Redakti + + + Export Address List + Eksporti Adresliston + + + Comma separated file (*.csv) + Perkome disigita dosiero (*.csv) + + + Exporting Failed + ekspotado malsukcesinta + + + There was an error trying to save the address list to %1. Please try again. + Okazis eraron dum konservo de adreslisto al %1. Bonvolu provi denove. + + AddressTableModel - + + Label + Etikedo + + + Address + Adreso + + + (no label) + (neniu etikedo) + + AskPassphraseDialog @@ -386,6 +454,10 @@ Confirmed Konfirmita + + (no label) + (neniu etikedo) + EditAddressDialog @@ -934,9 +1006,25 @@ &Save Image... &Konservi Bildon... + + Address + Adreso + + + Label + Etikedo + RecentRequestsTableModel + + Label + Etikedo + + + (no label) + (neniu etikedo) + SendCoinsDialog @@ -1016,7 +1104,11 @@ S&end Ŝendi - + + (no label) + (neniu etikedo) + + SendCoinsEntry @@ -1179,9 +1271,33 @@ TransactionTableModel + + Label + Etikedo + + + (no label) + (neniu etikedo) + TransactionView + + Comma separated file (*.csv) + Perkome disigita dosiero (*.csv) + + + Label + Etikedo + + + Address + Adreso + + + Exporting Failed + ekspotado malsukcesinta + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts index fc71bf841be..1cac03951c6 100644 --- a/src/qt/locale/bitcoin_es.ts +++ b/src/qt/locale/bitcoin_es.ts @@ -486,6 +486,10 @@ %1 cliente + Connecting to peers... + Conectando a pares... + + Catching up... Actualizando... @@ -891,7 +895,7 @@ Number of blocks left - Número de bloques dejados + Número de bloques restantes Unknown... @@ -1722,7 +1726,7 @@ WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramification of a command. - ADVERTENCIA: Los estafadores han sido activados, diciéndoles a los usuarios que escriban comandos aquí, robando el contenido de sus monederos. No utilice esta consola sin entender completamente la repercusión de un comando. + ADVERTENCIA: Hay estafadores activos diciendo a los usuarios que escriban comandos aquí y robando el contenido de sus monederos. No utilice esta consola sin entender completamente la repercusión de un comando. Network activity disabled @@ -2473,6 +2477,10 @@ TransactionDesc + + Open for %n more block(s) + Abrir para %n bloque másAbrir para %n bloques más + Open until %1 Abierto hasta %1 @@ -2517,6 +2525,10 @@ , has not been successfully broadcast yet , no ha sido emitido con éxito aún + + , broadcast through %n node(s) + , transmitir a través de %n nodo, transmitir a través de %n nodos + Date Fecha @@ -2557,6 +2569,10 @@ Credit Credito + + matures in %n more block(s) + disponible en %n bloque másdisponible en %n bloques más + not accepted no aceptada @@ -2594,6 +2610,10 @@ Identificador de transacción (ID) + Transaction total size + Tamaño total de transacción + + Output index Indice de salida @@ -2655,6 +2675,10 @@ Label Etiqueta + + Open for %n more block(s) + Abrir para %n bloque másAbrir para %n bloques más + Open until %1 Abierto hasta %1 @@ -2988,6 +3012,18 @@ + Accept connections from outside (default: 1 if no -proxy or -connect/-noconnect) + Aceptar conexiones desde el exterior (predeterminado: 1 si no -proxy o -connect/-desconectar) + + + Connect only to the specified node(s); -noconnect or -connect=0 alone to disable automatic connections + Conectar sólo al nodo(s) especificado; -no conectar or -conectar=solo 0 para deshabilitar conexiones automáticas + + + Distributed under the MIT software license, see the accompanying file %s or %s + Distribuido bajo la licencia de software MIT, vea el archivo adjunto %s o %s + + If <category> is not supplied or if <category> = 1, output all debugging information. Si <category> no es proporcionado o si <category> =1, muestra toda la información de depuración. @@ -3065,6 +3101,14 @@ Ejecutar comando cuando una transacción del monedero cambia (%s en cmd se remplazará por TxID) + Extra transactions to keep in memory for compact block reconstructions (default: %u) + Transacciones extra a mantener en la memoria para reconstrucciones de bloque compacto (predeterminado: %u) + + + If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: %s, testnet: %s) + Si este bloque está en la cadena asuma que sus predecesores y él son válidos y potencialmente se saltan su script de verificación (0 para verificar todo, predeterminado: %s, testnet: %s) + + Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds) Ajuste máximo permitido del tiempo offset medio de pares. La perspectiva local de tiempo se verá influenciada por los pares anteriores y posteriores a esta cantidad. (Por defecto: %u segundos) @@ -3081,6 +3125,14 @@ Contribuya si encuentra %s de utilidad. Visite %s para mas información acerca del programa. + Reduce storage requirements by enabling pruning (deleting) of old blocks. This allows the pruneblockchain RPC to be called to delete specific blocks, and enables automatic pruning of old blocks if a target size in MiB is provided. This mode is incompatible with -txindex and -rescan. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, 1 = allow manual pruning via RPC, >%u = automatically prune block files to stay under the specified target size in MiB) + Reducir los requerimientos de almacenamiento habilitando la poda (eliminación) de los bloques viejos. Esto permite que la cadena de bloqueo RPC sea llamada para eliminar bloques específicos, y habilita la poda automática de bloques viejos si se provee el tamaño de un objetivo en MiB. Este modo es incompatible con -txindex and -rescan. Precaución: Revertir este ajuste requiere volver a descargar la cadena de bloqueo completa. (predefinido: 0 = deshabilita bloques de poda, 1 = permite la poda manual mediante RPC, >%u = elimina automáticamente los archivos de bloqueo para permanecer bajo el tamaño del objetivo especificado en MiB) + + + Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s) + Establecer la tasa más baja (en %s/kB) por transacciones para incluirse en la creación de bloque. (predeterminado: %s) + + Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d) Establecer el número de hilos (threads) de verificación de scripts (entre %u y %d, 0 = automático, <0 = dejar libres ese número de núcleos; predeterminado: %d) @@ -3089,6 +3141,10 @@ La base de datos de bloques contiene un bloque que parece ser del futuro. Esto puede ser porque la fecha y hora de tu ordenador están mal ajustados. Reconstruye la base de datos de bloques solo si estas seguro de que la fecha y hora de tu ordenador estan ajustados correctamente. + This is a pre-release test build - use at your own risk - do not use for mining or merchant applications + Esta es una versión de prueba prelanzada - utilícelo a su propio riesgo - no lo utilice para aplicaciones de minería o comerciales + + Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain No es posible reconstruir la base de datos a un estado anterior. Debe descargar de nuevo la cadena de bloques. @@ -3097,6 +3153,22 @@ Utiliza UPnP para asignar el puerto de escucha (predeterminado: 1 cuando esta escuchando sin -proxy) + Username and hashed password for JSON-RPC connections. The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is included in share/rpcuser. The client then connects normally using the rpcuser=<USERNAME>/rpcpassword=<PASSWORD> pair of arguments. This option can be specified multiple times + Nombre de usuario y contraseña numerada para conexiones JSON-RPC. El campo <userpw> viene en el formato: <USERNAME>:<SALT>$<HASH>. Un script canónico de python está incluído en compartir/usuario rpc. Entonces el cliente se conecta normalmente utilizando la pareja de argumentos usuario rpc=<USERNAME>/contraseña rpc=<PASSWORD>. Esta opción puede ser especificada múltiples veces + + + Wallet will not create transactions that violate mempool chain limits (default: %u) + El monedero no creará transacciones que violen los límites de la cadena mempool (predeterminado: %u) + + + Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues. + Advertencia: ¡La red no parece coincidir del todo! Algunos mineros parecen estar experimentando problemas. + + + Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade. + Advertencia: ¡No parecemos estar del todo con nuestros pares! Puede que necesite actualizarse, o puede que otros nodos necesiten actualizarse. + + You need to rebuild the database using -reindex-chainstate to change -txindex Necesita reconstruir la base de datos usando -reindex-chainstate para cambiar -txindex @@ -3129,6 +3201,10 @@ No se puede resolver -%s direccion: '%s' + Chain selection options: + Opciones de selección en cadena: + + Change index out of range Cambio de indice fuera de rango @@ -3325,6 +3401,10 @@ Usar UPnP para asignar el puerto de escucha (predeterminado:: %u) + Use the test chain + Utilice la cadena de prueba + + User Agent comment (%s) contains unsafe characters. El comentario del Agente de Usuario (%s) contiene caracteres inseguros. @@ -3619,6 +3699,10 @@ Mostrar depuración (por defecto: %u, proporcionar <category> es opcional) + Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect/-noconnect) + Preguntar por direcciones pares al buscar DNS, si baja en las direcciones (predeterminado: 1 a menos que -connect/-noconnect) + + Sets the serialization of raw transaction or block hex returned in non-verbose mode, non-segwit(0) or segwit(1) (default: %d) https://www.transifex.com/joyful-world/breaking-english/ Establecer la serialización de las transacciones sin procesar o el bloque hex devuelto en non-verbose mode, non-segwit(O) o segwit(1) (default: %d) @@ -3628,6 +3712,14 @@ Establecer la serialización de las transacciones sin procesar o el bloque hex d Admite filtrado de bloques, y transacciones con filtros Bloom. Reduce la carga de red. ( por defecto :%u) + This is the transaction fee you may pay when fee estimates are not available. + Esta es la tarifa de cuota que debe pagar cuando las estimaciones de tarifas no estén disponibles. + + + This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit %s and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard. + Este producto incluye software desarrollado por el Proyecto OpenSSL para utilizarlo en el juego de herramientas OpenSSL %s y software criptográfico escrito por Eric Young y software UPnP escrito por Thomas Bernard. + + Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments. La longitud total de la cadena de versión de red ( %i ) supera la longitud máxima ( %i ) . Reducir el número o tamaño de uacomments . @@ -3660,6 +3752,10 @@ Establecer la serialización de las transacciones sin procesar o el bloque hex d Los pares de listas blancas que se conectan desde la dirección IP dada (por ejemplo, 1.2.3.4) o la red marcada CIDR (por ejemplo, 1.2.3.0/24). Se puede especificar varias veces. + %s is set very high! + ¡%s se establece muy alto! + + (default: %s) (predeterminado: %s) @@ -3680,6 +3776,10 @@ Establecer la serialización de las transacciones sin procesar o el bloque hex d Dirección -proxy inválida: '%s' + Keypool ran out, please call keypoolrefill first + Keypool se ha agotado, llame a keypoolrefill primero + + Listen for JSON-RPC connections on <port> (default: %u or testnet: %u) Escuchar conexiones JSON-RPC en <puerto> (predeterminado: %u o testnet: %u) @@ -3716,6 +3816,10 @@ Establecer la serialización de las transacciones sin procesar o el bloque hex d Relay non-P2SH multisig (default: %u) + Send transactions with full-RBF opt-in enabled (default: %u) + Enviar transacciones con full-RBF opt-in habilitado (predeterminado: %u) + + Set key pool size to <n> (default: %u) Ajustar el número de claves en reserva <n> (predeterminado: %u) @@ -3748,10 +3852,34 @@ Establecer la serialización de las transacciones sin procesar o el bloque hex d Iniciando funciones de red... + The wallet will avoid paying less than the minimum relay fee. + El monedero evitará pagar menos que la cuota de retransmisión mínima. + + + This is the minimum transaction fee you pay on every transaction. + Esta es la tarifa mínima de transacción que usted paga en cada transacción. + + + This is the transaction fee you will pay if you send a transaction. + Esta es la cuota de transacción que pagará si envía una transacción. + + Threshold for disconnecting misbehaving peers (default: %u) Umbral para la desconexión de pares con mal comportamiento (predeterminado: %u) + Transaction amounts must not be negative + Las cantidades de transacción no deben ser negativa + + + Transaction has too long of a mempool chain + La transacción tiene demasiado tiempo de una cadena de mempool + + + Transaction must have at least one recipient + La transacción debe de tener al menos un receptor + + Unknown network specified in -onlynet: '%s' La red especificada en -onlynet '%s' es desconocida diff --git a/src/qt/locale/bitcoin_es_ES.ts b/src/qt/locale/bitcoin_es_ES.ts index 7865483183d..c81723a7a44 100644 --- a/src/qt/locale/bitcoin_es_ES.ts +++ b/src/qt/locale/bitcoin_es_ES.ts @@ -318,6 +318,22 @@ Abrir &URI... + Click to disable network activity. + Haz click para desactivar la actividad de red. + + + Network activity disabled. + Actividad de red desactivada. + + + Click to enable network activity again. + Haz click para reactivar la actividad de red. + + + Syncing Headers (%1%)... + Sincronizando cabeceras (%1%)... + + Reindexing blocks on disk... Reindexando bloques en disco... @@ -519,7 +535,11 @@ Wallet is <b>encrypted</b> and currently <b>locked</b> El monedero está <b>cifrado</b> y actualmente <b>bloqueado</b> - + + A fatal error occurred. Bitcoin can no longer continue safely and will quit. + Ha ocurrido un error fatal. Bitcoin no puede continuar de manera segura y se cerrará. + + CoinControlDialog @@ -854,14 +874,42 @@ Formulario + Number of blocks left + Número de bloques restantes + + + Unknown... + Desconocido... + + Last block time Hora del último bloque + Progress + Progreso + + + Progress increase per hour + Incremento del progreso por hora + + + calculating... + calculando... + + + Estimated time left until synced + Tiempo estimado restante hasta sincronización completa + + Hide Ocultar - + + Unknown. Syncing Headers (%1)... + Desconocido. Sincronizando cabeceras (%1)... + + OpenURIDialog @@ -1296,6 +1344,10 @@ Node/Service Nodo/Servicio + + NodeId + NodeId + QObject @@ -1339,9 +1391,17 @@ %1 and %2 %1 y %2 - + + %1 didn't yet exit safely... + %1 aún no ha salido de manera segura... + + QObject::QObject + + Error: Specified data directory "%1" does not exist. + Error: directorio especificado "%1" no existe. + QRImageWidget @@ -1937,6 +1997,10 @@ Polvo: + Confirmation time target: + Tiempo objetivo de confirmación: + + Clear &All Vaciar &todo @@ -3483,6 +3547,10 @@ Aviso: fichero de monedero corrupto, datos recuperados! Original %s guardado como %s en %s; si su balance de transacciones es incorrecto, debe restaurar desde una copia de seguridad. + %s is set very high! + %s es demasiado alto! + + (default: %s) (predeterminado: %s) @@ -3539,6 +3607,10 @@ Relay non-P2SH multisig (default: %u) + Send transactions with full-RBF opt-in enabled (default: %u) + Enviar transaciones con RBF-completo opt-in activado (default: %u) + + Set key pool size to <n> (default: %u) Ajustar el número de claves en reserva <n> (predeterminado: %u) diff --git a/src/qt/locale/bitcoin_et_EE.ts b/src/qt/locale/bitcoin_et_EE.ts index d96ffa42f5b..9b0c9083815 100644 --- a/src/qt/locale/bitcoin_et_EE.ts +++ b/src/qt/locale/bitcoin_et_EE.ts @@ -88,6 +88,10 @@ Sisestatud paroolid ei kattu. + Wallet unlock failed + Rahakoti lahtilukustamine ebaõnnestus + + Wallet decryption failed Rahakoti dekrüpteerimine ebaõnnestus @@ -110,6 +114,14 @@ &Ülevaade + Quit application + Välju rakendusest + + + &Options... + &Valikud... + + Open &URI... Ava &URI... @@ -126,14 +138,30 @@ Rahakott + &Send + &Saada + + + &Show / Hide + &Näita / Peida + + &File &Fail + &Settings + &Seaded + + &Help &Abi + &Command-line options + &Käsurea valikud + + %1 behind %1 ajast maas @@ -204,6 +232,10 @@ EditAddressDialog + &Address + &Aadress + + New key generation failed. Uue võtme genereerimine ebaõnnestus. diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts index c9cfad0f2a5..c9aa1b56249 100644 --- a/src/qt/locale/bitcoin_fa.ts +++ b/src/qt/locale/bitcoin_fa.ts @@ -62,6 +62,14 @@ آدرس های گیرنده + These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + اینها آدرس های شما برای فرستادن پرداخت هاست. همیشه قبل از فرستادن سکه ها مقدار و آدرس دریافت کننده را چک کنید. + + + &Copy Address + کپی کردن آدرس + + Copy &Label کپی و برچسب‌&گذاری @@ -69,6 +77,14 @@ &Edit &ویرایش + + Export Address List + صدور لیست آدرس ها + + + Exporting Failed + صدور موفق نبود + AddressTableModel @@ -108,14 +124,30 @@ رمزنگاری کیف پول + This operation needs your wallet passphrase to unlock the wallet. + این عملیات نیاز به عبارت کیف پول شما برای بازگشایی کیف پول دارد + + Unlock wallet باز کردن قفل کیف پول + This operation needs your wallet passphrase to decrypt the wallet. + این عملیات نیاز به عبارت کیف پول شما برای رمزگشایی کیف پول دارد. + + Decrypt wallet رمزگشایی کیف پول + Change passphrase + تغییر گذرواژه + + + Enter the old passphrase and new passphrase to the wallet. + عبارت کهنه و جدید کیف پول را وارد کنید. + + Confirm wallet encryption تأیید رمزنگاری کیف پول @@ -250,6 +282,18 @@ باز کردن &آدرس + Click to disable network activity. + برای غیر فعال کردن فعالیت شبکه کلیک کنید. + + + Network activity disabled. + فعالیت شبکه غیر فعال شد. + + + Click to enable network activity again. + برای فعال کردن دوباره فعالیت شبکه کلیک کنید. + + Reindexing blocks on disk... بازنشانی بلوک‌ها روی دیسک... @@ -507,6 +551,10 @@ تأیید شده + Copy address + کپی ادرس + + Copy label کپی برچسب @@ -531,6 +579,18 @@ کپی تعداد + Copy fee + رونوشت کارمزد + + + Copy bytes + کپی کردن بایت ها + + + Copy change + کپی کردن تغییر + + (%1 locked) (%1 قفل شده) @@ -698,10 +758,30 @@ فرم + Unknown... + مشخص نیست + + Last block time زمان آخرین بلوک + Progress + پیشروی + + + Progress increase per hour + پیشروی در هر ساعت بیشتر میشود + + + calculating... + در حال محاسبه... + + + Estimated time left until synced + زمان تخمینی تا سینک شدن + + Hide پنهان کردن @@ -921,6 +1001,10 @@ PaymentServer + + Invalid payment request. + درخواست پرداخت نامعتبر. + PeerTableModel @@ -1085,6 +1169,10 @@ در: + Out: + خروجی: + + Debug log file فایلِ لاگِ اشکال زدایی @@ -1093,6 +1181,26 @@ پاکسازی کنسول + 1 &hour + 1 ساعت + + + 1 &day + 1 روز + + + 1 &week + 1 هفته + + + 1 &year + 1 سال + + + Ban for + محدود شده برای + + Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. دکمه‌های بالا و پایین برای پیمایش تاریخچه و <b>Ctrl-L</b> برای پاک کردن صفحه. @@ -1329,6 +1437,18 @@ کپی مقدار + Copy fee + رونوشت کارمزد + + + Copy bytes + کپی کردن بایت ها + + + Copy change + کپی کردن تغییر + + (no label) (بدون برچسب) @@ -1515,6 +1635,10 @@ TransactionView + Copy address + کپی ادرس + + Copy label کپی برچسب @@ -1534,6 +1658,10 @@ Address آدرس + + Exporting Failed + صدور موفق نبود + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts index 21800231596..cb62a02a582 100644 --- a/src/qt/locale/bitcoin_fr.ts +++ b/src/qt/locale/bitcoin_fr.ts @@ -887,7 +887,7 @@ Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below. - Les transactions récentes ne sont peut-être pas encore visibles, et par conséquent, le solde de votre porte-monnaie est peut-être erroné. Cette information sera juste une fois que votre porte-monnaie aura fini de se synchroniser avec le réseau Bitcoin, tel que décrit ci-dessous. + Les transactions récentes ne sont peut-être pas encore visibles, et par conséquent, le solde de votre porte-monnaie est peut-être erroné. Cette information sera juste une fois que votre porte-monnaie aura fini de se synchroniser avec le réseau Bitcoin, comme décrit ci-dessous. Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. @@ -903,7 +903,7 @@ Last block time - Horodatage du dernier bloc + Estampille temporelle du dernier bloc Progress @@ -1366,7 +1366,7 @@ NodeId - NodeId + ID de nœud Ping @@ -1646,7 +1646,7 @@ Last block time - Horodatage du dernier bloc + Estampille temporelle du dernier bloc &Open @@ -2178,7 +2178,7 @@ The transaction was rejected with the following reason: %1 - La transaction a été rejetée pour la raison suivante: %1 + La transaction a été rejetée pour la raison suivante : %1 A fee higher than %1 is considered an absurdly high fee. @@ -3795,7 +3795,7 @@ Prepend debug output with timestamp (default: %u) - Ajouter l'horodatage au début de la sortie de débogage (par défaut : %u) + Ajouter l'estampille temporelle au début de la sortie de débogage (par défaut : %u) Relay and mine data carrier transactions (default: %u) diff --git a/src/qt/locale/bitcoin_fr_FR.ts b/src/qt/locale/bitcoin_fr_FR.ts index 4d02aa5114d..12cd54d405e 100644 --- a/src/qt/locale/bitcoin_fr_FR.ts +++ b/src/qt/locale/bitcoin_fr_FR.ts @@ -41,10 +41,46 @@ &Delete &Supprimer + + C&hoose + C&oisir + + + Copy &Label + Copier &Étiquette + + + &Edit + &Éditer + + + Export Address List + Exporter la liste d'adresses + + + Comma separated file (*.csv) + Valeurs séparées par des virgules (*.csv) + + + Exporting Failed + Échec de l'export + AddressTableModel - + + Label + Étiquette + + + Address + Adresse + + + (no label) + (aucune étiquette) + + AskPassphraseDialog @@ -63,6 +99,22 @@ Repeat new passphrase Répétez la phrase de passe + + Encrypt wallet + Chiffrer le porte-monnaie + + + Unlock wallet + Déverrouiller le porte-monnaie + + + Decrypt wallet + Décrypter le porte-monnaie + + + Wallet encrypted + Porte-monnaie chiffré + BanTableModel @@ -414,6 +466,42 @@ Confirmed Confirmée + + Copy address + Copier l'adresse + + + Copy label + Copier l'étiquette + + + Copy amount + Copier le montant + + + Copy fee + Copier les frais + + + Copy after fee + Copier après les frais + + + Copy bytes + Copier les octets + + + yes + oui + + + no + non + + + (no label) + (aucune étiquette) + EditAddressDialog @@ -797,6 +885,14 @@ QRImageWidget + + &Copy Image + &Copier image + + + Save QR Code + Sauvegarder QR code + RPCConsole @@ -1055,7 +1151,15 @@ Remove Retirer - + + Copy label + Copier l'étiquette + + + Copy amount + Copier le montant + + ReceiveRequestDialog @@ -1074,9 +1178,37 @@ &Save Image... &Sauvegarder image + + Address + Adresse + + + Label + Étiquette + + + Message + Message + RecentRequestsTableModel + + Date + Date + + + Label + Étiquette + + + Message + Message + + + (no label) + (aucune étiquette) + SendCoinsDialog @@ -1180,7 +1312,27 @@ S&end E&voyer - + + Copy amount + Copier le montant + + + Copy fee + Copier les frais + + + Copy after fee + Copier après les frais + + + Copy bytes + Copier les octets + + + (no label) + (aucune étiquette) + + SendCoinsEntry @@ -1305,7 +1457,83 @@ TransactionDesc - + + Status + État + + + Date + Date + + + Source + Source + + + Generated + Généré + + + From + De + + + unknown + inconnu + + + To + Á + + + own address + Votre adresse + + + watch-only + Lecture uniquement + + + label + Étiquette + + + Credit + Crédit + + + Debit + Débit + + + Total debit + Débit total + + + Total credit + Crédit total + + + Net amount + Montant net + + + Message + Message + + + Comment + Commentaire + + + true + vrai + + + false + faux + + TransactionDescDialog @@ -1315,9 +1543,85 @@ TransactionTableModel + + Date + Date + + + Label + Étiquette + + + watch-only + Lecture uniquement + + + (no label) + (aucune étiquette) + TransactionView + + All + Toutes + + + Today + Aujourd'hui + + + This week + Cette semaine + + + This month + Ce mois + + + Last month + Mois dernier + + + This year + Cette année + + + Other + Autres + + + Copy address + Copier l'adresse + + + Copy label + Copier l'étiquette + + + Copy amount + Copier le montant + + + Comma separated file (*.csv) + Valeurs séparées par des virgules (*.csv) + + + Date + Date + + + Label + Étiquette + + + Address + Adresse + + + Exporting Failed + Échec de l'export + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_id_ID.ts b/src/qt/locale/bitcoin_id_ID.ts index fd77f07cd85..2fba8233d1d 100644 --- a/src/qt/locale/bitcoin_id_ID.ts +++ b/src/qt/locale/bitcoin_id_ID.ts @@ -41,10 +41,74 @@ &Delete &Hapus + + Choose the address to send coins to + Pilih alamat untuk mengirim koin + + + Choose the address to receive coins with + Piih alamat untuk menerima koin + + + C&hoose + &Pilih + + + Sending addresses + Alamat-alamat pengirim + + + Receiving addresses + Alamat-alamat penerima + + + These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + Ini adalah alamat- alamat Bitcoin Anda untuk mengirimkan pembayaran. Selalu periksa jumlah dan alamat penerima sebelum mengirimkan koin. + + + These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. + Ini adalah alamat- alamat Bitcoin Anda untuk menerima pembayaran. Dianjurkan untuk menggunakan alamat penerima yang baru setiap melakukan transaksi. + + + &Copy Address + &Salin Alamat + + + Copy &Label + Salin& Label + + + &Edit + &Ubah + + + Export Address List + Ekspor Daftar Alamat + + + Comma separated file (*.csv) + File yang berformat(*.csv) + + + Exporting Failed + Mengekspor Gagal + AddressTableModel - + + Label + Label + + + Address + Alamat + + + (no label) + (tidak ada label) + + AskPassphraseDialog @@ -63,7 +127,95 @@ Repeat new passphrase Ulangi kata kunci baru - + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. + Masukan kata sandi baru ke dompet.<br/>Mohon gunakan kata sandi <b>sepuluh karakter acak atau lebih</b>, atau <b> delapan atau lebih beberapa kata </​​b>. + + + Encrypt wallet + Enkripsi dompet + + + This operation needs your wallet passphrase to unlock the wallet. + Operasi ini memerlukan kata sandi dompet Anda untuk membuka dompet. + + + Unlock wallet + Buka dompet + + + This operation needs your wallet passphrase to decrypt the wallet. + Operasi ini memerlukan kata sandi dompet Anda untuk mendekripsikan dompet. + + + Decrypt wallet + Dekripsi dompet + + + Change passphrase + Ganti kata sandi + + + Enter the old passphrase and new passphrase to the wallet. + Masukkan kata sandi lama dan kata sandi baru ke dompet. + + + Confirm wallet encryption + Konfirmasi pengenkripsian dompet + + + Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! + Peringatan: Jika Anda enkripsi dompet Anda dan lupa kata sandi anda, Anda akan <b>KEHILANGAN SEMUA BITCOIN ANDA</b>! + + + Are you sure you wish to encrypt your wallet? + Apakah Anda yakin ingin enkripsi dompet Anda? + + + Wallet encrypted + Dompet terenkripsi + + + %1 will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. + %1 sekarang akan ditutup untuk menyelesaikan proses enkripsi. Ingatlah bahwa mengenkripsi dompet Anda tidak dapat sepenuhnya melindungi komputer Anda dari pencurian malware yang menginfeksi komputer Anda. + + + IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. + PENTING: Backup sebelumnya yang Anda buat dari file dompet Anda harus diganti dengan file dompet terenkripsi yang baru dibuat. Demi keamanan, backup file dompet sebelumnya yang tidak dienkripsi sebelumnya akan menjadi tidak berguna begitu Anda mulai menggunakan dompet terenkripsi yang baru. + + + Wallet encryption failed + Pengenkripsian dompet gagal + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Pengenkripsian dompet gagal karena kesalahan internal. Dompet Anda tidak dienkripsi. + + + The supplied passphrases do not match. + Kata sandi yang dimasukkan tidak cocok. + + + Wallet unlock failed + Membuka dompet gagal + + + The passphrase entered for the wallet decryption was incorrect. + Kata sandi yang dimasukkan untuk dekripsi dompet salah. + + + Wallet decryption failed + Dekripsi dompet gagal + + + Wallet passphrase was successfully changed. + Kata sandi berhasil diganti. + + + Warning: The Caps Lock key is on! + Peringatan: Tombol Caps Lock aktif! + + BanTableModel @@ -114,6 +266,14 @@ Keluar dari aplikasi + &About %1 + &Tentang%1 + + + Show information about %1 + Tampilkan informasi perihal %1 + + About &Qt Mengenai &Qt @@ -126,6 +286,10 @@ &Pilihan... + Modify configuration options for %1 + Pengubahan opsi konfigurasi untuk %1 + + &Encrypt Wallet... &Enkripsi Dompet... @@ -150,6 +314,22 @@ Buka &URI + Click to disable network activity. + Klik untuk menonaktifkan aktivitas jaringan. + + + Network activity disabled. + Aktivitas jaringan dinonaktifkan. + + + Click to enable network activity again. + Klik untuk mengaktifkan aktivitas jaringan lagi. + + + Syncing Headers (%1%)... + Menyinkronkan Header (%1%) ... + + Reindexing blocks on disk... Mengindex ulang blok di dalam disk... @@ -253,6 +433,14 @@ %n active connection(s) to Bitcoin network %n koneksi aktif ke jaringan Bitcoin + + Indexing blocks on disk... + Pengindeksan blok pada disk ... + + + Processing blocks on disk... + Memproses blok pada disk ... + Processed %n block(s) of transaction history. %n blok dari riwayat transaksi diproses. @@ -286,6 +474,18 @@ Terbaru + Show the %1 help message to get a list with possible Bitcoin command-line options + Tampilkan %1 pesan bantuan untuk mendapatkan daftar opsi baris perintah Bitcoin yang memungkinkan + + + %1 client + %1 klien + + + Connecting to peers... + Menghubungkan ke peer... + + Catching up... Menyusul... @@ -406,6 +606,22 @@ Confirmed Terkonfirmasi + + Copy address + Salin alamat + + + Copy label + Salin label + + + Copy fee + Salin biaya + + + (no label) + (tidak ada label) + EditAddressDialog @@ -1065,6 +1281,10 @@ Remove Menghapus + + Copy label + Salin label + ReceiveRequestDialog @@ -1085,12 +1305,28 @@ &Simpan Gambaran... + Address + Alamat + + Amount Jumlah + + Label + Label + RecentRequestsTableModel + + Label + Label + + + (no label) + (tidak ada label) + SendCoinsDialog @@ -1194,7 +1430,15 @@ S&end K&irim - + + Copy fee + Salin biaya + + + (no label) + (tidak ada label) + + SendCoinsEntry @@ -1357,9 +1601,41 @@ TransactionTableModel + + Label + Label + + + (no label) + (tidak ada label) + TransactionView + + Copy address + Salin alamat + + + Copy label + Salin label + + + Comma separated file (*.csv) + Berkas yang berformat(*.csv) + + + Label + Label + + + Address + Alamat + + + Exporting Failed + Mengekspor Gagal + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts index 9f2c7626de0..d171ffac2f4 100644 --- a/src/qt/locale/bitcoin_it.ts +++ b/src/qt/locale/bitcoin_it.ts @@ -3,7 +3,7 @@ AddressBookPage Right-click to edit address or label - Fare clic con il tasto destro del mouse per modificare l'indirizzo o l'etichettadefault + Fare clic con il tasto destro del mouse per modificare l'indirizzo o l'etichetta Create a new address @@ -180,10 +180,22 @@ Portamonete cifrato + IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. + IMPORTANTE: qualsiasi backup del file portamonete effettuato in precedenza dovrà essere sostituito con il file del portamonete cifrato appena generato. Per ragioni di sicurezza, i precedenti backup del file del portamonete non cifrato diventeranno inservibili non appena si inizierà ad utilizzare il nuovo portamonete cifrato. + + Wallet encryption failed Il processo di crittografia del tuo portafogli è fallito + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Crittaggio fallito a causa di un errore interno. Il portamonete non è stato crittato. + + + The supplied passphrases do not match. + Le frasi di accesso non corrispondono. + + Wallet unlock failed Sbloccaggio del portafoglio fallito @@ -191,7 +203,19 @@ The passphrase entered for the wallet decryption was incorrect. La frase inserita per decrittografare il tuo portafoglio è incorretta - + + Wallet decryption failed + Decrittazione del portamonete fallita. + + + Wallet passphrase was successfully changed. + La frase di accesso al portamonete è stata cambiata con successo. + + + Warning: The Caps Lock key is on! + Attenzione: è attivo il tasto blocco maiuscole ! + + BanTableModel @@ -563,10 +587,86 @@ Confermato + Copy address + Copia indirizzo + + + Copy label + Copia etichetta + + + Copy amount + Copia l'importo + + + Copy transaction ID + Copia l'ID transazione + + + Lock unspent + Bloccare non spesi + + + Unlock unspent + Sbloccare non spesi + + + Copy quantity + Copia quantità + + + Copy fee + Copia commissione + + + Copy after fee + Copia dopo commissione + + + Copy bytes + Copia byte + + + Copy dust + Copia trascurabile + + + Copy change + Copia resto + + + (%1 locked) + (%1 bloccato) + + + yes + + + + no + no + + + This label turns red if any recipient receives an amount smaller than the current dust threshold. + Questa etichetta diventerà rossa se uno qualsiasi dei destinatari riceverà un importo inferiore alla corrente soglia minima per la movimentazione della valuta. + + + Can vary +/- %1 satoshi(s) per input. + Può variare di +/- %1 satoshi per input. + + (no label) (nessuna etichetta) - + + change from %1 (%2) + cambio da %1 (%2) + + + (change) + (resto) + + EditAddressDialog @@ -589,7 +689,39 @@ &Address &Indirizzo - + + New receiving address + Nuovo indirizzo di ricezione + + + New sending address + Nuovo indirizzo d'invio + + + Edit receiving address + Modifica indirizzo di ricezione + + + Edit sending address + Modifica indirizzo d'invio + + + The entered address "%1" is not a valid Bitcoin address. + L'indirizzo inserito "%1" non è un indirizzo bitcoin valido. + + + The entered address "%1" is already in the address book. + L'indirizzo inserito "%1" è già in rubrica. + + + Could not unlock wallet. + Impossibile sbloccare il portamonete. + + + New key generation failed. + Generazione della nuova chiave non riuscita. + + FreespaceChecker @@ -703,6 +835,10 @@ Errore + %n GB of free space available + GB di spazio libero disponibile%n GB di spazio disponibile + + (of %n GB needed) (di %nGB richiesti)(%n GB richiesti) @@ -714,10 +850,22 @@ Modulo + Number of blocks left + Numero di blocchi mancanti + + + Unknown... + Sconosciuto... + + Last block time Ora del blocco più recente + Progress + Progresso + + Hide Nascondi @@ -740,7 +888,11 @@ Select payment request file Seleziona il file di richiesta di pagamento - + + Select payment request file to open + Seleziona il file di richiesta di pagamento da aprire + + OptionsDialog @@ -1054,7 +1206,87 @@ Per specificare più URL separarli con una barra verticale "|". PaymentServer - + + Payment request error + Errore di richiesta di pagamento + + + Cannot start bitcoin: click-to-pay handler + Impossibile avviare bitcoin: gestore click-to-pay + + + URI handling + Gestione URI + + + Payment request fetch URL is invalid: %1 + URL di recupero della Richiesta di pagamento non valido: %1 + + + Invalid payment address %1 + Indirizzo di pagamento non valido %1 + + + URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. + Impossibile interpretare l'URI! I parametri dell'URI o l'indirizzo Bitcoin potrebbero non essere corretti. + + + Payment request file handling + Gestione del file di richiesta del pagamento + + + Payment request file cannot be read! This can be caused by an invalid payment request file. + Impossibile leggere il file della richiesta di pagamento! Il file della richiesta di pagamento potrebbe non essere valido + + + Payment request rejected + Richiesta di pagamento respinta + + + Payment request network doesn't match client network. + La rete della richiesta di pagamento non corrisponde alla rete del client. + + + Payment request expired. + Richiesta di pagamento scaduta. + + + Payment request is not initialized. + La richiesta di pagamento non è stata inizializzata. + + + Unverified payment requests to custom payment scripts are unsupported. + Le richieste di pagamento non verificate verso script di pagamento personalizzati non sono supportate. + + + Invalid payment request. + Richiesta di pagamento invalida + + + Requested payment amount of %1 is too small (considered dust). + L'importo di pagamento di %1 richiesto è troppo basso (considerato come trascurabile). + + + Refund from %1 + Rimborso da %1 + + + Payment request %1 is too large (%2 bytes, allowed %3 bytes). + La richiesta di pagamento %1 è troppo grande (%2 bytes, consentiti %3 bytes) + + + Error communicating with %1: %2 + Errore di comunicazione con %1: %2 + + + Payment request cannot be parsed! + La richiesta di pagamento non può essere processata! + + + Payment acknowledged + Pagamento riconosciuto + + PeerTableModel @@ -1065,7 +1297,11 @@ Per specificare più URL separarli con una barra verticale "|". Node/Service Nodo/Servizio - + + Ping + Ping + + QObject @@ -1104,17 +1340,61 @@ Per specificare più URL separarli con una barra verticale "|". %1 ms %1 ms + + %n second(s) + %n secondo%n secondi + + + %n minute(s) + %n minuto%n minuti + + + %n hour(s) + %n ora%n ore + + + %n day(s) + %n giorno%n giorni + + + %n week(s) + %n settimana%n settimane + %1 and %2 %1 e %2 + + %n year(s) + %n anno%n anni + QObject::QObject - + + Error: %1 + Errore: %1 + + QRImageWidget - + + &Save Image... + &Salva immagine + + + &Copy Image + &Copia immagine + + + Save QR Code + Salva codice QR + + + PNG Image (*.png) + Immagine PNG (*.png) + + RPCConsole @@ -1334,6 +1614,10 @@ Per specificare più URL separarli con una barra verticale "|". 1 &anno + &Disconnect + &Disconnetti + + Welcome to the %1 RPC console. Benvenuto nella console RPC di %1. @@ -1464,7 +1748,23 @@ Per specificare più URL separarli con una barra verticale "|". Remove Rimuovi - + + Copy URI + Copia URI + + + Copy label + Copia etichetta + + + Copy message + Copia il messaggio + + + Copy amount + Copia l'importo + + ReceiveRequestDialog @@ -1484,25 +1784,65 @@ Per specificare più URL separarli con una barra verticale "|". &Salva Immagine... + Request payment to %1 + Richiesta di pagamento a %1 + + + Payment information + Informazioni di pagamento + + + URI + URI + + Address Indirizzo + Amount + Importo + + Label Etichetta + + Message + Messaggio + RecentRequestsTableModel + Date + Data + + Label Etichetta + Message + Messaggio + + (no label) (nessuna etichetta) - + + (no message) + (nessun messaggio) + + + (no amount requested) + (nessun importo richiesto) + + + Requested + Richiesto + + SendCoinsDialog @@ -1646,6 +1986,74 @@ Per specificare più URL separarli con una barra verticale "|". &Invia + Copy quantity + Copia quantità + + + Copy amount + Copia l'importo + + + Copy fee + Copia commissione + + + Copy after fee + Copia dopo commissione + + + Copy bytes + Copia byte + + + Copy dust + Copia trascurabile + + + Copy change + Copia resto + + + %1 to %2 + %1 a %2 + + + added as transaction fee + Includi il costo della transazione + + + or + o + + + The amount exceeds your balance. + Non hai abbastanza fondi + + + Transaction creation failed! + Creazione della transazione fallita! + + + The transaction was rejected with the following reason: %1 + La transazione è stata respinta per il seguente motivo: %1 + + + Payment request expired. + Richiesta di pagamento scaduta. + + + %n block(s) + %n blocco%n blocchi + + + Warning: Invalid Bitcoin address + Attenzione: Indirizzo Bitcoin non valido + + + Warning: Unknown change address + Attenzione: Indirizzo per il resto sconosciuto + + (no label) (nessuna etichetta) @@ -1731,7 +2139,11 @@ Per specificare più URL separarli con una barra verticale "|". SendConfirmationDialog - + + Yes + Si + + ShutdownWindow @@ -1829,7 +2241,55 @@ Per specificare più URL separarli con una barra verticale "|". Reset all verify message fields Reimposta tutti i campi della verifica messaggio - + + The entered address is invalid. + L'indirizzo inserito non è valido. + + + Please check the address and try again. + Per favore controlla l'indirizzo e prova di nuovo. + + + The entered address does not refer to a key. + L'indirizzo bitcoin inserito non è associato a nessuna chiave. + + + Wallet unlock was cancelled. + Sblocco del portamonete annullato. + + + Private key for the entered address is not available. + La chiave privata per l'indirizzo inserito non è disponibile. + + + Message signing failed. + Firma messaggio fallita. + + + Message signed. + Messaggio firmato. + + + The signature could not be decoded. + Non è stato possibile decodificare la firma. + + + Please check the signature and try again. + Per favore controlla la firma e prova di nuovo. + + + The signature did not match the message digest. + La firma non corrisponde al digest del messaggio. + + + Message verification failed. + Verifica messaggio fallita. + + + Message verified. + Messaggio verificato. + + SplashScreen @@ -1846,7 +2306,139 @@ Per specificare più URL separarli con una barra verticale "|". TransactionDesc - + + %1/offline + %1/offline + + + 0/unconfirmed, %1 + 0/non confermati, %1 + + + abandoned + abbandonato + + + %1/unconfirmed + %1/non confermato + + + %1 confirmations + %1 conferme + + + Status + Stato + + + , has not been successfully broadcast yet + , non è ancora stata trasmessa con successo + + + Date + Data + + + Source + Sorgente + + + Generated + Generato + + + From + Da + + + unknown + sconosciuto + + + To + A + + + own address + proprio indirizzo + + + watch-only + sola lettura + + + label + etichetta + + + Credit + Credito + + + not accepted + non accettate + + + Debit + Debito + + + Total debit + Debito totale + + + Total credit + Credito totale + + + Transaction fee + Commissione transazione + + + Net amount + Importo netto + + + Message + Messaggio + + + Comment + Commento + + + Transaction ID + ID della transazione + + + Merchant + Commerciante + + + Debug information + Informazione di debug + + + Transaction + Transazione + + + Inputs + Input + + + Amount + Importo + + + true + vero + + + false + falso + + TransactionDescDialog @@ -1857,21 +2449,201 @@ Per specificare più URL separarli con una barra verticale "|". TransactionTableModel + Date + Data + + + Type + Tipo + + Label Etichetta + Offline + Offline + + + Unconfirmed + Non confermata + + + Confirmed (%1 confirmations) + Confermata (%1 conferme) + + + This block was not received by any other nodes and will probably not be accepted! + Questo blocco non è stato ricevuto da alcun altro nodo e probabilmente non sarà accettato! + + + Generated but not accepted + Generati, ma non accettati + + + Received with + Ricevuto tramite + + + Sent to + Inviato a + + + Payment to yourself + Pagamento a te stesso + + + Mined + Ottenuto dal mining + + + watch-only + sola lettura + + + (n/a) + (n/d) + + (no label) (nessuna etichetta) - + + Transaction status. Hover over this field to show number of confirmations. + Stato della transazione. Passare con il mouse su questo campo per visualizzare il numero di conferme. + + + Date and time that the transaction was received. + Data e ora in cui la transazione è stata ricevuta. + + + Type of transaction. + Tipo di transazione. + + + Whether or not a watch-only address is involved in this transaction. + Indica se un indirizzo di sola lettura sia o meno coinvolto in questa transazione. + + + User-defined intent/purpose of the transaction. + Intento/scopo della transazione definito dall'utente. + + + Amount removed from or added to balance. + Importo rimosso o aggiunto al saldo. + + TransactionView + All + Tutti + + + Today + Oggi + + + This week + Questa settimana + + + This month + Questo mese + + + Last month + Il mese scorso + + + This year + Quest'anno + + + Range... + Intervallo... + + + Received with + Ricevuto tramite + + + Sent to + Inviato a + + + To yourself + A te stesso + + + Mined + Ottenuto dal mining + + + Other + Altro + + + Enter address or label to search + Inserisci un indirizzo o un'etichetta da cercare + + + Min amount + Importo minimo + + + Copy address + Copia indirizzo + + + Copy label + Copia etichetta + + + Copy amount + Copia l'importo + + + Copy transaction ID + Copia l'ID transazione + + + Copy raw transaction + Copia la transazione raw + + + Edit label + Modifica l'etichetta + + + Show transaction details + Mostra i dettagli della transazione + + + Export Transaction History + Esporta lo storico delle transazioni + + Comma separated file (*.csv) Testo CSV (*.csv) + Confirmed + Confermato + + + Watch-only + Sola lettura + + + Date + Data + + + Type + Tipo + + Label Etichetta @@ -1880,10 +2652,34 @@ Per specificare più URL separarli con una barra verticale "|". Indirizzo + ID + ID + + Exporting Failed Esportazione Fallita - + + There was an error trying to save the transaction history to %1. + Si è verificato un errore durante il salvataggio dello storico delle transazioni in %1. + + + Exporting Successful + Esportazione Riuscita + + + The transaction history was successfully saved to %1. + Lo storico delle transazioni e' stato salvato con successo in %1. + + + Range: + Intervallo: + + + to + a + + UnitDisplayStatusBarControl @@ -1893,13 +2689,53 @@ Per specificare più URL separarli con una barra verticale "|". WalletFrame - + + No wallet has been loaded. + Non è stato caricato alcun portamonete. + + WalletModel - + + Send Coins + Invia Bitcoin + + WalletView - + + &Export + &Esporta + + + Export the data in the current tab to a file + Esporta su file i dati contenuti nella tabella corrente + + + Backup Wallet + Backup Portamonete + + + Wallet Data (*.dat) + Dati Portamonete (*.dat) + + + Backup Failed + Backup Fallito + + + There was an error trying to save the wallet data to %1. + Si è verificato un errore durante il salvataggio dei dati del portamonete in %1. + + + Backup Successful + Backup eseguito con successo + + + The wallet data was successfully saved to %1. + Il portamonete è stato correttamente salvato in %1. + + bitcoin-core diff --git a/src/qt/locale/bitcoin_it_IT.ts b/src/qt/locale/bitcoin_it_IT.ts index 09d40497fa7..ebb30f13e4b 100644 --- a/src/qt/locale/bitcoin_it_IT.ts +++ b/src/qt/locale/bitcoin_it_IT.ts @@ -41,9 +41,21 @@ &Delete Cancella + + Choose the address to send coins to + Scegli l'indirizzo a cui inviare denaro + + + C&hoose + Scegli + AddressTableModel + + Address + Indirizzo + AskPassphraseDialog @@ -132,6 +144,10 @@ ReceiveRequestDialog + + Address + Indirizzo + RecentRequestsTableModel @@ -168,6 +184,10 @@ TransactionView + + Address + Indirizzo + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_ko_KR.ts b/src/qt/locale/bitcoin_ko_KR.ts index 9b5c1c077ef..c104bdd0db8 100644 --- a/src/qt/locale/bitcoin_ko_KR.ts +++ b/src/qt/locale/bitcoin_ko_KR.ts @@ -318,6 +318,22 @@ &URI 열기... + Click to disable network activity. + 네트워크 활동을 중지하려면 클릭. + + + Network activity disabled. + 네트워크 활동이 정지됨. + + + Click to enable network activity again. + 네트워크 활동을 다시 시작하려면 클릭. + + + Syncing Headers (%1%)... + 헤더 동기화중 (%1%)... + + Reindexing blocks on disk... 디스크에서 블록 다시 색인중... @@ -431,7 +447,7 @@ Processed %n block(s) of transaction history. - %n 블럭 만큼의 거래 기록이 처리됨. + %n 블록 만큼의 거래 기록이 처리됨. %1 behind @@ -470,6 +486,10 @@ %1 클라이언트 + Connecting to peers... + 피어에 연결중... + + Catching up... 블록 따라잡기... @@ -512,14 +532,26 @@ 들어오고 있는 거래 + HD key generation is <b>enabled</b> + HD 키 생성이 <b>활성화되었습니다</b> + + + HD key generation is <b>disabled</b> + HD 키 생성이 <b>비활성화되었습니다</b> + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> - 지갑이 암호화 되었고 현재 차단해제 되었습니다 + 지갑이 <b>암호화</b> 되었고 현재 <b>잠금해제</b> 되었습니다 Wallet is <b>encrypted</b> and currently <b>locked</b> - 지갑이 암호화 되었고 현재 잠겨져 있습니다 + 지갑이 <b>암호화</b> 되었고 현재 <b>잠겨져</b> 있습니다 - + + A fatal error occurred. Bitcoin can no longer continue safely and will quit. + 치명적인 오류가 발생했습니다. 비트코인을 더이상 안전하게 진행할 수 없어 곧 종료합니다. + + CoinControlDialog @@ -552,7 +584,7 @@ Change: - 체인지: + 잔돈: (un)select all @@ -651,6 +683,10 @@ 아니요 + This label turns red if any recipient receives an amount smaller than the current dust threshold. + 수령인이 현재 더스트 임계값보다 작은 양을 수신하면 이 라벨이 빨간색으로 변합니다. + + Can vary +/- %1 satoshi(s) per input. 입력마다 +/- %1 사토시(s)가 변할 수 있습니다. @@ -816,7 +852,7 @@ %1 will download and store a copy of the Bitcoin block chain. At least %2GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory. - %1가 블럭체인의 복사본을 다운로드 저장합니다. 적어도 %2GB의 데이터가 이 폴더에 저장되며 시간이 경과할수록 점차 증가합니다. 그리고 지갑 또한 이 폴더에 저장됩니다. + %1가 블록체인의 복사본을 다운로드 저장합니다. 적어도 %2GB의 데이터가 이 폴더에 저장되며 시간이 경과할수록 점차 증가합니다. 그리고 지갑 또한 이 폴더에 저장됩니다. Use the default data directory @@ -850,14 +886,50 @@ 유형 + Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below. + 최근 거래는 아직 보이지 않을 것입니다, 그러므로 당신의 지갑의 잔액이 틀릴 수도 있습니다. 이 정보는 비트코인 네트워크와 완전한 동기화가 완료되면 아래의 설명과 같이 정확해집니다. + + + Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. + 아직 표시되지 않은 거래의 영향을 받는 비트코인을 사용하려고 하는 것은 네트워크에서 허가되지 않습니다. + + + Number of blocks left + 남은 블록의 수 + + + Unknown... + 알수없음... + + Last block time - 최종 블럭 시각 + 최종 블록 시각 + + + Progress + 진행 + + + Progress increase per hour + 시간당 진행 증가율 + + + calculating... + 계산중... + + + Estimated time left until synced + 동기화 완료까지 예상 시간 Hide 숨기기 - + + Unknown. Syncing Headers (%1)... + 알수없음. 헤더 동기화중 (%1)... + + OpenURIDialog @@ -929,7 +1001,7 @@ Third party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |. - 서드-파티 URLs (예. 블록 탐색기)는 거래 탭의 컨텍스트 메뉴에 나타납니다. URL의 %s는 트랜잭션 해시값으로 대체됩니다. 여러 URLs는 수직 바 | 에서 나누어 집니다. + 서드-파티 URLs (예. 블록 탐색기)는 거래 탭의 컨텍스트 메뉴에 나타납니다. URL의 %s는 거래 해시값으로 대체됩니다. 여러 URLs는 수직 바 | 에서 나누어 집니다. Third party transaction URLs @@ -969,7 +1041,7 @@ If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed. - 검증되지 않은 잔돈 쓰기를 비활성화하면 트랜잭션이 적어도 1회 이상 검증되기 전까지 그 트랜잭션의 거스름돈은 사용할 수 없습니다. 이는 잔액 계산 방법에도 영향을 미칩니다. + 검증되지 않은 잔돈 쓰기를 비활성화하면 거래가 적어도 1회 이상 검증되기 전까지 그 거래의 거스름돈은 사용할 수 없습니다. 이는 잔액 계산 방법에도 영향을 미칩니다. &Spend unconfirmed change @@ -1128,7 +1200,7 @@ Watch-only: - 모니터링 지갑: + 조회전용: Available: @@ -1168,7 +1240,7 @@ Your current balance in watch-only addresses - 모니터링 지갑의 현재 잔액 + 조회전용 주소의 현재 잔액 Spendable: @@ -1180,15 +1252,15 @@ Unconfirmed transactions to watch-only addresses - 모니터링 지갑의 검증되지 않은 트랜잭션 + 조회전용 주소의 검증되지 않은 거래 Mined balance in watch-only addresses that has not yet matured - 모니터링 지갑의 채굴된 잔액 중 숙성되지 않은 것 + 조회전용 주소의 채굴된 잔액 중 숙성되지 않은 것 Current total balance in watch-only addresses - 모니터링 지갑의 현재 잔액 + 조회전용 주소의 현재 잔액 @@ -1199,13 +1271,89 @@ Cannot start bitcoin: click-to-pay handler - 비트코인을 시작할 수 없습니다: 지급제어기를 클릭하시오 + 비트코인을 시작할 수 없습니다: 지급제어기를 클릭하세요 URI handling URI 핸들링 - + + Payment request fetch URL is invalid: %1 + 지불 요청의 URL이 올바르지 않습니다: %1 + + + Invalid payment address %1 + 잘못된 지불 주소입니다 %1 + + + URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. + URI의 파싱에 문제가 발생했습니다. 잘못된 비트코인 주소나 URI 파라미터 구성에 오류가 존재할 수 있습니다. + + + Payment request file handling + 지불이 파일 처리를 요청합니다 + + + Payment request file cannot be read! This can be caused by an invalid payment request file. + 지불 요청 파일을 읽을 수 없습니다. 이것은 잘못된 지불 요청 파일에 의해 발생하는 오류일 수 있습니다. + + + Payment request rejected + 지불 요청이 거부됨 + + + Payment request network doesn't match client network. + 지급 요청 네트워크가 클라이언트 네트워크와 일치되지 않습니다. + + + Payment request expired. + 지불 요청이 만료됨. + + + Payment request is not initialized. + 지불 요청이 초기화 되지 않았습니다. + + + Unverified payment requests to custom payment scripts are unsupported. + 임의로 변경한 결제 스크립트 기반의 지불 요청 양식은 검증되기 전까지는 지원되지 않습니다. + + + Invalid payment request. + 잘못된 지불 요청. + + + Requested payment amount of %1 is too small (considered dust). + 요청한 금액 %1의 양이 너무 적습니다. (스팸성 거래로 간주) + + + Refund from %1 + %1 으로부터의 환불 + + + Payment request %1 is too large (%2 bytes, allowed %3 bytes). + 지불 요청 %1은 너무 큽니다 (%2 바이트, %3 바이트까지 허용됩니다). + + + Error communicating with %1: %2 + %1과 소통하는데 에러: %2 + + + Payment request cannot be parsed! + 지불요청을 파싱할 수 없습니다. + + + Bad response from server %1 + 서버로 부터 잘못된 반응 %1 + + + Network request error + 네트워크 요청 에러 + + + Payment acknowledged + 지불이 승인됨 + + PeerTableModel @@ -1216,7 +1364,15 @@ Node/Service 노드/서비스 - + + NodeId + 노드 ID + + + Ping + + + QObject @@ -1255,17 +1411,73 @@ %1 ms %1 ms + + %n second(s) + %n 초 + + + %n minute(s) + %n 분 + + + %n hour(s) + %n 시간 + + + %n day(s) + &n 일 + + + %n week(s) + %n 주 + %1 and %2 %1 그리고 %2 - + + %n year(s) + %n 년 + + + %1 didn't yet exit safely... + %1가 아직 안전하게 종료되지 않았습니다... + + QObject::QObject - + + Error: Specified data directory "%1" does not exist. + 에러: 지정한 데이터 폴더 "%1"은 존재하지 않습니다. + + + Error: Cannot parse configuration file: %1. Only use key=value syntax. + 에러: 설정파일을 파싱할수 없습니다: %1. key=value syntax만 사용가능합니다. + + + Error: %1 + 에러: %1 + + QRImageWidget - + + &Save Image... + 이미지 저장(&S)... + + + &Copy Image + 이미지 복사(&C) + + + Save QR Code + QR코드 저장 + + + PNG Image (*.png) + PNG 이미지(*.png) + + RPCConsole @@ -1314,11 +1526,11 @@ Block chain - 블럭 체인 + 블록 체인 Current number of blocks - 현재 블럭 수 + 현재 블록 수 Memory Pool @@ -1326,7 +1538,7 @@ Current number of transactions - 현재 트랜잭션 수 + 현재 거래 수 Memory usage @@ -1425,12 +1637,16 @@ Ping 대기 + Min Ping + 최소 핑 + + Time Offset 시간 오프셋 Last block time - 최종 블럭 시각 + 최종 블록 시각 &Open @@ -1485,6 +1701,18 @@ 1년(&Y) + &Disconnect + 접속 끊기(&D) + + + Ban for + 추방 + + + &Unban + 노드 추방 취소(&U) + + Welcome to the %1 RPC console. %1 RPC 콘솔에 오신걸 환영합니다 @@ -1497,6 +1725,14 @@ 사용할 수 있는 명령을 둘러보려면 <b>help</b>를 입력하십시오. + WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramification of a command. + 경고 : 사기꾼이 사용자에게 여기에 명령을 입력하게 하여 지갑 내용을 훔칠수 있다는 사실을 알려드립니다. 명령어를 완전히 이해하지 못한다면 콘솔을 사용하지 마십시오. + + + Network activity disabled + 네트워크 활동이 정지됨. + + %1 B %1 바이트 @@ -1616,10 +1852,18 @@ 삭제 + Copy URI + URI 복사 + + Copy label 라벨 복사 + Copy message + 메시지 복사 + + Copy amount 거래액 복사 @@ -1643,14 +1887,42 @@ 이미지 저장(&S)... + Request payment to %1 + %1에 지불을 요청했습니다 + + + Payment information + 지불 정보 + + + URI + URI + + Address 주소 + Amount + 거래액 + + Label 라벨 - + + Message + 메시지 + + + Resulting URI too long, try to reduce the text for label / message. + URI 결과가 너무 길음, 라벨/메세지의 글을 줄이도록 하세요. + + + Error encoding URI into QR Code. + URI를 QR 코드로 인코딩하는 중 오류가 발생했습니다. + + RecentRequestsTableModel @@ -1662,10 +1934,26 @@ 라벨 + Message + 메시지 + + (no label) (라벨 없음) - + + (no message) + (메세지가 없습니다) + + + (no amount requested) + (요청한 거래액 없음) + + + Requested + 요청됨 + + SendCoinsDialog @@ -1710,7 +1998,7 @@ Change: - 체인지: + 잔돈: If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address. @@ -1738,7 +2026,7 @@ If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte. - 사용자 정의 수수료가 1000사토시로 지정된 경우 트랜잭션의 크기가 250바이트 일 경우 1킬로바이트당 250사토시만 지불되지만 "최소 수수료"에선 1000사토시가 지불됩니다. 1킬로바이트가 넘는 트랜잭션인 경우 어떠한 경우에든 1킬로바이트 기준으로 지불됩니다. + 사용자 정의 수수료가 1000사토시로 지정된 경우 거래의 크기가 250바이트 일 경우 1킬로바이트당 250사토시만 지불되지만 "최소 수수료"에선 1000사토시가 지불됩니다. 1킬로바이트가 넘는 거래인 경우 어떠한 경우에든 1킬로바이트 기준으로 지불됩니다. Hide @@ -1750,11 +2038,11 @@ Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process. - 블록의 용량보다 트랜잭션의 용량이 작은 경우에는 최소한의 수수료만으로도 충분합니다. 그러나 비트코인 네트워크의 처리량보다 더 많은 트랜잭션 요구는 영원히 검증이 안 될 수도 있습니다. + 블록의 용량보다 거래의 용량이 작은 경우에는 최소한의 수수료만으로도 충분합니다. 그러나 비트코인 네트워크의 처리량보다 더 많은 거래 요구는 영원히 검증이 안 될 수도 있습니다. (read the tooltip) - (툴팁을 읽어보세요) + (툴팁을 꼭 읽어보세요) Recommended: @@ -1766,7 +2054,7 @@ (Smart fee not initialized yet. This usually takes a few blocks...) - (Smart fee가 아직 초기화되지 않았습니다. 블록 분석이 완료될 때 까지 기다려주십시오...) + (Smart fee가 아직 초기화 되지 않았습니다. 블록 분석이 완전하게 끝날 때 까지 기다려주십시오...) normal @@ -1793,6 +2081,10 @@ 더스트: + Confirmation time target: + 승인 시간 목표: + + Clear &All 모두 지우기(&A) @@ -1837,6 +2129,94 @@ 잔돈 복사 + %1 to %2 + %1을(를) %2(으)로 + + + Are you sure you want to send? + 정말로 보내시겠습니까? + + + added as transaction fee + 거래 수수료로 추가됨 + + + Total Amount %1 + 총 액수 %1 + + + or + 또는 + + + Confirm send coins + 코인 전송을 확인 + + + The recipient address is not valid. Please recheck. + 수령인 주소가 정확하지 않습니다. 재확인 바랍니다 + + + The amount to pay must be larger than 0. + 지불하는 금액은 0 보다 커야 합니다. + + + The amount exceeds your balance. + 잔고를 초과하였습니다. + + + The total exceeds your balance when the %1 transaction fee is included. + %1 의 거래수수료를 포함하면 잔고를 초과합니다. + + + Duplicate address found: addresses should only be used once each. + 중복된 주소 발견: 한번에 하나의 주소에만 작업할 수 있습니다. + + + Transaction creation failed! + 거래를 생성하는 것을 실패하였습니다! + + + The transaction was rejected with the following reason: %1 + 거래가 다음과 같은 이유로 거부되었습니다: %1 + + + A fee higher than %1 is considered an absurdly high fee. + %1 보다 높은 수수료는 너무 높은 수수료 입니다. + + + Payment request expired. + 지불 요청이 만료됨. + + + %n block(s) + %n 블록 + + + Pay only the required fee of %1 + 오직 %1 만의 수수료를 지불하기 + + + Estimated to begin confirmation within %n block(s). + %n 블록 안에 승인이 시작될 것으로 추정됩니다. + + + Warning: Invalid Bitcoin address + 경고: 잘못된 비트코인주소입니다 + + + Warning: Unknown change address + 경고: 알려지지 않은 주소변경입니다 + + + Confirm custom change address + 맞춤 주소 변경 확인 + + + The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure? + 변경하기 위해 선택한 주소는 이 지갑의 일부가 아닙니다. 지갑에 있는 일부 또는 모든 금액을 이 주소로 보낼 수 있습니다. 확실합니까? + + (no label) (라벨 없음) @@ -1919,10 +2299,18 @@ Memo: 메모: - + + Enter a label for this address to add it to your address book + 주소록에 추가하려면 라벨을 입력하세요 + + SendConfirmationDialog - + + Yes + + + ShutdownWindow @@ -1931,7 +2319,7 @@ Do not shut down the computer until this window disappears. - 창이 사라지기 전까지 컴퓨터를 끄지마시오. + 이 창이 사라지기 전까지 컴퓨터를 끄지 마세요. @@ -2020,7 +2408,59 @@ Reset all verify message fields 모든 검증 메시지 필드 재설정 - + + Click "Sign Message" to generate signature + 서명을 만들려면 "메시지 서명"을 누르십시오 + + + The entered address is invalid. + 입력한 주소가 잘못되었습니다. + + + Please check the address and try again. + 주소를 확인하고 다시 시도하십시오. + + + The entered address does not refer to a key. + 입력한 주소는 키에서 참조하지 않습니다. + + + Wallet unlock was cancelled. + 지갑 잠금 해제를 취소했습니다. + + + Private key for the entered address is not available. + 입력한 주소에 대한 개인키가 없습니다. + + + Message signing failed. + 메시지 서명에 실패했습니다. + + + Message signed. + 메시지를 서명했습니다. + + + The signature could not be decoded. + 서명을 해독할 수 없습니다. + + + Please check the signature and try again. + 서명을 확인하고 다시 시도하십시오. + + + The signature did not match the message digest. + 메시지 다이제스트와 서명이 일치하지 않습니다. + + + Message verification failed. + 메시지 검증에 실패했습니다. + + + Message verified. + 메시지를 검증했습니다. + + SplashScreen @@ -2037,18 +2477,190 @@ TransactionDesc + + Open for %n more block(s) + %n개의 더 많은 블록 열기 + + + Open until %1 + %1 까지 열림 + + + conflicted with a transaction with %1 confirmations + %1 승인이 있는 거래와 충돌 함 + + + %1/offline + %1/오프라인 + + + 0/unconfirmed, %1 + 0/미승인, %1 + + + in memory pool + 메모리 풀 안에 있음 + + + not in memory pool + 메모리 풀 안에 없음 + + + abandoned + 버려진 + + + %1/unconfirmed + %1/미확인 + + + %1 confirmations + %1 확인됨 + + + Status + 상태 + + + , has not been successfully broadcast yet + . 아직 성공적으로 통보하지 않음 + + + , broadcast through %n node(s) + , %n개 노드를 통해 전파 + Date 날짜 - + + Source + 소스 + + + Generated + 생성됨 + + + From + 으로부터 + + + unknown + 알수없음 + + + To + 에게 + + + own address + 자신의 주소 + + + watch-only + 조회전용 + + + label + 라벨 + + + Credit + 입금액 + + + matures in %n more block(s) + %n개의 더 많은 블록을 숙성 + + + not accepted + 허용되지 않음 + + + Debit + 출금액 + + + Total debit + 총 출금액 + + + Total credit + 총 입금액 + + + Transaction fee + 거래 수수료 + + + Net amount + 총 거래액 + + + Message + 메시지 + + + Comment + 설명 + + + Transaction ID + 거래 ID + + + Transaction total size + 거래 총 크기 + + + Output index + 출력 인덱스 + + + Merchant + 상인 + + + Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + 신규 채굴된 코인이 사용되기 위해서는 %1 개의 블록이 경과되어야 합니다. 블록을 생성할 때 블록체인에 추가되도록 네트워크에 전파되는 과정을 거치는데, 블록체인에 포함되지 못하고 실패한다면 해당 블록의 상태는 '미승인'으로 표현되고 비트코인 또한 사용될 수 없습니다. 이 현상은 다른 노드가 비슷한 시간대에 동시에 블록을 생성할 때 종종 발생할 수 있습니다. + + + Debug information + 디버깅 정보 + + + Transaction + 거래 + + + Inputs + 입력 + + + Amount + 거래액 + + + true + + + + false + 거짓 + + TransactionDescDialog This pane shows a detailed description of the transaction 이 창은 거래의 세부내역을 보여줍니다 - + + Details for %1 + %1에 대한 세부 정보 + + TransactionTableModel @@ -2063,22 +2675,138 @@ Label 라벨 + + Open for %n more block(s) + %n개의 더 많은 블록 열기 + + + Open until %1 + %1 까지 열림 + + + Offline + 오프라인 + + + Unconfirmed + 미확인 + + + Abandoned + 버려진 + + + Confirming (%1 of %2 recommended confirmations) + 승인 중 (권장되는 승인 회수 %2 대비 현재 승인 수 %1) + + + Confirmed (%1 confirmations) + 승인됨 (%1 확인됨) + + + Conflicted + 충돌 + + + Immature (%1 confirmations, will be available after %2) + 충분히 숙성되지 않은 상태 (%1 승인, %2 후에 사용 가능합니다) + + + This block was not received by any other nodes and will probably not be accepted! + 이 블록은 다른 노드로부터 받지 않아 허용되지 않을 것임! + + + Generated but not accepted + 생성되었으나 거절됨 + Received with 받은 주소 + Received from + 보낸 주소 + + Sent to 보낸 주소 + Payment to yourself + 자신에게 지불 + + + Mined + 채굴 + + + watch-only + 조회전용 + + + (n/a) + (없음) + + (no label) (라벨 없음) - + + Transaction status. Hover over this field to show number of confirmations. + 거래상황. 마우스를 올리면 검증횟수가 표시됩니다. + + + Date and time that the transaction was received. + 거래가 이루어진 날짜와 시각. + + + Type of transaction. + 거래의 종류. + + + Whether or not a watch-only address is involved in this transaction. + 조회전용 주소가 이 거래에 참여하는지 여부입니다. + + + User-defined intent/purpose of the transaction. + 거래에 대한 사용자 정의 intent/purpose + + + Amount removed from or added to balance. + 변경된 잔고. + + TransactionView + All + 전체 + + + Today + 오늘 + + + This week + 이번주 + + + This month + 이번 달 + + + Last month + 지난 달 + + + This year + 올 해 + + + Range... + 범위... + + Received with 받은 주소 @@ -2087,8 +2815,28 @@ 보낸 주소 + To yourself + 자기거래 + + + Mined + 채굴 + + + Other + 기타 + + + Enter address or label to search + 검색하기 위한 주소 또는 표 입력 + + + Min amount + 최소 거래액 + + Abandon transaction - 버려진 트랜잭션 + 버려진 거래 Copy address @@ -2104,11 +2852,11 @@ Copy transaction ID - 트랜잭션 아이디 복사 + 거래 아이디 복사 Copy raw transaction - 로우 트랜잭션 복사 + 원시 거래 복사 Copy full transaction details @@ -2136,7 +2884,7 @@ Watch-only - 모니터링 지갑 + 조회전용 Date @@ -2262,6 +3010,18 @@ 명령줄과 JSON-RPC 명령 수락 + Accept connections from outside (default: 1 if no -proxy or -connect/-noconnect) + 외부 접속을 승인합니다 (기본값 : -proxy 또는 -connect / -noconnect가 없는 경우 1) + + + Connect only to the specified node(s); -noconnect or -connect=0 alone to disable automatic connections + 지정된 노드에만 연결; 자동 연결을 사용하지 않으려면 -noconnect 또는 -connect=0 을 단독으로 사용하십시오. + + + Distributed under the MIT software license, see the accompanying file %s or %s + MIT 소프트웨어 라이센스에 따라 배포 됨, 첨부 파일 %s 또는 %s을 참조하십시오. + + If <category> is not supplied or if <category> = 1, output all debugging information. <category>가 제공되지 않거나 <category> = 1 인 경우, 모든 디버깅 정보를 출력 @@ -2303,7 +3063,7 @@ The %s developers - %s 코어 개발자 + %s 개발자 A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s) @@ -2311,7 +3071,7 @@ Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d) - 트랜잭션의 중계를 하지 않더라도 화이트 리스트에 포함된 피어에서 받은 트랜잭션은 중계하기 (기본값: %d) + 거래의 중계를 하지 않더라도 화이트 리스트에 포함된 피어에서 받은 트랜잭션은 중계하기 (기본값: %d) Bind to given address and always listen on it. Use [host]:port notation for IPv6 @@ -2323,7 +3083,7 @@ Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup - 시작시 모든 지갑 트랜잭션을 삭제하고 -rescan을 통하여 블록체인만 복구합니다. + 시작시 모든 지갑 거래를 삭제하고 -rescan을 통하여 블록체인만 복구합니다. Error loading %s: You can't enable HD on a already existing non-HD wallet @@ -2338,8 +3098,16 @@ 지갑 거래가 바뀌면 명령을 실행합니다.(%s 안의 명령어가 TxID로 바뀝니다) - Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s) - 하나의 지갑 트랜잭션에서의 총 수수료(%s)의 최대치; 너무 낮게 설정하면 큰 트랜잭션이 중지 됩니다 (기본값: %s) + Extra transactions to keep in memory for compact block reconstructions (default: %u) + 압축 블록 재구성을 위해 메모리에 보관해야하는 추가 거래 (기본값: %u) + + + If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: %s, testnet: %s) + 이 블록이 체인에 있으면 해당 블록과 그 조상이 유효하며 잠재적으로 스크립트 확인을 건너 뜁니다 (0은 모두 확인, 기본값: %s, testnet: %s) + + + Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds) + 허용 된 최대 중간 피어 시간 오프셋 조정. 시간에 대한 지역적 전망치는 전방 또는 후방의 피어에 의해 영향을 받을 수 있습니다. (기본값: %u 초) Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly. @@ -2350,6 +3118,10 @@ %s가 유용하다고 생각한다면 프로젝트에 공헌해주세요. 이 소프트웨어에 대한 보다 자세한 정보는 %s를 방문해주십시오. + Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s) + 블록 생성시 거래가 포함되도록 최저 수수료율을 설정하십시오 (%s/kB 단위). (기본값: %s) + + Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d) 스크립트 인증 스레드의 갯수 설정 (%u-%d, 0 = 자동, <0 = 지정된 코어 개수만큼 사용 안함, 기본값: %d) @@ -2358,6 +3130,10 @@ 블록 데이터베이스에 미래의 블록이 포함되어 있습니다. 이것은 사용자의 컴퓨터의 날짜와 시간이 올바르게 설정되어 있지 않을때 나타날 수 있습니다. 만약 사용자의 컴퓨터의 날짜와 시간이 올바르다고 확신할 때에만 블록 데이터 베이스의 재구성을 하십시오 + This is a pre-release test build - use at your own risk - do not use for mining or merchant applications + 출시 전의 테스트 빌드 입니다. - 스스로의 책임하에 사용하십시오 - 채굴이나 상업적 용도로 프로그램으로 사용하지 마십시오 + + Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain 데이터베이스를 포크 전 상태로 돌리지 못했습니다. 블록체인을 다시 다운로드 해주십시오. @@ -2366,8 +3142,24 @@ 리슨(Listen) 포트를 할당하기 위해 UPnP 사용 (기본값: 열려있거나 -proxy 옵션을 사용하지 않을 시 1) + Username and hashed password for JSON-RPC connections. The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is included in share/rpcuser. The client then connects normally using the rpcuser=<USERNAME>/rpcpassword=<PASSWORD> pair of arguments. This option can be specified multiple times + 클라이언트JSON-RPC 연결시 사용자 이름과 해시화된 암호문. <userpw> 필드는 <USERNAME>:<SALT>$<HASH> 포멧으로 구성되어 있습니다. 전형적 파이썬 스크립트에선 share/rpcuser가 포함되어 있습니다. 그런 다음 클라이언트는 rpcuser=<USERNAME>/ rpcpassword=<PASSWORD> 쌍의 인수를 사용하여 정상적으로 연결합니다. 이 옵션은 여러번 지정할 수 있습니다. + + + Wallet will not create transactions that violate mempool chain limits (default: %u) + 지갑은 mempool chain limit (기본값: %u) 을 위반하는 거래를 생성하지 않습니다. + + + Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues. + 경고 : 모든 네트워크가 동의해야 하나, 일부 채굴자들에게 문제가 있는 것으로 보입니다. + + + Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade. + 경고: 현재 비트코인 버전이 다른 네트워크 참여자들과 동일하지 않은 것 같습니다. 당신 또는 다른 참여자들이 동일한 비트코인 버전으로 업그레이드 할 필요가 있습니다. + + You need to rebuild the database using -reindex-chainstate to change -txindex - -txindex를 바꾸기 위해서는 -reindex-chainstate를 사용해서 데이터베이스를 재구성해야 합니다. + -txindex를 바꾸기 위해서는 -reindex-chainstate 를 사용해서 데이터베이스를 재구성해야 합니다. %s corrupt, salvage failed @@ -2398,6 +3190,14 @@ %s 주소를 확인할 수 없습니다: '%s' + Chain selection options: + 체인 선택 옵션: + + + Change index out of range + 범위 밖의 인덱스 변경 + + Connection options: 연결 설정 : @@ -2419,7 +3219,7 @@ Do you want to rebuild the block database now? - 블락 데이터베이스를 다시 생성하시겠습니까? + 블록 데이터베이스를 다시 생성하시겠습니까? Enable publish hash block in <address> @@ -2427,19 +3227,19 @@ Enable publish hash transaction in <address> - <address>에 대한 해시 트랙잭션 공개 활성화 + <address>에 대한 해시 거래 공개 활성화 Enable publish raw block in <address> - <address>에 대한 로우 블록 공개 활성화 + <address>에 대한 원시 블록 공개 활성화 Enable publish raw transaction in <address> - <address>에 대한 로우 트랜잭션 공개 활성화 + <address>에 대한 원시 거래 공개 활성화 Enable transaction replacement in the memory pool (default: %u) - 메모리 풀(pool) 내의 트랜잭션 치환(replacement) 활성화 (기본값: %u) + 메모리 풀(pool) 내의 거래 치환(replacement) 활성화 (기본값: %u) Error initializing block database @@ -2507,7 +3307,7 @@ Keep the transaction memory pool below <n> megabytes (default: %u) - 트랜잭션 메모리 풀의 용량을 <n>메가바이트 아래로 유지하기 (기본값: %u) + 거래 메모리 풀의 용량을 <n>메가바이트 아래로 유지하기 (기본값: %u) Loading banlist... @@ -2590,6 +3390,10 @@ 리슨(Listen) 포트를 할당하기 위해 UPnP 사용 (기본값: %u) + Use the test chain + 테스트 체인 사용 + + User Agent comment (%s) contains unsafe characters. 사용자 정의 코멘트 (%s)에 안전하지 못한 글자가 포함되어 있습니다. @@ -2647,7 +3451,7 @@ Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s) - 해당 금액(%s/kB) 보다 적은 수수료는 중계, 채굴, 트랜잭션 생성에서 수수료 면제로 간주됩니다 (기본값: %s) + 해당 금액(%s/kB) 보다 적은 수수료는 중계, 채굴, 거래 생성에서 수수료 면제로 간주됩니다 (기본값: %s) If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u) @@ -2655,11 +3459,11 @@ Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions) - 유효하지 않은 금액 -maxtxfee=<amount>: '%s' (트랜잭션이 막히는 상황을 방지하게 위해 적어도 %s 의 중계 수수료를 지정해야 합니다) + 유효하지 않은 금액 -maxtxfee=<amount>: '%s' (거래가 막히는 상황을 방지하게 위해 적어도 %s 의 중계 수수료를 지정해야 합니다) Maximum size of data in data carrier transactions we relay and mine (default: %u) - 중계 및 채굴을 할 때 데이터 운송 트랜잭션에서 데이터의 최대 크기 (기본값: %u) + 중계 및 채굴을 할 때 데이터 운송 거래에서 데이터의 최대 크기 (기본값: %u) Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u) @@ -2674,8 +3478,12 @@ 거래액이 수수료를 지불하기엔 너무 작습니다 + Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start + BIP32 이후에는 계층적 결정성 키 생성 (HD)을 사용하십시오. 지갑 생성/처음 시작 시에만 효과가 있습니다. + + Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway - 화이트리스트에 포함된 피어는 이미 메모리풀에 포함되어 있어도 DoS 추방이 되지 않으며 그들의 트랜잭션이 항상 중계됩니다, 이는 예를 들면 게이트웨이에서 유용합니다. + 화이트리스트에 포함된 피어는 이미 메모리풀에 포함되어 있어도 DoS 추방이 되지 않으며 그들의 거래가 항상 중계됩니다, 이는 예를 들면 게이트웨이에서 유용합니다. You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain @@ -2719,7 +3527,7 @@ Keep at most <n> unconnectable transactions in memory (default: %u) - 최대 <n>개의 연결할 수 없는 트랜잭션을 메모리에 저장 (기본값: %u) + 최대 <n>개의 연결할 수 없는 거래를 메모리에 저장 (기본값: %u) Need to specify a port with -whitebind: '%s' @@ -2739,7 +3547,7 @@ Rescan the block chain for missing wallet transactions on startup - 시작시 누락된 지갑 트랜잭션에 대해 블록 체인을 다시 검색 합니다 + 시작시 누락된 지갑 거래에 대해 블록 체인을 다시 검색 합니다 Send trace/debug info to console instead of debug.log file @@ -2747,7 +3555,7 @@ Send transactions as zero-fee transactions if possible (default: %u) - 가능한 경우 수수료 없이 트랜잭션 보내기 (기본값: %u) + 가능한 경우 수수료 없이 거래 보내기 (기본값: %u) Show all debugging options (usage: --help -help-debug) @@ -2783,7 +3591,7 @@ Transaction too large for fee policy - 수수료 정책에 비해 트랜잭션이 너무 큽니다 + 수수료 정책에 비해 거래가 너무 큽니다 Transaction too large @@ -2823,7 +3631,7 @@ Execute command when the best block changes (%s in cmd is replaced by block hash) - 최고의 블럭이 변하면 명령을 실행(cmd 에 있는 %s 는 블럭 해시에 의해 대체되어 짐) + 최고의 블록이 변하면 명령을 실행 (cmd 에 있는 %s 는 블록 해시에 의해 대체되어 짐) Allow DNS lookups for -addnode, -seednode and -connect @@ -2835,27 +3643,35 @@ (1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data) - (1 = 트랜잭션의 메타 데이터를 유지함 예. 계좌정보 와 지불 요구 정보, 2 = 트랜잭션 메타 데이터 파기) + (1 = 거래의 메타 데이터를 유지함 예. 계좌정보 와 지불 요구 정보, 2 = 거래 메타 데이터 파기) -maxtxfee is set very high! Fees this large could be paid on a single transaction. - -maxtxfee값이 너무 큽니다! 하나의 트랜잭션에 너무 큰 수수료가 지불 됩니다. + -maxtxfee값이 너무 큽니다! 하나의 거래에 너무 큰 수수료가 지불 됩니다. Do not keep transactions in the mempool longer than <n> hours (default: %u) - 메모리 풀에 있는 트랜잭션 기록을 <n>시간 후 부터는 유지하지 않기 (기본값: %u) + 메모리 풀에 있는 거래 기록을 <n>시간 후 부터는 유지하지 않기 (기본값: %u) + + + Equivalent bytes per sigop in transactions for relay and mining (default: %u) + 릴레이 및 마이닝 거래의 sigop 당 동등한 바이트 (기본값: %u) Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s) 해당 금액(%s/kB) 보다 적은 수수료는 수수료 면제로 간주됩니다.(기본값: %s) + Force relay of transactions from whitelisted peers even if they violate local relay policy (default: %d) + 피어들이 로컬 중계 정책을 위반하더라도 화이트 리스트에 포함된 피어인경우 강제로 중계하기 (기본값: %d) + + How thorough the block verification of -checkblocks is (0-4, default: %u) -checkblocks을 통한 블록 점검 (0-4, 기본값: %u) Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u) - getrawtransaction를 RPC CALL를 통해 완전한 트랜잭션 인덱스 유지 (기본값: %u) + getrawtransaction를 RPC CALL를 통해 완전한 거래 인덱스 유지 (기본값: %u) Number of seconds to keep misbehaving peers from reconnecting (default: %u) @@ -2866,8 +3682,24 @@ 디버그 정보 출력 (기본값: %u, <category> 제공은 선택입니다) + Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect/-noconnect) + 보유한 피어 주소가 적은 경우 DNS 조회를 통해 피어 주소를 요청합니다. (-connect / -noconnect가 아니라면 기본값은 1) + + + Sets the serialization of raw transaction or block hex returned in non-verbose mode, non-segwit(0) or segwit(1) (default: %d) + non-segwit(0) 또는 segwit(1) (기본값: %d) 가 아닌 자세한 정보 표시 모드로 반환 된 원시 거래 또는 블록 hex의 직렬화를 설정합니다. + + Support filtering of blocks and transaction with bloom filters (default: %u) - 블룸필터를 통해 블록과 트랜잭션 필터링 지원 (기본값: %u) + 블룸필터를 통해 블록과 거래 필터링 지원 (기본값: %u) + + + This is the transaction fee you may pay when fee estimates are not available. + 이것은 수수료 견적을 이용할 수 없을 때 지불 할 수 있는 거래 수수료입니다. + + + This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit %s and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard. + 이 제품에는 OpenSSL Project에서 OpenSSL Toolkit %s으로 사용하기 위해 개발 한 소프트웨어와 Eric Young이 작성한 암호화 소프트웨어 및 Thomas Bernard가 작성한 UPnP 소프트웨어가 포함되어 있습니다. Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments. @@ -2902,6 +3734,10 @@ 설정된 IP주소 (보기 1.2.3.4) 혹은 CIDR로 작성된 네트워크 (보기 1.2.3.0/24)로 화이트리스트에 포함된 피어에 접속합니다. 이 설정은 복수로 지정 할 수 있습니다. + %s is set very high! + %s가 매우 높게 설정되었습니다! + + (default: %s) (기본값: %s) @@ -2922,6 +3758,10 @@ 잘못된 -proxy 주소입니다: '%s' + Keypool ran out, please call keypoolrefill first + Keypool이 종료되었습니다. 먼저 keypoolrefill을 호출하십시오. + + Listen for JSON-RPC connections on <port> (default: %u or testnet: %u) JSON-RPC 연결을 <port>포트로 받기 (기본값: %u 혹은 테스트넷: %u) @@ -2935,7 +3775,7 @@ Make the wallet broadcast transactions - 지갑 브로드캐스트 트랜잭션을 만들기 + 지갑 브로드캐스트 거래를 만들기 Maximum per-connection receive buffer, <n>*1000 bytes (default: %u) @@ -2951,17 +3791,25 @@ Relay and mine data carrier transactions (default: %u) - 데이터 운송 트랜잭션을 중계 및 채굴 (기본값: %u) + 데이터 운송 거래를 중계 및 채굴 (기본값: %u) Relay non-P2SH multisig (default: %u) 비 P2SH 다중서명을 중계 (기본값: %u) + Send transactions with full-RBF opt-in enabled (default: %u) + full-RBF opt-in이 활성화 된 거래을 전송합니다. (기본값: %u) + + Set key pool size to <n> (default: %u) 키 풀 사이즈를 <n> 로 설정 (기본값: %u) + Set maximum BIP141 block weight (default: %d) + 최대 BIP141 블록 무게 설정 (기본값: %d) + + Set the number of threads to service RPC calls (default: %d) 원격 프로시져 호출 서비스를 위한 쓰레드 개수를 설정 (기본값 : %d) @@ -2979,15 +3827,39 @@ Spend unconfirmed change when sending transactions (default: %u) - 트랜잭션을 보낼 때 검증되지 않은 잔돈 쓰기 (기본값: %u) + 거래를 보낼 때 검증되지 않은 잔돈 쓰기 (기본값: %u) Starting network threads... 네트워크 스레드 시작중... + The wallet will avoid paying less than the minimum relay fee. + 지갑은 최소 중계 수수료보다 적은 금액을 지불하는 것을 피할 것입니다. + + + This is the minimum transaction fee you pay on every transaction. + 이것은 모든 거래에서 지불하는 최소 거래 수수료입니다. + + + This is the transaction fee you will pay if you send a transaction. + 이것은 거래를 보낼 경우 지불 할 거래 수수료입니다. + + Threshold for disconnecting misbehaving peers (default: %u) - 이상행동 네트워크 참여자의 연결을 차단시키기 위한 한계치 (기본값: %u) + 비정상적인 피어의 연결을 차단시키기 위한 임계값 (기본값: %u) + + + Transaction amounts must not be negative + 거래액은 반드시 정수여야합니다. + + + Transaction has too long of a mempool chain + 거래가 너무 긴 mempool 체인을 갖고 있습니다 + + + Transaction must have at least one recipient + 거래에는 최소한 한명의 수령인이 있어야 합니다. Unknown network specified in -onlynet: '%s' @@ -2999,7 +3871,7 @@ Loading block index... - 블럭 인덱스를 불러오는 중... + 블록 인덱스를 불러오는 중... Add a node to connect to and attempt to keep the connection open diff --git a/src/qt/locale/bitcoin_ms_MY.ts b/src/qt/locale/bitcoin_ms_MY.ts index 0108332dd75..7844093e3bb 100644 --- a/src/qt/locale/bitcoin_ms_MY.ts +++ b/src/qt/locale/bitcoin_ms_MY.ts @@ -2,6 +2,10 @@ AddressBookPage + Right-click to edit address or label + Klik-kanan untuk edit alamat ataupun label + + Create a new address Cipta alamat baru @@ -18,6 +22,10 @@ &Salin + C&lose + &Tutup + + Delete the currently selected address from the list Padam alamat semasa yang dipilih dari senaraiyang dipilih dari senarai @@ -34,25 +42,301 @@ Alihkan fail data ke dalam tab semasa &Delete &Padam - + + Choose the address to send coins to + Pilih alamat untuk hantar koin kepada + + + Choose the address to receive coins with + Pilih alamat untuk menerima koin dengan + + + C&hoose + &Pilih + + + Sending addresses + alamat-alamat penghantaran + + + Receiving addresses + alamat-alamat penerimaan + + + These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + Ini adalah alamat Bitcoin anda untuk pembayaran. Periksa jumlah dan alamat penerima sebelum membuat penghantaran koin sentiasa. + + + These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. + Ini adalah alamat Bitcoin anda untuk menerima pembayaraan. Anda disyorkan untuk menguna alamat menerima untuk setiap transaksi. + + + &Copy Address + &Salin Aamat + + + Copy &Label + Salin & Label + + + &Edit + &Edit + + + Export Address List + Eskport Senarai Alamat + + + Comma separated file (*.csv) + Fail dibahagi oleh koma(*.csv) + + + Exporting Failed + Mengeksport Gagal + + + There was an error trying to save the address list to %1. Please try again. + Terdapat ralat semasa cubaan menyimpan senarai alamat kepada %1. Sila cuba lagi. + + AddressTableModel - + + Label + Label + + + Address + Alamat + + + (no label) + (tiada label) + + AskPassphraseDialog - + + Passphrase Dialog + Dialog frasa laluan + + + Enter passphrase + memasukkan frasa laluan + + + New passphrase + Frasa laluan baru + + + Repeat new passphrase + Ulangi frasa laluan baru + + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. + Memasukkan frasa laluan baru kepada dompet.<br/>Sila mengunakkan frasa laluan yang<b>mengandungi 10 atau lebih aksara rawak</b>,ataupun<b>lapan atau lebih perkataan.</b> + + + Encrypt wallet + Dompet encrypt + + + This operation needs your wallet passphrase to unlock the wallet. + Operasi ini perlukan frasa laluan dompet anda untuk membuka kunci dompet. + + + Unlock wallet + Membuka kunci dompet + + + This operation needs your wallet passphrase to decrypt the wallet. + Operasi ini memerlukan frasa laluan dompet anda untuk menyahsulit dompet. + + + Decrypt wallet + Menyahsulit dompet + + + Change passphrase + Menukar frasa laluan + + + Enter the old passphrase and new passphrase to the wallet. + Memasukkan frasa laluan lama dan frasa laluan baru untuk. + + + Confirm wallet encryption + Mengesahkan enkripsi dompet + + + Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! + Amaran: Jika anda enkripkan dompet anda dan hilangkan frasa laluan, anda akan <b>ANDA AKAN HILANGKAN SEMUA BITCOIN ANDA</b>! + + + Are you sure you wish to encrypt your wallet? + Anda pasti untuk membuat enkripsi dompet anda? + + + Wallet encrypted + Dompet dienkripsi + + + %1 will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. + %1 akan tutup untuk menyelesaikan proses enkripsi. Ingat bahawa enkripsi tidak boleh melidungi sepenuhnya bitcoins anda daripada dicuri oleh malware yang menjangkiti komputer anda. + + + IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. + PENTING: Apa-apa sandaran yang anda buat sebelum ini untuk fail dompet anda hendaklah digantikan dengan fail dompet enkripsi yang dijana baru. Untuk sebab-sebab keselamatan , sandaran fail dompet yang belum dibuat enkripsi sebelum ini akan menjadi tidak berguna secepat anda mula guna dompet enkripsi baru. + + + Wallet encryption failed + Enkripsi dompet gagal + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Enkripsi dompet gagal kerana ralat dalaman. Dompet anda tidak dienkripkan. + + + The supplied passphrases do not match. + Frasa laluan yang dibekalkan tidak sepadan. + + + Wallet unlock failed + Pembukaan kunci dompet gagal + + + The passphrase entered for the wallet decryption was incorrect. + Frasa laluan dimasukki untuk dekripsi dompet adalah tidak betul. + + + Wallet decryption failed + Dekripsi dompet gagal + + + Wallet passphrase was successfully changed. + Frasa laluan dompet berjaya ditukar. + + + Warning: The Caps Lock key is on! + Amaran: Kunci Caps Lock buka! + + BanTableModel - + + IP/Netmask + IP/Netmask + + + Banned Until + Diharamkan sehingga + + BitcoinGUI + Sign &message... + Tandatangan & mesej... + + + Synchronizing with network... + Penyegerakan dengan rangkaian... + + + &Overview + &Gambaran Keseluruhan + + + Node + Nod + + + Show general overview of wallet + Tunjuk gambaran keseluruhan umum dompet + + + &Transactions + &Transaksi + + + Browse transaction history + Menyemak imbas sejarah transaksi + + + E&xit + &Keluar + + + Quit application + Berhenti aplikasi + + + &About %1 + &Mengenai%1 + + + Show information about %1 + Menunjuk informasi mengenai%1 + + + About &Qt + Mengenai &Qt + + + Show information about Qt + Menunjuk informasi megenai Qt + + &Options... Pilihan + + Modify configuration options for %1 + Mengubah suai pilihan konfigurasi untuk %1 + + + &Encrypt Wallet... + &Enkripsi Dompet + + + &Backup Wallet... + &Dompet Sandaran... + + + &Change Passphrase... + &Menukar frasa-laluan + + + &Sending addresses... + &Menghantar frasa-laluan + + + &Receiving addresses... + &Menerima frasa-laluan... + + + Open &URI... + Buka &URI... + + + Reindexing blocks on disk... + Reindexi blok pada cakera... + + + Send coins to a Bitcoin address + Menghantar koin kepada alamat Bitcoin + + + Backup wallet to another location + Wallet sandaran ke lokasi lain + CoinControlDialog + + (no label) + (tiada label) + EditAddressDialog @@ -113,9 +397,25 @@ Alihkan fail data ke dalam tab semasa Copy &Address &Salin Alamat + + Address + Alamat + + + Label + Label + RecentRequestsTableModel + + Label + Label + + + (no label) + (tiada label) + SendCoinsDialog @@ -123,7 +423,11 @@ Alihkan fail data ke dalam tab semasa Balance: Baki - + + (no label) + (tiada label) + + SendCoinsEntry @@ -150,9 +454,33 @@ Alihkan fail data ke dalam tab semasa TransactionTableModel + + Label + Label + + + (no label) + (tiada label) + TransactionView + + Comma separated file (*.csv) + Fail dibahagi oleh koma(*.csv) + + + Label + Label + + + Address + Alamat + + + Exporting Failed + Mengeksport Gagal + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts index 183cbac80aa..d0f82b2d89c 100644 --- a/src/qt/locale/bitcoin_nb.ts +++ b/src/qt/locale/bitcoin_nb.ts @@ -41,10 +41,74 @@ &Delete &Slett - + + Choose the address to send coins to + Velg adressen å sende mynter til + + + Choose the address to receive coins with + Velg adressen til å motta mynter med + + + Sending addresses + Utsendingsadresser + + + Receiving addresses + Mottaksadresser + + + These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + Dette er dine Bitcoin-adresser for sending av betalinger. Sjekk alltid beløpet og mottakeradressen før sending av mynter. + + + These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. + Dette er dine Bitcoin-adresser for å sende betalinger med. Det er anbefalt å bruke en ny mottaksadresse for hver transaksjon. + + + &Copy Address + &Kopier Adresse + + + Copy &Label + Kopier &Merkelapp + + + &Edit + &Rediger + + + Export Address List + Eksporter adresseliste + + + Comma separated file (*.csv) + Kommaseparert fil (*.csv) + + + Exporting Failed + Eksportering feilet + + + There was an error trying to save the address list to %1. Please try again. + Det oppstod en feil under lagring av adresselisten til %1. Vennligst prøv på nytt. + + AddressTableModel - + + Label + Merkelapp + + + Address + Adresse + + + (no label) + (ingen merkelapp) + + AskPassphraseDialog @@ -63,6 +127,26 @@ Repeat new passphrase Gjenta ny adgangsfrase + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. + Oppgi adgangsfrasen til lommeboken.<br/>Vennligst bruk en adgangsfrase med <b>ti eller flere tilfeldige tegn</b>, eller <b>åtte eller flere ord</b>. + + + Encrypt wallet + Krypter lommebok + + + Unlock wallet + Lås opp lommebok + + + Decrypt wallet + Dekrypter lommebok + + + Change passphrase + Endre adgangsfrase + BanTableModel @@ -422,6 +506,10 @@ Confirmed Bekreftet + + (no label) + (ingen merkelapp) + EditAddressDialog @@ -1302,9 +1390,25 @@ &Save Image... &Lagre Bilde... + + Address + Adresse + + + Label + Merkelapp + RecentRequestsTableModel + + Label + Merkelapp + + + (no label) + (ingen merkelapp) + SendCoinsDialog @@ -1448,7 +1552,11 @@ S&end S&end - + + (no label) + (ingen merkelapp) + + SendCoinsEntry @@ -1651,9 +1759,33 @@ TransactionTableModel + + Label + Merkelapp + + + (no label) + (ingen merkelapp) + TransactionView + + Comma separated file (*.csv) + Kommaseparert fil (*.csv) + + + Label + Merkelapp + + + Address + Adresse + + + Exporting Failed + Eksportering feilet + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_ne.ts b/src/qt/locale/bitcoin_ne.ts index f7fb0e5a6e8..be6e8e03910 100644 --- a/src/qt/locale/bitcoin_ne.ts +++ b/src/qt/locale/bitcoin_ne.ts @@ -41,6 +41,23 @@ &Delete &amp;मेटाउनुहोस् + + C&hoose + छनौट गर्नुहोस्... + + + Sending addresses + पठाउने ठेगानाहरू... + + + Receiving addresses + प्राप्त गर्ने ठेगानाहरू... + + + &Copy Address + ठेगाना कपी गर्नुहोस् + + AddressTableModel @@ -192,6 +209,11 @@ Amount रकम + + Copy address + ठेगाना कपी गर्नुहोस् + + EditAddressDialog @@ -204,6 +226,10 @@ Intro + + %1 will download and store a copy of the Bitcoin block chain. At least %2GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory. + %1 ले बिटकोइन ब्लक चेनको एउटा प्रतिलिपि डाउनलोड र भण्डारण गर्नेछ । यो निर्देशिकामा कम्तिमा पनि %2GB डाटा भण्डारण गरिनेछ, र यो समयसँगै बढ्नेछ । वालेटलाई पनि यो निर्देशिकामा भण्डारण गरिनेछ । + ModalOverlay @@ -213,6 +239,10 @@ OptionsDialog + + Choose the default subdivision unit to show in the interface and when sending coins. + इन्टरफेसमा र सिक्का पठाउँदा देखिने डिफल्ट उपविभाजन एकाइ चयन गर्नुहोस् । + OverviewPage @@ -281,6 +311,10 @@ Amount रकम + + Enter a Bitcoin address (e.g. %1) + कृपया बिटकोइन ठेगाना प्रवेश गर्नुहोस् (उदाहरण %1) + QObject::QObject @@ -310,14 +344,26 @@ SendCoinsDialog + + Choose... + छनौट गर्नुहोस्... + SendCoinsEntry + Choose previously used address + पहिला प्रयोग गरिएको ठेगाना प्रयोग गर्नुहोस् + + The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. पठाइँदै गरेको रकमबाट शुल्क कटौती गरिनेछ । प्राप्तकर्ताले तपाईंले रकम क्षेत्रमा प्रवेष गरेको भन्दा थोरै बिटकोइन प्राप्त गर्ने छन् । धेरै प्राप्तकर्ता चयन गरिएको छ भने समान रूपमा शुल्क विभाजित गरिनेछ । + Enter a label for this address to add it to the list of used addresses + यो ठेगानालाई प्रयोग गरिएको ठेगानाको सूचीमा थप्न एउटा लेबल प्रविष्ट गर्नुहोस् + + A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network. बिटकोइनमा संलग्न गरिएको सन्देश: तपाईंको मध्यस्थको लागि कारोबारको साथमा भण्डारण गरिने URI । नोट: यो सन्देश बिटकोइन नेटवर्क मार्फत पठाइने छैन । @@ -334,6 +380,18 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. आफ्नो ठेगानामा पठाइएको बिटकोइन प्राप्त गर्न सकिन्छ भनेर प्रमाणित गर्न तपाईंले ती ठेगानाले सन्देश/सम्झौताहरूमा हस्ताक्षर गर्न सक्नुहुन्छ । फिसिङ आक्रमणले तपाईंलाई छक्याएर अरूका लागि तपाईंको परिचयमा हस्ताक्षर गराउने प्रयास गर्न सक्ने भएकाले अस्पष्ट वा जथाभावीमा हस्ताक्षर गर्दा ध्यान दिनुहोस् । आफू सहमत भएको पूर्ण विस्तृत-कथनमा मात्र हस्ताक्षर गर्नुहोस् । + + Choose previously used address + पहिला प्रयोग गरिएको ठेगाना प्रयोग गर्नुहोस् + + + Copy the current signature to the system clipboard + वर्तमान हस्ताक्षरलाई प्रणाली क्लिपबोर्डमा कपी गर्नुहोस् + + + Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction! + सन्देश प्रमाणित गर्न, तल दिइएको स्थानमा प्राप्तकर्ता ठेगाना, सन्देश (लाइन ब्रेक, स्पेस, ट्याब, आदि उस्तै गरी कपी गर्ने कुरा सुनिश्चित गर्नुहोस्) र हस्ताक्षर &apos;s प्रविष्ट गर्नुहोस् । बीचमा-मानिसको-आक्रमणबाट बच्न हस्ताक्षर पढ्दा हस्ताक्षर गरिएको सन्देशमा जे छ त्यो भन्दा धेरै कुरामा ध्यान नदिनुहोस् । यो कार्यले हस्ताक्षर गर्ने पक्षले मात्र यो ठेगानाले प्राप्त गर्छ भन्ने कुरा प्रमाणित गर्छ, यसले कुनै पनि कारोबारको प्रेषककर्तालाई प्रमाणित गर्न सक्दैन भन्ने कुरा याद गर्नुहोस्! + SplashScreen @@ -352,6 +410,11 @@ TransactionView + + Copy address + ठेगाना कपी गर्नुहोस् + + UnitDisplayStatusBarControl @@ -364,10 +427,23 @@ WalletView + + &Export + &amp;निर्यात गर्नुहोस् + + + + Export the data in the current tab to a file + वर्तमान ट्याबको डाटालाई फाइलमा निर्यात गर्नुहोस् + bitcoin-core + Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup + वालेटको सबै कारोबार मेटाउनुहोस् र -स्टार्टअपको पुनः स्क्यान मार्फत ब्लकचेनका ती भागहरूलाई मात्र पुनः प्राप्त गर्नुहोस् + + The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct ब्लक डाटाबेसमा भविष्यबाट आए जस्तो देखिने एउटा ब्लक हुन्छ । तपाईंको कम्प्युटरको मिति र समय गलत तरिकाले सेट गरिएकाले यस्तो हुन सक्छ । तपाईं आफ्नो कम्प्युटरको मिति र समय सही छ भनेर पक्का हुनुहुन्छ भने मात्र ब्लक डाटाबेस पुनर्निर्माण गर्नुहोस् । diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts index 2b625b5a078..e523e832810 100644 --- a/src/qt/locale/bitcoin_nl.ts +++ b/src/qt/locale/bitcoin_nl.ts @@ -3,7 +3,7 @@ AddressBookPage Right-click to edit address or label - Klik met de rechtermuisknop om het adres of label te wijzigen + Rechtermuisklik om het adres of label te wijzigen Create a new address @@ -318,6 +318,22 @@ Open &URI... + Click to disable network activity. + Klik om de netwerkactiviteit te stoppen. + + + Network activity disabled. + Netwerkactiviteit gestopt. + + + Click to enable network activity again. + Klik om de netwerkactiviteit opnieuw te starten. + + + Syncing Headers (%1%)... + Kopteksten synchroniseren (%1%)... + + Reindexing blocks on disk... Bezig met herindexeren van blokken op harde schijf... @@ -470,6 +486,10 @@ %1 client + Connecting to peers... + Gelijke worden verbonden... + + Catching up... Aan het bijwerken... @@ -512,6 +532,14 @@ Binnenkomende transactie + HD key generation is <b>enabled</b> + HD sleutel voortbrenging is <b>ingeschakeld</b> + + + HD key generation is <b>disabled</b> + HD sleutel voortbrenging is <b>uitgeschakeld</b> + + Wallet is <b>encrypted</b> and currently <b>unlocked</b> Portemonnee is <b>versleuteld</b> en momenteel <b>geopend</b> @@ -519,7 +547,11 @@ Wallet is <b>encrypted</b> and currently <b>locked</b> Portemonnee is <b>versleuteld</b> en momenteel <b>gesloten</b> - + + A fatal error occurred. Bitcoin can no longer continue safely and will quit. + Een fatale fout heeft zich voorgedaan. Bitcoin kan niet veilig worden verdergezet en wordt afgesloten. + + CoinControlDialog @@ -854,14 +886,50 @@ Vorm + Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below. + Recente transacties zijn mogelijk nog niet zichtbaar. De balans van de geldbeugel is daarom mogelijk niet correct. Deze informatie is correct van zodra de synchronisatie met het Bitcoin-netwerk werd voltooid, zoals onderaan beschreven. + + + Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. + Poging om bitcoins te besteden die door "nog niet weergegeven" transacties worden beïnvloed, worden niet door het netwerk geaccepteerd. + + + Number of blocks left + Aantal blokken resterend. + + + Unknown... + Onbekend... + + Last block time Tijd laatste blok + Progress + Vooruitgang + + + Progress increase per hour + Vooruitgang per uur + + + calculating... + Berekenen... + + + Estimated time left until synced + Geschatte tijd tot volledig synchroon + + Hide Verbergen - + + Unknown. Syncing Headers (%1)... + Onbekend. Kopteksten synchroniseren (%1%)... + + OpenURIDialog @@ -1296,7 +1364,15 @@ Node/Service Node/Dienst - + + NodeId + Node ID + + + Ping + Ping + + QObject @@ -1335,14 +1411,54 @@ %1 ms %1 ms + + %n second(s) + %n seconde%n seconden + + + %n minute(s) + %n minuut%n minuten + + + %n hour(s) + %n uur%n uren + + + %n day(s) + %n dag%n dagen + + + %n week(s) + %n week%n weken + %1 and %2 %1 en %2 - + + %n year(s) + %n jaar%n jaren + + + %1 didn't yet exit safely... + %1 sloot nog niet veilig af... + + QObject::QObject - + + Error: Specified data directory "%1" does not exist. + Fout: Opgegeven gegevensmap "%1" bestaat niet. + + + Error: Cannot parse configuration file: %1. Only use key=value syntax. + Fout: Kan configuratiebestand niet verwerken: %1. Gebruik enkel de key=value syntax. + + + Error: %1 + Fout: %1 + + QRImageWidget @@ -1521,6 +1637,10 @@ Pingwachttijd + Min Ping + Min Ping + + Time Offset Tijdcompensatie @@ -1581,6 +1701,18 @@ 1 &jaar + &Disconnect + &Verbreek verbinding + + + Ban for + Ban Node voor + + + &Unban + &Maak ban voor Node ongedaan + + Welcome to the %1 RPC console. Welkom bij de %1 RPC-console. @@ -1593,6 +1725,14 @@ Typ <b>help</b> voor een overzicht van de beschikbare opdrachten. + WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramification of a command. + WAARSCHUWING: Er zijn Scammers actief geweest, die gebruikers vragen om hier commando's te typen, waardoor de inhoud van hun portefeuille werd gestolen. Gebruik deze console niet zonder de toedracht van een opdracht volledig te begrijpen. + + + Network activity disabled + Netwerkactiviteit uitgeschakeld + + %1 B %1 B @@ -1712,6 +1852,10 @@ Verwijder + Copy URI + Kopieer URI + + Copy label Kopieer label @@ -1937,6 +2081,10 @@ Stof: + Confirmation time target: + Bevestigingstijddoel: + + Clear &All Verwijder &Alles @@ -2029,6 +2177,10 @@ Transactiecreatie mislukt + The transaction was rejected with the following reason: %1 + De transactie werd afgewezen om de volgende reden: %1 + + A fee higher than %1 is considered an absurdly high fee. Een vergoeding van meer dan %1 wordt beschouwd als een absurd hoge vergoeding. @@ -2036,10 +2188,18 @@ Payment request expired. Betalingsverzoek verlopen. + + %n block(s) + %n blok%n blokken + Pay only the required fee of %1 Betaal alleen de verplichte transactiekosten van %1 + + Estimated to begin confirmation within %n block(s). + Schatting is dat bevestiging begint over %n blok.Schatting is dat bevestiging begint over %n blokken. + Warning: Invalid Bitcoin address Waarschuwing: Ongeldig Bitcoinadres @@ -2049,6 +2209,14 @@ Waarschuwing: Onbekend wisselgeldadres + Confirm custom change address + Bevestig aangepast wisselgeldadres + + + The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure? + Het wisselgeldadres dat u heeft geselecteerd maakt geen deel uit van deze portemonnee. Een deel of zelfs alle geld in uw portemonnee kan mogelijk naar dit adres worden verzonden. Weet je het zeker? + + (no label) (geen label) @@ -2309,6 +2477,10 @@ TransactionDesc + + Open for %n more block(s) + Open voor nog %n blokOpen voor nog %n blokken + Open until %1 Open tot %1 @@ -2393,6 +2565,10 @@ Credit Credit + + matures in %n more block(s) + komt beschikbaar na %n nieuwe blokkomt beschikbaar na %n nieuwe blokken + not accepted niet geaccepteerd @@ -2430,6 +2606,10 @@ Transactie-ID + Transaction total size + Transactie totale grootte + + Output index Output index @@ -2491,6 +2671,10 @@ Label Label + + Open for %n more block(s) + Open voor nog %n blokOpen voor nog %n blokken + Open until %1 Open tot %1 @@ -2822,6 +3006,18 @@ Aanvaard opdrachtregel- en JSON-RPC-opdrachten + Accept connections from outside (default: 1 if no -proxy or -connect/-noconnect) + Accepteer verbindingen van buitenaf (standaard: 1 indien geen -proxy of -connect/-noconnect werd opgegeven) + + + Connect only to the specified node(s); -noconnect or -connect=0 alone to disable automatic connections + Verbind enkel met de opgegeven knooppunt(en); -noconnect of -connect = 0 alleen om automatische verbindingen uit te schakelen + + + Distributed under the MIT software license, see the accompanying file %s or %s + Uitgegeven onder de MIT software licentie, zie het bijgevoegde bestand %s of %s + + If <category> is not supplied or if <category> = 1, output all debugging information. Als er geen <categorie> is opgegeven of als de <categorie> 1 is, laat dan alle debugginginformatie zien. @@ -2898,6 +3094,14 @@ Voer opdracht uit zodra een portemonneetransactie verandert (%s in cmd wordt vervangen door TxID) + Extra transactions to keep in memory for compact block reconstructions (default: %u) + Extra transacties wordt bijgehouden voor compacte blokreconstructie (standaard: %u) + + + If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: %s, testnet: %s) + Als dit blok in de keten staat, gaat het ervan uit dat dit blok en zijn voorouders geldig zijn en mogelijk hun script verificatie overslaan (0 om alles te verifiëren, standaard:%s, testnet:%s) + + Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds) Maximum toegestane peer tijd compensatie. Lokaal perspectief van tijd mag worden beinvloed door peers die met deze hoeveelheid voor of achter lopen. (standaard: %u seconden) @@ -2914,6 +3118,14 @@ Gelieve bij te dragen als je %s nuttig vindt. Bezoek %s voor meer informatie over de software. + Reduce storage requirements by enabling pruning (deleting) of old blocks. This allows the pruneblockchain RPC to be called to delete specific blocks, and enables automatic pruning of old blocks if a target size in MiB is provided. This mode is incompatible with -txindex and -rescan. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, 1 = allow manual pruning via RPC, >%u = automatically prune block files to stay under the specified target size in MiB) + Beperk benodigde opslag door trimmen (verwijderen) van oude blokken in te schakelen. Dit maakt het mogelijk om de pruneblockchain RPC aan te roepen om specifieke blokken te verwijderen, en maakt het automatische trimmen van oude blokken mogelijk wanneer een doelgrootte in MiB is voorzien. Deze modus is niet compatibele met -txindex en -rescan. Waarschuwing: Terugzetten van deze instellingen vereist het opnieuw downloaden van gehele de blokketen. (standaard:0 = uitzetten trimmodus, 1 = manueel trimmen via RPC toestaan, >%u = automatisch blokbestanden trimmen om beneden de gespecificeerde doelgrootte in MiB te blijven) + + + Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s) + Specificeer het laagste tarief (in %s/kB) voor transacties die bij het maken van een blok moeten worden in rekening worden gebracht (standaard: %s) + + Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d) Kies het aantal scriptverificatie processen (%u tot %d, 0 = auto, <0 = laat dit aantal kernen vrij, standaard: %d) @@ -2922,6 +3134,10 @@ De blokdatabase bevat een blok dat lijkt uit de toekomst te komen. Dit kan gebeuren omdat de datum en tijd van uw computer niet goed staat. Herbouw de blokdatabase pas nadat u de datum en tijd van uw computer correct heeft ingesteld. + This is a pre-release test build - use at your own risk - do not use for mining or merchant applications + Dit is een pre-release testversie - gebruik op eigen risico! Gebruik deze niet voor het delven van munten of handelsdoeleinden + + Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain Niet mogelijk om de databank terug te draaien naar een staat voor de vork. Je zal je blokketen opnieuw moeten downloaden @@ -2930,6 +3146,22 @@ Gebruik UPnP om de luisterende poort te mappen (standaard: 1 als er geluisterd worden en geen -proxy is meegegeven) + Username and hashed password for JSON-RPC connections. The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is included in share/rpcuser. The client then connects normally using the rpcuser=<USERNAME>/rpcpassword=<PASSWORD> pair of arguments. This option can be specified multiple times + Gebruikersnaam en gehasht wachtwoord voor JSON-RPC-verbindingen. De velden <userpw> is in het formaat: <GEBRUIKERSNAAM>:<SALT>$<HASH>. Een kanoniek Pythonscript is inbegrepen in de share/rpcuser. De klant connecteert dan normaal via de rpcuser=<GEBRUIKERSNAAM>/rpcpassword=<PASWOORD> argumenten. Deze optie kan meerdere keren worden meegegeven + + + Wallet will not create transactions that violate mempool chain limits (default: %u) + Portemonnee creëert geen transacties die mempool-ketenlimieten schenden (standaard: %u) + + + Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues. + Waarschuwing: Het lijkt erop dat het netwerk geen consensus kan vinden! Sommige delvers lijken problemen te ondervinden. + + + Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade. + Waarschuwing: Het lijkt erop dat we geen consensus kunnen vinden met onze peers! Mogelijk dient u te upgraden, of andere nodes moeten wellicht upgraden. + + You need to rebuild the database using -reindex-chainstate to change -txindex Om -txindex te kunnen veranderen dient u de database opnieuw te bouwen met gebruik van -reindex-chainstate. @@ -2962,6 +3194,10 @@ Kan -%s adres niet herleiden: '%s' + Chain selection options: + Keten selectie opties: + + Change index out of range Wijzigingsindex buiten bereik @@ -3158,6 +3394,10 @@ Gebruik UPnP om de luisterende poort te mappen (standaard: %u) + Use the test chain + Gebruik de test keten + + User Agent comment (%s) contains unsafe characters. User Agentcommentaar (%s) bevat onveilige karakters. @@ -3450,10 +3690,22 @@ Output extra debugginginformatie (standaard: %u, het leveren van <categorie> is optioneel) + Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect/-noconnect) + Query voor peer-adressen via DNS-lookup , indien laag aan adressen (default: 1 unless -connect/-noconnect) + + Support filtering of blocks and transaction with bloom filters (default: %u) Ondersteun filtering van blokken en transacties met bloomfilters (standaard: %u) + This is the transaction fee you may pay when fee estimates are not available. + Dit is de transactiekost die je mogelijk betaald indien geschatte tarief niet beschikbaar is + + + This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit %s and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard. + Dit product bevat software dat ontwikkeld is door het OpenSSL Project voor gebruik in de OpenSSL Toolkit %s en cryptografische software geschreven door Eric Young en UPnP software geschreven door Thomas Bernard. + + Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments. Totale lengte van netwerkversiestring (%i) overschrijdt maximale lengte (%i). Verminder het aantal of grootte van uacomments. @@ -3482,6 +3734,14 @@ Waarschuwing: portomonee bestand is corrupt, data is veiliggesteld! Originele %s is opgeslagen als %s in %s; als uw balans of transacties incorrect zijn dient u een backup terug te zetten. + Whitelist peers connecting from the given IP address (e.g. 1.2.3.4) or CIDR notated network (e.g. 1.2.3.0/24). Can be specified multiple times. + Goedgekeurde peers die verbinden vanaf een bepaald IP adres (vb. 1.2.3.4) of CIDR genoteerd netwerk (vb. 1.2.3.0/24). Kan meerdere keren worden gespecificeerd. + + + %s is set very high! + %s is zeer hoog ingesteld! + + (default: %s) (standaard: %s) @@ -3502,6 +3762,10 @@ Ongeldig -proxy adres: '%s' + Keypool ran out, please call keypoolrefill first + Keypool op geraakt, roep alsjeblieft eerst keypoolrefill functie aan + + Listen for JSON-RPC connections on <port> (default: %u or testnet: %u) Luister naar JSON-RPC-verbindingen op <poort> (standaard: %u of testnet: %u) @@ -3538,6 +3802,10 @@ Geef non-P2SH multisig door (standaard: %u) + Send transactions with full-RBF opt-in enabled (default: %u) + Verstuur transacties met full-RBF opt-in ingeschakeld (standaard: %u) + + Set key pool size to <n> (default: %u) Stel sleutelpoelgrootte in op <n> (standaard: %u) @@ -3570,10 +3838,34 @@ Netwerkthread starten... + The wallet will avoid paying less than the minimum relay fee. + De portemonnee vermijdt minder te betalen dan het minimale relay vergoeding. + + + This is the minimum transaction fee you pay on every transaction. + Dit is het minimum transactietarief dat je betaald op elke transactie. + + + This is the transaction fee you will pay if you send a transaction. + Dit is het transactietarief dat je betaald wanneer je een transactie verstuurt. + + Threshold for disconnecting misbehaving peers (default: %u) Drempel om verbinding te verbreken naar zich misdragende peers (standaard: %u) + Transaction amounts must not be negative + Transactiebedragen moeten positief zijn + + + Transaction has too long of a mempool chain + Transactie heeft een te lange mempoolketen + + + Transaction must have at least one recipient + Transactie moet ten minste één ontvanger hebben + + Unknown network specified in -onlynet: '%s' Onbekend netwerk gespecificeerd in -onlynet: '%s' diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts index 46348140700..6d6d6718fa7 100644 --- a/src/qt/locale/bitcoin_pl.ts +++ b/src/qt/locale/bitcoin_pl.ts @@ -419,7 +419,7 @@ %n active connection(s) to Bitcoin network - %n aktywnych połączeń do sieci Bitcoin%n aktywnych połączeń do sieci Bitcoin%n aktywnych połączeń do sieci Bitcoin + %n aktywnych połączeń do sieci Bitcoin%n aktywnych połączeń do sieci Bitcoin%n aktywnych połączeń do sieci Bitcoin%n aktywnych połączeń do sieci Bitcoin Indexing blocks on disk... @@ -431,7 +431,7 @@ Processed %n block(s) of transaction history. - Przetworzono %n bloków historii transakcji.Przetworzono %n bloków historii transakcji.Przetworzono %n bloków historii transakcji. + Przetworzono %n bloków historii transakcji.Przetworzono %n bloków historii transakcji.Przetworzono %n bloków historii transakcji.Przetworzono %n bloków historii transakcji. %1 behind @@ -832,11 +832,11 @@ %n GB of free space available - %n GB dostępnego wolnego miejsca%n GB dostępnego wolnego miejsca%n GB dostępnego wolnego miejsca + %n GB dostępnego wolnego miejsca%n GB dostępnego wolnego miejsca%n GB dostępnego wolnego miejsca%n GB dostępnego wolnego miejsca (of %n GB needed) - (z %n GB potrzebnych)(z %n GB potrzebnych)(z %n GB potrzebnych) + (z %n GB potrzebnych)(z %n GB potrzebnych)(z %n GB potrzebnych)(z %n GB potrzebnych) @@ -1325,11 +1325,11 @@ %n second(s) - %n sekunda%n sekund%n sekund + %n sekunda%n sekund%n sekund%n sekund %n minute(s) - %n minuta%n minut%n minut + %n minuta%n minut%n minut%n minut %1 and %2 diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts index b5f40fc0589..7d013416ff7 100644 --- a/src/qt/locale/bitcoin_ru.ts +++ b/src/qt/locale/bitcoin_ru.ts @@ -330,6 +330,10 @@ Кликните, чтобы снова разрешить сетевую активность. + Syncing Headers (%1%)... + Синхронизация заголовков (%1%)... + + Reindexing blocks on disk... Идёт переиндексация блоков на диске... @@ -3090,6 +3094,14 @@ Выполнить команду, когда меняется транзакция в бумажнике (%s в команде заменяется на TxID) + Extra transactions to keep in memory for compact block reconstructions (default: %u) + Хранить в памяти дополнительные транзакции для реконструкции компактных блоков (по умолчанию: %u) + + + If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: %s, testnet: %s) + Если этот блок в цепи, считать его и последующие блоки верными и потенциально пропускать проверку их скриптов (0 для проверки всех, по умолчанию: %s, тестовая сеть: %s) + + Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by peers forward or backward by this amount. (default: %u seconds) Максимально допустимое среднее отклонение времени участников. Локальное представление времени может меняться вперед или назад на это количество. (по умолчанию: %u секунд) @@ -3106,6 +3118,14 @@ Пожалуйста, внести свой вклад, если вы найдете %s полезными. Посетите %s для получения дополнительной информации о программном обеспечении. + Reduce storage requirements by enabling pruning (deleting) of old blocks. This allows the pruneblockchain RPC to be called to delete specific blocks, and enables automatic pruning of old blocks if a target size in MiB is provided. This mode is incompatible with -txindex and -rescan. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, 1 = allow manual pruning via RPC, >%u = automatically prune block files to stay under the specified target size in MiB) + Уменьшить размер хранилища за счёт обрезания (удаления) старых блоков. Будет разрешён вызов RPC метода pruneblockchain для удаления определённых блоков и разрешено автоматическое обрезание старых блоков, если указан целевой размер в Мб. Этот режим несовместим с -txindex и -rescan. Внимание: переключение этой опции обратно потребует полной загрузки цепи блоков. (по умолчанию: 0 = отключить обрезание блоков, 1 = разрешить ручное обрезание через RPC, >%u = автоматически обрезать файлы блоков, чтобы они были меньше указанного размера в Мб) + + + Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s) + Задать минимальный курс комиссии (в %s/Кб) для транзакцийб включаемых в создаваемый блок. (по умолчанию: %s) + + Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d) Задать число потоков проверки скрипта (от %u до %d, 0=авто, <0 = оставить столько ядер свободными, по умолчанию: %d) diff --git a/src/qt/locale/bitcoin_ru_RU.ts b/src/qt/locale/bitcoin_ru_RU.ts index 60d98c41d95..66ab7c81f49 100644 --- a/src/qt/locale/bitcoin_ru_RU.ts +++ b/src/qt/locale/bitcoin_ru_RU.ts @@ -3,7 +3,7 @@ AddressBookPage Right-click to edit address or label - Кликните правой кнопкой мыши для редоктирования адреса или ярлыка + Кликните правой кнопкой мыши для редактирования адреса или метки Create a new address @@ -15,7 +15,7 @@ Copy the currently selected address to the system clipboard - Copy the currently selected address to the system clipboardый адрес в буфер + Скопировать текущий выбранный адрес в буфер обмена системы &Copy @@ -41,6 +41,14 @@ &Delete Удалить + + Choose the address to send coins to + Выбрать адрес для отправки монет + + + Choose the address to receive coins with + Выбрать адрес для получения монет + AddressTableModel diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts index 87dc620f0e1..510d1aaf618 100644 --- a/src/qt/locale/bitcoin_sk.ts +++ b/src/qt/locale/bitcoin_sk.ts @@ -41,10 +41,74 @@ &Delete &Zmazať - + + Choose the address to send coins to + Zvoľte adresu kam poslať mince + + + Choose the address to receive coins with + Zvoľte adresu na ktorú chcete prijať mince + + + C&hoose + Vybrať + + + Sending addresses + Odosielajúce adresy + + + Receiving addresses + Prijímajúce adresy + + + These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + Toto sú Vaše Bitcoin adresy pre posielanie platieb. Vždy skontrolujte sumu a prijímaciu adresu pred poslaním mincí. + + + These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. + Toto sú vaše Bitcoin adresy pre prijímanie platieb. Odporúča sa použiť vždy novú prijímaciu adresu pre každú transakciu. + + + &Copy Address + &Kopírovať adresu + + + Copy &Label + Kopírovať &popis + + + &Edit + &Upraviť + + + Export Address List + Exportovať zoznam adries + + + Comma separated file (*.csv) + Čiarkou oddelovaný súbor (*.csv) + + + Exporting Failed + Export zlyhal + + + There was an error trying to save the address list to %1. Please try again. + Nastala chyba pri pokuse uložiť zoznam adries do %1. Skúste znovu. + + AddressTableModel + Label + Popis + + + Address + Adresa + + (no label) (bez popisu) @@ -67,7 +131,95 @@ Repeat new passphrase Zopakujte nové heslo - + + Enter the new passphrase to the wallet.<br/>Please use a passphrase of <b>ten or more random characters</b>, or <b>eight or more words</b>. + Zadajte nové heslo k peňaženke.<br/>Prosím použite heslo s dĺžkou <b>desať alebo viac náhodných znakov</b>, prípadne <b>osem alebo viac slov</b>. + + + Encrypt wallet + Zašifrovať peňaženku + + + This operation needs your wallet passphrase to unlock the wallet. + Táto operácia potrebuje heslo k vašej peňaženke aby ju mohla odomknúť. + + + Unlock wallet + Odomknúť peňaženku + + + This operation needs your wallet passphrase to decrypt the wallet. + Táto operácia potrebuje heslo k vašej peňaženke na dešifrovanie peňaženky. + + + Decrypt wallet + Dešifrovať peňaženku + + + Change passphrase + Zmena hesla + + + Enter the old passphrase and new passphrase to the wallet. + Zadajte staré heslo a nové heslo k peňaženke. + + + Confirm wallet encryption + Potvrďte zašifrovanie peňaženky + + + Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! + Varovanie: Ak zašifrujete peňaženku a stratíte heslo, <b>STRATÍTE VŠETKY VAŠE BITCOINY</b>! + + + Are you sure you wish to encrypt your wallet? + Ste si istí, že si želáte zašifrovať peňaženku? + + + Wallet encrypted + Peňaženka zašifrovaná + + + %1 will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. + %1 sa teraz zavrie, aby sa ukončil proces šifrovania. Zašifrovanie peňaženky neochráni úplne pred krádežou bitcoinov škodlivými programami, ktoré prenikli do vášho počítača. + + + IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. + DÔLEŽITÉ: Všetky predchádzajúce zálohy vašej peňaženky, ktoré ste vykonali by mali byť nahradené novo vytvorenou, zašifrovanou peňaženkou. Z bezpečnostných dôvodov bude predchádzajúca záloha nezašifrovanej peňaženky k ničomu, akonáhle začnete používať novú, zašifrovanú peňaženku. + + + Wallet encryption failed + Šifrovanie peňaženky zlyhalo + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + Šifrovanie peňaženky zlyhalo kôli internej chybe. Vaša peňaženka nebola zašifrovaná. + + + The supplied passphrases do not match. + Zadané heslá nesúhlasia. + + + Wallet unlock failed + Odomykanie peňaženky zlyhalo + + + The passphrase entered for the wallet decryption was incorrect. + Zadané heslo pre dešifrovanie peňaženky bolo nesprávne. + + + Wallet decryption failed + Zlyhalo šifrovanie peňaženky. + + + Wallet passphrase was successfully changed. + Heslo k peňaženke bolo úspešne zmenené. + + + Warning: The Caps Lock key is on! + Upozornenie: Máte zapnutý Caps Lock! + + BanTableModel @@ -166,6 +318,22 @@ Otvoriť &URI... + Click to disable network activity. + Kliknite pre zakázanie sieťovej aktivity. + + + Network activity disabled. + Sieťová aktivita zakázaná. + + + Click to enable network activity again. + Kliknite pre povolenie sieťovej aktivity. + + + Syncing Headers (%1%)... + Synchronizujú sa hlavičky (%1%)... + + Reindexing blocks on disk... Preindexúvam bloky na disku... @@ -287,7 +455,7 @@ Last received block was generated %1 ago. - Posledný prijatý blok bol vygenerovaný pred %1. + Posledný prijatý blok bol vygenerovaný pred: %1. Transactions after this will not yet be visible. @@ -318,6 +486,10 @@ %1 klient + Connecting to peers... + Pripája sa k partnerom... + + Catching up... Sťahujem... @@ -367,7 +539,11 @@ Wallet is <b>encrypted</b> and currently <b>locked</b> Peňaženka je <b>zašifrovaná</b> a momentálne <b>zamknutá</b> - + + A fatal error occurred. Bitcoin can no longer continue safely and will quit. + Vyskytla sa kritická chyba. Bitcoin nemôže ďalej bezpečne pokračovať a ukončí sa. + + CoinControlDialog @@ -439,10 +615,86 @@ Potvrdené + Copy address + Kopírovať adresu + + + Copy label + Kopírovať popis + + + Copy amount + Kopírovať sumu + + + Copy transaction ID + Kopírovať ID transakcie + + + Lock unspent + Uzamknúť neminuté + + + Unlock unspent + Odomknúť neminuté + + + Copy quantity + Kopírovať množstvo + + + Copy fee + Kopírovať poplatok + + + Copy after fee + Kopírovať po poplatkoch + + + Copy bytes + Kopírovať bajty + + + Copy dust + Kopírovať prach + + + Copy change + Kopírovať zmenu + + + (%1 locked) + (%1 zamknutých) + + + yes + áno + + + no + nie + + + This label turns red if any recipient receives an amount smaller than the current dust threshold. + Tento popis sčervenie ak ktorýkoľvek príjemca dostane sumu menšiu ako súčasný limit pre "prach". + + + Can vary +/- %1 satoshi(s) per input. + Môže sa líšiť o +/- %1 satoshi pre každý vstup. + + (no label) (bez popisu) - + + change from %1 (%2) + zmena od %1 (%2) + + + (change) + (zmena) + + EditAddressDialog @@ -465,7 +717,39 @@ &Address &Adresa - + + New receiving address + Nová adresa pre prijímanie + + + New sending address + Nová adresa pre odoslanie + + + Edit receiving address + Upraviť prijímajúcu adresu + + + Edit sending address + Upraviť odosielaciu adresu + + + The entered address "%1" is not a valid Bitcoin address. + Vložená adresa "%1" nieje platnou adresou Bitcoin. + + + The entered address "%1" is already in the address book. + Vložená adresa "%1" sa už nachádza v adresári. + + + Could not unlock wallet. + Nepodarilo sa odomknúť peňaženku. + + + New key generation failed. + Generovanie nového kľúča zlyhalo. + + FreespaceChecker @@ -594,14 +878,50 @@ Forma + Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below. + Nedávne transakcie nemusia byť ešte viditeľné preto môže byť zostatok vo vašej peňaženke nesprávny. Táto informácia bude správna keď sa dokončí synchronizovanie peňaženky so sieťou bitcoin, ako je rozpísané nižšie. + + + Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network. + Pokus o minutie bitcoinov, ktoré sú ovplyvnené ešte nezobrazenými transakciami, nebude sieťou akceptovaný. + + + Number of blocks left + Počet zostávajúcich blokov + + + Unknown... + Neznáme... + + Last block time Čas posledného bloku + Progress + Postup synchronizácie + + + Progress increase per hour + Prírastok postupu za hodinu + + + calculating... + počíta sa... + + + Estimated time left until synced + Odhadovaný čas do ukončenia synchronizácie + + Hide Skryť - + + Unknown. Syncing Headers (%1)... + Neznámy. Synchronizujú sa hlavičky (%1)... + + OpenURIDialog @@ -620,7 +940,11 @@ Select payment request file Vyberte súbor s výzvou k platbe - + + Select payment request file to open + Vyberte ktorý súbor s výzvou na platbu otvoriť + + OptionsDialog @@ -933,7 +1257,91 @@ PaymentServer - + + Payment request error + Chyba pri vyžiadaní platby + + + URI handling + URI manipulácia + + + Payment request fetch URL is invalid: %1 + URL pre stiahnutie výzvy na zaplatenie je neplatné: %1 + + + Invalid payment address %1 + Neplatná adresa platby %1 + + + URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. + URI sa nedá analyzovať! To môže byť spôsobené neplatnou Bitcoin adresou alebo zle nastavenými vlastnosťami URI. + + + Payment request file handling + Obsluha súboru s požiadavkou na platbu + + + Payment request file cannot be read! This can be caused by an invalid payment request file. + Súbor s výzvou na zaplatenie sa nedá čítať! To môže byť spôsobené aj neplatným súborom s výzvou. + + + Payment request rejected + Požiadavka na platbu zamietnutá + + + Payment request network doesn't match client network. + Sieť požiadavky na platbu nie je zhodná so sieťou klienta. + + + Payment request expired. + Vypršala platnosť požiadavky na platbu. + + + Payment request is not initialized. + Požiadavka na platbu nie je inicializovaná + + + Unverified payment requests to custom payment scripts are unsupported. + Program nepodporuje neoverené platobné požiadavky na vlastné skripty. + + + Invalid payment request. + Chybná požiadavka na platbu. + + + Requested payment amount of %1 is too small (considered dust). + Požadovaná suma platby %1 je príliš nízka (považovaná za prach). + + + Refund from %1 + Vrátenie z %1 + + + Payment request %1 is too large (%2 bytes, allowed %3 bytes). + Požiadavka na platbu %1 je príliš veľká (%2 bajtov, povolené je %3 bajtov). + + + Error communicating with %1: %2 + Chyba komunikácie s %1: %2 + + + Payment request cannot be parsed! + Požiadavka na platbu nemôže byť analyzovaná! + + + Bad response from server %1 + Zlá odpoveď zo servera %1 + + + Network request error + Chyba požiadavky siete + + + Payment acknowledged + Platba potvrdená + + PeerTableModel @@ -944,7 +1352,15 @@ Node/Service Uzol/Služba - + + NodeId + ID uzlu + + + Ping + Odozva + + QObject @@ -983,17 +1399,65 @@ %1 ms %1 ms + + %n second(s) + %n sekunda%n sekundy%n sekúnd + + + %n minute(s) + %n minúta%n minúty%n minút + + + %n hour(s) + %n hodina%n hodiny%n hodín + + + %n day(s) + %n deň%n dni%n dní + + + %n week(s) + %n týždeň%n týždne%n týždňov + %1 and %2 %1 a %2 - + + %n year(s) + %n rok%n roky%n rokov + + + %1 didn't yet exit safely... + %1 ešte nebol bezpečne ukončený... + + QObject::QObject - + + Error: %1 + Chyba: %1 + + QRImageWidget - + + &Save Image... + Uložiť obrázok... + + + &Copy Image + Kopírovať obrázok + + + Save QR Code + Uložiť QR Code + + + PNG Image (*.png) + PNG obrázok (*.png) + + RPCConsole @@ -1018,11 +1482,11 @@ Using BerkeleyDB version - Používa BerkeleyDB verziu + Používa verziu BerkeleyDB Datadir - Zložka s dátami + Priečinok s dátami Startup time @@ -1054,7 +1518,7 @@ Current number of transactions - Aktuálny počet tranzakcií + Aktuálny počet transakcií Memory usage @@ -1094,7 +1558,7 @@ Starting Block - Počiatočný Blok + Počiatočný blok Synced Headers @@ -1147,11 +1611,15 @@ The duration of a currently outstanding ping. - Trvanie aktuálneho pingu + Trvanie aktuálnej požiadavky na odozvu. Ping Wait - Čakanie na ping + Čakanie na odozvu + + + Min Ping + Minimálna odozva Time Offset @@ -1214,6 +1682,18 @@ 1 &rok + &Disconnect + &Odpojiť + + + Ban for + Zakázať na + + + &Unban + &Zrušiť zákaz + + Welcome to the %1 RPC console. Vitajte v %1 RPC konzole @@ -1226,7 +1706,15 @@ Napíš <b>help</b> pre prehľad dostupných príkazov. - %1 B + WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramification of a command. + VAROVANIE: Podvodníci sú aktívni a môžu nabádať používateľov napísať sem príkazy, pomocou ktorých ukradnú ich obsah peňaženky. Nepoužívajte túto konzolu ak nerozumiete presne účinkom príkazov. + + + Network activity disabled + Sieťová aktivita zakázaná + + + %1 B %1 B @@ -1344,7 +1832,23 @@ Remove Odstrániť - + + Copy URI + Kopírovať URI + + + Copy label + Kopírovať popis + + + Copy message + Kopírovať správu + + + Copy amount + Kopírovať sumu + + ReceiveRequestDialog @@ -1363,14 +1867,74 @@ &Save Image... Uložiť obrázok... - + + Request payment to %1 + Vyžiadať platbu pre %1 + + + Payment information + Informácia o platbe + + + URI + URI + + + Address + Adresa + + + Amount + Suma + + + Label + Popis + + + Message + Správa + + + Resulting URI too long, try to reduce the text for label / message. + Výsledné URI je príliš dlhé, skúste skrátiť text pre popis alebo správu. + + + Error encoding URI into QR Code. + Chyba kódovania URI do QR Code. + + RecentRequestsTableModel + Date + Dátum + + + Label + Popis + + + Message + Správa + + (no label) (bez popisu) - + + (no message) + (žiadna správa) + + + (no amount requested) + (nepožadovaná žiadna suma) + + + Requested + Požadované + + SendCoinsDialog @@ -1471,7 +2035,7 @@ (Smart fee not initialized yet. This usually takes a few blocks...) - (Automatický poplatok ešte nebol aktivovaný. Toto zvyčajne trvá niekoľko blokov...) + (Automatický poplatok ešte nebol vypočítaný. Toto zvyčajne trvá niekoľko blokov...) normal @@ -1498,6 +2062,10 @@ Prach: + Confirmation time target: + Cieľový čas potvrdenia: + + Clear &All &Zmazať všetko @@ -1514,10 +2082,122 @@ &Odoslať + Copy quantity + Kopírovať množstvo + + + Copy amount + Kopírovať sumu + + + Copy fee + Kopírovať poplatok + + + Copy after fee + Kopírovať po poplatkoch + + + Copy bytes + Kopírovať bajty + + + Copy dust + Kopírovať prach + + + Copy change + Kopírovať zmenu + + + %1 to %2 + %1 do %2 + + + Are you sure you want to send? + Určite chcete odoslať transakciu? + + + added as transaction fee + pridané ako poplatok za transakciu + + + Total Amount %1 + Celková suma %1 + + or alebo + Confirm send coins + Potvrďte odoslanie mincí + + + The recipient address is not valid. Please recheck. + Adresa príjemcu je neplatná. Prosím, overte ju. + + + The amount to pay must be larger than 0. + Suma na úhradu musí byť väčšia ako 0. + + + The amount exceeds your balance. + Suma je vyššia ako Váš zostatok. + + + The total exceeds your balance when the %1 transaction fee is included. + Celková suma prevyšuje Váš zostatok ak sú započítané aj transakčné poplatky %1. + + + Duplicate address found: addresses should only be used once each. + Našla sa duplicitná adresa: každá adresa by sa mala použiť len raz. + + + Transaction creation failed! + Vytvorenie transakcie zlyhalo! + + + The transaction was rejected with the following reason: %1 + Transakcia bola odmietnutá z nasledujúceho dôvodu: %1 + + + A fee higher than %1 is considered an absurdly high fee. + Poplatok vyšší ako %1 sa považuje za neprimerane vysoký. + + + Payment request expired. + Vypršala platnosť požiadavky na platbu. + + + %n block(s) + %n blok%n bloky%n blokov + + + Pay only the required fee of %1 + Zaplatiť iba požadovaný poplatok %1 + + + Estimated to begin confirmation within %n block(s). + Odhadovaný začiatok potvrdzovania po %n bloku.Odhadovaný začiatok potvrdzovania po %n blokoch.Odhadovaný začiatok potvrdzovania po %n blokoch. + + + Warning: Invalid Bitcoin address + Varovanie: Neplatná Bitcoin adresa + + + Warning: Unknown change address + UPOZORNENIE: Neznáma zmena adresy + + + Confirm custom change address + Potvrďte zmenu adresy + + + The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure? + Zadaná adresa nie je súčasťou tejto peňaženky. Časť alebo všetky peniaze z peňaženky môžu byť odoslané na túto adresu. Ste si istý? + + (no label) (bez popisu) @@ -1554,7 +2234,7 @@ Paste address from clipboard - Vložte adresu z klipbordu + Vložiť adresu zo schránky Alt+P @@ -1600,10 +2280,18 @@ Memo: Poznámka: - + + Enter a label for this address to add it to your address book + Zadajte popis pre túto adresu pre pridanie do adresára + + SendConfirmationDialog - + + Yes + áno + + ShutdownWindow @@ -1626,6 +2314,10 @@ &Podpísať Správu + You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + Môžete podpísať správy svojou adresou a dokázať, že viete prijímať mince zaslané na túto adresu. Buďte však opatrní a podpíšte len podrobné prehlásenia, s ktorými plne súhlasíte, nakoľko útoky typu "phishing" Vás môžu lákať k podpísaniu nejasných alebo príliš všeobecných tvrdení čím prevezmú vašu identitu. + + The Bitcoin address to sign the message with Bitcoin adresa pre podpísanie správy s @@ -1639,7 +2331,7 @@ Paste address from clipboard - Vložte adresu z klipbordu + Vložiť adresu zo schránky Alt+P @@ -1655,7 +2347,7 @@ Copy the current signature to the system clipboard - Kopírovať práve zvolenú adresu do systémového klipbordu + Kopírovať tento podpis do systémovej schránky Sign the message to prove you own this Bitcoin address @@ -1678,6 +2370,10 @@ O&veriť správu... + Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction! + Vložte adresu príjemcu, správu (uistite sa, že presne kopírujete ukončenia riadkov, medzery, odrážky, atď.) a podpis pre potvrdenie správy. Buďte opatrní a nedomýšľajte si viac než je uvedené v samotnej podpísanej správe a môžete sa tak vyhnúť podvodu MITM útokom. Toto len potvrdzuje, že podpisujúca strana môže prijímať na tejto adrese, nepotvrdzuje to vlastníctvo žiadnej transakcie! + + The Bitcoin address the message was signed with Adresa Bitcoin, ktorou bola podpísaná správa @@ -1693,7 +2389,59 @@ Reset all verify message fields Obnoviť všetky polia v overiť správu - + + Click "Sign Message" to generate signature + Kliknite "Podpísať správu" pre vytvorenie podpisu + + + The entered address is invalid. + Zadaná adresa je neplatná. + + + Please check the address and try again. + Prosím skontrolujte adresu a skúste znova. + + + The entered address does not refer to a key. + Vložená adresa nezodpovedá žiadnemu kľúču. + + + Wallet unlock was cancelled. + Odomknutie peňaženky bolo zrušené. + + + Private key for the entered address is not available. + Súkromný kľúč pre zadanú adresu nieje k dispozícii. + + + Message signing failed. + Podpísanie správy zlyhalo. + + + Message signed. + Správa podpísaná. + + + The signature could not be decoded. + Podpis nie je možné dekódovať. + + + Please check the signature and try again. + Prosím skontrolujte podpis a skúste znova. + + + The signature did not match the message digest. + Podpis sa nezhoduje so zhrnutím správy. + + + Message verification failed. + Overenie správy zlyhalo. + + + Message verified. + Správa overená. + + SplashScreen @@ -1710,24 +2458,416 @@ TransactionDesc - + + Open until %1 + Otvorené do %1 + + + conflicted with a transaction with %1 confirmations + koliduje s transakciou s %1 potvrdeniami + + + %1/offline + %1/offline + + + 0/unconfirmed, %1 + 0/nepotvrdené, %1 + + + %1/unconfirmed + %1/nepotvrdené + + + %1 confirmations + %1 potvrdení + + + Status + Stav + + + , has not been successfully broadcast yet + , ešte nebola úspešne odoslaná + + + Date + Dátum + + + Source + Zdroj + + + Generated + Vygenerované + + + From + Od + + + unknown + neznámy + + + To + do + + + own address + vlastná adresa + + + watch-only + Iba sledovanie + + + label + popis + + + Credit + Kredit + + + not accepted + neprijaté + + + Debit + Debet + + + Total debit + Celkový debet + + + Total credit + Celkový kredit + + + Transaction fee + Transakčný poplatok + + + Net amount + Suma netto + + + Message + Správa + + + Comment + Komentár + + + Transaction ID + ID transakcie + + + Transaction total size + Celková veľkosť transakcie + + + Merchant + Kupec + + + Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. + Vytvorené coins musia dospieť %1 blokov kým môžu byť minuté. Keď vytvoríte tento blok, bude rozoslaný do siete aby bol akceptovaný do reťaze blokov. Ak sa nedostane reťaze, jeho stav sa zmení na "zamietnutý" a nebude sa dať minúť. Toto sa môže občas stať ak iná nóda vytvorí blok približne v tom istom čase. + + + Debug information + Ladiace informácie + + + Transaction + Transakcie + + + Inputs + Vstupy + + + Amount + Suma + + + true + pravda + + + false + nepravda + + TransactionDescDialog This pane shows a detailed description of the transaction Táto časť obrazovky zobrazuje detailný popis transakcie - + + Details for %1 + Podrobnosti pre %1 + + TransactionTableModel + Date + Dátum + + + Type + Typ + + + Label + Popis + + + Open until %1 + Otvorené do %1 + + + Offline + Offline + + + Unconfirmed + Nepotvrdené + + + Confirming (%1 of %2 recommended confirmations) + Potvrdzujem (%1 z %2 odporúčaných potvrdení) + + + Confirmed (%1 confirmations) + Potvrdené (%1 potvrdení) + + + Conflicted + V rozpore + + + Immature (%1 confirmations, will be available after %2) + Nezrelé (%1 potvrdení, bude dostupné po %2) + + + This block was not received by any other nodes and will probably not be accepted! + Ten blok nebol prijatý žiadnym iným uzlom a pravdepodobne nebude akceptovaný! + + + Generated but not accepted + Vypočítané ale neakceptované + + + Received with + Prijaté s + + + Received from + Prijaté od + + + Sent to + Odoslané na + + + Payment to yourself + Platba sebe samému + + + Mined + Vyťažené + + + watch-only + Iba sledovanie + + + (n/a) + (n/a) + + (no label) (bez popisu) - + + Transaction status. Hover over this field to show number of confirmations. + Stav transakcie. Prejdite ponad toto pole pre zobrazenie počtu potvrdení. + + + Date and time that the transaction was received. + Dátum a čas prijatia transakcie. + + + Type of transaction. + Typ transakcie. + + + Whether or not a watch-only address is involved in this transaction. + Či je v tejto transakcii adresy iba na sledovanie. + + + Amount removed from or added to balance. + Suma pridaná alebo odobraná k zostatku. + + TransactionView - + + All + Všetky + + + Today + Dnes + + + This week + Tento týždeň + + + This month + Tento mesiac + + + Last month + Minulý mesiac + + + This year + Tento rok + + + Range... + Rozsah... + + + Received with + Prijaté s + + + Sent to + Odoslané na + + + To yourself + Ku mne + + + Mined + Vyťažené + + + Other + Iné + + + Enter address or label to search + Zadajte adresu alebo popis pre hľadanie + + + Min amount + Minimálna suma + + + Copy address + Kopírovať adresu + + + Copy label + Kopírovať popis + + + Copy amount + Kopírovať sumu + + + Copy transaction ID + Kopírovať ID transakcie + + + Copy raw transaction + Skopírovať neupravenú transakciu + + + Copy full transaction details + Kopírovať všetky podrobnosti o transakcii + + + Edit label + Upraviť popis + + + Show transaction details + Zobraziť podrobnosti transakcie + + + Export Transaction History + Exportovať históriu transakcií + + + Comma separated file (*.csv) + Čiarkou oddelovaný súbor (*.csv) + + + Confirmed + Potvrdené + + + Watch-only + Iba sledovanie + + + Date + Dátum + + + Type + Typ + + + Label + Popis + + + Address + Adresa + + + ID + ID + + + Exporting Failed + Export zlyhal + + + There was an error trying to save the transaction history to %1. + Vyskytla sa chyba pri pokuse o uloženie histórie transakcií do %1. + + + Exporting Successful + Export úspešný + + + The transaction history was successfully saved to %1. + História transakciá bola úspešne uložená do %1. + + + Range: + Rozsah: + + + to + do + + UnitDisplayStatusBarControl @@ -1737,13 +2877,53 @@ WalletFrame - + + No wallet has been loaded. + Nie je načítaná peňaženka. + + WalletModel - + + Send Coins + Poslať mince + + WalletView - + + &Export + &Exportovať... + + + Export the data in the current tab to a file + Exportovať dáta v aktuálnej karte do súboru + + + Backup Wallet + Zálohovanie peňaženky + + + Wallet Data (*.dat) + Dáta peňaženky (*.dat) + + + Backup Failed + Zálohovanie zlyhalo + + + There was an error trying to save the wallet data to %1. + Vyskytla sa chyba pri pokuse o uloženie dát peňaženky do %1. + + + Backup Successful + Záloha úspešná + + + The wallet data was successfully saved to %1. + Dáta peňaženky boli úspešne uložené do %1. + + bitcoin-core @@ -1780,7 +2960,7 @@ Fee (in %s/kB) to add to transactions you send (default: %s) - Poplatok (za %s/kB) pridaný do tranzakcie, ktorú posielate (predvolené: %s) + Poplatok (za %s/kB) pridaný do transakcie, ktorú posielate (predvolené: %s) Pruning blockstore... @@ -1796,13 +2976,17 @@ Bitcoin Core - Jadro Bitcoin + Bitcoin Core The %s developers Vývojári %s + Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d) + Akceptovať postúpené transakcie od povolených partnerov aj keď normálne nepostupujete transakcie (predvolené: %d) + + Bind to given address and always listen on it. Use [host]:port notation for IPv6 Spojiť s danou adresou a vždy na nej počúvať. Použite zápis [host]:port pre IPv6 @@ -1839,6 +3023,22 @@ Databáza blokov obsahuje blok, ktorý vyzerá byť z budúcnosti. Toto môže byť spôsobené nesprávnym systémovým časom vášho počítača. Obnovujte databázu blokov len keď ste si istý, že systémový čas je nastavený správne. + This is a pre-release test build - use at your own risk - do not use for mining or merchant applications + Toto je predbežná testovacia zostava - používate na vlastné riziko - nepoužívajte na ťaženie alebo obchodné aplikácie + + + Use UPnP to map the listening port (default: 1 when listening and no -proxy) + Skúsiť použiť UPnP pre mapovanie počúvajúceho portu (predvolené: 1 počas počúvania a bez -proxy) + + + Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues. + Varovanie: Javí sa že sieť sieť úplne nesúhlasí! Niektorí mineri zjavne majú ťažkosti. + + + Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade. + Varovanie: Zjavne sa úplne nezhodujeme s našimi peer-mi! Možno potrebujete prejsť na novšiu verziu alebo ostatné uzly potrebujú vyššiu verziu. + + %s corrupt, salvage failed %s je poškodený, záchrana zlyhala @@ -1888,7 +3088,7 @@ Enable publish hash transaction in <address> - Povoliť zverejnenie hash tranzakcií pre <address> + Povoliť zverejnenie hash transakcií pre <address> Enable publish raw block in <address> @@ -1964,7 +3164,7 @@ Location of the auth cookie (default: data dir) - Poloha overovacieho cookie súboru (predvolená: zložka s dátami) + Umiestnenie overovacieho cookie súboru (predvolená: Priečinok s dátami) Not enough file descriptors available. @@ -2087,6 +3287,10 @@ Vykonať príkaz po prijatí patričného varovania alebo uvidíme veľmi dlhé rozdvojenie siete (%s v cmd je nahradené správou) + Fees (in %s/kB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s) + Poplatky (v %s/kB) menšie ako toto, sú považované za nulový transakčný poplatok (predvolené: %s) + + If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u) Ak nie je nastavené paytxfee, pridať dostatočný poplatok aby sa transakcia začala potvrdzovať priemerne v rámci bloku (predvolené: %u) @@ -2104,7 +3308,7 @@ The transaction amount is too small to send after the fee has been deducted - Suma je príliš malá pre odoslanie tranzakcie + Suma je príliš malá pre odoslanie transakcie Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway @@ -2188,7 +3392,7 @@ The transaction amount is too small to pay the fee - Suma tranzakcie je príliš malá na zaplatenie poplatku + Suma transakcie je príliš malá na zaplatenie poplatku This is experimental software. @@ -2255,6 +3459,10 @@ (1 = zachovať metaúdaje tx napr. vlastníka účtu a informácie o platobných príkazoch, 2 = zahodiť metaúdaje tx) + Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s) + Poplatky (v %s/kB) menšie ako toto, sú považované za nulový transakčný poplatok (predvolené: %s) + + How thorough the block verification of -checkblocks is (0-4, default: %u) Ako dôkladné je -checkblocks overenie blokov (0-4, predvolené: %u) @@ -2271,6 +3479,10 @@ Výstupné ladiace informácie (predvolené: %u, dodanie <category> je voliteľné) + This is the transaction fee you may pay when fee estimates are not available. + Toto je poplatok za transakciu keď odhad poplatkov ešte nie je k dispozícii. + + Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments. Celková dĺžka verzie sieťového reťazca (%i) prekračuje maximálnu dĺžku (%i). Znížte počet a veľkosť komentárov. @@ -2299,6 +3511,14 @@ Varovanie: Peňaženka poškodená, dáta boli zachránené! Originálna %s ako %s v %s; ak váš zostatok alebo transakcie sú nesprávne, mali by ste obnoviť zálohu. + Whitelist peers connecting from the given IP address (e.g. 1.2.3.4) or CIDR notated network (e.g. 1.2.3.0/24). Can be specified multiple times. + Povoliť partnerov pripájajúcich sa z danej IP adresy (napr. 1.2.3.4) alebo zo siete vo formáte CIDR (napr. 1.2.3.0/24). Môže byť zadané viackrát. + + + %s is set very high! + Hodnota %s je nastavená veľmi vysoko! + + (default: %s) (predvolené: %s) @@ -2375,10 +3595,34 @@ Minúť nepotvrdené zmenu pri posielaní transakcií (predvolené: %u) + Starting network threads... + Spúšťajú sa sieťové vlákna... + + + The wallet will avoid paying less than the minimum relay fee. + Peňaženka zabráni zaplateniu menšej sumy ako je minimálny poplatok. + + + This is the minimum transaction fee you pay on every transaction. + Toto je minimálny poplatok za transakciu pri každej transakcii. + + + This is the transaction fee you will pay if you send a transaction. + Toto je poplatok za transakciu pri odoslaní transakcie. + + Threshold for disconnecting misbehaving peers (default: %u) Hranica pre odpájanie zle sa správajúcim partnerským uzlom (predvolené: %u) + Transaction amounts must not be negative + Sumy transakcií nesmú byť záporné + + + Transaction must have at least one recipient + Transakcia musí mať aspoň jedného príjemcu + + Unknown network specified in -onlynet: '%s' Neznáma sieť upresnená v -onlynet: '%s' diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts index 2986115a620..edd808c9b58 100644 --- a/src/qt/locale/bitcoin_sv.ts +++ b/src/qt/locale/bitcoin_sv.ts @@ -540,7 +540,11 @@ Var vänlig och försök igen. Wallet is <b>encrypted</b> and currently <b>locked</b> Denna plånbok är <b>krypterad</b> och för närvarande <b>låst</b> - + + A fatal error occurred. Bitcoin can no longer continue safely and will quit. + Ett kritiskt fel uppstod. Bitcoin kan inte fortsätta att köra säkert och kommer att avslutas. + + CoinControlDialog @@ -679,7 +683,7 @@ Var vänlig och försök igen. Directory already exists. Add %1 if you intend to create a new directory here. - Katalogen finns redan. Läggtill %1 om du vill skapa en ny katalog här. + Katalogen finns redan. Lägg till %1 om du vill skapa en ny katalog här. Path already exists, and is not a directory. @@ -2100,6 +2104,18 @@ Var vänlig och försök igen. TransactionView + Enter address or label to search + Ange en adress eller etikett att söka efter + + + Min amount + Minsta belopp + + + Abandon transaction + Avbryt transaktionen + + Copy address Kopiera adress diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts index 2de0d14ddd2..321effc7e13 100644 --- a/src/qt/locale/bitcoin_tr.ts +++ b/src/qt/locale/bitcoin_tr.ts @@ -295,15 +295,15 @@ &Encrypt Wallet... - Cüzdanı &Şifrele... + &Cüzdanı Şifrele... &Backup Wallet... - Cüzdanı &Yedekle... + &Cüzdanı Yedekle... &Change Passphrase... - Parolayı &Değiştir... + &Parolayı Değiştir... &Sending addresses... diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts index 2c017fc52e2..7126b2e5c15 100644 --- a/src/qt/locale/bitcoin_uk.ts +++ b/src/qt/locale/bitcoin_uk.ts @@ -41,10 +41,62 @@ &Delete &Видалити - + + Choose the address to send coins to + Оберіть адресу для відправки монет + + + Choose the address to receive coins with + Оберіть адресу для отримання монет + + + C&hoose + О&брати + + + Sending addresses + Адреса відправлення + + + Receiving addresses + Адреса отримання + + + Copy &Label + Зкопіювати&Створити мітку + + + &Edit + &Редагувати + + + Export Address List + Експотувати список адрес + + + Comma separated file (*.csv) + Файли (*.csv) розділеі комами + + + Exporting Failed + Експортування пройшло не успішно + + + There was an error trying to save the address list to %1. Please try again. + Виникла помилка при спрбі збереження списку адрес %1. Будь-ласка, спробувати пізніше. + + AddressTableModel - + + Label + Мітка + + + (no label) + (немає мітки) + + AskPassphraseDialog @@ -410,6 +462,10 @@ Confirmed Підтверджені + + (no label) + немає мітки + EditAddressDialog @@ -1270,9 +1326,21 @@ &Save Image... &Зберегти зображення... + + Label + Мітка + RecentRequestsTableModel + + Label + Мітка + + + (no label) + немає мітки + SendCoinsDialog @@ -1416,7 +1484,11 @@ S&end &Відправити - + + (no label) + немає мітки + + SendCoinsEntry @@ -1619,9 +1691,29 @@ TransactionTableModel + + Label + Мітка + + + (no label) + немає мітки + TransactionView + + Comma separated file (*.csv) + Файли (*.csv) розділеі комами + + + Label + Мітка + + + Exporting Failed + Експортування пройшло не успішно + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_ur_PK.ts b/src/qt/locale/bitcoin_ur_PK.ts index 923198c91a3..bd0ef617ae7 100644 --- a/src/qt/locale/bitcoin_ur_PK.ts +++ b/src/qt/locale/bitcoin_ur_PK.ts @@ -41,9 +41,25 @@ &Delete مٹا + + Choose the address to send coins to + کوئین وصول کرنے والے کا پتہ + + + Choose the address to receive coins with + کوئین وصول کرنے والے کا پتہ + + + C&hoose + چننا + AddressTableModel + + Address + پتہ + AskPassphraseDialog @@ -152,6 +168,10 @@ Copy &Address کاپی پتہ + + Address + پتہ + RecentRequestsTableModel @@ -200,6 +220,10 @@ TransactionView + + Address + پتہ + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_vi_VN.ts b/src/qt/locale/bitcoin_vi_VN.ts index c27111a52a2..8c4bececa14 100644 --- a/src/qt/locale/bitcoin_vi_VN.ts +++ b/src/qt/locale/bitcoin_vi_VN.ts @@ -41,6 +41,26 @@ &Delete &Xó&a + + Choose the address to send coins to + Chọn địa chỉ để gửi coin đến + + + Choose the address to receive coins with + Chọn địa chỉ để nhận coin + + + C&hoose + Chọn + + + Sending addresses + Địa chỉ gửi đến + + + Receiving addresses + Địa chỉ nhận + AddressTableModel diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts index 20875c23272..30e59d92604 100644 --- a/src/qt/locale/bitcoin_zh_CN.ts +++ b/src/qt/locale/bitcoin_zh_CN.ts @@ -3241,6 +3241,10 @@ 钱包 %s 在外部的数据目录 %s + Wallet debugging/testing options: + 钱包调试/测试选项: + + Wallet options: 钱包选项: diff --git a/src/qt/locale/bitcoin_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts index 2f3a8d1f161..2049715b856 100644 --- a/src/qt/locale/bitcoin_zh_HK.ts +++ b/src/qt/locale/bitcoin_zh_HK.ts @@ -41,10 +41,70 @@ &Delete 刪除 &D - + + Choose the address to send coins to + 選擇要付錢過去的地址 + + + Choose the address to receive coins with + 選擇要收錢的地址 + + + C&hoose + 選擇 &h + + + Sending addresses + 付款地址 + + + Receiving addresses + 收款地址 + + + &Copy Address + 複製地址 &C + + + Copy &Label + 複製標記 &L + + + &Edit + 編輯 &E + + + Export Address List + 匯出地址清單 + + + Comma separated file (*.csv) + 逗號分隔檔 (*.csv) + + + Exporting Failed + 匯出失敗 + + + There was an error trying to save the address list to %1. Please try again. + 儲存地址列表到 %1 時發生錯誤。請再試一次。 + + AddressTableModel - + + Label + 標記 + + + Address + 地址 + + + (no label) + (無標記) + + AskPassphraseDialog @@ -63,7 +123,91 @@ Repeat new passphrase 重複新密碼 - + + Encrypt wallet + 加密錢包 + + + This operation needs your wallet passphrase to unlock the wallet. + 這個動作需要你的錢包密碼來將錢包解鎖。 + + + Unlock wallet + 解鎖錢包 + + + This operation needs your wallet passphrase to decrypt the wallet. + 這個動作需要你的錢包密碼來將錢包解密。 + + + Decrypt wallet + 解密錢包 + + + Change passphrase + 更改密碼 + + + Enter the old passphrase and new passphrase to the wallet. + 輸入舊密碼和新密碼至錢包。 + + + Confirm wallet encryption + 確認錢包加密 + + + Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! + 警告: 如果你將錢包加密後又忘記密碼,你就會<b>失去所有 Bitcoin 了</b>! + + + Are you sure you wish to encrypt your wallet? + 你確定要把錢包加密嗎? + + + Wallet encrypted + 錢包已加密 + + + %1 will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer. + %1 現在要關閉來完成加密程序。請記得將錢包加密不能完全防止你的 Bitcoins 經被入侵電腦的惡意程式偷取。 + + + IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet. + 重要: 請改用新產生的加密錢包檔,來取代所以舊錢包檔的備份。為安全計,當你開始使用新的加密錢包檔後,舊錢包檔的備份就不能再使用了。 + + + Wallet encryption failed + 錢包加密失敗 + + + Wallet encryption failed due to an internal error. Your wallet was not encrypted. + 因內部錯誤導致錢包加密失敗,你的錢包尚未加密。 + + + The supplied passphrases do not match. + 提供的密碼不一致。 + + + Wallet unlock failed + 錢包解鎖失敗 + + + The passphrase entered for the wallet decryption was incorrect. + 用來解密錢包的密碼不對。 + + + Wallet decryption failed + 錢包解密失敗 + + + Wallet passphrase was successfully changed. + 錢包密碼已成功更改。 + + + Warning: The Caps Lock key is on! + 警告: Caps Lock 已啟用! + + BanTableModel @@ -114,6 +258,14 @@ 結束應用程式 + &About %1 + 關於 %1 &A + + + Show information about %1 + 顯示 %1 的相關資訊 + + About &Qt 關於 Qt &Q @@ -126,6 +278,10 @@ 選項... &O + Modify configuration options for %1 + 修正 %1 的設定選項 + + &Encrypt Wallet... 加密錢包... &E @@ -201,9 +357,51 @@ Show or hide the main Window 顯示或隱藏主視窗 + + &File + 檔案 &F + + + &Settings + 設定 &S + + + &Help + 說明 &H + + + Request payments (generates QR codes and bitcoin: URIs) + 要求付款 (產生QR碼 bitcoin: URIs) + + + Indexing blocks on disk... + 正在為磁碟區塊建立索引... + + + Error + 錯誤 + + + Warning + 警告 + + + Information + 資訊 + + + Date: %1 + + 日期: %1 + + CoinControlDialog + + (no label) + (無標記) + EditAddressDialog @@ -216,6 +414,10 @@ Intro + + Error + 錯誤 + ModalOverlay @@ -237,28 +439,144 @@ QObject + + Enter a Bitcoin address (e.g. %1) + 輸入一個 Bitcoin 位址 (例如 %1) + + + %1 d + %1 日 + + + %1 h + %1 小時 + + + %1 m + %1 分 + + + %1 s + %1 秒 + + + None + 沒有 + + + N/A + N/A + + + %1 ms + %1 亳秒 + + + %n second(s) + %n 秒 + + + %n minute(s) + %n 分鐘 + + + %n hour(s) + %n 小時 + + + %n day(s) + %n 日 + + + %n week(s) + %n 星期 + + + %1 and %2 + %1 和 %2 + + + %n year(s) + %n 年 + QObject::QObject QRImageWidget - + + Save QR Code + 儲存 QR 碼 + + + PNG Image (*.png) + PNG 影像(*.png) + + RPCConsole + + N/A + N/A + + + &Information + 資訊 &I + + + Debug window + 除錯視窗 + + + General + 一般 + + + Received + 已接收 + + + Sent + 已送出 + + + Version + 版本 + ReceiveCoinsDialog ReceiveRequestDialog + + Address + 地址 + + + Label + 標記 + RecentRequestsTableModel + + Label + 標記 + + + (no label) + (無標記) + SendCoinsDialog - + + (no label) + (無標記) + + SendCoinsEntry @@ -279,15 +597,47 @@ TransactionDesc + + Open until %1 + 開放至 %1 + TransactionDescDialog TransactionTableModel + + Label + 標記 + + + Open until %1 + 開放至 %1 + + + (no label) + (無標記) + TransactionView + + Comma separated file (*.csv) + 逗號分隔檔 (*.csv) + + + Label + 標記 + + + Address + 地址 + + + Exporting Failed + 匯出失敗 + UnitDisplayStatusBarControl @@ -303,5 +653,17 @@ bitcoin-core - + + Information + 資訊 + + + Warning + 警告 + + + Error + 錯誤 + + \ No newline at end of file diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp index 688e8123af8..dd75f12076d 100644 --- a/src/qt/paymentserver.cpp +++ b/src/qt/paymentserver.cpp @@ -55,8 +55,6 @@ const char* BIP70_MESSAGE_PAYMENTREQUEST = "PaymentRequest"; const char* BIP71_MIMETYPE_PAYMENT = "application/bitcoin-payment"; const char* BIP71_MIMETYPE_PAYMENTACK = "application/bitcoin-paymentack"; const char* BIP71_MIMETYPE_PAYMENTREQUEST = "application/bitcoin-paymentrequest"; -// BIP70 max payment request size in bytes (DoS protection) -const qint64 BIP70_MAX_PAYMENTREQUEST_SIZE = 50000; struct X509StoreDeleter { void operator()(X509_STORE* b) { diff --git a/src/qt/paymentserver.h b/src/qt/paymentserver.h index 9d46280a37b..7c6d4507fe6 100644 --- a/src/qt/paymentserver.h +++ b/src/qt/paymentserver.h @@ -53,7 +53,7 @@ class QUrl; QT_END_NAMESPACE // BIP70 max payment request size in bytes (DoS protection) -extern const qint64 BIP70_MAX_PAYMENTREQUEST_SIZE; +static const qint64 BIP70_MAX_PAYMENTREQUEST_SIZE = 50000; class PaymentServer : public QObject { diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp index 974a71ddca6..fff072fd4c8 100644 --- a/src/qt/peertablemodel.cpp +++ b/src/qt/peertablemodel.cpp @@ -166,7 +166,7 @@ QVariant PeerTableModel::data(const QModelIndex &index, int role) const switch(index.column()) { case NetNodeId: - return rec->nodeStats.nodeid; + return (qint64)rec->nodeStats.nodeid; case Address: return QString::fromStdString(rec->nodeStats.addrName); case Subversion: diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index 60406c20597..77e5e03e643 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -175,6 +175,10 @@ bool RPCConsole::RPCParseCommandLine(std::string &strResult, const std::string & nDepthInsideSensitive = 1; filter_begin_pos = chpos; } + // Make sure stack is not empty before adding something + if (stack.empty()) { + stack.push_back(std::vector()); + } stack.back().push_back(strArg); }; @@ -1111,7 +1115,7 @@ void RPCConsole::disconnectSelectedNode() for(int i = 0; i < nodes.count(); i++) { // Get currently selected peer address - NodeId id = nodes.at(i).data().toInt(); + NodeId id = nodes.at(i).data().toLongLong(); // Find the node, disconnect it and clear the selected node if(g_connman->DisconnectNode(id)) clearSelectedNode(); @@ -1128,7 +1132,7 @@ void RPCConsole::banSelectedNode(int bantime) for(int i = 0; i < nodes.count(); i++) { // Get currently selected peer address - NodeId id = nodes.at(i).data().toInt(); + NodeId id = nodes.at(i).data().toLongLong(); // Get currently selected peer address int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(id); diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index 1c0ed663c1f..65ca0075520 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -23,6 +23,7 @@ #include "txmempool.h" #include "wallet/wallet.h" +#include #include #include #include @@ -656,6 +657,11 @@ void SendCoinsDialog::updateSmartFeeLabel() std::max(CWallet::fallbackFee.GetFeePerK(), CWallet::GetRequiredFee(1000))) + "/kB"); ui->labelSmartFee2->show(); // (Smart fee not initialized yet. This usually takes a few blocks...) ui->labelFeeEstimation->setText(""); + ui->fallbackFeeWarningLabel->setVisible(true); + int lightness = ui->fallbackFeeWarningLabel->palette().color(QPalette::WindowText).lightness(); + QColor warning_colour(255 - (lightness / 5), 176 - (lightness / 3), 48 - (lightness / 14)); + ui->fallbackFeeWarningLabel->setStyleSheet("QLabel { color: " + warning_colour.name() + "; }"); + ui->fallbackFeeWarningLabel->setIndent(QFontMetrics(ui->fallbackFeeWarningLabel->font()).width("x")); } else { @@ -663,6 +669,7 @@ void SendCoinsDialog::updateSmartFeeLabel() std::max(feeRate.GetFeePerK(), CWallet::GetRequiredFee(1000))) + "/kB"); ui->labelSmartFee2->hide(); ui->labelFeeEstimation->setText(tr("Estimated to begin confirmation within %n block(s).", "", estimateFoundAtBlocks)); + ui->fallbackFeeWarningLabel->setVisible(false); } updateFeeMinimizedLabel(); diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 7b69c81ff9c..fd8f52a5cb0 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -417,6 +417,7 @@ UniValue getrawmempool(const JSONRPCRequest& request) throw runtime_error( "getrawmempool ( verbose )\n" "\nReturns all transaction ids in memory pool as a json array of string transaction ids.\n" + "\nHint: use getmempoolentry to fetch a specific transaction from the mempool.\n" "\nArguments:\n" "1. verbose (boolean, optional, default=false) True for a json object, false for array of transaction ids\n" "\nResult: (for verbose = false):\n" @@ -744,10 +745,15 @@ UniValue getblock(const JSONRPCRequest& request) CBlockIndex* pblockindex = mapBlockIndex[hash]; if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0) - throw JSONRPCError(RPC_INTERNAL_ERROR, "Block not available (pruned data)"); + throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)"); - if(!ReadBlockFromDisk(block, pblockindex, Params().GetConsensus())) - throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk"); + if (!ReadBlockFromDisk(block, pblockindex, Params().GetConsensus())) + // Block not found on disk. This could be because we have the block + // header in our index but don't have the block (for example if a + // non-whitelisted node sends us an unrequested long chain of valid + // blocks, we add the headers to our index, but don't accept the + // block). + throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk"); if (!fVerbose) { @@ -829,7 +835,7 @@ UniValue pruneblockchain(const JSONRPCRequest& request) + HelpExampleRpc("pruneblockchain", "1000")); if (!fPruneMode) - throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Cannot prune blocks because node is not in prune mode."); + throw JSONRPCError(RPC_MISC_ERROR, "Cannot prune blocks because node is not in prune mode."); LOCK(cs_main); @@ -843,7 +849,7 @@ UniValue pruneblockchain(const JSONRPCRequest& request) // Add a 2 hour buffer to include blocks which might have had old timestamps CBlockIndex* pindex = chainActive.FindEarliestAtLeast(heightParam - 7200); if (!pindex) { - throw JSONRPCError(RPC_INTERNAL_ERROR, "Could not find block with at least the specified timestamp."); + throw JSONRPCError(RPC_INVALID_PARAMETER, "Could not find block with at least the specified timestamp."); } heightParam = pindex->nHeight; } @@ -851,7 +857,7 @@ UniValue pruneblockchain(const JSONRPCRequest& request) unsigned int height = (unsigned int) heightParam; unsigned int chainHeight = (unsigned int) chainActive.Height(); if (chainHeight < Params().PruneAfterHeight()) - throw JSONRPCError(RPC_INTERNAL_ERROR, "Blockchain is too short for pruning."); + throw JSONRPCError(RPC_MISC_ERROR, "Blockchain is too short for pruning."); else if (height > chainHeight) throw JSONRPCError(RPC_INVALID_PARAMETER, "Blockchain is shorter than the attempted prune height."); else if (height > chainHeight - MIN_BLOCKS_TO_KEEP) { diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index 5bdd84e5551..56d14959192 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -83,7 +83,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { "getblockheader", 1, "verbose" }, { "gettransaction", 1, "include_watchonly" }, { "getrawtransaction", 1, "verbose" }, - { "createrawtransaction", 0, "transactions" }, + { "createrawtransaction", 0, "inputs" }, { "createrawtransaction", 1, "outputs" }, { "createrawtransaction", 2, "locktime" }, { "signrawtransaction", 1, "prevtxs" }, diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index c594daca0d0..33e234a95ef 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -519,12 +519,22 @@ UniValue getblocktemplate(const JSONRPCRequest& request) // TODO: Maybe recheck connections/IBD and (if something wrong) send an expires-immediately template to stop miners? } + const struct BIP9DeploymentInfo& segwit_info = VersionBitsDeploymentInfo[Consensus::DEPLOYMENT_SEGWIT]; + // If the caller is indicating segwit support, then allow CreateNewBlock() + // to select witness transactions, after segwit activates (otherwise + // don't). + bool fSupportsSegwit = setClientRules.find(segwit_info.name) != setClientRules.end(); + // Update block static CBlockIndex* pindexPrev; static int64_t nStart; static std::unique_ptr pblocktemplate; + // Cache whether the last invocation was with segwit support, to avoid returning + // a segwit-block to a non-segwit caller. + static bool fLastTemplateSupportsSegwit = true; if (pindexPrev != chainActive.Tip() || - (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 5)) + (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 5) || + fLastTemplateSupportsSegwit != fSupportsSegwit) { // Clear pindexPrev so future calls make a new block, despite any failures from here on pindexPrev = nullptr; @@ -533,10 +543,11 @@ UniValue getblocktemplate(const JSONRPCRequest& request) nTransactionsUpdatedLast = mempool.GetTransactionsUpdated(); CBlockIndex* pindexPrevNew = chainActive.Tip(); nStart = GetTime(); + fLastTemplateSupportsSegwit = fSupportsSegwit; // Create new block CScript scriptDummy = CScript() << OP_TRUE; - pblocktemplate = BlockAssembler(Params()).CreateNewBlock(scriptDummy); + pblocktemplate = BlockAssembler(Params()).CreateNewBlock(scriptDummy, fSupportsSegwit); if (!pblocktemplate) throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory"); @@ -676,14 +687,17 @@ UniValue getblocktemplate(const JSONRPCRequest& request) nSigOpLimit /= WITNESS_SCALE_FACTOR; } result.push_back(Pair("sigoplimit", nSigOpLimit)); - result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SERIALIZED_SIZE)); - result.push_back(Pair("weightlimit", (int64_t)MAX_BLOCK_WEIGHT)); + if (fPreSegWit) { + result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_BASE_SIZE)); + } else { + result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SERIALIZED_SIZE)); + result.push_back(Pair("weightlimit", (int64_t)MAX_BLOCK_WEIGHT)); + } result.push_back(Pair("curtime", pblock->GetBlockTime())); result.push_back(Pair("bits", strprintf("%08x", pblock->nBits))); result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1))); - const struct BIP9DeploymentInfo& segwit_info = VersionBitsDeploymentInfo[Consensus::DEPLOYMENT_SEGWIT]; - if (!pblocktemplate->vchCoinbaseCommitment.empty() && setClientRules.find(segwit_info.name) != setClientRules.end()) { + if (!pblocktemplate->vchCoinbaseCommitment.empty() && fSupportsSegwit) { result.push_back(Pair("default_witness_commitment", HexStr(pblocktemplate->vchCoinbaseCommitment.begin(), pblocktemplate->vchCoinbaseCommitment.end()))); } @@ -734,6 +748,10 @@ UniValue submitblock(const JSONRPCRequest& request) if (!DecodeHexBlk(block, request.params[0].get_str())) throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed"); + if (block.vtx.empty() || !block.vtx[0]->IsCoinBase()) { + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block does not start with a coinbase"); + } + uint256 hash = block.GetHash(); bool fBlockPresent = false; { diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index 6fd50127bd5..0bcc2a97cc3 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -347,11 +347,11 @@ UniValue verifymessage(const JSONRPCRequest& request) "\nUnlock the wallet for 30 seconds\n" + HelpExampleCli("walletpassphrase", "\"mypassphrase\" 30") + "\nCreate the signature\n" - + HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"my message\"") + + + HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"my message\"") + "\nVerify the signature\n" - + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"signature\" \"my message\"") + + + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"signature\" \"my message\"") + "\nAs json rpc\n" - + HelpExampleRpc("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\", \"signature\", \"my message\"") + + HelpExampleRpc("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\", \"signature\", \"my message\"") ); LOCK(cs_main); @@ -400,7 +400,7 @@ UniValue signmessagewithprivkey(const JSONRPCRequest& request) "\nCreate the signature\n" + HelpExampleCli("signmessagewithprivkey", "\"privkey\" \"my message\"") + "\nVerify the signature\n" - + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"signature\" \"my message\"") + + + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"signature\" \"my message\"") + "\nAs json rpc\n" + HelpExampleRpc("signmessagewithprivkey", "\"privkey\", \"my message\"") ); diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index f590db5efaa..42f5db94f94 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -237,11 +237,11 @@ UniValue addnode(const JSONRPCRequest& request) UniValue disconnectnode(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() != 1) - throw runtime_error( - "disconnectnode \"node\" \n" + throw std::runtime_error( + "disconnectnode \"address\" \n" "\nImmediately disconnects from the specified node.\n" "\nArguments:\n" - "1. \"node\" (string, required) The node (see getpeerinfo for nodes)\n" + "1. \"address\" (string, required) The IP address/port of the node\n" "\nExamples:\n" + HelpExampleCli("disconnectnode", "\"192.168.0.6:8333\"") + HelpExampleRpc("disconnectnode", "\"192.168.0.6:8333\"") @@ -506,7 +506,7 @@ UniValue setban(const JSONRPCRequest& request) LookupSubNet(request.params[0].get_str().c_str(), subNet); if (! (isSubnet ? subNet.IsValid() : netAddr.IsValid()) ) - throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: Invalid IP/Subnet"); + throw JSONRPCError(RPC_CLIENT_INVALID_IP_OR_SUBNET, "Error: Invalid IP/Subnet"); if (strCommand == "add") { @@ -526,7 +526,7 @@ UniValue setban(const JSONRPCRequest& request) else if(strCommand == "remove") { if (!( isSubnet ? g_connman->Unban(subNet) : g_connman->Unban(netAddr) )) - throw JSONRPCError(RPC_MISC_ERROR, "Error: Unban failed"); + throw JSONRPCError(RPC_CLIENT_INVALID_IP_OR_SUBNET, "Error: Unban failed. Requested address/subnet was not previously banned."); } return NullUniValue; } @@ -609,7 +609,7 @@ static const CRPCCommand commands[] = { "network", "ping", &ping, true, {} }, { "network", "getpeerinfo", &getpeerinfo, true, {} }, { "network", "addnode", &addnode, true, {"node","command"} }, - { "network", "disconnectnode", &disconnectnode, true, {"node"} }, + { "network", "disconnectnode", &disconnectnode, true, {"address"} }, { "network", "getaddednodeinfo", &getaddednodeinfo, true, {"node"} }, { "network", "getnettotals", &getnettotals, true, {} }, { "network", "getnetworkinfo", &getnetworkinfo, true, {} }, diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index 21396ebb09b..0fabb9f5a88 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -139,7 +139,7 @@ UniValue getrawtransaction(const JSONRPCRequest& request) "\nArguments:\n" "1. \"txid\" (string, required) The transaction id\n" - "2. verbose (bool, optional, default=false) If true, return a string, other return a json object\n" + "2. verbose (bool, optional, default=false) If false, return a string, otherwise return a json object\n" "\nResult (if verbose is not set or set to false):\n" "\"data\" (string) The serialized, hex-encoded data for 'txid'\n" @@ -245,7 +245,6 @@ UniValue gettxoutproof(const JSONRPCRequest& request) "unspent output in the utxo for this transaction. To make it always work,\n" "you need to maintain a transaction index, using the -txindex command line option or\n" "specify the block in which the transaction is included manually (by blockhash).\n" - "\nReturn the raw transaction data.\n" "\nArguments:\n" "1. \"txids\" (string) A json array of txids to filter\n" " [\n" @@ -362,7 +361,7 @@ UniValue createrawtransaction(const JSONRPCRequest& request) "it is not stored in the wallet or transmitted to the network.\n" "\nArguments:\n" - "1. \"inputs\" (string, required) A json array of json objects\n" + "1. \"inputs\" (array, required) A json array of json objects\n" " [\n" " {\n" " \"txid\":\"id\", (string, required) The transaction id\n" @@ -371,7 +370,7 @@ UniValue createrawtransaction(const JSONRPCRequest& request) " } \n" " ,...\n" " ]\n" - "2. \"outputs\" (string, required) a json object with outputs\n" + "2. \"outputs\" (object, required) a json object with outputs\n" " {\n" " \"address\": x.xxx, (numeric or string, required) The key is the bitcoin address, the numeric value (can be string) is the " + CURRENCY_UNIT + " amount\n" " \"data\": \"hex\" (string, required) The key is \"data\", the value is hex encoded data\n" @@ -933,7 +932,7 @@ static const CRPCCommand commands[] = { // category name actor (function) okSafeMode // --------------------- ------------------------ ----------------------- ---------- { "rawtransactions", "getrawtransaction", &getrawtransaction, true, {"txid","verbose"} }, - { "rawtransactions", "createrawtransaction", &createrawtransaction, true, {"transactions","outputs","locktime"} }, + { "rawtransactions", "createrawtransaction", &createrawtransaction, true, {"inputs","outputs","locktime"} }, { "rawtransactions", "decoderawtransaction", &decoderawtransaction, true, {"hexstring"} }, { "rawtransactions", "decodescript", &decodescript, true, {"hexstring"} }, { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false, {"hexstring","allowhighfees"} }, diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index 283d458c8df..67fc825804f 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -18,8 +18,6 @@ #include #include #include -#include -#include #include #include #include @@ -333,6 +331,7 @@ void StopRPC() { LogPrint("rpc", "Stopping RPC\n"); deadlineTimers.clear(); + DeleteAuthCookie(); g_rpcSignals.Stopped(); } diff --git a/src/streams.h b/src/streams.h index 1d3b55c91ef..e49a9e35469 100644 --- a/src/streams.h +++ b/src/streams.h @@ -248,7 +248,8 @@ class CDataStream void insert(iterator it, std::vector::const_iterator first, std::vector::const_iterator last) { - assert(last - first >= 0); + if (last == first) return; + assert(last - first > 0); if (it == vch.begin() + nReadPos && (unsigned int)(last - first) <= nReadPos) { // special case for inserting at the front when there's room @@ -261,7 +262,8 @@ class CDataStream void insert(iterator it, const char* first, const char* last) { - assert(last - first >= 0); + if (last == first) return; + assert(last - first > 0); if (it == vch.begin() + nReadPos && (unsigned int)(last - first) <= nReadPos) { // special case for inserting at the front when there's room @@ -339,6 +341,8 @@ class CDataStream void read(char* pch, size_t nSize) { + if (nSize == 0) return; + // Read from the beginning of the buffer unsigned int nReadPosNext = nReadPos + nSize; if (nReadPosNext >= vch.size()) diff --git a/src/support/cleanse.h b/src/support/cleanse.h index 3e02aa8fd1f..f020216c730 100644 --- a/src/support/cleanse.h +++ b/src/support/cleanse.h @@ -8,6 +8,7 @@ #include +// Attempt to overwrite data in the specified memory span. void memory_cleanse(void *ptr, size_t len); #endif // BITCOIN_SUPPORT_CLEANSE_H diff --git a/src/test/bctest.py b/src/test/bctest.py index adc5d0e4181..7ea15dfddcd 100644 --- a/src/test/bctest.py +++ b/src/test/bctest.py @@ -98,6 +98,18 @@ def bctest(testDir, testObj, exeext): logging.error("Return code mismatch for " + outputFn) raise Exception + if "error_txt" in testObj: + want_error = testObj["error_txt"] + # Compare error text + # TODO: ideally, we'd compare the strings exactly and also assert + # That stderr is empty if no errors are expected. However, bitcoin-tx + # emits DISPLAY errors when running as a windows application on + # linux through wine. Just assert that the expected error text appears + # somewhere in stderr. + if want_error not in outs[1]: + logging.error("Error mismatch:\n" + "Expected: " + want_error + "\nReceived: " + outs[1].rstrip()) + raise Exception + def bctester(testDir, input_basename, buildenv): """ Loads and parses the input file, runs all tests and reports results""" input_filename = testDir + "/" + input_basename diff --git a/src/test/checkqueue_tests.cpp b/src/test/checkqueue_tests.cpp new file mode 100644 index 00000000000..d89f9b770bc --- /dev/null +++ b/src/test/checkqueue_tests.cpp @@ -0,0 +1,442 @@ +// Copyright (c) 2012-2017 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "util.h" +#include "utiltime.h" +#include "validation.h" + +#include "test/test_bitcoin.h" +#include "checkqueue.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "random.h" + +// BasicTestingSetup not sufficient because nScriptCheckThreads is not set +// otherwise. +BOOST_FIXTURE_TEST_SUITE(checkqueue_tests, TestingSetup) + +static const int QUEUE_BATCH_SIZE = 128; + +struct FakeCheck { + bool operator()() + { + return true; + } + void swap(FakeCheck& x){}; +}; + +struct FakeCheckCheckCompletion { + static std::atomic n_calls; + bool operator()() + { + ++n_calls; + return true; + } + void swap(FakeCheckCheckCompletion& x){}; +}; + +struct FailingCheck { + bool fails; + FailingCheck(bool fails) : fails(fails){}; + FailingCheck() : fails(true){}; + bool operator()() + { + return !fails; + } + void swap(FailingCheck& x) + { + std::swap(fails, x.fails); + }; +}; + +struct UniqueCheck { + static std::mutex m; + static std::unordered_multiset results; + size_t check_id; + UniqueCheck(size_t check_id_in) : check_id(check_id_in){}; + UniqueCheck() : check_id(0){}; + bool operator()() + { + std::lock_guard l(m); + results.insert(check_id); + return true; + } + void swap(UniqueCheck& x) { std::swap(x.check_id, check_id); }; +}; + + +struct MemoryCheck { + static std::atomic fake_allocated_memory; + bool b {false}; + bool operator()() + { + return true; + } + MemoryCheck(){}; + MemoryCheck(const MemoryCheck& x) + { + // We have to do this to make sure that destructor calls are paired + // + // Really, copy constructor should be deletable, but CCheckQueue breaks + // if it is deleted because of internal push_back. + fake_allocated_memory += b; + }; + MemoryCheck(bool b_) : b(b_) + { + fake_allocated_memory += b; + }; + ~MemoryCheck(){ + fake_allocated_memory -= b; + + }; + void swap(MemoryCheck& x) { std::swap(b, x.b); }; +}; + +struct FrozenCleanupCheck { + static std::atomic nFrozen; + static std::condition_variable cv; + static std::mutex m; + // Freezing can't be the default initialized behavior given how the queue + // swaps in default initialized Checks. + bool should_freeze {false}; + bool operator()() + { + return true; + } + FrozenCleanupCheck() {} + ~FrozenCleanupCheck() + { + if (should_freeze) { + std::unique_lock l(m); + nFrozen = 1; + cv.notify_one(); + cv.wait(l, []{ return nFrozen == 0;}); + } + } + void swap(FrozenCleanupCheck& x){std::swap(should_freeze, x.should_freeze);}; +}; + +// Static Allocations +std::mutex FrozenCleanupCheck::m{}; +std::atomic FrozenCleanupCheck::nFrozen{0}; +std::condition_variable FrozenCleanupCheck::cv{}; +std::mutex UniqueCheck::m; +std::unordered_multiset UniqueCheck::results; +std::atomic FakeCheckCheckCompletion::n_calls{0}; +std::atomic MemoryCheck::fake_allocated_memory{0}; + +// Queue Typedefs +typedef CCheckQueue Correct_Queue; +typedef CCheckQueue Standard_Queue; +typedef CCheckQueue Failing_Queue; +typedef CCheckQueue Unique_Queue; +typedef CCheckQueue Memory_Queue; +typedef CCheckQueue FrozenCleanup_Queue; + + +/** This test case checks that the CCheckQueue works properly + * with each specified size_t Checks pushed. + */ +void Correct_Queue_range(std::vector range) +{ + auto small_queue = std::unique_ptr(new Correct_Queue {QUEUE_BATCH_SIZE}); + boost::thread_group tg; + for (auto x = 0; x < nScriptCheckThreads; ++x) { + tg.create_thread([&]{small_queue->Thread();}); + } + // Make vChecks here to save on malloc (this test can be slow...) + std::vector vChecks; + for (auto i : range) { + size_t total = i; + FakeCheckCheckCompletion::n_calls = 0; + CCheckQueueControl control(small_queue.get()); + while (total) { + vChecks.resize(std::min(total, (size_t) GetRand(10))); + total -= vChecks.size(); + control.Add(vChecks); + } + BOOST_REQUIRE(control.Wait()); + if (FakeCheckCheckCompletion::n_calls != i) { + BOOST_REQUIRE_EQUAL(FakeCheckCheckCompletion::n_calls, i); + BOOST_TEST_MESSAGE("Failure on trial " << i << " expected, got " << FakeCheckCheckCompletion::n_calls); + } + } + tg.interrupt_all(); + tg.join_all(); +} + +/** Test that 0 checks is correct + */ +BOOST_AUTO_TEST_CASE(test_CheckQueue_Correct_Zero) +{ + std::vector range; + range.push_back((size_t)0); + Correct_Queue_range(range); +} +/** Test that 1 check is correct + */ +BOOST_AUTO_TEST_CASE(test_CheckQueue_Correct_One) +{ + std::vector range; + range.push_back((size_t)1); + Correct_Queue_range(range); +} +/** Test that MAX check is correct + */ +BOOST_AUTO_TEST_CASE(test_CheckQueue_Correct_Max) +{ + std::vector range; + range.push_back(100000); + Correct_Queue_range(range); +} +/** Test that random numbers of checks are correct + */ +BOOST_AUTO_TEST_CASE(test_CheckQueue_Correct_Random) +{ + std::vector range; + range.reserve(100000/1000); + for (size_t i = 2; i < 100000; i += std::max((size_t)1, (size_t)GetRand(std::min((size_t)1000, ((size_t)100000) - i)))) + range.push_back(i); + Correct_Queue_range(range); +} + + +/** Test that failing checks are caught */ +BOOST_AUTO_TEST_CASE(test_CheckQueue_Catches_Failure) +{ + auto fail_queue = std::unique_ptr(new Failing_Queue {QUEUE_BATCH_SIZE}); + + boost::thread_group tg; + for (auto x = 0; x < nScriptCheckThreads; ++x) { + tg.create_thread([&]{fail_queue->Thread();}); + } + + for (size_t i = 0; i < 1001; ++i) { + CCheckQueueControl control(fail_queue.get()); + size_t remaining = i; + while (remaining) { + size_t r = GetRand(10); + + std::vector vChecks; + vChecks.reserve(r); + for (size_t k = 0; k < r && remaining; k++, remaining--) + vChecks.emplace_back(remaining == 1); + control.Add(vChecks); + } + bool success = control.Wait(); + if (i > 0) { + BOOST_REQUIRE(!success); + } else if (i == 0) { + BOOST_REQUIRE(success); + } + } + tg.interrupt_all(); + tg.join_all(); +} +// Test that a block validation which fails does not interfere with +// future blocks, ie, the bad state is cleared. +BOOST_AUTO_TEST_CASE(test_CheckQueue_Recovers_From_Failure) +{ + auto fail_queue = std::unique_ptr(new Failing_Queue {QUEUE_BATCH_SIZE}); + boost::thread_group tg; + for (auto x = 0; x < nScriptCheckThreads; ++x) { + tg.create_thread([&]{fail_queue->Thread();}); + } + + for (auto times = 0; times < 10; ++times) { + for (bool end_fails : {true, false}) { + CCheckQueueControl control(fail_queue.get()); + { + std::vector vChecks; + vChecks.resize(100, false); + vChecks[99] = end_fails; + control.Add(vChecks); + } + bool r =control.Wait(); + BOOST_REQUIRE(r || end_fails); + } + } + tg.interrupt_all(); + tg.join_all(); +} + +// Test that unique checks are actually all called individually, rather than +// just one check being called repeatedly. Test that checks are not called +// more than once as well +BOOST_AUTO_TEST_CASE(test_CheckQueue_UniqueCheck) +{ + auto queue = std::unique_ptr(new Unique_Queue {QUEUE_BATCH_SIZE}); + boost::thread_group tg; + for (auto x = 0; x < nScriptCheckThreads; ++x) { + tg.create_thread([&]{queue->Thread();}); + + } + + size_t COUNT = 100000; + size_t total = COUNT; + { + CCheckQueueControl control(queue.get()); + while (total) { + size_t r = GetRand(10); + std::vector vChecks; + for (size_t k = 0; k < r && total; k++) + vChecks.emplace_back(--total); + control.Add(vChecks); + } + } + bool r = true; + BOOST_REQUIRE_EQUAL(UniqueCheck::results.size(), COUNT); + for (size_t i = 0; i < COUNT; ++i) + r = r && UniqueCheck::results.count(i) == 1; + BOOST_REQUIRE(r); + tg.interrupt_all(); + tg.join_all(); +} + + +// Test that blocks which might allocate lots of memory free their memory agressively. +// +// This test attempts to catch a pathological case where by lazily freeing +// checks might mean leaving a check un-swapped out, and decreasing by 1 each +// time could leave the data hanging across a sequence of blocks. +BOOST_AUTO_TEST_CASE(test_CheckQueue_Memory) +{ + auto queue = std::unique_ptr(new Memory_Queue {QUEUE_BATCH_SIZE}); + boost::thread_group tg; + for (auto x = 0; x < nScriptCheckThreads; ++x) { + tg.create_thread([&]{queue->Thread();}); + } + for (size_t i = 0; i < 1000; ++i) { + size_t total = i; + { + CCheckQueueControl control(queue.get()); + while (total) { + size_t r = GetRand(10); + std::vector vChecks; + for (size_t k = 0; k < r && total; k++) { + total--; + // Each iteration leaves data at the front, back, and middle + // to catch any sort of deallocation failure + vChecks.emplace_back(total == 0 || total == i || total == i/2); + } + control.Add(vChecks); + } + } + BOOST_REQUIRE_EQUAL(MemoryCheck::fake_allocated_memory, 0); + } + tg.interrupt_all(); + tg.join_all(); +} + +// Test that a new verification cannot occur until all checks +// have been destructed +BOOST_AUTO_TEST_CASE(test_CheckQueue_FrozenCleanup) +{ + auto queue = std::unique_ptr(new FrozenCleanup_Queue {QUEUE_BATCH_SIZE}); + boost::thread_group tg; + bool fails = false; + for (auto x = 0; x < nScriptCheckThreads; ++x) { + tg.create_thread([&]{queue->Thread();}); + } + std::thread t0([&]() { + CCheckQueueControl control(queue.get()); + std::vector vChecks(1); + // Freezing can't be the default initialized behavior given how the queue + // swaps in default initialized Checks (otherwise freezing destructor + // would get called twice). + vChecks[0].should_freeze = true; + control.Add(vChecks); + control.Wait(); // Hangs here + }); + { + std::unique_lock l(FrozenCleanupCheck::m); + // Wait until the queue has finished all jobs and frozen + FrozenCleanupCheck::cv.wait(l, [](){return FrozenCleanupCheck::nFrozen == 1;}); + // Try to get control of the queue a bunch of times + for (auto x = 0; x < 100 && !fails; ++x) { + fails = queue->ControlMutex.try_lock(); + } + // Unfreeze + FrozenCleanupCheck::nFrozen = 0; + } + // Awaken frozen destructor + FrozenCleanupCheck::cv.notify_one(); + // Wait for control to finish + t0.join(); + tg.interrupt_all(); + tg.join_all(); + BOOST_REQUIRE(!fails); +} + + +/** Test that CCheckQueueControl is threadsafe */ +BOOST_AUTO_TEST_CASE(test_CheckQueueControl_Locks) +{ + auto queue = std::unique_ptr(new Standard_Queue{QUEUE_BATCH_SIZE}); + { + boost::thread_group tg; + std::atomic nThreads {0}; + std::atomic fails {0}; + for (size_t i = 0; i < 3; ++i) { + tg.create_thread( + [&]{ + CCheckQueueControl control(queue.get()); + // While sleeping, no other thread should execute to this point + auto observed = ++nThreads; + MilliSleep(10); + fails += observed != nThreads; + }); + } + tg.join_all(); + BOOST_REQUIRE_EQUAL(fails, 0); + } + { + boost::thread_group tg; + std::mutex m; + bool has_lock {false}; + bool has_tried {false}; + bool done {false}; + bool done_ack {false}; + std::condition_variable cv; + { + std::unique_lock l(m); + tg.create_thread([&]{ + CCheckQueueControl control(queue.get()); + std::unique_lock l(m); + has_lock = true; + cv.notify_one(); + cv.wait(l, [&]{return has_tried;}); + done = true; + cv.notify_one(); + // Wait until the done is acknowledged + // + cv.wait(l, [&]{return done_ack;}); + }); + // Wait for thread to get the lock + cv.wait(l, [&](){return has_lock;}); + bool fails = false; + for (auto x = 0; x < 100 && !fails; ++x) { + fails = queue->ControlMutex.try_lock(); + } + has_tried = true; + cv.notify_one(); + cv.wait(l, [&](){return done;}); + // Acknowledge the done + done_ack = true; + cv.notify_one(); + BOOST_REQUIRE(!fails); + } + tg.join_all(); + } +} +BOOST_AUTO_TEST_SUITE_END() + diff --git a/src/test/data/bitcoin-util-test.json b/src/test/data/bitcoin-util-test.json index a80ab519015..b61a4f7f8f9 100644 --- a/src/test/data/bitcoin-util-test.json +++ b/src/test/data/bitcoin-util-test.json @@ -42,6 +42,7 @@ "args": ["-", "delin=31"], "input": "tx394b54bb.hex", "return_code": 1, + "error_txt": "error: Invalid TX input index '31'", "description": "Attempts to delete an input with a bad index from a transaction. Expected to fail." }, { "exec": "./bitcoin-tx", @@ -60,6 +61,7 @@ "args": ["-", "delout=2"], "input": "tx394b54bb.hex", "return_code": 1, + "error_txt": "error: Invalid TX output index '2'", "description": "Attempts to delete an output with a bad index from a transaction. Expected to fail." }, { "exec": "./bitcoin-tx", @@ -77,6 +79,38 @@ { "exec": "./bitcoin-tx", "args": ["-create", + "outaddr=1"], + "return_code": 1, + "error_txt": "error: TX output missing or too many separators", + "description": "Malformed outaddr argument (no address specified). Expected to fail." + }, + { "exec": "./bitcoin-tx", + "args": + ["-create", + "outaddr=1:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o:garbage"], + "return_code": 1, + "error_txt": "error: TX output missing or too many separators", + "description": "Malformed outaddr argument (too many separators). Expected to fail." + }, + { "exec": "./bitcoin-tx", + "args": + ["-create", + "outpubkey=0"], + "return_code": 1, + "error_txt": "error: TX output missing or too many separators", + "description": "Malformed outpubkey argument (no pubkey specified). Expected to fail." + }, + { "exec": "./bitcoin-tx", + "args": + ["-create", + "outpubkey=0:02a5613bd857b7048924264d1e70e08fb2a7e6527d32b7ab1bb993ac59964ff397:W:non53nse"], + "return_code": 1, + "error_txt": "error: TX output missing or too many separators", + "description": "Malformed outpubkey argument (too many separators). Expected to fail." + }, + { "exec": "./bitcoin-tx", + "args": + ["-create", "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0", "in=bf829c6bcf84579331337659d31f89dfd138f7f7785802d5501c92333145ca7c:18", "in=22a6f904655d53ae2ff70e701a0bbd90aa3975c0f40bfc6cc996a9049e31cdfc:1", @@ -233,6 +267,7 @@ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0", "outdata=4:badhexdata"], "return_code": 1, + "error_txt": "error: invalid TX output data", "description": "Attempts to create a new transaction with one input and an output with malformed hex data. Expected to fail" }, { "exec": "./bitcoin-tx", @@ -241,6 +276,7 @@ "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0", "outdata=badhexdata"], "return_code": 1, + "error_txt": "error: invalid TX output data", "description": "Attempts to create a new transaction with one input and an output with no value and malformed hex data. Expected to fail" }, { "exec": "./bitcoin-tx", diff --git a/src/txdb.cpp b/src/txdb.cpp index 1a30bb58ad8..662e7cb06d3 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -98,7 +98,11 @@ CCoinsViewCursor *CCoinsViewDB::Cursor() const that restriction. */ i->pcursor->Seek(DB_COINS); // Cache key of first record - i->pcursor->GetKey(i->keyTmp); + if (i->pcursor->Valid()) { + i->pcursor->GetKey(i->keyTmp); + } else { + i->keyTmp.first = 0; // Make sure Valid() and GetKey() return false + } return i; } diff --git a/src/txdb.h b/src/txdb.h index 7f5cf2b583f..d9214ba6185 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -21,8 +21,14 @@ class CBlockIndex; class CCoinsViewDBCursor; class uint256; +//! Compensate for extra memory peak (x1.5-x1.9) at flush time. +static constexpr int DB_PEAK_USAGE_FACTOR = 2; +//! No need to periodic flush if at least this much space still available. +static constexpr int MAX_BLOCK_COINSDB_USAGE = 200 * DB_PEAK_USAGE_FACTOR; +//! Always periodic flush if less than this much space still available. +static constexpr int MIN_BLOCK_COINSDB_USAGE = 50 * DB_PEAK_USAGE_FACTOR; //! -dbcache default (MiB) -static const int64_t nDefaultDbCache = 300; +static const int64_t nDefaultDbCache = 450; //! max. -dbcache (MiB) static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 16384 : 1024; //! min. -dbcache (MiB) diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 5842dd88d83..72547b58282 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -938,6 +938,14 @@ void CTxMemPool::PrioritiseTransaction(const uint256 hash, const std::string str BOOST_FOREACH(txiter ancestorIt, setAncestors) { mapTx.modify(ancestorIt, update_descendant_state(0, nFeeDelta, 0)); } + // Now update all descendants' modified fees with ancestors + setEntries setDescendants; + CalculateDescendants(it, setDescendants); + setDescendants.erase(it); + BOOST_FOREACH(txiter descendantIt, setDescendants) { + mapTx.modify(descendantIt, update_ancestor_state(0, nFeeDelta, 0, 0)); + } + ++nTransactionsUpdated; } } LogPrintf("PrioritiseTransaction: %s priority += %f, fee += %d\n", strHash, dPriorityDelta, FormatMoney(nFeeDelta)); diff --git a/src/txmempool.h b/src/txmempool.h index db1a02455f8..12c9e59f5f0 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -432,7 +432,7 @@ class CTxMemPool { private: uint32_t nCheckFrequency; //!< Value n means that n times in 2^32 we check. - unsigned int nTransactionsUpdated; + unsigned int nTransactionsUpdated; //!< Used by getblocktemplate to trigger CreateNewBlock() invocation CBlockPolicyEstimator* minerPolicyEstimator; uint64_t totalTxSize; //!< sum of all mempool tx's virtual sizes. Differs from serialized tx size since witness data is discounted. Defined in BIP 141. diff --git a/src/util.cpp b/src/util.cpp index ba157625d80..6f812d9104e 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -72,6 +72,10 @@ #include #endif +#ifdef HAVE_MALLOPT_ARENA_MAX +#include +#endif + #include // for to_lower() #include #include // for startswith() and endswith() @@ -214,12 +218,13 @@ void OpenDebugLog() assert(vMsgsBeforeOpenLog); boost::filesystem::path pathDebug = GetDataDir() / "debug.log"; fileout = fopen(pathDebug.string().c_str(), "a"); - if (fileout) setbuf(fileout, NULL); // unbuffered - - // dump buffered messages from before we opened the log - while (!vMsgsBeforeOpenLog->empty()) { - FileWriteStr(vMsgsBeforeOpenLog->front(), fileout); - vMsgsBeforeOpenLog->pop_front(); + if (fileout) { + setbuf(fileout, NULL); // unbuffered + // dump buffered messages from before we opened the log + while (!vMsgsBeforeOpenLog->empty()) { + FileWriteStr(vMsgsBeforeOpenLog->front(), fileout); + vMsgsBeforeOpenLog->pop_front(); + } } delete vMsgsBeforeOpenLog; @@ -791,6 +796,16 @@ void RenameThread(const char* name) void SetupEnvironment() { +#ifdef HAVE_MALLOPT_ARENA_MAX + // glibc-specific: On 32-bit systems set the number of arenas to 1. + // By default, since glibc 2.10, the C library will create up to two heap + // arenas per core. This is known to cause excessive virtual address space + // usage in our usage. Work around it by setting the maximum number of + // arenas to 1. + if (sizeof(void*) == 4) { + mallopt(M_ARENA_MAX, 1); + } +#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. #if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__) @@ -838,4 +853,4 @@ std::string CopyrightHolders(const std::string& strPrefix) strCopyrightHolders += "\n" + strPrefix + "The Bitcoin Core developers"; } return strCopyrightHolders; -} +} \ No newline at end of file diff --git a/src/validation.cpp b/src/validation.cpp index 4ce0723b21c..c9135c442b1 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2027,10 +2027,11 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode, int n nLastSetChain = nNow; } int64_t nMempoolSizeMax = GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000; - int64_t cacheSize = pcoinsTip->DynamicMemoryUsage(); + int64_t cacheSize = pcoinsTip->DynamicMemoryUsage() * DB_PEAK_USAGE_FACTOR; int64_t nTotalSpace = nCoinCacheUsage + std::max(nMempoolSizeMax - nMempoolUsage, 0); - // The cache is large and we're within 10% and 100 MiB of the limit, but we have time now (not in the middle of a block processing). - bool fCacheLarge = mode == FLUSH_STATE_PERIODIC && cacheSize > std::max((9 * nTotalSpace) / 10, nTotalSpace - 100 * 1024 * 1024); + // The cache is large and we're within 10% and 200 MiB or 50% and 50MiB of the limit, but we have time now (not in the middle of a block processing). + bool fCacheLarge = mode == FLUSH_STATE_PERIODIC && cacheSize > std::min(std::max(nTotalSpace / 2, nTotalSpace - MIN_BLOCK_COINSDB_USAGE * 1024 * 1024), + std::max((9 * nTotalSpace) / 10, nTotalSpace - MAX_BLOCK_COINSDB_USAGE * 1024 * 1024)); // The cache is over the limit, we have to write now. bool fCacheCritical = mode == FLUSH_STATE_IF_NEEDED && cacheSize > nTotalSpace; // It's been a while since we wrote the block index to disk. Do this frequently, so we don't need to redownload after a crash. @@ -2922,9 +2923,11 @@ bool IsWitnessEnabled(const CBlockIndex* pindexPrev, const Consensus::Params& pa static int GetWitnessCommitmentIndex(const CBlock& block) { int commitpos = -1; - for (size_t o = 0; o < block.vtx[0]->vout.size(); o++) { - if (block.vtx[0]->vout[o].scriptPubKey.size() >= 38 && block.vtx[0]->vout[o].scriptPubKey[0] == OP_RETURN && block.vtx[0]->vout[o].scriptPubKey[1] == 0x24 && block.vtx[0]->vout[o].scriptPubKey[2] == 0xaa && block.vtx[0]->vout[o].scriptPubKey[3] == 0x21 && block.vtx[0]->vout[o].scriptPubKey[4] == 0xa9 && block.vtx[0]->vout[o].scriptPubKey[5] == 0xed) { - commitpos = o; + if (!block.vtx.empty()) { + for (size_t o = 0; o < block.vtx[0]->vout.size(); o++) { + if (block.vtx[0]->vout[o].scriptPubKey.size() >= 38 && block.vtx[0]->vout[o].scriptPubKey[0] == OP_RETURN && block.vtx[0]->vout[o].scriptPubKey[1] == 0x24 && block.vtx[0]->vout[o].scriptPubKey[2] == 0xaa && block.vtx[0]->vout[o].scriptPubKey[3] == 0x21 && block.vtx[0]->vout[o].scriptPubKey[4] == 0xa9 && block.vtx[0]->vout[o].scriptPubKey[5] == 0xed) { + commitpos = o; + } } } return commitpos; @@ -3331,7 +3334,7 @@ void PruneOneBlockFile(const int fileNumber) } -void UnlinkPrunedFiles(std::set& setFilesToPrune) +void UnlinkPrunedFiles(const std::set& setFilesToPrune) { for (std::set::iterator it = setFilesToPrune.begin(); it != setFilesToPrune.end(); ++it) { CDiskBlockPos pos(*it, 0); @@ -4163,6 +4166,11 @@ std::string CBlockFileInfo::ToString() const return strprintf("CBlockFileInfo(blocks=%u, size=%u, heights=%u...%u, time=%s...%s)", nBlocks, nSize, nHeightFirst, nHeightLast, DateTimeStrFormat("%Y-%m-%d", nTimeFirst), DateTimeStrFormat("%Y-%m-%d", nTimeLast)); } +CBlockFileInfo* GetBlockFileInfo(size_t n) +{ + return &vinfoBlockFile.at(n); +} + ThresholdState VersionBitsTipState(const Consensus::Params& params, Consensus::DeploymentPos pos) { LOCK(cs_main); @@ -4180,7 +4188,7 @@ static const uint64_t MEMPOOL_DUMP_VERSION = 1; bool LoadMempool(void) { int64_t nExpiryTimeout = GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60; - FILE* filestr = fopen((GetDataDir() / "mempool.dat").string().c_str(), "r"); + FILE* filestr = fopen((GetDataDir() / "mempool.dat").string().c_str(), "rb"); CAutoFile file(filestr, SER_DISK, CLIENT_VERSION); if (file.IsNull()) { LogPrintf("Failed to open mempool file from disk. Continuing anyway.\n"); @@ -4261,7 +4269,7 @@ void DumpMempool(void) int64_t mid = GetTimeMicros(); try { - FILE* filestr = fopen((GetDataDir() / "mempool.dat.new").string().c_str(), "w"); + FILE* filestr = fopen((GetDataDir() / "mempool.dat.new").string().c_str(), "wb"); if (!filestr) { return; } diff --git a/src/validation.h b/src/validation.h index 6fcbb1c1084..9c606f24194 100644 --- a/src/validation.h +++ b/src/validation.h @@ -300,9 +300,14 @@ double GuessVerificationProgress(const ChainTxData& data, CBlockIndex* pindex); void FindFilesToPrune(std::set& setFilesToPrune, uint64_t nPruneAfterHeight); /** + * Mark one block file as pruned. + */ +void PruneOneBlockFile(const int fileNumber); + +/** * Actually unlink the specified files */ -void UnlinkPrunedFiles(std::set& setFilesToPrune); +void UnlinkPrunedFiles(const std::set& setFilesToPrune); /** Create a new block index entry for a given block hash */ CBlockIndex * InsertBlockIndex(uint256 hash); @@ -562,6 +567,9 @@ static const unsigned int REJECT_ALREADY_KNOWN = 0x101; /** Transaction conflicts with a transaction already known */ static const unsigned int REJECT_CONFLICT = 0x102; +/** Get block file info entry for one block file */ +CBlockFileInfo* GetBlockFileInfo(size_t n); + /** Dump the mempool to disk. */ void DumpMempool(); diff --git a/src/versionbits.cpp b/src/versionbits.cpp index d73f3405109..8a7cce74856 100644 --- a/src/versionbits.cpp +++ b/src/versionbits.cpp @@ -17,7 +17,7 @@ const struct BIP9DeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION }, { /*.name =*/ "segwit", - /*.gbt_force =*/ false, + /*.gbt_force =*/ true, } }; diff --git a/src/wallet/db.h b/src/wallet/db.h index b4ce044e7f5..ea562003230 100644 --- a/src/wallet/db.h +++ b/src/wallet/db.h @@ -126,22 +126,23 @@ class CDB Dbt datValue; datValue.set_flags(DB_DBT_MALLOC); int ret = pdb->get(activeTxn, &datKey, &datValue, 0); - memset(datKey.get_data(), 0, datKey.get_size()); - if (datValue.get_data() == NULL) - return false; - - // Unserialize value - try { - CDataStream ssValue((char*)datValue.get_data(), (char*)datValue.get_data() + datValue.get_size(), SER_DISK, CLIENT_VERSION); - ssValue >> value; - } catch (const std::exception&) { - return false; + memory_cleanse(datKey.get_data(), datKey.get_size()); + bool success = false; + if (datValue.get_data() != NULL) { + // Unserialize value + try { + CDataStream ssValue((char*)datValue.get_data(), (char*)datValue.get_data() + datValue.get_size(), SER_DISK, CLIENT_VERSION); + ssValue >> value; + success = true; + } catch (const std::exception&) { + // In this case success remains 'false' + } + + // Clear and free memory + memory_cleanse(datValue.get_data(), datValue.get_size()); + free(datValue.get_data()); } - - // Clear and free memory - memset(datValue.get_data(), 0, datValue.get_size()); - free(datValue.get_data()); - return (ret == 0); + return ret == 0 && success; } template @@ -168,8 +169,8 @@ class CDB int ret = pdb->put(activeTxn, &datKey, &datValue, (fOverwrite ? 0 : DB_NOOVERWRITE)); // Clear memory in case it was a private key - memset(datKey.get_data(), 0, datKey.get_size()); - memset(datValue.get_data(), 0, datValue.get_size()); + memory_cleanse(datKey.get_data(), datKey.get_size()); + memory_cleanse(datValue.get_data(), datValue.get_size()); return (ret == 0); } @@ -191,7 +192,7 @@ class CDB int ret = pdb->del(activeTxn, &datKey, 0); // Clear memory - memset(datKey.get_data(), 0, datKey.get_size()); + memory_cleanse(datKey.get_data(), datKey.get_size()); return (ret == 0 || ret == DB_NOTFOUND); } @@ -211,7 +212,7 @@ class CDB int ret = pdb->exists(activeTxn, &datKey, 0); // Clear memory - memset(datKey.get_data(), 0, datKey.get_size()); + memory_cleanse(datKey.get_data(), datKey.get_size()); return (ret == 0); } @@ -254,8 +255,8 @@ class CDB ssValue.write((char*)datValue.get_data(), datValue.get_size()); // Clear and free memory - memset(datKey.get_data(), 0, datKey.get_size()); - memset(datValue.get_data(), 0, datValue.get_size()); + memory_cleanse(datKey.get_data(), datKey.get_size()); + memory_cleanse(datValue.get_data(), datValue.get_size()); free(datKey.get_data()); free(datValue.get_data()); return 0; diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 30f2414675a..dc61a4505ed 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -96,6 +96,8 @@ UniValue importprivkey(const JSONRPCRequest& request) + HelpExampleCli("importprivkey", "\"mykey\"") + "\nImport using a label and without rescan\n" + HelpExampleCli("importprivkey", "\"mykey\" \"testing\" false") + + "\nImport using default blank label and without rescan\n" + + HelpExampleCli("importprivkey", "\"mykey\" \"\" false") + "\nAs a JSON-RPC call\n" + HelpExampleRpc("importprivkey", "\"mykey\", \"testing\", false") ); @@ -338,11 +340,11 @@ UniValue removeprunedfunds(const JSONRPCRequest& request) vector vHashOut; if(pwalletMain->ZapSelectTx(vHash, vHashOut) != DB_LOAD_OK) { - throw JSONRPCError(RPC_INTERNAL_ERROR, "Could not properly delete the transaction."); + throw JSONRPCError(RPC_WALLET_ERROR, "Could not properly delete the transaction."); } if(vHashOut.empty()) { - throw JSONRPCError(RPC_INTERNAL_ERROR, "Transaction does not exist in wallet."); + throw JSONRPCError(RPC_INVALID_PARAMETER, "Transaction does not exist in wallet."); } return NullUniValue; @@ -495,14 +497,11 @@ UniValue importwallet(const JSONRPCRequest& request) } file.close(); pwalletMain->ShowProgress("", 100); // hide progress dialog in GUI - - CBlockIndex *pindex = chainActive.Tip(); - while (pindex && pindex->pprev && pindex->GetBlockTime() > nTimeBegin - 7200) - pindex = pindex->pprev; - pwalletMain->UpdateTimeFirstKey(nTimeBegin); - LogPrintf("Rescanning last %i blocks\n", chainActive.Height() - pindex->nHeight + 1); + CBlockIndex *pindex = chainActive.FindEarliestAtLeast(nTimeBegin - 7200); + + LogPrintf("Rescanning last %i blocks\n", pindex ? chainActive.Height() - pindex->nHeight + 1 : 0); pwalletMain->ScanForWalletTransactions(pindex); pwalletMain->MarkDirty(); @@ -1072,13 +1071,35 @@ UniValue importmulti(const JSONRPCRequest& mainRequest) } } - if (fRescan && fRunScan && requests.size() && nLowestTimestamp <= chainActive.Tip()->GetBlockTimeMax()) { + if (fRescan && fRunScan && requests.size()) { CBlockIndex* pindex = nLowestTimestamp > minimumTimestamp ? chainActive.FindEarliestAtLeast(std::max(nLowestTimestamp - 7200, 0)) : chainActive.Genesis(); - + CBlockIndex* scannedRange = nullptr; if (pindex) { - pwalletMain->ScanForWalletTransactions(pindex, true); + scannedRange = pwalletMain->ScanForWalletTransactions(pindex, true); pwalletMain->ReacceptWalletTransactions(); } + + if (!scannedRange || scannedRange->nHeight > pindex->nHeight) { + std::vector results = response.getValues(); + response.clear(); + response.setArray(); + size_t i = 0; + for (const UniValue& request : requests.getValues()) { + // If key creation date is within the successfully scanned + // range, or if the import result already has an error set, let + // the result stand unmodified. Otherwise replace the result + // with an error message. + if (GetImportTimestamp(request, now) - 7200 >= scannedRange->GetBlockTimeMax() || results.at(i).exists("error")) { + response.push_back(results.at(i)); + } else { + UniValue result = UniValue(UniValue::VOBJ); + result.pushKV("success", UniValue(false)); + result.pushKV("error", JSONRPCError(RPC_MISC_ERROR, strprintf("Failed to rescan before time %d, transactions may be missing.", scannedRange->GetBlockTimeMax()))); + response.push_back(std::move(result)); + } + ++i; + } + } } return response; diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 45b572aa2e2..7cc03201650 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -236,8 +236,8 @@ UniValue setaccount(const JSONRPCRequest& request) "1. \"address\" (string, required) The bitcoin address to be associated with an account.\n" "2. \"account\" (string, required) The account to assign the address to.\n" "\nExamples:\n" - + HelpExampleCli("setaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"tabby\"") - + HelpExampleRpc("setaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\", \"tabby\"") + + HelpExampleCli("setaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"tabby\"") + + HelpExampleRpc("setaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\", \"tabby\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -283,8 +283,8 @@ UniValue getaccount(const JSONRPCRequest& request) "\nResult:\n" "\"accountname\" (string) the account address\n" "\nExamples:\n" - + HelpExampleCli("getaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\"") - + HelpExampleRpc("getaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\"") + + HelpExampleCli("getaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\"") + + HelpExampleRpc("getaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -503,11 +503,11 @@ UniValue signmessage(const JSONRPCRequest& request) "\nUnlock the wallet for 30 seconds\n" + HelpExampleCli("walletpassphrase", "\"mypassphrase\" 30") + "\nCreate the signature\n" - + HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"my message\"") + + + HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"my message\"") + "\nVerify the signature\n" - + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"signature\" \"my message\"") + + + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"signature\" \"my message\"") + "\nAs json rpc\n" - + HelpExampleRpc("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\", \"my message\"") + + HelpExampleRpc("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\", \"my message\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -556,13 +556,13 @@ UniValue getreceivedbyaddress(const JSONRPCRequest& request) "amount (numeric) The total amount in " + CURRENCY_UNIT + " received at this address.\n" "\nExamples:\n" "\nThe amount from transactions with at least 1 confirmation\n" - + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\"") + + + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\"") + "\nThe amount including unconfirmed transactions, zero confirmations\n" - + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" 0") + + + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" 0") + "\nThe amount with at least 6 confirmation, very safe\n" - + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" 6") + + + HelpExampleCli("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" 6") + "\nAs a json rpc call\n" - + HelpExampleRpc("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\", 6") + + HelpExampleRpc("getreceivedbyaddress", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\", 6") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -819,6 +819,9 @@ UniValue sendfrom(const JSONRPCRequest& request) + HelpRequiringPassphrase() + "\n" "\nArguments:\n" "1. \"fromaccount\" (string, required) The name of the account to send funds from. May be the default account using \"\".\n" + " Specifying an account does not influence coin selection, but it does associate the newly created\n" + " transaction with the account, so the account's balance computation and transaction history can reflect\n" + " the spend.\n" "2. \"toaddress\" (string, required) The bitcoin address to send funds to.\n" "3. amount (numeric or string, required) The amount in " + CURRENCY_UNIT + " (transaction fee is added on top).\n" "4. minconf (numeric, optional, default=1) Only use funds with at least this many confirmations.\n" @@ -903,13 +906,13 @@ UniValue sendmany(const JSONRPCRequest& request) " the number of addresses.\n" "\nExamples:\n" "\nSend two amounts to two different addresses:\n" - + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\"") + + + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\"") + "\nSend two amounts to two different addresses setting the confirmation and comment:\n" - + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\" 6 \"testing\"") + + + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\" 6 \"testing\"") + "\nSend two amounts to two different addresses, subtract fee from amount:\n" - + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\" 1 \"\" \"[\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\",\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\"]\"") + + + HelpExampleCli("sendmany", "\"\" \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\" 1 \"\" \"[\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\\\",\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\"]\"") + "\nAs a json rpc call\n" - + HelpExampleRpc("sendmany", "\"\", \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\", 6, \"testing\"") + + HelpExampleRpc("sendmany", "\"\", \"{\\\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\\\":0.01,\\\"1353tsE8YMTA4EuV7dgUXGjNFf9KpVvKHz\\\":0.02}\", 6, \"testing\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -2600,7 +2603,7 @@ UniValue fundrawtransaction(const JSONRPCRequest& request) CBitcoinAddress address(options["changeAddress"].get_str()); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_PARAMETER, "changeAddress must be a valid bitcoin address"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "changeAddress must be a valid bitcoin address"); changeAddress = address.Get(); } @@ -2654,7 +2657,7 @@ UniValue fundrawtransaction(const JSONRPCRequest& request) string strFailReason; if(!pwalletMain->FundTransaction(tx, nFeeOut, overrideEstimatedFeerate, feeRate, changePosition, strFailReason, includeWatching, lockUnspents, setSubtractFeeFromOutputs, reserveChangeKey, changeAddress)) - throw JSONRPCError(RPC_INTERNAL_ERROR, strFailReason); + throw JSONRPCError(RPC_WALLET_ERROR, strFailReason); UniValue result(UniValue::VOBJ); result.push_back(Pair("hex", EncodeHexTx(tx))); @@ -2753,33 +2756,33 @@ UniValue bumpfee(const JSONRPCRequest& request) CWalletTx& wtx = pwalletMain->mapWallet[hash]; if (pwalletMain->HasWalletSpend(hash)) { - throw JSONRPCError(RPC_MISC_ERROR, "Transaction has descendants in the wallet"); + throw JSONRPCError(RPC_INVALID_PARAMETER, "Transaction has descendants in the wallet"); } { LOCK(mempool.cs); auto it = mempool.mapTx.find(hash); if (it != mempool.mapTx.end() && it->GetCountWithDescendants() > 1) { - throw JSONRPCError(RPC_MISC_ERROR, "Transaction has descendants in the mempool"); + throw JSONRPCError(RPC_INVALID_PARAMETER, "Transaction has descendants in the mempool"); } } if (wtx.GetDepthInMainChain() != 0) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction has been mined, or is conflicted with a mined transaction"); + throw JSONRPCError(RPC_WALLET_ERROR, "Transaction has been mined, or is conflicted with a mined transaction"); } if (!SignalsOptInRBF(wtx)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction is not BIP 125 replaceable"); + throw JSONRPCError(RPC_WALLET_ERROR, "Transaction is not BIP 125 replaceable"); } if (wtx.mapValue.count("replaced_by_txid")) { - throw JSONRPCError(RPC_INVALID_REQUEST, strprintf("Cannot bump transaction %s which was already bumped by transaction %s", hash.ToString(), wtx.mapValue.at("replaced_by_txid"))); + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Cannot bump transaction %s which was already bumped by transaction %s", hash.ToString(), wtx.mapValue.at("replaced_by_txid"))); } // check that original tx consists entirely of our inputs // if not, we can't bump the fee, because the wallet has no way of knowing the value of the other inputs (thus the fee) if (!pwalletMain->IsAllFromMe(wtx, ISMINE_SPENDABLE)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction contains inputs that don't belong to this wallet"); + throw JSONRPCError(RPC_WALLET_ERROR, "Transaction contains inputs that don't belong to this wallet"); } // figure out which output was change @@ -2788,13 +2791,13 @@ UniValue bumpfee(const JSONRPCRequest& request) for (size_t i = 0; i < wtx.tx->vout.size(); ++i) { if (pwalletMain->IsChange(wtx.tx->vout[i])) { if (nOutput != -1) { - throw JSONRPCError(RPC_MISC_ERROR, "Transaction has multiple change outputs"); + throw JSONRPCError(RPC_WALLET_ERROR, "Transaction has multiple change outputs"); } nOutput = i; } } if (nOutput == -1) { - throw JSONRPCError(RPC_MISC_ERROR, "Transaction does not have a change output"); + throw JSONRPCError(RPC_WALLET_ERROR, "Transaction does not have a change output"); } // Calculate the expected size of the new transaction. @@ -2885,7 +2888,7 @@ UniValue bumpfee(const JSONRPCRequest& request) // Check that in all cases the new fee doesn't violate maxTxFee if (nNewFee > maxTxFee) { - throw JSONRPCError(RPC_MISC_ERROR, + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Specified or calculated fee %s is too high (cannot be higher than maxTxFee %s)", FormatMoney(nNewFee), FormatMoney(maxTxFee))); } @@ -2897,7 +2900,7 @@ UniValue bumpfee(const JSONRPCRequest& request) // moment earlier. In this case, we report an error to the user, who may use totalFee to make an adjustment. CFeeRate minMempoolFeeRate = mempool.GetMinFee(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000); if (nNewFeeRate.GetFeePerK() < minMempoolFeeRate.GetFeePerK()) { - throw JSONRPCError(RPC_MISC_ERROR, strprintf("New fee rate (%s) is less than the minimum fee rate (%s) to get into the mempool. totalFee value should to be at least %s or settxfee value should be at least %s to add transaction.", FormatMoney(nNewFeeRate.GetFeePerK()), FormatMoney(minMempoolFeeRate.GetFeePerK()), FormatMoney(minMempoolFeeRate.GetFee(maxNewTxSize)), FormatMoney(minMempoolFeeRate.GetFeePerK()))); + throw JSONRPCError(RPC_WALLET_ERROR, strprintf("New fee rate (%s) is less than the minimum fee rate (%s) to get into the mempool. totalFee value should to be at least %s or settxfee value should be at least %s to add transaction.", FormatMoney(nNewFeeRate.GetFeePerK()), FormatMoney(minMempoolFeeRate.GetFeePerK()), FormatMoney(minMempoolFeeRate.GetFee(maxNewTxSize)), FormatMoney(minMempoolFeeRate.GetFeePerK()))); } // Now modify the output to increase the fee. @@ -2907,7 +2910,7 @@ UniValue bumpfee(const JSONRPCRequest& request) CMutableTransaction tx(*(wtx.tx)); CTxOut* poutput = &(tx.vout[nOutput]); if (poutput->nValue < nDelta) { - throw JSONRPCError(RPC_MISC_ERROR, "Change output is too small to bump the fee"); + throw JSONRPCError(RPC_WALLET_ERROR, "Change output is too small to bump the fee"); } // If the output would become dust, discard it (converting the dust to fee) diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp index ca086c86a80..083ff0afc3d 100644 --- a/src/wallet/test/wallet_tests.cpp +++ b/src/wallet/test/wallet_tests.cpp @@ -9,10 +9,18 @@ #include #include +#include "rpc/server.h" +#include "test/test_bitcoin.h" +#include "validation.h" #include "wallet/test/wallet_test_fixture.h" #include #include +#include + +extern UniValue importmulti(const JSONRPCRequest& request); +extern UniValue dumpwallet(const JSONRPCRequest& request); +extern UniValue importwallet(const JSONRPCRequest& request); // how many times to run all the tests to have a chance to catch errors that only show up with particular random shuffles #define RUN_TESTS 100 @@ -355,4 +363,131 @@ BOOST_AUTO_TEST_CASE(ApproximateBestSubset) empty_wallet(); } +BOOST_FIXTURE_TEST_CASE(rescan, TestChain100Setup) +{ + LOCK(cs_main); + + // Cap last block file size, and mine new block in a new block file. + CBlockIndex* oldTip = chainActive.Tip(); + GetBlockFileInfo(oldTip->GetBlockPos().nFile)->nSize = MAX_BLOCKFILE_SIZE; + CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey())); + CBlockIndex* newTip = chainActive.Tip(); + + // Verify ScanForWalletTransactions picks up transactions in both the old + // and new block files. + { + CWallet wallet; + LOCK(wallet.cs_wallet); + wallet.AddKeyPubKey(coinbaseKey, coinbaseKey.GetPubKey()); + BOOST_CHECK_EQUAL(oldTip, wallet.ScanForWalletTransactions(oldTip)); + BOOST_CHECK_EQUAL(wallet.GetImmatureBalance(), 100 * COIN); + } + + // Prune the older block file. + PruneOneBlockFile(oldTip->GetBlockPos().nFile); + UnlinkPrunedFiles({oldTip->GetBlockPos().nFile}); + + // Verify ScanForWalletTransactions only picks transactions in the new block + // file. + { + CWallet wallet; + LOCK(wallet.cs_wallet); + wallet.AddKeyPubKey(coinbaseKey, coinbaseKey.GetPubKey()); + BOOST_CHECK_EQUAL(newTip, wallet.ScanForWalletTransactions(oldTip)); + BOOST_CHECK_EQUAL(wallet.GetImmatureBalance(), 50 * COIN); + } + + // Verify importmulti RPC returns failure for a key whose creation time is + // before the missing block, and success for a key whose creation time is + // after. + { + CWallet wallet; + CWallet *backup = ::pwalletMain; + ::pwalletMain = &wallet; + UniValue keys; + keys.setArray(); + UniValue key; + key.setObject(); + key.pushKV("scriptPubKey", HexStr(GetScriptForRawPubKey(coinbaseKey.GetPubKey()))); + key.pushKV("timestamp", 0); + key.pushKV("internal", UniValue(true)); + keys.push_back(key); + key.clear(); + key.setObject(); + CKey futureKey; + futureKey.MakeNewKey(true); + key.pushKV("scriptPubKey", HexStr(GetScriptForRawPubKey(futureKey.GetPubKey()))); + key.pushKV("timestamp", newTip->GetBlockTimeMax() + 7200); + key.pushKV("internal", UniValue(true)); + keys.push_back(key); + JSONRPCRequest request; + request.params.setArray(); + request.params.push_back(keys); + + UniValue response = importmulti(request); + BOOST_CHECK_EQUAL(response.write(), strprintf("[{\"success\":false,\"error\":{\"code\":-1,\"message\":\"Failed to rescan before time %d, transactions may be missing.\"}},{\"success\":true}]", newTip->GetBlockTimeMax())); + ::pwalletMain = backup; + } +} + +// Verify importwallet RPC starts rescan at earliest block with timestamp +// greater or equal than key birthday. Previously there was a bug where +// importwallet RPC would start the scan at the latest block with timestamp less +// than or equal to key birthday. +BOOST_FIXTURE_TEST_CASE(importwallet_rescan, TestChain100Setup) +{ + CWallet *pwalletMainBackup = ::pwalletMain; + LOCK(cs_main); + + // Create two blocks with same timestamp to verify that importwallet rescan + // will pick up both blocks, not just the first. + const int64_t BLOCK_TIME = chainActive.Tip()->GetBlockTimeMax() + 5; + SetMockTime(BLOCK_TIME); + coinbaseTxns.emplace_back(*CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]); + coinbaseTxns.emplace_back(*CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]); + + // Set key birthday to block time increased by the timestamp window, so + // rescan will start at the block time. + const int64_t KEY_TIME = BLOCK_TIME + 7200; + SetMockTime(KEY_TIME); + coinbaseTxns.emplace_back(*CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]); + + // Import key into wallet and call dumpwallet to create backup file. + { + CWallet wallet; + LOCK(wallet.cs_wallet); + wallet.mapKeyMetadata[coinbaseKey.GetPubKey().GetID()].nCreateTime = KEY_TIME; + wallet.AddKeyPubKey(coinbaseKey, coinbaseKey.GetPubKey()); + + JSONRPCRequest request; + request.params.setArray(); + request.params.push_back("wallet.backup"); + ::pwalletMain = &wallet; + ::dumpwallet(request); + } + + // Call importwallet RPC and verify all blocks with timestamps >= BLOCK_TIME + // were scanned, and no prior blocks were scanned. + { + CWallet wallet; + + JSONRPCRequest request; + request.params.setArray(); + request.params.push_back("wallet.backup"); + ::pwalletMain = &wallet; + ::importwallet(request); + + BOOST_CHECK_EQUAL(wallet.mapWallet.size(), 3); + BOOST_CHECK_EQUAL(coinbaseTxns.size(), 103); + for (size_t i = 0; i < coinbaseTxns.size(); ++i) { + bool found = wallet.GetWalletTx(coinbaseTxns[i].GetHash()); + bool expected = i >= 100; + BOOST_CHECK_EQUAL(found, expected); + } + } + + SetMockTime(0); + ::pwalletMain = pwalletMainBackup; +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index f8f5a9306dc..2697a3769ac 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1545,10 +1545,14 @@ void CWalletTx::GetAccountAmounts(const string& strAccount, CAmount& nReceived, * Scan the block chain (starting in pindexStart) for transactions * from or to us. If fUpdate is true, found transactions that already * exist in the wallet will be updated. + * + * Returns pointer to the first block in the last contiguous range that was + * successfully scanned. + * */ -int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate) +CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate) { - int ret = 0; + CBlockIndex* ret = nullptr; int64_t nNow = GetTime(); const CChainParams& chainParams = Params(); @@ -1568,20 +1572,23 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate) { if (pindex->nHeight % 100 == 0 && dProgressTip - dProgressStart > 0.0) ShowProgress(_("Rescanning..."), std::max(1, std::min(99, (int)((GuessVerificationProgress(chainParams.TxData(), pindex) - dProgressStart) / (dProgressTip - dProgressStart) * 100)))); - - CBlock block; - ReadBlockFromDisk(block, pindex, Params().GetConsensus()); - int posInBlock; - for (posInBlock = 0; posInBlock < (int)block.vtx.size(); posInBlock++) - { - if (AddToWalletIfInvolvingMe(*block.vtx[posInBlock], pindex, posInBlock, fUpdate)) - ret++; - } - pindex = chainActive.Next(pindex); if (GetTime() >= nNow + 60) { nNow = GetTime(); LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, GuessVerificationProgress(chainParams.TxData(), pindex)); } + + CBlock block; + if (ReadBlockFromDisk(block, pindex, Params().GetConsensus())) { + for (size_t posInBlock = 0; posInBlock < block.vtx.size(); ++posInBlock) { + AddToWalletIfInvolvingMe(*block.vtx[posInBlock], pindex, posInBlock, fUpdate); + } + if (!ret) { + ret = pindex; + } + } else { + ret = nullptr; + } + pindex = chainActive.Next(pindex); } ShowProgress(_("Rescanning..."), 100); // hide progress dialog in GUI } @@ -2580,9 +2587,10 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt vector::iterator position = txNew.vout.begin()+nChangePosInOut; txNew.vout.insert(position, newTxOut); } - } - else + } else { reservekey.ReturnKey(); + nChangePosInOut = -1; + } // Fill vin // diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index a7b15a8441c..98e4fb87b91 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -788,7 +788,7 @@ class CWallet : public CCryptoKeyStore, public CValidationInterface bool LoadToWallet(const CWalletTx& wtxIn); void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, int posInBlock) override; bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlockIndex* pIndex, int posInBlock, bool fUpdate); - int ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate = false); + CBlockIndex* ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate = false); void ReacceptWalletTransactions(); void ResendWalletTransactions(int64_t nBestBlockTime, CConnman* connman) override; std::vector ResendWalletTransactionsBefore(int64_t nTime, CConnman* connman);