diff --git a/Makefile.am b/Makefile.am index 1ff38e67f..48548efd9 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/configure.ac b/configure.ac index e2b039ee9..26c9efd1a 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 3) define(_CLIENT_VERSION_MINOR, 14) -define(_CLIENT_VERSION_REVISION, 1) +define(_CLIENT_VERSION_REVISION, 3) define(_CLIENT_VERSION_BUILD, 21) define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2017) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 110bfe03e..33dab9b63 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 fce6bc011..0d6ad25e2 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 3896d2caa..6885e3852 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/init/bitcoind.openrcconf b/contrib/init/bitcoind.openrcconf index 0cbff6d30..f70e25cb5 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 afe902fd7..139c03181 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/depends/packages/miniupnpc.mk b/depends/packages/miniupnpc.mk index e34cf7be2..1bb8cb5d2 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/doc/Doxyfile b/doc/Doxyfile index 2146a0022..a76918df7 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.14.1 +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 d10747180..645289a8a 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,4 +1,4 @@ -Sidechain Elements 0.14.1 +Sidechain Elements 0.14.2 ===================== Setup diff --git a/doc/README_windows.txt b/doc/README_windows.txt index 6bb6d6361..75c536a3b 100644 --- a/doc/README_windows.txt +++ b/doc/README_windows.txt @@ -1,4 +1,4 @@ -Bitcoin Core 0.14.1 +Bitcoin Core 0.14.2 ===================== Intro diff --git a/doc/build-osx.md b/doc/build-osx.md index 95418fb28..6e1bbe491 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 fbad8476e..162153569 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/bitcoin-cli.1 b/doc/man/bitcoin-cli.1 index 844ec40a4..89d70ea5b 100644 --- a/doc/man/bitcoin-cli.1 +++ b/doc/man/bitcoin-cli.1 @@ -1,9 +1,9 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH BITCOIN-CLI "1" "February 2017" "bitcoin-cli v0.14.0.0" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.4. +.TH BITCOIN-CLI "1" "September 2018" "bitcoin-cli v0.14.3.0" "User Commands" .SH NAME -bitcoin-cli \- manual page for bitcoin-cli v0.14.0.0 +bitcoin-cli \- manual page for bitcoin-cli v0.14.3.0 .SH DESCRIPTION -Bitcoin Core RPC client version v0.14.0.0\-dirty +Bitcoin Core RPC client version v0.14.3.0 .SS "Usage:" .TP bitcoin\-cli [options] [params] diff --git a/doc/man/bitcoin-qt.1 b/doc/man/bitcoin-qt.1 index c6fd5afd2..4466aa107 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.47.3. -.TH BITCOIN-QT "1" "February 2017" "bitcoin-qt v0.14.0.0" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.4. +.TH BITCOIN-QT "1" "September 2018" "bitcoin-qt v0.14.3.0" "User Commands" .SH NAME -bitcoin-qt \- manual page for bitcoin-qt v0.14.0.0 +bitcoin-qt \- manual page for bitcoin-qt v0.14.3.0 .SH DESCRIPTION -Bitcoin Core version v0.14.0.0\-dirty (64\-bit) +Bitcoin Core version v0.14.3.0 (64\-bit) Usage: .IP bitcoin\-qt [command\-line options] @@ -46,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 @@ -72,7 +72,7 @@ Extra transactions to keep in memory for compact block reconstructions .HP \fB\-par=\fR .IP -Set the number of script verification threads (\fB\-6\fR to 16, 0 = auto, <0 = +Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 = leave that many cores free, default: 0) .HP \fB\-pid=\fR diff --git a/doc/man/bitcoin-tx.1 b/doc/man/bitcoin-tx.1 index 73d4e4b79..3565f90d0 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.47.3. -.TH BITCOIN-TX "1" "February 2017" "bitcoin-tx v0.14.0.0" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.4. +.TH BITCOIN-TX "1" "September 2018" "bitcoin-tx v0.14.3.0" "User Commands" .SH NAME -bitcoin-tx \- manual page for bitcoin-tx v0.14.0.0 +bitcoin-tx \- manual page for bitcoin-tx v0.14.3.0 .SH DESCRIPTION -Bitcoin Core bitcoin\-tx utility version v0.14.0.0\-dirty +Bitcoin Core bitcoin\-tx utility version v0.14.3.0 .SS "Usage:" .TP bitcoin\-tx [options] [commands] diff --git a/doc/man/bitcoind.1 b/doc/man/bitcoind.1 index f7508a9d9..bff62bf3c 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.47.3. -.TH BITCOIND "1" "February 2017" "bitcoind v0.14.0.0" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.4. +.TH BITCOIND "1" "September 2018" "bitcoind v0.14.3.0" "User Commands" .SH NAME -bitcoind \- manual page for bitcoind v0.14.0.0 +bitcoind \- manual page for bitcoind v0.14.3.0 .SH DESCRIPTION -Bitcoin Core Daemon version v0.14.0.0\-dirty +Bitcoin Core Daemon version v0.14.3.0 .SS "Usage:" .TP bitcoind [options] @@ -51,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 @@ -77,7 +77,7 @@ Extra transactions to keep in memory for compact block reconstructions .HP \fB\-par=\fR .IP -Set the number of script verification threads (\fB\-6\fR to 16, 0 = auto, <0 = +Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 = leave that many cores free, default: 0) .HP \fB\-pid=\fR diff --git a/qa/rpc-tests/bumpfee.py b/qa/rpc-tests/bumpfee.py index 7403264b5..ba71a7807 100755 --- a/qa/rpc-tests/bumpfee.py +++ b/qa/rpc-tests/bumpfee.py @@ -133,7 +133,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): @@ -153,7 +153,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) @@ -164,7 +164,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): @@ -179,7 +179,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): @@ -214,7 +214,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}) @@ -222,7 +222,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}) @@ -273,7 +273,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) @@ -321,9 +321,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 8952029e4..486b3fff2 100755 --- a/qa/rpc-tests/fundrawtransaction.py +++ b/qa/rpc-tests/fundrawtransaction.py @@ -55,6 +55,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) @@ -182,12 +187,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 # @@ -200,12 +200,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 # @@ -219,12 +214,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] @@ -333,12 +323,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 @@ -494,21 +479,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/importprunedfunds.py b/qa/rpc-tests/importprunedfunds.py index 0dee8ad4e..b289f9be5 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/nodehandling.py b/qa/rpc-tests/nodehandling.py index 7313c79b5..61be27ae2 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 3cbde35b6..2f8718ed5 100755 --- a/qa/rpc-tests/p2p-acceptblock.py +++ b/qa/rpc-tests/p2p-acceptblock.py @@ -200,11 +200,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) @@ -228,26 +225,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/prioritise_transaction.py b/qa/rpc-tests/prioritise_transaction.py index 13d7b9b37..7a0e5a0b2 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): return #TODO utxo_count = 90 @@ -140,5 +143,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 023a805a3..3cb95203c 100755 --- a/qa/rpc-tests/pruning.py +++ b/qa/rpc-tests/pruning.py @@ -186,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 @@ -235,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 @@ -267,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) @@ -320,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. @@ -333,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): return #TODO diff --git a/qa/rpc-tests/rawtransactions.py b/qa/rpc-tests/rawtransactions.py index 02a05b28d..75c38ed1c 100755 --- a/qa/rpc-tests/rawtransactions.py +++ b/qa/rpc-tests/rawtransactions.py @@ -57,19 +57,14 @@ def run_test(self): ######################################### # sendrawtransaction with missing input # ######################################### - '''inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'nValue' : "21000000"}] #won't exist + '''inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1}] #won't exists outputs = { self.nodes[0].getnewaddress() : 4.998 } rawtx = self.nodes[2].createrawtransaction(inputs, outputs) rawtx = self.nodes[2].blindrawtransaction(rawtx) 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 # @@ -164,13 +159,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 } @@ -178,13 +173,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/src/Makefile.am b/src/Makefile.am index 70e8077d3..e16e46945 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -492,6 +492,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 bc2711618..bfef18b53 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -91,6 +91,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/checkqueue.h b/src/checkqueue.h index 9faf80b3b..1e58870cd 100644 --- a/src/checkqueue.h +++ b/src/checkqueue.h @@ -126,6 +126,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) {} @@ -158,12 +161,6 @@ class CCheckQueue assert(queue.empty()); } - bool IsIdle() - { - boost::unique_lock lock(mutex); - return (nTotal == nIdle && nTodo == 0 && fAllOk == true); - } - }; /** @@ -174,16 +171,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); } } @@ -206,6 +205,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 59acd5c56..34186a0cb 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -16,7 +16,7 @@ //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 3 #define CLIENT_VERSION_MINOR 14 -#define CLIENT_VERSION_REVISION 1 +#define CLIENT_VERSION_REVISION 2 #define CLIENT_VERSION_BUILD 21 //! Set to true for release, false for prerelease or test build diff --git a/src/merkleblock.cpp b/src/merkleblock.cpp index e3f3e4621..78d7cd600 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 73cbf670e..de4c5c8d2 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/net.cpp b/src/net.cpp index 03c8e5ecc..5bc886c34 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; } diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index be79a6799..5c26baef9 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); diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp index 07eb3a2cd..0ce26df8a 100644 --- a/src/qt/bitcoinstrings.cpp +++ b/src/qt/bitcoinstrings.cpp @@ -9,8 +9,10 @@ #define UNUSED #endif static const char UNUSED *bitcoin_strings[] = { -QT_TRANSLATE_NOOP("bitcoin-core", "Bitcoin Core"), +QT_TRANSLATE_NOOP("bitcoin-core", "Liquid Core"), QT_TRANSLATE_NOOP("bitcoin-core", "The %s developers"), +QT_TRANSLATE_NOOP("bitcoin-core", "Elements Core"), +QT_TRANSLATE_NOOP("bitcoin-core", " This creates a new chain with a different genesis block."), QT_TRANSLATE_NOOP("bitcoin-core", "" "(1 = keep tx meta data e.g. account owner and payment request information, 2 " "= drop tx meta data)"), @@ -43,9 +45,21 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" QT_TRANSLATE_NOOP("bitcoin-core", "" "Cannot obtain a lock on data directory %s. %s is probably already running."), QT_TRANSLATE_NOOP("bitcoin-core", "" +"Change output could not be blinded as there are no blinded inputs and no " +"other blinded outputs."), +QT_TRANSLATE_NOOP("bitcoin-core", "" "Connect only to the specified node(s); -noconnect or -connect=0 alone to " "disable automatic connections"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"Could not locate RPC credentials. No authentication cookie could be found, " +"and no rpcpassword is set in the configuration file (%s)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"Could not locate mainchain RPC credentials. No authentication cookie could " +"be found, and no mainchainrpcpassword is set in the configuration file (%s)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"Could not locate mainchain RPC credentials. No authentication cookie could " +"be found, and no mainchainrpcuser is set in the configuration file"), +QT_TRANSLATE_NOOP("bitcoin-core", "" "Create new files with system default permissions, instead of umask 077 (only " "effective with disabled wallet functionality)"), QT_TRANSLATE_NOOP("bitcoin-core", "" @@ -60,6 +74,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" QT_TRANSLATE_NOOP("bitcoin-core", "" "Do not keep transactions in the mempool longer than hours (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"ERROR: liquidd is set to verify pegins but cannot get valid response from " +"bitcoind. Please check debug.log for more information."), +QT_TRANSLATE_NOOP("bitcoin-core", "" "Equivalent bytes per sigop in transactions for relay and mining (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "" "Error loading %s: You can't enable HD on a already existing non-HD wallet"), @@ -99,8 +116,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "confirmation on average within n blocks (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "" "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)"), +"potentially skip their script verification (0 to verify all, default: %s)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"Incorrect or no genesis block found. Wrong `-fedpegscript`, `-" +"signblockscript`, or datadir for network?"), QT_TRANSLATE_NOOP("bitcoin-core", "" "Invalid amount for -maxtxfee=: '%s' (must be at least the minrelay " "fee of %s to prevent stuck transactions)"), @@ -164,11 +183,33 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" QT_TRANSLATE_NOOP("bitcoin-core", "" "Support filtering of blocks and transaction with bloom filters (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"The 4-byte prefix, in hex, of the chain's base58 extended public key " +"encoding. (default: %s)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" "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"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"The byte prefix, in decimal, of the chain's base58 pubkey address. (default: " +"%d)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"The byte prefix, in decimal, of the chain's base58 script address. (default: " +"%d)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"The byte prefix, in decimal, of the chain's base58 secret key encoding. " +"(default: %d)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"The byte prefix, in decimal, of the parent chain's base58 pubkey address. " +"(default: %d)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"The byte prefix, in decimal, of the parent chain's base58 script address. " +"(default: %d)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"The interval in seconds at which a peg-in witness failing block is re-" +"evaluated in case of intermittant peg-in witness failure. 0 means never. " +"(default: %u)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" "The transaction amount is too small to send after the fee has been deducted"), QT_TRANSLATE_NOOP("bitcoin-core", "" "This is a pre-release test build - use at your own risk - do not use for " @@ -183,6 +224,13 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "Total length of network version string (%i) exceeds maximum length (%i). " "Reduce the number or size of uacomments."), QT_TRANSLATE_NOOP("bitcoin-core", "" +"Transaction blinding failed. One possible reason is you have over 150 " +"inputs, which can cause transaction blinding failure in remote cases. Try " +"sending fewer assets at a single time, or spend fewer inputs."), +QT_TRANSLATE_NOOP("bitcoin-core", "" +"Transaction output could not be blinded as there are no blinded inputs and " +"no other blinded outputs."), +QT_TRANSLATE_NOOP("bitcoin-core", "" "Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = " "no limit (default: %d)"), QT_TRANSLATE_NOOP("bitcoin-core", "" @@ -209,6 +257,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "rpcuser=/rpcpassword= pair of arguments. This option can " "be specified multiple times"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"Wallet does not support more than one type of fee at a time, therefore can " +"not subtract fee from address amount, which is of a different asset id. fee " +"asset: %s recipient asset: %s"), +QT_TRANSLATE_NOOP("bitcoin-core", "" "Wallet will not create transactions that violate mempool chain limits " "(default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "" @@ -247,16 +299,18 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Add a node to connect to and attempt to keep QT_TRANSLATE_NOOP("bitcoin-core", "Allow DNS lookups for -addnode, -seednode and -connect"), QT_TRANSLATE_NOOP("bitcoin-core", "Always query for peer addresses via DNS lookup (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Append comment to the user agent string"), +QT_TRANSLATE_NOOP("bitcoin-core", "Asset ID (hex) for mempool/relay fees (default: %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to recover private keys from a corrupt wallet on startup"), QT_TRANSLATE_NOOP("bitcoin-core", "Automatically create Tor hidden service (default: %d)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Blind transaction outputs"), +QT_TRANSLATE_NOOP("bitcoin-core", "Awaiting bitcoind RPC warmup"), QT_TRANSLATE_NOOP("bitcoin-core", "Block creation options:"), QT_TRANSLATE_NOOP("bitcoin-core", "Cannot downgrade wallet"), QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -%s address: '%s'"), QT_TRANSLATE_NOOP("bitcoin-core", "Cannot write default address"), QT_TRANSLATE_NOOP("bitcoin-core", "Chain selection options:"), +QT_TRANSLATE_NOOP("bitcoin-core", "Change chain to be signed and validated with a different script."), +QT_TRANSLATE_NOOP("bitcoin-core", "Change federated peg to use a different script."), QT_TRANSLATE_NOOP("bitcoin-core", "Change index out of range"), -QT_TRANSLATE_NOOP("bitcoin-core", "Chain selection options:"), QT_TRANSLATE_NOOP("bitcoin-core", "Connect through SOCKS5 proxy"), QT_TRANSLATE_NOOP("bitcoin-core", "Connect to a node to retrieve peer addresses, and disconnect"), QT_TRANSLATE_NOOP("bitcoin-core", "Connection options:"), @@ -266,14 +320,13 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Debugging/Testing options:"), QT_TRANSLATE_NOOP("bitcoin-core", "Do not load the wallet and disable wallet RPC calls"), QT_TRANSLATE_NOOP("bitcoin-core", "Do you want to rebuild the block database now?"), QT_TRANSLATE_NOOP("bitcoin-core", "Done loading"), -QT_TRANSLATE_NOOP("bitcoin-core", "Elements Daemon"), -QT_TRANSLATE_NOOP("bitcoin-core", "Elements RPC client version"), -QT_TRANSLATE_NOOP("bitcoin-core", "Elements bitcoin-tx utility version"), +QT_TRANSLATE_NOOP("bitcoin-core", "ERROR: Invalid PAK entries given in conf file."), +QT_TRANSLATE_NOOP("bitcoin-core", "ERROR: Read invalid PAK list."), QT_TRANSLATE_NOOP("bitcoin-core", "Enable publish hash block in
"), QT_TRANSLATE_NOOP("bitcoin-core", "Enable publish hash transaction in
"), QT_TRANSLATE_NOOP("bitcoin-core", "Enable publish raw block in
"), QT_TRANSLATE_NOOP("bitcoin-core", "Enable publish raw transaction in
"), -QT_TRANSLATE_NOOP("bitcoin-core", "Enable transaction replacement in the memory pool (default: %u)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Equivalent to -chain=%s"), QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing block database"), QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing wallet database environment %s!"), QT_TRANSLATE_NOOP("bitcoin-core", "Error loading %s"), @@ -287,12 +340,12 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error"), QT_TRANSLATE_NOOP("bitcoin-core", "Error: A fatal internal error occurred, see debug.log for details"), QT_TRANSLATE_NOOP("bitcoin-core", "Error: Disk space is low!"), QT_TRANSLATE_NOOP("bitcoin-core", "Failed to listen on any port. Use -listen=0 if you want this."), +QT_TRANSLATE_NOOP("bitcoin-core", "Federated peg options:"), QT_TRANSLATE_NOOP("bitcoin-core", "Fee (in %s/kB) to add to transactions you send (default: %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "How many blocks to check at startup (default: %u, 0 = all)"), QT_TRANSLATE_NOOP("bitcoin-core", "Importing..."), QT_TRANSLATE_NOOP("bitcoin-core", "Imports blocks from external blk000??.dat file on startup"), QT_TRANSLATE_NOOP("bitcoin-core", "Include IP addresses in debug output (default: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Incorrect or no genesis block found. Wrong datadir for network?"), QT_TRANSLATE_NOOP("bitcoin-core", "Information"), QT_TRANSLATE_NOOP("bitcoin-core", "Initialization sanity check failed. %s is shutting down."), QT_TRANSLATE_NOOP("bitcoin-core", "Insufficient funds"), @@ -305,8 +358,8 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Invalid netmask specified in -whitelist: '%s' QT_TRANSLATE_NOOP("bitcoin-core", "Keep at most unconnectable transactions in memory (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Keep the transaction memory pool below megabytes (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Keypool ran out, please call keypoolrefill first"), -QT_TRANSLATE_NOOP("bitcoin-core", "Listen for JSON-RPC connections on (default: %u or testnet: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Listen for connections on (default: %u or testnet: %u)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Listen for JSON-RPC connections on (default: %u)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Listen for connections on (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Loading addresses..."), QT_TRANSLATE_NOOP("bitcoin-core", "Loading banlist..."), QT_TRANSLATE_NOOP("bitcoin-core", "Loading block index..."), @@ -322,6 +375,8 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Not enough file descriptors available."), QT_TRANSLATE_NOOP("bitcoin-core", "Only connect to nodes in network (ipv4, ipv6 or onion)"), QT_TRANSLATE_NOOP("bitcoin-core", "Options:"), QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections"), +QT_TRANSLATE_NOOP("bitcoin-core", "Pegin claims must be this deep to be considered valid. (default: %d)"), +QT_TRANSLATE_NOOP("bitcoin-core", "Pre-funded amounts must be non-blinded"), QT_TRANSLATE_NOOP("bitcoin-core", "Prepend debug output with timestamp (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Print this help message and exit"), QT_TRANSLATE_NOOP("bitcoin-core", "Print version and exit"), @@ -340,7 +395,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Rewinding blocks..."), QT_TRANSLATE_NOOP("bitcoin-core", "Run in the background as a daemon and accept commands"), QT_TRANSLATE_NOOP("bitcoin-core", "Send trace/debug info to console instead of debug.log file"), QT_TRANSLATE_NOOP("bitcoin-core", "Send transactions as zero-fee transactions if possible (default: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Send transactions with full-RBF opt-in enabled (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set database cache size in megabytes (%d to %d, default: %d)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set key pool size to (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set maximum BIP141 block weight (default: %d)"), @@ -358,9 +412,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Specify your own public address"), QT_TRANSLATE_NOOP("bitcoin-core", "Spend unconfirmed change when sending transactions (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Starting network threads..."), QT_TRANSLATE_NOOP("bitcoin-core", "The source code is available from %s."), -QT_TRANSLATE_NOOP("bitcoin-core", "Start Elements Daemon"), QT_TRANSLATE_NOOP("bitcoin-core", "The transaction amount is too small to pay the fee"), QT_TRANSLATE_NOOP("bitcoin-core", "The wallet will avoid paying less than the minimum relay fee."), +QT_TRANSLATE_NOOP("bitcoin-core", "This creates a new chain with a different genesis block."), QT_TRANSLATE_NOOP("bitcoin-core", "This is experimental software."), QT_TRANSLATE_NOOP("bitcoin-core", "This is the minimum transaction fee you pay on every transaction."), QT_TRANSLATE_NOOP("bitcoin-core", "This is the transaction fee you will pay if you send a transaction."), @@ -375,6 +429,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large for fee policy"), QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large"), QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer (bind returned error %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer. %s is probably already running."), +QT_TRANSLATE_NOOP("bitcoin-core", "Unable to blind the transaction properly. This should not happen."), QT_TRANSLATE_NOOP("bitcoin-core", "Unable to start HTTP server. See debug log for details."), QT_TRANSLATE_NOOP("bitcoin-core", "Unknown network specified in -onlynet: '%s'"), QT_TRANSLATE_NOOP("bitcoin-core", "Unsupported argument -benchmark ignored, use -debug=bench."), @@ -382,9 +437,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Unsupported argument -debugnet ignored, use - QT_TRANSLATE_NOOP("bitcoin-core", "Unsupported argument -tor found, use -onion."), QT_TRANSLATE_NOOP("bitcoin-core", "Upgrade wallet to latest format on startup"), QT_TRANSLATE_NOOP("bitcoin-core", "Use UPnP to map the listening port (default: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Use the test chain"), +QT_TRANSLATE_NOOP("bitcoin-core", "Use the chain (default: %s). Anything except main is allowed"), QT_TRANSLATE_NOOP("bitcoin-core", "User Agent comment (%s) contains unsafe characters."), QT_TRANSLATE_NOOP("bitcoin-core", "Username for JSON-RPC connections"), +QT_TRANSLATE_NOOP("bitcoin-core", "Validate pegin claims. All functionaries must run this. (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Verifying blocks..."), QT_TRANSLATE_NOOP("bitcoin-core", "Verifying wallet..."), QT_TRANSLATE_NOOP("bitcoin-core", "Wallet %s resides outside data directory %s"), @@ -396,4 +452,5 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Warning: unknown new rules activated (version QT_TRANSLATE_NOOP("bitcoin-core", "Whether to operate in a blocks only mode (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "Zapping all transactions from wallet..."), QT_TRANSLATE_NOOP("bitcoin-core", "ZeroMQ notification options:"), +QT_TRANSLATE_NOOP("bitcoin-core", "change position argument has been disabled"), }; diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index 76896e1cd..02d38392e 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 2c10e633b..4c92e2144 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 ca8ecffaf..f13b0d9cf 100644 --- a/src/qt/forms/sendcoinsdialog.ui +++ b/src/qt/forms/sendcoinsdialog.ui @@ -759,11 +759,33 @@ + + + + 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 9726987b6..032d5cca4 100644 --- a/src/qt/locale/bitcoin_af.ts +++ b/src/qt/locale/bitcoin_af.ts @@ -73,6 +73,10 @@ &Copy Address &Dupliseer Adres + + Copy &Label + Kopieer &Etiket + &Edit &Verander @@ -199,6 +203,14 @@ The passphrase entered for the wallet decryption was incorrect. 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! @@ -206,6 +218,10 @@ BanTableModel + + IP/Netmask + IP/Netmasker + Banned Until Verban tot @@ -213,6 +229,10 @@ BitcoinGUI + + Sign &message... + Teken &boodskap... + Synchronizing with network... Netwerk-sinkronisasie... @@ -293,6 +313,18 @@ Open &URI... 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... @@ -309,6 +341,14 @@ Change the passphrase used for wallet encryption 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_da.ts b/src/qt/locale/bitcoin_da.ts index 235b48f85..bc3fcb278 100644 --- a/src/qt/locale/bitcoin_da.ts +++ b/src/qt/locale/bitcoin_da.ts @@ -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 9bc94cc8d..1a6c9cc4b 100644 --- a/src/qt/locale/bitcoin_de.ts +++ b/src/qt/locale/bitcoin_de.ts @@ -43,7 +43,7 @@ Choose the address to send coins to - Wählen Sie die Adresse aus, an die Sie Bitcoins senden möchten + Wählen Sie die Adresse aus, an die Sie Bitcoins überweisen möchten Choose the address to receive coins with @@ -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) diff --git a/src/qt/locale/bitcoin_el_GR.ts b/src/qt/locale/bitcoin_el_GR.ts index 21f308e80..5c72b4d15 100644 --- a/src/qt/locale/bitcoin_el_GR.ts +++ b/src/qt/locale/bitcoin_el_GR.ts @@ -41,6 +41,14 @@ &Delete &Διαγραφή + + Choose the address to send coins to + Επιλέξτε διεύθυνση αποστολής των νομισμάτων σας + + + Choose the address to receive coins with + Επιλέξτε διεύθυνση παραλαβής νομισμάτων + Sending addresses Διευθύνσεις αποστολής @@ -49,10 +57,42 @@ Receiving addresses Διευθύνσεις λήψης + + &Copy Address + &Αντιγραφή Διεύθυνσης + + + Copy &Label + Αντιγραφή&Ετικέτα + + + &Edit + &Διόρθωση + + + Export Address List + Εξαγωγή Λίστας Διεύθυνσεων + + + Exporting Failed + Αποτυχία Εξαγωγής + AddressTableModel - + + Label + Ετικέτα + + + Address + Διεύθυνση + + + (no label) + (χωρίς ετικέτα) + + AskPassphraseDialog @@ -75,6 +115,14 @@ Unlock wallet Ξεκλειδωσε το πορτοφολι + + Change passphrase + Αλλάξτε Φράση Πρόσβασης + + + Wallet unlock failed + Το Ξεκλείδωμα του Πορτοφολιού Απέτυχε + BanTableModel @@ -406,6 +454,26 @@ Confirmed Επικυρωμένες + + Copy address + Αντιγραφή διεύθυνσης + + + Copy label + Αντιγραφή ετικέτας + + + Copy amount + Αντιγραφή ποσού + + + Copy transaction ID + Αντιγραφή ταυτότητας συναλλαγής + + + (no label) + (χωρίς ετικέτα) + EditAddressDialog @@ -429,6 +497,18 @@ &Address &Διεύθυνση + + New receiving address + Νέα Διεύθυνση Λήψης + + + New sending address + Νέα Διεύθυνση Αποστολής + + + Edit receiving address + Διόρθωση Διεύθυνσης Λήψης + FreespaceChecker @@ -1076,7 +1156,15 @@ Remove Αφαίρεση - + + Copy label + Αντιγραφή ετικέτας + + + Copy amount + Αντιγραφή ποσού + + ReceiveRequestDialog @@ -1095,9 +1183,29 @@ &Save Image... &Αποθήκευση εικόνας... + + Address + Διεύθυνση + + + Label + Ετικέτα + RecentRequestsTableModel + + Date + Ημερομήνια + + + Label + Ετικέτα + + + (no label) + (χωρίς ετικέτα) + SendCoinsDialog @@ -1221,7 +1329,15 @@ S&end Αποστολη - + + Copy amount + Αντιγραφή ποσού + + + (no label) + (χωρίς ετικέτα) + + SendCoinsEntry @@ -1386,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 @@ -1396,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 a476b5659..6a2316e89 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 @@ -870,7 +870,7 @@ - + (no label) @@ -1601,7 +1601,7 @@ PaymentServer - + @@ -1755,12 +1755,12 @@ Amount - + Enter a Bitcoin address (e.g. %1) - + %1 d @@ -2030,7 +2030,7 @@ - + Select a peer to view detailed information. @@ -2533,7 +2533,7 @@ SendCoinsDialog - + Send Coins Send Coins @@ -2608,7 +2608,17 @@ - + + 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. + + + + + Warning: Fee estimation is currently not possible. + + + + collapse fee-settings @@ -2685,12 +2695,12 @@ - + Dust: - + Confirmation time target: @@ -2841,7 +2851,7 @@ - + Estimated to begin confirmation within %n block(s). Estimated to begin confirmation within %n block. @@ -2849,7 +2859,7 @@ - + Warning: Invalid Bitcoin address @@ -3187,14 +3197,6 @@ - - SplashScreen - - - [testnet] - [testnet] - - TrafficGraphWidget @@ -3294,49 +3296,49 @@ - + From - + unknown - + To - + own address - + watch-only - + label - + - + Credit - + matures in %n more block(s) matures in %n more block @@ -3349,7 +3351,7 @@ - + Debit @@ -3428,11 +3430,6 @@ - Amount - Amount - - - true @@ -3816,7 +3813,7 @@ WalletModel - + Send Coins Send Coins @@ -3867,52 +3864,52 @@ bitcoin-core - + Options: Options: - + Specify data directory Specify data directory - + Connect to a node to retrieve peer addresses, and disconnect Connect to a node to retrieve peer addresses, and disconnect - + Specify your own public address Specify your own public address - + Accept command line and JSON-RPC commands Accept command line and JSON-RPC commands - + Accept connections from outside (default: 1 if no -proxy or -connect/-noconnect) - + Connect only to the specified node(s); -noconnect or -connect=0 alone to disable automatic connections - + Distributed under the MIT software license, see the accompanying file %s or %s - + If <category> is not supplied or if <category> = 1, output all debugging information. - + Prune configured below the minimum of %d MiB. Please use a higher number. @@ -3927,17 +3924,17 @@ - + Error: A fatal internal error occurred, see debug.log for details - + Fee (in %s/kB) to add to transactions you send (default: %s) - + Pruning blockstore... @@ -3947,22 +3944,17 @@ Run in the background as a daemon and accept commands - + Unable to start HTTP server. See debug log for details. - - Bitcoin Core - Bitcoin Core - - - + The %s developers - + A fee rate (in %s/kB) that will be used when fee estimation has insufficient data (default: %s) @@ -3982,12 +3974,12 @@ - + Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup - + Error loading %s: You can't enable HD on a already existing non-HD wallet @@ -4007,12 +3999,7 @@ - - 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) - - - - + 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) @@ -4047,17 +4034,17 @@ - + 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 - + 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 @@ -4072,7 +4059,7 @@ - + Wallet will not create transactions that violate mempool chain limits (default: %u) @@ -4112,12 +4099,12 @@ - + Attempt to recover private keys from a corrupt wallet on startup - + Block creation options: Block creation options: @@ -4132,7 +4119,7 @@ - + Change index out of range @@ -4167,7 +4154,7 @@ Do you want to rebuild the block database now? - + Enable publish hash block in <address> @@ -4187,12 +4174,7 @@ - - Enable transaction replacement in the memory pool (default: %u) - - - - + Error initializing block database Error initializing block database @@ -4242,17 +4224,12 @@ Failed to listen on any port. Use -listen=0 if you want this. - + Importing... - - Incorrect or no genesis block found. Wrong datadir for network? - Incorrect or no genesis block found. Wrong datadir for network? - - - + Initialization sanity check failed. %s is shutting down. @@ -4297,7 +4274,7 @@ - + Print this help message and exit @@ -4332,7 +4309,7 @@ - + Set database cache size in megabytes (%d to %d, default: %d) @@ -4352,12 +4329,12 @@ - + Unable to bind to %s on this computer. %s is probably already running. - + Unsupported argument -benchmark ignored, use -debug=bench. @@ -4377,17 +4354,12 @@ - - Use the test chain - - - - + User Agent comment (%s) contains unsafe characters. - + Verifying blocks... Verifying blocks... @@ -4417,12 +4389,27 @@ - + Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times - + + Liquid Core + + + + + Elements Core + + + + + This creates a new chain with a different genesis block. + + + + Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6 @@ -4432,7 +4419,27 @@ - + + Change output could not be blinded as there are no blinded inputs and no other blinded outputs. + + + + + Could not locate RPC credentials. No authentication cookie could be found, and no rpcpassword is set in the configuration file (%s) + + + + + Could not locate mainchain RPC credentials. No authentication cookie could be found, and no mainchainrpcpassword is set in the configuration file (%s) + + + + + Could not locate mainchain RPC credentials. No authentication cookie could be found, and no mainchainrpcuser is set in the configuration file + + + + Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -4442,7 +4449,12 @@ - + + ERROR: liquidd is set to verify pegins but cannot get valid response from bitcoind. Please check debug.log for more information. + + + + Error: Listening for incoming connections failed (listen returned error %s) @@ -4462,7 +4474,17 @@ - + + 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) + + + + + Incorrect or no genesis block found. Wrong `-fedpegscript`, `-signblockscript`, or datadir for network? + + + + Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions) @@ -4482,17 +4504,67 @@ - + + The 4-byte prefix, in hex, of the chain's base58 extended public key encoding. (default: %s) + + + + + The byte prefix, in decimal, of the chain's base58 pubkey address. (default: %d) + + + + + The byte prefix, in decimal, of the chain's base58 script address. (default: %d) + + + + + The byte prefix, in decimal, of the chain's base58 secret key encoding. (default: %d) + + + + + The byte prefix, in decimal, of the parent chain's base58 pubkey address. (default: %d) + + + + + The byte prefix, in decimal, of the parent chain's base58 script address. (default: %d) + + + + + The interval in seconds at which a peg-in witness failing block is re-evaluated in case of intermittant peg-in witness failure. 0 means never. (default: %u) + + + + The transaction amount is too small to send after the fee has been deducted - + + Transaction blinding failed. One possible reason is you have over 150 inputs, which can cause transaction blinding failure in remote cases. Try sending fewer assets at a single time, or spend fewer inputs. + + + + + Transaction output could not be blinded as there are no blinded inputs and no other blinded outputs. + + + + Use hierarchical deterministic key generation (HD) after BIP32. Only has effect during wallet creation/first start - + + Wallet does not support more than one type of fee at a time, therefore can not subtract fee from address amount, which is of a different asset id. fee asset: %s recipient asset: %s + + + + 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 @@ -4512,27 +4584,67 @@ - + + Asset ID (hex) for mempool/relay fees (default: %s) + + + + Automatically create Tor hidden service (default: %d) - + + Awaiting bitcoind RPC warmup + + + + + Change chain to be signed and validated with a different script. + + + + + Change federated peg to use a different script. + + + + Connect through SOCKS5 proxy - + + ERROR: Invalid PAK entries given in conf file. + + + + + ERROR: Read invalid PAK list. + + + + + Equivalent to -chain=%s + + + + Error reading from database, shutting down. - + + Federated peg options: + + + + Imports blocks from external blk000??.dat file on startup - + Information Information @@ -4552,7 +4664,17 @@ - + + Listen for JSON-RPC connections on <port> (default: %u) + + + + + Listen for connections on <port> (default: %u) + + + + Need to specify a port with -whitebind: '%s' @@ -4562,7 +4684,17 @@ - + + Pegin claims must be this deep to be considered valid. (default: %d) + + + + + Pre-funded amounts must be non-blinded + + + + RPC server options: @@ -4587,7 +4719,7 @@ - + Show all debugging options (usage: --help -help-debug) @@ -4608,6 +4740,11 @@ + This creates a new chain with a different genesis block. + + + + This is experimental software. @@ -4642,15 +4779,30 @@ - + + Unable to blind the transaction properly. This should not happen. + + + + Upgrade wallet to latest format on startup - + + Use the chain <chain> (default: %s). Anything except main is allowed + + + + Username for JSON-RPC connections Username for JSON-RPC connections + + + Validate pegin claims. All functionaries must run this. (default: %u) + + Warning @@ -4677,27 +4829,32 @@ - + + change position argument has been disabled + + + + Password for JSON-RPC connections Password for JSON-RPC connections - + Execute command when the best block changes (%s in cmd is replaced by block hash) Execute command when the best block changes (%s in cmd is replaced by block hash) - + Allow DNS lookups for -addnode, -seednode and -connect Allow DNS lookups for -addnode, -seednode and -connect - + Loading addresses... Loading addresses... - + (1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data) @@ -4707,12 +4864,12 @@ - + Do not keep transactions in the mempool longer than <n> hours (default: %u) - + Equivalent bytes per sigop in transactions for relay and mining (default: %u) @@ -4732,7 +4889,7 @@ - + Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u) @@ -4762,7 +4919,7 @@ - + This is the transaction fee you may pay when fee estimates are not available. @@ -4777,7 +4934,7 @@ - + Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d) @@ -4797,7 +4954,7 @@ - + Warning: Unknown block versions being mined! It's possible unknown rules are in effect @@ -4827,7 +4984,7 @@ - + How many blocks to check at startup (default: %u, 0 = all) @@ -4837,7 +4994,7 @@ - + Invalid -proxy address: '%s' Invalid -proxy address: '%s' @@ -4847,17 +5004,7 @@ - - Listen for JSON-RPC connections on <port> (default: %u or testnet: %u) - - - - - Listen for connections on <port> (default: %u or testnet: %u) - - - - + Maintain at most <n> connections to peers (default: %u) @@ -4877,7 +5024,7 @@ - + Prepend debug output with timestamp (default: %u) @@ -4892,12 +5039,7 @@ - - Send transactions with full-RBF opt-in enabled (default: %u) - - - - + Set key pool size to <n> (default: %u) @@ -4942,7 +5084,7 @@ - + This is the minimum transaction fee you pay on every transaction. @@ -4972,12 +5114,12 @@ - + Unknown network specified in -onlynet: '%s' Unknown network specified in -onlynet: '%s' - + Insufficient funds Insufficient funds @@ -4987,17 +5129,17 @@ Loading block index... - + Add a node to connect to and attempt to keep the connection open Add a node to connect to and attempt to keep the connection open - + Loading wallet... Loading wallet... - + Cannot downgrade wallet Cannot downgrade wallet @@ -5007,17 +5149,17 @@ Cannot write default address - + Rescanning... Rescanning... - + Done loading Done loading - + Error Error diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts index b83afb861..c9aa1b562 100644 --- a/src/qt/locale/bitcoin_fa.ts +++ b/src/qt/locale/bitcoin_fa.ts @@ -61,6 +61,14 @@ Receiving addresses آدرس های گیرنده + + 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 @@ -107,10 +123,18 @@ 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 رمزگشایی کیف پول @@ -119,6 +143,10 @@ Change passphrase تغییر گذرواژه + + Enter the old passphrase and new passphrase to the wallet. + عبارت کهنه و جدید کیف پول را وارد کنید. + Confirm wallet encryption تأیید رمزنگاری کیف پول @@ -253,6 +281,18 @@ Open &URI... باز کردن &آدرس + + Click to disable network activity. + برای غیر فعال کردن فعالیت شبکه کلیک کنید. + + + Network activity disabled. + فعالیت شبکه غیر فعال شد. + + + Click to enable network activity again. + برای فعال کردن دوباره فعالیت شبکه کلیک کنید. + Reindexing blocks on disk... بازنشانی بلوک‌ها روی دیسک... @@ -542,6 +582,14 @@ Copy fee رونوشت کارمزد + + Copy bytes + کپی کردن بایت ها + + + Copy change + کپی کردن تغییر + (%1 locked) (%1 قفل شده) @@ -717,6 +765,22 @@ Last block time زمان آخرین بلوک + + Progress + پیشروی + + + Progress increase per hour + پیشروی در هر ساعت بیشتر میشود + + + calculating... + در حال محاسبه... + + + Estimated time left until synced + زمان تخمینی تا سینک شدن + Hide پنهان کردن @@ -937,6 +1001,10 @@ PaymentServer + + Invalid payment request. + درخواست پرداخت نامعتبر. + PeerTableModel @@ -1100,6 +1168,10 @@ In: در: + + Out: + خروجی: + Debug log file فایلِ لاگِ اشکال زدایی @@ -1108,6 +1180,26 @@ Clear console پاکسازی کنسول + + 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> برای پاک کردن صفحه. @@ -1348,6 +1440,14 @@ Copy fee رونوشت کارمزد + + Copy bytes + کپی کردن بایت ها + + + Copy change + کپی کردن تغییر + (no label) (بدون برچسب) @@ -1558,6 +1658,10 @@ Address آدرس + + Exporting Failed + صدور موفق نبود + UnitDisplayStatusBarControl diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts index 883bb4f8d..cb62a02a5 100644 --- a/src/qt/locale/bitcoin_fr.ts +++ b/src/qt/locale/bitcoin_fr.ts @@ -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_id_ID.ts b/src/qt/locale/bitcoin_id_ID.ts index fd77f07cd..2fba8233d 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 @@ -113,6 +265,14 @@ Quit application Keluar dari aplikasi + + &About %1 + &Tentang%1 + + + Show information about %1 + Tampilkan informasi perihal %1 + About &Qt Mengenai &Qt @@ -125,6 +285,10 @@ &Options... &Pilihan... + + Modify configuration options for %1 + Pengubahan opsi konfigurasi untuk %1 + &Encrypt Wallet... &Enkripsi Dompet... @@ -149,6 +313,22 @@ Open &URI... 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. @@ -285,6 +473,18 @@ Up to date 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 @@ -1084,13 +1304,29 @@ &Save Image... &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 b8c89c51a..d171ffac2 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 @@ -179,10 +179,22 @@ Wallet encrypted 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 @@ -622,10 +646,22 @@ 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) @@ -653,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 @@ -781,6 +849,10 @@ Form Modulo + + Number of blocks left + Numero di blocchi mancanti + Unknown... Sconosciuto... @@ -789,6 +861,10 @@ Last block time Ora del blocco più recente + + Progress + Progresso + Hide Nascondi @@ -812,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 @@ -1126,15 +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 @@ -1226,6 +1378,18 @@ Per specificare più URL separarli con una barra verticale "|". QRImageWidget + + &Save Image... + &Salva immagine + + + &Copy Image + &Copia immagine + + + Save QR Code + Salva codice QR + PNG Image (*.png) Immagine PNG (*.png) @@ -1449,6 +1613,10 @@ Per specificare più URL separarli con una barra verticale "|". 1 &year 1 &anno + + &Disconnect + &Disconnetti + Welcome to the %1 RPC console. Benvenuto nella console RPC di %1. @@ -1615,6 +1783,14 @@ Per specificare più URL separarli con una barra verticale "|". &Save Image... &Salva Immagine... + + Request payment to %1 + Richiesta di pagamento a %1 + + + Payment information + Informazioni di pagamento + URI URI @@ -1841,6 +2017,26 @@ Per specificare più URL separarli con una barra verticale "|". %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. @@ -2114,6 +2310,22 @@ Per specificare più URL separarli con una barra verticale "|". %1/offline %1/offline + + 0/unconfirmed, %1 + 0/non confermati, %1 + + + abandoned + abbandonato + + + %1/unconfirmed + %1/non confermato + + + %1 confirmations + %1 conferme + Status Stato diff --git a/src/qt/locale/bitcoin_ko_KR.ts b/src/qt/locale/bitcoin_ko_KR.ts index 9b5c1c077..c104bdd0d 100644 --- a/src/qt/locale/bitcoin_ko_KR.ts +++ b/src/qt/locale/bitcoin_ko_KR.ts @@ -317,6 +317,22 @@ Open &URI... &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 @@ -469,6 +485,10 @@ %1 client %1 클라이언트 + + Connecting to peers... + 피어에 연결중... + Catching up... 블록 따라잡기... @@ -511,15 +531,27 @@ Incoming transaction 들어오고 있는 거래 + + 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 @@ -650,6 +682,10 @@ no 아니요 + + 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 @@ -849,15 +885,51 @@ Form 유형 + + 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 @@ -1424,13 +1636,17 @@ Ping Wait Ping 대기 + + Min Ping + 최소 핑 + Time Offset 시간 오프셋 Last block time - 최종 블럭 시각 + 최종 블록 시각 &Open @@ -1484,6 +1700,18 @@ 1 &year 1년(&Y) + + &Disconnect + 접속 끊기(&D) + + + Ban for + 추방 + + + &Unban + 노드 추방 취소(&U) + Welcome to the %1 RPC console. %1 RPC 콘솔에 오신걸 환영합니다 @@ -1496,6 +1724,14 @@ Type <b>help</b> for an overview of available commands. 사용할 수 있는 명령을 둘러보려면 <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 바이트 @@ -1615,10 +1851,18 @@ Remove 삭제 + + Copy URI + URI 복사 + Copy label 라벨 복사 + + Copy message + 메시지 복사 + Copy amount 거래액 복사 @@ -1642,15 +1886,43 @@ &Save Image... 이미지 저장(&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 @@ -1661,11 +1933,27 @@ Label 라벨 + + 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 @@ -1792,6 +2080,10 @@ Dust: 더스트: + + Confirmation time target: + 승인 시간 목표: + Clear &All 모두 지우기(&A) @@ -1836,6 +2128,94 @@ Copy change 잔돈 복사 + + %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,21 +2675,137 @@ 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 받은 주소 @@ -2086,9 +2814,29 @@ Sent to 보낸 주소 + + 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 @@ -2261,6 +3009,18 @@ Accept command line and JSON-RPC commands 명령줄과 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. @@ -2349,6 +3117,10 @@ Please contribute if you find %s useful. Visit %s for further information about the software. %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) @@ -2357,6 +3129,10 @@ 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 블록 데이터베이스에 미래의 블록이 포함되어 있습니다. 이것은 사용자의 컴퓨터의 날짜와 시간이 올바르게 설정되어 있지 않을때 나타날 수 있습니다. 만약 사용자의 컴퓨터의 날짜와 시간이 올바르다고 확신할 때에만 블록 데이터 베이스의 재구성을 하십시오 + + 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 데이터베이스를 포크 전 상태로 돌리지 못했습니다. 블록체인을 다시 다운로드 해주십시오. @@ -2365,9 +3141,25 @@ Use UPnP to map the listening port (default: 1 when listening and no -proxy) 리슨(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 @@ -2397,6 +3189,14 @@ Cannot resolve -%s address: '%s' %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... @@ -2589,6 +3389,10 @@ Use UPnP to map the listening port (default: %u) 리슨(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) @@ -2673,9 +3477,13 @@ The transaction amount is too small to send after the fee has been deducted 거래액이 수수료를 지불하기엔 너무 작습니다 + + 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) @@ -2865,9 +3681,25 @@ Output debugging information (default: %u, supplying <category> is optional) 디버그 정보 출력 (기본값: %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. @@ -2901,6 +3733,10 @@ 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. 설정된 IP주소 (보기 1.2.3.4) 혹은 CIDR로 작성된 네트워크 (보기 1.2.3.0/24)로 화이트리스트에 포함된 피어에 접속합니다. 이 설정은 복수로 지정 할 수 있습니다. + + %s is set very high! + %s가 매우 높게 설정되었습니다! + (default: %s) (기본값: %s) @@ -2921,6 +3757,10 @@ Invalid -proxy address: '%s' 잘못된 -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,16 +3791,24 @@ 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_ne.ts b/src/qt/locale/bitcoin_ne.ts index f7fb0e5a6..be6e8e039 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,13 +344,25 @@ 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,9 +427,22 @@ 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 2b625b5a0..e523e8328 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 @@ -317,6 +317,22 @@ Open &URI... 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... @@ -469,6 +485,10 @@ %1 client %1 client + + Connecting to peers... + Gelijke worden verbonden... + Catching up... Aan het bijwerken... @@ -511,6 +531,14 @@ Incoming transaction 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 @@ -853,15 +885,51 @@ Form 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 @@ -1520,6 +1636,10 @@ Ping Wait Pingwachttijd + + Min Ping + Min Ping + Time Offset Tijdcompensatie @@ -1580,6 +1700,18 @@ 1 &year 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. @@ -1592,6 +1724,14 @@ Type <b>help</b> for an overview of available commands. 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 @@ -1711,6 +1851,10 @@ Remove Verwijder + + Copy URI + Kopieer URI + Copy label Kopieer label @@ -1936,6 +2080,10 @@ Dust: Stof: + + Confirmation time target: + Bevestigingstijddoel: + Clear &All Verwijder &Alles @@ -2028,6 +2176,10 @@ Transaction creation failed! 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 @@ -2048,6 +2208,14 @@ Warning: Unknown change address 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 @@ -2429,6 +2605,10 @@ Transaction ID 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 @@ -2821,6 +3005,18 @@ Accept command line and JSON-RPC commands 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. @@ -2897,6 +3093,14 @@ Execute command when a wallet transaction changes (%s in cmd is replaced by TxID) 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) @@ -2913,6 +3117,14 @@ Please contribute if you find %s useful. Visit %s for further information about the software. 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) @@ -2921,6 +3133,10 @@ 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 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 @@ -2929,6 +3145,22 @@ Use UPnP to map the listening port (default: 1 when listening and no -proxy) 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. @@ -2961,6 +3193,10 @@ Cannot resolve -%s address: '%s' Kan -%s adres niet herleiden: '%s' + + Chain selection options: + Keten selectie opties: + Change index out of range Wijzigingsindex buiten bereik @@ -3157,6 +3393,10 @@ Use UPnP to map the listening port (default: %u) 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. @@ -3449,10 +3689,22 @@ Output debugging information (default: %u, supplying <category> is optional) 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. @@ -3481,6 +3733,14 @@ Warning: Wallet file corrupt, data salvaged! Original %s saved as %s in %s; if your balance or transactions are incorrect you should restore from a backup. 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) @@ -3501,6 +3761,10 @@ Invalid -proxy address: '%s' 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) @@ -3537,6 +3801,10 @@ Relay non-P2SH multisig (default: %u) 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) @@ -3569,10 +3837,34 @@ Starting network threads... 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_ru_RU.ts b/src/qt/locale/bitcoin_ru_RU.ts index 60d98c41d..66ab7c81f 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 3cd287d3a..510d1aaf6 100644 --- a/src/qt/locale/bitcoin_sk.ts +++ b/src/qt/locale/bitcoin_sk.ts @@ -167,6 +167,10 @@ 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? @@ -175,6 +179,10 @@ 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. @@ -309,6 +317,22 @@ Open &URI... 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... @@ -431,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. @@ -461,6 +485,10 @@ %1 client %1 klient + + Connecting to peers... + Pripája sa k partnerom... + Catching up... Sťahujem... @@ -511,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 @@ -646,6 +678,10 @@ 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) @@ -841,10 +877,38 @@ Form 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 @@ -853,7 +917,11 @@ Hide Skryť - + + Unknown. Syncing Headers (%1)... + Neznámy. Synchronizujú sa hlavičky (%1)... + + OpenURIDialog @@ -1284,7 +1352,15 @@ Node/Service Uzol/Služba - + + NodeId + ID uzlu + + + Ping + Odozva + + QObject @@ -1323,6 +1399,22 @@ %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 @@ -1335,10 +1427,18 @@ %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 @@ -1382,7 +1482,7 @@ Using BerkeleyDB version - Používa BerkeleyDB verziu + Používa verziu BerkeleyDB Datadir @@ -1418,7 +1518,7 @@ Current number of transactions - Aktuálny počet tranzakcií + Aktuálny počet transakcií Memory usage @@ -1458,7 +1558,7 @@ Starting Block - Počiatočný Blok + Počiatočný blok Synced Headers @@ -1511,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 @@ -1577,6 +1681,18 @@ 1 &year 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 @@ -1593,6 +1709,10 @@ 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 @@ -1712,6 +1832,10 @@ Remove Odstrániť + + Copy URI + Kopírovať URI + Copy label Kopírovať popis @@ -1911,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 @@ -1993,6 +2117,10 @@ 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 @@ -2029,10 +2157,26 @@ 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. @@ -2090,7 +2234,7 @@ Paste address from clipboard - Vložte adresu z klipbordu + Vložiť adresu zo schránky Alt+P @@ -2187,7 +2331,7 @@ Paste address from clipboard - Vložte adresu z klipbordu + Vložiť adresu zo schránky Alt+P @@ -2203,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 @@ -2422,6 +2566,10 @@ Transaction ID ID transakcie + + Transaction total size + Celková veľkosť transakcie + Merchant Kupec @@ -2461,7 +2609,11 @@ This pane shows a detailed description of the transaction Táto časť obrazovky zobrazuje detailný popis transakcie - + + Details for %1 + Podrobnosti pre %1 + + TransactionTableModel @@ -2643,6 +2795,10 @@ Copy raw transaction Skopírovať neupravenú transakciu + + Copy full transaction details + Kopírovať všetky podrobnosti o transakcii + Edit label Upraviť popis @@ -2804,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... @@ -2932,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> @@ -3152,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 @@ -3236,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. @@ -3322,6 +3478,10 @@ Output debugging information (default: %u, supplying <category> is optional) 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. @@ -3354,6 +3514,10 @@ 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) @@ -3430,6 +3594,22 @@ Spend unconfirmed change when sending transactions (default: %u) 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) @@ -3438,6 +3618,10 @@ 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_uk.ts b/src/qt/locale/bitcoin_uk.ts index 2c017fc52..7126b2e5c 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 923198c91..bd0ef617a 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 c27111a52..8c4bececa 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/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index 1c0ed663c..65ca00755 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 e86a05d1c..cb9baf9cc 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -374,6 +374,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" @@ -810,7 +811,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); @@ -824,7 +825,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; } @@ -832,7 +833,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/net.cpp b/src/rpc/net.cpp index 8706b4295..42f5db94f 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -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; } diff --git a/src/streams.h b/src/streams.h index 1d3b55c91..e49a9e354 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 3e02aa8fd..f020216c7 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/checkqueue_tests.cpp b/src/test/checkqueue_tests.cpp new file mode 100644 index 000000000..242d77bfa --- /dev/null +++ b/src/test/checkqueue_tests.cpp @@ -0,0 +1,448 @@ +// 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) +{ + /* FIXME + 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) +{ + /* FIXME + 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) +{ + /* FIXME + 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) +{ + /* FIXME + 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) +{ + /* FIXME + 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) +{ + /* FIXME + 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/txdb.cpp b/src/txdb.cpp index 6a6de8ebf..4909aafb6 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -113,7 +113,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/txmempool.cpp b/src/txmempool.cpp index 85fa74201..19c5a89ca 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -1012,6 +1012,7 @@ void CTxMemPool::PrioritiseTransaction(const uint256 hash, const std::string str 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 2ef2d7790..bd935e4ba 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -434,7 +434,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/wallet/db.h b/src/wallet/db.h index b4ce044e7..ea5620032 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 3f1340747..1c823155d 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -344,11 +344,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; @@ -503,14 +503,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(); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 84efc32b1..d53d78439 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -2951,7 +2951,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(); } @@ -3006,7 +3006,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))); @@ -3104,33 +3104,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 @@ -3139,13 +3139,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. @@ -3236,7 +3236,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))); } @@ -3248,7 +3248,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. @@ -3258,7 +3258,7 @@ UniValue bumpfee(const JSONRPCRequest& request) CMutableTransaction tx(*(wtx.tx)); CTxOut* poutput = &(tx.vout[nOutput]); if (poutput->nValue.GetAmount() < 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 33cc32d94..9d5334f15 100644 --- a/src/wallet/test/wallet_tests.cpp +++ b/src/wallet/test/wallet_tests.cpp @@ -19,6 +19,8 @@ #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 @@ -428,4 +430,64 @@ BOOST_FIXTURE_TEST_CASE(rescan, TestChain100Setup) }*/ } +// 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 d79c6166a..ebca72c17 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1699,6 +1699,10 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool f if (pindex->nHeight % 100 == 0 && dProgressTip - dProgressStart > 0.0) { double progress = GuessVerificationProgress(pindex, chainParams.GetConsensus().nPowTargetSpacing); ShowProgress(_("Rescanning..."), std::max(1, std::min(99, (int)((progress - dProgressStart) / (dProgressTip - dProgressStart) * 100)))); + } + if (GetTime() >= nNow + 60) { + nNow = GetTime(); + LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, GuessVerificationProgress(pindex, chainParams.GetConsensus().nPowTargetSpacing)); } CBlock block; @@ -1713,11 +1717,6 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool f ret = nullptr; } pindex = chainActive.Next(pindex); - if (GetTime() >= nNow + 60) { - nNow = GetTime(); - double progress = GuessVerificationProgress(pindex, chainParams.GetConsensus().nPowTargetSpacing); - LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, progress); - } } ShowProgress(_("Rescanning..."), 100); // hide progress dialog in GUI } @@ -3068,7 +3067,8 @@ bool CWallet::CreateTransaction(const vector& vecSend, CWalletTx& wt } else { vChangeKey[changeCounter].ReturnKey(); - } + nChangePosInOut = -1; + } changeCounter++; }