diff options
412 files changed, 23711 insertions, 15176 deletions
diff --git a/.gitattributes b/.gitattributes index 26d7549356..c9cf4a7d9c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -src/version.cpp export-subst +src/clientversion.cpp export-subst diff --git a/.gitignore b/.gitignore index bafc5919c1..7343e722d5 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ src/qt/test/moc*.cpp .deps .dirstamp +.libs .*.swp *.*~* *.bak @@ -66,6 +67,10 @@ src/qt/test/moc*.cpp *.json.h *.raw.h +#libtool object files +*.lo +*.la + # Compilation and Qt preprocessor part *.qm Makefile @@ -99,7 +104,9 @@ linux-coverage-build linux-build win32-build qa/pull-tester/run-bitcoind-for-test.sh -qa/pull-tester/build-tests.sh +qa/pull-tester/tests-config.sh +qa/pull-tester/cache/* +qa/pull-tester/test.*/* !src/leveldb*/Makefile diff --git a/.travis.yml b/.travis.yml index 94d1c15f80..1630c1d02a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,26 +27,26 @@ matrix: - compiler: ": ARM" env: HOST=arm-linux-gnueabihf PACKAGES="g++-arm-linux-gnueabihf" DEP_OPTS="NO_QT=1" GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat" - compiler: ": bitcoind" - env: HOST=x86_64-unknown-linux-gnu DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat CPPFLAGS=-DDEBUG_LOCKORDER" + env: HOST=x86_64-unknown-linux-gnu PACKAGES="bc" DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat CPPFLAGS=-DDEBUG_LOCKORDER" - compiler: ": No wallet" env: HOST=x86_64-unknown-linux-gnu DEP_OPTS="NO_WALLET=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat" - compiler: ": 32-bit + dash" - env: HOST=i686-pc-linux-gnu PACKAGES="g++-multilib" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat" USE_SHELL="/bin/dash" + env: HOST=i686-pc-linux-gnu PACKAGES="g++-multilib bc" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat" USE_SHELL="/bin/dash" - compiler: ": Cross-Mac" env: HOST=x86_64-apple-darwin11 PACKAGES="gcc-multilib g++-multilib cmake libcap-dev libz-dev libbz2-dev" OSX_SDK=10.7 GOAL="deploy" - compiler: ": Win64" - env: HOST=x86_64-w64-mingw32 PACKAGES="nsis gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 binutils-mingw-w64-x86-64 mingw-w64-dev wine" RUN_TESTS=true GOAL="deploy" + env: HOST=x86_64-w64-mingw32 PACKAGES="nsis gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 binutils-mingw-w64-x86-64 mingw-w64-dev wine bc" RUN_TESTS=true GOAL="deploy" BITCOIN_CONFIG="--enable-gui" MAKEJOBS="-j2" - compiler: ": Win32" - env: HOST=i686-w64-mingw32 PACKAGES="nsis gcc-mingw-w64-i686 g++-mingw-w64-i686 binutils-mingw-w64-i686 mingw-w64-dev wine" RUN_TESTS=true GOAL="deploy" + env: HOST=i686-w64-mingw32 PACKAGES="nsis gcc-mingw-w64-i686 g++-mingw-w64-i686 binutils-mingw-w64-i686 mingw-w64-dev wine bc" RUN_TESTS=true GOAL="deploy" BITCOIN_CONFIG="--enable-gui" MAKEJOBS="-j2" install: - if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get update; fi - - if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get install --no-upgrade -qq $PACKAGES; fi + - if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get install --no-install-recommends --no-upgrade -qq $PACKAGES; fi before_script: - unset CC; unset CXX - mkdir -p depends/SDKs depends/sdk-sources - if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then wget $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -O depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi - if [ -n "$OSX_SDK" -a -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then tar -C depends/SDKs -xf depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi - - make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS || (echo "Build failure. Verbose build follows." && make -C depends V=1 HOST=$HOST $DEP_OPTS) + - make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS script: - if [ -n "$USE_SHELL" ]; then export CONFIG_SHELL="$USE_SHELL"; fi - OUTDIR=$BASE_OUTDIR/$TRAVIS_PULL_REQUEST/$TRAVIS_JOB_NUMBER-$HOST @@ -59,6 +59,8 @@ script: - cd bitcoin-$HOST - ./configure --cache-file=../config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false) - make $MAKEJOBS $GOAL || ( echo "Build failure. Verbose build follows." && make $GOAL V=1 ; false ) + - export LD_LIBRARY_PATH=$TRAVIS_BUILD_DIR/depends/$HOST/lib - if [ "$RUN_TESTS" = "true" ]; then make check; fi + - if [ "$RUN_TESTS" = "true" ]; then qa/pull-tester/rpc-tests.sh; fi after_script: - if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then (echo "Upload goes here. Something like: scp -r $BASE_OUTDIR server" || echo "upload failed"); fi diff --git a/Makefile.am b/Makefile.am index fe7244edf8..b51f477b78 100644 --- a/Makefile.am +++ b/Makefile.am @@ -26,7 +26,9 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) \ $(top_srcdir)/contrib/macdeploy/background.png \ - $(top_srcdir)/contrib/macdeploy/DS_Store + $(top_srcdir)/contrib/macdeploy/DS_Store \ + $(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \ + $(top_srcdir)/contrib/macdeploy/detached-sig-create.sh COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ @@ -36,7 +38,7 @@ COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ dist-hook: -$(MAKE) -C $(top_distdir)/src/leveldb clean -$(MAKE) -C $(top_distdir)/src/secp256k1 distclean - -$(GIT) archive --format=tar HEAD -- src/version.cpp | $(AMTAR) -C $(top_distdir) -xf - + -$(GIT) archive --format=tar HEAD -- src/clientversion.cpp | $(AMTAR) -C $(top_distdir) -xf - distcheck-hook: $(MKDIR_P) $(top_distdir)/_build/src/leveldb @@ -85,14 +87,30 @@ if BUILD_DARWIN $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 +deploydir: $(OSX_DMG) else -$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) - INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -verbose 2 - $(MKDIR_P) dist/.background - $(INSTALL) contrib/macdeploy/background.png dist/.background - $(INSTALL) contrib/macdeploy/DS_Store dist/.DS_Store - cd dist; $(LN_S) /Applications Applications - $(GENISOIMAGE) -no-cache-inodes -l -probe -V "Bitcoin-Qt" -no-pad -r -apple -o $@ dist +APP_DIST_DIR=$(top_builddir)/dist +APP_DIST_EXTRAS=$(APP_DIST_DIR)/.background/background.png $(APP_DIST_DIR)/.DS_Store $(APP_DIST_DIR)/Applications + +$(APP_DIST_DIR)/Applications: + @rm -f $@ + @cd $(@D); $(LN_S) /Applications $(@F) + +$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt + +$(OSX_DMG): $(APP_DIST_EXTRAS) + $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "Bitcoin-Qt" -no-pad -r -apple -o $@ dist + +$(APP_DIST_DIR)/.background/background.png: + $(MKDIR_P) $(@D) + $(INSTALL) $(top_srcdir)/contrib/macdeploy/background.png $@ +$(APP_DIST_DIR)/.DS_Store: + $(INSTALL) $(top_srcdir)/contrib/macdeploy/DS_Store $@ + +$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING) + INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2 + +deploydir: $(APP_DIST_EXTRAS) endif if TARGET_DARWIN @@ -172,7 +190,7 @@ check-local: @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1 endif -EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) +EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER) diff --git a/build-aux/m4/ax_gcc_func_attribute.m4 b/build-aux/m4/ax_gcc_func_attribute.m4 new file mode 100644 index 0000000000..275ca63a2c --- /dev/null +++ b/build-aux/m4/ax_gcc_func_attribute.m4 @@ -0,0 +1,217 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE) +# +# DESCRIPTION +# +# This macro checks if the compiler supports one of GCC's function +# attributes; many other compilers also provide function attributes with +# the same syntax. Compiler warnings are used to detect supported +# attributes as unsupported ones are ignored by default so quieting +# warnings when using this macro will yield false positives. +# +# The ATTRIBUTE parameter holds the name of the attribute to be checked. +# +# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>. +# +# The macro caches its result in the ax_cv_have_func_attribute_<attribute> +# variable. +# +# The macro currently supports the following function attributes: +# +# alias +# aligned +# alloc_size +# always_inline +# artificial +# cold +# const +# constructor +# deprecated +# destructor +# dllexport +# dllimport +# error +# externally_visible +# flatten +# format +# format_arg +# gnu_inline +# hot +# ifunc +# leaf +# malloc +# noclone +# noinline +# nonnull +# noreturn +# nothrow +# optimize +# pure +# unused +# used +# visibility +# warning +# warn_unused_result +# weak +# weakref +# +# Unsuppored function attributes will be tested with a prototype returning +# an int and not accepting any arguments and the result of the check might +# be wrong or meaningless so use with care. +# +# LICENSE +# +# Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com> +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 2 + +AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ + AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) + + AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([ + m4_case([$1], + [alias], [ + int foo( void ) { return 0; } + int bar( void ) __attribute__(($1("foo"))); + ], + [aligned], [ + int foo( void ) __attribute__(($1(32))); + ], + [alloc_size], [ + void *foo(int a) __attribute__(($1(1))); + ], + [always_inline], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [artificial], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [cold], [ + int foo( void ) __attribute__(($1)); + ], + [const], [ + int foo( void ) __attribute__(($1)); + ], + [constructor], [ + int foo( void ) __attribute__(($1)); + ], + [deprecated], [ + int foo( void ) __attribute__(($1(""))); + ], + [destructor], [ + int foo( void ) __attribute__(($1)); + ], + [dllexport], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [dllimport], [ + int foo( void ) __attribute__(($1)); + ], + [error], [ + int foo( void ) __attribute__(($1(""))); + ], + [externally_visible], [ + int foo( void ) __attribute__(($1)); + ], + [flatten], [ + int foo( void ) __attribute__(($1)); + ], + [format], [ + int foo(const char *p, ...) __attribute__(($1(printf, 1, 2))); + ], + [format_arg], [ + char *foo(const char *p) __attribute__(($1(1))); + ], + [gnu_inline], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [hot], [ + int foo( void ) __attribute__(($1)); + ], + [ifunc], [ + int my_foo( void ) { return 0; } + static int (*resolve_foo(void))(void) { return my_foo; } + int foo( void ) __attribute__(($1("resolve_foo"))); + ], + [leaf], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [malloc], [ + void *foo( void ) __attribute__(($1)); + ], + [noclone], [ + int foo( void ) __attribute__(($1)); + ], + [noinline], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [nonnull], [ + int foo(char *p) __attribute__(($1(1))); + ], + [noreturn], [ + void foo( void ) __attribute__(($1)); + ], + [nothrow], [ + int foo( void ) __attribute__(($1)); + ], + [optimize], [ + __attribute__(($1(3))) int foo( void ) { return 0; } + ], + [pure], [ + int foo( void ) __attribute__(($1)); + ], + [unused], [ + int foo( void ) __attribute__(($1)); + ], + [used], [ + int foo( void ) __attribute__(($1)); + ], + [visibility], [ + int foo_def( void ) __attribute__(($1("default"))); + int foo_hid( void ) __attribute__(($1("hidden"))); + ], + [warning], [ + int foo( void ) __attribute__(($1(""))); + ], + [warn_unused_result], [ + int foo( void ) __attribute__(($1)); + ], + [weak], [ + int foo( void ) __attribute__(($1)); + ], + [weakref], [ + static int foo( void ) { return 0; } + static int bar( void ) __attribute__(($1("foo"))); + ], + [ + m4_warn([syntax], [Unsupported attribute $1, the test may fail]) + int foo( void ) __attribute__(($1)); + ] + )], []) + ], + dnl GCC doesn't exit with an error if an unknown attribute is + dnl provided but only outputs a warning, so accept the attribute + dnl only if no warning were issued. + [AS_IF([test -s conftest.err], + [AS_VAR_SET([ac_var], [no])], + [AS_VAR_SET([ac_var], [yes])])], + [AS_VAR_SET([ac_var], [no])]) + ]) + + AS_IF([test yes = AS_VAR_GET([ac_var])], + [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, + [Define to 1 if the system has the `$1' function attribute])], []) + + AS_VAR_POPDEF([ac_var]) +]) diff --git a/configure.ac b/configure.ac index b603d1766d..9814197af3 100644 --- a/configure.ac +++ b/configure.ac @@ -14,42 +14,14 @@ AC_CONFIG_MACRO_DIR([build-aux/m4]) AC_CANONICAL_HOST -dnl By default, libtool for mingw refuses to link static libs into a dll for -dnl fear of mixing pic/non-pic objects, and import/export complications. Since -dnl we have those under control, re-enable that functionality. - -case $host in - *mingw*) - lt_cv_deplibs_check_method="pass_all" - ;; -esac - -LT_INIT([disable-shared]) - AH_TOP([#ifndef BITCOIN_CONFIG_H]) AH_TOP([#define BITCOIN_CONFIG_H]) AH_BOTTOM([#endif //BITCOIN_CONFIG_H]) -# This m4 will only be used if a system copy cannot be found. This is helpful -# on systems where autotools are installed but the pkg-config macros are not in -# a default location. It is currently used for building on OSX where autotools -# are preinstalled but pkg-config comes from macports or homebrew. It should -# probably be removed when building on <= 10.6 is no longer supported. -m4_include([pkg.m4]) - dnl faketime breaks configure and is only needed for make. Disable it here. unset FAKETIME -if test "x${CXXFLAGS+set}" = "xset"; then - CXXFLAGS_overridden=yes -else - CXXFLAGS_overridden=no -fi - -dnl ============================================================== -dnl Setup for automake -dnl ============================================================== - +dnl Automake init set-up and checks AM_INIT_AUTOMAKE([no-define subdir-objects foreign]) dnl faketime messes with timestamps and causes configure to be re-run. @@ -59,17 +31,27 @@ AM_MAINTAINER_MODE([enable]) dnl make the compilation flags quiet unless V=1 is used m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) -dnl Checks for programs. +dnl Compiler checks (here before libtool). +if test "x${CXXFLAGS+set}" = "xset"; then + CXXFLAGS_overridden=yes +else + CXXFLAGS_overridden=no +fi AC_PROG_CXX -AC_PROG_CC -AC_PROG_CPP -AC_PROG_CXXCPP -AC_PROG_INSTALL -AC_PROG_OBJC -AC_PROG_LN_S m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) -AC_PROG_MKDIR_P -AC_PROG_SED + +dnl By default, libtool for mingw refuses to link static libs into a dll for +dnl fear of mixing pic/non-pic objects, and import/export complications. Since +dnl we have those under control, re-enable that functionality. +case $host in + *mingw*) + lt_cv_deplibs_check_method="pass_all" + ;; +esac +dnl Libtool init checks. +LT_INIT([pic-only]) + +dnl Check/return PATH for base programs. AC_PATH_TOOL(AR, ar) AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) @@ -81,6 +63,15 @@ AC_PATH_PROG([GIT], [git]) AC_PATH_PROG(CCACHE,ccache) AC_PATH_PROG(XGETTEXT,xgettext) AC_PATH_PROG(HEXDUMP,hexdump) + +# This m4 will only be used if a system copy cannot be found. This is helpful +# on systems where autotools are installed but the pkg-config macros are not in +# a default location. It is currently used for building on OSX where autotools +# are preinstalled but pkg-config comes from macports or homebrew. It should +# probably be removed when building on <= 10.6 is no longer supported. +m4_include([pkg.m4]) + +dnl pkg-config check. PKG_PROG_PKG_CONFIG # Enable wallet @@ -210,12 +201,9 @@ case $host in AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([crypt32], [main],, AC_MSG_ERROR(lib missing)) - AX_CHECK_LINK_FLAG([[-static-libgcc]],[LDFLAGS="$LDFLAGS -static-libgcc"]) - AX_CHECK_LINK_FLAG([[-static-libstdc++]],[LDFLAGS="$LDFLAGS -static-libstdc++"]) - # -static is interpreted by libtool, where it has a different meaning. # In libtool-speak, it's -all-static. - AX_CHECK_LINK_FLAG([[-static]],[LDFLAGS="$LDFLAGS -static"; LIBTOOL_LDFLAGS="$LIBTOOL_LDFLAGS -all-static"]) + AX_CHECK_LINK_FLAG([[-static]],[LIBTOOL_APP_LDFLAGS="$LIBTOOL_APP_LDFLAGS -all-static"]) AC_PATH_PROG([MAKENSIS], [makensis], none) if test x$MAKENSIS = xnone; then @@ -238,6 +226,15 @@ case $host in *) AC_MSG_ERROR("Could not determine win32/win64 for installer") ;; esac AC_SUBST(WINDOWS_BITS) + + dnl libtool insists upon adding -nostdlib and a list of objects/libs to link against. + dnl That breaks our ability to build dll's with static libgcc/libstdc++/libssp. Override + dnl its command here, with the predeps/postdeps removed, and -static inserted. Postdeps are + dnl also overridden to prevent their insertion later. + dnl This should only affect dll's. + archive_cmds_CXX="\$CC -shared \$libobjs \$deplibs \$compiler_flags -static -o \$output_objdir/\$soname \${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker \$lib" + postdeps_CXX= + ;; *darwin*) TARGET_OS=darwin @@ -284,10 +281,17 @@ case $host in AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool) AC_PATH_TOOL([OTOOL], [otool], otool) AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage) + + dnl libtool will try to strip the static lib, which is a problem for + dnl cross-builds because strip attempts to call a hard-coded ld, + dnl which may not exist in the path. Stripping the .a is not + dnl necessary, so just disable it. + old_striplib= ;; esac fi + AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"]) CPPFLAGS="$CPPFLAGS -DMAC_OSX" ;; *linux*) @@ -358,6 +362,10 @@ fi AX_CHECK_LINK_FLAG([[-Wl,--large-address-aware]], [LDFLAGS="$LDFLAGS -Wl,--large-address-aware"]) +AX_GCC_FUNC_ATTRIBUTE([visibility]) +AX_GCC_FUNC_ATTRIBUTE([dllexport]) +AX_GCC_FUNC_ATTRIBUTE([dllimport]) + if test x$use_glibc_compat != xno; then #__fdelt_chk's params and return type have changed from long unsigned int to long int. @@ -398,6 +406,12 @@ if test x$use_hardening != xno; then AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"]) fi + case $host in + *mingw*) + AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing)) + ;; + esac + CXXFLAGS="$CXXFLAGS $HARDENED_CXXFLAGS" CPPFLAGS="$CPPFLAGS $HARDENED_CPPFLAGS" LDFLAGS="$LDFLAGS $HARDENED_LDFLAGS" @@ -413,6 +427,8 @@ AC_CHECK_HEADERS([endian.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/s AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])]) AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])]) +AC_CHECK_DECLS([strnlen]) + AC_CHECK_DECLS([le32toh, le64toh, htole32, htole64, be32toh, be64toh, htobe32, htobe64],,, [#if HAVE_ENDIAN_H #include <endian.h> @@ -612,6 +628,12 @@ AC_ARG_WITH([utils], [build_bitcoin_utils=$withval], [build_bitcoin_utils=yes]) +AC_ARG_WITH([libs], + [AS_HELP_STRING([--with-libs], + [build libraries (default=yes)])], + [build_bitcoin_libs=$withval], + [build_bitcoin_libs=yes]) + AC_ARG_WITH([daemon], [AS_HELP_STRING([--with-daemon], [build bitcoind daemon (default=yes)])], @@ -662,6 +684,13 @@ AC_MSG_CHECKING([whether to build utils (bitcoin-cli bitcoin-tx)]) AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes]) AC_MSG_RESULT($build_bitcoin_utils) +AC_MSG_CHECKING([whether to build libraries]) +AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes]) +if test x$build_bitcoin_libs = xyes; then + AC_DEFINE(HAVE_CONSENSUS_LIB, 1, [Define this symbol if the consensus lib has been built]) +fi +AC_MSG_RESULT($build_bitcoin_libs) + dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) @@ -778,8 +807,8 @@ else AC_MSG_RESULT([no]) fi -if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then - AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-daemon --with-gui or --enable-tests]) +if test x$build_bitcoin_utils$build_bitcoin_libs$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then + AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon --with-gui or --enable-tests]) fi AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) @@ -809,9 +838,8 @@ AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) - AC_SUBST(RELDFLAGS) -AC_SUBST(LIBTOOL_LDFLAGS) +AC_SUBST(LIBTOOL_APP_LDFLAGS) AC_SUBST(USE_UPNP) AC_SUBST(USE_QRCODE) AC_SUBST(BOOST_LIBS) @@ -824,7 +852,34 @@ AC_SUBST(MINIUPNPC_CPPFLAGS) AC_SUBST(MINIUPNPC_LIBS) AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) -AC_CONFIG_FILES([qa/pull-tester/build-tests.sh],[chmod +x qa/pull-tester/build-tests.sh]) +AC_CONFIG_FILES([qa/pull-tester/tests-config.sh],[chmod +x qa/pull-tester/tests-config.sh]) + +dnl boost's m4 checks do something really nasty: they export these vars. As a +dnl result, they leak into secp256k1's configure and crazy things happen. +dnl Until this is fixed upstream and we've synced, we'll just un-export them. +CPPFLAGS_TEMP="$CPPFLAGS" +unset CPPFLAGS +CPPFLAGS="$CPPFLAGS_TEMP" + +LDFLAGS_TEMP="$LDFLAGS" +unset LDFLAGS +LDFLAGS="$LDFLAGS_TEMP" + +LIBS_TEMP="$LIBS" +unset LIBS +LIBS="$LIBS_TEMP" + +PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" +unset PKG_CONFIG_PATH +PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP" + +PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR" +unset PKG_CONFIG_LIBDIR +PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" + +ac_configure_args="${ac_configure_args} --disable-shared --with-pic" +AC_CONFIG_SUBDIRS([src/secp256k1]) + AC_OUTPUT dnl Taken from https://wiki.debian.org/RpathIssue diff --git a/contrib/bitcoind.bash-completion b/contrib/bitcoind.bash-completion index 03ef173c09..37ece25899 100644 --- a/contrib/bitcoind.bash-completion +++ b/contrib/bitcoind.bash-completion @@ -39,6 +39,10 @@ _bitcoind() { if ((cword > 4)); then case ${words[cword-4]} in + listtransactions) + COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) + return 0 + ;; signrawtransaction) COMPREPLY=( $( compgen -W "ALL NONE SINGLE ALL|ANYONECANPAY NONE|ANYONECANPAY SINGLE|ANYONECANPAY" -- "$cur" ) ) return 0 @@ -52,7 +56,7 @@ _bitcoind() { _bitcoin_accounts return 0 ;; - gettxout|importprivkey) + getbalance|gettxout|importaddress|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; @@ -65,7 +69,7 @@ _bitcoind() { COMPREPLY=( $( compgen -W "add remove onetry" -- "$cur" ) ) return 0 ;; - getblock|getrawtransaction|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction) + getblock|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; @@ -115,7 +119,7 @@ _bitcoind() { # only parse help if senseful if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then - commands=$(_bitcoin_rpc help 2>/dev/null | awk '{ print $1; }') + commands=$(_bitcoin_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') fi COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) ) diff --git a/contrib/gitian-descriptors/README.md b/contrib/gitian-descriptors/README.md index 7a67263ee4..061b897d2a 100644 --- a/contrib/gitian-descriptors/README.md +++ b/contrib/gitian-descriptors/README.md @@ -27,7 +27,6 @@ Once you've got the right hardware and software: # Create base images cd gitian-builder - bin/make-base-vm --suite precise --arch i386 bin/make-base-vm --suite precise --arch amd64 cd .. diff --git a/contrib/gitian-descriptors/boost-linux.yml b/contrib/gitian-descriptors/boost-linux.yml deleted file mode 100644 index bd35346337..0000000000 --- a/contrib/gitian-descriptors/boost-linux.yml +++ /dev/null @@ -1,55 +0,0 @@ ---- -name: "boost" -suites: -- "precise" -architectures: -- "i386" -- "amd64" -packages: -- "g++" -- "unzip" -- "pkg-config" -- "libtool" -- "faketime" -- "bsdmainutils" -- "zip" -- "libz-dev" -reference_datetime: "2011-01-30 00:00:00" -remotes: [] -files: -- "boost_1_55_0.tar.bz2" -script: | - STAGING="$HOME/install" - TEMPDIR="$HOME/tmp" - export LIBRARY_PATH="$STAGING/lib" - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - # Input Integrity Check - echo "fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52 boost_1_55_0.tar.bz2" | shasum -c - - mkdir -p "$STAGING" - tar --warning=no-timestamp -xjf boost_1_55_0.tar.bz2 - cd boost_1_55_0 - GCCVERSION=$(g++ -E -dM $(mktemp --suffix=.h) | grep __VERSION__ | cut -d ' ' -f 3 | cut -d '"' -f 2) - # note: bjam with -d+2 reveals that -O3 is implied by default, no need to provide it in cxxflags - echo "using gcc : $GCCVERSION : g++ - : - <cxxflags>\"-frandom-seed=boost1 -fPIC\" - ;" > user-config.jam - - ./bootstrap.sh --without-icu - - ./bjam toolset=gcc threadapi=pthread threading=multi variant=release link=static runtime-link=shared --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 --layout=tagged --build-type=complete --prefix="$STAGING" $MAKEOPTS -d+2 install - - # post-process all generated libraries to be deterministic - # extract them to a temporary directory then re-build them deterministically - for LIB in $(find $STAGING -name \*.a); do - rm -rf $TEMPDIR && mkdir $TEMPDIR && cd $TEMPDIR - ar xv $LIB | cut -b5- > /tmp/list.txt - rm $LIB - ar crsD $LIB $(cat /tmp/list.txt) - done - # - cd "$STAGING" - find | sort | zip -X@ $OUTDIR/boost-linux${GBUILD_BITS}-1.55.0-gitian-r1.zip diff --git a/contrib/gitian-descriptors/boost-win.yml b/contrib/gitian-descriptors/boost-win.yml deleted file mode 100644 index 347952e3a6..0000000000 --- a/contrib/gitian-descriptors/boost-win.yml +++ /dev/null @@ -1,86 +0,0 @@ ---- -name: "boost" -suites: -- "precise" -architectures: -- "amd64" -packages: -- "mingw-w64" -- "g++-mingw-w64" -- "faketime" -- "zip" -reference_datetime: "2011-01-30 00:00:00" -remotes: [] -files: -- "boost_1_55_0.tar.bz2" -- "boost-mingw-gas-cross-compile-2013-03-03.patch" -script: | - # Defines - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - INDIR=$HOME/build - TEMPDIR=$HOME/tmp - # Input Integrity Check - echo "fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52 boost_1_55_0.tar.bz2" | shasum -c - echo "d2b7f6a1d7051faef3c9cf41a92fa3671d905ef1e1da920d07651a43299f6268 boost-mingw-gas-cross-compile-2013-03-03.patch" | shasum -c - - for BITS in 32 64; do # for architectures - # - INSTALLPREFIX=$HOME/staging${BITS} - BUILDDIR=$HOME/build${BITS} - if [ "x$BITS" = "x32" ]; then - HOST=i686-w64-mingw32 - else - HOST=x86_64-w64-mingw32 - fi - # - mkdir -p $INSTALLPREFIX $BUILDDIR - cd $BUILDDIR - # - tar --warning=no-timestamp -xjf $INDIR/boost_1_55_0.tar.bz2 - cd boost_1_55_0 - GCCVERSION=$($HOST-g++ -E -dM $(mktemp --suffix=.h) | grep __VERSION__ | cut -d ' ' -f 3 | cut -d '"' -f 2) - echo "using gcc : $GCCVERSION : $HOST-g++ - : - <rc>$HOST-windres - <archiver>$HOST-ar - <cxxflags>-frandom-seed=boost1 - <ranlib>$HOST-ranlib - ;" > user-config.jam - ./bootstrap.sh --without-icu - - # Workaround: Upstream boost dev refuses to include patch that would allow Free Software cross-compile toolchain to work - # This patch was authored by the Fedora package developer and ships in Fedora's mingw32-boost. - # Please obtain the exact patch that matches the above sha256sum from one of the following mirrors. - # - # Read History: https://svn.boost.org/trac/boost/ticket/7262 - # History Mirror: http://rose.makesad.us/~paulproteus/mirrors/7262%20Boost.Context%20fails%20to%20build%20using%20MinGW.html - # - # Patch: https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch - # Patch Mirror: http://wtogami.fedorapeople.org/boost-mingw-gas-cross-compile-2013-03-03.patch - # Patch Mirror: http://mindstalk.net/host/boost-mingw-gas-cross-compile-2013-03-03.patch - # Patch Mirror: http://rose.makesad.us/~paulproteus/mirrors/boost-mingw-gas-cross-compile-2013-03-03.patch - patch -p0 < $INDIR/boost-mingw-gas-cross-compile-2013-03-03.patch - - # Bug Workaround: boost-1.54.0 broke the ability to disable zlib, still broken in 1.55 - # https://svn.boost.org/trac/boost/ticket/9156 - sed -i 's^\[ ac.check-library /zlib//zlib : <library>/zlib//zlib^^' libs/iostreams/build/Jamfile.v2 - sed -i 's^<source>zlib.cpp <source>gzip.cpp \]^^' libs/iostreams/build/Jamfile.v2 - - # http://statmt.org/~s0565741/software/boost_1_52_0/libs/context/doc/html/context/requirements.html - # "For cross-compiling the lib you must specify certain additional properties at bjam command line: target-os, abi, binary-format, architecture and address-model." - ./bjam toolset=gcc binary-format=pe target-os=windows threadapi=win32 address-model=$BITS threading=multi variant=release link=static runtime-link=static --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged --build-type=complete --prefix="$INSTALLPREFIX" $MAKEOPTS install - # post-process all generated libraries to be deterministic - # extract them to a temporary directory then re-build them deterministically - for LIB in $(find $INSTALLPREFIX -name \*.a); do - rm -rf $TEMPDIR && mkdir $TEMPDIR && cd $TEMPDIR - $HOST-ar xv $LIB | cut -b5- > /tmp/list.txt - rm $LIB - $HOST-ar crsD $LIB $(cat /tmp/list.txt) - done - # - cd "$INSTALLPREFIX" - find | sort | zip -X@ $OUTDIR/boost-win$BITS-1.55.0-gitian-r6.zip - done # for BITS in - diff --git a/contrib/gitian-descriptors/deps-linux.yml b/contrib/gitian-descriptors/deps-linux.yml deleted file mode 100644 index 8221222133..0000000000 --- a/contrib/gitian-descriptors/deps-linux.yml +++ /dev/null @@ -1,98 +0,0 @@ ---- -name: "bitcoin" -suites: -- "precise" -architectures: -- "i386" -- "amd64" -packages: -- "g++" -- "unzip" -- "zip" -- "pkg-config" -- "libtool" -- "faketime" -- "bsdmainutils" -reference_datetime: "2013-06-01 00:00:00" -remotes: [] -files: -- "openssl-1.0.1h.tar.gz" -- "miniupnpc-1.9.tar.gz" -- "qrencode-3.4.3.tar.bz2" -- "protobuf-2.5.0.tar.bz2" -- "db-4.8.30.NC.tar.gz" -script: | - STAGING="$HOME/install" - TEMPDIR="$HOME/tmp" - OPTFLAGS='-O2' - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - export LIBRARY_PATH="$STAGING/lib" - # Integrity Check - echo "9d1c8a9836aa63e2c6adb684186cbd4371c9e9dcc01d6e3bb447abf2d4d3d093 openssl-1.0.1h.tar.gz" | sha256sum -c - echo "2923e453e880bb949e3d4da9f83dd3cb6f08946d35de0b864d0339cf70934464 miniupnpc-1.9.tar.gz" | sha256sum -c - echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c - echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c - echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c - - # - tar xzf openssl-1.0.1h.tar.gz - cd openssl-1.0.1h - # need -fPIC to avoid relocation error in 64 bit builds - ./config no-shared no-zlib no-dso no-krb5 --openssldir=$STAGING -fPIC - # need to build OpenSSL with faketime because a timestamp is embedded into cversion.o - make - make install_sw - cd .. - # - tar xzfm miniupnpc-1.9.tar.gz - cd miniupnpc-1.9 - # miniupnpc is always built with -fPIC - INSTALLPREFIX=$STAGING make $MAKEOPTS install - rm -f $STAGING/lib/libminiupnpc.so* # no way to skip shared lib build - cd .. - # - tar xjf qrencode-3.4.3.tar.bz2 - cd qrencode-3.4.3 - unset FAKETIME # unset fake time during configure, as it does some clock sanity tests - # need --with-pic to avoid relocation error in 64 bit builds - ./configure --prefix=$STAGING --enable-static --disable-shared --with-pic --without-tools --disable-dependency-tracking - # Workaround to prevent re-configuring by make; make all files have a date in the past - find . -print0 | xargs -r0 touch -t 200001010000 - export FAKETIME=$REFERENCE_DATETIME - make $MAKEOPTS install - cd .. - # - tar xjf protobuf-2.5.0.tar.bz2 - cd protobuf-2.5.0 - mkdir -p $STAGING/host/bin - unset FAKETIME # unset fake time during configure, as it does some clock sanity tests - # need --with-pic to avoid relocation error in 64 bit builds - ./configure --prefix=$STAGING --bindir=$STAGING/host/bin --enable-static --disable-shared --with-pic --without-zlib - # Workaround to prevent re-configuring by make; make all files have a date in the past - find . -print0 | xargs -r0 touch -t 200001010000 - export FAKETIME=$REFERENCE_DATETIME - make $MAKEOPTS install - cd .. - # - tar xzf db-4.8.30.NC.tar.gz - cd db-4.8.30.NC/build_unix - # need --with-pic to avoid relocation error in 64 bit builds - ../dist/configure --prefix=$STAGING --enable-cxx --disable-shared --with-pic - # Workaround to prevent re-configuring by make; make all files have a date in the past - find . -print0 | xargs -r0 touch -t 200001010000 - make $MAKEOPTS library_build - make install_lib install_include - cd ../.. - # post-process all generated libraries to be deterministic - # extract them to a temporary directory then re-build them deterministically - for LIB in $(find $STAGING -name \*.a); do - rm -rf $TEMPDIR && mkdir $TEMPDIR && cd $TEMPDIR - ar xv $LIB | cut -b5- > /tmp/list.txt - rm $LIB - ar crsD $LIB $(cat /tmp/list.txt) - done - # - cd $STAGING - find include lib bin host | sort | zip -X@ $OUTDIR/bitcoin-deps-linux${GBUILD_BITS}-gitian-r6.zip diff --git a/contrib/gitian-descriptors/deps-win.yml b/contrib/gitian-descriptors/deps-win.yml deleted file mode 100644 index fe02950ef9..0000000000 --- a/contrib/gitian-descriptors/deps-win.yml +++ /dev/null @@ -1,128 +0,0 @@ ---- -name: "bitcoin-deps" -suites: -- "precise" -architectures: -- "amd64" -packages: -- "mingw-w64" -- "g++-mingw-w64" -- "git-core" -- "zip" -- "faketime" -- "psmisc" -reference_datetime: "2011-01-30 00:00:00" -remotes: [] -files: -- "openssl-1.0.1h.tar.gz" -- "db-4.8.30.NC.tar.gz" -- "miniupnpc-1.9.tar.gz" -- "zlib-1.2.8.tar.gz" -- "libpng-1.6.8.tar.gz" -- "qrencode-3.4.3.tar.bz2" -script: | - # - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - INDIR=$HOME/build - TEMPDIR=$HOME/tmp - # Input Integrity Check - echo "9d1c8a9836aa63e2c6adb684186cbd4371c9e9dcc01d6e3bb447abf2d4d3d093 openssl-1.0.1h.tar.gz" | sha256sum -c - echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c - echo "2923e453e880bb949e3d4da9f83dd3cb6f08946d35de0b864d0339cf70934464 miniupnpc-1.9.tar.gz" | sha256sum -c - echo "36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d zlib-1.2.8.tar.gz" | sha256sum -c - echo "32c7acf1608b9c8b71b743b9780adb7a7b347563dbfb4a5263761056da44cc96 libpng-1.6.8.tar.gz" | sha256sum -c - echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c - - for BITS in 32 64; do # for architectures - # - INSTALLPREFIX=$HOME/staging${BITS} - BUILDDIR=$HOME/build${BITS} - if [ "x$BITS" = "x32" ]; then - HOST=i686-w64-mingw32 - else - HOST=x86_64-w64-mingw32 - fi - # - mkdir -p $INSTALLPREFIX $BUILDDIR - cd $BUILDDIR - # - tar xzf $INDIR/openssl-1.0.1h.tar.gz - cd openssl-1.0.1h - if [ "x$BITS" = "x32" ]; then - OPENSSL_TGT=mingw - else - OPENSSL_TGT=mingw64 - fi - ./Configure --cross-compile-prefix=$HOST- ${OPENSSL_TGT} no-shared no-dso --openssldir=$INSTALLPREFIX - make - make install_sw - cd .. - # - tar xzf $INDIR/db-4.8.30.NC.tar.gz - cd db-4.8.30.NC/build_unix - ../dist/configure --prefix=$INSTALLPREFIX --enable-mingw --enable-cxx --host=$HOST --disable-shared - make $MAKEOPTS library_build - make install_lib install_include - cd ../.. - # - tar xzf $INDIR/miniupnpc-1.9.tar.gz - cd miniupnpc-1.9 - echo " - --- miniupnpc-1.9/Makefile.mingw.orig 2013-09-29 18:52:51.014087958 -1000 - +++ miniupnpc-1.9/Makefile.mingw 2013-09-29 19:09:29.663318691 -1000 - @@ -67,8 +67,8 @@ - - wingenminiupnpcstrings.o: wingenminiupnpcstrings.c - - -miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings - - wingenminiupnpcstrings \$< \$@ - +miniupnpcstrings.h: miniupnpcstrings.h.in - + sed -e 's|OS/version|MSWindows/5.1.2600|' -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"VERSIONHERE\"|' \$< > \$@ - - minixml.o: minixml.c minixml.h miniupnpcstrings.h - - " | sed "s/VERSIONHERE/$(cat VERSION)/" | patch -p1 - mkdir -p dll - make -f Makefile.mingw CC=$HOST-gcc AR=$HOST-ar libminiupnpc.a - install -d $INSTALLPREFIX/include/miniupnpc - install *.h $INSTALLPREFIX/include/miniupnpc - install libminiupnpc.a $INSTALLPREFIX/lib - cd .. - # - tar xzf $INDIR/zlib-1.2.8.tar.gz - cd zlib-1.2.8 - CROSS_PREFIX=$HOST- ./configure --prefix=$INSTALLPREFIX --static - make - make install - cd .. - # - tar xzf $INDIR/libpng-1.6.8.tar.gz - cd libpng-1.6.8 - OPT="-O2" - CPPFLAGS="${OPT} -I$INSTALLPREFIX/include" CFLAGS="${OPT} -I$INSTALLPREFIX/include" LDFLAGS="${OPT} -L$INSTALLPREFIX/lib" ./configure --disable-shared --prefix=$INSTALLPREFIX --host=$HOST - make $MAKEOPTS - make install - cd .. - # - tar xjf $INDIR/qrencode-3.4.3.tar.bz2 - cd qrencode-3.4.3 - png_CFLAGS="-I$INSTALLPREFIX/include" png_LIBS="-L$INSTALLPREFIX/lib -lpng" ./configure --prefix=$INSTALLPREFIX --host=$HOST --enable-static --disable-shared --without-tools --disable-dependency-tracking - # Workaround to prevent re-configuring by make (resulting in missing m4 error); make all files have a date in the past - find . -print0 | xargs -r0 touch -t 200001010000 - make - make install - cd .. - # post-process all generated libraries to be deterministic - # extract them to a temporary directory then re-build them deterministically - for LIB in $(find $INSTALLPREFIX -name \*.a); do - rm -rf $TEMPDIR && mkdir $TEMPDIR && cd $TEMPDIR - $HOST-ar xv $LIB | cut -b5- > /tmp/list.txt - rm $LIB - $HOST-ar crsD $LIB $(cat /tmp/list.txt) - done - # - cd $INSTALLPREFIX - find include lib | sort | zip -X@ $OUTDIR/bitcoin-deps-win$BITS-gitian-r13.zip - done # for BITS in diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 30b0227bdd..bba2104edb 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,86 +1,109 @@ --- -name: "bitcoin" +name: "bitcoin-linux-0.10" +enable_cache: true suites: - "precise" architectures: -- "i386" - "amd64" packages: -- "g++" +- "g++-multilib" - "git-core" -- "unzip" - "pkg-config" - "autoconf2.13" - "libtool" - "automake" - "faketime" - "bsdmainutils" -- "libqt4-core" -- "libqt4-gui" -- "libqt4-dbus" -- "libqt4-network" -- "libqt4-test" +- "binutils-gold" reference_datetime: "2013-06-01 00:00:00" remotes: - "url": "https://github.com/bitcoin/bitcoin.git" "dir": "bitcoin" -files: -- "bitcoin-deps-linux32-gitian-r6.zip" -- "bitcoin-deps-linux64-gitian-r6.zip" -- "boost-linux32-1.55.0-gitian-r1.zip" -- "boost-linux64-1.55.0-gitian-r1.zip" -- "qt-linux32-4.6.4-gitian-r1.tar.gz" -- "qt-linux64-4.6.4-gitian-r1.tar.gz" +files: [] script: | - STAGING="$HOME/install" - OPTFLAGS='-O2' - BINDIR="${OUTDIR}/bin/${GBUILD_BITS}" # 32/64 bit build specific output directory - TEMPDIR="$HOME/tempdir" - export TZ=UTC - export LIBRARY_PATH="$STAGING/lib" - export PATH="$STAGING/bin:$PATH" - mkdir -p ${BINDIR} - # - mkdir -p $STAGING - cd $STAGING - unzip ../build/bitcoin-deps-linux${GBUILD_BITS}-gitian-r6.zip - unzip ../build/boost-linux${GBUILD_BITS}-1.55.0-gitian-r1.zip - tar -zxf ../build/qt-linux${GBUILD_BITS}-4.6.4-gitian-r1.tar.gz - cd ../build + WRAP_DIR=$HOME/wrapped + HOSTS="i686-pc-linux-gnu x86_64-unknown-linux-gnu" + CONFIGFLAGS="--enable-upnp-default --enable-glibc-back-compat" + FAKETIME_HOST_PROGS="" + FAKETIME_PROGS="date ar ranlib nm strip" + + export QT_RCC_TEST=1 + export GZIP="-9n" + export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" + export TZ="UTC" + export BUILD_DIR=`pwd` + mkdir -p ${WRAP_DIR} + if test -n "$GBUILD_CACHE_ENABLED"; then + export SOURCES_PATH=${GBUILD_COMMON_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + fi + + # Create global faketime wrappers + for prog in ${FAKETIME_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + + # Create per-host faketime wrappers + for i in $HOSTS; do + for prog in ${FAKETIME_HOST_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + export PATH=${WRAP_DIR}:${PATH} - # Avoid exporting *any* symbols from the executable - # This avoids conflicts between the libraries statically linked into bitcoin and any - # libraries we may link dynamically (such as Qt and OpenSSL, see issue #4094). - # It also avoids start-up overhead to not export any unnecessary symbols. - # To do this, build a linker script that marks all symbols as local. - LINKER_SCRIPT=$HOME/build/linker_version_script - echo ' - { - local: *; - };' > $LINKER_SCRIPT - function do_configure { - ./configure "$@" --enable-upnp-default --prefix=$STAGING --with-protoc-bindir=$STAGING/host/bin --with-qt-bindir=$STAGING/bin --with-boost=$STAGING --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib -Wl,--version-script=$LINKER_SCRIPT ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" --enable-glibc-back-compat - } - # cd bitcoin + BASEPREFIX=`pwd`/depends + # Build dependencies for each host + for i in $HOSTS; do + make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + done + + # Create the release tarball using (arbitrarily) the first host ./autogen.sh - do_configure + ./configure --prefix=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'` make dist - DISTNAME=`echo bitcoin-*.tar.gz` + SOURCEDIST=`echo bitcoin-*.tar.gz` + DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` + # Correct tar file order + mkdir -p temp + pushd temp + tar xf ../$SOURCEDIST + find bitcoin-* | sort | tar --no-recursion -c -T - | gzip -9n > ../$SOURCEDIST + popd - # Build dynamic versions of everything - # (with static linking to boost and openssl as well a some non-OS deps) - mkdir -p distsrc - cd distsrc - tar --strip-components=1 -xf ../$DISTNAME - do_configure --bindir=$BINDIR - make $MAKEOPTS - make $MAKEOPTS install-strip - make $MAKEOPTS clean + ORIGPATH="$PATH" + # Extract the release tarball into a dir for each host and build + for i in ${HOSTS}; do + export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} + mkdir -p distsrc-${i} + cd distsrc-${i} + INSTALLPATH=`pwd`/installed/${DISTNAME} + mkdir -p ${INSTALLPATH} + tar --strip-components=1 -xf ../$SOURCEDIST - # sort distribution tar file and normalize user/group/mtime information for deterministic output + ./configure --prefix=${BASEPREFIX}/${i} --bindir=${INSTALLPATH}/bin --includedir=${INSTALLPATH}/include --libdir=${INSTALLPATH}/lib --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} + make ${MAKEOPTS} + make install-strip + cd installed + find . -name "lib*.la" -delete + find . -name "lib*.a" -delete + rm -rf ${DISTNAME}/lib/pkgconfig + find . | sort | tar --no-recursion -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz + cd ../../ + done mkdir -p $OUTDIR/src - rm -rf $TEMPDIR - mkdir -p $TEMPDIR - cd $TEMPDIR - tar -xvf $HOME/build/bitcoin/$DISTNAME | sort | tar --no-recursion -cT /dev/stdin --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 --mtime="$REFERENCE_DATETIME" | gzip -n > $OUTDIR/src/$DISTNAME + mv $SOURCEDIST $OUTDIR/src + mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-linux64.tar.gz + mv ${OUTDIR}/${DISTNAME}-i686-*.tar.gz ${OUTDIR}/${DISTNAME}-linux32.tar.gz + diff --git a/contrib/gitian-descriptors/gitian-osx-bitcoin.yml b/contrib/gitian-descriptors/gitian-osx-bitcoin.yml deleted file mode 100644 index bc3d561c35..0000000000 --- a/contrib/gitian-descriptors/gitian-osx-bitcoin.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- -name: "bitcoin" -suites: -- "precise" -architectures: -- "i386" -packages: -- "git-core" -- "automake" -- "faketime" -- "bsdmainutils" -- "pkg-config" -- "p7zip-full" -- "libtool" - -reference_datetime: "2013-06-01 00:00:00" -remotes: -- "url": "https://github.com/bitcoin/bitcoin.git" - "dir": "bitcoin" -files: -- "osx-native-depends-r3.tar.gz" -- "osx-depends-r4.tar.gz" -- "osx-depends-qt-5.2.1-r4.tar.gz" -- "MacOSX10.7.sdk.tar.gz" - -script: | - - HOST=x86_64-apple-darwin11 - PREFIX=`pwd`/osx-cross-depends/prefix - SDK=`pwd`/osx-cross-depends/SDKs/MacOSX10.7.sdk - NATIVEPREFIX=`pwd`/osx-cross-depends/native-prefix - export TAR_OPTIONS="-m --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" - - export SOURCES_PATH=`pwd` - - mkdir -p osx-cross-depends/SDKs - - tar -C osx-cross-depends/SDKs -xf ${SOURCES_PATH}/MacOSX10.7.sdk.tar.gz - - tar -C osx-cross-depends -xf osx-native-depends-r3.tar.gz - tar -C osx-cross-depends -xf osx-depends-r4.tar.gz - tar -C osx-cross-depends -xf osx-depends-qt-5.2.1-r4.tar.gz - export PATH=`pwd`/osx-cross-depends/native-prefix/bin:$PATH - - cd bitcoin - - export ZERO_AR_DATE=1 - export QT_RCC_TEST=1 - ./autogen.sh - ./configure --host=${HOST} --with-boost=${PREFIX} CC=clang CXX=clang++ OBJC=clang OBJCXX=clang++ CFLAGS="-target ${HOST} -mmacosx-version-min=10.6 --sysroot ${SDK} -msse2 -Qunused-arguments" CXXFLAGS="-target ${HOST} -mmacosx-version-min=10.6 --sysroot ${SDK} -msse2 -Qunused-arguments" LDFLAGS="-B${NATIVEPREFIX}/bin -L${PREFIX}/lib -L${SDK}/usr/lib/i686-apple-darwin10/4.2.1" CPPFLAGS="-I${NATIVEPREFIX}/lib/clang/3.2/include -I${PREFIX}/include" SSL_LIBS="-lz -lssl -lcrypto" --disable-tests -with-gui=qt5 PKG_CONFIG_LIBDIR="${PREFIX}/lib/pkgconfig" --disable-dependency-tracking --disable-maintainer-mode - make dist - mkdir -p distsrc - cd distsrc - tar --strip-components=1 -xf ../bitcoin-*.tar* - ./configure --host=${HOST} --with-boost=${PREFIX} CC=clang CXX=clang++ OBJC=clang OBJCXX=clang++ CFLAGS="-target ${HOST} -mmacosx-version-min=10.6 --sysroot ${SDK} -msse2 -Qunused-arguments" CXXFLAGS="-target ${HOST} -mmacosx-version-min=10.6 --sysroot ${SDK} -msse2 -Qunused-arguments" LDFLAGS="-B${NATIVEPREFIX}/bin -L${PREFIX}/lib -L${SDK}/usr/lib/i686-apple-darwin10/4.2.1" CPPFLAGS="-I${NATIVEPREFIX}/lib/clang/3.2/include -I${PREFIX}/include" SSL_LIBS="-lz -lssl -lcrypto" --disable-tests -with-gui=qt5 PKG_CONFIG_LIBDIR="${PREFIX}/lib/pkgconfig" --disable-dependency-tracking --disable-maintainer-mode - make $MAKEOPTS - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - make deploy - dmg dmg Bitcoin-Qt.dmg $OUTDIR/Bitcoin-Qt.dmg diff --git a/contrib/gitian-descriptors/gitian-osx-depends.yml b/contrib/gitian-descriptors/gitian-osx-depends.yml deleted file mode 100644 index 07a021cf0c..0000000000 --- a/contrib/gitian-descriptors/gitian-osx-depends.yml +++ /dev/null @@ -1,159 +0,0 @@ ---- -name: "osx-depends" -suites: -- "precise" -architectures: -- "i386" -packages: -- "git-core" -- "automake" -- "p7zip-full" - -reference_datetime: "2013-06-01 00:00:00" -remotes: [] -files: -- "boost_1_55_0.tar.bz2" -- "db-4.8.30.NC.tar.gz" -- "miniupnpc-1.9.tar.gz" -- "openssl-1.0.1h.tar.gz" -- "protobuf-2.5.0.tar.bz2" -- "qrencode-3.4.3.tar.bz2" -- "MacOSX10.7.sdk.tar.gz" -- "osx-native-depends-r3.tar.gz" - -script: | - - echo "fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52 boost_1_55_0.tar.bz2" | sha256sum -c - echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c - echo "2923e453e880bb949e3d4da9f83dd3cb6f08946d35de0b864d0339cf70934464 miniupnpc-1.9.tar.gz" | sha256sum -c - echo "9d1c8a9836aa63e2c6adb684186cbd4371c9e9dcc01d6e3bb447abf2d4d3d093 openssl-1.0.1h.tar.gz" | sha256sum -c - echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c - echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c - - REVISION=r4 - export SOURCES_PATH=`pwd` - export TAR_OPTIONS="-m --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" - export PATH=$HOME:$PATH - export SOURCES_PATH=`pwd` - export ZERO_AR_DATE=1 - - mkdir -p osx-cross-depends/build - cd osx-cross-depends - - PREFIX=`pwd`/prefix - NATIVEPREFIX=`pwd`/native-prefix - BUILD_BASE=`pwd`/build - SDK=`pwd`/SDKs/MacOSX10.7.sdk - HOST=x86_64-apple-darwin11 - MIN_VERSION=10.6 - - INT_CFLAGS="-target ${HOST} -mmacosx-version-min=${MIN_VERSION} --sysroot ${SDK} -msse2 -Qunused-arguments" - INT_CXXFLAGS="${INT_CFLAGS}" - INT_LDFLAGS="-L${PREFIX}/lib -L${SDK}/usr/lib/i686-apple-darwin10/4.2.1" - INT_LDFLAGS_CLANG="-B${NATIVEPREFIX}/bin" - INT_CPPFLAGS="-I${PREFIX}/include" - INT_CC=clang - INT_CXX=clang++ - INT_OBJC=clang - INT_OBJCXX=clang++ - INT_AR=${HOST}-ar - INT_RANLIB=${HOST}-ranlib - INT_LIBTOOL=${HOST}-libtool - INT_INSTALL_NAME_TOOL=${HOST}-install_name_tool - - export PATH=${NATIVEPREFIX}/bin:${PATH} - - mkdir -p ${NATIVEPREFIX}/bin - mkdir -p ${NATIVEPREFIX}/lib - mkdir -p ${PREFIX}/bin - mkdir -p ${PREFIX}/lib - mkdir -p ${BUILD_BASE} - - mkdir -p SDKs - tar -C SDKs -xf ${SOURCES_PATH}/MacOSX10.7.sdk.tar.gz - - tar xf /home/ubuntu/build/osx-native-depends-r3.tar.gz - - # bdb - SOURCE_FILE=${SOURCES_PATH}/db-4.8.30.NC.tar.gz - BUILD_DIR=${BUILD_BASE}/db-4.8.30.NC - - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - sed -i 's/__atomic_compare_exchange/__atomic_compare_exchange_db/g' ${BUILD_DIR}/dbinc/atomic.h - pushd ${BUILD_DIR} - cd build_unix; - ../dist/configure --host=${HOST} --prefix="${PREFIX}" --disable-shared --enable-cxx CC="${INT_CC}" CXX="${INT_CXX}" AR="${INT_AR}" RANLIB="${INT_RANLIB}" OBJC="${INT_OBJC}" OBJCXX="${INT_OBJCXX}" CFLAGS="${INT_CFLAGS}" CXXFLAGS="${INT_CXXFLAGS}" LDFLAGS="${INT_CLANG_LDFLAGS} ${INT_LDFLAGS}" CPPFLAGS="${INT_CPPFLAGS}" - make $MAKEOPTS libdb.a libdb_cxx.a - make install_lib install_include - popd - - # openssl - SOURCE_FILE=${SOURCES_PATH}/openssl-1.0.1h.tar.gz - BUILD_DIR=${BUILD_BASE}/openssl-1.0.1h - - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - pushd ${BUILD_DIR} - sed -ie "s|cc:|${INT_CC}:|" ${BUILD_DIR}/Configure - sed -ie "s|\(-arch [_a-zA-Z0-9]*\)|\1 --sysroot ${SDK} -target ${HOST} -msse2|" ${BUILD_DIR}/Configure - AR="${INT_AR}" RANLIB="${INT_RANLIB}" ./Configure --prefix=${PREFIX} --openssldir=${PREFIX}/etc/openssl zlib shared no-krb5 darwin64-x86_64-cc ${INT_LDFLAGS} ${INT_CLANG_LDFLAGS} ${INT_CPPFLAGS} - sed -i "s|engines apps test|engines|" ${BUILD_DIR}/Makefile - sed -i "/define DATE/d" ${BUILD_DIR}/crypto/Makefile - make -j1 build_libs libcrypto.pc libssl.pc openssl.pc - make -j1 install_sw - popd - - #libminiupnpc - SOURCE_FILE=${SOURCES_PATH}/miniupnpc-1.9.tar.gz - BUILD_DIR=${BUILD_BASE}/miniupnpc-1.9 - - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - pushd ${BUILD_DIR} - CFLAGS="${INT_CFLAGS} ${INT_CPPFLAGS}" make $MAKEOPTS OS=Darwin CC="${INT_CC}" AR="${INT_AR}" libminiupnpc.a - install -d ${PREFIX}/include/miniupnpc - install *.h ${PREFIX}/include/miniupnpc - install libminiupnpc.a ${PREFIX}/lib - popd - - # qrencode - SOURCE_FILE=${SOURCES_PATH}/qrencode-3.4.3.tar.bz2 - BUILD_DIR=${BUILD_BASE}/qrencode-3.4.3 - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - pushd ${BUILD_DIR} - - # m4 folder is not included in the stable release, which can confuse aclocal - # if its timestamp ends up being earlier than configure.ac when extracted - touch aclocal.m4 - ./configure --host=${HOST} --prefix="${PREFIX}" --disable-shared CC="${INT_CC}" CXX="${INT_CXX}" AR="${INT_AR}" RANLIB="${INT_RANLIB}" OBJC="${INT_OBJC}" OBJCXX="${INT_OBJCXX}" CFLAGS="${INT_CFLAGS}" CXXFLAGS="${INT_CXXFLAGS}" LDFLAGS="${INT_CLANG_LDFLAGS} ${INT_LDFLAGS}" CPPFLAGS="${INT_CPPFLAGS}" --disable-shared -without-tools --disable-sdltest --disable-dependency-tracking - make $MAKEOPTS - make install - popd - - # libprotobuf - SOURCE_FILE=${SOURCES_PATH}/protobuf-2.5.0.tar.bz2 - BUILD_DIR=${BUILD_BASE}/protobuf-2.5.0 - - tar -C ${BUILD_BASE} -xjf ${SOURCE_FILE} - pushd ${BUILD_DIR} - ./configure --host=${HOST} --prefix="${PREFIX}" --disable-shared --enable-cxx CC="${INT_CC}" CXX="${INT_CXX}" AR="${INT_AR}" RANLIB="${INT_RANLIB}" OBJC="${INT_OBJC}" OBJCXX="${INT_OBJCXX}" CFLAGS="${INT_CFLAGS}" CXXFLAGS="${INT_CXXFLAGS}" LDFLAGS="${INT_CLANG_LDFLAGS} ${INT_LDFLAGS}" CPPFLAGS="${INT_CPPFLAGS}" --enable-shared=no --disable-dependency-tracking --with-protoc=${NATIVEPREFIX}/bin/protoc - cd src - make $MAKEOPTS libprotobuf.la - make install-libLTLIBRARIES install-nobase_includeHEADERS - cd .. - make install-pkgconfigDATA - popd - - # boost - SOURCE_FILE=${SOURCES_PATH}/boost_1_55_0.tar.bz2 - BUILD_DIR=${BUILD_BASE}/boost_1_55_0 - - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - pushd ${BUILD_DIR} - ./bootstrap.sh --with-libraries=chrono,filesystem,program_options,system,thread,test - echo "using darwin : : ${INT_CXX} : <cxxflags>\"${INT_CFLAGS} ${INT_CPPFLAGS}\" <linkflags>\"${INT_LDFLAGS} ${INT_CLANG_LDFLAGS}\" <archiver>\"${INT_LIBTOOL}\" <striper>\"${INT_STRIP}\" : ;" > "user-config.jam" - ./b2 -d2 --layout=tagged --build-type=complete --prefix="${PREFIX}" --toolset=darwin-4.2.1 --user-config=user-config.jam variant=release threading=multi link=static install - popd - - export GZIP="-9n" - find prefix | sort | tar --no-recursion -czf osx-depends-${REVISION}.tar.gz -T - - - mv osx-depends-${REVISION}.tar.gz $OUTDIR diff --git a/contrib/gitian-descriptors/gitian-osx-native.yml b/contrib/gitian-descriptors/gitian-osx-native.yml deleted file mode 100644 index a753ad704f..0000000000 --- a/contrib/gitian-descriptors/gitian-osx-native.yml +++ /dev/null @@ -1,178 +0,0 @@ ---- -name: "osx-native" -suites: -- "precise" -architectures: -- "i386" -packages: -- "git-core" -- "automake" -- "faketime" -- "libssl-dev" -- "libbz2-dev" -- "libz-dev" -- "cmake" -- "libcap-dev" -- "p7zip-full" -- "uuid-dev" - -reference_datetime: "2013-06-01 00:00:00" -remotes: [] -files: -- "10cc648683617cca8bcbeae507888099b41b530c.tar.gz" -- "cctools-809.tar.gz" -- "dyld-195.5.tar.gz" -- "ld64-127.2.tar.gz" -- "protobuf-2.5.0.tar.bz2" -- "MacOSX10.7.sdk.tar.gz" -- "cdrkit-1.1.11.tar.gz" -- "libdmg-hfsplus-v0.1.tar.gz" -- "clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz" -- "cdrkit-deterministic.patch" - - -script: | - - echo "18406961fd4a1ec5c7ea35c91d6a80a2f8bb797a2bd243a610bd75e13eff9aca 10cc648683617cca8bcbeae507888099b41b530c.tar.gz" | sha256sum -c - echo "03ba62749b843b131c7304a044a98c6ffacd65b1399b921d69add0375f79d8ad cctools-809.tar.gz" | sha256sum -c - echo "2cf0484c87cf79b606b351a7055a247dae84093ae92c747a74e0cde2c8c8f83c dyld-195.5.tar.gz" | sha256sum -c - echo "97b75547b2bd761306ab3e15ae297f01e7ab9760b922bc657f4ef72e4e052142 ld64-127.2.tar.gz" | sha256sum -c - echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c - echo "d1c030756ecc182defee9fe885638c1785d35a2c2a297b4604c0e0dcc78e47da cdrkit-1.1.11.tar.gz" | sha256sum -c - echo "6569a02eb31c2827080d7d59001869ea14484c281efab0ae7f2b86af5c3120b3 libdmg-hfsplus-v0.1.tar.gz" | sha256sum -c - echo "b9d57a88f9514fa1f327a1a703756d0c1c960f4c58494a5bd80313245d13ffff clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz" | sha256sum -c - echo "cc12bdbd7a09f71cb2a6a3e6ec3e0abe885ca7111c2b47857f5095e5980caf4f cdrkit-deterministic.patch" | sha256sum -c - - - REVISION=r3 - export REFERENCE_DATETIME - export TAR_OPTIONS="-m --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - - REAL_AR=`which ar` - REAL_RANLIB=`which ranlib` - REAL_DATE=`which date` - - echo '#!/bin/bash' > $HOME/ar - echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ar - echo "$REAL_AR \"\$@\"" >> $HOME/ar - - echo '#!/bin/bash' > $HOME/ranlib - echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ranlib - echo "$REAL_RANLIB \"\$@\"" >> $HOME/ranlib - - echo '#!/bin/bash' > $HOME/date - echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/date - echo "$REAL_DATE \"\$@\"" >> $HOME/date - - chmod +x $HOME/ar $HOME/ranlib $HOME/date - - - export PATH=$HOME:$PATH - export SOURCES_PATH=`pwd` - - mkdir -p osx-cross-depends/build - cd osx-cross-depends - - NATIVEPREFIX=`pwd`/native-prefix - BUILD_BASE=`pwd`/build - SDK=`pwd`/SDKs/MacOSX10.7.sdk - HOST=x86_64-apple-darwin11 - MIN_VERSION=10.6 - - CFLAGS="" - CXXFLAGS="${CFLAGS}" - LDFLAGS="-L${NATIVEPREFIX}/lib" - - export PATH=${NATIVEPREFIX}/bin:${PATH} - - mkdir -p ${NATIVEPREFIX}/bin - mkdir -p ${NATIVEPREFIX}/lib - - mkdir -p SDKs - tar -C SDKs -xf ${SOURCES_PATH}/MacOSX10.7.sdk.tar.gz - - # Clang - SOURCE_FILE=${SOURCES_PATH}/clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz - BUILD_DIR=${BUILD_BASE}/clang+llvm-3.2-x86-linux-ubuntu-12.04 - - mkdir -p ${NATIVEPREFIX}/lib/clang/3.2/include - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - cp ${BUILD_DIR}/bin/clang ${NATIVEPREFIX}/bin/ - cp ${BUILD_DIR}/bin/clang++ ${NATIVEPREFIX}/bin/ - cp ${BUILD_DIR}/lib/libLTO.so ${NATIVEPREFIX}/lib/ - cp ${BUILD_DIR}/lib/clang/3.2/include/* ${NATIVEPREFIX}/lib/clang/3.2/include - - # cctools - SOURCE_FILE=${SOURCES_PATH}/10cc648683617cca8bcbeae507888099b41b530c.tar.gz - BUILD_DIR=${BUILD_BASE}/toolchain4-10cc648683617cca8bcbeae507888099b41b530c - - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - mkdir -p ${BUILD_DIR}/sdks - pushd ${BUILD_DIR}/sdks; - ln -sf ${SDK} MacOSX10.7.sdk - ln -sf ${SOURCES_PATH}/cctools-809.tar.gz ${BUILD_DIR}/cctools2odcctools/cctools-809.tar.gz - ln -sf ${SOURCES_PATH}/ld64-127.2.tar.gz ${BUILD_DIR}/cctools2odcctools/ld64-127.2.tar.gz - ln -sf ${SOURCES_PATH}/dyld-195.5.tar.gz ${BUILD_DIR}/cctools2odcctools/dyld-195.5.tar.gz - - tar -C ${BUILD_DIR} -xf ${SOURCES_PATH}/clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz - # Hack in the use of our llvm headers rather than grabbing the old llvm-gcc. - sed -i "s|GCC_DIR|LLVM_CLANG_DIR|g" ${BUILD_DIR}/cctools2odcctools/extract.sh - sed -i "s|llvmgcc42-2336.1|clang+llvm-3.2-x86-linux-ubuntu-12.04|g" ${BUILD_DIR}/cctools2odcctools/extract.sh - sed -i "s|\${LLVM_CLANG_DIR}/llvmCore/include/llvm-c|\${LLVM_CLANG_DIR}/include/llvm-c \${LLVM_CLANG_DIR}/include/llvm |" ${BUILD_DIR}/cctools2odcctools/extract.sh - - sed -i "s|fAC_INIT|AC_INIT|" ${BUILD_DIR}/cctools2odcctools/files/configure.ac - sed -i 's/\# Dynamically linked LTO/\t ;\&\n\t linux*)\n# Dynamically linked LTO/' ${BUILD_DIR}/cctools2odcctools/files/configure.ac - - cd ${BUILD_DIR}/cctools2odcctools - ./extract.sh --osxver 10.7 - cd odcctools-809 - ./configure --prefix=${NATIVEPREFIX} --target=${HOST} CFLAGS="${CFLAGS} -I${NATIVEPREFIX}/include -D__DARWIN_UNIX03 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS" LDFLAGS="${LDFLAGS} -Wl,-rpath=\\\$\$ORIGIN/../lib" --with-sysroot=${SDK} - - # The 'PC' define in sparc/reg.h conflicts but doesn't get used anyway. Just rename it. - sed -i "s|define\tPC|define\tPC_|" ${BUILD_DIR}/cctools2odcctools/odcctools-809/include/architecture/sparc/reg.h - make $MAKEOPTS - make install - popd - - # protoc - SOURCE_FILE=${SOURCES_PATH}/protobuf-2.5.0.tar.bz2 - BUILD_DIR=${BUILD_BASE}/protobuf-2.5.0 - - tar -C ${BUILD_BASE} -xjf ${SOURCE_FILE} - pushd ${BUILD_DIR}; - ./configure --enable-shared=no --disable-dependency-tracking --prefix=${NATIVEPREFIX} - make $MAKEOPTS - cp ${BUILD_DIR}/src/protoc ${NATIVEPREFIX}/bin/ - popd - - # cdrkit - SOURCE_FILE=${SOURCES_PATH}/cdrkit-1.1.11.tar.gz - BUILD_DIR=${BUILD_BASE}/cdrkit-1.1.11 - - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - pushd ${BUILD_DIR} - patch -p1 < ${SOURCES_PATH}/cdrkit-deterministic.patch - cmake -DCMAKE_INSTALL_PREFIX=${NATIVEPREFIX} - make $MAKEOPTS genisoimage - make -C genisoimage install - popd - - # libdmg-hfsplus - SOURCE_FILE=${SOURCES_PATH}/libdmg-hfsplus-v0.1.tar.gz - BUILD_DIR=${BUILD_BASE}/libdmg-hfsplus-libdmg-hfsplus-v0.1 - - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - mkdir -p ${BUILD_DIR}/build - pushd ${BUILD_DIR}/build - cmake -DCMAKE_INSTALL_PREFIX:PATH=${NATIVEPREFIX}/bin .. - make $MAKEOPTS - make install - popd - - rm -rf native-prefix/docs - - export GZIP="-9n" - find native-prefix | sort | tar --no-recursion -czf osx-native-depends-$REVISION.tar.gz -T - - mv osx-native-depends-$REVISION.tar.gz $OUTDIR diff --git a/contrib/gitian-descriptors/gitian-osx-qt.yml b/contrib/gitian-descriptors/gitian-osx-qt.yml deleted file mode 100644 index 5e0ad9222a..0000000000 --- a/contrib/gitian-descriptors/gitian-osx-qt.yml +++ /dev/null @@ -1,186 +0,0 @@ ---- -name: "osx-qt" -suites: -- "precise" -architectures: -- "i386" -packages: -- "git-core" -- "automake" -- "p7zip-full" - -reference_datetime: "2013-06-01 00:00:00" -remotes: [] -files: -- "qt-everywhere-opensource-src-5.2.1.tar.gz" -- "osx-native-depends-r3.tar.gz" -- "osx-depends-r4.tar.gz" -- "MacOSX10.7.sdk.tar.gz" - -script: | - - echo "84e924181d4ad6db00239d87250cc89868484a14841f77fb85ab1f1dbdcd7da1 qt-everywhere-opensource-src-5.2.1.tar.gz" | sha256sum -c - - REVISION=r4 - export SOURCES_PATH=`pwd` - export TAR_OPTIONS="-m --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" - export ZERO_AR_DATE=1 - - export TZ=UTC - - REAL_DATE=`which date` - echo '#!/bin/bash' > $HOME/date - echo "$REAL_DATE -d \"${REFERENCE_DATETIME}\" \"\$@\"" >> $HOME/date - - chmod +x $HOME/date - export PATH=$HOME:$PATH - - mkdir -p osx-cross-depends/build - cd osx-cross-depends - - PREFIX=`pwd`/prefix - NATIVEPREFIX=`pwd`/native-prefix - BUILD_BASE=`pwd`/build - SDK=`pwd`/SDKs/MacOSX10.7.sdk - HOST=x86_64-apple-darwin11 - MIN_VERSION=10.6 - - INT_CFLAGS="-target ${HOST} -mmacosx-version-min=${MIN_VERSION} --sysroot ${SDK} -msse2 -Qunused-arguments" - INT_CXXFLAGS="${INT_CFLAGS}" - INT_LDFLAGS="-L${PREFIX}/lib -L${SDK}/usr/lib/i686-apple-darwin10/4.2.1" - INT_LDFLAGS_CLANG="-B${NATIVEPREFIX}/bin" - INT_CPPFLAGS="-I${PREFIX}/include" - INT_CC=clang - INT_CXX=clang++ - INT_OBJC=clang - INT_OBJCXX=clang++ - INT_AR=${HOST}-ar - INT_RANLIB=${HOST}-ranlib - INT_LIBTOOL=${HOST}-libtool - INT_INSTALL_NAME_TOOL=${HOST}-install_name_tool - - export PATH=${NATIVEPREFIX}/bin:${PATH} - - mkdir -p ${NATIVEPREFIX}/bin - mkdir -p ${NATIVEPREFIX}/lib - mkdir -p ${PREFIX}/bin - mkdir -p ${PREFIX}/lib - mkdir -p ${BUILD_BASE} - - mkdir -p SDKs - tar -C SDKs -xf ${SOURCES_PATH}/MacOSX10.7.sdk.tar.gz - - tar xf /home/ubuntu/build/osx-native-depends-r3.tar.gz - - export PATH=`pwd`/native-prefix/bin:$PATH - tar xf /home/ubuntu/build/osx-depends-r4.tar.gz - - SOURCE_FILE=${SOURCES_PATH}/qt-everywhere-opensource-src-5.2.1.tar.gz - BUILD_DIR=${BUILD_BASE}/qt-everywhere-opensource-src-5.2.1 - - - tar -C ${BUILD_BASE} -xf ${SOURCE_FILE} - - # Install our mkspec. All files are pulled from the macx-clang spec, except for - # our custom qmake.conf - SPECFILE=${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux/qmake.conf - - mkdir -p ${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux - cp -f ${BUILD_DIR}/qtbase/mkspecs/macx-clang/Info.plist.lib ${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux/ - cp -f ${BUILD_DIR}/qtbase/mkspecs/macx-clang/Info.plist.app ${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux/ - cp -f ${BUILD_DIR}/qtbase/mkspecs/macx-clang/qplatformdefs.h ${BUILD_DIR}/qtbase/mkspecs/macx-clang-linux/ - - cat > ${SPECFILE} <<ENDCONF - - MAKEFILE_GENERATOR = UNIX - CONFIG += app_bundle incremental global_init_link_order lib_version_first plugin_no_soname absolute_library_soname - QMAKE_INCREMENTAL_STYLE = sublib - - include(../common/macx.conf) - include(../common/gcc-base-mac.conf) - include(../common/clang.conf) - include(../common/clang-mac.conf) - - QMAKE_XCODE_VERSION=4.3 - QMAKE_XCODE_DEVELOPER_PATH=/Developer - - QMAKE_MACOSX_DEPLOYMENT_TARGET = ${MIN_VERSION} - - QMAKE_MAC_SDK=macosx - QMAKE_MAC_SDK.macosx.path = ${SDK} - QMAKE_MAC_SDK.macosx.platform_name = macosx - QMAKE_MAC_SDK_PATH=${SDK} - - QMAKE_CFLAGS += -target ${HOST} - QMAKE_OBJECTIVE_CFLAGS += -target ${HOST} - QMAKE_CXXFLAGS += -target ${HOST} - - QMAKE_LFLAGS += -target ${HOST} - QMAKE_AR = ${HOST}-ar cq - QMAKE_RANLIB=${HOST}-ranlib - QMAKE_LIBTOOL=${HOST}-libtool - QMAKE_INSTALL_NAME_TOOL=${HOST}-install_name_tool - - load(qt_config) - - ENDCONF - - pushd ${BUILD_DIR} - ./configure -release -opensource -openssl-linked \ - -no-audio-backend -no-javascript-jit -no-sql-sqlite -no-sql-tds \ - -no-cups -no-iconv -no-dbus -no-gif -no-audio-backend -no-freetype \ - -no-javascript-jit -no-sql-sqlite -no-nis -no-cups -no-iconv -no-pch \ - -no-dbus -no-gif -no-sm -nomake examples -no-feature-style-plastique \ - -no-xcb -no-qml-debug -no-pch -no-nis \ - -no-feature-style-cde -no-feature-style-s60 -no-feature-style-motif \ - -no-feature-style-windowsmobile -no-feature-style-windowsce \ - -no-feature-style-cleanlooks \ - -no-sql-db2 -no-sql-ibase -no-sql-oci -no-sql-tds -no-sql-mysql \ - -no-sql-odbc -no-sql-psql -no-sql-sqlite -no-sql-sqlite2 \ - -skip qtsvg -skip qtwebkit -skip qtwebkit-examples -skip qtserialport \ - -skip qtdeclarative -skip qtmultimedia -skip qtimageformats \ - -skip qtlocation -skip qtsensors -skip qtquick1 -skip qtxmlpatterns \ - -skip qtquickcontrols -skip qtactiveqt -skip qtconnectivity \ - -skip qtwinextras -skip qtscript \ - -prefix ${PREFIX} -bindir ${NATIVEPREFIX}/bin \ - -confirm-license -xplatform macx-clang-linux -v ${INT_LDFLAGS} - - # RCC's output is sorted using each file entry's hash as the key. Unfortunately, - # the hash function uses a random seed for each run so the results aren't - # deterministic. This leads to static resources being defined in a random order, - # which in-turn means that object files are not predictable. - # Fortunately, this upsets Qt's unit tests as well, so they've added the - # QT_RCC_TEST environment variable to set a pre-defined seed. Here, do the same - # thing for the same reason. - QT_RCC_TEST=1 make $MAKEOPTS module-qtbase-make_first - - - make $MAKEOPTS module-qttranslations-make_first - make $MAKEOPTS module-qttools-make_first - make $MAKEOPTS -C qtbase - make -C qtbase install - make -C qttranslations install - make -C qttools/src/linguist install - popd - - # This file should not be installed to the destination. It's native and - # non-deterministic. Remove it. - # See: https://bugreports.qt-project.org/browse/QTBUG-31393 - rm -f ${PREFIX}/lib/libQt5Bootstrap.a - - rm -f ${PREFIX}/lib/Qt*.framework/Qt*.prl - pushd ${PREFIX}/include - ln -sf ../lib/QtNetwork.framework/Headers/ QtNetwork - ln -sf ../lib/QtWidgets.framework/Headers/ QtWidgets - ln -sf ../lib/QtGui.framework/Headers/ QtGui - ln -sf ../lib/QtCore.framework/Headers/ QtCore - ln -sf ../lib/QtTest.framework/Headers/ QtTest - popd - - rm -f ${PREFIX}/lib/*.la - find ${PREFIX}/lib -name "*.prl" -delete - - export GZIP="-9n" - find native-prefix prefix | sort | tar --no-recursion -czf osx-depends-qt-5.2.1-${REVISION}.tar.gz -T - - - mv osx-depends-qt-5.2.1-${REVISION}.tar.gz $OUTDIR diff --git a/contrib/gitian-descriptors/gitian-osx-signer.yml b/contrib/gitian-descriptors/gitian-osx-signer.yml new file mode 100644 index 0000000000..db9b4af93d --- /dev/null +++ b/contrib/gitian-descriptors/gitian-osx-signer.yml @@ -0,0 +1,37 @@ +--- +name: "bitcoin-dmg-signer" +suites: +- "precise" +architectures: +- "amd64" +packages: +- "libc6:i386" +- "faketime" +reference_datetime: "2013-06-01 00:00:00" +remotes: [] +files: +- "bitcoin-0.9.99-osx-unsigned.tar.gz" +- "signature.tar.gz" +script: | + WRAP_DIR=$HOME/wrapped + mkdir -p ${WRAP_DIR} + export PATH=`pwd`:$PATH + FAKETIME_PROGS="dmg genisoimage" + + # Create global faketime wrappers + for prog in ${FAKETIME_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + + UNSIGNED=`echo bitcoin-*.tar.gz` + SIGNED=`echo ${UNSIGNED} | sed 's/.tar.*//' | sed 's/-unsigned//'`.dmg + + tar -xf ${UNSIGNED} + ./detached-sig-apply.sh ${UNSIGNED} signature.tar.gz + ${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "Bitcoin-Qt" -no-pad -r -apple -o uncompressed.dmg signed-app + ${WRAP_DIR}/dmg dmg uncompressed.dmg ${OUTDIR}/${SIGNED} diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml new file mode 100644 index 0000000000..eb6df2096e --- /dev/null +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -0,0 +1,134 @@ +--- +name: "bitcoin-osx-0.10" +enable_cache: true +suites: +- "precise" +architectures: +- "amd64" +packages: +- "g++-multilib" +- "git-core" +- "pkg-config" +- "autoconf2.13" +- "libtool" +- "automake" +- "faketime" +- "bsdmainutils" +- "cmake" +- "libcap-dev" +- "libz-dev" +- "libbz2-dev" +reference_datetime: "2013-06-01 00:00:00" +remotes: +- "url": "https://github.com/bitcoin/bitcoin.git" + "dir": "bitcoin" +files: +- "MacOSX10.7.sdk.tar.gz" +script: | + WRAP_DIR=$HOME/wrapped + HOSTS="x86_64-apple-darwin11" + CONFIGFLAGS="--enable-upnp-default GENISOIMAGE=$WRAP_DIR/genisoimage" + FAKETIME_HOST_PROGS="" + FAKETIME_PROGS="ar ranlib date dmg genisoimage" + + export QT_RCC_TEST=1 + export GZIP="-9n" + export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" + export TZ="UTC" + export BUILD_DIR=`pwd` + mkdir -p ${WRAP_DIR} + if test -n "$GBUILD_CACHE_ENABLED"; then + export SOURCES_PATH=${GBUILD_COMMON_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + fi + + export ZERO_AR_DATE=1 + + # Create global faketime wrappers + for prog in ${FAKETIME_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + + # Create per-host faketime wrappers + for i in $HOSTS; do + for prog in ${FAKETIME_HOST_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + export PATH=${WRAP_DIR}:${PATH} + + cd bitcoin + BASEPREFIX=`pwd`/depends + + mkdir -p ${BASEPREFIX}/SDKs + tar -C ${BASEPREFIX}/SDKs -xf ${BUILD_DIR}/MacOSX10.7.sdk.tar.gz + + # Build dependencies for each host + for i in $HOSTS; do + make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + done + + # Create the release tarball using (arbitrarily) the first host + ./autogen.sh + ./configure --prefix=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'` + make dist + SOURCEDIST=`echo bitcoin-*.tar.gz` + DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` + + # Correct tar file order + mkdir -p temp + pushd temp + tar xf ../$SOURCEDIST + find bitcoin-* | sort | tar --no-recursion -c -T - | gzip -9n > ../$SOURCEDIST + popd + + ORIGPATH="$PATH" + # Extract the release tarball into a dir for each host and build + for i in ${HOSTS}; do + export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} + mkdir -p distsrc-${i} + cd distsrc-${i} + INSTALLPATH=`pwd`/installed/${DISTNAME} + mkdir -p ${INSTALLPATH} + tar --strip-components=1 -xf ../$SOURCEDIST + + ./configure --prefix=${BASEPREFIX}/${i} --bindir=${INSTALLPATH}/bin --includedir=${INSTALLPATH}/include --libdir=${INSTALLPATH}/lib --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} + make ${MAKEOPTS} + make install-strip + + make deploydir + mkdir -p unsigned-app-${i} + cp contrib/macdeploy/detached-sig-apply.sh unsigned-app-${i} + cp contrib/macdeploy/detached-sig-create.sh unsigned-app-${i} + cp ${BASEPREFIX}/${i}/native/bin/dmg ${BASEPREFIX}/${i}/native/bin/genisoimage unsigned-app-${i} + cp ${BASEPREFIX}/${i}/native/bin/${i}-codesign_allocate unsigned-app-${i}/codesign_allocate + cp ${BASEPREFIX}/${i}/native/bin/${i}-pagestuff unsigned-app-${i}/pagestuff + mv dist unsigned-app-${i} + pushd unsigned-app-${i} + find . | sort | tar --no-recursion -czf ${OUTDIR}/${DISTNAME}-osx-unsigned.tar.gz -T - + popd + + make deploy + ${WRAP_DIR}/dmg dmg Bitcoin-Qt.dmg ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg + + cd installed + find . -name "lib*.la" -delete + find . -name "lib*.a" -delete + rm -rf ${DISTNAME}/lib/pkgconfig + find . | sort | tar --no-recursion -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz + cd ../../ + done + mkdir -p $OUTDIR/src + mv $SOURCEDIST $OUTDIR/src + mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-osx64.tar.gz diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index b2795c5376..97c823cde6 100644 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -1,97 +1,115 @@ --- -name: "bitcoin" +name: "bitcoin-win-0.10" +enable_cache: true suites: - "precise" architectures: - "amd64" -packages: -- "mingw-w64" -- "g++-mingw-w64" +packages: +- "g++" - "git-core" -- "unzip" -- "nsis" -- "faketime" +- "pkg-config" - "autoconf2.13" - "libtool" - "automake" -- "pkg-config" +- "faketime" - "bsdmainutils" - +- "mingw-w64" +- "g++-mingw-w64" +- "nsis" +- "zip" reference_datetime: "2013-06-01 00:00:00" remotes: - "url": "https://github.com/bitcoin/bitcoin.git" "dir": "bitcoin" -files: -- "qt-win32-5.2.0-gitian-r3.zip" -- "qt-win64-5.2.0-gitian-r3.zip" -- "boost-win32-1.55.0-gitian-r6.zip" -- "boost-win64-1.55.0-gitian-r6.zip" -- "bitcoin-deps-win32-gitian-r13.zip" -- "bitcoin-deps-win64-gitian-r13.zip" -- "protobuf-win32-2.5.0-gitian-r4.zip" -- "protobuf-win64-2.5.0-gitian-r4.zip" +files: [] script: | - # Defines - export TZ=UTC - INDIR=$HOME/build - OPTFLAGS='-O2' - TEMPDIR="$HOME/tempdir" - NEEDDIST=1 - # Qt: workaround for determinism in resource ordering - # Qt5's rcc uses a QHash to store the files for the resource. - # A security fix in QHash makes the ordering of keys to be different on every run - # (https://qt.gitorious.org/qt/qtbase/commit/c01eaa438200edc9a3bbcd8ae1e8ded058bea268). - # This is good in general but qrc shouldn't be doing a traversal over a randomized container. - # The thorough solution would be to use QMap instead of QHash, but this requires patching Qt. - # For now luckily there is a test mode that forces a fixed seed. + WRAP_DIR=$HOME/wrapped + HOSTS="x86_64-w64-mingw32 i686-w64-mingw32" + CONFIGFLAGS="--enable-upnp-default" + FAKETIME_HOST_PROGS="g++ ar ranlib nm windres strip" + FAKETIME_PROGS="date makensis zip" + export QT_RCC_TEST=1 - for BITS in 32 64; do # for architectures - # - STAGING=$HOME/staging${BITS} - BUILDDIR=$HOME/build${BITS} - BINDIR=$OUTDIR/$BITS - if [ "x$BITS" = "x32" ]; then - HOST=i686-w64-mingw32 - else - HOST=x86_64-w64-mingw32 - fi - export PATH=$STAGING/host/bin:$PATH - mkdir -p $STAGING $BUILDDIR $BINDIR - # - cd $STAGING - unzip $INDIR/qt-win${BITS}-5.2.0-gitian-r3.zip - unzip $INDIR/boost-win${BITS}-1.55.0-gitian-r6.zip - unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r13.zip - unzip $INDIR/protobuf-win${BITS}-2.5.0-gitian-r4.zip - if [ "x$NEEDDIST" = "x1" ]; then - # Make source code archive which is architecture independent so it only needs to be done once - cd $HOME/build/bitcoin - ./autogen.sh - ./configure --bindir=$OUTDIR --prefix=$STAGING --host=$HOST --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" - make dist - DISTNAME=`echo bitcoin-*.tar.gz` - NEEDDIST=0 - fi - # Build platform-dependent executables from source archive - cd $BUILDDIR - mkdir -p distsrc - cd distsrc - tar --strip-components=1 -xf $HOME/build/bitcoin/$DISTNAME - ./configure --enable-upnp-default --bindir=$BINDIR --prefix=$STAGING --host=$HOST --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - make $MAKEOPTS + export GZIP="-9n" + export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" + export TZ="UTC" + export BUILD_DIR=`pwd` + mkdir -p ${WRAP_DIR} + if test -n "$GBUILD_CACHE_ENABLED"; then + export SOURCES_PATH=${GBUILD_COMMON_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + fi + + # Create global faketime wrappers + for prog in ${FAKETIME_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + + # Create per-host faketime wrappers + for i in $HOSTS; do + for prog in ${FAKETIME_HOST_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + export PATH=${WRAP_DIR}:${PATH} + + cd bitcoin + BASEPREFIX=`pwd`/depends + # Build dependencies for each host + for i in $HOSTS; do + make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + done + + # Create the release tarball using (arbitrarily) the first host + ./autogen.sh + ./configure --prefix=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'` + make dist + SOURCEDIST=`echo bitcoin-*.tar.gz` + DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` + + # Correct tar file order + mkdir -p temp + pushd temp + tar xf ../$SOURCEDIST + find bitcoin-* | sort | tar --no-recursion -c -T - | gzip -9n > ../$SOURCEDIST + popd + + ORIGPATH="$PATH" + # Extract the release tarball into a dir for each host and build + for i in ${HOSTS}; do + export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} + mkdir -p distsrc-${i} + cd distsrc-${i} + INSTALLPATH=`pwd`/installed/${DISTNAME} + mkdir -p ${INSTALLPATH} + tar --strip-components=1 -xf ../$SOURCEDIST + + ./configure --prefix=${BASEPREFIX}/${i} --bindir=${INSTALLPATH}/bin --includedir=${INSTALLPATH}/include --libdir=${INSTALLPATH}/lib --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} + make ${MAKEOPTS} make deploy make install-strip - cp -f bitcoin-*setup*.exe $BINDIR/ - unset LD_PRELOAD - unset FAKETIME - done # for BITS in - - # sort distribution tar file and normalize user/group/mtime information for deterministic output + cp -f bitcoin-*setup*.exe $OUTDIR/ + cd installed + mv ${DISTNAME}/bin/*.dll ${DISTNAME}/lib/ + find . -name "lib*.la" -delete + find . -name "lib*.a" -delete + rm -rf ${DISTNAME}/lib/pkgconfig + find . -type f | sort | zip -X@ ${OUTDIR}/${DISTNAME}-${i}.zip + cd ../.. + done mkdir -p $OUTDIR/src - rm -rf $TEMPDIR - mkdir -p $TEMPDIR - cd $TEMPDIR - tar -xvf $HOME/build/bitcoin/$DISTNAME | sort | tar --no-recursion -cT /dev/stdin --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 --mtime="$REFERENCE_DATETIME" | gzip -n > $OUTDIR/src/$DISTNAME - + mv $SOURCEDIST $OUTDIR/src + mv ${OUTDIR}/${DISTNAME}-x86_64-*.zip ${OUTDIR}/${DISTNAME}-win64.zip + mv ${OUTDIR}/${DISTNAME}-i686-*.zip ${OUTDIR}/${DISTNAME}-win32.zip diff --git a/contrib/gitian-descriptors/protobuf-win.yml b/contrib/gitian-descriptors/protobuf-win.yml deleted file mode 100644 index 1b7af08843..0000000000 --- a/contrib/gitian-descriptors/protobuf-win.yml +++ /dev/null @@ -1,65 +0,0 @@ ---- -name: "protobuf-win32" -suites: -- "precise" -architectures: -- "amd64" -packages: -- "mingw-w64" -- "g++-mingw-w64" -- "zip" -- "faketime" -reference_datetime: "2013-04-15 00:00:00" -remotes: [] -files: -- "protobuf-2.5.0.tar.bz2" -script: | - # - export TZ=UTC - INDIR=$HOME/build - TEMPDIR=$HOME/tmp - OPTFLAGS="-O2" - # Integrity Check - echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c - - for BITS in 32 64; do # for architectures - # - INSTALLPREFIX=$HOME/staging${BITS} - BUILDDIR=$HOME/build${BITS} - if [ "x$BITS" = "x32" ]; then - HOST=i686-w64-mingw32 - else - HOST=x86_64-w64-mingw32 - fi - # - mkdir -p $INSTALLPREFIX $BUILDDIR - cd $BUILDDIR - # - tar xjf $INDIR/protobuf-2.5.0.tar.bz2 - cd protobuf-2.5.0 - # First: build a native (linux) protoc - ./configure --enable-shared=no --disable-dependency-tracking --without-zlib CXXFLAGS="-frandom-seed=11 ${OPTFLAGS}" - make - mkdir -p $INSTALLPREFIX/host/bin - cp src/protoc $INSTALLPREFIX/host/bin - # Now recompile with the mingw cross-compiler: - make distclean - ./configure --prefix=$INSTALLPREFIX --enable-shared=no --disable-dependency-tracking --without-zlib --with-protoc=$INSTALLPREFIX/host/bin/protoc --host=$HOST CXXFLAGS="-frandom-seed=11 ${OPTFLAGS}" - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - make - make install - # post-process all generated libraries to be deterministic - # extract them to a temporary directory then re-build them deterministically - for LIB in $(find $INSTALLPREFIX -name \*.a); do - rm -rf $TEMPDIR && mkdir $TEMPDIR && cd $TEMPDIR - $HOST-ar xv $LIB | cut -b5- > /tmp/list.txt - rm $LIB - $HOST-ar crsD $LIB $(cat /tmp/list.txt) - done - # - cd $INSTALLPREFIX - find include lib host | sort | zip -X@ $OUTDIR/protobuf-win$BITS-2.5.0-gitian-r4.zip - unset LD_PRELOAD - unset FAKETIME - done # for BITS in diff --git a/contrib/gitian-descriptors/qt-linux.yml b/contrib/gitian-descriptors/qt-linux.yml deleted file mode 100644 index fd86b4df1d..0000000000 --- a/contrib/gitian-descriptors/qt-linux.yml +++ /dev/null @@ -1,264 +0,0 @@ ---- -name: "qt-linux" -suites: -- "precise" -architectures: -- "i386" -- "amd64" -packages: -- "zip" -- "unzip" -- "faketime" -- "unzip" -- "libxext-dev" -reference_datetime: "2011-01-30 00:00:00" -remotes: [] -files: -- "qt-everywhere-opensource-src-4.6.4.tar.gz" -script: | - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - if [ "x$GBUILD_BITS" = "x32" ]; then - ARCH='i386-linux-gnu' - else - ARCH='x86_64-linux-gnu' - fi - # The purpose of this gitian build is not to actually build Qt, but to export - # the headers as well as pkgconfig files in a useable format so that we can - # pretend to link against an older version. The goal is to link to the - # system version of Qt 4. - # Also build development tools. - INSTALLPREFIX="$HOME/install" - # Integrity Check - echo "9ad4d46c721b53a429ed5a2eecfd3c239a9ab566562f183f99d3125f1a234250 qt-everywhere-opensource-src-4.6.4.tar.gz" | sha256sum -c - # Make install directories - mkdir -p $INSTALLPREFIX - mkdir -p $INSTALLPREFIX/include - PKGCONFIGDIR=$INSTALLPREFIX/lib/pkgconfig - mkdir -p $PKGCONFIGDIR - # - tar xzf qt-everywhere-opensource-src-4.6.4.tar.gz - cd qt-everywhere-opensource-src-4.6.4 - QTBUILDDIR=$(pwd) - sed 's/TODAY=`date +%Y-%m-%d`/TODAY=2011-01-30/' -i configure - - # Need to build 4.6-versioned host utilities as well (lrelease/qrc/lupdate/...) - ./configure -prefix $INSTALLPREFIX -confirm-license -release -opensource -no-qt3support -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-declarative -no-script -no-scripttools -no-javascript-jit -no-webkit -no-svg -no-xmlpatterns -no-sql-sqlite -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-libtiff -no-opengl -nomake examples -nomake demos -nomake docs - # - make $MAKEOPTS -C src/tools install # (rcc, uic, moc) - make $MAKEOPTS -C tools/linguist/lrelease install # (lrelease) - # install includes and pkgconfig files - for DIR in src/corelib src/gui src/testlib src/dbus src/network; do - ( - cd $DIR - # extract module (QtCore/QtNetwork/...) from Makefile - MODULE=$(grep "QMAKE_TARGET *=" Makefile | cut -d = -f 2 | xargs) - # patch makefile so that not everything is build first - sed -i 's/first: all/first:/g' Makefile - make install_flat_headers install_class_headers install_targ_headers - # create and install pkgconfig descriptor - make ../../lib/pkgconfig/$MODULE.pc - sed -e "s,$QTBUILDDIR,$INSTALLPREFIX,g" ../../lib/pkgconfig/$MODULE.pc > $PKGCONFIGDIR/$MODULE.pc - # create links to existing Qt libraries - ln -sf /usr/lib/${ARCH}/lib${MODULE}.so.4 ${INSTALLPREFIX}/lib/lib${MODULE}.so - ) - done - - # Write our own configuration header, same as Ubuntu - # When we don't do this, the configuration will be without STL support (the QString from/to stdString methods) - QCONFIG=$INSTALLPREFIX/include/Qt/qconfig.h - echo ' - /* Qt Edition */ - #ifndef QT_EDITION - # define QT_EDITION QT_EDITION_OPENSOURCE - #endif - ' > $QCONFIG - - if [ "x$GBUILD_BITS" = "x32" ]; then - echo ' - /* Machine byte-order */ - #define Q_BIG_ENDIAN 4321 - #define Q_LITTLE_ENDIAN 1234 - #define QT_BUILD_KEY "i386 linux g++-4 full-config" - #define QT_BUILD_KEY_COMPAT "i686 Linux g++-4 full-config" - - #ifdef QT_BOOTSTRAPPED - #define Q_BYTE_ORDER Q_LITTLE_ENDIAN - #else - #define Q_BYTE_ORDER Q_LITTLE_ENDIAN - #endif - /* Machine Architecture */ - #ifndef QT_BOOTSTRAPPED - # define QT_ARCH_I386 - #else - # define QT_ARCH_I386 - #endif - /* Compile time features */ - #define QT_LARGEFILE_SUPPORT 64 - #define QT_POINTER_SIZE 4 - ' >> $QCONFIG - else - echo ' - /* Machine byte-order */ - #define Q_BIG_ENDIAN 4321 - #define Q_LITTLE_ENDIAN 1234 - #define QT_BUILD_KEY "x86_64 linux g++-4 full-config" - #define QT_BUILD_KEY_COMPAT "x86_64 Linux g++-4 full-config" - - #ifdef QT_BOOTSTRAPPED - #define Q_BYTE_ORDER Q_LITTLE_ENDIAN - #else - #define Q_BYTE_ORDER Q_LITTLE_ENDIAN - #endif - /* Machine Architecture */ - #ifndef QT_BOOTSTRAPPED - # define QT_ARCH_X86_64 - #else - # define QT_ARCH_X86_64 - #endif - /* Compile time features */ - #define QT_LARGEFILE_SUPPORT 64 - #define QT_POINTER_SIZE 8 - ' >> $QCONFIG - fi - - echo ' - #ifndef QT_BOOTSTRAPPED - - #if defined(QT_NO_EGL) && defined(QT_EGL) - # undef QT_NO_EGL - #elif !defined(QT_NO_EGL) && !defined(QT_EGL) - # define QT_NO_EGL - #endif - - #if defined(QT_NO_GSTREAMER) && defined(QT_GSTREAMER) - # undef QT_NO_GSTREAMER - #elif !defined(QT_NO_GSTREAMER) && !defined(QT_GSTREAMER) - # define QT_NO_GSTREAMER - #endif - - #if defined(QT_NO_ICD) && defined(QT_ICD) - # undef QT_NO_ICD - #elif !defined(QT_NO_ICD) && !defined(QT_ICD) - # define QT_NO_ICD - #endif - - #if defined(QT_NO_IMAGEFORMAT_JPEG) && defined(QT_IMAGEFORMAT_JPEG) - # undef QT_NO_IMAGEFORMAT_JPEG - #elif !defined(QT_NO_IMAGEFORMAT_JPEG) && !defined(QT_IMAGEFORMAT_JPEG) - # define QT_NO_IMAGEFORMAT_JPEG - #endif - - #if defined(QT_NO_IMAGEFORMAT_MNG) && defined(QT_IMAGEFORMAT_MNG) - # undef QT_NO_IMAGEFORMAT_MNG - #elif !defined(QT_NO_IMAGEFORMAT_MNG) && !defined(QT_IMAGEFORMAT_MNG) - # define QT_NO_IMAGEFORMAT_MNG - #endif - - #if defined(QT_NO_IMAGEFORMAT_TIFF) && defined(QT_IMAGEFORMAT_TIFF) - # undef QT_NO_IMAGEFORMAT_TIFF - #elif !defined(QT_NO_IMAGEFORMAT_TIFF) && !defined(QT_IMAGEFORMAT_TIFF) - # define QT_NO_IMAGEFORMAT_TIFF - #endif - - #if defined(QT_NO_MULTIMEDIA) && defined(QT_MULTIMEDIA) - # undef QT_NO_MULTIMEDIA - #elif !defined(QT_NO_MULTIMEDIA) && !defined(QT_MULTIMEDIA) - # define QT_NO_MULTIMEDIA - #endif - - #if defined(QT_NO_OPENVG) && defined(QT_OPENVG) - # undef QT_NO_OPENVG - #elif !defined(QT_NO_OPENVG) && !defined(QT_OPENVG) - # define QT_NO_OPENVG - #endif - - #if defined(QT_NO_PHONON) && defined(QT_PHONON) - # undef QT_NO_PHONON - #elif !defined(QT_NO_PHONON) && !defined(QT_PHONON) - # define QT_NO_PHONON - #endif - - #if defined(QT_NO_PULSEAUDIO) && defined(QT_PULSEAUDIO) - # undef QT_NO_PULSEAUDIO - #elif !defined(QT_NO_PULSEAUDIO) && !defined(QT_PULSEAUDIO) - # define QT_NO_PULSEAUDIO - #endif - - #if defined(QT_NO_S60) && defined(QT_S60) - # undef QT_NO_S60 - #elif !defined(QT_NO_S60) && !defined(QT_S60) - # define QT_NO_S60 - #endif - - #if defined(QT_NO_STYLE_S60) && defined(QT_STYLE_S60) - # undef QT_NO_STYLE_S60 - #elif !defined(QT_NO_STYLE_S60) && !defined(QT_STYLE_S60) - # define QT_NO_STYLE_S60 - #endif - - #if defined(QT_NO_SXE) && defined(QT_SXE) - # undef QT_NO_SXE - #elif !defined(QT_NO_SXE) && !defined(QT_SXE) - # define QT_NO_SXE - #endif - - #if defined(QT_NO_WEBKIT) && defined(QT_WEBKIT) - # undef QT_NO_WEBKIT - #elif !defined(QT_NO_WEBKIT) && !defined(QT_WEBKIT) - # define QT_NO_WEBKIT - #endif - - #if defined(QT_NO_ZLIB) && defined(QT_ZLIB) - # undef QT_NO_ZLIB - #elif !defined(QT_NO_ZLIB) && !defined(QT_ZLIB) - # define QT_NO_ZLIB - #endif - - #if defined(QT_RUNTIME_XCURSOR) && defined(QT_NO_RUNTIME_XCURSOR) - # undef QT_RUNTIME_XCURSOR - #elif !defined(QT_RUNTIME_XCURSOR) && !defined(QT_NO_RUNTIME_XCURSOR) - # define QT_RUNTIME_XCURSOR - #endif - - #if defined(QT_RUNTIME_XFIXES) && defined(QT_NO_RUNTIME_XFIXES) - # undef QT_RUNTIME_XFIXES - #elif !defined(QT_RUNTIME_XFIXES) && !defined(QT_NO_RUNTIME_XFIXES) - # define QT_RUNTIME_XFIXES - #endif - - #if defined(QT_RUNTIME_XINERAMA) && defined(QT_NO_RUNTIME_XINERAMA) - # undef QT_RUNTIME_XINERAMA - #elif !defined(QT_RUNTIME_XINERAMA) && !defined(QT_NO_RUNTIME_XINERAMA) - # define QT_RUNTIME_XINERAMA - #endif - - #if defined(QT_RUNTIME_XINPUT) && defined(QT_NO_RUNTIME_XINPUT) - # undef QT_RUNTIME_XINPUT - #elif !defined(QT_RUNTIME_XINPUT) && !defined(QT_NO_RUNTIME_XINPUT) - # define QT_RUNTIME_XINPUT - #endif - - #if defined(QT_RUNTIME_XRANDR) && defined(QT_NO_RUNTIME_XRANDR) - # undef QT_RUNTIME_XRANDR - #elif !defined(QT_RUNTIME_XRANDR) && !defined(QT_NO_RUNTIME_XRANDR) - # define QT_RUNTIME_XRANDR - #endif - - #if defined(QT_USE_MATH_H_FLOATS) && defined(QT_NO_USE_MATH_H_FLOATS) - # undef QT_USE_MATH_H_FLOATS - #elif !defined(QT_USE_MATH_H_FLOATS) && !defined(QT_NO_USE_MATH_H_FLOATS) - # define QT_USE_MATH_H_FLOATS - #endif - - #endif // QT_BOOTSTRAPPED - - #define QT_VISIBILITY_AVAILABLE - ' >> $QCONFIG - cp $QCONFIG $INSTALLPREFIX/include/QtCore/qconfig.h - - cd $INSTALLPREFIX - # as zip stores file timestamps, use faketime to intercept stat calls to set dates for all files to reference date - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - # Create a .tar.gz because .zip has problems with symbolic links - find | sort | tar --no-recursion -cT /dev/stdin --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 --mtime="$REFERENCE_DATETIME" | gzip -n > $OUTDIR/qt-linux${GBUILD_BITS}-4.6.4-gitian-r1.tar.gz diff --git a/contrib/gitian-descriptors/qt-win.yml b/contrib/gitian-descriptors/qt-win.yml deleted file mode 100644 index 57bc4c3180..0000000000 --- a/contrib/gitian-descriptors/qt-win.yml +++ /dev/null @@ -1,92 +0,0 @@ ---- -name: "qt" -suites: -- "precise" -architectures: -- "amd64" -packages: -- "mingw-w64" -- "g++-mingw-w64" -- "zip" -- "unzip" -- "faketime" -- "libz-dev" -reference_datetime: "2011-01-30 00:00:00" -remotes: [] -files: -- "qt-everywhere-opensource-src-5.2.0.tar.gz" -- "bitcoin-deps-win32-gitian-r13.zip" -- "bitcoin-deps-win64-gitian-r13.zip" -script: | - # Defines - export TZ=UTC - INDIR=$HOME/build - TEMPDIR=$HOME/tmp - # Qt: workaround for determinism in resource ordering - # Qt5's rcc uses a QHash to store the files for the resource. - # A security fix in QHash makes the ordering of keys to be different on every run - # (https://qt.gitorious.org/qt/qtbase/commit/c01eaa438200edc9a3bbcd8ae1e8ded058bea268). - # This is good in general but qrc shouldn't be doing a traversal over a randomized container. - # The thorough solution would be to use QMap instead of QHash, but this requires patching Qt. - # For now luckily there is a test mode that forces a fixed seed. - export QT_RCC_TEST=1 - # Integrity Check - echo "395ec72277c5786c65b8163ef5817fd03d0a1f524a6d47f53624baf8056f1081 qt-everywhere-opensource-src-5.2.0.tar.gz" | sha256sum -c - - for BITS in 32 64; do # for architectures - # - INSTALLPREFIX=$HOME/staging${BITS} - BUILDDIR=$HOME/build${BITS} - DEPSDIR=$HOME/deps${BITS} - if [ "x$BITS" = "x32" ]; then - HOST=i686-w64-mingw32 - else - HOST=x86_64-w64-mingw32 - fi - # - mkdir -p $INSTALLPREFIX $INSTALLPREFIX/host/bin $DEPSDIR $BUILDDIR - # - # Need mingw-compiled openssl from bitcoin-deps: - cd $DEPSDIR - unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r13.zip - # - cd $BUILDDIR - # - tar xzf $INDIR/qt-everywhere-opensource-src-5.2.0.tar.gz - cd qt-everywhere-opensource-src-5.2.0 - SPECNAME="win32-g++" - SPECFILE="qtbase/mkspecs/${SPECNAME}/qmake.conf" - sed 's/qt_instdate=`date +%Y-%m-%d`/qt_instdate=2011-01-30/' -i qtbase/configure - sed --posix "s|QMAKE_CFLAGS = -pipe -fno-keep-inline-dllexport|QMAKE_CFLAGS\t\t= -pipe -fno-keep-inline-dllexport -isystem /usr/$HOST/include/ -frandom-seed=qtbuild -I$DEPSDIR/include|" -i ${SPECFILE} - sed --posix "s|QMAKE_LFLAGS =|QMAKE_LFLAGS\t\t= -L$DEPSDIR/lib|" -i ${SPECFILE} - # Before we tried to pass arguments to ar (static linking) in using QMAKE_LIB, however - # qt removes the arguments for ar and provides a script which makes it impossible to pass the determinism flag - - # so rather than try to replace ar, post-process all libraries and plugins at the end. - # - # Don't load faketime while compiling Qt, qmake will get stuck in nearly infinite loops - #export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - #export FAKETIME=$REFERENCE_DATETIME - # - # Compile static libraries, and use statically linked openssl (-openssl-linked): - OPENSSL_LIBS="-L$DEPSDIR/lib -lssl -lcrypto -lgdi32" ./configure -prefix $INSTALLPREFIX -bindir $INSTALLPREFIX/host/bin -confirm-license -release -opensource -static -xplatform $SPECNAME -device-option CROSS_COMPILE="$HOST-" -no-audio-backend -no-javascript-jit -no-sql-sqlite -no-sql-odbc -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-opengl -no-compile-examples -no-feature-style-windowsce -no-feature-style-windowsmobile -no-qml-debug -openssl-linked -skip qtsvg -skip qtwebkit -skip qtwebkit-examples -skip qtserialport -skip qtdeclarative -skip qtmultimedia -skip qtimageformats -skip qtlocation -skip qtsensors -skip qtquick1 -skip qtquickcontrols -skip qtactiveqt -skip qtconnectivity -skip qtwinextras -skip qtxmlpatterns -skip qtscript -skip qtdoc -system-libpng -system-zlib - make $MAKEOPTS install - # post-process all generated libraries and plugins to be deterministic - # extract them to a temporary directory then re-build them deterministically - for LIB in $(find $INSTALLPREFIX -name *.a); do - rm -rf $TEMPDIR && mkdir $TEMPDIR && cd $TEMPDIR - $HOST-ar xv $LIB | cut -b5- > /tmp/list.txt - rm $LIB - $HOST-ar crsD $LIB $(cat /tmp/list.txt) - done - # - cd $INSTALLPREFIX - # Remove unused non-deterministic stuff - rm host/bin/qtpaths.exe lib/libQt5Bootstrap.a lib/libQt5Bootstrap.la - # as zip stores file timestamps, use faketime to intercept stat calls to set dates for all files to reference date - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - find -print0 | xargs -r0 touch # fix up timestamps before packaging - find | sort | zip -X@ $OUTDIR/qt-win${BITS}-5.2.0-gitian-r3.zip - unset LD_PRELOAD - unset FAKETIME - done # for BITS in diff --git a/contrib/macdeploy/DS_Store b/contrib/macdeploy/DS_Store Binary files differindex b9a1e14864..7527dc671f 100644 --- a/contrib/macdeploy/DS_Store +++ b/contrib/macdeploy/DS_Store diff --git a/contrib/macdeploy/detached-sig-apply.sh b/contrib/macdeploy/detached-sig-apply.sh new file mode 100755 index 0000000000..7b3eb1b197 --- /dev/null +++ b/contrib/macdeploy/detached-sig-apply.sh @@ -0,0 +1,53 @@ +#!/bin/sh +set -e + +UNSIGNED=$1 +SIGNATURE=$2 +ARCH=x86_64 +ROOTDIR=dist +BUNDLE=${ROOTDIR}/Bitcoin-Qt.app +TEMPDIR=signed.temp +OUTDIR=signed-app + +if [ -z "$UNSIGNED" ]; then + echo "usage: $0 <unsigned app> <signature>" + exit 1 +fi + +if [ -z "$SIGNATURE" ]; then + echo "usage: $0 <unsigned app> <signature>" + exit 1 +fi + +rm -rf ${TEMPDIR} && mkdir -p ${TEMPDIR} +tar -C ${TEMPDIR} -xf ${UNSIGNED} +tar -C ${TEMPDIR} -xf ${SIGNATURE} + +if [ -z "${PAGESTUFF}" ]; then + PAGESTUFF=${TEMPDIR}/pagestuff +fi + +if [ -z "${CODESIGN_ALLOCATE}" ]; then + CODESIGN_ALLOCATE=${TEMPDIR}/codesign_allocate +fi + +for i in `find ${TEMPDIR} -name "*.sign"`; do + SIZE=`stat -c %s ${i}` + TARGET_FILE=`echo ${i} | sed 's/\.sign$//'` + + echo "Allocating space for the signature of size ${SIZE} in ${TARGET_FILE}" + ${CODESIGN_ALLOCATE} -i ${TARGET_FILE} -a ${ARCH} ${SIZE} -o ${i}.tmp + + OFFSET=`${PAGESTUFF} ${i}.tmp -p | tail -2 | grep offset | sed 's/[^0-9]*//g'` + if [ -z ${QUIET} ]; then + echo "Attaching signature at offset ${OFFSET}" + fi + + dd if=$i of=${i}.tmp bs=1 seek=${OFFSET} count=${SIZE} 2>/dev/null + mv ${i}.tmp ${TARGET_FILE} + rm ${i} + echo "Success." +done +mv ${TEMPDIR}/${ROOTDIR} ${OUTDIR} +rm -rf ${TEMPDIR} +echo "Signed: ${OUTDIR}" diff --git a/contrib/macdeploy/detached-sig-create.sh b/contrib/macdeploy/detached-sig-create.sh new file mode 100755 index 0000000000..aff4f08da8 --- /dev/null +++ b/contrib/macdeploy/detached-sig-create.sh @@ -0,0 +1,46 @@ +#!/bin/sh +set -e + +ROOTDIR=dist +BUNDLE=${ROOTDIR}/Bitcoin-Qt.app +CODESIGN=codesign +TEMPDIR=sign.temp +TEMPLIST=${TEMPDIR}/signatures.txt +OUT=signature.tar.gz + +if [ ! -n "$1" ]; then + echo "usage: $0 <codesign args>" + echo "example: $0 -s MyIdentity" + exit 1 +fi + +rm -rf ${TEMPDIR} ${TEMPLIST} +mkdir -p ${TEMPDIR} + +${CODESIGN} -f --file-list ${TEMPLIST} "$@" "${BUNDLE}" + +for i in `grep -v CodeResources ${TEMPLIST}`; do + TARGETFILE="${BUNDLE}/`echo ${i} | sed "s|.*${BUNDLE}/||"`" + SIZE=`pagestuff $i -p | tail -2 | grep size | sed 's/[^0-9]*//g'` + OFFSET=`pagestuff $i -p | tail -2 | grep offset | sed 's/[^0-9]*//g'` + SIGNFILE="${TEMPDIR}/${TARGETFILE}.sign" + DIRNAME="`dirname ${SIGNFILE}`" + mkdir -p "${DIRNAME}" + echo "Adding detached signature for: ${TARGETFILE}. Size: ${SIZE}. Offset: ${OFFSET}" + dd if=$i of=${SIGNFILE} bs=1 skip=${OFFSET} count=${SIZE} 2>/dev/null +done + +for i in `grep CodeResources ${TEMPLIST}`; do + TARGETFILE="${BUNDLE}/`echo ${i} | sed "s|.*${BUNDLE}/||"`" + RESOURCE="${TEMPDIR}/${TARGETFILE}" + DIRNAME="`dirname "${RESOURCE}"`" + mkdir -p "${DIRNAME}" + echo "Adding resource for: "${TARGETFILE}"" + cp "${i}" "${RESOURCE}" +done + +rm ${TEMPLIST} + +tar -C ${TEMPDIR} -czf ${OUT} . +rm -rf ${TEMPDIR} +echo "Created ${OUT}" diff --git a/depends/Makefile b/depends/Makefile index fc763bedeb..5de0159714 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -6,6 +6,7 @@ SDK_PATH ?= $(BASEDIR)/SDKs NO_QT ?= NO_WALLET ?= NO_UPNP ?= +USE_LINUX_STATIC_QT5 ?= FALLBACK_DOWNLOAD_PATH ?= https://bitcoincore.org/depends-sources BUILD = $(shell ./config.guess) diff --git a/depends/README.usage b/depends/README.usage index d3c57956f1..e768feecf7 100644 --- a/depends/README.usage +++ b/depends/README.usage @@ -23,6 +23,7 @@ NO_QT: Don't download/build/cache qt and its dependencies NO_WALLET: Don't download/build/cache libs needed to enable the wallet NO_UPNP: Don't download/build/cache packages needed for enabling upnp DEBUG: disable some optimizations and enable more runtime checking +USE_LINUX_STATIC_QT5: Build a static qt5 rather than shared qt4. Linux only. If some packages are not built, for example 'make NO_WALLET=1', the appropriate options will be passed to bitcoin's configure. In this case, --disable-wallet. diff --git a/depends/config.site.in b/depends/config.site.in index df076956bd..873f66018d 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -48,32 +48,37 @@ if test x@host_os@ = xmingw32; then fi fi -export PATH=$prefix/native/bin:$PATH -export PKG_CONFIG="`which pkg-config` --static" +PATH=$prefix/native/bin:$PATH +PKG_CONFIG="`which pkg-config` --static" + +# These two need to remain exported because pkg-config does not see them +# otherwise. That means they must be unexported at the end of configure.ac to +# avoid ruining the cache. Sigh. + export PKG_CONFIG_LIBDIR=$prefix/lib/pkgconfig export PKG_CONFIG_PATH=$prefix/share/pkgconfig -export CPPFLAGS="-I$prefix/include/ $CPPFLAGS" -export LDFLAGS="-L$prefix/lib $LDFLAGS" +CPPFLAGS="-I$prefix/include/ $CPPFLAGS" +LDFLAGS="-L$prefix/lib $LDFLAGS" -export CC="@CC@" -export CXX="@CXX@" -export OBJC="${CC}" -export OBJCXX="${CXX}" -export CCACHE=$prefix/native/bin/ccache +CC="@CC@" +CXX="@CXX@" +OBJC="${CC}" +OBJCXX="${CXX}" +CCACHE=$prefix/native/bin/ccache if test -n "@AR@"; then - export AR=@AR@ + AR=@AR@ ac_cv_path_ac_pt_AR=${AR} fi if test -n "@RANLIB@"; then - export RANLIB=@RANLIB@ + RANLIB=@RANLIB@ ac_cv_path_ac_pt_RANLIB=${RANLIB} fi if test -n "@NM@"; then - export NM=@NM@ + NM=@NM@ ac_cv_path_ac_pt_NM=${NM} fi @@ -82,14 +87,14 @@ if test -n "@debug@"; then fi if test -n "@CFLAGS@"; then - export CFLAGS="@CFLAGS@ $CFLAGS" + CFLAGS="@CFLAGS@ $CFLAGS" fi if test -n "@CXXFLAGS@"; then - export CXXFLAGS="@CXXFLAGS@ $CXXFLAGS" + CXXFLAGS="@CXXFLAGS@ $CXXFLAGS" fi if test -n "@CPPFLAGS@"; then - export CPPFLAGS="@CPPFLAGS@ $CPPFLAGS" + CPPFLAGS="@CPPFLAGS@ $CPPFLAGS" fi if test -n "@LDFLAGS@"; then - export LDFLAGS="@LDFLAGS@ $LDFLAGS" + LDFLAGS="@LDFLAGS@ $LDFLAGS" fi diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk index f39925723b..68841afdb8 100644 --- a/depends/packages/bdb.mk +++ b/depends/packages/bdb.mk @@ -8,8 +8,7 @@ $(package)_build_subdir=build_unix define $(package)_set_vars $(package)_config_opts=--disable-shared --enable-cxx --disable-replication $(package)_config_opts_mingw32=--enable-mingw -$(package)_config_opts_x86_64_linux=--with-pic -$(package)_config_opts_arm_linux=--with-pic +$(package)_config_opts_linux=--with-pic endef define $(package)_preprocess_cmds diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk index 98ed3de772..f50828c546 100644 --- a/depends/packages/boost.mk +++ b/depends/packages/boost.mk @@ -21,8 +21,8 @@ $(package)_archiver_$(host_os)=$($(package)_ar) $(package)_toolset_darwin=darwin $(package)_archiver_darwin=$($(package)_libtool) $(package)_config_libraries=chrono,filesystem,program_options,system,thread,test -$(package)_cxxflags_x86_64_linux=-fPIC -$(package)_cxxflags_arm_linux=-fPIC +$(package)_cxxflags=-fvisibility=hidden +$(package)_cxxflags_linux=-fPIC endef define $(package)_preprocess_cmds diff --git a/depends/packages/freetype.mk b/depends/packages/freetype.mk index b83cbd93ea..f7d6e0f9fc 100644 --- a/depends/packages/freetype.mk +++ b/depends/packages/freetype.mk @@ -6,7 +6,7 @@ $(package)_sha256_hash=c0848b29d52ef3ca27ad92e08351f023c5e24ce8cea7d8fe69fc96358 define $(package)_set_vars $(package)_config_opts=--without-zlib --without-png --disable-static - $(package)_config_opts_x86_64_linux=--with-pic + $(package)_config_opts_linux=--with-pic endef define $(package)_config_cmds diff --git a/depends/packages/gmp.mk b/depends/packages/gmp.mk new file mode 100644 index 0000000000..bcbf50ceae --- /dev/null +++ b/depends/packages/gmp.mk @@ -0,0 +1,30 @@ +package=gmp +$(package)_version=6.0.0a +$(package)_download_path=https://gmplib.org/download/gmp +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=7f8e9a804b9c6d07164cf754207be838ece1219425d64e28cfa3e70d5c759aaf +$(package)_patches=arm_gmp_build_fix.patch darwin_gmp_build_fix.patch + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/arm_gmp_build_fix.patch && \ + patch -p1 < $($(package)_patch_dir)/darwin_gmp_build_fix.patch +endef + +define $(package)_set_vars + $(package)_config_opts=--disable-shared CC_FOR_BUILD=$(build_CC) + $(package)_config_opts_x86_64_darwin=--with-pic + $(package)_config_opts_x86_64_linux=--with-pic + $(package)_config_opts_arm_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libICE.mk b/depends/packages/libICE.mk new file mode 100644 index 0000000000..fc60323b1c --- /dev/null +++ b/depends/packages/libICE.mk @@ -0,0 +1,23 @@ +package=libICE +$(package)_version=1.0.9 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/lib/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=8f7032f2c1c64352b5423f6b48a8ebdc339cc63064af34d66a6c9aa79759e202 +$(package)_dependencies=xtrans xproto + +define $(package)_set_vars + $(package)_config_opts=--disable-static --disable-docs --disable-specs --without-xsltproc + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libSM.mk b/depends/packages/libSM.mk new file mode 100644 index 0000000000..0f9307ca76 --- /dev/null +++ b/depends/packages/libSM.mk @@ -0,0 +1,23 @@ +package=libSM +$(package)_version=1.2.2 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/lib/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=0baca8c9f5d934450a70896c4ad38d06475521255ca63b717a6510fdb6e287bd +$(package)_dependencies=xtrans xproto libICE + +define $(package)_set_vars + $(package)_config_opts=--without-libuuid --without-xsltproc --disable-docs --disable-static + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libX11.mk b/depends/packages/libX11.mk index 144021e34b..178d592ee6 100644 --- a/depends/packages/libX11.mk +++ b/depends/packages/libX11.mk @@ -7,7 +7,7 @@ $(package)_dependencies=libxcb xtrans xextproto xproto define $(package)_set_vars $(package)_config_opts=--disable-xkb --disable-static -$(package)_config_opts_x86_64_linux=--with-pic +$(package)_config_opts_linux=--with-pic endef define $(package)_config_cmds diff --git a/depends/packages/libXau.mk b/depends/packages/libXau.mk index 8c9b21846b..e87df2e4de 100644 --- a/depends/packages/libXau.mk +++ b/depends/packages/libXau.mk @@ -7,7 +7,7 @@ $(package)_dependencies=xproto define $(package)_set_vars $(package)_config_opts=--disable-shared - $(package)_config_opts_x86_64_linux=--with-pic + $(package)_config_opts_linux=--with-pic endef define $(package)_config_cmds diff --git a/depends/packages/openssl.mk b/depends/packages/openssl.mk index 70b0b8d39f..6d7a556c11 100644 --- a/depends/packages/openssl.mk +++ b/depends/packages/openssl.mk @@ -10,12 +10,13 @@ $(package)_config_opts=--prefix=$(host_prefix) --openssldir=$(host_prefix)/etc/o $(package)_config_opts+=no-krb5 no-camellia no-capieng no-cast no-cms no-dtls1 no-gost no-gmp no-heartbeats no-idea no-jpake no-md2 $(package)_config_opts+=no-mdc2 no-rc5 no-rdrand no-rfc3779 no-rsax no-sctp no-seed no-sha0 no-static_engine no-whirlpool no-rc2 no-rc4 no-ssl2 no-ssl3 $(package)_config_opts+=$($(package)_cflags) $($(package)_cppflags) -$(package)_config_opts_x86_64_linux=-fPIC linux-x86_64 -$(package)_config_opts_arm_linux=-fPIC linux-generic32 +$(package)_config_opts_linux=-fPIC +$(package)_config_opts_x86_64_linux=linux-x86_64 +$(package)_config_opts_i686_linux=linux-generic32 +$(package)_config_opts_arm_linux=linux-generic32 $(package)_config_opts_x86_64_darwin=darwin64-x86_64-cc $(package)_config_opts_x86_64_mingw32=mingw64 $(package)_config_opts_i686_mingw32=mingw -$(package)_config_opts_i686_linux=linux-generic32 -fPIC endef define $(package)_preprocess_cmds diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 260cadb214..305d21cb2d 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -1,9 +1,18 @@ -packages:=boost openssl +packages:=boost openssl gmp native_packages := native_ccache native_comparisontool qt_native_packages = native_protobuf -qt_packages = qt qrencode protobuf -qt_linux_packages=expat dbus libxcb xcb_proto libXau xproto freetype fontconfig libX11 xextproto libXext xtrans +qt_packages = qrencode protobuf + +qt46_linux_packages = qt46 expat dbus libxcb xcb_proto libXau xproto freetype libX11 xextproto libXext xtrans libICE libSM +qt5_linux_packages= qt expat dbus libxcb xcb_proto libXau xproto freetype fontconfig libX11 xextproto libXext xtrans + +qt_darwin_packages=qt +qt_mingw32_packages=qt + +qt_linux_$(USE_LINUX_STATIC_QT5):=$(qt5_linux_packages) +qt_linux_:=$(qt46_linux_packages) +qt_linux_packages:=$(qt_linux_$(USE_LINUX_STATIC_QT5)) wallet_packages=bdb diff --git a/depends/packages/protobuf.mk b/depends/packages/protobuf.mk index 716f837853..5affad2837 100644 --- a/depends/packages/protobuf.mk +++ b/depends/packages/protobuf.mk @@ -7,7 +7,7 @@ $(package)_dependencies=native_$(package) define $(package)_set_vars $(package)_config_opts=--disable-shared --with-protoc=$(build_prefix)/bin/protoc - $(package)_config_opts_x86_64_linux=--with-pic + $(package)_config_opts_linux=--with-pic endef define $(package)_config_cmds diff --git a/depends/packages/qrencode.mk b/depends/packages/qrencode.mk index 69d2982cbc..1ad329e94d 100644 --- a/depends/packages/qrencode.mk +++ b/depends/packages/qrencode.mk @@ -6,7 +6,7 @@ $(package)_sha256_hash=dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b5 define $(package)_set_vars $(package)_config_opts=--disable-shared -without-tools --disable-sdltest -$(package)_config_opts_x86_64_linux=--with-pic +$(package)_config_opts_linux=--with-pic endef define $(package)_config_cmds diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index 5fbab57dd4..6a8e714a48 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -48,6 +48,7 @@ define $(package)_preprocess_cmds sed -i.old "s|updateqm.commands = \$$$$\$$$$LRELEASE|updateqm.commands = $($(package)_extract_dir)/qttools/bin/lrelease|" qttranslations/translations/translations.pro && \ sed -i.old "s/src_plugins.depends = src_sql src_xml src_network/src_plugins.depends = src_xml src_network/" qtbase/src/src.pro && \ sed -i.old "/XIproto.h/d" qtbase/src/plugins/platforms/xcb/qxcbxsettings.cpp && \ + sed -i.old 's/if \[ "$$$$XPLATFORM_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/if \[ "$$$$BUILD_ON_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/' qtbase/configure && \ mkdir -p qtbase/mkspecs/macx-clang-linux &&\ cp -f qtbase/mkspecs/macx-clang/Info.plist.lib qtbase/mkspecs/macx-clang-linux/ &&\ cp -f qtbase/mkspecs/macx-clang/Info.plist.app qtbase/mkspecs/macx-clang-linux/ &&\ @@ -93,5 +94,5 @@ endef define $(package)_postprocess_cmds rm -rf mkspecs/ lib/cmake/ && \ - rm lib/libQt5Bootstrap.a lib/lib*.la lib/lib*.prl + rm lib/libQt5Bootstrap.a lib/lib*.la lib/*.prl plugins/*/*.prl endef diff --git a/depends/packages/qt46.mk b/depends/packages/qt46.mk new file mode 100644 index 0000000000..8fb30a5c44 --- /dev/null +++ b/depends/packages/qt46.mk @@ -0,0 +1,66 @@ +PACKAGE=qt46 +$(package)_version=4.6.4 +$(package)_download_path=http://download.qt-project.org/archive/qt/4.6/ +$(package)_file_name=qt-everywhere-opensource-src-$($(package)_version).tar.gz +$(package)_sha256_hash=9ad4d46c721b53a429ed5a2eecfd3c239a9ab566562f183f99d3125f1a234250 +$(package)_dependencies=openssl freetype dbus libX11 xproto libXext libICE libSM +$(package)_patches=stlfix.patch + +define $(package)_set_vars +$(package)_config_opts = -prefix $(host_prefix) -headerdir $(host_prefix)/include/qt4 -bindir $(build_prefix)/bin +$(package)_config_opts += -release -no-separate-debug-info -opensource -confirm-license +$(package)_config_opts += -stl -qt-zlib + +$(package)_config_opts += -nomake examples -nomake tests -nomake tools -nomake translations -nomake demos -nomake docs +$(package)_config_opts += -no-audio-backend -no-glib -no-nis -no-cups -no-iconv -no-gif -no-pch +$(package)_config_opts += -no-xkb -no-xrender -no-xrandr -no-xfixes -no-xcursor -no-xinerama -no-xsync -no-xinput -no-mitshm -no-xshape +$(package)_config_opts += -no-libtiff -no-fontconfig -openssl-linked +$(package)_config_opts += -no-sql-db2 -no-sql-ibase -no-sql-oci -no-sql-tds -no-sql-mysql +$(package)_config_opts += -no-sql-odbc -no-sql-psql -no-sql-sqlite -no-sql-sqlite2 +$(package)_config_opts += -no-xmlpatterns -no-multimedia -no-phonon -no-scripttools -no-declarative +$(package)_config_opts += -no-phonon-backend -no-webkit -no-javascript-jit -no-script +$(package)_config_opts += -no-svg -no-libjpeg -no-libtiff -no-libpng -no-libmng -no-qt3support -no-opengl + +$(package)_config_opts_x86_64_linux += -platform linux-g++-64 +$(package)_config_opts_i686_linux = -platform linux-g++-32 +$(package)_build_env = QT_RCC_TEST=1 +endef + +define $(package)_preprocess_cmds + sed -i.old "s|/include /usr/include||" config.tests/unix/freetype/freetype.pri && \ + sed -i.old "s|src_plugins.depends = src_gui src_sql src_svg|src_plugins.depends = src_gui src_sql|" src/src.pro && \ + sed -i.old "s|\.lower(|\.toLower(|g" src/network/ssl/qsslsocket_openssl.cpp && \ + sed -i.old "s|Key_BackSpace|Key_Backspace|" src/gui/itemviews/qabstractitemview.cpp && \ + sed -i.old "s|/usr/X11R6/lib64|$(host_prefix)/lib|" mkspecs/*/*.conf && \ + sed -i.old "s|/usr/X11R6/lib|$(host_prefix)/lib|" mkspecs/*/*.conf && \ + sed -i.old "s|/usr/X11R6/include|$(host_prefix)/include|" mkspecs/*/*.conf && \ + sed -i.old "s|QMAKE_LFLAGS_SHLIB\t+= -shared|QMAKE_LFLAGS_SHLIB\t+= -shared -Wl,--exclude-libs,ALL|" mkspecs/common/g++.conf && \ + sed -i.old "/SSLv2_client_method/d" src/network/ssl/qsslsocket_openssl.cpp src/network/ssl/qsslsocket_openssl_symbols.cpp && \ + sed -i.old "/SSLv2_server_method/d" src/network/ssl/qsslsocket_openssl.cpp src/network/ssl/qsslsocket_openssl_symbols.cpp && \ + patch -p1 < $($(package)_patch_dir)/stlfix.patch +endef + +define $(package)_config_cmds + export PKG_CONFIG_SYSROOT_DIR=/ && \ + export PKG_CONFIG_LIBDIR=$(host_prefix)/lib/pkgconfig && \ + export PKG_CONFIG_PATH=$(host_prefix)/share/pkgconfig && \ + export CPATH=$(host_prefix)/include && \ + OPENSSL_LIBS='-L$(host_prefix)/lib -lssl -lcrypto' ./configure $($(package)_config_opts) && \ + cd tools/linguist/lrelease; ../../../bin/qmake -o Makefile lrelease.pro +endef + +define $(package)_build_cmds + export CPATH=$(host_prefix)/include && \ + $(MAKE) -C src && \ + $(MAKE) -C tools/linguist/lrelease +endef + +define $(package)_stage_cmds + $(MAKE) -C src INSTALL_ROOT=$($(package)_staging_dir) install && \ + $(MAKE) -C tools/linguist/lrelease INSTALL_ROOT=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + rm -rf mkspecs/ lib/cmake/ lib/*.prl lib/*.la && \ + find native/bin -type f -exec mv {} {}-qt4 \; +endef diff --git a/depends/packages/xcb_proto.mk b/depends/packages/xcb_proto.mk index 726e3048c3..0c7c958d62 100644 --- a/depends/packages/xcb_proto.mk +++ b/depends/packages/xcb_proto.mk @@ -6,7 +6,7 @@ $(package)_sha256_hash=7ef40ddd855b750bc597d2a435da21e55e502a0fefa85b274f2c92280 define $(package)_set_vars $(package)_config_opts=--disable-shared - $(package)_config_opts_x86_64_linux=--with-pic + $(package)_config_opts_linux=--with-pic endef define $(package)_config_cmds diff --git a/depends/packages/xtrans.mk b/depends/packages/xtrans.mk index b973149797..99eefa6d5e 100644 --- a/depends/packages/xtrans.mk +++ b/depends/packages/xtrans.mk @@ -6,7 +6,7 @@ $(package)_sha256_hash=054d4ee3efd52508c753e9f7bc655ef185a29bd2850dd9e2fc2ccc335 $(package)_dependencies= define $(package)_set_vars -$(package)_config_opts_x86_64_linux=--with-pic --disable-static +$(package)_config_opts_linux=--with-pic --disable-static endef define $(package)_config_cmds diff --git a/depends/patches/gmp/arm_gmp_build_fix.patch b/depends/patches/gmp/arm_gmp_build_fix.patch new file mode 100644 index 0000000000..666cf58cf6 --- /dev/null +++ b/depends/patches/gmp/arm_gmp_build_fix.patch @@ -0,0 +1,21 @@ + +# HG changeset patch +# User Torbjorn Granlund <tege@gmplib.org> +# Date 1396602422 -7200 +# Node ID 676e2d0f0e4dd301a7066079d2c9326c25c34a40 +# Parent 0194a75b56b21a9196626430af86c5bd9110c42d +Conditionalise ARM asm on !__thumb__. + +diff -r 0194a75b56b2 -r 676e2d0f0e4d mpn/generic/div_qr_1n_pi1.c +--- a/mpn/generic/div_qr_1n_pi1.c Thu Apr 03 23:58:51 2014 +0200 ++++ b/mpn/generic/div_qr_1n_pi1.c Fri Apr 04 11:07:02 2014 +0200 +@@ -130,7 +130,7 @@ + "%2" ((UDItype)(a0)), "r" ((UDItype)(b0)) __CLOBBER_CC) + #endif + +-#if defined (__arm__) && W_TYPE_SIZE == 32 ++#if defined (__arm__) && !defined (__thumb__) && W_TYPE_SIZE == 32 + #define add_mssaaaa(m, sh, sl, ah, al, bh, bl) \ + __asm__ ( "adds %2, %5, %6\n\t" \ + "adcs %1, %3, %4\n\t" \ + diff --git a/depends/patches/gmp/darwin_gmp_build_fix.patch b/depends/patches/gmp/darwin_gmp_build_fix.patch new file mode 100644 index 0000000000..b9cfd80e77 --- /dev/null +++ b/depends/patches/gmp/darwin_gmp_build_fix.patch @@ -0,0 +1,29 @@ + +# HG changeset patch +# User Torbjorn Granlund <tege@gmplib.org> +# Date 1396470504 -7200 +# Node ID 1fab0adc5ff7d9ecddcbda96f407da58347bb49c +# Parent db645603dcdb41afcf78b19b551ecd5a01c3841c +Workaround for Darwin assembler quirk. + +diff -r db645603dcdb -r 1fab0adc5ff7 mpn/x86_64/k8/redc_1.asm +--- a/mpn/x86_64/k8/redc_1.asm Mon Mar 31 23:04:32 2014 +0200 ++++ b/mpn/x86_64/k8/redc_1.asm Wed Apr 02 22:28:24 2014 +0200 +@@ -114,7 +114,7 @@ + + JUMPTABSECT + ALIGN(8) +-L(tab): JMPENT( L(0m4), L(tab)) ++L(tab): JMPENT( L(0), L(tab)) + JMPENT( L(1), L(tab)) + JMPENT( L(2), L(tab)) + JMPENT( L(3), L(tab)) +@@ -397,6 +397,7 @@ + + + ALIGN(16) ++L(0): + L(0m4): + L(lo0): mov (mp,nneg,8), %rax + mov nneg, i + diff --git a/depends/patches/qt46/stlfix.patch b/depends/patches/qt46/stlfix.patch new file mode 100644 index 0000000000..f8f6fb04b0 --- /dev/null +++ b/depends/patches/qt46/stlfix.patch @@ -0,0 +1,10 @@ +--- old/config.tests/unix/stl/stltest.cpp 2011-06-23 03:45:23.000000000 -0400 ++++ new/config.tests/unix/stl/stltest.cpp 2014-08-28 00:54:04.154837604 -0400 +@@ -49,6 +49,7 @@ + #include <vector> + #include <algorithm> + #include <iostream> ++#include <cstddef> + + // something mean to see if the compiler and C++ standard lib are good enough + template<class K, class T> diff --git a/doc/README_osx.txt b/doc/README_osx.txt index 2be56c1592..d56234f7d9 100644 --- a/doc/README_osx.txt +++ b/doc/README_osx.txt @@ -20,14 +20,6 @@ https://github.com/mingwandroid/toolchain4 In order to build a working toolchain, the following source packages are needed from Apple: cctools, dyld, and ld64. -Beware. This part is ugly. Very very very ugly. In the future, this should be -broken out into a new repository and cleaned up. Additionally, the binaries -only work when built as x86 and not x86_64. This is an especially nasty -limitation because it must be linked with the toolchain's libLTO.so, meaning -that the entire toolchain must be x86. Gitian x86_64 should not be used until -this has been fixed, because it would mean that several native dependencies -(openssl, libuuid, etc) would need to be built as x86 first. - These tools inject timestamps by default, which produce non-deterministic binaries. The ZERO_AR_DATE environment variable is used to disable that. @@ -73,3 +65,18 @@ Background images and other features can be added to DMG files by inserting a .DS_Store before creation. The easiest way to create this file is to build a DMG without one, move it to a device running OSX, customize the layout, then grab the .DS_Store file for later use. That is the approach taken here. + +As of OSX Mavericks (10.9), using an Apple-blessed key to sign binaries is a +requirement in order to satisfy the new Gatekeeper requirements. Because this +private key cannot be shared, we'll have to be a bit creative in order for the +build process to remain somewhat deterministic. Here's how it works: + +- Builders use gitian to create an unsigned release. This outputs an unsigned + dmg which users may choose to bless and run. It also outputs an unsigned app + structure in the form of a tarball, which also contains all of the tools + that have been previously (deterministically) built in order to create a + final dmg. +- The Apple keyholder uses this unsigned app to create a detached signature, + using the script that is also included there. +- Builders feed the unsigned app + detached signature back into gitian. It + uses the pre-built tools to recombine the pieces into a deterministic dmg. diff --git a/doc/bootstrap.md b/doc/bootstrap.md index 7ce71abaad..b84fd24b11 100644 --- a/doc/bootstrap.md +++ b/doc/bootstrap.md @@ -1,41 +1,31 @@ ### Bootstrap the Blockchain Synchronization -Normally the Bitcoin client will download the transaction and network information, called the blockchain, from the network by syncing with the other clients. This can be a process that can take multiple days as the [Bitcoin block chain](https://blockchain.info/charts/blocks-size) has grown to more than 15 gigabytes, and is growing almost a gigabyte every month. Luckily there is a safe and fast way to speed up this process. We’ll show you how to bootstrap your blockchain to bring your client up to speed in just a few simple steps. +Normally the Bitcoin client will download the transaction and network information, called the blockchain, from the network by syncing with the other clients. This process can take quite some time as the [Bitcoin blockchain](https://blockchain.info/charts/blocks-size) is growing bigger and bigger for each day. Luckily there is a safe and fast way to speed up this process. We'll show you how to bootstrap your blockchain to bring your client up to speed in just a few simple steps. ### Requirements - A fresh install of the Bitcoin client software. -### Download the blockchain via Bittorent +### Download the blockchain via BitTorrent -Jeff Garzik, Bitcoin core developer, offers an [torrent file](https://bitcointalk.org/index.php?topic=145386.0) for bootstrapping purposes that is updated often. Bittorrent is a protocol that speeds up the downloading of large files by using the other clients in the network. Examples of free and safe open-source clients are [Deluge](http://deluge-torrent.org/) or [QBittorent](http://www.qbittorrent.org/). A guide to installing and configuring the torrent clients can be found [here](http://dev.deluge-torrent.org/wiki/UserGuide) for Deluge and [here](http://qbforums.shiki.hu/) for QBittorent. A further in-depth tutorial on Bittorent can be found [here](http://www.howtogeek.com/howto/31846/bittorrent-for-beginners-how-get-started-downloading-torrents/). +Jeff Garzik, Bitcoin Core developer, offers an [torrent file](https://bitcointalk.org/index.php?topic=145386.0) for bootstrapping purposes that is updated often. BitTorrent is a protocol that speeds up the downloading of large files by using the other clients in the network. Examples of free and safe open source clients are [Deluge](http://deluge-torrent.org/) or [qBittorrent](http://www.qbittorrent.org/). A guide to installing and configuring the torrent clients can be found [here](http://dev.deluge-torrent.org/wiki/UserGuide) for Deluge and [here](http://qbforums.shiki.hu/) for qBittorrent. A further in-depth tutorial on BitTorrent can be found [here](http://www.howtogeek.com/howto/31846/bittorrent-for-beginners-how-get-started-downloading-torrents/). -With the client installed we’ll proceed to download the blockchain torrent file. Use the following magnet link: +With the client installed we'll proceed to download the blockchain torrent file. Use the following magnet link: magnet:?xt=urn:btih:2d4e6c1f96c5d5fb260dff92aea4e600227f1aea&dn=bootstrap.dat&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.ccc.de:80&tr=udp://tracker.istole.it:80 - or go to [Jeff Garzik's topic](https://bitcointalk.org/index.php?topic=145386.0) for a signed magnet link. Alternately you can use the [.torrent file](http://sourceforge.net/projects/bitcoin/files/Bitcoin/blockchain/bootstrap.dat.torrent/download) found on Sourceforge. + or go to [Jeff Garzik's topic](https://bitcointalk.org/index.php?topic=145386.0) for a signed magnet link. Alternatively you can use the [.torrent file](http://sourceforge.net/projects/bitcoin/files/Bitcoin/blockchain/bootstrap.dat.torrent/download) found on SourceForge. ![Fig1](img/bootstrap1.png) The download page should look like this, with a countdown to the download. If it does not work click the direct download link. -The torrent client installed will recognize the download of the torrent file. Save the bootstrap.dat file to a folder you use for downloads. The image below shows the torrent download in QBittorent, with current speed and ETA highlighted. +The torrent client installed will recognize the download of the torrent file. Save the bootstrap.dat file to the folder you use for downloads. The image below shows the torrent download in qBittorrent, with current speed and ETA highlighted. ![Fig2](img/bootstrap2.png) -### Download the block chain directly from official repositories -The Bittorent version, see above, of the block chain download is refreshed more often than the direct download available. If Bittorent is blocked on your network then you can use the direct download method. Be sure to only use official repositories as the link displayed below. This download will only update the client to March 2013. - -Click [here](http://sourceforge.net/projects/bitcoin/files/Bitcoin/blockchain/bitcoin_blockchain_170000.zip/download) to download or copy and paste the link below. - - http://sourceforge.net/projects/bitcoin/files/Bitcoin/blockchain/bitcoin_blockchain_170000.zip/download - -The download page should look like this, with a countdown to the download. If it does not work directly click the download. Save the file to a folder you use for downloads. -![Fig3](img/bootstrap3.png) - ### Importing the blockchain -Exit the Bitcoin Client software if you have it running. Be sure not to have an actively used wallet in use. We are going to copy the download of the blockchain to the Bitcoin client data directory. You should run the client software at least once so it can generate the data directory. Copy the downloaded bootstrap.dat file into the Bitcoin data folder. +Exit the Bitcoin client software if you have it running. Be sure not to have an actively used wallet in use. We are going to copy the download of the blockchain to the Bitcoin client data directory. You should run the client software at least once so it can generate the data directory. Copy the downloaded bootstrap.dat file into the Bitcoin data folder. **For Windows users:** Open explorer, and type into the address bar: @@ -63,4 +53,4 @@ Wait until the import finishes. The client will download the last days not cover ### Is this safe? -Yes, the above method is safe. The download contains only raw block chain data and the client verifies this on import. Do not download the blockchain from unofficial sources, especially if they provide `*.rev` and `*.sst` files. These files are not verified and can contain malicious edits. +Yes, the above method is safe. The download contains only raw blockchain data and the client verifies this on import. Do not download the blockchain from unofficial sources, especially if they provide `*.rev` and `*.sst` files. These files are not verified and can contain malicious edits. diff --git a/doc/build-osx.md b/doc/build-osx.md index dc55f8259e..491c5c4683 100644 --- a/doc/build-osx.md +++ b/doc/build-osx.md @@ -5,8 +5,7 @@ This guide will show you how to build bitcoind(headless client) for OSX. Notes ----- -* Tested on OS X 10.6 through 10.9 on 64-bit Intel processors only. -Older OSX releases or 32-bit processors are no longer supported. +* Tested on OS X 10.7 through 10.10 on 64-bit Intel processors only. * All of the commands should be executed in a Terminal application. The built-in one is located in `/Applications/Utilities`. @@ -39,7 +38,7 @@ Instructions: Homebrew #### Install dependencies using Homebrew - brew install autoconf automake libtool boost miniupnpc openssl pkg-config protobuf qt + brew install autoconf automake libtool boost miniupnpc openssl pkg-config protobuf qt gmp #### Installing berkeley-db4 using Homebrew @@ -85,6 +84,22 @@ After exiting, you'll get a warning that the install is keg-only, which means it make install +Use Qt Creator as IDE +------------------------ +You can use Qt Creator as IDE, for debugging and for manipulating forms, etc. +Download Qt Creator from http://www.qt.io/download/. Download the "community edition" and only install Qt Creator (uncheck the rest during the installation process). + +1. Make sure you installed everything through homebrew mentioned above +2. Do a proper ./configure --with-gui=qt5 --enable-debug +3. In Qt Creator do "New Project" -> Import Project -> Import Existing Project +4. Enter "bitcoin-qt" as project name, enter src/qt as location +5. Leave the file selection as it is +6. Confirm the "summary page" +7. In the "Projects" tab select "Manage Kits..." +8. Select the default "Desktop" kit and select "Clang (x86 64bit in /usr/bin)" as compiler +9. Select LLDB as debugger (you might need to set the path to your installtion) +10. Start debugging with Qt Creator + Creating a release build ------------------------ You can ignore this section if you are building `bitcoind` for your own use. @@ -96,9 +111,9 @@ as follows for maximum compatibility: All dependencies should be compiled with these flags: - -mmacosx-version-min=10.6 + -mmacosx-version-min=10.7 -arch x86_64 - -isysroot $(xcode-select --print-path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk + -isysroot $(xcode-select --print-path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk Once dependencies are compiled, see release-process.md for how the Bitcoin-Qt.app bundle is packaged and signed to create the .dmg disk image that is distributed. diff --git a/doc/build-unix.md b/doc/build-unix.md index fb5eaec431..e03dc8181a 100644 --- a/doc/build-unix.md +++ b/doc/build-unix.md @@ -27,31 +27,25 @@ This will build bitcoin-qt as well if the dependencies are met. Dependencies --------------------- +These dependencies are required: + Library | Purpose | Description ------------|------------------|---------------------- libssl | SSL Support | Secure communications - libdb4.8 | Berkeley DB | Wallet storage libboost | Boost | C++ Library - miniupnpc | UPnP Support | Optional firewall-jumping support - qt | GUI | GUI toolkit - protobuf | Payments in GUI | Data interchange format used for payment protocol - libqrencode | QR codes in GUI | Optional for generating QR codes - -[miniupnpc](http://miniupnp.free.fr/) may be used for UPnP port mapping. It can be downloaded from [here]( -http://miniupnp.tuxfamily.org/files/). UPnP support is compiled in and -turned off by default. See the configure options for upnp behavior desired: + libgmp | secp256k1 | Arbitrary-precision arithmetic (version >= 3.1) - --without-miniupnpc No UPnP support miniupnp not required - --disable-upnp-default (the default) UPnP support turned off by default at runtime - --enable-upnp-default UPnP support turned on by default at runtime +Optional dependencies: -Licenses of statically linked libraries: - Berkeley DB New BSD license with additional requirement that linked - software must be free open source - Boost MIT-like license - miniupnpc New (3-clause) BSD license + Library | Purpose | Description + ------------|------------------|---------------------- + miniupnpc | UPnP Support | Firewall-jumping support + libdb4.8 | Berkeley DB | Wallet storage (only needed when wallet enabled) + qt | GUI | GUI toolkit (only needed when GUI enabled) + protobuf | Payments in GUI | Data interchange format used for payment protocol (only needed when GUI enabled) + libqrencode | QR codes in GUI | Optional for generating QR codes (only needed when GUI enabled) -- For the versions used in the release, see doc/release-process.md under *Fetch and build inputs*. +For the versions used in the release, see [release-process.md](release-process.md) under *Fetch and build inputs*. System requirements -------------------- @@ -64,7 +58,7 @@ Dependency Build Instructions: Ubuntu & Debian ---------------------------------------------- Build requirements: - sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev + sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev libgmp-dev for Ubuntu 12.04 and later or Debian 7 and later libboost-all-dev has to be installed: @@ -129,6 +123,17 @@ symbols, which reduces the executable size by about 90%. miniupnpc --------- + +[miniupnpc](http://miniupnp.free.fr/) may be used for UPnP port mapping. It can be downloaded from [here]( +http://miniupnp.tuxfamily.org/files/). UPnP support is compiled in and +turned off by default. See the configure options for upnp behavior desired: + + --without-miniupnpc No UPnP support miniupnp not required + --disable-upnp-default (the default) UPnP support turned off by default at runtime + --enable-upnp-default UPnP support turned on by default at runtime + +To build: + tar -xzvf miniupnpc-1.6.tar.gz cd miniupnpc-1.6 make diff --git a/doc/coding.md b/doc/coding.md index ceed8c18b4..43294dbe4c 100644 --- a/doc/coding.md +++ b/doc/coding.md @@ -12,20 +12,6 @@ gradually. - No indentation for public/protected/private or for namespaces. - No extra spaces inside parenthesis; don't do ( this ) - No space after function names; one space after if, for and while. -- Includes need to be ordered alphabetically, separate own and foreign headers with a new-line (example key.cpp): -```c++ -#include "key.h" - -#include "crypto/sha2.h" -#include "util.h" - -#include <openssl/foo.h> -``` -- Class or struct keywords in header files need to be ordered alphabetically: -```c++ -class CAlpha; -class CBeta; -``` Block style example: ```c++ @@ -129,8 +115,6 @@ Threads - StartNode : Starts other threads. -- ThreadGetMyExternalIP : Determines outside-the-firewall IP address, sends addr message to connected peers when it determines it. - - ThreadDNSAddressSeed : Loads addresses of peers from the DNS. - ThreadMapPort : Universal plug-and-play startup/shutdown diff --git a/doc/img/bootstrap3.png b/doc/img/bootstrap3.png Binary files differdeleted file mode 100644 index 8a6754e3e0..0000000000 --- a/doc/img/bootstrap3.png +++ /dev/null diff --git a/doc/release-notes.md b/doc/release-notes.md index 169ad71a0f..6aaea67790 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -84,3 +84,14 @@ Using wildcards will result in the rule being rejected with the following error Error: Invalid -rpcallowip subnet specification: *. Valid 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). +RPC Server "Warm-Up" Mode +========================= + +The RPC server is started earlier now, before most of the expensive +intialisations like loading the block index. It is available now almost +immediately after starting the process. However, until all initialisations +are done, it always returns an immediate error with code -28 to all calls. + +This new behaviour can be useful for clients to know that a server is already +started and will be available soon (for instance, so that they do not +have to start it themselves). diff --git a/doc/release-process.md b/doc/release-process.md index 7699af90bd..a16d4ace4a 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -23,6 +23,10 @@ Release Process * * * +###update gitian + + In order to take advantage of the new caching features in gitian, be sure to update to a recent version (e9741525c or higher is recommended) + ###perform gitian builds From a directory containing the bitcoin source, gitian-builder and gitian.sigs @@ -46,117 +50,27 @@ Release Process tar -C /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ -czf MacOSX10.7.sdk.tar.gz MacOSX10.7.sdk - Download remaining inputs, and build everything: - - wget 'http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.9.tar.gz' -O miniupnpc-1.9.tar.gz - wget 'https://www.openssl.org/source/openssl-1.0.1h.tar.gz' - wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz' - wget 'http://zlib.net/zlib-1.2.8.tar.gz' - wget 'ftp://ftp.simplesystems.org/pub/png/src/history/libpng16/libpng-1.6.8.tar.gz' - wget 'https://fukuchi.org/works/qrencode/qrencode-3.4.3.tar.bz2' - wget 'https://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2' - wget 'https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch' -O boost-mingw-gas-cross-compile-2013-03-03.patch - wget 'https://download.qt-project.org/official_releases/qt/5.2/5.2.0/single/qt-everywhere-opensource-src-5.2.0.tar.gz' - wget 'https://download.qt-project.org/official_releases/qt/5.2/5.2.1/single/qt-everywhere-opensource-src-5.2.1.tar.gz' - wget 'https://download.qt-project.org/archive/qt/4.6/qt-everywhere-opensource-src-4.6.4.tar.gz' - wget 'https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2' - wget 'https://github.com/mingwandroid/toolchain4/archive/10cc648683617cca8bcbeae507888099b41b530c.tar.gz' - wget 'http://www.opensource.apple.com/tarballs/cctools/cctools-809.tar.gz' - wget 'http://www.opensource.apple.com/tarballs/dyld/dyld-195.5.tar.gz' - wget 'http://www.opensource.apple.com/tarballs/ld64/ld64-127.2.tar.gz' - wget 'http://pkgs.fedoraproject.org/repo/pkgs/cdrkit/cdrkit-1.1.11.tar.gz/efe08e2f3ca478486037b053acd512e9/cdrkit-1.1.11.tar.gz' - wget 'https://github.com/theuni/libdmg-hfsplus/archive/libdmg-hfsplus-v0.1.tar.gz' - wget 'http://llvm.org/releases/3.2/clang+llvm-3.2-x86-linux-ubuntu-12.04.tar.gz' -O clang-llvm-3.2-x86-linux-ubuntu-12.04.tar.gz - wget 'https://raw.githubusercontent.com/theuni/osx-cross-depends/master/patches/cdrtools/genisoimage.diff' -O cdrkit-deterministic.patch - cd .. - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-linux.yml - mv build/out/boost-*.zip inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-linux.yml - mv build/out/bitcoin-deps-*.zip inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/qt-linux.yml - mv build/out/qt-*.tar.gz inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-win.yml - mv build/out/boost-*.zip inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-win.yml - mv build/out/bitcoin-deps-*.zip inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/qt-win.yml - mv build/out/qt-*.zip inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/protobuf-win.yml - mv build/out/protobuf-*.zip inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/gitian-osx-native.yml - mv build/out/osx-*.tar.gz inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/gitian-osx-depends.yml - mv build/out/osx-*.tar.gz inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/gitian-osx-qt.yml - mv build/out/osx-*.tar.gz inputs/ - - The expected SHA256 hashes of the intermediate inputs are: - - f29b7d9577417333fb56e023c2977f5726a7c297f320b175a4108cf7cd4c2d29 boost-linux32-1.55.0-gitian-r1.zip - 88232451c4104f7eb16e469ac6474fd1231bd485687253f7b2bdf46c0781d535 boost-linux64-1.55.0-gitian-r1.zip - 46710f673467e367738d8806e45b4cb5931aaeea61f4b6b55a68eea56d5006c5 bitcoin-deps-linux32-gitian-r6.zip - f03be39fb26670243d3a659e64d18e19d03dec5c11e9912011107768390b5268 bitcoin-deps-linux64-gitian-r6.zip - 57e57dbdadc818cd270e7e00500a5e1085b3bcbdef69a885f0fb7573a8d987e1 qt-linux32-4.6.4-gitian-r1.tar.gz - 60eb4b9c5779580b7d66529efa5b2836ba1a70edde2a0f3f696d647906a826be qt-linux64-4.6.4-gitian-r1.tar.gz - 60dc2d3b61e9c7d5dbe2f90d5955772ad748a47918ff2d8b74e8db9b1b91c909 boost-win32-1.55.0-gitian-r6.zip - f65fcaf346bc7b73bc8db3a8614f4f6bee2f61fcbe495e9881133a7c2612a167 boost-win64-1.55.0-gitian-r6.zip - 70de248cd0dd7e7476194129e818402e974ca9c5751cbf591644dc9f332d3b59 bitcoin-deps-win32-gitian-r13.zip - 9eace4c76f639f4f3580a478eee4f50246e1bbb5ccdcf37a158261a5a3fa3e65 bitcoin-deps-win64-gitian-r13.zip - 963e3e5e85879010a91143c90a711a5d1d5aba992e38672cdf7b54e42c56b2f1 qt-win32-5.2.0-gitian-r3.zip - 751c579830d173ef3e6f194e83d18b92ebef6df03289db13ab77a52b6bc86ef0 qt-win64-5.2.0-gitian-r3.zip - e2e403e1a08869c7eed4d4293bce13d51ec6a63592918b90ae215a0eceb44cb4 protobuf-win32-2.5.0-gitian-r4.zip - a0999037e8b0ef9ade13efd88fee261ba401f5ca910068b7e0cd3262ba667db0 protobuf-win64-2.5.0-gitian-r4.zip - 512bc0622c883e2e0f4cbc3fedfd8c2402d06c004ce6fb32303cc2a6f405b6df osx-native-depends-r3.tar.gz - 927e4b222be6d590b4bc2fc185872a5d0ca5c322adb983764d3ed84be6bdbc81 osx-depends-r4.tar.gz - ec95abef1df2b096a970359787c01d8c45e2a4475b7ae34e12c022634fbdba8a osx-depends-qt-5.2.1-r4.tar.gz - - Build Bitcoin Core for Linux, Windows, and OS X: ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-linux.yml ./bin/gsign --signer $SIGNER --release ${VERSION}-linux --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-linux.yml - pushd build/out - zip -r bitcoin-${VERSION}-linux-gitian.zip * - mv bitcoin-${VERSION}-linux-gitian.zip ../../../ - popd + mv build/out/bitcoin-*.tar.gz build/out/src/bitcoin-*.tar.gz ../ ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-win.yml ./bin/gsign --signer $SIGNER --release ${VERSION}-win --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win.yml - pushd build/out - zip -r bitcoin-${VERSION}-win-gitian.zip * - mv bitcoin-${VERSION}-win-gitian.zip ../../../ - popd - ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-osx-bitcoin.yml - ./bin/gsign --signer $SIGNER --release ${VERSION}-osx --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-osx-bitcoin.yml - pushd build/out - mv Bitcoin-Qt.dmg ../../../ + mv build/out/bitcoin-*.zip build/out/bitcoin-*.exe ../ + ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-osx.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-osx-unsigned --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-osx.yml + mv build/out/bitcoin-*-unsigned.tar.gz inputs + mv build/out/bitcoin-*.tar.gz build/out/bitcoin-*.dmg ../ popd - popd - +bitcoin-0.9.99-osx-unsigned.tar.gz Build output expected: - 1. linux 32-bit and 64-bit binaries + source (bitcoin-${VERSION}-linux-gitian.zip) - 2. windows 32-bit and 64-bit binaries + installer + source (bitcoin-${VERSION}-win-gitian.zip) - 3. OSX installer (Bitcoin-Qt.dmg) - 4. Gitian signatures (in gitian.sigs/${VERSION}-<linux|win|osx>/(your gitian key)/ - -repackage gitian builds for release as stand-alone zip/tar/installer exe - -**Linux .tar.gz:** - - unzip bitcoin-${VERSION}-linux-gitian.zip -d bitcoin-${VERSION}-linux - tar czvf bitcoin-${VERSION}-linux.tar.gz bitcoin-${VERSION}-linux - rm -rf bitcoin-${VERSION}-linux - -**Windows .zip and setup.exe:** - - unzip bitcoin-${VERSION}-win-gitian.zip -d bitcoin-${VERSION}-win - mv bitcoin-${VERSION}-win/bitcoin-*-setup.exe . - zip -r bitcoin-${VERSION}-win.zip bitcoin-${VERSION}-win - rm -rf bitcoin-${VERSION}-win - -**Mac OS X .dmg:** - - mv Bitcoin-Qt.dmg bitcoin-${VERSION}-osx.dmg + 1. source tarball (bitcoin-${VERSION}.tar.gz) + 2. linux 32-bit and 64-bit binaries dist tarballs (bitcoin-${VERSION}-linux[32|64].tar.gz) + 3. windows 32-bit and 64-bit installers and dist zips (bitcoin-${VERSION}-win[32|64]-setup.exe, bitcoin-${VERSION}-win[32|64].zip) + 4. OSX unsigned installer (bitcoin-${VERSION}-osx-unsigned.dmg) + 5. Gitian signatures (in gitian.sigs/${VERSION}-<linux|win|osx-unsigned>/(your gitian key)/ ###Next steps: @@ -165,7 +79,28 @@ Commit your signature to gitian.sigs: pushd gitian.sigs git add ${VERSION}-linux/${SIGNER} git add ${VERSION}-win/${SIGNER} - git add ${VERSION}-osx/${SIGNER} + git add ${VERSION}-osx-unsigned/${SIGNER} + git commit -a + git push # Assuming you can push to the gitian.sigs tree + popd + +Wait for OSX detached signature: + Once the OSX build has 3 matching signatures, Gavin will sign it with the apple App-Store key. + He will then upload a detached signature to be combined with the unsigned app to create a signed binary. + +Create the signed OSX binary: + pushd ./gitian-builder + # Fetch the signature as instructed by Gavin + cp signature.tar.gz inputs/ + ./bin/gbuild -i ../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-osx-signed --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml + mv build/out/bitcoin-${VERSION}-osx.dmg ../ + popd + +Commit your signature for the signed OSX binary: + + pushd gitian.sigs + git add ${VERSION}-osx-signed/${SIGNER} git commit -a git push # Assuming you can push to the gitian.sigs tree popd @@ -178,8 +113,6 @@ Commit your signature to gitian.sigs: - Code-sign Windows -setup.exe (in a Windows virtual machine using signtool) - - Code-sign MacOSX .dmg - Note: only Gavin has the code-signing keys currently. - Create `SHA256SUMS.asc` for the builds, and GPG-sign it: diff --git a/qa/pull-tester/build-tests.sh.in b/qa/pull-tester/build-tests.sh.in deleted file mode 100755 index f5c5f0bf70..0000000000 --- a/qa/pull-tester/build-tests.sh.in +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -# Copyright (c) 2013-2014 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -# -# Param1: The prefix to mingw staging -# Param2: Path to java comparison tool -# Param3: Number of make jobs. Defaults to 1. - -# Exit immediately if anything fails: -set -e -set -o xtrace - -MINGWPREFIX=$1 -JAVA_COMPARISON_TOOL=$2 -RUN_EXPENSIVE_TESTS=$3 -JOBS=${4-1} -OUT_DIR=${5-} - -if [ $# -lt 2 ]; then - echo "Usage: $0 [mingw-prefix] [java-comparison-tool] <make jobs> <save output dir>" - exit 1 -fi - -DISTDIR=@PACKAGE@-@VERSION@ - -# Cross-compile for windows first (breaking the mingw/windows build is most common) -cd @abs_top_srcdir@ -make distdir -mkdir -p win32-build -rsync -av $DISTDIR/ win32-build/ -rm -r $DISTDIR -cd win32-build - -if [ $RUN_EXPENSIVE_TESTS = 1 ]; then - ./configure --disable-silent-rules --disable-ccache --prefix=$MINGWPREFIX --host=i586-mingw32msvc --with-qt-bindir=$MINGWPREFIX/host/bin --with-qt-plugindir=$MINGWPREFIX/plugins --with-qt-incdir=$MINGWPREFIX/include --with-boost=$MINGWPREFIX --with-protoc-bindir=$MINGWPREFIX/host/bin CPPFLAGS=-I$MINGWPREFIX/include LDFLAGS=-L$MINGWPREFIX/lib --with-comparison-tool="$JAVA_COMPARISON_TOOL" -else - ./configure --disable-silent-rules --disable-ccache --prefix=$MINGWPREFIX --host=i586-mingw32msvc --with-qt-bindir=$MINGWPREFIX/host/bin --with-qt-plugindir=$MINGWPREFIX/plugins --with-qt-incdir=$MINGWPREFIX/include --with-boost=$MINGWPREFIX --with-protoc-bindir=$MINGWPREFIX/host/bin CPPFLAGS=-I$MINGWPREFIX/include LDFLAGS=-L$MINGWPREFIX/lib -fi -make -j$JOBS - -# And compile for Linux: -cd @abs_top_srcdir@ -make distdir -mkdir -p linux-build -rsync -av $DISTDIR/ linux-build/ -rm -r $DISTDIR -cd linux-build -if [ $RUN_EXPENSIVE_TESTS = 1 ]; then - ./configure --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" --enable-comparison-tool-reorg-tests -else - ./configure --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" -fi -make -j$JOBS - -# link interesting binaries to parent out/ directory, if it exists. Do this before -# running unit tests (we want bad binaries to be easy to find) -if [ -d "$OUT_DIR" -a -w "$OUT_DIR" ]; then - set +e - # Windows: - cp @abs_top_srcdir@/win32-build/src/bitcoind.exe $OUT_DIR/bitcoind.exe - cp @abs_top_srcdir@/win32-build/src/test/test_bitcoin.exe $OUT_DIR/test_bitcoin.exe - cp @abs_top_srcdir@/win32-build/src/qt/bitcoind-qt.exe $OUT_DIR/bitcoin-qt.exe - # Linux: - cp @abs_top_srcdir@/linux-build/src/bitcoind $OUT_DIR/bitcoind - cp @abs_top_srcdir@/linux-build/src/test/test_bitcoin $OUT_DIR/test_bitcoin - cp @abs_top_srcdir@/linux-build/src/qt/bitcoind-qt $OUT_DIR/bitcoin-qt - set -e -fi - -# Run unit tests and blockchain-tester on Linux: -cd @abs_top_srcdir@/linux-build -make check - -# Run RPC integration test on Linux: -@abs_top_srcdir@/qa/rpc-tests/wallet.sh @abs_top_srcdir@/linux-build/src -@abs_top_srcdir@/qa/rpc-tests/listtransactions.py --srcdir @abs_top_srcdir@/linux-build/src -@abs_top_srcdir@/qa/rpc-tests/forknotify.py --srcdir @abs_top_srcdir@/linux-build/src -# Clean up cache/ directory that the python regression tests create -rm -rf cache - -if [ $RUN_EXPENSIVE_TESTS = 1 ]; then - # Run unit tests and blockchain-tester on Windows: - cd @abs_top_srcdir@/win32-build - make check -fi - -# Clean up builds (pull-tester machine doesn't have infinite disk space) -cd @abs_top_srcdir@/linux-build -make clean -cd @abs_top_srcdir@/win32-build -make clean - -# TODO: Fix code coverage builds on pull-tester machine -# # Test code coverage -# cd @abs_top_srcdir@ -# make distdir -# mv $DISTDIR linux-coverage-build -# cd linux-coverage-build -# ./configure --enable-lcov --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" -# make -j$JOBS -# make cov diff --git a/qa/pull-tester/pull-tester.py b/qa/pull-tester/pull-tester.py deleted file mode 100755 index 66688dd4b5..0000000000 --- a/qa/pull-tester/pull-tester.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/python -# Copyright (c) 2013-2014 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -# -import json -from urllib import urlopen -import requests -import getpass -from string import Template -import sys -import os -import subprocess - -class RunError(Exception): - def __init__(self, value): - self.value = value - def __str__(self): - return repr(self.value) - -def run(command, **kwargs): - fail_hard = kwargs.pop("fail_hard", True) - # output to /dev/null by default: - kwargs.setdefault("stdout", open('/dev/null', 'w')) - kwargs.setdefault("stderr", open('/dev/null', 'w')) - command = Template(command).substitute(os.environ) - if "TRACE" in os.environ: - if 'cwd' in kwargs: - print("[cwd=%s] %s"%(kwargs['cwd'], command)) - else: print(command) - try: - process = subprocess.Popen(command.split(' '), **kwargs) - process.wait() - except KeyboardInterrupt: - process.terminate() - raise - if process.returncode != 0 and fail_hard: - raise RunError("Failed: "+command) - return process.returncode - -def checkout_pull(clone_url, commit, out): - # Init - build_dir=os.environ["BUILD_DIR"] - run("umount ${CHROOT_COPY}/proc", fail_hard=False) - run("rsync --delete -apv ${CHROOT_MASTER}/ ${CHROOT_COPY}") - run("rm -rf ${CHROOT_COPY}${SCRIPTS_DIR}") - run("cp -a ${SCRIPTS_DIR} ${CHROOT_COPY}${SCRIPTS_DIR}") - # Merge onto upstream/master - run("rm -rf ${BUILD_DIR}") - run("mkdir -p ${BUILD_DIR}") - run("git clone ${CLONE_URL} ${BUILD_DIR}") - run("git remote add pull "+clone_url, cwd=build_dir, stdout=out, stderr=out) - run("git fetch pull", cwd=build_dir, stdout=out, stderr=out) - if run("git merge "+ commit, fail_hard=False, cwd=build_dir, stdout=out, stderr=out) != 0: - return False - run("chown -R ${BUILD_USER}:${BUILD_GROUP} ${BUILD_DIR}", stdout=out, stderr=out) - run("mount --bind /proc ${CHROOT_COPY}/proc") - return True - -def commentOn(commentUrl, success, inMerge, needTests, linkUrl): - common_message = """ -This test script verifies pulls every time they are updated. It, however, dies sometimes and fails to test properly. If you are waiting on a test, please check timestamps to verify that the test.log is moving at http://jenkins.bluematt.me/pull-tester/current/ -Contact BlueMatt on freenode if something looks broken.""" - - # Remove old BitcoinPullTester comments (I'm being lazy and not paginating here) - recentcomments = requests.get(commentUrl+"?sort=created&direction=desc", - auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])).json - for comment in recentcomments: - if comment["user"]["login"] == os.environ["GITHUB_USER"] and common_message in comment["body"]: - requests.delete(comment["url"], - auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])) - - if success == True: - if needTests: - message = "Automatic sanity-testing: PLEASE ADD TEST-CASES, though technically passed. See " + linkUrl + " for binaries and test log." - else: - message = "Automatic sanity-testing: PASSED, see " + linkUrl + " for binaries and test log." - - post_data = { "body" : message + common_message} - elif inMerge: - post_data = { "body" : "Automatic sanity-testing: FAILED MERGE, see " + linkUrl + " for test log." + """ - -This pull does not merge cleanly onto current master""" + common_message} - else: - post_data = { "body" : "Automatic sanity-testing: FAILED BUILD/TEST, see " + linkUrl + " for binaries and test log." + """ - -This could happen for one of several reasons: -1. It chanages changes build scripts in a way that made them incompatible with the automated testing scripts (please tweak those patches in qa/pull-tester) -2. It adds/modifies tests which test network rules (thanks for doing that), which conflicts with a patch applied at test time -3. It does not build on either Linux i386 or Win32 (via MinGW cross compile) -4. The test suite fails on either Linux i386 or Win32 -5. The block test-cases failed (lookup the first bNN identifier which failed in https://github.com/TheBlueMatt/test-scripts/blob/master/FullBlockTestGenerator.java) - -If you believe this to be in error, please ping BlueMatt on freenode or TheBlueMatt here. -""" + common_message} - - resp = requests.post(commentUrl, json.dumps(post_data), auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])) - -def testpull(number, comment_url, clone_url, commit): - print("Testing pull %d: %s : %s"%(number, clone_url,commit)) - - dir = os.environ["RESULTS_DIR"] + "/" + commit + "/" - print(" ouput to %s"%dir) - if os.path.exists(dir): - os.system("rm -r " + dir) - os.makedirs(dir) - currentdir = os.environ["RESULTS_DIR"] + "/current" - os.system("rm -r "+currentdir) - os.system("ln -s " + dir + " " + currentdir) - out = open(dir + "test.log", 'w+') - - resultsurl = os.environ["RESULTS_URL"] + commit - checkedout = checkout_pull(clone_url, commit, out) - if checkedout != True: - print("Failed to test pull - sending comment to: " + comment_url) - commentOn(comment_url, False, True, False, resultsurl) - open(os.environ["TESTED_DB"], "a").write(commit + "\n") - return - - run("rm -rf ${CHROOT_COPY}/${OUT_DIR}", fail_hard=False); - run("mkdir -p ${CHROOT_COPY}/${OUT_DIR}", fail_hard=False); - run("chown -R ${BUILD_USER}:${BUILD_GROUP} ${CHROOT_COPY}/${OUT_DIR}", fail_hard=False) - - script = os.environ["BUILD_PATH"]+"/qa/pull-tester/pull-tester.sh" - script += " ${BUILD_PATH} ${MINGW_DEPS_DIR} ${SCRIPTS_DIR}/BitcoindComparisonTool_jar/BitcoindComparisonTool.jar 0 6 ${OUT_DIR}" - returncode = run("chroot ${CHROOT_COPY} sudo -u ${BUILD_USER} -H timeout ${TEST_TIMEOUT} "+script, - fail_hard=False, stdout=out, stderr=out) - - run("mv ${CHROOT_COPY}/${OUT_DIR} " + dir) - run("mv ${BUILD_DIR} " + dir) - - if returncode == 42: - print("Successfully tested pull (needs tests) - sending comment to: " + comment_url) - commentOn(comment_url, True, False, True, resultsurl) - elif returncode != 0: - print("Failed to test pull - sending comment to: " + comment_url) - commentOn(comment_url, False, False, False, resultsurl) - else: - print("Successfully tested pull - sending comment to: " + comment_url) - commentOn(comment_url, True, False, False, resultsurl) - open(os.environ["TESTED_DB"], "a").write(commit + "\n") - -def environ_default(setting, value): - if not setting in os.environ: - os.environ[setting] = value - -if getpass.getuser() != "root": - print("Run me as root!") - sys.exit(1) - -if "GITHUB_USER" not in os.environ or "GITHUB_AUTH_TOKEN" not in os.environ: - print("GITHUB_USER and/or GITHUB_AUTH_TOKEN environment variables not set") - sys.exit(1) - -environ_default("CLONE_URL", "https://github.com/bitcoin/bitcoin.git") -environ_default("MINGW_DEPS_DIR", "/mnt/w32deps") -environ_default("SCRIPTS_DIR", "/mnt/test-scripts") -environ_default("CHROOT_COPY", "/mnt/chroot-tmp") -environ_default("CHROOT_MASTER", "/mnt/chroot") -environ_default("OUT_DIR", "/mnt/out") -environ_default("BUILD_PATH", "/mnt/bitcoin") -os.environ["BUILD_DIR"] = os.environ["CHROOT_COPY"] + os.environ["BUILD_PATH"] -environ_default("RESULTS_DIR", "/mnt/www/pull-tester") -environ_default("RESULTS_URL", "http://jenkins.bluematt.me/pull-tester/") -environ_default("GITHUB_REPO", "bitcoin/bitcoin") -environ_default("TESTED_DB", "/mnt/commits-tested.txt") -environ_default("BUILD_USER", "matt") -environ_default("BUILD_GROUP", "matt") -environ_default("TEST_TIMEOUT", str(60*60*2)) - -print("Optional usage: pull-tester.py 2112") - -f = open(os.environ["TESTED_DB"]) -tested = set( line.rstrip() for line in f.readlines() ) -f.close() - -if len(sys.argv) > 1: - pull = requests.get("https://api.github.com/repos/"+os.environ["GITHUB_REPO"]+"/pulls/"+sys.argv[1], - auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])).json - testpull(pull["number"], pull["_links"]["comments"]["href"], - pull["head"]["repo"]["clone_url"], pull["head"]["sha"]) - -else: - for page in range(1,100): - result = requests.get("https://api.github.com/repos/"+os.environ["GITHUB_REPO"]+"/pulls?state=open&page=%d"%(page,), - auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])).json - if len(result) == 0: break; - for pull in result: - if pull["head"]["sha"] in tested: - print("Pull %d already tested"%(pull["number"],)) - continue - testpull(pull["number"], pull["_links"]["comments"]["href"], - pull["head"]["repo"]["clone_url"], pull["head"]["sha"]) diff --git a/qa/pull-tester/pull-tester.sh b/qa/pull-tester/pull-tester.sh deleted file mode 100755 index 3fe4a05c76..0000000000 --- a/qa/pull-tester/pull-tester.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# Copyright (c) 2013-2014 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. -# -# Helper script for pull-tester. -#Param 1: path to bitcoin srcroot -#Param ...: arguments for build-test.sh - -if [ $# -lt 1 ]; then - echo "usage: $0 [bitcoin srcroot] build-test arguments..." -fi - -killall -q bitcoin-cli -killall -q bitcoind - -cd $1 -shift - -./autogen.sh -./configure -./qa/pull-tester/build-tests.sh "$@" diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh new file mode 100755 index 0000000000..e01e870390 --- /dev/null +++ b/qa/pull-tester/rpc-tests.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -e + +CURDIR=$(cd $(dirname "$0"); pwd) +# Get BUILDDIR and REAL_BITCOIND +. "${CURDIR}/tests-config.sh" + +export BITCOINCLI=${BUILDDIR}/qa/pull-tester/run-bitcoin-cli +export BITCOIND=${REAL_BITCOIND} + +if [ "x${EXEEXT}" = "x.exe" ]; then + echo "Win tests currently disabled" + exit 0 +fi + +#Run the tests + +if [ "x${ENABLE_BITCOIND}${ENABLE_UTILS}${ENABLE_WALLET}" = "x111" ]; then + ${BUILDDIR}/qa/rpc-tests/wallet.py --srcdir "${BUILDDIR}/src" + ${BUILDDIR}/qa/rpc-tests/listtransactions.py --srcdir "${BUILDDIR}/src" + ${BUILDDIR}/qa/rpc-tests/txn_doublespend.py --srcdir "${BUILDDIR}/src" + ${BUILDDIR}/qa/rpc-tests/txn_doublespend.py --mineblock --srcdir "${BUILDDIR}/src" + #${BUILDDIR}/qa/rpc-tests/forknotify.py --srcdir "${BUILDDIR}/src" +else + echo "No rpc tests to run. Wallet, utils, and bitcoind must all be enabled" +fi diff --git a/qa/pull-tester/run-bitcoin-cli b/qa/pull-tester/run-bitcoin-cli new file mode 100755 index 0000000000..93c25bb9fc --- /dev/null +++ b/qa/pull-tester/run-bitcoin-cli @@ -0,0 +1,13 @@ +#!/bin/bash + +# This is a thin wrapper around bitcoin-cli that strips the Windows-style EOLs +# from the output if present. It is necessary when using bitcoin-cli.exe on +# Linux since shells will interpret the line-endings as part of the result. + +CURDIR=$(cd $(dirname "$0"); pwd) +# Get BUILDDIR and REAL_BITCOIND + +# Grab the value of $REAL_BITCOINCLI which may be bitcoin-cli.exe. +. "${CURDIR}/tests-config.sh" + +"${REAL_BITCOINCLI}" "$@" | sed 's/\r//' diff --git a/qa/pull-tester/tests-config.sh.in b/qa/pull-tester/tests-config.sh.in new file mode 100755 index 0000000000..10f4d33e47 --- /dev/null +++ b/qa/pull-tester/tests-config.sh.in @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright (c) 2013-2014 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +BUILDDIR="@abs_top_builddir@" +EXEEXT="@EXEEXT@" + +# These will turn into comments if they were disabled when configuring. +@ENABLE_WALLET_TRUE@ENABLE_WALLET=1 +@BUILD_BITCOIN_UTILS_TRUE@ENABLE_UTILS=1 +@BUILD_BITCOIND_TRUE@ENABLE_BITCOIND=1 + +REAL_BITCOIND="$BUILDDIR/src/bitcoind${EXEEXT}" +REAL_BITCOINCLI="$BUILDDIR/src/bitcoin-cli${EXEEXT}" + diff --git a/qa/rpc-tests/conflictedbalance.sh b/qa/rpc-tests/conflictedbalance.sh index 71761321ed..a112244c74 100755 --- a/qa/rpc-tests/conflictedbalance.sh +++ b/qa/rpc-tests/conflictedbalance.sh @@ -18,13 +18,14 @@ if [ $# -lt 1 ]; then echo "Usage: $0 path_to_binaries" echo "e.g. $0 ../../src" + echo "Env vars BITCOIND and BITCOINCLI may be used to specify the exact binaries used" exit 1 fi set -f -BITCOIND=${1}/bitcoind -CLI=${1}/bitcoin-cli +BITCOIND=${BITCOIND:-${1}/bitcoind} +CLI=${BITCOINCLI:-${1}/bitcoin-cli} DIR="${BASH_SOURCE%/*}" SENDANDWAIT="${DIR}/send.sh" diff --git a/qa/rpc-tests/forknotify.py b/qa/rpc-tests/forknotify.py index a4c2dc944e..1d2c4a9966 100755 --- a/qa/rpc-tests/forknotify.py +++ b/qa/rpc-tests/forknotify.py @@ -23,7 +23,7 @@ class ForkNotifyTest(BitcoinTestFramework): with open(self.alert_filename, 'w') as f: pass # Just open then close to create zero-length file self.nodes.append(start_node(0, self.options.tmpdir, - ["-blockversion=2", "-alertnotify=echo %s >> '" + self.alert_filename + "'"])) + ["-blockversion=2", "-alertnotify=echo %s >> \"" + self.alert_filename + "\""])) # Node1 mines block.version=211 blocks self.nodes.append(start_node(1, self.options.tmpdir, ["-blockversion=211"])) diff --git a/qa/rpc-tests/getblocktemplate.py b/qa/rpc-tests/getblocktemplate_longpoll.py index 500662bf87..263a5f6d59 100755 --- a/qa/rpc-tests/getblocktemplate.py +++ b/qa/rpc-tests/getblocktemplate_longpoll.py @@ -3,8 +3,6 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -# Exercise the listtransactions API - from test_framework import BitcoinTestFramework from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException from util import * @@ -46,7 +44,7 @@ class LongpollThread(threading.Thread): def run(self): self.node.getblocktemplate({'longpollid':self.longpollid}) -class GetBlockTemplateTest(BitcoinTestFramework): +class GetBlockTemplateLPTest(BitcoinTestFramework): ''' Test longpolling with getblocktemplate. ''' @@ -90,5 +88,5 @@ class GetBlockTemplateTest(BitcoinTestFramework): assert(not thr.is_alive()) if __name__ == '__main__': - GetBlockTemplateTest().main() + GetBlockTemplateLPTest().main() diff --git a/qa/rpc-tests/getblocktemplate_proposals.py b/qa/rpc-tests/getblocktemplate_proposals.py new file mode 100755 index 0000000000..0f7859584a --- /dev/null +++ b/qa/rpc-tests/getblocktemplate_proposals.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python +# Copyright (c) 2014 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework import BitcoinTestFramework +from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException +from util import * + +from binascii import a2b_hex, b2a_hex +from hashlib import sha256 +from struct import pack + + +def check_array_result(object_array, to_match, expected): + """ + Pass in array of JSON objects, a dictionary with key/value pairs + to match against, and another dictionary with expected key/value + pairs. + """ + num_matched = 0 + for item in object_array: + all_match = True + for key,value in to_match.items(): + if item[key] != value: + all_match = False + if not all_match: + continue + for key,value in expected.items(): + if item[key] != value: + raise AssertionError("%s : expected %s=%s"%(str(item), str(key), str(value))) + num_matched = num_matched+1 + if num_matched == 0: + raise AssertionError("No objects matched %s"%(str(to_match))) + +def b2x(b): + return b2a_hex(b).decode('ascii') + +# NOTE: This does not work for signed numbers (set the high bit) or zero (use b'\0') +def encodeUNum(n): + s = bytearray(b'\1') + while n > 127: + s[0] += 1 + s.append(n % 256) + n //= 256 + s.append(n) + return bytes(s) + +def varlenEncode(n): + if n < 0xfd: + return pack('<B', n) + if n <= 0xffff: + return b'\xfd' + pack('<H', n) + if n <= 0xffffffff: + return b'\xfe' + pack('<L', n) + return b'\xff' + pack('<Q', n) + +def dblsha(b): + return sha256(sha256(b).digest()).digest() + +def genmrklroot(leaflist): + cur = leaflist + while len(cur) > 1: + n = [] + if len(cur) & 1: + cur.append(cur[-1]) + for i in range(0, len(cur), 2): + n.append(dblsha(cur[i] + cur[i+1])) + cur = n + return cur[0] + +def template_to_bytes(tmpl, txlist): + blkver = pack('<L', tmpl['version']) + mrklroot = genmrklroot(list(dblsha(a) for a in txlist)) + timestamp = pack('<L', tmpl['curtime']) + nonce = b'\0\0\0\0' + blk = blkver + a2b_hex(tmpl['previousblockhash'])[::-1] + mrklroot + timestamp + a2b_hex(tmpl['bits'])[::-1] + nonce + blk += varlenEncode(len(txlist)) + for tx in txlist: + blk += tx + return blk + +def template_to_hex(tmpl, txlist): + return b2x(template_to_bytes(tmpl, txlist)) + +def assert_template(node, tmpl, txlist, expect): + rsp = node.getblocktemplate({'data':template_to_hex(tmpl, txlist),'mode':'proposal'}) + if rsp != expect: + raise AssertionError('unexpected: %s' % (rsp,)) + +class GetBlockTemplateProposalTest(BitcoinTestFramework): + ''' + Test block proposals with getblocktemplate. + ''' + + def run_test(self): + node = self.nodes[0] + tmpl = node.getblocktemplate() + if 'coinbasetxn' not in tmpl: + rawcoinbase = encodeUNum(tmpl['height']) + rawcoinbase += b'\x01-' + hexcoinbase = b2x(rawcoinbase) + hexoutval = b2x(pack('<Q', tmpl['coinbasevalue'])) + tmpl['coinbasetxn'] = {'data': '01000000' + '01' + '0000000000000000000000000000000000000000000000000000000000000000ffffffff' + ('%02x' % (len(rawcoinbase),)) + hexcoinbase + 'fffffffe' + '01' + hexoutval + '00' + '00000000'} + txlist = list(bytearray(a2b_hex(a['data'])) for a in (tmpl['coinbasetxn'],) + tuple(tmpl['transactions'])) + + # Test 0: Capability advertised + assert('proposal' in tmpl['capabilities']) + + # NOTE: This test currently FAILS (regtest mode doesn't enforce block height in coinbase) + ## Test 1: Bad height in coinbase + #txlist[0][4+1+36+1+1] += 1 + #assert_template(node, tmpl, txlist, 'FIXME') + #txlist[0][4+1+36+1+1] -= 1 + + # Test 2: Bad input hash for gen tx + txlist[0][4+1] += 1 + assert_template(node, tmpl, txlist, 'bad-cb-missing') + txlist[0][4+1] -= 1 + + # Test 3: Truncated final tx + lastbyte = txlist[-1].pop() + try: + assert_template(node, tmpl, txlist, 'n/a') + except JSONRPCException: + pass # Expected + txlist[-1].append(lastbyte) + + # Test 4: Add an invalid tx to the end (duplicate of gen tx) + txlist.append(txlist[0]) + assert_template(node, tmpl, txlist, 'bad-txns-duplicate') + txlist.pop() + + # Test 5: Add an invalid tx to the end (non-duplicate) + txlist.append(bytearray(txlist[0])) + txlist[-1][4+1] = b'\xff' + assert_template(node, tmpl, txlist, 'bad-txns-inputs-missingorspent') + txlist.pop() + + # Test 6: Future tx lock time + txlist[0][-4:] = b'\xff\xff\xff\xff' + assert_template(node, tmpl, txlist, 'bad-txns-nonfinal') + txlist[0][-4:] = b'\0\0\0\0' + + # Test 7: Bad tx count + txlist.append(b'') + try: + assert_template(node, tmpl, txlist, 'n/a') + except JSONRPCException: + pass # Expected + txlist.pop() + + # Test 8: Bad bits + realbits = tmpl['bits'] + tmpl['bits'] = '1c0000ff' # impossible in the real world + assert_template(node, tmpl, txlist, 'bad-diffbits') + tmpl['bits'] = realbits + + # Test 9: Bad merkle root + rawtmpl = template_to_bytes(tmpl, txlist) + rawtmpl[4+32] = (rawtmpl[4+32] + 1) % 0x100 + rsp = node.getblocktemplate({'data':b2x(rawtmpl),'mode':'proposal'}) + if rsp != 'bad-txnmrklroot': + raise AssertionError('unexpected: %s' % (rsp,)) + + # Test 10: Bad timestamps + realtime = tmpl['curtime'] + tmpl['curtime'] = 0x7fffffff + assert_template(node, tmpl, txlist, 'time-too-new') + tmpl['curtime'] = 0 + assert_template(node, tmpl, txlist, 'time-too-old') + tmpl['curtime'] = realtime + + # Test 11: Valid block + assert_template(node, tmpl, txlist, None) + + # Test 12: Orphan block + tmpl['previousblockhash'] = 'ff00' * 16 + assert_template(node, tmpl, txlist, 'inconclusive-not-best-prevblk') + +if __name__ == '__main__': + GetBlockTemplateProposalTest().main() diff --git a/qa/rpc-tests/receivedby.py b/qa/rpc-tests/receivedby.py index 9fc661fe80..e3f86d38dc 100755 --- a/qa/rpc-tests/receivedby.py +++ b/qa/rpc-tests/receivedby.py @@ -124,6 +124,7 @@ class ReceivedByTest(BitcoinTestFramework): balance_by_account = rec_by_accountArr = self.nodes[1].getreceivedbyaccount(account) txid = self.nodes[0].sendtoaddress(addr, 0.1) + self.sync_all() # listreceivedbyaccount should return received_by_account_json because of 0 confirmations check_array_result(self.nodes[1].listreceivedbyaccount(), diff --git a/qa/rpc-tests/test_framework.py b/qa/rpc-tests/test_framework.py index c3396a5a83..9591c024fb 100755 --- a/qa/rpc-tests/test_framework.py +++ b/qa/rpc-tests/test_framework.py @@ -44,8 +44,8 @@ class BitcoinTestFramework(object): # on outward. This ensures that chains are properly reorganised. if not split: connect_nodes_bi(self.nodes, 1, 2) - sync_blocks(self.nodes[1:2]) - sync_mempools(self.nodes[1:2]) + sync_blocks(self.nodes[1:3]) + sync_mempools(self.nodes[1:3]) connect_nodes_bi(self.nodes, 0, 1) connect_nodes_bi(self.nodes, 2, 3) @@ -63,9 +63,9 @@ class BitcoinTestFramework(object): def sync_all(self): if self.is_network_split: - sync_blocks(self.nodes[:1]) + sync_blocks(self.nodes[:2]) sync_blocks(self.nodes[2:]) - sync_mempools(self.nodes[:1]) + sync_mempools(self.nodes[:2]) sync_mempools(self.nodes[2:]) else: sync_blocks(self.nodes) diff --git a/qa/rpc-tests/txn_doublespend.py b/qa/rpc-tests/txn_doublespend.py new file mode 100755 index 0000000000..6125147ebc --- /dev/null +++ b/qa/rpc-tests/txn_doublespend.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# Copyright (c) 2014 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Test proper accounting with malleable transactions +# + +from test_framework import BitcoinTestFramework +from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException +from decimal import Decimal +from util import * +import os +import shutil + +class TxnMallTest(BitcoinTestFramework): + + def add_options(self, parser): + parser.add_option("--mineblock", dest="mine_block", default=False, action="store_true", + help="Test double-spend of 1-confirmed transaction") + + def setup_network(self): + # Start with split network: + return super(TxnMallTest, self).setup_network(True) + + def run_test(self): + # All nodes should start with 1,250 BTC: + starting_balance = 1250 + for i in range(4): + assert_equal(self.nodes[i].getbalance(), starting_balance) + self.nodes[i].getnewaddress("") # bug workaround, coins generated assigned to first getnewaddress! + + # Assign coins to foo and bar accounts: + self.nodes[0].move("", "foo", 1220) + self.nodes[0].move("", "bar", 30) + assert_equal(self.nodes[0].getbalance(""), 0) + + # Coins are sent to node1_address + node1_address = self.nodes[1].getnewaddress("from0") + + # First: use raw transaction API to send 1210 BTC to node1_address, + # but don't broadcast: + (total_in, inputs) = gather_inputs(self.nodes[0], 1210) + change_address = self.nodes[0].getnewaddress("foo") + outputs = {} + outputs[change_address] = 40 + outputs[node1_address] = 1210 + rawtx = self.nodes[0].createrawtransaction(inputs, outputs) + doublespend = self.nodes[0].signrawtransaction(rawtx) + assert_equal(doublespend["complete"], True) + + # Create two transaction from node[0] to node[1]; the + # second must spend change from the first because the first + # spends all mature inputs: + txid1 = self.nodes[0].sendfrom("foo", node1_address, 1210, 0) + txid2 = self.nodes[0].sendfrom("bar", node1_address, 20, 0) + + # Have node0 mine a block: + if (self.options.mine_block): + self.nodes[0].setgenerate(True, 1) + sync_blocks(self.nodes[0:2]) + + tx1 = self.nodes[0].gettransaction(txid1) + tx2 = self.nodes[0].gettransaction(txid2) + + # Node0's balance should be starting balance, plus 50BTC for another + # matured block, minus 1210, minus 20, and minus transaction fees: + expected = starting_balance + if self.options.mine_block: expected += 50 + expected += tx1["amount"] + tx1["fee"] + expected += tx2["amount"] + tx2["fee"] + assert_equal(self.nodes[0].getbalance(), expected) + + # foo and bar accounts should be debited: + assert_equal(self.nodes[0].getbalance("foo"), 1220+tx1["amount"]+tx1["fee"]) + assert_equal(self.nodes[0].getbalance("bar"), 30+tx2["amount"]+tx2["fee"]) + + if self.options.mine_block: + assert_equal(tx1["confirmations"], 1) + assert_equal(tx2["confirmations"], 1) + # Node1's "from0" balance should be both transaction amounts: + assert_equal(self.nodes[1].getbalance("from0"), -(tx1["amount"]+tx2["amount"])) + else: + assert_equal(tx1["confirmations"], 0) + assert_equal(tx2["confirmations"], 0) + + # Now give doublespend to miner: + mutated_txid = self.nodes[2].sendrawtransaction(doublespend["hex"]) + # ... mine a block... + self.nodes[2].setgenerate(True, 1) + + # Reconnect the split network, and sync chain: + connect_nodes(self.nodes[1], 2) + self.nodes[2].setgenerate(True, 1) # Mine another block to make sure we sync + sync_blocks(self.nodes) + + # Re-fetch transaction info: + tx1 = self.nodes[0].gettransaction(txid1) + tx2 = self.nodes[0].gettransaction(txid2) + + # Both transactions should be conflicted + assert_equal(tx1["confirmations"], -1) + assert_equal(tx2["confirmations"], -1) + + # Node0's total balance should be starting balance, plus 100BTC for + # two more matured blocks, minus 1210 for the double-spend: + expected = starting_balance + 100 - 1210 + assert_equal(self.nodes[0].getbalance(), expected) + assert_equal(self.nodes[0].getbalance("*"), expected) + + # foo account should be debited, but bar account should not: + assert_equal(self.nodes[0].getbalance("foo"), 1220-1210) + assert_equal(self.nodes[0].getbalance("bar"), 30) + + # Node1's "from" account balance should be just the mutated send: + assert_equal(self.nodes[1].getbalance("from0"), 1210) + +if __name__ == '__main__': + TxnMallTest().main() diff --git a/qa/rpc-tests/txnmall.sh b/qa/rpc-tests/txnmall.sh deleted file mode 100755 index 035e7ee15f..0000000000 --- a/qa/rpc-tests/txnmall.sh +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) 2014 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -# Test proper accounting with malleable transactions - -if [ $# -lt 1 ]; then - echo "Usage: $0 path_to_binaries" - echo "e.g. $0 ../../src" - exit 1 -fi - -set -f - -BITCOIND=${1}/bitcoind -CLI=${1}/bitcoin-cli - -DIR="${BASH_SOURCE%/*}" -SENDANDWAIT="${DIR}/send.sh" -if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi -. "$DIR/util.sh" - -D=$(mktemp -d test.XXXXX) - -# Two nodes; one will play the part of merchant, the -# other an evil transaction-mutating miner. - -D1=${D}/node1 -CreateDataDir $D1 port=11000 rpcport=11001 -B1ARGS="-datadir=$D1" -$BITCOIND $B1ARGS & -B1PID=$! - -D2=${D}/node2 -CreateDataDir $D2 port=11010 rpcport=11011 -B2ARGS="-datadir=$D2" -$BITCOIND $B2ARGS & -B2PID=$! - -# Wait until both nodes are at the same block number -function WaitBlocks { - while : - do - sleep 1 - declare -i BLOCKS1=$( GetBlocks $B1ARGS ) - declare -i BLOCKS2=$( GetBlocks $B2ARGS ) - if (( BLOCKS1 == BLOCKS2 )) - then - break - fi - done -} - -# Wait until node has $N peers -function WaitPeers { - while : - do - declare -i PEERS=$( $CLI $1 getconnectioncount ) - if (( PEERS == "$2" )) - then - break - fi - sleep 1 - done -} - -echo "Generating test blockchain..." - -# Start with B2 connected to B1: -$CLI $B2ARGS addnode 127.0.0.1:11000 onetry -WaitPeers "$B1ARGS" 1 - -# 1 block, 50 XBT each == 50 XBT -$CLI $B1ARGS setgenerate true 1 - -WaitBlocks -# 100 blocks, 0 mature == 0 XBT -$CLI $B2ARGS setgenerate true 100 -WaitBlocks - -CheckBalance "$B1ARGS" 50 -CheckBalance "$B2ARGS" 0 - -# restart B2 with no connection -$CLI $B2ARGS stop > /dev/null 2>&1 -wait $B2PID -$BITCOIND $B2ARGS & -B2PID=$! - -B2ADDRESS=$( $CLI $B2ARGS getaccountaddress "from1" ) - -# Have B1 create two transactions; second will -# spend change from first, since B1 starts with only a single -# 50 bitcoin output: -$CLI $B1ARGS move "" "foo" 10.0 > /dev/null -$CLI $B1ARGS move "" "bar" 10.0 > /dev/null -TXID1=$( $CLI $B1ARGS sendfrom foo $B2ADDRESS 1.0 0) -TXID2=$( $CLI $B1ARGS sendfrom bar $B2ADDRESS 2.0 0) - -# Mutate TXID1 and add it to B2's memory pool: -RAWTX1=$( $CLI $B1ARGS getrawtransaction $TXID1 ) -# RAWTX1 is hex-encoded, serialized transaction. So each -# byte is two characters; we'll prepend the first -# "push" in the scriptsig with OP_PUSHDATA1 (0x4c), -# and add one to the length of the signature. -# Fields are fixed; from the beginning: -# 4-byte version -# 1-byte varint number-of inputs (one in this case) -# 32-byte previous txid -# 4-byte previous output -# 1-byte varint length-of-scriptsig -# 1-byte PUSH this many bytes onto stack -# ... etc -# So: to mutate, we want to get byte 41 (hex characters 82-83), -# increment it, and insert 0x4c after it. -L=${RAWTX1:82:2} -NEWLEN=$( printf "%x" $(( 16#$L + 1 )) ) -MUTATEDTX1=${RAWTX1:0:82}${NEWLEN}4c${RAWTX1:84} -# ... give mutated tx1 to B2: -MUTATEDTXID=$( $CLI $B2ARGS sendrawtransaction $MUTATEDTX1 ) - -echo "TXID1: " $TXID1 -echo "Mutated: " $MUTATEDTXID - -# Re-connect nodes, and have B2 mine a block -# containing the mutant: -$CLI $B2ARGS addnode 127.0.0.1:11000 onetry -$CLI $B2ARGS setgenerate true 1 -WaitBlocks - -# B1 should have 49 BTC; the 2 BTC send is -# conflicted, and should not count in -# balances. -CheckBalance "$B1ARGS" 49 -CheckBalance "$B1ARGS" 49 "*" -CheckBalance "$B1ARGS" 9 "foo" -CheckBalance "$B1ARGS" 10 "bar" - -# B2 should have 51 BTC -CheckBalance "$B2ARGS" 51 -CheckBalance "$B2ARGS" 1 "from1" - -$CLI $B2ARGS stop > /dev/null 2>&1 -wait $B2PID -$CLI $B1ARGS stop > /dev/null 2>&1 -wait $B1PID - -echo "Tests successful, cleaning up" -rm -rf $D -exit 0 diff --git a/qa/rpc-tests/util.py b/qa/rpc-tests/util.py index 6d0b21c927..bed7fed8ca 100644 --- a/qa/rpc-tests/util.py +++ b/qa/rpc-tests/util.py @@ -57,12 +57,11 @@ def sync_mempools(rpc_connections): if num_match == len(rpc_connections): break time.sleep(1) - bitcoind_processes = {} -def initialize_datadir(dir, n): - datadir = os.path.join(dir, "node"+str(n)) +def initialize_datadir(dirname, n): + datadir = os.path.join(dirname, "node"+str(n)) if not os.path.isdir(datadir): os.makedirs(datadir) with open(os.path.join(datadir, "bitcoin.conf"), 'w') as f: @@ -85,11 +84,11 @@ def initialize_chain(test_dir): # Create cache directories, run bitcoinds: for i in range(4): datadir=initialize_datadir("cache", i) - args = [ "bitcoind", "-keypool=1", "-datadir="+datadir, "-discover=0" ] + args = [ os.getenv("BITCOIND", "bitcoind"), "-keypool=1", "-datadir="+datadir, "-discover=0" ] if i > 0: args.append("-connect=127.0.0.1:"+str(p2p_port(0))) bitcoind_processes[i] = subprocess.Popen(args) - subprocess.check_call([ "bitcoin-cli", "-datadir="+datadir, + subprocess.check_call([ os.getenv("BITCOINCLI", "bitcoin-cli"), "-datadir="+datadir, "-rpcwait", "getblockcount"], stdout=devnull) devnull.close() rpcs = [] @@ -103,12 +102,17 @@ def initialize_chain(test_dir): # Create a 200-block-long chain; each of the 4 nodes # gets 25 mature blocks and 25 immature. - for i in range(4): - rpcs[i].setgenerate(True, 25) - sync_blocks(rpcs) - for i in range(4): - rpcs[i].setgenerate(True, 25) - sync_blocks(rpcs) + # blocks are created with timestamps 10 minutes apart, starting + # at 1 Jan 2014 + block_time = 1388534400 + for i in range(2): + for peer in range(4): + for j in range(25): + set_node_times(rpcs, block_time) + rpcs[peer].setgenerate(True, 1) + block_time += 10*60 + # Must sync before next peer starts generating blocks + sync_blocks(rpcs) # Shut them down, and clean up cache directories: stop_nodes(rpcs) @@ -125,6 +129,15 @@ def initialize_chain(test_dir): shutil.copytree(from_dir, to_dir) initialize_datadir(test_dir, i) # Overwrite port/rpcport in bitcoin.conf +def initialize_chain_clean(test_dir, num_nodes): + """ + Create an empty blockchain and num_nodes wallets. + Useful if a test case wants complete control over initialization. + """ + for i in range(num_nodes): + datadir=initialize_datadir(test_dir, i) + + def _rpchost_to_args(rpchost): '''Convert optional IP:port spec to rpcconnect/rpcport args''' if rpchost is None: @@ -145,16 +158,16 @@ def _rpchost_to_args(rpchost): rv += ['-rpcport=' + rpcport] return rv -def start_node(i, dir, extra_args=None, rpchost=None): +def start_node(i, dirname, extra_args=None, rpchost=None): """ Start a bitcoind and return RPC connection to it """ - datadir = os.path.join(dir, "node"+str(i)) - args = [ "bitcoind", "-datadir="+datadir, "-keypool=1", "-discover=0" ] + datadir = os.path.join(dirname, "node"+str(i)) + args = [ os.getenv("BITCOIND", "bitcoind"), "-datadir="+datadir, "-keypool=1", "-discover=0" ] if extra_args is not None: args.extend(extra_args) bitcoind_processes[i] = subprocess.Popen(args) devnull = open("/dev/null", "w+") - subprocess.check_call([ "bitcoin-cli", "-datadir="+datadir] + + subprocess.check_call([ os.getenv("BITCOINCLI", "bitcoin-cli"), "-datadir="+datadir] + _rpchost_to_args(rpchost) + ["-rpcwait", "getblockcount"], stdout=devnull) devnull.close() @@ -163,15 +176,15 @@ def start_node(i, dir, extra_args=None, rpchost=None): proxy.url = url # store URL on proxy for info return proxy -def start_nodes(num_nodes, dir, extra_args=None, rpchost=None): +def start_nodes(num_nodes, dirname, extra_args=None, rpchost=None): """ Start multiple bitcoinds, return RPC connections to them """ if extra_args is None: extra_args = [ None for i in range(num_nodes) ] - return [ start_node(i, dir, extra_args[i], rpchost) for i in range(num_nodes) ] + return [ start_node(i, dirname, extra_args[i], rpchost) for i in range(num_nodes) ] -def log_filename(dir, n_node, logname): - return os.path.join(dir, "node"+str(n_node), "regtest", logname) +def log_filename(dirname, n_node, logname): + return os.path.join(dirname, "node"+str(n_node), "regtest", logname) def stop_node(node, i): node.stop() @@ -179,10 +192,14 @@ def stop_node(node, i): del bitcoind_processes[i] def stop_nodes(nodes): - for i in range(len(nodes)): - nodes[i].stop() + for node in nodes: + node.stop() del nodes[:] # Emptying array closes connections as a side effect +def set_node_times(nodes, t): + for node in nodes: + node.setmocktime(t) + def wait_bitcoinds(): # Wait for all bitcoinds to cleanly exit for bitcoind in bitcoind_processes.values(): @@ -212,11 +229,13 @@ def find_output(node, txid, amount): return i raise RuntimeError("find_output txid %s : %s not found"%(txid,str(amount))) -def gather_inputs(from_node, amount_needed): + +def gather_inputs(from_node, amount_needed, confirmations_required=1): """ Return a random set of unspent txouts that are enough to pay amount_needed """ - utxo = from_node.listunspent(1) + assert(confirmations_required >=0) + utxo = from_node.listunspent(confirmations_required) random.shuffle(utxo) inputs = [] total_in = Decimal("0.00000000") @@ -225,7 +244,7 @@ def gather_inputs(from_node, amount_needed): total_in += t["amount"] inputs.append({ "txid" : t["txid"], "vout" : t["vout"], "address" : t["address"] } ) if total_in < amount_needed: - raise RuntimeError("Insufficient funds: need %d, have %d"%(amount+fee*2, total_in)) + raise RuntimeError("Insufficient funds: need %d, have %d"%(amount_needed, total_in)) return (total_in, inputs) def make_change(from_node, amount_in, amount_out, fee): diff --git a/qa/rpc-tests/wallet.py b/qa/rpc-tests/wallet.py new file mode 100755 index 0000000000..4271d96be7 --- /dev/null +++ b/qa/rpc-tests/wallet.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +# Copyright (c) 2014 The Bitcoin Core developers +# Distributed under the MIT/X11 software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# +# Exercise the wallet. Ported from wallet.sh. +# Does the following: +# a) creates 3 nodes, with an empty chain (no blocks). +# b) node0 mines a block +# c) node1 mines 101 blocks, so now nodes 0 and 1 have 50btc, node2 has none. +# d) node0 sends 21 btc to node2, in two transactions (11 btc, then 10 btc). +# e) node0 mines a block, collects the fee on the second transaction +# f) node1 mines 100 blocks, to mature node0's just-mined block +# g) check that node0 has 100-21, node2 has 21 +# h) node0 should now have 2 unspent outputs; send these to node2 via raw tx broadcast by node1 +# i) have node1 mine a block +# j) check balances - node0 should have 0, node2 should have 100 +# + +from test_framework import BitcoinTestFramework +from util import * + + +class WalletTest (BitcoinTestFramework): + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 3) + + def setup_network(self, split=False): + self.nodes = start_nodes(3, self.options.tmpdir) + connect_nodes_bi(self.nodes,0,1) + connect_nodes_bi(self.nodes,1,2) + connect_nodes_bi(self.nodes,0,2) + self.is_network_split=False + self.sync_all() + + def run_test (self): + print "Mining blocks..." + + self.nodes[0].setgenerate(True, 1) + + self.sync_all() + self.nodes[1].setgenerate(True, 101) + self.sync_all() + + assert_equal(self.nodes[0].getbalance(), 50) + assert_equal(self.nodes[1].getbalance(), 50) + assert_equal(self.nodes[2].getbalance(), 0) + + # Send 21 BTC from 0 to 2 using sendtoaddress call. + # Second transaction will be child of first, and will require a fee + self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 11) + self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 10) + + # Have node0 mine a block, thus he will collect his own fee. + self.nodes[0].setgenerate(True, 1) + self.sync_all() + + # Have node1 generate 100 blocks (so node0 can recover the fee) + self.nodes[1].setgenerate(True, 100) + self.sync_all() + + # node0 should end up with 100 btc in block rewards plus fees, but + # minus the 21 plus fees sent to node2 + assert_equal(self.nodes[0].getbalance(), 100-21) + assert_equal(self.nodes[2].getbalance(), 21) + + # Node0 should have two unspent outputs. + # Create a couple of transactions to send them to node2, submit them through + # node1, and make sure both node0 and node2 pick them up properly: + node0utxos = self.nodes[0].listunspent(1) + assert_equal(len(node0utxos), 2) + + # create both transactions + txns_to_send = [] + for utxo in node0utxos: + inputs = [] + outputs = {} + inputs.append({ "txid" : utxo["txid"], "vout" : utxo["vout"]}) + outputs[self.nodes[2].getnewaddress("from1")] = utxo["amount"] + raw_tx = self.nodes[0].createrawtransaction(inputs, outputs) + txns_to_send.append(self.nodes[0].signrawtransaction(raw_tx)) + + # Have node 1 (miner) send the transactions + self.nodes[1].sendrawtransaction(txns_to_send[0]["hex"], True) + self.nodes[1].sendrawtransaction(txns_to_send[1]["hex"], True) + + # Have node1 mine a block to confirm transactions: + self.nodes[1].setgenerate(True, 1) + self.sync_all() + + assert_equal(self.nodes[0].getbalance(), 0) + assert_equal(self.nodes[2].getbalance(), 100) + assert_equal(self.nodes[2].getbalance("from1"), 100-21) + + +if __name__ == '__main__': + WalletTest ().main () diff --git a/qa/rpc-tests/wallet.sh b/qa/rpc-tests/wallet.sh deleted file mode 100755 index bb5f34f590..0000000000 --- a/qa/rpc-tests/wallet.sh +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) 2013-2014 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -# Test block generation and basic wallet sending - -if [ $# -lt 1 ]; then - echo "Usage: $0 path_to_binaries" - echo "e.g. $0 ../../src" - exit 1 -fi - -set -f - -BITCOIND=${1}/bitcoind -CLI=${1}/bitcoin-cli - -DIR="${BASH_SOURCE%/*}" -SENDANDWAIT="${DIR}/send.sh" -if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi -. "$DIR/util.sh" - -D=$(mktemp -d test.XXXXX) - -D1=${D}/node1 -CreateDataDir "$D1" port=11000 rpcport=11001 -B1ARGS="-datadir=$D1" -$BITCOIND $B1ARGS & -B1PID=$! - -D2=${D}/node2 -CreateDataDir "$D2" port=11010 rpcport=11011 connect=127.0.0.1:11000 -B2ARGS="-datadir=$D2" -$BITCOIND $B2ARGS & -B2PID=$! - -D3=${D}/node3 -CreateDataDir "$D3" port=11020 rpcport=11021 connect=127.0.0.1:11000 -B3ARGS="-datadir=$D3" -$BITCOIND $BITCOINDARGS $B3ARGS & -B3PID=$! - -# Wait until all three nodes are at the same block number -function WaitBlocks { - while : - do - sleep 1 - declare -i BLOCKS1=$( GetBlocks $B1ARGS ) - declare -i BLOCKS2=$( GetBlocks $B2ARGS ) - declare -i BLOCKS3=$( GetBlocks $B3ARGS ) - if (( BLOCKS1 == BLOCKS2 && BLOCKS2 == BLOCKS3 )) - then - break - fi - done -} - -echo "Generating test blockchain..." - -# 1 block, 50 XBT each == 50 XBT -$CLI $B1ARGS setgenerate true 1 -WaitBlocks -# 101 blocks, 1 mature == 50 XBT -$CLI $B2ARGS setgenerate true 101 -WaitBlocks - -CheckBalance "$B1ARGS" 50 -CheckBalance "$B2ARGS" 50 - -# Send 21 XBT from 1 to 3. Second -# transaction will be child of first, and -# will require a fee -Send $B1ARGS $B3ARGS 11 -Send $B1ARGS $B3ARGS 10 - -# Have B1 mine a new block, and mature it -# to recover transaction fees -$CLI $B1ARGS setgenerate true 1 -WaitBlocks - -# Have B2 mine 100 blocks so B1's block is mature: -$CLI $B2ARGS setgenerate true 100 -WaitBlocks - -# B1 should end up with 100 XBT in block rewards plus fees, -# minus the 21 XBT sent to B3: -CheckBalance "$B1ARGS" "100-21" -CheckBalance "$B3ARGS" "21" - -# B1 should have two unspent outputs; create a couple -# of raw transactions to send them to B3, submit them through -# B2, and make sure both B1 and B3 pick them up properly: -RAW1=$(CreateTxn1 $B1ARGS 1 $(Address $B3ARGS "from1" ) ) -RAW2=$(CreateTxn1 $B1ARGS 2 $(Address $B3ARGS "from1" ) ) -RAWTXID1=$(SendRawTxn "$B2ARGS" $RAW1) -RAWTXID2=$(SendRawTxn "$B2ARGS" $RAW2) - -# Have B2 mine a block to confirm transactions: -$CLI $B2ARGS setgenerate true 1 -WaitBlocks - -# Check balances after confirmation -CheckBalance "$B1ARGS" 0 -CheckBalance "$B3ARGS" 100 -CheckBalance "$B3ARGS" "100-21" "from1" - -$CLI $B3ARGS stop > /dev/null 2>&1 -wait $B3PID -$CLI $B2ARGS stop > /dev/null 2>&1 -wait $B2PID -$CLI $B1ARGS stop > /dev/null 2>&1 -wait $B1PID - -echo "Tests successful, cleaning up" -rm -rf $D -exit 0 diff --git a/qa/rpc-tests/walletbackup.sh b/qa/rpc-tests/walletbackup.sh index ee11418bef..4af3d97f35 100755 --- a/qa/rpc-tests/walletbackup.sh +++ b/qa/rpc-tests/walletbackup.sh @@ -36,11 +36,12 @@ if [ $# -lt 1 ]; then echo "Usage: $0 path_to_binaries" echo "e.g. $0 ../../src" + echo "Env vars BITCOIND and BITCOINCLI may be used to specify the exact binaries used" exit 1 fi -BITCOIND=${1}/bitcoind -CLI=${1}/bitcoin-cli +BITCOIND=${BITCOIND:-${1}/bitcoind} +CLI=${BITCOINCLI:-${1}/bitcoin-cli} DIR="${BASH_SOURCE%/*}" SENDANDWAIT="${DIR}/send.sh" diff --git a/qa/rpc-tests/zapwallettxes.sh b/qa/rpc-tests/zapwallettxes.sh index e6d490cccc..4312d84e94 100755 --- a/qa/rpc-tests/zapwallettxes.sh +++ b/qa/rpc-tests/zapwallettxes.sh @@ -8,13 +8,14 @@ if [ $# -lt 1 ]; then echo "Usage: $0 path_to_binaries" echo "e.g. $0 ../../src" + echo "Env vars BITCOIND and BITCOINCLI may be used to specify the exact binaries used" exit 1 fi set -f -BITCOIND=${1}/bitcoind -CLI=${1}/bitcoin-cli +BITCOIND=${BITCOIND:-${1}/bitcoind} +CLI=${BITCOINCLI:-${1}/bitcoin-cli} DIR="${BASH_SOURCE%/*}" SENDANDWAIT="${DIR}/send.sh" diff --git a/share/genbuild.sh b/share/genbuild.sh index 679566e596..ffa89ca6e4 100755 --- a/share/genbuild.sh +++ b/share/genbuild.sh @@ -16,7 +16,7 @@ fi DESC="" SUFFIX="" LAST_COMMIT_DATE="" -if [ -e "$(which git 2>/dev/null)" -a $(git rev-parse --is-inside-work-tree 2>/dev/null) = "true" ]; then +if [ -e "$(which git 2>/dev/null)" -a "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then # clean 'dirty' status of touched files that haven't been modified git diff >/dev/null 2>/dev/null diff --git a/share/seeds/generate-seeds.py b/share/seeds/generate-seeds.py index 6c1b4ed860..cdd6831218 100755 --- a/share/seeds/generate-seeds.py +++ b/share/seeds/generate-seeds.py @@ -1,6 +1,6 @@ #!/usr/bin/python # Copyright (c) 2014 Wladmir J. van der Laan -# Distributed under the MIT/X11 software license, see the accompanying +# Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. ''' Script to generate list of seed nodes for chainparams.cpp. @@ -114,18 +114,21 @@ def main(): exit(1) g = sys.stdout indir = sys.argv[1] - g.write('#ifndef H_CHAINPARAMSSEEDS\n') - g.write('#define H_CHAINPARAMSSEEDS\n') - g.write('// List of fixed seed nodes for the bitcoin network\n') - g.write('// AUTOGENERATED by contrib/devtools/generate-seeds.py\n\n') - g.write('// Each line contains a 16-byte IPv6 address and a port.\n') - g.write('// IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.\n') + g.write('#ifndef BITCOIN_CHAINPARAMSSEEDS_H\n') + g.write('#define BITCOIN_CHAINPARAMSSEEDS_H\n') + g.write('/**\n') + g.write(' * List of fixed seed nodes for the bitcoin network\n') + g.write(' * AUTOGENERATED by share/seeds/generate-seeds.py\n') + g.write(' *\n') + g.write(' * Each line contains a 16-byte IPv6 address and a port.\n') + g.write(' * IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.\n') + g.write(' */\n') with open(os.path.join(indir,'nodes_main.txt'),'r') as f: process_nodes(g, f, 'pnSeed6_main', 8333) g.write('\n') with open(os.path.join(indir,'nodes_test.txt'),'r') as f: process_nodes(g, f, 'pnSeed6_test', 18333) - g.write('#endif\n') + g.write('#endif // BITCOIN_CHAINPARAMSSEEDS_H\n') if __name__ == '__main__': main() diff --git a/src/Makefile.am b/src/Makefile.am index 91cc1b96e7..3ec9e2f85d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,9 +1,6 @@ +DIST_SUBDIRS = secp256k1 AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) -if USE_LIBSECP256K1 -secp256k1/libsecp256k1.la: $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) - @$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) -endif if EMBEDDED_LEVELDB LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include @@ -23,9 +20,7 @@ endif BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) -if USE_LIBSECP256K1 BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include -endif LIBBITCOIN_SERVER=libbitcoin_server.a LIBBITCOIN_WALLET=libbitcoin_wallet.a @@ -35,6 +30,10 @@ LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a LIBBITCOIN_UNIVALUE=univalue/libbitcoin_univalue.a LIBBITCOINQT=qt/libbitcoinqt.a +LIBSECP256K1=secp256k1/libsecp256k1.la + +$(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) + $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) # Make is not made aware of per-object dependencies to avoid limiting building parallelization # But to build the less dependent modules first, we manually select their order here: @@ -50,6 +49,13 @@ BITCOIN_INCLUDES += $(BDB_CPPFLAGS) noinst_LIBRARIES += libbitcoin_wallet.a endif +if BUILD_BITCOIN_LIBS +lib_LTLIBRARIES = libbitcoinconsensus.la +LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la +else +LIBBITCOIN_CONSENSUS= +endif + bin_PROGRAMS = TESTS = @@ -86,6 +92,7 @@ BITCOIN_CORE_H = \ core_io.h \ crypter.h \ db.h \ + eccryptoverify.h \ ecwrapper.h \ hash.h \ init.h \ @@ -101,6 +108,7 @@ BITCOIN_CORE_H = \ noui.h \ pow.h \ protocol.h \ + pubkey.h \ random.h \ rpcclient.h \ rpcprotocol.h \ @@ -110,6 +118,7 @@ BITCOIN_CORE_H = \ script/sigcache.h \ script/sign.h \ script/standard.h \ + script/script_error.h \ serialize.h \ streams.h \ sync.h \ @@ -146,7 +155,7 @@ obj/build.h: FORCE @$(MKDIR_P) $(builddir)/obj @$(top_srcdir)/share/genbuild.sh $(abs_top_builddir)/src/obj/build.h \ $(abs_top_srcdir) -libbitcoin_util_a-version.$(OBJEXT): obj/build.h +libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h # server: shared between bitcoind and bitcoin-qt libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(MINIUPNPC_CPPFLAGS) @@ -163,12 +172,14 @@ libbitcoin_server_a_SOURCES = \ net.cpp \ noui.cpp \ pow.cpp \ + rest.cpp \ rpcblockchain.cpp \ rpcmining.cpp \ rpcmisc.cpp \ rpcnet.cpp \ rpcrawtransaction.cpp \ rpcserver.cpp \ + script/sigcache.cpp \ timedata.cpp \ txdb.cpp \ txmempool.cpp \ @@ -220,17 +231,19 @@ libbitcoin_common_a_SOURCES = \ core/transaction.cpp \ core_read.cpp \ core_write.cpp \ + eccryptoverify.cpp \ ecwrapper.cpp \ hash.cpp \ key.cpp \ keystore.cpp \ netbase.cpp \ protocol.cpp \ + pubkey.cpp \ script/interpreter.cpp \ script/script.cpp \ - script/sigcache.cpp \ script/sign.cpp \ script/standard.cpp \ + script/script_error.cpp \ $(BITCOIN_CORE_H) # util: shared between all executables. @@ -238,9 +251,11 @@ libbitcoin_common_a_SOURCES = \ # backward-compatibility objects and their sanity checks are linked. libbitcoin_util_a_CPPFLAGS = $(BITCOIN_INCLUDES) libbitcoin_util_a_SOURCES = \ + compat/strnlen.cpp \ compat/glibc_sanity.cpp \ compat/glibcxx_sanity.cpp \ chainparamsbase.cpp \ + clientversion.cpp \ random.cpp \ rpcprotocol.cpp \ sync.cpp \ @@ -249,7 +264,6 @@ libbitcoin_util_a_SOURCES = \ utilstrencodings.cpp \ utilmoneystr.cpp \ utiltime.cpp \ - version.cpp \ $(BITCOIN_CORE_H) if GLIBC_BACK_COMPAT @@ -274,11 +288,8 @@ bitcoind_LDADD = \ $(LIBBITCOIN_UTIL) \ $(LIBBITCOIN_CRYPTO) \ $(LIBLEVELDB) \ - $(LIBMEMENV) - -if USE_LIBSECP256K1 - bitcoind_LDADD += secp256k1/libsecp256k1.la -endif + $(LIBMEMENV) \ + $(LIBSECP256K1) if ENABLE_WALLET bitcoind_LDADD += libbitcoin_wallet.a @@ -292,25 +303,19 @@ endif bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES) -bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) +bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) # bitcoin-cli binary # bitcoin_cli_LDADD = \ $(LIBBITCOIN_CLI) \ - $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_UTIL) \ - $(LIBBITCOIN_CRYPTO) \ $(BOOST_LIBS) \ $(SSL_LIBS) \ - $(CRYPTO_LIBS) \ - $(MINIUPNPC_LIBS) + $(CRYPTO_LIBS) bitcoin_cli_SOURCES = \ bitcoin-cli.cpp -if USE_LIBSECP256K1 - bitcoin_cli_LDADD += secp256k1/libsecp256k1.la -endif bitcoin_cli_CPPFLAGS = $(BITCOIN_INCLUDES) # @@ -319,42 +324,66 @@ bitcoin_tx_LDADD = \ $(LIBBITCOIN_UNIVALUE) \ $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_UTIL) \ - $(LIBBITCOIN_CRYPTO) - -if USE_LIBSECP256K1 - bitcoin_tx_LDADD += secp256k1/libsecp256k1.la -endif - - bitcoin_tx_LDADD += $(BOOST_LIBS) \ - $(SSL_LIBS) \ - $(CRYPTO_LIBS) \ - $(MINIUPNPC_LIBS) + $(LIBBITCOIN_CRYPTO) \ + $(LIBSECP256K1) \ + $(BOOST_LIBS) \ + $(CRYPTO_LIBS) bitcoin_tx_SOURCES = bitcoin-tx.cpp bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES) # -bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) +bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) if TARGET_WINDOWS bitcoin_cli_SOURCES += bitcoin-cli-res.rc endif -bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) +bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) + +if BUILD_BITCOIN_LIBS +include_HEADERS = script/bitcoinconsensus.h +libbitcoinconsensus_la_SOURCES = \ + core/transaction.cpp \ + crypto/sha1.cpp \ + crypto/sha2.cpp \ + crypto/ripemd160.cpp \ + eccryptoverify.cpp \ + ecwrapper.cpp \ + hash.cpp \ + pubkey.cpp \ + script/script.cpp \ + script/interpreter.cpp \ + script/bitcoinconsensus.cpp \ + uint256.cpp \ + utilstrencodings.cpp + +if GLIBC_BACK_COMPAT + libbitcoinconsensus_la_SOURCES += compat/glibc_compat.cpp + libbitcoinconsensus_la_SOURCES += compat/glibcxx_compat.cpp +endif + +libbitcoinconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) +libbitcoinconsensus_la_LIBADD = $(CRYPTO_LIBS) +libbitcoinconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL +if USE_LIBSECP256K1 +libbitcoinconsensus_la_LIBADD += secp256k1/libsecp256k1.la +endif +endif CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno DISTCLEANFILES = obj/build.h -EXTRA_DIST = leveldb secp256k1 +EXTRA_DIST = leveldb clean-local: -$(MAKE) -C leveldb clean - -$(MAKE) -C secp256k1 clean 2>/dev/null + -$(MAKE) -C secp256k1 clean rm -f leveldb/*/*.gcno leveldb/helpers/memenv/*.gcno -rm -f config.h .rc.o: @test -f $(WINDRES) - $(AM_V_GEN) $(WINDRES) -i $< -o $@ + $(AM_V_GEN) $(WINDRES) -DWINDRES_PREPROC -i $< -o $@ .mm.o: $(AM_V_CXX) $(OBJCXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index ac6d60df03..898337ad6f 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -360,11 +360,8 @@ if ENABLE_WALLET qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ - $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) -if USE_LIBSECP256K1 - qt_bitcoin_qt_LDADD += secp256k1/libsecp256k1.la -endif -qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) + $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) +qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) qt_bitcoin_qt_LIBTOOLFLAGS = --tag CXX #locale/foo.ts -> locale/foo.qm diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include index 064b531b93..c5392cf307 100644 --- a/src/Makefile.qttest.include +++ b/src/Makefile.qttest.include @@ -32,11 +32,8 @@ qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) \ $(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \ - $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) -if USE_LIBSECP256K1 - qt_test_test_bitcoin_qt_LDADD += secp256k1/libsecp256k1.la -endif -qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) + $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) +qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 340eb9f1a7..9e9f478d8f 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -42,8 +42,8 @@ BITCOIN_TESTS =\ test/bloom_tests.cpp \ test/checkblock_tests.cpp \ test/Checkpoints_tests.cpp \ - test/compress_tests.cpp \ test/coins_tests.cpp \ + test/compress_tests.cpp \ test/crypto_tests.cpp \ test/DoS_tests.cpp \ test/getarg_tests.cpp \ @@ -58,7 +58,9 @@ BITCOIN_TESTS =\ test/rpc_tests.cpp \ test/script_P2SH_tests.cpp \ test/script_tests.cpp \ + test/scriptnum_tests.cpp \ test/serialize_tests.cpp \ + test/sighash_tests.cpp \ test/sigopcount_tests.cpp \ test/skiplist_tests.cpp \ test/test_bitcoin.cpp \ @@ -66,9 +68,7 @@ BITCOIN_TESTS =\ test/transaction_tests.cpp \ test/uint256_tests.cpp \ test/univalue_tests.cpp \ - test/util_tests.cpp \ - test/scriptnum_tests.cpp \ - test/sighash_tests.cpp + test/util_tests.cpp if ENABLE_WALLET BITCOIN_TESTS += \ @@ -80,17 +80,13 @@ endif test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES) test_test_bitcoin_CPPFLAGS = $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ - $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) + $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) if ENABLE_WALLET test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) endif -if USE_LIBSECP256K1 - test_test_bitcoin_LDADD += secp256k1/libsecp256k1.la -endif - -test_test_bitcoin_LDADD += $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) -test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) +test_test_bitcoin_LDADD += $(LIBBITCOIN_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) +test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES) @@ -108,6 +104,9 @@ bitcoin_test_check: $(TEST_BINARY) FORCE bitcoin_test_clean : FORCE rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY) +check-local: + $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C secp256k1 check + %.json.h: %.json @$(MKDIR_P) $(@D) @echo "namespace json_tests{" > $@ diff --git a/src/addrman.h b/src/addrman.h index 914086fc76..d47217683c 100644 --- a/src/addrman.h +++ b/src/addrman.h @@ -2,8 +2,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef _BITCOIN_ADDRMAN -#define _BITCOIN_ADDRMAN +#ifndef BITCOIN_ADDRMAN_H +#define BITCOIN_ADDRMAN_H #include "netbase.h" #include "protocol.h" @@ -514,4 +514,4 @@ public: } }; -#endif // _BITCOIN_ADDRMAN +#endif // BITCOIN_ADDRMAN_H diff --git a/src/alert.cpp b/src/alert.cpp index d495849206..64399a4260 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -1,13 +1,14 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "alert.h" #include "chainparams.h" -#include "key.h" +#include "clientversion.h" #include "net.h" +#include "pubkey.h" #include "timedata.h" #include "ui_interface.h" #include "util.h" @@ -127,6 +128,9 @@ bool CAlert::RelayTo(CNode* pnode) const { if (!IsInEffect()) return false; + // don't relay to nodes which haven't sent their version message + if (pnode->nVersion == 0) + return false; // returns true if wasn't already contained in the set if (pnode->setKnown.insert(GetHash()).second) { diff --git a/src/alert.h b/src/alert.h index ba3235858d..96c203b557 100644 --- a/src/alert.h +++ b/src/alert.h @@ -3,8 +3,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef _BITCOINALERT_H_ -#define _BITCOINALERT_H_ +#ifndef BITCOIN_ALERT_H +#define BITCOIN_ALERT_H #include "serialize.h" #include "sync.h" @@ -110,4 +110,4 @@ public: static CAlert getAlertByHash(const uint256 &hash); }; -#endif // _BITCOINALERT_H_ +#endif // BITCOIN_ALERT_H diff --git a/src/base58.cpp b/src/base58.cpp index d94db2c51b..c594993ea0 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "base58.h" @@ -15,7 +15,7 @@ #include <boost/variant/apply_visitor.hpp> #include <boost/variant/static_visitor.hpp> -/* All alphanumeric characters except for "0", "I", "O", and "l" */ +/** All alphanumeric characters except for "0", "I", "O", and "l" */ static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch) diff --git a/src/base58.h b/src/base58.h index c5e230c72e..c4cb96814c 100644 --- a/src/base58.h +++ b/src/base58.h @@ -1,21 +1,22 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -// -// Why base-58 instead of standard base-64 encoding? -// - Don't want 0OIl characters that look the same in some fonts and -// could be used to create visually identical looking account numbers. -// - A string with non-alphanumeric characters is not as easily accepted as an account number. -// - E-mail usually won't line-break if there's no punctuation to break at. -// - Double-clicking selects the whole number as one word if it's all alphanumeric. -// +/** + * Why base-58 instead of standard base-64 encoding? + * - Don't want 0OIl characters that look the same in some fonts and + * could be used to create visually identical looking account numbers. + * - A string with non-alphanumeric characters is not as easily accepted as an account number. + * - E-mail usually won't line-break if there's no punctuation to break at. + * - Double-clicking selects the whole number as one word if it's all alphanumeric. + */ #ifndef BITCOIN_BASE58_H #define BITCOIN_BASE58_H #include "chainparams.h" #include "key.h" +#include "pubkey.h" #include "script/script.h" #include "script/standard.h" @@ -69,10 +70,10 @@ inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char> class CBase58Data { protected: - // the version byte(s) + //! the version byte(s) std::vector<unsigned char> vchVersion; - // the actually encoded data + //! the actually encoded data typedef std::vector<unsigned char, zero_after_free_allocator<unsigned char> > vector_uchar; vector_uchar vchData; diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index aa5e285b10..1b638e99e9 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -4,12 +4,11 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "chainparamsbase.h" -#include "init.h" +#include "clientversion.h" #include "rpcclient.h" #include "rpcprotocol.h" #include "util.h" #include "utilstrencodings.h" -#include "version.h" #include <boost/filesystem/operations.hpp> @@ -46,12 +45,41 @@ std::string HelpMessageCli() // // Start // + +// +// Exception thrown on connection error. This error is used to determine +// when to wait if -rpcwait is given. +// +class CConnectionFailed : public std::runtime_error +{ +public: + + explicit inline CConnectionFailed(const std::string& msg) : + std::runtime_error(msg) + {} + +}; + static bool AppInitRPC(int argc, char* argv[]) { // // Parameters // ParseParameters(argc, argv); + if (argc<2 || mapArgs.count("-?") || mapArgs.count("-help") || mapArgs.count("-version")) { + std::string strUsage = _("Bitcoin Core RPC client version") + " " + FormatFullVersion() + "\n"; + if (!mapArgs.count("-version")) { + strUsage += "\n" + _("Usage:") + "\n" + + " bitcoin-cli [options] <command> [params] " + _("Send command to Bitcoin Core") + "\n" + + " bitcoin-cli [options] help " + _("List commands") + "\n" + + " bitcoin-cli [options] help <command> " + _("Get help for a command") + "\n"; + + strUsage += "\n" + HelpMessageCli(); + } + + fprintf(stdout, "%s", strUsage.c_str()); + return false; + } if (!boost::filesystem::is_directory(GetDataDir(false))) { fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", mapArgs["-datadir"].c_str()); return false; @@ -67,20 +95,6 @@ static bool AppInitRPC(int argc, char* argv[]) fprintf(stderr, "Error: Invalid combination of -regtest and -testnet.\n"); return false; } - if (argc<2 || mapArgs.count("-?") || mapArgs.count("-help") || mapArgs.count("-version")) { - std::string strUsage = _("Bitcoin Core RPC client version") + " " + FormatFullVersion() + "\n"; - if (!mapArgs.count("-version")) { - strUsage += "\n" + _("Usage:") + "\n" + - " bitcoin-cli [options] <command> [params] " + _("Send command to Bitcoin Core") + "\n" + - " bitcoin-cli [options] help " + _("List commands") + "\n" + - " bitcoin-cli [options] help <command> " + _("Get help for a command") + "\n"; - - strUsage += "\n" + HelpMessageCli(); - } - - fprintf(stdout, "%s", strUsage.c_str()); - return false; - } return true; } @@ -101,15 +115,9 @@ Object CallRPC(const string& strMethod, const Array& params) SSLIOStreamDevice<asio::ip::tcp> d(sslStream, fUseSSL); iostreams::stream< SSLIOStreamDevice<asio::ip::tcp> > stream(d); - bool fWait = GetBoolArg("-rpcwait", false); // -rpcwait means try until server has started - do { - bool fConnected = d.connect(GetArg("-rpcconnect", "127.0.0.1"), GetArg("-rpcport", itostr(BaseParams().RPCPort()))); - if (fConnected) break; - if (fWait) - MilliSleep(1000); - else - throw runtime_error("couldn't connect to server"); - } while (fWait); + const bool fConnected = d.connect(GetArg("-rpcconnect", "127.0.0.1"), GetArg("-rpcport", itostr(BaseParams().RPCPort()))); + if (!fConnected) + throw CConnectionFailed("couldn't connect to server"); // HTTP basic authentication string strUserPass64 = EncodeBase64(mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]); @@ -168,27 +176,43 @@ int CommandLineRPC(int argc, char *argv[]) std::vector<std::string> strParams(&argv[2], &argv[argc]); Array params = RPCConvertValues(strMethod, strParams); - // Execute - Object reply = CallRPC(strMethod, params); - - // Parse reply - const Value& result = find_value(reply, "result"); - const Value& error = find_value(reply, "error"); - - if (error.type() != null_type) { - // Error - strPrint = "error: " + write_string(error, false); - int code = find_value(error.get_obj(), "code").get_int(); - nRet = abs(code); - } else { - // Result - if (result.type() == null_type) - strPrint = ""; - else if (result.type() == str_type) - strPrint = result.get_str(); - else - strPrint = write_string(result, true); - } + // Execute and handle connection failures with -rpcwait + const bool fWait = GetBoolArg("-rpcwait", false); + do { + try { + const Object reply = CallRPC(strMethod, params); + + // Parse reply + const Value& result = find_value(reply, "result"); + const Value& error = find_value(reply, "error"); + + if (error.type() != null_type) { + // Error + const int code = find_value(error.get_obj(), "code").get_int(); + if (fWait && code == RPC_IN_WARMUP) + throw CConnectionFailed("server in warmup"); + strPrint = "error: " + write_string(error, false); + nRet = abs(code); + } else { + // Result + if (result.type() == null_type) + strPrint = ""; + else if (result.type() == str_type) + strPrint = result.get_str(); + else + strPrint = write_string(result, true); + } + + // Connection succeeded, no need to retry. + break; + } + catch (const CConnectionFailed& e) { + if (fWait) + MilliSleep(1000); + else + throw; + } + } while (fWait); } catch (boost::thread_interrupted) { throw; diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 6f3409edf3..c0d21ed36f 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -3,6 +3,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "base58.h" +#include "clientversion.h" #include "core/transaction.h" #include "core_io.h" #include "keystore.h" diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index 0737b5a83d..be7757b0b6 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -3,6 +3,7 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "clientversion.h" #include "rpcserver.h" #include "init.h" #include "main.h" @@ -58,13 +59,36 @@ bool AppInit(int argc, char* argv[]) boost::thread* detectShutdownThread = NULL; bool fRet = false; + + // + // Parameters + // + // If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main() + ParseParameters(argc, argv); + + // Process help and version before taking care about datadir + if (mapArgs.count("-?") || mapArgs.count("-help") || mapArgs.count("-version")) + { + std::string strUsage = _("Bitcoin Core Daemon") + " " + _("version") + " " + FormatFullVersion() + "\n"; + + if (mapArgs.count("-version")) + { + strUsage += LicenseInfo(); + } + else + { + strUsage += "\n" + _("Usage:") + "\n" + + " bitcoind [options] " + _("Start Bitcoin Core Daemon") + "\n"; + + strUsage += "\n" + HelpMessage(HMM_BITCOIND); + } + + fprintf(stdout, "%s", strUsage.c_str()); + return false; + } + try { - // - // Parameters - // - // If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main() - ParseParameters(argc, argv); if (!boost::filesystem::is_directory(GetDataDir(false))) { fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", mapArgs["-datadir"].c_str()); @@ -83,26 +107,6 @@ bool AppInit(int argc, char* argv[]) return false; } - if (mapArgs.count("-?") || mapArgs.count("-help") || mapArgs.count("-version")) - { - std::string strUsage = _("Bitcoin Core Daemon") + " " + _("version") + " " + FormatFullVersion() + "\n"; - - if (mapArgs.count("-version")) - { - strUsage += LicenseInfo(); - } - else - { - strUsage += "\n" + _("Usage:") + "\n" + - " bitcoind [options] " + _("Start Bitcoin Core Daemon") + "\n"; - - strUsage += "\n" + HelpMessage(HMM_BITCOIND); - } - - fprintf(stdout, "%s", strUsage.c_str()); - return false; - } - // Command-line RPC bool fCommandLine = false; for (int i = 1; i < argc; i++) diff --git a/src/bloom.cpp b/src/bloom.cpp index c1e7aeb3bf..07b8f2c0ae 100644 --- a/src/bloom.cpp +++ b/src/bloom.cpp @@ -1,10 +1,11 @@ -// Copyright (c) 2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "bloom.h" #include "core/transaction.h" +#include "hash.h" #include "script/script.h" #include "script/standard.h" #include "streams.h" @@ -20,13 +21,17 @@ using namespace std; CBloomFilter::CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweakIn, unsigned char nFlagsIn) : -// The ideal size for a bloom filter with a given number of elements and false positive rate is: -// - nElements * log(fp rate) / ln(2)^2 -// We ignore filter parameters which will create a bloom filter larger than the protocol limits +/** + * The ideal size for a bloom filter with a given number of elements and false positive rate is: + * - nElements * log(fp rate) / ln(2)^2 + * We ignore filter parameters which will create a bloom filter larger than the protocol limits + */ vData(min((unsigned int)(-1 / LN2SQUARED * nElements * log(nFPRate)), MAX_BLOOM_FILTER_SIZE * 8) / 8), -// The ideal number of hash functions is filter size * ln(2) / number of elements -// Again, we ignore filter parameters which will create a bloom filter with more hash functions than the protocol limits -// See http://en.wikipedia.org/wiki/Bloom_filter for an explanation of these formulas +/** + * The ideal number of hash functions is filter size * ln(2) / number of elements + * Again, we ignore filter parameters which will create a bloom filter with more hash functions than the protocol limits + * See https://en.wikipedia.org/wiki/Bloom_filter for an explanation of these formulas + */ isFull(false), isEmpty(false), nHashFuncs(min((unsigned int)(vData.size() * 8 / nElements * LN2), MAX_HASH_FUNCS)), diff --git a/src/bloom.h b/src/bloom.h index 143e3b4c79..f54922edb9 100644 --- a/src/bloom.h +++ b/src/bloom.h @@ -1,5 +1,5 @@ -// Copyright (c) 2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_BLOOM_H @@ -13,12 +13,14 @@ class COutPoint; class CTransaction; class uint256; -// 20,000 items with fp rate < 0.1% or 10,000 items and <0.0001% +//! 20,000 items with fp rate < 0.1% or 10,000 items and <0.0001% static const unsigned int MAX_BLOOM_FILTER_SIZE = 36000; // bytes static const unsigned int MAX_HASH_FUNCS = 50; -// First two bits of nFlags control how much IsRelevantAndUpdate actually updates -// The remaining bits are reserved +/** + * First two bits of nFlags control how much IsRelevantAndUpdate actually updates + * The remaining bits are reserved + */ enum bloomflags { BLOOM_UPDATE_NONE = 0, @@ -52,13 +54,15 @@ private: unsigned int Hash(unsigned int nHashNum, const std::vector<unsigned char>& vDataToHash) const; public: - // Creates a new bloom filter which will provide the given fp rate when filled with the given number of elements - // Note that if the given parameters will result in a filter outside the bounds of the protocol limits, - // the filter created will be as close to the given parameters as possible within the protocol limits. - // This will apply if nFPRate is very low or nElements is unreasonably high. - // nTweak is a constant which is added to the seed value passed to the hash function - // It should generally always be a random value (and is largely only exposed for unit testing) - // nFlags should be one of the BLOOM_UPDATE_* enums (not _MASK) + /** + * Creates a new bloom filter which will provide the given fp rate when filled with the given number of elements + * Note that if the given parameters will result in a filter outside the bounds of the protocol limits, + * the filter created will be as close to the given parameters as possible within the protocol limits. + * This will apply if nFPRate is very low or nElements is unreasonably high. + * nTweak is a constant which is added to the seed value passed to the hash function + * It should generally always be a random value (and is largely only exposed for unit testing) + * nFlags should be one of the BLOOM_UPDATE_* enums (not _MASK) + */ CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweak, unsigned char nFlagsIn); CBloomFilter() : isFull(true), isEmpty(false), nHashFuncs(0), nTweak(0), nFlags(0) {} @@ -82,14 +86,14 @@ public: void clear(); - // True if the size is <= MAX_BLOOM_FILTER_SIZE and the number of hash functions is <= MAX_HASH_FUNCS - // (catch a filter which was just deserialized which was too big) + //! True if the size is <= MAX_BLOOM_FILTER_SIZE and the number of hash functions is <= MAX_HASH_FUNCS + //! (catch a filter which was just deserialized which was too big) bool IsWithinSizeConstraints() const; - // Also adds any outputs which match the filter to the filter (to match their spending txes) + //! Also adds any outputs which match the filter to the filter (to match their spending txes) bool IsRelevantAndUpdate(const CTransaction& tx); - // Checks for empty and full filters to avoid wasting cpu + //! Checks for empty and full filters to avoid wasting cpu void UpdateEmptyFull(); }; diff --git a/src/chain.cpp b/src/chain.cpp index 56ed22ce71..e13c047861 100644 --- a/src/chain.cpp +++ b/src/chain.cpp @@ -7,8 +7,9 @@ using namespace std; -// CChain implementation - +/** + * CChain implementation + */ void CChain::SetTip(CBlockIndex *pindex) { if (pindex == NULL) { vChain.clear(); diff --git a/src/chain.h b/src/chain.h index 2a55771622..c01240665d 100644 --- a/src/chain.h +++ b/src/chain.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_CHAIN -#define H_BITCOIN_CHAIN +#ifndef BITCOIN_CHAIN_H +#define BITCOIN_CHAIN_H #include "core/block.h" #include "pow.h" @@ -50,38 +50,40 @@ struct CDiskBlockPos }; enum BlockStatus { - // Unused. + //! Unused. BLOCK_VALID_UNKNOWN = 0, - // Parsed, version ok, hash satisfies claimed PoW, 1 <= vtx count <= max, timestamp not in future + //! Parsed, version ok, hash satisfies claimed PoW, 1 <= vtx count <= max, timestamp not in future BLOCK_VALID_HEADER = 1, - // All parent headers found, difficulty matches, timestamp >= median previous, checkpoint. Implies all parents - // are also at least TREE. + //! All parent headers found, difficulty matches, timestamp >= median previous, checkpoint. Implies all parents + //! are also at least TREE. BLOCK_VALID_TREE = 2, - // Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid, no duplicate txids, - // sigops, size, merkle root. Implies all parents are at least TREE but not necessarily TRANSACTIONS. When all - // parent blocks also have TRANSACTIONS, CBlockIndex::nChainTx will be set. + /** + * Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid, no duplicate txids, + * sigops, size, merkle root. Implies all parents are at least TREE but not necessarily TRANSACTIONS. When all + * parent blocks also have TRANSACTIONS, CBlockIndex::nChainTx will be set. + */ BLOCK_VALID_TRANSACTIONS = 3, - // Outputs do not overspend inputs, no double spends, coinbase output ok, immature coinbase spends, BIP30. - // Implies all parents are also at least CHAIN. + //! Outputs do not overspend inputs, no double spends, coinbase output ok, immature coinbase spends, BIP30. + //! Implies all parents are also at least CHAIN. BLOCK_VALID_CHAIN = 4, - // Scripts & signatures ok. Implies all parents are also at least SCRIPTS. + //! Scripts & signatures ok. Implies all parents are also at least SCRIPTS. BLOCK_VALID_SCRIPTS = 5, - // All validity bits. + //! All validity bits. BLOCK_VALID_MASK = BLOCK_VALID_HEADER | BLOCK_VALID_TREE | BLOCK_VALID_TRANSACTIONS | BLOCK_VALID_CHAIN | BLOCK_VALID_SCRIPTS, - BLOCK_HAVE_DATA = 8, // full block available in blk*.dat - BLOCK_HAVE_UNDO = 16, // undo data available in rev*.dat + BLOCK_HAVE_DATA = 8, //! full block available in blk*.dat + BLOCK_HAVE_UNDO = 16, //! undo data available in rev*.dat BLOCK_HAVE_MASK = BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO, - BLOCK_FAILED_VALID = 32, // stage after last reached validness failed - BLOCK_FAILED_CHILD = 64, // descends from failed block + BLOCK_FAILED_VALID = 32, //! stage after last reached validness failed + BLOCK_FAILED_CHILD = 64, //! descends from failed block BLOCK_FAILED_MASK = BLOCK_FAILED_VALID | BLOCK_FAILED_CHILD, }; @@ -93,49 +95,50 @@ enum BlockStatus { class CBlockIndex { public: - // pointer to the hash of the block, if any. memory is owned by this CBlockIndex + //! pointer to the hash of the block, if any. memory is owned by this CBlockIndex const uint256* phashBlock; - // pointer to the index of the predecessor of this block + //! pointer to the index of the predecessor of this block CBlockIndex* pprev; - // pointer to the index of some further predecessor of this block + //! pointer to the index of some further predecessor of this block CBlockIndex* pskip; - // height of the entry in the chain. The genesis block has height 0 + //! height of the entry in the chain. The genesis block has height 0 int nHeight; - // Which # file this block is stored in (blk?????.dat) + //! Which # file this block is stored in (blk?????.dat) int nFile; - // Byte offset within blk?????.dat where this block's data is stored + //! Byte offset within blk?????.dat where this block's data is stored unsigned int nDataPos; - // Byte offset within rev?????.dat where this block's undo data is stored + //! Byte offset within rev?????.dat where this block's undo data is stored unsigned int nUndoPos; - // (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block + //! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block uint256 nChainWork; - // Number of transactions in this block. - // Note: in a potential headers-first mode, this number cannot be relied upon + //! Number of transactions in this block. + //! Note: in a potential headers-first mode, this number cannot be relied upon unsigned int nTx; - // (memory only) Number of transactions in the chain up to and including this block. - // This value will be non-zero only if and only if transactions for this block and all its parents are available. - unsigned int nChainTx; // change to 64-bit type when necessary; won't happen before 2030 + //! (memory only) Number of transactions in the chain up to and including this block. + //! This value will be non-zero only if and only if transactions for this block and all its parents are available. + //! Change to 64-bit type when necessary; won't happen before 2030 + unsigned int nChainTx; - // Verification status of this block. See enum BlockStatus + //! Verification status of this block. See enum BlockStatus unsigned int nStatus; - // block header + //! block header int nVersion; uint256 hashMerkleRoot; unsigned int nTime; unsigned int nBits; unsigned int nNonce; - // (memory only) Sequencial id assigned to distinguish order in which blocks are received. + //! (memory only) Sequential id assigned to distinguish order in which blocks are received. uint32_t nSequenceId; void SetNull() @@ -217,11 +220,6 @@ public: return (int64_t)nTime; } - uint256 GetBlockWork() const - { - return GetProofIncrement(nBits); - } - enum { nMedianTimeSpan=11 }; int64_t GetMedianTimePast() const @@ -254,7 +252,7 @@ public: GetBlockHash().ToString()); } - // Check whether this block index entry is valid up to the passed validity level. + //! Check whether this block index entry is valid up to the passed validity level. bool IsValid(enum BlockStatus nUpTo = BLOCK_VALID_TRANSACTIONS) const { assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed. @@ -263,8 +261,8 @@ public: return ((nStatus & BLOCK_VALID_MASK) >= nUpTo); } - // Raise the validity level of this block index entry. - // Returns true if the validity was changed. + //! Raise the validity level of this block index entry. + //! Returns true if the validity was changed. bool RaiseValidity(enum BlockStatus nUpTo) { assert(!(nUpTo & ~BLOCK_VALID_MASK)); // Only validity flags allowed. @@ -277,10 +275,10 @@ public: return false; } - // Build the skiplist pointer for this entry. + //! Build the skiplist pointer for this entry. void BuildSkip(); - // Efficiently find an ancestor of this block. + //! Efficiently find an ancestor of this block. CBlockIndex* GetAncestor(int height); const CBlockIndex* GetAncestor(int height) const; }; @@ -406,4 +404,4 @@ public: const CBlockIndex *FindFork(const CBlockIndex *pindex) const; }; -#endif // H_BITCOIN_CHAIN +#endif // BITCOIN_CHAIN_H diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 1ab292517a..8a6a061ea1 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "chainparams.h" @@ -23,11 +23,11 @@ struct SeedSpec6 { #include "chainparamsseeds.h" -// -// Main network -// +/** + * Main network + */ -// Convert the pnSeeds6 array into usable address objects. +//! Convert the pnSeeds6 array into usable address objects. static void convertSeed6(std::vector<CAddress> &vSeedsOut, const SeedSpec6 *data, unsigned int count) { // It'll only connect to one or two seed nodes because once it connects, @@ -45,11 +45,13 @@ static void convertSeed6(std::vector<CAddress> &vSeedsOut, const SeedSpec6 *data } } - // What makes a good checkpoint block? - // + Is surrounded by blocks with reasonable timestamps - // (no blocks before with a timestamp after, none after with - // timestamp before) - // + Contains no strange transactions +/** + * What makes a good checkpoint block? + * + Is surrounded by blocks with reasonable timestamps + * (no blocks before with a timestamp after, none after with + * timestamp before) + * + Contains no strange transactions + */ static Checkpoints::MapCheckpoints mapCheckpoints = boost::assign::map_list_of ( 11111, uint256("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")) @@ -101,9 +103,11 @@ public: CMainParams() { networkID = CBaseChainParams::MAIN; strNetworkID = "main"; - // The message start string is designed to be unlikely to occur in normal data. - // The characters are rarely used upper ASCII, not valid as UTF-8, and produce - // a large 4-byte int at any alignment. + /** + * The message start string is designed to be unlikely to occur in normal data. + * The characters are rarely used upper ASCII, not valid as UTF-8, and produce + * a large 4-byte int at any alignment. + */ pchMessageStart[0] = 0xf9; pchMessageStart[1] = 0xbe; pchMessageStart[2] = 0xb4; @@ -119,14 +123,16 @@ public: nTargetTimespan = 14 * 24 * 60 * 60; // two weeks nTargetSpacing = 10 * 60; - // Build the genesis block. Note that the output of the genesis coinbase cannot - // be spent as it did not originally exist in the database. - // - // CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1) - // CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0) - // CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73) - // CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B) - // vMerkleTree: 4a5e1e + /** + * Build the genesis block. Note that the output of the genesis coinbase cannot + * be spent as it did not originally exist in the database. + * + * CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1) + * CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0) + * CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73) + * CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B) + * vMerkleTree: 4a5e1e + */ const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; CMutableTransaction txNew; txNew.vin.resize(1); @@ -178,18 +184,14 @@ public: }; static CMainParams mainParams; -// -// Testnet (v3) -// - +/** + * Testnet (v3) + */ class CTestNetParams : public CMainParams { public: CTestNetParams() { networkID = CBaseChainParams::TESTNET; strNetworkID = "test"; - // The message start string is designed to be unlikely to occur in normal data. - // The characters are rarely used upper ASCII, not valid as UTF-8, and produce - // a large 4-byte int at any alignment. pchMessageStart[0] = 0x0b; pchMessageStart[1] = 0x11; pchMessageStart[2] = 0x09; @@ -200,10 +202,10 @@ public: nRejectBlockOutdatedMajority = 75; nToCheckBlockUpgradeMajority = 100; nMinerThreads = 0; - nTargetTimespan = 14 * 24 * 60 * 60; // two weeks + nTargetTimespan = 14 * 24 * 60 * 60; //! two weeks nTargetSpacing = 10 * 60; - // Modify the testnet genesis block so the timestamp is valid for a later start. + //! Modify the testnet genesis block so the timestamp is valid for a later start. genesis.nTime = 1296688602; genesis.nNonce = 414098458; hashGenesisBlock = genesis.GetHash(); @@ -239,9 +241,9 @@ public: }; static CTestNetParams testNetParams; -// -// Regression test -// +/** + * Regression test + */ class CRegTestParams : public CTestNetParams { public: CRegTestParams() { @@ -256,7 +258,7 @@ public: nRejectBlockOutdatedMajority = 950; nToCheckBlockUpgradeMajority = 1000; nMinerThreads = 1; - nTargetTimespan = 14 * 24 * 60 * 60; // two weeks + nTargetTimespan = 14 * 24 * 60 * 60; //! two weeks nTargetSpacing = 10 * 60; bnProofOfWorkLimit = ~uint256(0) >> 1; genesis.nTime = 1296688602; @@ -266,8 +268,8 @@ public: nDefaultPort = 18444; assert(hashGenesisBlock == uint256("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")); - vFixedSeeds.clear(); // Regtest mode doesn't have any fixed seeds. - vSeeds.clear(); // Regtest mode doesn't have any DNS seeds. + vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds. + vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds. fRequireRPCPassword = false; fMiningRequiresPeers = false; @@ -284,17 +286,17 @@ public: }; static CRegTestParams regTestParams; -// -// Unit test -// +/** + * Unit test + */ class CUnitTestParams : public CMainParams, public CModifiableParams { public: CUnitTestParams() { networkID = CBaseChainParams::UNITTEST; strNetworkID = "unittest"; nDefaultPort = 18445; - vFixedSeeds.clear(); - vSeeds.clear(); // Regtest mode doesn't have any DNS seeds. + vFixedSeeds.clear(); //! Unit test mode doesn't have any fixed seeds. + vSeeds.clear(); //! Unit test mode doesn't have any DNS seeds. fRequireRPCPassword = false; fMiningRequiresPeers = false; @@ -309,7 +311,7 @@ public: return data; } - // Published setters to allow changing values in unit test cases + //! Published setters to allow changing values in unit test cases virtual void setSubsidyHalvingInterval(int anSubsidyHalvingInterval) { nSubsidyHalvingInterval=anSubsidyHalvingInterval; } virtual void setEnforceBlockUpgradeMajority(int anEnforceBlockUpgradeMajority) { nEnforceBlockUpgradeMajority=anEnforceBlockUpgradeMajority; } virtual void setRejectBlockOutdatedMajority(int anRejectBlockOutdatedMajority) { nRejectBlockOutdatedMajority=anRejectBlockOutdatedMajority; } @@ -362,7 +364,6 @@ bool SelectParamsFromCommandLine() if (network == CBaseChainParams::MAX_NETWORK_TYPES) return false; - SelectBaseParams(network); SelectParams(network); return true; } diff --git a/src/chainparams.h b/src/chainparams.h index e27728dbd5..9f24b70a26 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -1,10 +1,10 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_CHAIN_PARAMS_H -#define BITCOIN_CHAIN_PARAMS_H +#ifndef BITCOIN_CHAINPARAMS_H +#define BITCOIN_CHAINPARAMS_H #include "chainparamsbase.h" #include "checkpoints.h" @@ -47,34 +47,33 @@ public: int GetDefaultPort() const { return nDefaultPort; } const uint256& ProofOfWorkLimit() const { return bnProofOfWorkLimit; } int SubsidyHalvingInterval() const { return nSubsidyHalvingInterval; } - /* Used to check majorities for block version upgrade */ + /** Used to check majorities for block version upgrade */ int EnforceBlockUpgradeMajority() const { return nEnforceBlockUpgradeMajority; } int RejectBlockOutdatedMajority() const { return nRejectBlockOutdatedMajority; } int ToCheckBlockUpgradeMajority() const { return nToCheckBlockUpgradeMajority; } - /* Used if GenerateBitcoins is called with a negative number of threads */ + /** Used if GenerateBitcoins is called with a negative number of threads */ int DefaultMinerThreads() const { return nMinerThreads; } const CBlock& GenesisBlock() const { return genesis; } bool RequireRPCPassword() const { return fRequireRPCPassword; } - /* Make miner wait to have peers to avoid wasting work */ + /** Make miner wait to have peers to avoid wasting work */ bool MiningRequiresPeers() const { return fMiningRequiresPeers; } - /* Default value for -checkmempool argument */ + /** Default value for -checkmempool argument */ bool DefaultCheckMemPool() const { return fDefaultCheckMemPool; } - /* Allow mining of a min-difficulty block */ + /** Allow mining of a min-difficulty block */ bool AllowMinDifficultyBlocks() const { return fAllowMinDifficultyBlocks; } - /* Skip proof-of-work check: allow mining of any difficulty block */ + /** Skip proof-of-work check: allow mining of any difficulty block */ bool SkipProofOfWorkCheck() const { return fSkipProofOfWorkCheck; } - /* Make standard checks */ + /** Make standard checks */ bool RequireStandard() const { return fRequireStandard; } int64_t TargetTimespan() const { return nTargetTimespan; } int64_t TargetSpacing() const { return nTargetSpacing; } int64_t Interval() const { return nTargetTimespan / nTargetSpacing; } - /* Make miner stop after a block is found. In RPC, don't return - * until nGenProcLimit blocks are generated */ + /** Make miner stop after a block is found. In RPC, don't return until nGenProcLimit blocks are generated */ bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; } - /* In the future use NetworkIDString() for RPC fields */ + /** In the future use NetworkIDString() for RPC fields */ bool TestnetToBeDeprecatedFieldRPC() const { return fTestnetToBeDeprecatedFieldRPC; } - /* Return the BIP70 network string (main, test or regtest) */ + /** Return the BIP70 network string (main, test or regtest) */ std::string NetworkIDString() const { return strNetworkID; } const std::vector<CDNSSeedData>& DNSSeeds() const { return vSeeds; } const std::vector<unsigned char>& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; } @@ -85,7 +84,7 @@ protected: uint256 hashGenesisBlock; MessageStartChars pchMessageStart; - // Raw pub key bytes for the broadcast alert signing key. + //! Raw pub key bytes for the broadcast alert signing key. std::vector<unsigned char> vAlertPubKey; int nDefaultPort; uint256 bnProofOfWorkLimit; @@ -112,14 +111,15 @@ protected: bool fTestnetToBeDeprecatedFieldRPC; }; -/** Modifiable parameters interface is used by test cases to adapt the parameters in order -*** to test specific features more easily. Test cases should always restore the previous -*** values after finalization. -**/ +/** + * Modifiable parameters interface is used by test cases to adapt the parameters in order + * to test specific features more easily. Test cases should always restore the previous + * values after finalization. + */ class CModifiableParams { public: - // Published setters to allow changing values in unit test cases + //! Published setters to allow changing values in unit test cases virtual void setSubsidyHalvingInterval(int anSubsidyHalvingInterval) =0; virtual void setEnforceBlockUpgradeMajority(int anEnforceBlockUpgradeMajority)=0; virtual void setRejectBlockOutdatedMajority(int anRejectBlockOutdatedMajority)=0; @@ -139,7 +139,7 @@ const CChainParams &Params(); /** Return parameters for the given network. */ CChainParams &Params(CBaseChainParams::Network network); -/** Get modifyable network parameters (UNITTEST only) */ +/** Get modifiable network parameters (UNITTEST only) */ CModifiableParams *ModifiableParams(); /** Sets the params returned by Params() to those for the given network. */ @@ -151,4 +151,4 @@ void SelectParams(CBaseChainParams::Network network); */ bool SelectParamsFromCommandLine(); -#endif // BITCOIN_CHAIN_PARAMS_H +#endif // BITCOIN_CHAINPARAMS_H diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index 5d9ec7927b..8646a31603 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "chainparamsbase.h" @@ -13,10 +13,9 @@ using namespace boost::assign; -// -// Main network -// - +/** + * Main network + */ class CBaseMainParams : public CBaseChainParams { public: @@ -28,9 +27,9 @@ public: }; static CBaseMainParams mainParams; -// -// Testnet (v3) -// +/** + * Testnet (v3) + */ class CBaseTestNetParams : public CBaseMainParams { public: @@ -43,9 +42,9 @@ public: }; static CBaseTestNetParams testNetParams; -// -// Regression test -// +/* + * Regression test + */ class CBaseRegTestParams : public CBaseTestNetParams { public: @@ -57,9 +56,9 @@ public: }; static CBaseRegTestParams regTestParams; -// -// Unit test -// +/* + * Unit test + */ class CBaseUnitTestParams : public CBaseMainParams { public: diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h index 911d1181ac..eaf3fea1b6 100644 --- a/src/chainparamsbase.h +++ b/src/chainparamsbase.h @@ -1,9 +1,9 @@ // Copyright (c) 2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_CHAIN_PARAMS_BASE_H -#define BITCOIN_CHAIN_PARAMS_BASE_H +#ifndef BITCOIN_CHAINPARAMSBASE_H +#define BITCOIN_CHAINPARAMSBASE_H #include <string> #include <vector> @@ -62,4 +62,4 @@ bool SelectBaseParamsFromCommandLine(); */ bool AreBaseParamsConfigured(); -#endif // BITCOIN_CHAIN_PARAMS_BASE_H +#endif // BITCOIN_CHAINPARAMSBASE_H diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h index 3f3278361e..575e129334 100644 --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.h @@ -1,10 +1,12 @@ -#ifndef H_CHAINPARAMSSEEDS -#define H_CHAINPARAMSSEEDS -// List of fixed seed nodes for the bitcoin network -// AUTOGENERATED by contrib/devtools/generate-seeds.py - -// Each line contains a 16-byte IPv6 address and a port. -// IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly. +#ifndef BITCOIN_CHAINPARAMSSEEDS_H +#define BITCOIN_CHAINPARAMSSEEDS_H +/** + * List of fixed seed nodes for the bitcoin network + * AUTOGENERATED by share/seeds/generate-seeds.py + * + * Each line contains a 16-byte IPv6 address and a port. + * IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly. + */ static SeedSpec6 pnSeed6_main[] = { {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x69,0x6a,0x7e}, 8333}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x04,0x7d}, 8333}, @@ -635,4 +637,4 @@ static SeedSpec6 pnSeed6_test[] = { {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x99,0xcb,0x26,0x31,0xba,0x48,0x51,0x31,0x39,0x0d}, 18333}, {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x44,0xf4,0xf4,0xf0,0xbf,0xf7,0x7e,0x6d,0xc4,0xe8}, 18333} }; -#endif +#endif // BITCOIN_CHAINPARAMSSEEDS_H diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index fbde47339d..0fb4411e63 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "checkpoints.h" @@ -14,11 +14,13 @@ namespace Checkpoints { - // How many times we expect transactions after the last checkpoint to - // be slower. This number is a compromise, as it can't be accurate for - // every system. When reindexing from a fast disk with a slow CPU, it - // can be up to 20, while when downloading from a slow network with a - // fast multicore CPU, it won't be much higher than 1. + /** + * How many times we expect transactions after the last checkpoint to + * be slower. This number is a compromise, as it can't be accurate for + * every system. When reindexing from a fast disk with a slow CPU, it + * can be up to 20, while when downloading from a slow network with a + * fast multicore CPU, it won't be much higher than 1. + */ static const double SIGCHECK_VERIFICATION_FACTOR = 5.0; bool fEnabled = true; @@ -35,7 +37,7 @@ namespace Checkpoints { return hash == i->second; } - // Guess how far we are in the verification process at the given block index + //! Guess how far we are in the verification process at the given block index double GuessVerificationProgress(CBlockIndex *pindex, bool fSigchecks) { if (pindex==NULL) return 0.0; diff --git a/src/checkpoints.h b/src/checkpoints.h index b5b620fa6b..65c5165f0f 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -1,9 +1,9 @@ -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_CHECKPOINT_H -#define BITCOIN_CHECKPOINT_H +#ifndef BITCOIN_CHECKPOINTS_H +#define BITCOIN_CHECKPOINTS_H #include "uint256.h" @@ -11,7 +11,8 @@ class CBlockIndex; -/** Block-chain checkpoints are compiled-in sanity checks. +/** + * Block-chain checkpoints are compiled-in sanity checks. * They are updated every release or three. */ namespace Checkpoints @@ -25,13 +26,13 @@ struct CCheckpointData { double fTransactionsPerDay; }; -// Returns true if block passes checkpoint checks +//! Returns true if block passes checkpoint checks bool CheckBlock(int nHeight, const uint256& hash); -// Return conservative estimate of total number of blocks, 0 if unknown +//! Return conservative estimate of total number of blocks, 0 if unknown int GetTotalBlocksEstimate(); -// Returns last CBlockIndex* in mapBlockIndex that is a checkpoint +//! Returns last CBlockIndex* in mapBlockIndex that is a checkpoint CBlockIndex* GetLastCheckpoint(); double GuessVerificationProgress(CBlockIndex* pindex, bool fSigchecks = true); @@ -40,4 +41,4 @@ extern bool fEnabled; } //namespace Checkpoints -#endif // BITCOIN_CHECKPOINT_H +#endif // BITCOIN_CHECKPOINTS_H diff --git a/src/checkqueue.h b/src/checkqueue.h index b2a713e646..2ee46a1210 100644 --- a/src/checkqueue.h +++ b/src/checkqueue.h @@ -1,9 +1,9 @@ -// Copyright (c) 2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef CHECKQUEUE_H -#define CHECKQUEUE_H +#ifndef BITCOIN_CHECKQUEUE_H +#define BITCOIN_CHECKQUEUE_H #include <algorithm> #include <vector> @@ -16,7 +16,8 @@ template <typename T> class CCheckQueueControl; -/** Queue for verifications that have to be performed. +/** + * Queue for verifications that have to be performed. * The verifications are represented by a type T, which must provide an * operator(), returning a bool. * @@ -29,40 +30,42 @@ template <typename T> class CCheckQueue { private: - // Mutex to protect the inner state + //! Mutex to protect the inner state boost::mutex mutex; - // Worker threads block on this when out of work + //! Worker threads block on this when out of work boost::condition_variable condWorker; - // Master thread blocks on this when out of work + //! Master thread blocks on this when out of work boost::condition_variable condMaster; - // The queue of elements to be processed. - // As the order of booleans doesn't matter, it is used as a LIFO (stack) + //! The queue of elements to be processed. + //! As the order of booleans doesn't matter, it is used as a LIFO (stack) std::vector<T> queue; - // The number of workers (including the master) that are idle. + //! The number of workers (including the master) that are idle. int nIdle; - // The total number of workers (including the master). + //! The total number of workers (including the master). int nTotal; - // The temporary evaluation result. + //! The temporary evaluation result. bool fAllOk; - // Number of verifications that haven't completed yet. - // This includes elements that are not anymore in queue, but still in - // worker's own batches. + /** + * Number of verifications that haven't completed yet. + * This includes elements that are not anymore in queue, but still in + * worker's own batches. + */ unsigned int nTodo; - // Whether we're shutting down. + //! Whether we're shutting down. bool fQuit; - // The maximum number of elements to be processed in one batch + //! The maximum number of elements to be processed in one batch unsigned int nBatchSize; - // Internal function that does bulk of the verification work. + /** Internal function that does bulk of the verification work. */ bool Loop(bool fMaster = false) { boost::condition_variable& cond = fMaster ? condMaster : condWorker; @@ -124,22 +127,22 @@ private: } public: - // Create a new check queue + //! Create a new check queue CCheckQueue(unsigned int nBatchSizeIn) : nIdle(0), nTotal(0), fAllOk(true), nTodo(0), fQuit(false), nBatchSize(nBatchSizeIn) {} - // Worker thread + //! Worker thread void Thread() { Loop(); } - // Wait until execution finishes, and return whether all evaluations where succesful. + //! Wait until execution finishes, and return whether all evaluations where successful. bool Wait() { return Loop(true); } - // Add a batch of checks to the queue + //! Add a batch of checks to the queue void Add(std::vector<T>& vChecks) { boost::unique_lock<boost::mutex> lock(mutex); @@ -161,8 +164,9 @@ public: friend class CCheckQueueControl<T>; }; -/** RAII-style controller object for a CCheckQueue that guarantees the passed - * queue is finished before continuing. +/** + * RAII-style controller object for a CCheckQueue that guarantees the passed + * queue is finished before continuing. */ template <typename T> class CCheckQueueControl @@ -204,4 +208,4 @@ public: } }; -#endif // CHECKQUEUE_H +#endif // BITCOIN_CHECKQUEUE_H diff --git a/src/version.cpp b/src/clientversion.cpp index d12b681e5c..b3414fdb4b 100644 --- a/src/version.cpp +++ b/src/clientversion.cpp @@ -1,42 +1,48 @@ -// Copyright (c) 2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include "version.h" +#include "clientversion.h" #include "tinyformat.h" #include <string> -// Name of client reported in the 'version' message. Report the same name -// for both bitcoind and bitcoin-qt, to make it harder for attackers to -// target servers or GUI users specifically. +/** + * Name of client reported in the 'version' message. Report the same name + * for both bitcoind and bitcoin-core, to make it harder for attackers to + * target servers or GUI users specifically. + */ const std::string CLIENT_NAME("Satoshi"); -// Client version number +/** + * Client version number + */ #define CLIENT_VERSION_SUFFIX "" -// The following part of the code determines the CLIENT_BUILD variable. -// Several mechanisms are used for this: -// * first, if HAVE_BUILD_INFO is defined, include build.h, a file that is -// generated by the build environment, possibly containing the output -// of git-describe in a macro called BUILD_DESC -// * secondly, if this is an exported version of the code, GIT_ARCHIVE will -// be defined (automatically using the export-subst git attribute), and -// GIT_COMMIT will contain the commit id. -// * then, three options exist for determining CLIENT_BUILD: -// * if BUILD_DESC is defined, use that literally (output of git-describe) -// * if not, but GIT_COMMIT is defined, use v[maj].[min].[rev].[build]-g[commit] -// * otherwise, use v[maj].[min].[rev].[build]-unk -// finally CLIENT_VERSION_SUFFIX is added - -// First, include build.h if requested +/** + * The following part of the code determines the CLIENT_BUILD variable. + * Several mechanisms are used for this: + * * first, if HAVE_BUILD_INFO is defined, include build.h, a file that is + * generated by the build environment, possibly containing the output + * of git-describe in a macro called BUILD_DESC + * * secondly, if this is an exported version of the code, GIT_ARCHIVE will + * be defined (automatically using the export-subst git attribute), and + * GIT_COMMIT will contain the commit id. + * * then, three options exist for determining CLIENT_BUILD: + * * if BUILD_DESC is defined, use that literally (output of git-describe) + * * if not, but GIT_COMMIT is defined, use v[maj].[min].[rev].[build]-g[commit] + * * otherwise, use v[maj].[min].[rev].[build]-unk + * finally CLIENT_VERSION_SUFFIX is added + */ + +//! First, include build.h if requested #ifdef HAVE_BUILD_INFO #include "build.h" #endif -// git will put "#define GIT_ARCHIVE 1" on the next line inside archives. $Format:%n#define GIT_ARCHIVE 1$ +//! git will put "#define GIT_ARCHIVE 1" on the next line inside archives. $Format:%n#define GIT_ARCHIVE 1$ #ifdef GIT_ARCHIVE #define GIT_COMMIT_ID "$Format:%h$" #define GIT_COMMIT_DATE "$Format:%cD$" @@ -85,7 +91,9 @@ std::string FormatFullVersion() return CLIENT_BUILD; } -// Format the subversion field according to BIP 14 spec (https://en.bitcoin.it/wiki/BIP_0014) +/** + * Format the subversion field according to BIP 14 spec (https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki) + */ std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector<std::string>& comments) { std::ostringstream ss; diff --git a/src/clientversion.h b/src/clientversion.h index cd7ceb78f0..0a36eb8012 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -1,38 +1,70 @@ // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef CLIENTVERSION_H -#define CLIENTVERSION_H +#ifndef BITCOIN_CLIENTVERSION_H +#define BITCOIN_CLIENTVERSION_H #if defined(HAVE_CONFIG_H) #include "config/bitcoin-config.h" #else -// -// client versioning and copyright year -// -// These need to be macros, as version.cpp's and bitcoin*-res.rc's voodoo requires it +/** + * client versioning and copyright year + */ + +//! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it #define CLIENT_VERSION_MAJOR 0 #define CLIENT_VERSION_MINOR 9 #define CLIENT_VERSION_REVISION 99 #define CLIENT_VERSION_BUILD 0 -// Set to true for release, false for prerelease or test build +//! Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE false -// Copyright year (2009-this) -// Todo: update this when changing our copyright comments in the source +/** + * Copyright year (2009-this) + * Todo: update this when changing our copyright comments in the source + */ #define COPYRIGHT_YEAR 2014 #endif //HAVE_CONFIG_H -// Converts the parameter X to a string after macro replacement on X has been performed. -// Don't merge these into one macro! +/** + * Converts the parameter X to a string after macro replacement on X has been performed. + * Don't merge these into one macro! + */ #define STRINGIZE(X) DO_STRINGIZE(X) #define DO_STRINGIZE(X) #X -// Copyright string used in Windows .rc files +//! Copyright string used in Windows .rc files #define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " The Bitcoin Core Developers" -#endif // CLIENTVERSION_H +/** + * bitcoind-res.rc includes this file, but it cannot cope with real c++ code. + * WINDRES_PREPROC is defined to indicate that its pre-processor is running. + * Anything other than a define should be guarded below. + */ + +#if !defined(WINDRES_PREPROC) + +#include <string> +#include <vector> + +static const int CLIENT_VERSION = + 1000000 * CLIENT_VERSION_MAJOR + + 10000 * CLIENT_VERSION_MINOR + + 100 * CLIENT_VERSION_REVISION + + 1 * CLIENT_VERSION_BUILD; + +extern const std::string CLIENT_NAME; +extern const std::string CLIENT_BUILD; +extern const std::string CLIENT_DATE; + + +std::string FormatFullVersion(); +std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector<std::string>& comments); + +#endif // WINDRES_PREPROC + +#endif // BITCOIN_CLIENTVERSION_H diff --git a/src/coincontrol.h b/src/coincontrol.h index c8f12d92de..c8bdd3b39d 100644 --- a/src/coincontrol.h +++ b/src/coincontrol.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef COINCONTROL_H -#define COINCONTROL_H +#ifndef BITCOIN_COINCONTROL_H +#define BITCOIN_COINCONTROL_H #include "core/transaction.h" @@ -35,12 +35,12 @@ public: return (setSelected.count(outpt) > 0); } - void Select(COutPoint& output) + void Select(const COutPoint& output) { setSelected.insert(output); } - void UnSelect(COutPoint& output) + void UnSelect(const COutPoint& output) { setSelected.erase(output); } @@ -59,4 +59,4 @@ private: std::set<COutPoint> setSelected; }; -#endif // COINCONTROL_H +#endif // BITCOIN_COINCONTROL_H diff --git a/src/coins.cpp b/src/coins.cpp index e4f3e67aeb..c2e802c953 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -1,5 +1,5 @@ -// Copyright (c) 2012-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "coins.h" @@ -8,9 +8,11 @@ #include <assert.h> -// calculate number of bytes for the bitmask, and its number of non-zero bytes -// each bit in the bitmask represents the availability of one output, but the -// availabilities of the first two outputs are encoded separately +/** + * calculate number of bytes for the bitmask, and its number of non-zero bytes + * each bit in the bitmask represents the availability of one output, but the + * availabilities of the first two outputs are encoded separately + */ void CCoins::CalcMaskSize(unsigned int &nBytes, unsigned int &nNonzeroBytes) const { unsigned int nLastUsedByte = 0; for (unsigned int b = 0; 2+b*8 < vout.size(); b++) { @@ -133,7 +135,7 @@ const CCoins* CCoinsViewCache::AccessCoins(const uint256 &txid) const { bool CCoinsViewCache::HaveCoins(const uint256 &txid) const { CCoinsMap::const_iterator it = FetchCoins(txid); // We're using vtx.empty() instead of IsPruned here for performance reasons, - // as we only care about the case where an transaction was replaced entirely + // as we only care about the case where a transaction was replaced entirely // in a reorganization (which wipes vout entirely, as opposed to spending // which just cleans individual outputs). return (it != cacheCoins.end() && !it->second.coins.vout.empty()); diff --git a/src/coins.h b/src/coins.h index ee9051562b..dbe3f8bd31 100644 --- a/src/coins.h +++ b/src/coins.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_COINS_H @@ -17,7 +17,8 @@ #include <boost/foreach.hpp> #include <boost/unordered_map.hpp> -/** pruned version of CTransaction: only retains metadata and unspent transaction outputs +/** + * Pruned version of CTransaction: only retains metadata and unspent transaction outputs * * Serialized format: * - VARINT(nVersion) @@ -71,17 +72,17 @@ class CCoins { public: - // whether transaction is a coinbase + //! whether transaction is a coinbase bool fCoinBase; - // unspent transaction outputs; spent outputs are .IsNull(); spent outputs at the end of the array are dropped + //! unspent transaction outputs; spent outputs are .IsNull(); spent outputs at the end of the array are dropped std::vector<CTxOut> vout; - // at which height this transaction was included in the active block chain + //! at which height this transaction was included in the active block chain int nHeight; - // version of the CTransaction; accesses to this value should probably check for nHeight as well, - // as new tx version will probably only be introduced at certain heights + //! version of the CTransaction; accesses to this value should probably check for nHeight as well, + //! as new tx version will probably only be introduced at certain heights int nVersion; void FromTx(const CTransaction &tx, int nHeightIn) { @@ -92,7 +93,7 @@ public: ClearUnspendable(); } - // construct a CCoins from a CTransaction, at a given height + //! construct a CCoins from a CTransaction, at a given height CCoins(const CTransaction &tx, int nHeightIn) { FromTx(tx, nHeightIn); } @@ -104,10 +105,10 @@ public: nVersion = 0; } - // empty constructor + //! empty constructor CCoins() : fCoinBase(false), vout(0), nHeight(0), nVersion(0) { } - // remove spent outputs at the end of vout + //!remove spent outputs at the end of vout void Cleanup() { while (vout.size() > 0 && vout.back().IsNull()) vout.pop_back(); @@ -130,7 +131,7 @@ public: std::swap(to.nVersion, nVersion); } - // equality test + //! equality test friend bool operator==(const CCoins &a, const CCoins &b) { // Empty CCoins objects are always equal. if (a.IsPruned() && b.IsPruned()) @@ -236,19 +237,19 @@ public: Cleanup(); } - // mark an outpoint spent, and construct undo information + //! mark an outpoint spent, and construct undo information bool Spend(const COutPoint &out, CTxInUndo &undo); - // mark a vout spent + //! mark a vout spent bool Spend(int nPos); - // check whether a particular output is still available + //! check whether a particular output is still available bool IsAvailable(unsigned int nPos) const { return (nPos < vout.size() && !vout[nPos].IsNull()); } - // check whether the entire CCoins is spent - // note that only !IsPruned() CCoins can be serialized + //! check whether the entire CCoins is spent + //! note that only !IsPruned() CCoins can be serialized bool IsPruned() const { BOOST_FOREACH(const CTxOut &out, vout) if (!out.IsNull()) @@ -264,9 +265,12 @@ private: public: CCoinsKeyHasher(); - // This *must* return size_t. With Boost 1.46 on 32-bit systems the - // unordered_map will behave unpredictably if the custom hasher returns a - // uint64_t, resulting in failures when syncing the chain (#4634). + + /** + * This *must* return size_t. With Boost 1.46 on 32-bit systems the + * unordered_map will behave unpredictably if the custom hasher returns a + * uint64_t, resulting in failures when syncing the chain (#4634). + */ size_t operator()(const uint256& key) const { return key.GetHash(salt); } @@ -305,24 +309,24 @@ struct CCoinsStats class CCoinsView { public: - // Retrieve the CCoins (unspent transaction outputs) for a given txid + //! Retrieve the CCoins (unspent transaction outputs) for a given txid virtual bool GetCoins(const uint256 &txid, CCoins &coins) const; - // Just check whether we have data for a given txid. - // This may (but cannot always) return true for fully spent transactions + //! Just check whether we have data for a given txid. + //! This may (but cannot always) return true for fully spent transactions virtual bool HaveCoins(const uint256 &txid) const; - // Retrieve the block hash whose state this CCoinsView currently represents + //! Retrieve the block hash whose state this CCoinsView currently represents virtual uint256 GetBestBlock() const; - // Do a bulk modification (multiple CCoins changes + BestBlock change). - // The passed mapCoins can be modified. + //! Do a bulk modification (multiple CCoins changes + BestBlock change). + //! The passed mapCoins can be modified. virtual bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock); - // Calculate statistics about the unspent transaction output set + //! Calculate statistics about the unspent transaction output set virtual bool GetStats(CCoinsStats &stats) const; - // As we use CCoinsViews polymorphically, have a virtual destructor + //! As we use CCoinsViews polymorphically, have a virtual destructor virtual ~CCoinsView() {} }; @@ -346,9 +350,11 @@ public: class CCoinsViewCache; -/** A reference to a mutable cache entry. Encapsulating it allows us to run +/** + * A reference to a mutable cache entry. Encapsulating it allows us to run * cleanup code after the modification is finished, and keeping track of - * concurrent modifications. */ + * concurrent modifications. + */ class CCoinsModifier { private: @@ -370,8 +376,10 @@ protected: /* Whether this cache has an active modifier. */ bool hasModifier; - /* Make mutable so that we can "fill the cache" even from Get-methods - declared as "const". */ + /** + * Make mutable so that we can "fill the cache" even from Get-methods + * declared as "const". + */ mutable uint256 hashBlock; mutable CCoinsMap cacheCoins; @@ -386,37 +394,44 @@ public: void SetBestBlock(const uint256 &hashBlock); bool BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlock); - // Return a pointer to CCoins in the cache, or NULL if not found. This is - // more efficient than GetCoins. Modifications to other cache entries are - // allowed while accessing the returned pointer. + /** + * Return a pointer to CCoins in the cache, or NULL if not found. This is + * more efficient than GetCoins. Modifications to other cache entries are + * allowed while accessing the returned pointer. + */ const CCoins* AccessCoins(const uint256 &txid) const; - // Return a modifiable reference to a CCoins. If no entry with the given - // txid exists, a new one is created. Simultaneous modifications are not - // allowed. + /** + * Return a modifiable reference to a CCoins. If no entry with the given + * txid exists, a new one is created. Simultaneous modifications are not + * allowed. + */ CCoinsModifier ModifyCoins(const uint256 &txid); - // Push the modifications applied to this cache to its base. - // Failure to call this method before destruction will cause the changes to be forgotten. - // If false is returned, the state of this cache (and its backing view) will be undefined. + /** + * Push the modifications applied to this cache to its base. + * Failure to call this method before destruction will cause the changes to be forgotten. + * If false is returned, the state of this cache (and its backing view) will be undefined. + */ bool Flush(); - // Calculate the size of the cache (in number of transactions) + //! Calculate the size of the cache (in number of transactions) unsigned int GetCacheSize() const; - /** Amount of bitcoins coming in to a transaction - Note that lightweight clients may not know anything besides the hash of previous transactions, - so may not be able to calculate this. - - @param[in] tx transaction for which we are checking input total - @return Sum of value of all inputs (scriptSigs) + /** + * Amount of bitcoins coming in to a transaction + * Note that lightweight clients may not know anything besides the hash of previous transactions, + * so may not be able to calculate this. + * + * @param[in] tx transaction for which we are checking input total + * @return Sum of value of all inputs (scriptSigs) */ CAmount GetValueIn(const CTransaction& tx) const; - // Check whether all prevouts of the transaction are present in the UTXO set represented by this view + //! Check whether all prevouts of the transaction are present in the UTXO set represented by this view bool HaveInputs(const CTransaction& tx) const; - // Return priority of tx at height nHeight + //! Return priority of tx at height nHeight double GetPriority(const CTransaction &tx, int nHeight) const; const CTxOut &GetOutputFor(const CTxIn& input) const; diff --git a/src/compat.h b/src/compat.h index 4fc28a36e0..dffd4ecf52 100644 --- a/src/compat.h +++ b/src/compat.h @@ -3,8 +3,12 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef _BITCOIN_COMPAT_H -#define _BITCOIN_COMPAT_H +#ifndef BITCOIN_COMPAT_H +#define BITCOIN_COMPAT_H + +#if defined(HAVE_CONFIG_H) +#include "config/bitcoin-config.h" +#endif #ifdef WIN32 #ifdef _WIN32_WINNT @@ -84,4 +88,8 @@ typedef u_int SOCKET; #define THREAD_PRIORITY_ABOVE_NORMAL (-2) #endif -#endif // _BITCOIN_COMPAT_H +#if HAVE_DECL_STRNLEN == 0 +size_t strnlen( const char *start, size_t max_len); +#endif // HAVE_DECL_STRNLEN + +#endif // BITCOIN_COMPAT_H diff --git a/src/compat/sanity.h b/src/compat/sanity.h index 7016ac0ab7..7f5bc1a4fb 100644 --- a/src/compat/sanity.h +++ b/src/compat/sanity.h @@ -2,10 +2,10 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCON_COMPAT_SANITY_H -#define BITCON_COMPAT_SANITY_H +#ifndef BITCOIN_COMPAT_SANITY_H +#define BITCOIN_COMPAT_SANITY_H bool glibc_sanity_test(); bool glibcxx_sanity_test(); -#endif // BITCON_COMPAT_SANITY_H +#endif // BITCOIN_COMPAT_SANITY_H diff --git a/src/compat/strnlen.cpp b/src/compat/strnlen.cpp new file mode 100644 index 0000000000..7f3e159887 --- /dev/null +++ b/src/compat/strnlen.cpp @@ -0,0 +1,18 @@ +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#if defined(HAVE_CONFIG_H) +#include "config/bitcoin-config.h" +#endif + +#include <cstring> + +#if HAVE_DECL_STRNLEN == 0 +size_t strnlen( const char *start, size_t max_len) +{ + const char *end = (const char *)memchr(start, '\0', max_len); + + return end ? (size_t)(end - start) : max_len; +} +#endif // HAVE_DECL_STRNLEN diff --git a/src/compressor.cpp b/src/compressor.cpp index 806175dd3e..c47a0f6f8c 100644 --- a/src/compressor.cpp +++ b/src/compressor.cpp @@ -6,7 +6,7 @@ #include "compressor.h" #include "hash.h" -#include "key.h" +#include "pubkey.h" #include "script/standard.h" bool CScriptCompressor::IsToKeyID(CKeyID &hash) const diff --git a/src/compressor.h b/src/compressor.h index a612c3a883..d9cde5de7a 100644 --- a/src/compressor.h +++ b/src/compressor.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_COMPRESSOR -#define H_BITCOIN_COMPRESSOR +#ifndef BITCOIN_COMPRESSOR_H +#define BITCOIN_COMPRESSOR_H #include "core/transaction.h" #include "script/script.h" @@ -28,19 +28,23 @@ class CScriptID; class CScriptCompressor { private: - // make this static for now (there are only 6 special scripts defined) - // this can potentially be extended together with a new nVersion for - // transactions, in which case this value becomes dependent on nVersion - // and nHeight of the enclosing transaction. + /** + * make this static for now (there are only 6 special scripts defined) + * this can potentially be extended together with a new nVersion for + * transactions, in which case this value becomes dependent on nVersion + * and nHeight of the enclosing transaction. + */ static const unsigned int nSpecialScripts = 6; CScript &script; protected: - // These check for scripts for which a special case with a shorter encoding is defined. - // They are implemented separately from the CScript test, as these test for exact byte - // sequence correspondences, and are more strict. For example, IsToPubKey also verifies - // whether the public key is valid (as invalid ones cannot be represented in compressed - // form). + /** + * These check for scripts for which a special case with a shorter encoding is defined. + * They are implemented separately from the CScript test, as these test for exact byte + * sequence correspondences, and are more strict. For example, IsToPubKey also verifies + * whether the public key is valid (as invalid ones cannot be represented in compressed + * form). + */ bool IsToKeyID(CKeyID &hash) const; bool IsToScriptID(CScriptID &hash) const; bool IsToPubKey(CPubKey &pubkey) const; @@ -116,4 +120,4 @@ public: } }; -#endif // H_BITCOIN_COMPRESSOR +#endif // BITCOIN_COMPRESSOR_H diff --git a/src/core/block.h b/src/core/block.h index f1eb7a844f..6e119c3699 100644 --- a/src/core/block.h +++ b/src/core/block.h @@ -3,8 +3,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_CORE_BLOCK -#define H_BITCOIN_CORE_BLOCK +#ifndef BITCOIN_CORE_BLOCK_H +#define BITCOIN_CORE_BLOCK_H #include "core/transaction.h" #include "serialize.h" @@ -165,4 +165,4 @@ struct CBlockLocator } }; -#endif // H_BITCOIN_CORE_BLOCK +#endif // BITCOIN_CORE_BLOCK_H diff --git a/src/core/transaction.h b/src/core/transaction.h index c21558cfeb..724348020a 100644 --- a/src/core/transaction.h +++ b/src/core/transaction.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_CORE_TRANSACTION -#define H_BITCOIN_CORE_TRANSACTION +#ifndef BITCOIN_CORE_TRANSACTION_H +#define BITCOIN_CORE_TRANSACTION_H #include "amount.h" #include "script/script.h" @@ -273,4 +273,4 @@ struct CMutableTransaction uint256 GetHash() const; }; -#endif // H_BITCOIN_CORE_TRANSACTION +#endif // BITCOIN_CORE_TRANSACTION_H diff --git a/src/core_io.h b/src/core_io.h index 94848f1c3d..aba1928a36 100644 --- a/src/core_io.h +++ b/src/core_io.h @@ -2,12 +2,13 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef __BITCOIN_CORE_IO_H__ -#define __BITCOIN_CORE_IO_H__ +#ifndef BITCOIN_CORE_IO_H +#define BITCOIN_CORE_IO_H #include <string> #include <vector> +class CBlock; class CScript; class CTransaction; class uint256; @@ -16,6 +17,7 @@ class UniValue; // core_read.cpp extern CScript ParseScript(std::string s); extern bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx); +extern bool DecodeHexBlk(CBlock&, const std::string& strHexBlk); extern uint256 ParseHashUV(const UniValue& v, const std::string& strName); extern std::vector<unsigned char> ParseHexUV(const UniValue& v, const std::string& strName); @@ -26,4 +28,4 @@ extern void ScriptPubKeyToUniv(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex); extern void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry); -#endif // __BITCOIN_CORE_IO_H__ +#endif // BITCOIN_CORE_IO_H diff --git a/src/core_read.cpp b/src/core_read.cpp index d39bc9a780..42e2f8d200 100644 --- a/src/core_read.cpp +++ b/src/core_read.cpp @@ -4,6 +4,7 @@ #include "core_io.h" +#include "core/block.h" #include "core/transaction.h" #include "script/script.h" #include "serialize.h" @@ -108,6 +109,23 @@ bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx) return true; } +bool DecodeHexBlk(CBlock& block, const std::string& strHexBlk) +{ + if (!IsHex(strHexBlk)) + return false; + + std::vector<unsigned char> blockData(ParseHex(strHexBlk)); + CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION); + try { + ssBlock >> block; + } + catch (const std::exception &) { + return false; + } + + return true; +} + uint256 ParseHashUV(const UniValue& v, const string& strName) { string strHex; diff --git a/src/crypter.h b/src/crypter.h index c7424c9b20..f7018cfdbe 100644 --- a/src/crypter.h +++ b/src/crypter.h @@ -1,33 +1,33 @@ -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef __CRYPTER_H__ -#define __CRYPTER_H__ +#ifndef BITCOIN_CRYPTER_H +#define BITCOIN_CRYPTER_H #include "allocators.h" -#include "serialize.h" #include "keystore.h" +#include "serialize.h" class uint256; const unsigned int WALLET_CRYPTO_KEY_SIZE = 32; const unsigned int WALLET_CRYPTO_SALT_SIZE = 8; -/* -Private key encryption is done based on a CMasterKey, -which holds a salt and random encryption key. - -CMasterKeys are encrypted using AES-256-CBC using a key -derived using derivation method nDerivationMethod -(0 == EVP_sha512()) and derivation iterations nDeriveIterations. -vchOtherDerivationParameters is provided for alternative algorithms -which may require more parameters (such as scrypt). - -Wallet Private Keys are then encrypted using AES-256-CBC -with the double-sha256 of the public key as the IV, and the -master key's key as the encryption key (see keystore.[ch]). -*/ +/** + * Private key encryption is done based on a CMasterKey, + * which holds a salt and random encryption key. + * + * CMasterKeys are encrypted using AES-256-CBC using a key + * derived using derivation method nDerivationMethod + * (0 == EVP_sha512()) and derivation iterations nDeriveIterations. + * vchOtherDerivationParameters is provided for alternative algorithms + * which may require more parameters (such as scrypt). + * + * Wallet Private Keys are then encrypted using AES-256-CBC + * with the double-sha256 of the public key as the IV, and the + * master key's key as the encryption key (see keystore.[ch]). + */ /** Master key for wallet encryption */ class CMasterKey @@ -35,12 +35,12 @@ class CMasterKey public: std::vector<unsigned char> vchCryptedKey; std::vector<unsigned char> vchSalt; - // 0 = EVP_sha512() - // 1 = scrypt() + //! 0 = EVP_sha512() + //! 1 = scrypt() unsigned int nDerivationMethod; unsigned int nDeriveIterations; - // Use this for more parameters to key derivation, - // such as the various parameters to scrypt + //! Use this for more parameters to key derivation, + //! such as the various parameters to scrypt std::vector<unsigned char> vchOtherDerivationParameters; ADD_SERIALIZE_METHODS; @@ -120,17 +120,17 @@ private: CKeyingMaterial vMasterKey; - // if fUseCrypto is true, mapKeys must be empty - // if fUseCrypto is false, vMasterKey must be empty + //! if fUseCrypto is true, mapKeys must be empty + //! if fUseCrypto is false, vMasterKey must be empty bool fUseCrypto; - // keeps track of whether Unlock has run a thourough check before + //! keeps track of whether Unlock has run a thorough check before bool fDecryptionThoroughlyChecked; protected: bool SetCrypted(); - // will encrypt previously unencrypted keys + //! will encrypt previously unencrypted keys bool EncryptKeys(CKeyingMaterial& vMasterKeyIn); bool Unlock(const CKeyingMaterial& vMasterKeyIn); @@ -189,10 +189,11 @@ public: } } - /* Wallet status (encrypted, locked) changed. + /** + * Wallet status (encrypted, locked) changed. * Note: Called without locks held. */ boost::signals2::signal<void (CCryptoKeyStore* wallet)> NotifyStatusChanged; }; -#endif // __CRYPTER_H__ +#endif // BITCOIN_CRYPTER_H diff --git a/src/crypto/ripemd160.h b/src/crypto/ripemd160.h index 902e7ca83f..f468ec6722 100644 --- a/src/crypto/ripemd160.h +++ b/src/crypto/ripemd160.h @@ -2,8 +2,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_RIPEMD160_H -#define BITCOIN_RIPEMD160_H +#ifndef BITCOIN_CRYPTO_RIPEMD160_H +#define BITCOIN_CRYPTO_RIPEMD160_H #include <stdint.h> #include <stdlib.h> @@ -25,4 +25,4 @@ public: CRIPEMD160& Reset(); }; -#endif // BITCOIN_RIPEMD160_H +#endif // BITCOIN_CRYPTO_RIPEMD160_H diff --git a/src/crypto/sha1.h b/src/crypto/sha1.h index 68bd7ced9f..e28f98decd 100644 --- a/src/crypto/sha1.h +++ b/src/crypto/sha1.h @@ -2,8 +2,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_SHA1_H -#define BITCOIN_SHA1_H +#ifndef BITCOIN_CRYPTO_SHA1_H +#define BITCOIN_CRYPTO_SHA1_H #include <stdint.h> #include <stdlib.h> @@ -25,4 +25,4 @@ public: CSHA1& Reset(); }; -#endif // BITCOIN_SHA1_H +#endif // BITCOIN_CRYPTO_SHA1_H diff --git a/src/crypto/sha2.h b/src/crypto/sha2.h index a6cbe58554..329c6675ab 100644 --- a/src/crypto/sha2.h +++ b/src/crypto/sha2.h @@ -2,8 +2,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_SHA2_H -#define BITCOIN_SHA2_H +#ifndef BITCOIN_CRYPTO_SHA2_H +#define BITCOIN_CRYPTO_SHA2_H #include <stdint.h> #include <stdlib.h> @@ -61,4 +61,4 @@ public: void Finalize(unsigned char hash[OUTPUT_SIZE]); }; -#endif // BITCOIN_SHA2_H +#endif // BITCOIN_CRYPTO_SHA2_H @@ -1,11 +1,12 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_DB_H #define BITCOIN_DB_H +#include "clientversion.h" #include "serialize.h" #include "streams.h" #include "sync.h" @@ -49,7 +50,7 @@ public: void MakeMock(); bool IsMock() { return fMockDb; } - /* + /** * Verify that database file strFile is OK. If it is not, * call the callback to try to recover. * This must be called BEFORE strFile is opened. @@ -59,7 +60,7 @@ public: RECOVER_OK, RECOVER_FAIL }; VerifyResult Verify(std::string strFile, bool (*recoverFunc)(CDBEnv& dbenv, std::string strFile)); - /* + /** * Salvage data from a file that Verify says is bad. * fAggressive sets the DB_AGGRESSIVE flag (see berkeley DB->verify() method documentation). * Appends binary key/value pairs to vResult, returns true if successful. diff --git a/src/eccryptoverify.cpp b/src/eccryptoverify.cpp new file mode 100644 index 0000000000..435154d608 --- /dev/null +++ b/src/eccryptoverify.cpp @@ -0,0 +1,68 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "eccryptoverify.h" + +namespace { + +int CompareBigEndian(const unsigned char *c1, size_t c1len, const unsigned char *c2, size_t c2len) { + while (c1len > c2len) { + if (*c1) + return 1; + c1++; + c1len--; + } + while (c2len > c1len) { + if (*c2) + return -1; + c2++; + c2len--; + } + while (c1len > 0) { + if (*c1 > *c2) + return 1; + if (*c2 > *c1) + return -1; + c1++; + c2++; + c1len--; + } + return 0; +} + +/** Order of secp256k1's generator minus 1. */ +const unsigned char vchMaxModOrder[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 +}; + +/** Half of the order of secp256k1's generator minus 1. */ +const unsigned char vchMaxModHalfOrder[32] = { + 0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x5D,0x57,0x6E,0x73,0x57,0xA4,0x50,0x1D, + 0xDF,0xE9,0x2F,0x46,0x68,0x1B,0x20,0xA0 +}; + +const unsigned char vchZero[1] = {0}; +} // anon namespace + +namespace eccrypto { + +bool Check(const unsigned char *vch) { + return vch && + CompareBigEndian(vch, 32, vchZero, 0) > 0 && + CompareBigEndian(vch, 32, vchMaxModOrder, 32) <= 0; +} + +bool CheckSignatureElement(const unsigned char *vch, int len, bool half) { + return vch && + CompareBigEndian(vch, len, vchZero, 0) > 0 && + CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0; +} + +} // namespace eccrypto diff --git a/src/eccryptoverify.h b/src/eccryptoverify.h new file mode 100644 index 0000000000..da7e80c7c3 --- /dev/null +++ b/src/eccryptoverify.h @@ -0,0 +1,21 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_ECCRYPTOVERIFY_H +#define BITCOIN_ECCRYPTOVERIFY_H + +#include <vector> +#include <cstdlib> + +class uint256; + +namespace eccrypto { + +bool Check(const unsigned char *vch); +bool CheckSignatureElement(const unsigned char *vch, int len, bool half); + +} // eccrypto namespace + +#endif // BITCOIN_ECCRYPTOVERIFY_H diff --git a/src/ecwrapper.cpp b/src/ecwrapper.cpp index e5db670927..5ce7e61294 100644 --- a/src/ecwrapper.cpp +++ b/src/ecwrapper.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "ecwrapper.h" @@ -13,46 +13,11 @@ namespace { -// Generate a private key from just the secret parameter -int EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key) -{ - int ok = 0; - BN_CTX *ctx = NULL; - EC_POINT *pub_key = NULL; - - if (!eckey) return 0; - - const EC_GROUP *group = EC_KEY_get0_group(eckey); - - if ((ctx = BN_CTX_new()) == NULL) - goto err; - - pub_key = EC_POINT_new(group); - - if (pub_key == NULL) - goto err; - - if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, ctx)) - goto err; - - EC_KEY_set_private_key(eckey,priv_key); - EC_KEY_set_public_key(eckey,pub_key); - - ok = 1; - -err: - - if (pub_key) - EC_POINT_free(pub_key); - if (ctx != NULL) - BN_CTX_free(ctx); - - return(ok); -} - -// Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields -// recid selects which key is recovered -// if check is non-zero, additional checks are performed +/** + * Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields + * recid selects which key is recovered + * if check is non-zero, additional checks are performed + */ int ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check) { if (!eckey) return 0; @@ -135,48 +100,6 @@ CECKey::~CECKey() { EC_KEY_free(pkey); } -void CECKey::GetSecretBytes(unsigned char vch[32]) const { - const BIGNUM *bn = EC_KEY_get0_private_key(pkey); - assert(bn); - int nBytes = BN_num_bytes(bn); - int n=BN_bn2bin(bn,&vch[32 - nBytes]); - assert(n == nBytes); - memset(vch, 0, 32 - nBytes); -} - -void CECKey::SetSecretBytes(const unsigned char vch[32]) { - bool ret; - BIGNUM bn; - BN_init(&bn); - ret = BN_bin2bn(vch, 32, &bn) != NULL; - assert(ret); - ret = EC_KEY_regenerate_key(pkey, &bn) != 0; - assert(ret); - BN_clear_free(&bn); -} - -int CECKey::GetPrivKeySize(bool fCompressed) { - EC_KEY_set_conv_form(pkey, fCompressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED); - return i2d_ECPrivateKey(pkey, NULL); -} -int CECKey::GetPrivKey(unsigned char* privkey, bool fCompressed) { - EC_KEY_set_conv_form(pkey, fCompressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED); - return i2d_ECPrivateKey(pkey, &privkey); -} - -bool CECKey::SetPrivKey(const unsigned char* privkey, size_t size, bool fSkipCheck) { - if (d2i_ECPrivateKey(&pkey, &privkey, size)) { - if(fSkipCheck) - return true; - - // d2i_ECPrivateKey returns true if parsing succeeds. - // This doesn't necessarily mean the key is valid. - if (EC_KEY_check_key(pkey)) - return true; - } - return false; -} - void CECKey::GetPubKey(std::vector<unsigned char> &pubkey, bool fCompressed) { EC_KEY_set_conv_form(pkey, fCompressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED); int nSize = i2o_ECPublicKey(pkey, NULL); @@ -193,33 +116,6 @@ bool CECKey::SetPubKey(const unsigned char* pubkey, size_t size) { return o2i_ECPublicKey(&pkey, &pubkey, size) != NULL; } -bool CECKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, bool lowS) { - vchSig.clear(); - ECDSA_SIG *sig = ECDSA_do_sign((unsigned char*)&hash, sizeof(hash), pkey); - if (sig == NULL) - return false; - BN_CTX *ctx = BN_CTX_new(); - BN_CTX_start(ctx); - const EC_GROUP *group = EC_KEY_get0_group(pkey); - BIGNUM *order = BN_CTX_get(ctx); - BIGNUM *halforder = BN_CTX_get(ctx); - EC_GROUP_get_order(group, order, ctx); - BN_rshift1(halforder, order); - if (lowS && BN_cmp(sig->s, halforder) > 0) { - // enforce low S values, by negating the value (modulo the order) if above order/2. - BN_sub(sig->s, order, sig->s); - } - BN_CTX_end(ctx); - BN_CTX_free(ctx); - unsigned int nSize = ECDSA_size(pkey); - vchSig.resize(nSize); // Make sure it is big enough - unsigned char *pos = &vchSig[0]; - nSize = i2d_ECDSA_SIG(sig, &pos); - ECDSA_SIG_free(sig); - vchSig.resize(nSize); // Shrink to fit actual size - return true; -} - bool CECKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) { // -1 = error, 0 = bad sig, 1 = good if (ECDSA_verify(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], vchSig.size(), pkey) != 1) @@ -227,37 +123,6 @@ bool CECKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSi return true; } -bool CECKey::SignCompact(const uint256 &hash, unsigned char *p64, int &rec) { - bool fOk = false; - ECDSA_SIG *sig = ECDSA_do_sign((unsigned char*)&hash, sizeof(hash), pkey); - if (sig==NULL) - return false; - memset(p64, 0, 64); - int nBitsR = BN_num_bits(sig->r); - int nBitsS = BN_num_bits(sig->s); - if (nBitsR <= 256 && nBitsS <= 256) { - std::vector<unsigned char> pubkey; - GetPubKey(pubkey, true); - for (int i=0; i<4; i++) { - CECKey keyRec; - if (ECDSA_SIG_recover_key_GFp(keyRec.pkey, sig, (unsigned char*)&hash, sizeof(hash), i, 1) == 1) { - std::vector<unsigned char> pubkeyRec; - keyRec.GetPubKey(pubkeyRec, true); - if (pubkeyRec == pubkey) { - rec = i; - fOk = true; - break; - } - } - } - assert(fOk); - BN_bn2bin(sig->r,&p64[32-(nBitsR+7)/8]); - BN_bn2bin(sig->s,&p64[64-(nBitsS+7)/8]); - } - ECDSA_SIG_free(sig); - return fOk; -} - bool CECKey::Recover(const uint256 &hash, const unsigned char *p64, int rec) { if (rec<0 || rec>=3) @@ -270,33 +135,6 @@ bool CECKey::Recover(const uint256 &hash, const unsigned char *p64, int rec) return ret; } -bool CECKey::TweakSecret(unsigned char vchSecretOut[32], const unsigned char vchSecretIn[32], const unsigned char vchTweak[32]) -{ - bool ret = true; - BN_CTX *ctx = BN_CTX_new(); - BN_CTX_start(ctx); - BIGNUM *bnSecret = BN_CTX_get(ctx); - BIGNUM *bnTweak = BN_CTX_get(ctx); - BIGNUM *bnOrder = BN_CTX_get(ctx); - EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp256k1); - EC_GROUP_get_order(group, bnOrder, ctx); // what a grossly inefficient way to get the (constant) group order... - BN_bin2bn(vchTweak, 32, bnTweak); - if (BN_cmp(bnTweak, bnOrder) >= 0) - ret = false; // extremely unlikely - BN_bin2bn(vchSecretIn, 32, bnSecret); - BN_add(bnSecret, bnSecret, bnTweak); - BN_nnmod(bnSecret, bnSecret, bnOrder, ctx); - if (BN_is_zero(bnSecret)) - ret = false; // ridiculously unlikely - int nBits = BN_num_bits(bnSecret); - memset(vchSecretOut, 0, 32); - BN_bn2bin(bnSecret, &vchSecretOut[32-(nBits+7)/8]); - EC_GROUP_free(group); - BN_CTX_end(ctx); - BN_CTX_free(ctx); - return ret; -} - bool CECKey::TweakPublic(const unsigned char vchTweak[32]) { bool ret = true; BN_CTX *ctx = BN_CTX_new(); diff --git a/src/ecwrapper.h b/src/ecwrapper.h index 072da4a942..4efde51650 100644 --- a/src/ecwrapper.h +++ b/src/ecwrapper.h @@ -1,9 +1,9 @@ // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_EC_WRAPPER_H -#define BITCOIN_EC_WRAPPER_H +#ifndef BITCOIN_ECWRAPPER_H +#define BITCOIN_ECWRAPPER_H #include <cstddef> #include <vector> @@ -12,7 +12,7 @@ class uint256; -// RAII Wrapper around OpenSSL's EC_KEY +/** RAII Wrapper around OpenSSL's EC_KEY */ class CECKey { private: EC_KEY *pkey; @@ -21,26 +21,20 @@ public: CECKey(); ~CECKey(); - void GetSecretBytes(unsigned char vch[32]) const; - void SetSecretBytes(const unsigned char vch[32]); - int GetPrivKeySize(bool fCompressed); - int GetPrivKey(unsigned char* privkey, bool fCompressed); - bool SetPrivKey(const unsigned char* privkey, size_t size, bool fSkipCheck=false); void GetPubKey(std::vector<unsigned char>& pubkey, bool fCompressed); bool SetPubKey(const unsigned char* pubkey, size_t size); - bool Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, bool lowS); bool Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig); - bool SignCompact(const uint256 &hash, unsigned char *p64, int &rec); - // reconstruct public key from a compact signature - // This is only slightly more CPU intensive than just verifying it. - // If this function succeeds, the recovered public key is guaranteed to be valid - // (the signature is a valid signature of the given data for that key) + /** + * reconstruct public key from a compact signature + * This is only slightly more CPU intensive than just verifying it. + * If this function succeeds, the recovered public key is guaranteed to be valid + * (the signature is a valid signature of the given data for that key) + */ bool Recover(const uint256 &hash, const unsigned char *p64, int rec); - static bool TweakSecret(unsigned char vchSecretOut[32], const unsigned char vchSecretIn[32], const unsigned char vchTweak[32]); bool TweakPublic(const unsigned char vchTweak[32]); static bool SanityCheck(); }; -#endif +#endif // BITCOIN_ECWRAPPER_H diff --git a/src/hash.cpp b/src/hash.cpp index 218607a6fd..2cca06ae23 100644 --- a/src/hash.cpp +++ b/src/hash.cpp @@ -1,3 +1,7 @@ +// Copyright (c) 2013-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + #include "hash.h" inline uint32_t ROTL32(uint32_t x, int8_t r) @@ -63,3 +67,16 @@ unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char return h1; } + +void BIP32Hash(const unsigned char chainCode[32], unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]) +{ + unsigned char num[4]; + num[0] = (nChild >> 24) & 0xFF; + num[1] = (nChild >> 16) & 0xFF; + num[2] = (nChild >> 8) & 0xFF; + num[3] = (nChild >> 0) & 0xFF; + CHMAC_SHA512(chainCode, 32).Write(&header, 1) + .Write(data, 32) + .Write(num, 4) + .Finalize(output); +} diff --git a/src/hash.h b/src/hash.h index bdcd4afb47..75695160e6 100644 --- a/src/hash.h +++ b/src/hash.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_HASH_H @@ -159,4 +159,6 @@ uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash); +void BIP32Hash(const unsigned char chainCode[32], unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]); + #endif // BITCOIN_HASH_H diff --git a/src/init.cpp b/src/init.cpp index d928094bba..63e72c66d2 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -18,6 +18,7 @@ #include "miner.h" #include "net.h" #include "rpcserver.h" +#include "script/standard.h" #include "txdb.h" #include "ui_interface.h" #include "util.h" @@ -149,14 +150,9 @@ void Shutdown() { LOCK(cs_main); -#ifdef ENABLE_WALLET - if (pwalletMain) - pwalletMain->SetBestChain(chainActive.GetLocator()); -#endif - if (pblocktree) - pblocktree->Flush(); - if (pcoinsTip) - pcoinsTip->Flush(); + if (pcoinsTip != NULL) { + FlushStateToDisk(); + } delete pcoinsTip; pcoinsTip = NULL; delete pcoinsdbview; @@ -289,6 +285,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += " -paytxfee=<amt> " + strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())) + "\n"; strUsage += " -rescan " + _("Rescan the block chain for missing wallet transactions") + " " + _("on startup") + "\n"; strUsage += " -salvagewallet " + _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup") + "\n"; + strUsage += " -sendfreetransactions " + strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0) + "\n"; strUsage += " -spendzeroconfchange " + strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1) + "\n"; strUsage += " -txconfirmtarget=<n> " + strprintf(_("If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)"), 1) + "\n"; strUsage += " -upgradewallet " + _("Upgrade wallet to latest format") + " " + _("on startup") + "\n"; @@ -319,7 +316,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += ".\n"; #ifdef ENABLE_WALLET strUsage += " -gen " + strprintf(_("Generate coins (default: %u)"), 0) + "\n"; - strUsage += " -genproclimit=<n> " + strprintf(_("Set the processor limit for when generation is on (-1 = unlimited, default: %d)"), -1) + "\n"; + strUsage += " -genproclimit=<n> " + strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1) + "\n"; #endif strUsage += " -help-debug " + _("Show all debugging options (usage: --help -help-debug)") + "\n"; strUsage += " -logips " + strprintf(_("Include IP addresses in debug output (default: %u)"), 0) + "\n"; @@ -346,6 +343,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += "\n" + _("Node relay options:") + "\n"; strUsage += " -datacarrier " + strprintf(_("Relay and mine data carrier transactions (default: %u)"), 1) + "\n"; + strUsage += " -datacarriersize " + strprintf(_("Maximum size of data in data carrier transactions we relay and mine (default: %u)"), MAX_OP_RETURN_RELAY) + "\n"; strUsage += "\n" + _("Block creation options:") + "\n"; strUsage += " -blockminsize=<n> " + strprintf(_("Set minimum block size in bytes (default: %u)"), 0) + "\n"; @@ -354,6 +352,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += "\n" + _("RPC server options:") + "\n"; strUsage += " -server " + _("Accept command line and JSON-RPC commands") + "\n"; + strUsage += " -rest " + strprintf(_("Accept public REST requests (default: %u)"), 0) + "\n"; strUsage += " -rpcbind=<addr> " + _("Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)") + "\n"; strUsage += " -rpcuser=<user> " + _("Username for JSON-RPC connections") + "\n"; strUsage += " -rpcpassword=<pw> " + _("Password for JSON-RPC connections") + "\n"; @@ -376,7 +375,7 @@ std::string LicenseInfo() "\n" + FormatParagraph(_("This is experimental software.")) + "\n" + "\n" + - FormatParagraph(_("Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.")) + "\n" + + FormatParagraph(_("Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.")) + "\n" + "\n" + FormatParagraph(_("This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.")) + "\n"; @@ -548,6 +547,10 @@ bool AppInit2(boost::thread_group& threadGroup) #endif // ********************************************************* Step 2: parameter interactions + // Set this early so that parameter interactions go to console + fPrintToConsole = GetBoolArg("-printtoconsole", false); + fLogTimestamps = GetBoolArg("-logtimestamps", true); + fLogIPs = GetBoolArg("-logips", false); if (mapArgs.count("-bind") || mapArgs.count("-whitebind")) { // when specifying an explicit binding address, you want to listen on it @@ -568,6 +571,9 @@ bool AppInit2(boost::thread_group& threadGroup) // to protect privacy, do not listen by default if a default proxy server is specified if (SoftSetBoolArg("-listen", false)) LogPrintf("AppInit2 : parameter interaction: -proxy set -> setting -listen=0\n"); + // to protect privacy, do not discover addresses by default + if (SoftSetBoolArg("-discover", false)) + LogPrintf("AppInit2 : parameter interaction: -proxy set -> setting -discover=0\n"); } if (!GetBoolArg("-listen", true)) { @@ -641,9 +647,6 @@ bool AppInit2(boost::thread_group& threadGroup) nScriptCheckThreads = MAX_SCRIPTCHECK_THREADS; fServer = GetBoolArg("-server", false); - fPrintToConsole = GetBoolArg("-printtoconsole", false); - fLogTimestamps = GetBoolArg("-logtimestamps", true); - fLogIPs = GetBoolArg("-logips", false); #ifdef ENABLE_WALLET bool fDisableWallet = GetBoolArg("-disablewallet", false); #endif @@ -698,11 +701,13 @@ bool AppInit2(boost::thread_group& threadGroup) } nTxConfirmTarget = GetArg("-txconfirmtarget", 1); bSpendZeroConfChange = GetArg("-spendzeroconfchange", true); + fSendFreeTransactions = GetArg("-sendfreetransactions", false); std::string strWalletFile = GetArg("-wallet", "wallet.dat"); #endif // ENABLE_WALLET fIsBareMultisigStd = GetArg("-permitbaremultisig", true) != 0; + nMaxDatacarrierBytes = GetArg("-datacarriersize", nMaxDatacarrierBytes); // ********************************************************* Step 4: application initialization: dir lock, daemonize, pidfile, debug log @@ -742,12 +747,23 @@ bool AppInit2(boost::thread_group& threadGroup) LogPrintf("Using at most %i connections (%i file descriptors available)\n", nMaxConnections, nFD); std::ostringstream strErrors; + LogPrintf("Using %u threads for script verification\n", nScriptCheckThreads); if (nScriptCheckThreads) { - LogPrintf("Using %u threads for script verification\n", nScriptCheckThreads); for (int i=0; i<nScriptCheckThreads-1; i++) threadGroup.create_thread(&ThreadScriptCheck); } + /* Start the RPC server already. It will be started in "warmup" mode + * and not really process calls already (but it will signify connections + * that the server is there and will be ready later). Warmup mode will + * be disabled when initialisation is finished. + */ + if (fServer) + { + uiInterface.InitMessage.connect(SetRPCWarmupStatus); + StartRPCThreads(); + } + int64_t nStart; // ********************************************************* Step 5: verify wallet database integrity @@ -834,10 +850,8 @@ bool AppInit2(boost::thread_group& threadGroup) if (!addrProxy.IsValid()) return InitError(strprintf(_("Invalid -proxy address: '%s'"), mapArgs["-proxy"])); - if (!IsLimited(NET_IPV4)) - SetProxy(NET_IPV4, addrProxy); - if (!IsLimited(NET_IPV6)) - SetProxy(NET_IPV6, addrProxy); + SetProxy(NET_IPV4, addrProxy); + SetProxy(NET_IPV6, addrProxy); SetNameProxy(addrProxy); fProxy = true; } @@ -1244,17 +1258,16 @@ bool AppInit2(boost::thread_group& threadGroup) #endif StartNode(threadGroup); - if (fServer) - StartRPCThreads(); #ifdef ENABLE_WALLET // Generate coins in the background if (pwalletMain) - GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", -1)); + GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", 1)); #endif // ********************************************************* Step 11: finished + SetRPCWarmupFinished(); uiInterface.InitMessage(_("Done loading")); #ifdef ENABLE_WALLET diff --git a/src/key.cpp b/src/key.cpp index 0f4bc6652c..a91ed1cc1d 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -1,27 +1,24 @@ // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "key.h" #include "crypto/sha2.h" +#include "eccryptoverify.h" +#include "pubkey.h" #include "random.h" -#ifdef USE_SECP256K1 #include <secp256k1.h> -#else #include "ecwrapper.h" -#endif -// anonymous namespace +//! anonymous namespace namespace { -#ifdef USE_SECP256K1 -#include <secp256k1.h> class CSecp256k1Init { public: CSecp256k1Init() { - secp256k1_start(); + secp256k1_start(SECP256K1_START_SIGN); } ~CSecp256k1Init() { secp256k1_stop(); @@ -29,61 +26,10 @@ public: }; static CSecp256k1Init instance_of_csecp256k1; -#endif - -int CompareBigEndian(const unsigned char *c1, size_t c1len, const unsigned char *c2, size_t c2len) { - while (c1len > c2len) { - if (*c1) - return 1; - c1++; - c1len--; - } - while (c2len > c1len) { - if (*c2) - return -1; - c2++; - c2len--; - } - while (c1len > 0) { - if (*c1 > *c2) - return 1; - if (*c2 > *c1) - return -1; - c1++; - c2++; - c1len--; - } - return 0; -} - -// Order of secp256k1's generator minus 1. -const unsigned char vchMaxModOrder[32] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, - 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, - 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 -}; - -// Half of the order of secp256k1's generator minus 1. -const unsigned char vchMaxModHalfOrder[32] = { - 0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x5D,0x57,0x6E,0x73,0x57,0xA4,0x50,0x1D, - 0xDF,0xE9,0x2F,0x46,0x68,0x1B,0x20,0xA0 -}; - -const unsigned char vchZero[1] = {0}; - } // anon namespace bool CKey::Check(const unsigned char *vch) { - return CompareBigEndian(vch, 32, vchZero, 0) > 0 && - CompareBigEndian(vch, 32, vchMaxModOrder, 32) <= 0; -} - -bool CKey::CheckSignatureElement(const unsigned char *vch, int len, bool half) { - return CompareBigEndian(vch, len, vchZero, 0) > 0 && - CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0; + return eccrypto::Check(vch); } void CKey::MakeNewKey(bool fCompressedIn) { @@ -95,15 +41,8 @@ void CKey::MakeNewKey(bool fCompressedIn) { } bool CKey::SetPrivKey(const CPrivKey &privkey, bool fCompressedIn) { -#ifdef USE_SECP256K1 - if (!secp256k1_ecdsa_privkey_import((unsigned char*)begin(), &privkey[0], privkey.size())) - return false; -#else - CECKey key; - if (!key.SetPrivKey(&privkey[0], privkey.size())) + if (!secp256k1_ec_privkey_import((unsigned char*)begin(), &privkey[0], privkey.size())) return false; - key.GetSecretBytes(vch); -#endif fCompressed = fCompressedIn; fValid = true; return true; @@ -113,47 +52,28 @@ CPrivKey CKey::GetPrivKey() const { assert(fValid); CPrivKey privkey; int privkeylen, ret; -#ifdef USE_SECP256K1 privkey.resize(279); privkeylen = 279; - ret = secp256k1_ecdsa_privkey_export(begin(), (unsigned char*)&privkey[0], &privkeylen, fCompressed); + ret = secp256k1_ec_privkey_export(begin(), (unsigned char*)&privkey[0], &privkeylen, fCompressed); assert(ret); privkey.resize(privkeylen); -#else - CECKey key; - key.SetSecretBytes(vch); - privkeylen = key.GetPrivKeySize(fCompressed); - assert(privkeylen); - privkey.resize(privkeylen); - ret = key.GetPrivKey(&privkey[0], fCompressed); - assert(ret == (int)privkey.size()); -#endif return privkey; } CPubKey CKey::GetPubKey() const { assert(fValid); CPubKey result; -#ifdef USE_SECP256K1 int clen = 65; - int ret = secp256k1_ecdsa_pubkey_create((unsigned char*)result.begin(), &clen, begin(), fCompressed); + int ret = secp256k1_ec_pubkey_create((unsigned char*)result.begin(), &clen, begin(), fCompressed); assert((int)result.size() == clen); assert(ret); -#else - std::vector<unsigned char> pubkey; - CECKey key; - key.SetSecretBytes(vch); - key.GetPubKey(pubkey, fCompressed); - result.Set(pubkey.begin(), pubkey.end()); -#endif assert(result.IsValid()); return result; } -bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, bool lowS) const { +bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig) const { if (!fValid) return false; -#ifdef USE_SECP256K1 vchSig.resize(72); int nSigLen = 72; CKey nonce; @@ -164,11 +84,20 @@ bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, bool lo } while(true); vchSig.resize(nSigLen); return true; -#else - CECKey key; - key.SetSecretBytes(vch); - return key.Sign(hash, vchSig, lowS); -#endif +} + +bool CKey::VerifyPubKey(const CPubKey& pubkey) const { + if (pubkey.IsCompressed() != fCompressed) { + return false; + } + unsigned char rnd[8]; + std::string str = "Bitcoin key verification\n"; + GetRandBytes(rnd, sizeof(rnd)); + uint256 hash; + CHash256().Write((unsigned char*)str.data(), str.size()).Write(rnd, sizeof(rnd)).Finalize((unsigned char*)&hash); + std::vector<unsigned char> vchSig; + Sign(hash, vchSig); + return pubkey.Verify(hash, vchSig); } bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig) const { @@ -176,126 +105,27 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig) return false; vchSig.resize(65); int rec = -1; -#ifdef USE_SECP256K1 CKey nonce; do { nonce.MakeNewKey(true); if (secp256k1_ecdsa_sign_compact((const unsigned char*)&hash, 32, &vchSig[1], begin(), nonce.begin(), &rec)) break; } while(true); -#else - CECKey key; - key.SetSecretBytes(vch); - if (!key.SignCompact(hash, &vchSig[1], rec)) - return false; -#endif assert(rec != -1); vchSig[0] = 27 + rec + (fCompressed ? 4 : 0); return true; } bool CKey::Load(CPrivKey &privkey, CPubKey &vchPubKey, bool fSkipCheck=false) { -#ifdef USE_SECP256K1 - if (!secp256k1_ecdsa_privkey_import((unsigned char*)begin(), &privkey[0], privkey.size())) - return false; -#else - CECKey key; - if (!key.SetPrivKey(&privkey[0], privkey.size(), fSkipCheck)) + if (!secp256k1_ec_privkey_import((unsigned char*)begin(), &privkey[0], privkey.size())) return false; - key.GetSecretBytes(vch); -#endif fCompressed = vchPubKey.IsCompressed(); fValid = true; if (fSkipCheck) return true; - if (GetPubKey() != vchPubKey) - return false; - - return true; -} - -bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) const { - if (!IsValid()) - return false; -#ifdef USE_SECP256K1 - if (secp256k1_ecdsa_verify((const unsigned char*)&hash, 32, &vchSig[0], vchSig.size(), begin(), size()) != 1) - return false; -#else - CECKey key; - if (!key.SetPubKey(begin(), size())) - return false; - if (!key.Verify(hash, vchSig)) - return false; -#endif - return true; -} - -bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector<unsigned char>& vchSig) { - if (vchSig.size() != 65) - return false; - int recid = (vchSig[0] - 27) & 3; - bool fComp = ((vchSig[0] - 27) & 4) != 0; -#ifdef USE_SECP256K1 - int pubkeylen = 65; - if (!secp256k1_ecdsa_recover_compact((const unsigned char*)&hash, 32, &vchSig[1], (unsigned char*)begin(), &pubkeylen, fComp, recid)) - return false; - assert((int)size() == pubkeylen); -#else - CECKey key; - if (!key.Recover(hash, &vchSig[1], recid)) - return false; - std::vector<unsigned char> pubkey; - key.GetPubKey(pubkey, fComp); - Set(pubkey.begin(), pubkey.end()); -#endif - return true; -} - -bool CPubKey::IsFullyValid() const { - if (!IsValid()) - return false; -#ifdef USE_SECP256K1 - if (!secp256k1_ecdsa_pubkey_verify(begin(), size())) - return false; -#else - CECKey key; - if (!key.SetPubKey(begin(), size())) - return false; -#endif - return true; -} - -bool CPubKey::Decompress() { - if (!IsValid()) - return false; -#ifdef USE_SECP256K1 - int clen = size(); - int ret = secp256k1_ecdsa_pubkey_decompress((unsigned char*)begin(), &clen); - assert(ret); - assert(clen == (int)size()); -#else - CECKey key; - if (!key.SetPubKey(begin(), size())) - return false; - std::vector<unsigned char> pubkey; - key.GetPubKey(pubkey, false); - Set(pubkey.begin(), pubkey.end()); -#endif - return true; -} - -void static BIP32Hash(const unsigned char chainCode[32], unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]) { - unsigned char num[4]; - num[0] = (nChild >> 24) & 0xFF; - num[1] = (nChild >> 16) & 0xFF; - num[2] = (nChild >> 8) & 0xFF; - num[3] = (nChild >> 0) & 0xFF; - CHMAC_SHA512(chainCode, 32).Write(&header, 1) - .Write(data, 32) - .Write(num, 4) - .Finalize(output); + return VerifyPubKey(vchPubKey); } bool CKey::Derive(CKey& keyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const { @@ -312,39 +142,14 @@ bool CKey::Derive(CKey& keyChild, unsigned char ccChild[32], unsigned int nChild BIP32Hash(cc, nChild, 0, begin(), out); } memcpy(ccChild, out+32, 32); -#ifdef USE_SECP256K1 memcpy((unsigned char*)keyChild.begin(), begin(), 32); - bool ret = secp256k1_ecdsa_privkey_tweak_add((unsigned char*)keyChild.begin(), out); -#else - bool ret = CECKey::TweakSecret((unsigned char*)keyChild.begin(), begin(), out); -#endif + bool ret = secp256k1_ec_privkey_tweak_add((unsigned char*)keyChild.begin(), out); UnlockObject(out); keyChild.fCompressed = true; keyChild.fValid = ret; return ret; } -bool CPubKey::Derive(CPubKey& pubkeyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const { - assert(IsValid()); - assert((nChild >> 31) == 0); - assert(begin() + 33 == end()); - unsigned char out[64]; - BIP32Hash(cc, nChild, *begin(), begin()+1, out); - memcpy(ccChild, out+32, 32); -#ifdef USE_SECP256K1 - pubkeyChild = *this; - bool ret = secp256k1_ecdsa_pubkey_tweak_add((unsigned char*)pubkeyChild.begin(), pubkeyChild.size(), out); -#else - CECKey key; - bool ret = key.SetPubKey(begin(), size()); - ret &= key.TweakPublic(out); - std::vector<unsigned char> pubkey; - key.GetPubKey(pubkey, true); - pubkeyChild.Set(pubkey.begin(), pubkey.end()); -#endif - return ret; -} - bool CExtKey::Derive(CExtKey &out, unsigned int nChild) const { out.nDepth = nDepth + 1; CKeyID id = key.GetPubKey().GetID(); @@ -395,36 +200,14 @@ void CExtKey::Decode(const unsigned char code[74]) { key.Set(code+42, code+74, true); } -void CExtPubKey::Encode(unsigned char code[74]) const { - code[0] = nDepth; - memcpy(code+1, vchFingerprint, 4); - code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF; - code[7] = (nChild >> 8) & 0xFF; code[8] = (nChild >> 0) & 0xFF; - memcpy(code+9, vchChainCode, 32); - assert(pubkey.size() == 33); - memcpy(code+41, pubkey.begin(), 33); -} - -void CExtPubKey::Decode(const unsigned char code[74]) { - nDepth = code[0]; - memcpy(vchFingerprint, code+1, 4); - nChild = (code[5] << 24) | (code[6] << 16) | (code[7] << 8) | code[8]; - memcpy(vchChainCode, code+9, 32); - pubkey.Set(code+41, code+74); -} - -bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const { - out.nDepth = nDepth + 1; - CKeyID id = pubkey.GetID(); - memcpy(&out.vchFingerprint[0], &id, 4); - out.nChild = nChild; - return pubkey.Derive(out.pubkey, out.vchChainCode, nChild, vchChainCode); -} - bool ECC_InitSanityCheck() { -#ifdef USE_SECP256K1 - return true; -#else - return CECKey::SanityCheck(); +#if !defined(USE_SECP256K1) + if (!CECKey::SanityCheck()) { + return false; + } #endif + CKey key; + key.MakeNewKey(true); + CPubKey pubkey = key.GetPubKey(); + return key.VerifyPubKey(pubkey); } @@ -1,219 +1,70 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_KEY_H #define BITCOIN_KEY_H #include "allocators.h" -#include "hash.h" #include "serialize.h" #include "uint256.h" #include <stdexcept> #include <vector> -// secp256k1: -// const unsigned int PRIVATE_KEY_SIZE = 279; -// const unsigned int PUBLIC_KEY_SIZE = 65; -// const unsigned int SIGNATURE_SIZE = 72; -// -// see www.keylength.com -// script supports up to 75 for single byte push +class CPubKey; -/** A reference to a CKey: the Hash160 of its serialized public key */ -class CKeyID : public uint160 -{ -public: - CKeyID() : uint160(0) {} - CKeyID(const uint160& in) : uint160(in) {} -}; - -/** An encapsulated public key. */ -class CPubKey -{ -private: - // Just store the serialized data. - // Its length can very cheaply be computed from the first byte. - unsigned char vch[65]; - - // Compute the length of a pubkey with a given first byte. - unsigned int static GetLen(unsigned char chHeader) - { - if (chHeader == 2 || chHeader == 3) - return 33; - if (chHeader == 4 || chHeader == 6 || chHeader == 7) - return 65; - return 0; - } - - // Set this key data to be invalid - void Invalidate() - { - vch[0] = 0xFF; - } - -public: - // Construct an invalid public key. - CPubKey() - { - Invalidate(); - } - - // Initialize a public key using begin/end iterators to byte data. - template <typename T> - void Set(const T pbegin, const T pend) - { - int len = pend == pbegin ? 0 : GetLen(pbegin[0]); - if (len && len == (pend - pbegin)) - memcpy(vch, (unsigned char*)&pbegin[0], len); - else - Invalidate(); - } - - // Construct a public key using begin/end iterators to byte data. - template <typename T> - CPubKey(const T pbegin, const T pend) - { - Set(pbegin, pend); - } - - // Construct a public key from a byte vector. - CPubKey(const std::vector<unsigned char>& vch) - { - Set(vch.begin(), vch.end()); - } - - // Simple read-only vector-like interface to the pubkey data. - unsigned int size() const { return GetLen(vch[0]); } - const unsigned char* begin() const { return vch; } - const unsigned char* end() const { return vch + size(); } - const unsigned char& operator[](unsigned int pos) const { return vch[pos]; } - - // Comparator implementation. - friend bool operator==(const CPubKey& a, const CPubKey& b) - { - return a.vch[0] == b.vch[0] && - memcmp(a.vch, b.vch, a.size()) == 0; - } - friend bool operator!=(const CPubKey& a, const CPubKey& b) - { - return !(a == b); - } - friend bool operator<(const CPubKey& a, const CPubKey& b) - { - return a.vch[0] < b.vch[0] || - (a.vch[0] == b.vch[0] && memcmp(a.vch, b.vch, a.size()) < 0); - } - - // Implement serialization, as if this was a byte vector. - unsigned int GetSerializeSize(int nType, int nVersion) const - { - return size() + 1; - } - template <typename Stream> - void Serialize(Stream& s, int nType, int nVersion) const - { - unsigned int len = size(); - ::WriteCompactSize(s, len); - s.write((char*)vch, len); - } - template <typename Stream> - void Unserialize(Stream& s, int nType, int nVersion) - { - unsigned int len = ::ReadCompactSize(s); - if (len <= 65) { - s.read((char*)vch, len); - } else { - // invalid pubkey, skip available data - char dummy; - while (len--) - s.read(&dummy, 1); - Invalidate(); - } - } - - // Get the KeyID of this public key (hash of its serialization) - CKeyID GetID() const - { - return CKeyID(Hash160(vch, vch + size())); - } - - // Get the 256-bit hash of this public key. - uint256 GetHash() const - { - return Hash(vch, vch + size()); - } - - // Check syntactic correctness. - // - // Note that this is consensus critical as CheckSig() calls it! - bool IsValid() const - { - return size() > 0; - } - - // fully validate whether this is a valid public key (more expensive than IsValid()) - bool IsFullyValid() const; - - // Check whether this is a compressed public key. - bool IsCompressed() const - { - return size() == 33; - } +struct CExtPubKey; - // Verify a DER signature (~72 bytes). - // If this public key is not fully valid, the return value will be false. - bool Verify(const uint256& hash, const std::vector<unsigned char>& vchSig) const; +/** + * secp256k1: + * const unsigned int PRIVATE_KEY_SIZE = 279; + * const unsigned int PUBLIC_KEY_SIZE = 65; + * const unsigned int SIGNATURE_SIZE = 72; + * + * see www.keylength.com + * script supports up to 75 for single byte push + */ - // Recover a public key from a compact signature. - bool RecoverCompact(const uint256& hash, const std::vector<unsigned char>& vchSig); - - // Turn this public key into an uncompressed public key. - bool Decompress(); - - // Derive BIP32 child pubkey. - bool Derive(CPubKey& pubkeyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const; -}; - - -// secure_allocator is defined in allocators.h -// CPrivKey is a serialized private key, with all parameters included (279 bytes) +/** + * secure_allocator is defined in allocators.h + * CPrivKey is a serialized private key, with all parameters included (279 bytes) + */ typedef std::vector<unsigned char, secure_allocator<unsigned char> > CPrivKey; /** An encapsulated private key. */ class CKey { private: - // Whether this private key is valid. We check for correctness when modifying the key - // data, so fValid should always correspond to the actual state. + //! Whether this private key is valid. We check for correctness when modifying the key + //! data, so fValid should always correspond to the actual state. bool fValid; - // Whether the public key corresponding to this private key is (to be) compressed. + //! Whether the public key corresponding to this private key is (to be) compressed. bool fCompressed; - // The actual byte data + //! The actual byte data unsigned char vch[32]; - // Check whether the 32-byte array pointed to be vch is valid keydata. + //! Check whether the 32-byte array pointed to be vch is valid keydata. bool static Check(const unsigned char* vch); public: - // Construct an invalid private key. + //! Construct an invalid private key. CKey() : fValid(false), fCompressed(false) { LockObject(vch); } - // Copy constructor. This is necessary because of memlocking. + //! Copy constructor. This is necessary because of memlocking. CKey(const CKey& secret) : fValid(secret.fValid), fCompressed(secret.fCompressed) { LockObject(vch); memcpy(vch, secret.vch, sizeof(vch)); } - // Destructor (again necessary because of memlocking). + //! Destructor (again necessary because of memlocking). ~CKey() { UnlockObject(vch); @@ -225,7 +76,7 @@ public: memcmp(&a.vch[0], &b.vch[0], a.size()) == 0; } - // Initialize using begin and end iterators to byte data. + //! Initialize using begin and end iterators to byte data. template <typename T> void Set(const T pbegin, const T pend, bool fCompressedIn) { @@ -242,69 +93,63 @@ public: } } - // Simple read-only vector-like interface. + //! Simple read-only vector-like interface. unsigned int size() const { return (fValid ? 32 : 0); } const unsigned char* begin() const { return vch; } const unsigned char* end() const { return vch + size(); } - // Check whether this private key is valid. + //! Check whether this private key is valid. bool IsValid() const { return fValid; } - // Check whether the public key corresponding to this private key is (to be) compressed. + //! Check whether the public key corresponding to this private key is (to be) compressed. bool IsCompressed() const { return fCompressed; } - // Initialize from a CPrivKey (serialized OpenSSL private key data). + //! Initialize from a CPrivKey (serialized OpenSSL private key data). bool SetPrivKey(const CPrivKey& vchPrivKey, bool fCompressed); - // Generate a new private key using a cryptographic PRNG. + //! Generate a new private key using a cryptographic PRNG. void MakeNewKey(bool fCompressed); - // Convert the private key to a CPrivKey (serialized OpenSSL private key data). - // This is expensive. + /** + * Convert the private key to a CPrivKey (serialized OpenSSL private key data). + * This is expensive. + */ CPrivKey GetPrivKey() const; - // Compute the public key from a private key. - // This is expensive. + /** + * Compute the public key from a private key. + * This is expensive. + */ CPubKey GetPubKey() const; - // Create a DER-serialized signature. - bool Sign(const uint256& hash, std::vector<unsigned char>& vchSig, bool lowS = true) const; + //! Create a DER-serialized signature. + bool Sign(const uint256& hash, std::vector<unsigned char>& vchSig) const; - // Create a compact signature (65 bytes), which allows reconstructing the used public key. - // The format is one header byte, followed by two times 32 bytes for the serialized r and s values. - // The header byte: 0x1B = first key with even y, 0x1C = first key with odd y, - // 0x1D = second key with even y, 0x1E = second key with odd y, - // add 0x04 for compressed keys. + /** + * Create a compact signature (65 bytes), which allows reconstructing the used public key. + * The format is one header byte, followed by two times 32 bytes for the serialized r and s values. + * The header byte: 0x1B = first key with even y, 0x1C = first key with odd y, + * 0x1D = second key with even y, 0x1E = second key with odd y, + * add 0x04 for compressed keys. + */ bool SignCompact(const uint256& hash, std::vector<unsigned char>& vchSig) const; - // Derive BIP32 child key. + //! Derive BIP32 child key. bool Derive(CKey& keyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const; - // Load private key and check that public key matches. + /** + * Verify thoroughly whether a private key and a public key match. + * This is done using a different mechanism than just regenerating it. + */ + bool VerifyPubKey(const CPubKey& vchPubKey) const; + + //! Load private key and check that public key matches. bool Load(CPrivKey& privkey, CPubKey& vchPubKey, bool fSkipCheck); - // Check whether an element of a signature (r or s) is valid. + //! Check whether an element of a signature (r or s) is valid. static bool CheckSignatureElement(const unsigned char* vch, int len, bool half); }; -struct CExtPubKey { - unsigned char nDepth; - unsigned char vchFingerprint[4]; - unsigned int nChild; - unsigned char vchChainCode[32]; - CPubKey pubkey; - - friend bool operator==(const CExtPubKey& a, const CExtPubKey& b) - { - return a.nDepth == b.nDepth && memcmp(&a.vchFingerprint[0], &b.vchFingerprint[0], 4) == 0 && a.nChild == b.nChild && - memcmp(&a.vchChainCode[0], &b.vchChainCode[0], 32) == 0 && a.pubkey == b.pubkey; - } - - void Encode(unsigned char code[74]) const; - void Decode(const unsigned char code[74]); - bool Derive(CExtPubKey& out, unsigned int nChild) const; -}; - struct CExtKey { unsigned char nDepth; unsigned char vchFingerprint[4]; diff --git a/src/keystore.cpp b/src/keystore.cpp index 039c690625..879f099720 100644 --- a/src/keystore.cpp +++ b/src/keystore.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "keystore.h" diff --git a/src/keystore.h b/src/keystore.h index 4f8189c8f5..60502e9a29 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -1,12 +1,13 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_KEYSTORE_H #define BITCOIN_KEYSTORE_H #include "key.h" +#include "pubkey.h" #include "sync.h" #include <boost/signals2/signal.hpp> @@ -24,22 +25,22 @@ protected: public: virtual ~CKeyStore() {} - // Add a key to the store. + //! Add a key to the store. virtual bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) =0; virtual bool AddKey(const CKey &key); - // Check whether a key corresponding to a given address is present in the store. + //! Check whether a key corresponding to a given address is present in the store. virtual bool HaveKey(const CKeyID &address) const =0; virtual bool GetKey(const CKeyID &address, CKey& keyOut) const =0; virtual void GetKeys(std::set<CKeyID> &setAddress) const =0; virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const; - // Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki + //! Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki virtual bool AddCScript(const CScript& redeemScript) =0; virtual bool HaveCScript(const CScriptID &hash) const =0; virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const =0; - // Support for Watch-only addresses + //! Support for Watch-only addresses virtual bool AddWatchOnly(const CScript &dest) =0; virtual bool RemoveWatchOnly(const CScript &dest) =0; virtual bool HaveWatchOnly(const CScript &dest) const =0; diff --git a/src/leveldbwrapper.cpp b/src/leveldbwrapper.cpp index 8ce3e7b470..70980fede5 100644 --- a/src/leveldbwrapper.cpp +++ b/src/leveldbwrapper.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2012-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "leveldbwrapper.h" @@ -7,6 +7,7 @@ #include "util.h" #include <boost/filesystem.hpp> + #include <leveldb/cache.h> #include <leveldb/env.h> #include <leveldb/filter_policy.h> diff --git a/src/leveldbwrapper.h b/src/leveldbwrapper.h index d997d56e00..42479206c8 100644 --- a/src/leveldbwrapper.h +++ b/src/leveldbwrapper.h @@ -1,10 +1,11 @@ -// Copyright (c) 2012-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_LEVELDBWRAPPER_H #define BITCOIN_LEVELDBWRAPPER_H +#include "clientversion.h" #include "serialize.h" #include "streams.h" #include "util.h" @@ -23,7 +24,7 @@ public: void HandleError(const leveldb::Status& status) throw(leveldb_error); -// Batch of changes queued to be written to a CLevelDBWrapper +/** Batch of changes queued to be written to a CLevelDBWrapper */ class CLevelDBBatch { friend class CLevelDBWrapper; @@ -63,25 +64,25 @@ public: class CLevelDBWrapper { private: - // custom environment this database is using (may be NULL in case of default environment) + //! custom environment this database is using (may be NULL in case of default environment) leveldb::Env* penv; - // database options used + //! database options used leveldb::Options options; - // options used when reading from the database + //! options used when reading from the database leveldb::ReadOptions readoptions; - // options used when iterating over values of the database + //! options used when iterating over values of the database leveldb::ReadOptions iteroptions; - // options used when writing to the database + //! options used when writing to the database leveldb::WriteOptions writeoptions; - // options used when sync writing to the database + //! options used when sync writing to the database leveldb::WriteOptions syncoptions; - // the database itself + //! the database itself leveldb::DB* pdb; public: diff --git a/src/main.cpp b/src/main.cpp index 0fd8065342..0a81d0d7b4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -128,6 +128,14 @@ namespace { }; map<uint256, pair<NodeId, list<QueuedBlock>::iterator> > mapBlocksInFlight; + // Number of preferrable block download peers. + int nPreferredDownload = 0; + + // Dirty block index entries. + set<CBlockIndex*> setDirtyBlockIndex; + + // Dirty block file entries. + set<int> setDirtyFileInfo; } // anon namespace ////////////////////////////////////////////////////////////////////////////// @@ -152,6 +160,8 @@ struct CMainSignals { boost::signals2::signal<void (const uint256 &)> Inventory; // Tells listeners to broadcast their data. boost::signals2::signal<void ()> Broadcast; + // Notifies listeners of a block validation result + boost::signals2::signal<void (const CBlock&, const CValidationState&)> BlockChecked; } g_signals; } // anon namespace @@ -163,9 +173,11 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn) { g_signals.SetBestChain.connect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1)); g_signals.Inventory.connect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1)); g_signals.Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn)); + g_signals.BlockChecked.connect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2)); } void UnregisterValidationInterface(CValidationInterface* pwalletIn) { + g_signals.BlockChecked.disconnect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2)); g_signals.Broadcast.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn)); g_signals.Inventory.disconnect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1)); g_signals.SetBestChain.disconnect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1)); @@ -175,6 +187,7 @@ void UnregisterValidationInterface(CValidationInterface* pwalletIn) { } void UnregisterAllValidationInterfaces() { + g_signals.BlockChecked.disconnect_all_slots(); g_signals.Broadcast.disconnect_all_slots(); g_signals.Inventory.disconnect_all_slots(); g_signals.SetBestChain.disconnect_all_slots(); @@ -225,6 +238,8 @@ struct CNodeState { int64_t nStallingSince; list<QueuedBlock> vBlocksInFlight; int nBlocksInFlight; + // Whether we consider this a preferred download peer. + bool fPreferredDownload; CNodeState() { nMisbehavior = 0; @@ -235,6 +250,7 @@ struct CNodeState { fSyncStarted = false; nStallingSince = 0; nBlocksInFlight = 0; + fPreferredDownload = false; } }; @@ -255,6 +271,16 @@ int GetHeight() return chainActive.Height(); } +void UpdatePreferredDownload(CNode* node, CNodeState* state) +{ + nPreferredDownload -= state->fPreferredDownload; + + // Whether this node should be marked as a preferred download node. + state->fPreferredDownload = (!node->fInbound || node->fWhitelisted) && !node->fOneShot && !node->fClient; + + nPreferredDownload += state->fPreferredDownload; +} + void InitializeNode(NodeId nodeid, const CNode *pnode) { LOCK(cs_main); CNodeState &state = mapNodeState.insert(std::make_pair(nodeid, CNodeState())).first->second; @@ -271,6 +297,7 @@ void FinalizeNode(NodeId nodeid) { BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight) mapBlocksInFlight.erase(entry.hash); EraseOrphansFor(nodeid); + nPreferredDownload -= state->fPreferredDownload; mapNodeState.erase(nodeid); } @@ -1116,11 +1143,6 @@ bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos) pos.nPos = (unsigned int)fileOutPos; fileout << block; - // Flush stdio buffers and commit to disk before returning - fflush(fileout.Get()); - if (!IsInitialBlockDownload()) - FileCommit(fileout.Get()); - return true; } @@ -1204,15 +1226,15 @@ void CheckForkWarningConditions() if (pindexBestForkTip && chainActive.Height() - pindexBestForkTip->nHeight >= 72) pindexBestForkTip = NULL; - if (pindexBestForkTip || (pindexBestInvalid && pindexBestInvalid->nChainWork > chainActive.Tip()->nChainWork + (chainActive.Tip()->GetBlockWork() * 6))) + if (pindexBestForkTip || (pindexBestInvalid && pindexBestInvalid->nChainWork > chainActive.Tip()->nChainWork + (GetBlockProof(*chainActive.Tip()) * 6))) { - if (!fLargeWorkForkFound) + if (!fLargeWorkForkFound && pindexBestForkBase) { std::string warning = std::string("'Warning: Large-work fork detected, forking after block ") + pindexBestForkBase->phashBlock->ToString() + std::string("'"); CAlert::Notify(warning, true); } - if (pindexBestForkTip) + if (pindexBestForkTip && pindexBestForkBase) { LogPrintf("CheckForkWarningConditions: Warning: Large valid fork found\n forking the chain at height %d (%s)\n lasting to height %d (%s).\nChain state database corruption likely.\n", pindexBestForkBase->nHeight, pindexBestForkBase->phashBlock->ToString(), @@ -1255,7 +1277,7 @@ void CheckForkWarningConditionsOnNewFork(CBlockIndex* pindexNewForkTip) // We define it this way because it allows us to only store the highest fork tip (+ base) which meets // the 7-block condition and from this always have the most-likely-to-cause-warning fork if (pfork && (!pindexBestForkTip || (pindexBestForkTip && pindexNewForkTip->nHeight > pindexBestForkTip->nHeight)) && - pindexNewForkTip->nChainWork - pfork->nChainWork > (pfork->GetBlockWork() * 7) && + pindexNewForkTip->nChainWork - pfork->nChainWork > (GetBlockProof(*pfork) * 7) && chainActive.Height() - pindexNewForkTip->nHeight < 72) { pindexBestForkTip = pindexNewForkTip; @@ -1313,7 +1335,7 @@ void static InvalidBlockFound(CBlockIndex *pindex, const CValidationState &state } if (!state.CorruptionPossible()) { pindex->nStatus |= BLOCK_FAILED_VALID; - pblocktree->WriteBlockIndex(CDiskBlockIndex(pindex)); + setDirtyBlockIndex.insert(pindex); setBlockIndexCandidates.erase(pindex); InvalidChainFound(pindex); } @@ -1571,7 +1593,7 @@ static int64_t nTimeIndex = 0; static int64_t nTimeCallbacks = 0; static int64_t nTimeTotal = 0; -bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck) +bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck) { AssertLockHeld(cs_main); // Check it again in case a previous version let a bad block in @@ -1710,10 +1732,7 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C } pindex->RaiseValidity(BLOCK_VALID_SCRIPTS); - - CDiskBlockIndex blockindex(pindex); - if (!pblocktree->WriteBlockIndex(blockindex)) - return state.Abort("Failed to write block index"); + setDirtyBlockIndex.insert(pindex); } if (fTxIndex) @@ -1737,10 +1756,23 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C return true; } -// Update the on-disk chain state. -bool static WriteChainState(CValidationState &state) { +enum FlushStateMode { + FLUSH_STATE_IF_NEEDED, + FLUSH_STATE_PERIODIC, + FLUSH_STATE_ALWAYS +}; + +/** + * Update the on-disk chain state. + * The caches and indexes are flushed if either they're too large, forceWrite is set, or + * fast is not set and it's been a while since the last write. + */ +bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) { + LOCK(cs_main); static int64_t nLastWrite = 0; - if (pcoinsTip->GetCacheSize() > nCoinCacheSize || (!IsInitialBlockDownload() && GetTimeMicros() > nLastWrite + 600*1000000)) { + if ((mode == FLUSH_STATE_ALWAYS) || + ((mode == FLUSH_STATE_PERIODIC || mode == FLUSH_STATE_IF_NEEDED) && pcoinsTip->GetCacheSize() > nCoinCacheSize) || + (mode == FLUSH_STATE_PERIODIC && GetTimeMicros() > nLastWrite + DATABASE_WRITE_INTERVAL * 1000000)) { // Typical CCoins structures on disk are around 100 bytes in size. // Pushing a new one to the database can cause it to be written // twice (once in the log, and once in the tables). This is already @@ -1748,15 +1780,44 @@ bool static WriteChainState(CValidationState &state) { // overwrite one. Still, use a conservative safety factor of 2. if (!CheckDiskSpace(100 * 2 * 2 * pcoinsTip->GetCacheSize())) return state.Error("out of disk space"); + // First make sure all block and undo data is flushed to disk. FlushBlockFile(); + // Then update all block file information (which may refer to block and undo files). + bool fileschanged = false; + for (set<int>::iterator it = setDirtyFileInfo.begin(); it != setDirtyFileInfo.end(); ) { + if (!pblocktree->WriteBlockFileInfo(*it, vinfoBlockFile[*it])) { + return state.Abort("Failed to write to block index"); + } + fileschanged = true; + setDirtyFileInfo.erase(it++); + } + if (fileschanged && !pblocktree->WriteLastBlockFile(nLastBlockFile)) { + return state.Abort("Failed to write to block index"); + } + for (set<CBlockIndex*>::iterator it = setDirtyBlockIndex.begin(); it != setDirtyBlockIndex.end(); ) { + if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(*it))) { + return state.Abort("Failed to write to block index"); + } + setDirtyBlockIndex.erase(it++); + } pblocktree->Sync(); + // Finally flush the chainstate (which may refer to block index entries). if (!pcoinsTip->Flush()) return state.Abort("Failed to write to coin database"); + // Update best block in wallet (so we can detect restored wallets). + if (mode != FLUSH_STATE_IF_NEEDED) { + g_signals.SetBestChain(chainActive.GetLocator()); + } nLastWrite = GetTimeMicros(); } return true; } +void FlushStateToDisk() { + CValidationState state; + FlushStateToDisk(state, FLUSH_STATE_ALWAYS); +} + // Update chainActive and related internal data structures. void static UpdateTip(CBlockIndex *pindexNew) { chainActive.SetTip(pindexNew); @@ -1815,7 +1876,7 @@ bool static DisconnectTip(CValidationState &state) { } LogPrint("bench", "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * 0.001); // Write the chain state to disk, if necessary. - if (!WriteChainState(state)) + if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) return false; // Resurrect mempool transactions from the disconnected block. BOOST_FOREACH(const CTransaction &tx, block.vtx) { @@ -1863,7 +1924,9 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * { CCoinsViewCache view(pcoinsTip); CInv inv(MSG_BLOCK, pindexNew->GetBlockHash()); - if (!ConnectBlock(*pblock, state, pindexNew, view)) { + bool rv = ConnectBlock(*pblock, state, pindexNew, view); + g_signals.BlockChecked(*pblock, state); + if (!rv) { if (state.IsInvalid()) InvalidBlockFound(pindexNew, state); return error("ConnectTip() : ConnectBlock %s failed", pindexNew->GetBlockHash().ToString()); @@ -1876,7 +1939,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * int64_t nTime4 = GetTimeMicros(); nTimeFlush += nTime4 - nTime3; LogPrint("bench", " - Flush: %.2fms [%.2fs]\n", (nTime4 - nTime3) * 0.001, nTimeFlush * 0.000001); // Write the chain state to disk, if necessary. - if (!WriteChainState(state)) + if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) return false; int64_t nTime5 = GetTimeMicros(); nTimeChainState += nTime5 - nTime4; LogPrint("bench", " - Writing chainstate: %.2fms [%.2fs]\n", (nTime5 - nTime4) * 0.001, nTimeChainState * 0.000001); @@ -1895,10 +1958,6 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * BOOST_FOREACH(const CTransaction &tx, pblock->vtx) { SyncWithWallets(tx, pblock); } - // Update best block in wallet (so we can detect restored wallets) - // Emit this signal after the SyncWithWallets signals as the wallet relies on that everything up to this point has been synced - if ((chainActive.Height() % 20160) == 0 || ((chainActive.Height() % 144) == 0 && !IsInitialBlockDownload())) - g_signals.SetBestChain(chainActive.GetLocator()); int64_t nTime6 = GetTimeMicros(); nTimePostConnect += nTime6 - nTime5; nTimeTotal += nTime6 - nTime1; LogPrint("bench", " - Connect postprocess: %.2fms [%.2fs]\n", (nTime6 - nTime5) * 0.001, nTimePostConnect * 0.000001); @@ -1948,6 +2007,18 @@ static CBlockIndex* FindMostWorkChain() { } while(true); } +// Delete all entries in setBlockIndexCandidates that are worse than the current tip. +static void PruneBlockIndexCandidates() { + // Note that we can't delete the current block itself, as we may need to return to it later in case a + // reorganization to a better block fails. + std::set<CBlockIndex*, CBlockIndexWorkComparator>::iterator it = setBlockIndexCandidates.begin(); + while (it != setBlockIndexCandidates.end() && setBlockIndexCandidates.value_comp()(*it, chainActive.Tip())) { + setBlockIndexCandidates.erase(it++); + } + // Either the current tip or a successor of it we're working towards is left in setBlockIndexCandidates. + assert(!setBlockIndexCandidates.empty()); +} + // Try to make some progress towards making pindexMostWork the active block. // pblock is either NULL or a pointer to a CBlock corresponding to pindexMostWork. static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMostWork, CBlock *pblock) { @@ -1995,15 +2066,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo return false; } } else { - // Delete all entries in setBlockIndexCandidates that are worse than our new current block. - // Note that we can't delete the current block itself, as we may need to return to it later in case a - // reorganization to a better block fails. - std::set<CBlockIndex*, CBlockIndexWorkComparator>::iterator it = setBlockIndexCandidates.begin(); - while (setBlockIndexCandidates.value_comp()(*it, chainActive.Tip())) { - setBlockIndexCandidates.erase(it++); - } - // Either the current tip or a successor of it we're working towards is left in setBlockIndexCandidates. - assert(!setBlockIndexCandidates.empty()); + PruneBlockIndexCandidates(); if (!pindexOldTip || chainActive.Tip()->nChainWork > pindexOldTip->nChainWork) { // We're in a better position than we were. Return temporarily to release the lock. fContinue = false; @@ -2019,9 +2082,6 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo else CheckForkWarningConditions(); - if (!pblocktree->Flush()) - return state.Abort("Failed to sync block index"); - return true; } @@ -2062,11 +2122,16 @@ bool ActivateBestChain(CValidationState &state, CBlock *pblock) { if (chainActive.Height() > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) pnode->PushInventory(CInv(MSG_BLOCK, hashNewTip)); } - + // Notify external listeners about the new tip. uiInterface.NotifyBlockTip(hashNewTip); } } while(pindexMostWork != chainActive.Tip()); + // Write changes periodically to disk, after relay. + if (!FlushStateToDisk(state, FLUSH_STATE_PERIODIC)) { + return false; + } + return true; } @@ -2094,13 +2159,12 @@ CBlockIndex* AddToBlockIndex(const CBlockHeader& block) pindexNew->nHeight = pindexNew->pprev->nHeight + 1; pindexNew->BuildSkip(); } - pindexNew->nChainWork = (pindexNew->pprev ? pindexNew->pprev->nChainWork : 0) + pindexNew->GetBlockWork(); + pindexNew->nChainWork = (pindexNew->pprev ? pindexNew->pprev->nChainWork : 0) + GetBlockProof(*pindexNew); pindexNew->RaiseValidity(BLOCK_VALID_TREE); if (pindexBestHeader == NULL || pindexBestHeader->nChainWork < pindexNew->nChainWork) pindexBestHeader = pindexNew; - // Ok if it fails, we'll download the header again next time. - pblocktree->WriteBlockIndex(CDiskBlockIndex(pindexNew)); + setDirtyBlockIndex.insert(pindexNew); return pindexNew; } @@ -2119,6 +2183,7 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl LOCK(cs_nBlockSequenceId); pindexNew->nSequenceId = nBlockSequenceId++; } + setDirtyBlockIndex.insert(pindexNew); if (pindexNew->pprev == NULL || pindexNew->pprev->nChainTx) { // If pindexNew is the genesis block or all parents are BLOCK_VALID_TRANSACTIONS. @@ -2138,15 +2203,11 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl range.first++; mapBlocksUnlinked.erase(it); } - if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindex))) - return state.Abort("Failed to write block index"); } } else { if (pindexNew->pprev && pindexNew->pprev->IsValid(BLOCK_VALID_TREE)) { mapBlocksUnlinked.insert(std::make_pair(pindexNew->pprev, pindexNew)); } - if (!pblocktree->WriteBlockIndex(CDiskBlockIndex(pindexNew))) - return state.Abort("Failed to write block index"); } return true; @@ -2154,8 +2215,6 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAddSize, unsigned int nHeight, uint64_t nTime, bool fKnown = false) { - bool fUpdatedLast = false; - LOCK(cs_LastBlockFile); unsigned int nFile = fKnown ? pos.nFile : nLastBlockFile; @@ -2171,7 +2230,6 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd if (vinfoBlockFile.size() <= nFile) { vinfoBlockFile.resize(nFile + 1); } - fUpdatedLast = true; } pos.nFile = nFile; pos.nPos = vinfoBlockFile[nFile].nSize; @@ -2198,11 +2256,7 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd } } - if (!pblocktree->WriteBlockFileInfo(nLastBlockFile, vinfoBlockFile[nFile])) - return state.Abort("Failed to write file info"); - if (fUpdatedLast) - pblocktree->WriteLastBlockFile(nLastBlockFile); - + setDirtyFileInfo.insert(nFile); return true; } @@ -2215,9 +2269,7 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne unsigned int nNewSize; pos.nPos = vinfoBlockFile[nFile].nUndoSize; nNewSize = vinfoBlockFile[nFile].nUndoSize += nAddSize; - if (!pblocktree->WriteBlockFileInfo(nLastBlockFile, vinfoBlockFile[nLastBlockFile])) { - return state.Abort("Failed to write block info"); - } + setDirtyFileInfo.insert(nFile); unsigned int nOldChunks = (pos.nPos + UNDOFILE_CHUNK_SIZE - 1) / UNDOFILE_CHUNK_SIZE; unsigned int nNewChunks = (nNewSize + UNDOFILE_CHUNK_SIZE - 1) / UNDOFILE_CHUNK_SIZE; @@ -2256,6 +2308,8 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo { // These are checks that are independent of context. + // Check that the header is valid (particularly PoW). This is mostly + // redundant with the call in AcceptBlockHeader. if (!CheckBlockHeader(block, state, fCheckPOW)) return false; @@ -2310,6 +2364,73 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo return true; } +bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex * const pindexPrev) +{ + uint256 hash = block.GetHash(); + if (hash == Params().HashGenesisBlock()) + return true; + + assert(pindexPrev); + + int nHeight = pindexPrev->nHeight+1; + + // Check proof of work + if ((!Params().SkipProofOfWorkCheck()) && + (block.nBits != GetNextWorkRequired(pindexPrev, &block))) + return state.DoS(100, error("%s : incorrect proof of work", __func__), + REJECT_INVALID, "bad-diffbits"); + + // Check timestamp against prev + if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast()) + return state.Invalid(error("%s : block's timestamp is too early", __func__), + REJECT_INVALID, "time-too-old"); + + // Check that the block chain matches the known block chain up to a checkpoint + if (!Checkpoints::CheckBlock(nHeight, hash)) + return state.DoS(100, error("%s : rejected by checkpoint lock-in at %d", __func__, nHeight), + REJECT_CHECKPOINT, "checkpoint mismatch"); + + // Don't accept any forks from the main chain prior to last checkpoint + CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(); + if (pcheckpoint && nHeight < pcheckpoint->nHeight) + return state.DoS(100, error("%s : forked chain older than last checkpoint (height %d)", __func__, nHeight)); + + // Reject block.nVersion=1 blocks when 95% (75% on testnet) of the network has upgraded: + if (block.nVersion < 2 && + CBlockIndex::IsSuperMajority(2, pindexPrev, Params().RejectBlockOutdatedMajority())) + { + return state.Invalid(error("%s : rejected nVersion=1 block", __func__), + REJECT_OBSOLETE, "bad-version"); + } + + return true; +} + +bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIndex * const pindexPrev) +{ + const int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1; + + // Check that all transactions are finalized + BOOST_FOREACH(const CTransaction& tx, block.vtx) + if (!IsFinalTx(tx, nHeight, block.GetBlockTime())) { + return state.DoS(10, error("%s : contains a non-final transaction", __func__), REJECT_INVALID, "bad-txns-nonfinal"); + } + + // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height + // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet): + if (block.nVersion >= 2 && + CBlockIndex::IsSuperMajority(2, pindexPrev, Params().EnforceBlockUpgradeMajority())) + { + CScript expect = CScript() << nHeight; + if (block.vtx[0].vin[0].scriptSig.size() < expect.size() || + !std::equal(expect.begin(), expect.end(), block.vtx[0].vin[0].scriptSig.begin())) { + return state.DoS(100, error("%s : block height mismatch in coinbase", __func__), REJECT_INVALID, "bad-cb-height"); + } + } + + return true; +} + bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex** ppindex) { AssertLockHeld(cs_main); @@ -2327,46 +2448,21 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc return true; } + if (!CheckBlockHeader(block, state)) + return false; + // Get prev block index CBlockIndex* pindexPrev = NULL; - int nHeight = 0; if (hash != Params().HashGenesisBlock()) { BlockMap::iterator mi = mapBlockIndex.find(block.hashPrevBlock); if (mi == mapBlockIndex.end()) return state.DoS(10, error("%s : prev block not found", __func__), 0, "bad-prevblk"); pindexPrev = (*mi).second; - nHeight = pindexPrev->nHeight+1; - - // Check proof of work - if ((!Params().SkipProofOfWorkCheck()) && - (block.nBits != GetNextWorkRequired(pindexPrev, &block))) - return state.DoS(100, error("%s : incorrect proof of work", __func__), - REJECT_INVALID, "bad-diffbits"); - - // Check timestamp against prev - if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast()) - return state.Invalid(error("%s : block's timestamp is too early", __func__), - REJECT_INVALID, "time-too-old"); - - // Check that the block chain matches the known block chain up to a checkpoint - if (!Checkpoints::CheckBlock(nHeight, hash)) - return state.DoS(100, error("%s : rejected by checkpoint lock-in at %d", __func__, nHeight), - REJECT_CHECKPOINT, "checkpoint mismatch"); - - // Don't accept any forks from the main chain prior to last checkpoint - CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(); - if (pcheckpoint && nHeight < pcheckpoint->nHeight) - return state.DoS(100, error("%s : forked chain older than last checkpoint (height %d)", __func__, nHeight)); - - // Reject block.nVersion=1 blocks when 95% (75% on testnet) of the network has upgraded: - if (block.nVersion < 2 && - CBlockIndex::IsSuperMajority(2, pindexPrev, Params().RejectBlockOutdatedMajority())) - { - return state.Invalid(error("%s : rejected nVersion=1 block", __func__), - REJECT_OBSOLETE, "bad-version"); - } } + if (!ContextualCheckBlockHeader(block, state, pindexPrev)) + return false; + if (pindex == NULL) pindex = AddToBlockIndex(block); @@ -2391,36 +2487,16 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, return true; } - if (!CheckBlock(block, state)) { + if ((!CheckBlock(block, state)) || !ContextualCheckBlock(block, state, pindex->pprev)) { if (state.IsInvalid() && !state.CorruptionPossible()) { pindex->nStatus |= BLOCK_FAILED_VALID; + setDirtyBlockIndex.insert(pindex); } return false; } int nHeight = pindex->nHeight; - // Check that all transactions are finalized - BOOST_FOREACH(const CTransaction& tx, block.vtx) - if (!IsFinalTx(tx, nHeight, block.GetBlockTime())) { - pindex->nStatus |= BLOCK_FAILED_VALID; - return state.DoS(10, error("AcceptBlock() : contains a non-final transaction"), - REJECT_INVALID, "bad-txns-nonfinal"); - } - - // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height - // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet): - if (block.nVersion >= 2 && - CBlockIndex::IsSuperMajority(2, pindex->pprev, Params().EnforceBlockUpgradeMajority())) - { - CScript expect = CScript() << nHeight; - if (block.vtx[0].vin[0].scriptSig.size() < expect.size() || - !std::equal(expect.begin(), expect.end(), block.vtx[0].vin[0].scriptSig.begin())) { - pindex->nStatus |= BLOCK_FAILED_VALID; - return state.DoS(100, error("AcceptBlock() : block height mismatch in coinbase"), REJECT_INVALID, "bad-cb-height"); - } - } - // Write block to history file try { unsigned int nBlockSize = ::GetSerializeSize(block, SER_DISK, CLIENT_VERSION); @@ -2503,7 +2579,7 @@ void CBlockIndex::BuildSkip() pskip = pprev->GetAncestor(GetSkipHeight(nHeight)); } -bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBlockPos *dbp) +bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBlockPos *dbp) { // Preliminary checks bool checked = CheckBlock(*pblock, state); @@ -2512,7 +2588,7 @@ bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBl LOCK(cs_main); MarkBlockAsReceived(pblock->GetHash()); if (!checked) { - return error("ProcessBlock() : CheckBlock FAILED"); + return error("%s : CheckBlock FAILED", __func__); } // Store to disk @@ -2522,11 +2598,35 @@ bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBl mapBlockSource[pindex->GetBlockHash()] = pfrom->GetId(); } if (!ret) - return error("ProcessBlock() : AcceptBlock FAILED"); + return error("%s : AcceptBlock FAILED", __func__); } if (!ActivateBestChain(state, pblock)) - return error("ProcessBlock() : ActivateBestChain failed"); + return error("%s : ActivateBestChain failed", __func__); + + return true; +} + +bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex * const pindexPrev, bool fCheckPOW, bool fCheckMerkleRoot) +{ + AssertLockHeld(cs_main); + assert(pindexPrev == chainActive.Tip()); + + CCoinsViewCache viewNew(pcoinsTip); + CBlockIndex indexDummy(block); + indexDummy.pprev = pindexPrev; + indexDummy.nHeight = pindexPrev->nHeight + 1; + + // NOTE: CheckBlockHeader is called by CheckBlock + if (!ContextualCheckBlockHeader(block, state, pindexPrev)) + return false; + if (!CheckBlock(block, state, fCheckPOW, fCheckMerkleRoot)) + return false; + if (!ContextualCheckBlock(block, state, pindexPrev)) + return false; + if (!ConnectBlock(block, state, &indexDummy, viewNew, true)) + return false; + assert(state.IsValid()); return true; } @@ -2787,7 +2887,7 @@ bool static LoadBlockIndexDB() BOOST_FOREACH(const PAIRTYPE(int, CBlockIndex*)& item, vSortedByHeight) { CBlockIndex* pindex = item.second; - pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) + pindex->GetBlockWork(); + pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) + GetBlockProof(*pindex); if (pindex->nStatus & BLOCK_HAVE_DATA) { if (pindex->pprev) { if (pindex->pprev->nChainTx) { @@ -2859,6 +2959,9 @@ bool static LoadBlockIndexDB() if (it == mapBlockIndex.end()) return true; chainActive.SetTip(it->second); + + PruneBlockIndexCandidates(); + LogPrintf("LoadBlockIndexDB(): hashBestChain=%s height=%d date=%s progress=%f\n", chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), @@ -2998,6 +3101,8 @@ bool InitBlockIndex() { return error("LoadBlockIndex() : genesis block not accepted"); if (!ActivateBestChain(state, &block)) return error("LoadBlockIndex() : genesis block cannot be activated"); + // Force a chainstate write so that when we VerifyDB in a moment, it doesnt check stale data + return FlushStateToDisk(state, FLUSH_STATE_ALWAYS); } catch(std::runtime_error &e) { return error("LoadBlockIndex() : failed to initialize block database: %s", e.what()); } @@ -3133,12 +3238,14 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp) } // process in case the block isn't known yet - if (mapBlockIndex.count(hash) == 0) { + if (mapBlockIndex.count(hash) == 0 || (mapBlockIndex[hash]->nStatus & BLOCK_HAVE_DATA) == 0) { CValidationState state; - if (ProcessBlock(state, NULL, &block, dbp)) + if (ProcessNewBlock(state, NULL, &block, dbp)) nLoaded++; if (state.IsError()) break; + } else if (hash != Params().HashGenesisBlock() && mapBlockIndex[hash]->nHeight % 1000 == 0) { + LogPrintf("Block Import: already had block %s at height %d\n", hash.ToString(), mapBlockIndex[hash]->nHeight); } // Recursively process earlier encountered successors of this block @@ -3155,7 +3262,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp) LogPrintf("%s: Processing out of order child %s of %s\n", __func__, block.GetHash().ToString(), head.ToString()); CValidationState dummy; - if (ProcessBlock(dummy, NULL, &block, &it->second)) + if (ProcessNewBlock(dummy, NULL, &block, &it->second)) { nLoaded++; queue.push_back(block.GetHash()); @@ -3188,12 +3295,12 @@ string GetWarnings(string strFor) string strStatusBar; string strRPC; - if (GetBoolArg("-testsafemode", false)) - strRPC = "test"; - if (!CLIENT_VERSION_IS_RELEASE) strStatusBar = _("This is a pre-release test build - use at your own risk - do not use for mining or merchant applications"); + if (GetBoolArg("-testsafemode", false)) + strStatusBar = strRPC = "testsafemode enabled"; + // Misc warnings like out of disk space and clock is wrong if (strMiscWarning != "") { @@ -3450,12 +3557,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, else pfrom->fRelayTxes = true; - if (pfrom->fInbound && addrMe.IsRoutable()) - { - pfrom->addrLocal = addrMe; - SeenLocal(addrMe); - } - // Disconnect if we connected to ourself if (nNonce == nLocalHostNonce && nNonce > 1) { @@ -3464,12 +3565,20 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, return true; } + pfrom->addrLocal = addrMe; + if (pfrom->fInbound && addrMe.IsRoutable()) + { + SeenLocal(addrMe); + } + // Be shy and don't send version until we hear if (pfrom->fInbound) pfrom->PushVersion(); pfrom->fClient = !(pfrom->nServices & NODE_NETWORK); + // Potentially mark this peer as a preferred download peer. + UpdatePreferredDownload(pfrom, State(pfrom->GetId())); // Change version pfrom->PushMessage("verack"); @@ -3482,7 +3591,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { CAddress addr = GetLocalAddress(&pfrom->addr); if (addr.IsRoutable()) + { + pfrom->PushAddress(addr); + } else if (IsPeerAddrLocalGood(pfrom)) { + addr.SetIP(pfrom->addrLocal); pfrom->PushAddress(addr); + } } // Get recent addresses @@ -3933,7 +4047,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, pfrom->AddInventoryKnown(inv); CValidationState state; - ProcessBlock(state, pfrom, &block); + ProcessNewBlock(state, pfrom, &block); int nDoS; if (state.IsInvalid(nDoS)) { pfrom->PushMessage("reject", strCommand, state.GetRejectCode(), @@ -4345,24 +4459,18 @@ bool SendMessages(CNode* pto, bool fSendTrickle) static int64_t nLastRebroadcast; if (!IsInitialBlockDownload() && (GetTime() - nLastRebroadcast > 24 * 60 * 60)) { + LOCK(cs_vNodes); + BOOST_FOREACH(CNode* pnode, vNodes) { - LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) - { - // Periodically clear setAddrKnown to allow refresh broadcasts - if (nLastRebroadcast) - pnode->setAddrKnown.clear(); + // Periodically clear setAddrKnown to allow refresh broadcasts + if (nLastRebroadcast) + pnode->setAddrKnown.clear(); - // Rebroadcast our address - if (fListen) - { - CAddress addr = GetLocalAddress(&pnode->addr); - if (addr.IsRoutable()) - pnode->PushAddress(addr); - } - } + // Rebroadcast our address + AdvertizeLocal(pnode); } - nLastRebroadcast = GetTime(); + if (!vNodes.empty()) + nLastRebroadcast = GetTime(); } // @@ -4414,7 +4522,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) // Start block sync if (pindexBestHeader == NULL) pindexBestHeader = chainActive.Tip(); - bool fFetch = !pto->fInbound || (pindexBestHeader && (state.pindexLastCommonBlock ? state.pindexLastCommonBlock->nHeight : 0) + 144 > pindexBestHeader->nHeight); + bool fFetch = state.fPreferredDownload || (nPreferredDownload == 0 && !pto->fClient && !pto->fOneShot); // Download if this is a nice peer, or we have no nice peers and this one might do. if (!state.fSyncStarted && !pto->fClient && fFetch && !fImporting && !fReindex) { // Only actively request headers from a single peer, unless we're close to today. if (nSyncStarted == 0 || pindexBestHeader->GetBlockTime() > GetAdjustedTime() - 24 * 60 * 60) { @@ -4565,11 +4673,6 @@ bool CBlockUndo::WriteToDisk(CDiskBlockPos &pos, const uint256 &hashBlock) hasher << *this; fileout << hasher.GetHash(); - // Flush stdio buffers and commit to disk before returning - fflush(fileout.Get()); - if (!IsInitialBlockDownload()) - FileCommit(fileout.Get()); - return true; } diff --git a/src/main.h b/src/main.h index 1941ca7059..c0d6412528 100644 --- a/src/main.h +++ b/src/main.h @@ -39,8 +39,15 @@ #include <boost/unordered_map.hpp> class CBlockIndex; +class CBlockTreeDB; class CBloomFilter; class CInv; +class CScriptCheck; +class CValidationInterface; +class CValidationState; + +struct CBlockTemplate; +struct CNodeStateStats; /** The maximum allowed size for a serialized block, in bytes (network rule) */ static const unsigned int MAX_BLOCK_SIZE = 1000000; @@ -87,6 +94,8 @@ static const unsigned int MAX_HEADERS_RESULTS = 2000; * degree of disordering of blocks on disk (which make reindexing and in the future perhaps pruning * harder). We'll probably want to make this a per-peer adaptive value at some point. */ static const unsigned int BLOCK_DOWNLOAD_WINDOW = 1024; +/** Time to wait (in seconds) between writing blockchain state to disk. */ +static const unsigned int DATABASE_WRITE_INTERVAL = 3600; /** "reject" message codes **/ static const unsigned char REJECT_MALFORMED = 0x01; @@ -128,15 +137,6 @@ extern CBlockIndex *pindexBestHeader; // Minimum disk space required - used in CheckDiskSpace() static const uint64_t nMinDiskSpace = 52428800; - -class CBlockTreeDB; -class CScriptCheck; -class CValidationState; -class CValidationInterface; -struct CNodeStateStats; - -struct CBlockTemplate; - /** Register a wallet to receive updates from core */ void RegisterValidationInterface(CValidationInterface* pwalletIn); /** Unregister a wallet from core */ @@ -151,8 +151,16 @@ void RegisterNodeSignals(CNodeSignals& nodeSignals); /** Unregister a network node */ void UnregisterNodeSignals(CNodeSignals& nodeSignals); -/** Process an incoming block */ -bool ProcessBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBlockPos *dbp = NULL); +/** Process an incoming block. This only returns after the best known valid + block is made active. Note that it does not, however, guarantee that the + specific block passed to it has been checked for validity! + @param[out] state This may be set to an Error state if any error occurred processing it, including during validation/connection/etc of otherwise unrelated blocks during reorganisation; or it may be set to an Invalid state iff pblock is itself invalid (but this is not guaranteed even when the block is checked). If you want to *possibly* get feedback on whether pblock is valid, you must also install a CValidationInterface - this will have its BlockChecked method called whenever *any* block completes validation. + @param[in] pfrom The node which we are receiving the block from; it is added to mapBlockSource and may be penalised if the block is invalid. + @param[in] pblock The block we want to process. + @param[out] dbp If pblock is stored to disk (or already there), this will be set to its location. + @return True if state.IsValid() +*/ +bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBlockPos *dbp = NULL); /** Check whether enough disk space is available for an incoming block */ bool CheckDiskSpace(uint64_t nAdditionalBytes = 0); /** Open a block file (blk?????.dat) */ @@ -195,6 +203,8 @@ bool AbortNode(const std::string &msg, const std::string &userMessage=""); bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats); /** Increase a node's misbehavior score. */ void Misbehaving(NodeId nodeid, int howmuch); +/** Flush all state, indexes and buffers to disk. */ +void FlushStateToDisk(); /** (try to) add transaction to memory pool **/ @@ -451,12 +461,19 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex); bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool* pfClean = NULL); // Apply the effects of this block (with given index) on the UTXO set represented by coins -bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck = false); +bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck = false); // Context-independent validity checks bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW = true); bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW = true, bool fCheckMerkleRoot = true); +// Context-dependent validity checks +bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex *pindexPrev); +bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIndex *pindexPrev); + +// Check a block is completely valid from start to finish (only works on top of our current best block, with cs_main held) +bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex *pindexPrev, bool fCheckPOW = true, bool fCheckMerkleRoot = true); + // Store block on disk // if dbp is provided, the file is known to already reside on disk bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex **pindex, CDiskBlockPos* dbp = NULL); @@ -651,6 +668,7 @@ protected: virtual void UpdatedTransaction(const uint256 &hash) {}; virtual void Inventory(const uint256 &hash) {}; virtual void ResendWalletTransactions() {}; + virtual void BlockChecked(const CBlock&, const CValidationState&) {}; friend void ::RegisterValidationInterface(CValidationInterface*); friend void ::UnregisterValidationInterface(CValidationInterface*); friend void ::UnregisterAllValidationInterfaces(); diff --git a/src/miner.cpp b/src/miner.cpp index 0235de3ab3..660173f35b 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -12,6 +12,7 @@ #include "main.h" #include "net.h" #include "pow.h" +#include "timedata.h" #include "util.h" #include "utilmoneystr.h" #ifdef ENABLE_WALLET @@ -78,6 +79,15 @@ public: } }; +void UpdateTime(CBlockHeader* pblock, const CBlockIndex* pindexPrev) +{ + pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + + // Updating time can change work required on testnet: + if (Params().AllowMinDifficultyBlocks()) + pblock->nBits = GetNextWorkRequired(pindexPrev, pblock); +} + CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { // Create new block @@ -124,6 +134,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { LOCK2(cs_main, mempool.cs); CBlockIndex* pindexPrev = chainActive.Tip(); + const int nHeight = pindexPrev->nHeight + 1; CCoinsViewCache view(pcoinsTip); // Priority order to process transactions @@ -138,7 +149,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) mi != mempool.mapTx.end(); ++mi) { const CTransaction& tx = mi->second.GetTx(); - if (tx.IsCoinBase() || !IsFinalTx(tx, pindexPrev->nHeight + 1)) + if (tx.IsCoinBase() || !IsFinalTx(tx, nHeight)) continue; COrphan* porphan = NULL; @@ -181,7 +192,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) CAmount nValueIn = coins->vout[txin.prevout.n].nValue; nTotalIn += nValueIn; - int nConf = pindexPrev->nHeight - coins->nHeight + 1; + int nConf = nHeight - coins->nHeight; dPriority += (double)nValueIn * nConf; } @@ -269,7 +280,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) continue; CTxUndo txundo; - UpdateCoins(tx, state, view, txundo, pindexPrev->nHeight+1); + UpdateCoins(tx, state, view, txundo, nHeight); // Added pblock->vtx.push_back(tx); @@ -309,8 +320,8 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize); // Compute final coinbase transaction. - txNew.vout[0].nValue = GetBlockValue(pindexPrev->nHeight+1, nFees); - txNew.vin[0].scriptSig = CScript() << OP_0 << OP_0; + txNew.vout[0].nValue = GetBlockValue(nHeight, nFees); + txNew.vin[0].scriptSig = CScript() << nHeight << OP_0; pblock->vtx[0] = txNew; pblocktemplate->vTxFees[0] = -nFees; @@ -321,13 +332,9 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) pblock->nNonce = 0; pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]); - CBlockIndex indexDummy(*pblock); - indexDummy.pprev = pindexPrev; - indexDummy.nHeight = pindexPrev->nHeight + 1; - CCoinsViewCache viewNew(pcoinsTip); CValidationState state; - if (!ConnectBlock(*pblock, state, &indexDummy, viewNew, true)) - throw std::runtime_error("CreateNewBlock() : ConnectBlock failed"); + if (!TestBlockValidity(state, *pblock, pindexPrev, false, false)) + throw std::runtime_error("CreateNewBlock() : TestBlockValidity failed"); } return pblocktemplate.release(); @@ -428,8 +435,8 @@ bool ProcessBlockFound(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey) // Process this block the same as if we had received it from another node CValidationState state; - if (!ProcessBlock(state, NULL, pblock)) - return error("BitcoinMiner : ProcessBlock, block not accepted"); + if (!ProcessNewBlock(state, NULL, pblock)) + return error("BitcoinMiner : ProcessNewBlock, block not accepted"); return true; } diff --git a/src/miner.h b/src/miner.h index 1fa499dc5b..aede0e6d4b 100644 --- a/src/miner.h +++ b/src/miner.h @@ -9,6 +9,7 @@ #include <stdint.h> class CBlock; +class CBlockHeader; class CBlockIndex; class CReserveKey; class CScript; @@ -25,6 +26,7 @@ CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey); void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& nExtraNonce); /** Check mined block */ bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey); +void UpdateTime(CBlockHeader* block, const CBlockIndex* pindexPrev); extern double dHashesPerSec; extern int64_t nHPSTimerStart; diff --git a/src/net.cpp b/src/net.cpp index 6cccdca952..6bf72d22c5 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -11,6 +11,7 @@ #include "addrman.h" #include "chainparams.h" +#include "clientversion.h" #include "core/transaction.h" #include "ui_interface.h" @@ -141,16 +142,19 @@ bool GetLocal(CService& addr, const CNetAddr *paddrPeer) } // get best local address for a particular peer as a CAddress +// Otherwise, return the unroutable 0.0.0.0 but filled in with +// the normal parameters, since the IP may be changed to a useful +// one by discovery. CAddress GetLocalAddress(const CNetAddr *paddrPeer) { - CAddress ret(CService("0.0.0.0",0),0); + CAddress ret(CService("0.0.0.0",GetListenPort()),0); CService addr; if (GetLocal(addr, paddrPeer)) { ret = CAddress(addr); - ret.nServices = nLocalServices; - ret.nTime = GetAdjustedTime(); } + ret.nServices = nLocalServices; + ret.nTime = GetAdjustedTime(); return ret; } @@ -204,21 +208,38 @@ bool RecvLine(SOCKET hSocket, string& strLine) } } -// used when scores of local addresses may have changed -// pushes better local address to peers -void static AdvertizeLocal() +int GetnScore(const CService& addr) { - LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) + LOCK(cs_mapLocalHost); + if (mapLocalHost.count(addr) == LOCAL_NONE) + return 0; + return mapLocalHost[addr].nScore; +} + +// Is our peer's addrLocal potentially useful as an external IP source? +bool IsPeerAddrLocalGood(CNode *pnode) +{ + return fDiscover && pnode->addr.IsRoutable() && pnode->addrLocal.IsRoutable() && + !IsLimited(pnode->addrLocal.GetNetwork()); +} + +// pushes our own address to a peer +void AdvertizeLocal(CNode *pnode) +{ + if (fListen && pnode->fSuccessfullyConnected) { - if (pnode->fSuccessfullyConnected) + CAddress addrLocal = GetLocalAddress(&pnode->addr); + // If discovery is enabled, sometimes give our peer the address it + // tells us that it sees us as in case it has a better idea of our + // address than we do. + if (IsPeerAddrLocalGood(pnode) && (!addrLocal.IsRoutable() || + GetRand((GetnScore(addrLocal) > LOCAL_MANUAL) ? 8:2) == 0)) { - CAddress addrLocal = GetLocalAddress(&pnode->addr); - if (addrLocal.IsRoutable() && (CService)addrLocal != (CService)pnode->addrLocal) - { - pnode->PushAddress(addrLocal); - pnode->addrLocal = addrLocal; - } + addrLocal.SetIP(pnode->addrLocal); + } + if (addrLocal.IsRoutable()) + { + pnode->PushAddress(addrLocal); } } } @@ -256,8 +277,6 @@ bool AddLocal(const CService& addr, int nScore) SetReachable(addr.GetNetwork()); } - AdvertizeLocal(); - return true; } @@ -295,12 +314,10 @@ bool SeenLocal(const CService& addr) return false; mapLocalHost[addr].nScore++; } - - AdvertizeLocal(); - return true; } + /** check whether a given address is potentially local */ bool IsLocal(const CService& addr) { @@ -322,114 +339,12 @@ bool IsReachable(const CNetAddr& addr) return IsReachable(net); } -bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const char* pszKeyword, CNetAddr& ipRet) -{ - SOCKET hSocket; - if (!ConnectSocket(addrConnect, hSocket)) - return error("GetMyExternalIP() : connection to %s failed", addrConnect.ToString()); - - send(hSocket, pszGet, strlen(pszGet), MSG_NOSIGNAL); - - string strLine; - while (RecvLine(hSocket, strLine)) - { - if (strLine.empty()) // HTTP response is separated from headers by blank line - { - while (true) - { - if (!RecvLine(hSocket, strLine)) - { - CloseSocket(hSocket); - return false; - } - if (pszKeyword == NULL) - break; - if (strLine.find(pszKeyword) != string::npos) - { - strLine = strLine.substr(strLine.find(pszKeyword) + strlen(pszKeyword)); - break; - } - } - CloseSocket(hSocket); - if (strLine.find("<") != string::npos) - strLine = strLine.substr(0, strLine.find("<")); - strLine = strLine.substr(strspn(strLine.c_str(), " \t\n\r")); - while (strLine.size() > 0 && isspace(strLine[strLine.size()-1])) - strLine.resize(strLine.size()-1); - CService addr(strLine,0,true); - LogPrintf("GetMyExternalIP() received [%s] %s\n", strLine, addr.ToString()); - if (!addr.IsValid() || !addr.IsRoutable()) - return false; - ipRet.SetIP(addr); - return true; - } - } - CloseSocket(hSocket); - return error("GetMyExternalIP() : connection closed"); -} - -bool GetMyExternalIP(CNetAddr& ipRet) -{ - CService addrConnect; - const char* pszGet; - const char* pszKeyword; - - for (int nLookup = 0; nLookup <= 1; nLookup++) - for (int nHost = 1; nHost <= 1; nHost++) - { - // We should be phasing out our use of sites like these. If we need - // replacements, we should ask for volunteers to put this simple - // php file on their web server that prints the client IP: - // <?php echo $_SERVER["REMOTE_ADDR"]; ?> - if (nHost == 1) - { - addrConnect = CService("91.198.22.70", 80); // checkip.dyndns.org - - if (nLookup == 1) - { - CService addrIP("checkip.dyndns.org", 80, true); - if (addrIP.IsValid()) - addrConnect = addrIP; - } - - pszGet = "GET / HTTP/1.1\r\n" - "Host: checkip.dyndns.org\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n" - "Connection: close\r\n" - "\r\n"; - - pszKeyword = "Address:"; - } - - if (GetMyExternalIP2(addrConnect, pszGet, pszKeyword, ipRet)) - return true; - } - - return false; -} - -void ThreadGetMyExternalIP() -{ - CNetAddr addrLocalHost; - if (GetMyExternalIP(addrLocalHost)) - { - LogPrintf("GetMyExternalIP() returned %s\n", addrLocalHost.ToStringIP()); - AddLocal(addrLocalHost, LOCAL_HTTP); - } -} - - - - - void AddressCurrentlyConnected(const CService& addr) { addrman.Connected(addr); } - - uint64_t CNode::nTotalBytesRecv = 0; uint64_t CNode::nTotalBytesSent = 0; CCriticalSection CNode::cs_totalBytesRecv; @@ -1644,7 +1559,7 @@ void static Discover(boost::thread_group& threadGroup) #ifdef WIN32 // Get local host IP - char pszHostName[1000] = ""; + char pszHostName[256] = ""; if (gethostname(pszHostName, sizeof(pszHostName)) != SOCKET_ERROR) { vector<CNetAddr> vaddr; @@ -1652,7 +1567,8 @@ void static Discover(boost::thread_group& threadGroup) { BOOST_FOREACH (const CNetAddr &addr, vaddr) { - AddLocal(addr, LOCAL_IF); + if (AddLocal(addr, LOCAL_IF)) + LogPrintf("%s: %s - %s\n", __func__, pszHostName, addr.ToString()); } } } @@ -1672,23 +1588,19 @@ void static Discover(boost::thread_group& threadGroup) struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr); CNetAddr addr(s4->sin_addr); if (AddLocal(addr, LOCAL_IF)) - LogPrintf("IPv4 %s: %s\n", ifa->ifa_name, addr.ToString()); + LogPrintf("%s: IPv4 %s: %s\n", __func__, ifa->ifa_name, addr.ToString()); } else if (ifa->ifa_addr->sa_family == AF_INET6) { struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr); CNetAddr addr(s6->sin6_addr); if (AddLocal(addr, LOCAL_IF)) - LogPrintf("IPv6 %s: %s\n", ifa->ifa_name, addr.ToString()); + LogPrintf("%s: IPv6 %s: %s\n", __func__, ifa->ifa_name, addr.ToString()); } } freeifaddrs(myaddrs); } #endif - - // Don't use external IPv4 discovery, when -onlynet="IPv6" - if (!IsLimited(NET_IPV4)) - threadGroup.create_thread(boost::bind(&TraceThread<void (*)()>, "ext-ip", &ThreadGetMyExternalIP)); } void StartNode(boost::thread_group& threadGroup) @@ -60,7 +60,6 @@ unsigned int SendBufferSize(); void AddOneShot(std::string strDest); bool RecvLine(SOCKET hSocket, std::string& strLine); -bool GetMyExternalIP(CNetAddr& ipRet); void AddressCurrentlyConnected(const CService& addr); CNode* FindNode(const CNetAddr& ip); CNode* FindNode(const std::string& addrName); @@ -96,12 +95,13 @@ enum LOCAL_IF, // address a local interface listens on LOCAL_BIND, // address explicit bound to LOCAL_UPNP, // address reported by UPnP - LOCAL_HTTP, // address reported by whatismyip.com and similar LOCAL_MANUAL, // address explicitly specified (-externalip=) LOCAL_MAX }; +bool IsPeerAddrLocalGood(CNode *pnode); +void AdvertizeLocal(CNode *pnode); void SetLimited(enum Network net, bool fLimited = true); bool IsLimited(enum Network net); bool IsLimited(const CNetAddr& addr); diff --git a/src/netbase.cpp b/src/netbase.cpp index b3d1001547..ea05b8766f 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -667,11 +667,28 @@ bool CNetAddr::IsRFC1918() const (GetByte(3) == 172 && (GetByte(2) >= 16 && GetByte(2) <= 31))); } +bool CNetAddr::IsRFC2544() const +{ + return IsIPv4() && GetByte(3) == 198 && (GetByte(2) == 18 || GetByte(2) == 19); +} + bool CNetAddr::IsRFC3927() const { return IsIPv4() && (GetByte(3) == 169 && GetByte(2) == 254); } +bool CNetAddr::IsRFC6598() const +{ + return IsIPv4() && GetByte(3) == 100 && GetByte(2) >= 64 && GetByte(2) <= 127; +} + +bool CNetAddr::IsRFC5737() const +{ + return IsIPv4() && ((GetByte(3) == 192 && GetByte(2) == 0 && GetByte(1) == 2) || + (GetByte(3) == 198 && GetByte(2) == 51 && GetByte(1) == 100) || + (GetByte(3) == 203 && GetByte(2) == 0 && GetByte(1) == 113)); +} + bool CNetAddr::IsRFC3849() const { return GetByte(15) == 0x20 && GetByte(14) == 0x01 && GetByte(13) == 0x0D && GetByte(12) == 0xB8; @@ -778,7 +795,7 @@ bool CNetAddr::IsValid() const bool CNetAddr::IsRoutable() const { - return IsValid() && !(IsRFC1918() || IsRFC3927() || IsRFC4862() || (IsRFC4193() && !IsTor()) || IsRFC4843() || IsLocal()); + return IsValid() && !(IsRFC1918() || IsRFC2544() || IsRFC3927() || IsRFC4862() || IsRFC6598() || IsRFC5737() || (IsRFC4193() && !IsTor()) || IsRFC4843() || IsLocal()); } enum Network CNetAddr::GetNetwork() const diff --git a/src/netbase.h b/src/netbase.h index 1455cd8c33..9d8697dcc6 100644 --- a/src/netbase.h +++ b/src/netbase.h @@ -61,6 +61,9 @@ class CNetAddr bool IsIPv4() const; // IPv4 mapped address (::FFFF:0:0/96, 0.0.0.0/0) bool IsIPv6() const; // IPv6 address (not mapped IPv4, not Tor) bool IsRFC1918() const; // IPv4 private networks (10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12) + bool IsRFC2544() const; // IPv4 inter-network communcations (192.18.0.0/15) + bool IsRFC6598() const; // IPv4 ISP-level NAT (100.64.0.0/10) + bool IsRFC5737() const; // IPv4 documentation addresses (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) bool IsRFC3849() const; // IPv6 documentation address (2001:0DB8::/32) bool IsRFC3927() const; // IPv4 autoconfig (169.254.0.0/16) bool IsRFC3964() const; // IPv6 6to4 tunnelling (2002::/16) diff --git a/src/pow.cpp b/src/pow.cpp index af7fc488ef..e07e7ff770 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -5,10 +5,9 @@ #include "pow.h" +#include "chain.h" #include "chainparams.h" #include "core/block.h" -#include "main.h" -#include "timedata.h" #include "uint256.h" #include "util.h" @@ -98,21 +97,12 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits) return true; } -void UpdateTime(CBlockHeader* pblock, const CBlockIndex* pindexPrev) -{ - pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - - // Updating time can change work required on testnet: - if (Params().AllowMinDifficultyBlocks()) - pblock->nBits = GetNextWorkRequired(pindexPrev, pblock); -} - -uint256 GetProofIncrement(unsigned int nBits) +uint256 GetBlockProof(const CBlockIndex& block) { uint256 bnTarget; bool fNegative; bool fOverflow; - bnTarget.SetCompact(nBits, &fNegative, &fOverflow); + bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); if (fNegative || fOverflow || bnTarget == 0) return 0; // We need to compute 2**256 / (bnTarget+1), but we can't represent 2**256 @@ -16,9 +16,6 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead /** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */ bool CheckProofOfWork(uint256 hash, unsigned int nBits); - -void UpdateTime(CBlockHeader* block, const CBlockIndex* pindexPrev); - -uint256 GetProofIncrement(unsigned int nBits); +uint256 GetBlockProof(const CBlockIndex& block); #endif // BITCOIN_POW_H diff --git a/src/protocol.h b/src/protocol.h index b73041a9fd..2ac8f3d8f7 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -7,8 +7,8 @@ #error This header can only be compiled as C++. #endif -#ifndef __INCLUDED_PROTOCOL_H__ -#define __INCLUDED_PROTOCOL_H__ +#ifndef BITCOIN_PROTOCOL_H +#define BITCOIN_PROTOCOL_H #include "netbase.h" #include "serialize.h" @@ -149,4 +149,4 @@ enum { MSG_FILTERED_BLOCK, }; -#endif // __INCLUDED_PROTOCOL_H__ +#endif // BITCOIN_PROTOCOL_H diff --git a/src/pubkey.cpp b/src/pubkey.cpp new file mode 100644 index 0000000000..9c6f536f21 --- /dev/null +++ b/src/pubkey.cpp @@ -0,0 +1,131 @@ +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "pubkey.h" + +#include "crypto/sha2.h" +#include "eccryptoverify.h" + +#ifdef USE_SECP256K1 +#include <secp256k1.h> +#else +#include "ecwrapper.h" +#endif + +bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) const { + if (!IsValid()) + return false; +#ifdef USE_SECP256K1 + if (secp256k1_ecdsa_verify((const unsigned char*)&hash, 32, &vchSig[0], vchSig.size(), begin(), size()) != 1) + return false; +#else + CECKey key; + if (!key.SetPubKey(begin(), size())) + return false; + if (!key.Verify(hash, vchSig)) + return false; +#endif + return true; +} + +bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector<unsigned char>& vchSig) { + if (vchSig.size() != 65) + return false; + int recid = (vchSig[0] - 27) & 3; + bool fComp = ((vchSig[0] - 27) & 4) != 0; +#ifdef USE_SECP256K1 + int pubkeylen = 65; + if (!secp256k1_ecdsa_recover_compact((const unsigned char*)&hash, 32, &vchSig[1], (unsigned char*)begin(), &pubkeylen, fComp, recid)) + return false; + assert((int)size() == pubkeylen); +#else + CECKey key; + if (!key.Recover(hash, &vchSig[1], recid)) + return false; + std::vector<unsigned char> pubkey; + key.GetPubKey(pubkey, fComp); + Set(pubkey.begin(), pubkey.end()); +#endif + return true; +} + +bool CPubKey::IsFullyValid() const { + if (!IsValid()) + return false; +#ifdef USE_SECP256K1 + if (!secp256k1_ecdsa_pubkey_verify(begin(), size())) + return false; +#else + CECKey key; + if (!key.SetPubKey(begin(), size())) + return false; +#endif + return true; +} + +bool CPubKey::Decompress() { + if (!IsValid()) + return false; +#ifdef USE_SECP256K1 + int clen = size(); + int ret = secp256k1_ecdsa_pubkey_decompress((unsigned char*)begin(), &clen); + assert(ret); + assert(clen == (int)size()); +#else + CECKey key; + if (!key.SetPubKey(begin(), size())) + return false; + std::vector<unsigned char> pubkey; + key.GetPubKey(pubkey, false); + Set(pubkey.begin(), pubkey.end()); +#endif + return true; +} + +bool CPubKey::Derive(CPubKey& pubkeyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const { + assert(IsValid()); + assert((nChild >> 31) == 0); + assert(begin() + 33 == end()); + unsigned char out[64]; + BIP32Hash(cc, nChild, *begin(), begin()+1, out); + memcpy(ccChild, out+32, 32); +#ifdef USE_SECP256K1 + pubkeyChild = *this; + bool ret = secp256k1_ecdsa_pubkey_tweak_add((unsigned char*)pubkeyChild.begin(), pubkeyChild.size(), out); +#else + CECKey key; + bool ret = key.SetPubKey(begin(), size()); + ret &= key.TweakPublic(out); + std::vector<unsigned char> pubkey; + key.GetPubKey(pubkey, true); + pubkeyChild.Set(pubkey.begin(), pubkey.end()); +#endif + return ret; +} + +void CExtPubKey::Encode(unsigned char code[74]) const { + code[0] = nDepth; + memcpy(code+1, vchFingerprint, 4); + code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF; + code[7] = (nChild >> 8) & 0xFF; code[8] = (nChild >> 0) & 0xFF; + memcpy(code+9, vchChainCode, 32); + assert(pubkey.size() == 33); + memcpy(code+41, pubkey.begin(), 33); +} + +void CExtPubKey::Decode(const unsigned char code[74]) { + nDepth = code[0]; + memcpy(vchFingerprint, code+1, 4); + nChild = (code[5] << 24) | (code[6] << 16) | (code[7] << 8) | code[8]; + memcpy(vchChainCode, code+9, 32); + pubkey.Set(code+41, code+74); +} + +bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const { + out.nDepth = nDepth + 1; + CKeyID id = pubkey.GetID(); + memcpy(&out.vchFingerprint[0], &id, 4); + out.nChild = nChild; + return pubkey.Derive(out.pubkey, out.vchChainCode, nChild, vchChainCode); +} diff --git a/src/pubkey.h b/src/pubkey.h new file mode 100644 index 0000000000..37351cff0e --- /dev/null +++ b/src/pubkey.h @@ -0,0 +1,206 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_PUBKEY_H +#define BITCOIN_PUBKEY_H + +#include "hash.h" +#include "serialize.h" +#include "uint256.h" + +#include <stdexcept> +#include <vector> + +/** + * secp256k1: + * const unsigned int PRIVATE_KEY_SIZE = 279; + * const unsigned int PUBLIC_KEY_SIZE = 65; + * const unsigned int SIGNATURE_SIZE = 72; + * + * see www.keylength.com + * script supports up to 75 for single byte push + */ + +/** A reference to a CKey: the Hash160 of its serialized public key */ +class CKeyID : public uint160 +{ +public: + CKeyID() : uint160(0) {} + CKeyID(const uint160& in) : uint160(in) {} +}; + +/** An encapsulated public key. */ +class CPubKey +{ +private: + + /** + * Just store the serialized data. + * Its length can very cheaply be computed from the first byte. + */ + unsigned char vch[65]; + + //! Compute the length of a pubkey with a given first byte. + unsigned int static GetLen(unsigned char chHeader) + { + if (chHeader == 2 || chHeader == 3) + return 33; + if (chHeader == 4 || chHeader == 6 || chHeader == 7) + return 65; + return 0; + } + + //! Set this key data to be invalid + void Invalidate() + { + vch[0] = 0xFF; + } + +public: + //! Construct an invalid public key. + CPubKey() + { + Invalidate(); + } + + //! Initialize a public key using begin/end iterators to byte data. + template <typename T> + void Set(const T pbegin, const T pend) + { + int len = pend == pbegin ? 0 : GetLen(pbegin[0]); + if (len && len == (pend - pbegin)) + memcpy(vch, (unsigned char*)&pbegin[0], len); + else + Invalidate(); + } + + //! Construct a public key using begin/end iterators to byte data. + template <typename T> + CPubKey(const T pbegin, const T pend) + { + Set(pbegin, pend); + } + + //! Construct a public key from a byte vector. + CPubKey(const std::vector<unsigned char>& vch) + { + Set(vch.begin(), vch.end()); + } + + //! Simple read-only vector-like interface to the pubkey data. + unsigned int size() const { return GetLen(vch[0]); } + const unsigned char* begin() const { return vch; } + const unsigned char* end() const { return vch + size(); } + const unsigned char& operator[](unsigned int pos) const { return vch[pos]; } + + //! Comparator implementation. + friend bool operator==(const CPubKey& a, const CPubKey& b) + { + return a.vch[0] == b.vch[0] && + memcmp(a.vch, b.vch, a.size()) == 0; + } + friend bool operator!=(const CPubKey& a, const CPubKey& b) + { + return !(a == b); + } + friend bool operator<(const CPubKey& a, const CPubKey& b) + { + return a.vch[0] < b.vch[0] || + (a.vch[0] == b.vch[0] && memcmp(a.vch, b.vch, a.size()) < 0); + } + + //! Implement serialization, as if this was a byte vector. + unsigned int GetSerializeSize(int nType, int nVersion) const + { + return size() + 1; + } + template <typename Stream> + void Serialize(Stream& s, int nType, int nVersion) const + { + unsigned int len = size(); + ::WriteCompactSize(s, len); + s.write((char*)vch, len); + } + template <typename Stream> + void Unserialize(Stream& s, int nType, int nVersion) + { + unsigned int len = ::ReadCompactSize(s); + if (len <= 65) { + s.read((char*)vch, len); + } else { + // invalid pubkey, skip available data + char dummy; + while (len--) + s.read(&dummy, 1); + Invalidate(); + } + } + + //! Get the KeyID of this public key (hash of its serialization) + CKeyID GetID() const + { + return CKeyID(Hash160(vch, vch + size())); + } + + //! Get the 256-bit hash of this public key. + uint256 GetHash() const + { + return Hash(vch, vch + size()); + } + + /* + * Check syntactic correctness. + * + * Note that this is consensus critical as CheckSig() calls it! + */ + bool IsValid() const + { + return size() > 0; + } + + //! fully validate whether this is a valid public key (more expensive than IsValid()) + bool IsFullyValid() const; + + //! Check whether this is a compressed public key. + bool IsCompressed() const + { + return size() == 33; + } + + /** + * Verify a DER signature (~72 bytes). + * If this public key is not fully valid, the return value will be false. + */ + bool Verify(const uint256& hash, const std::vector<unsigned char>& vchSig) const; + + //! Recover a public key from a compact signature. + bool RecoverCompact(const uint256& hash, const std::vector<unsigned char>& vchSig); + + //! Turn this public key into an uncompressed public key. + bool Decompress(); + + //! Derive BIP32 child pubkey. + bool Derive(CPubKey& pubkeyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const; +}; + +struct CExtPubKey { + unsigned char nDepth; + unsigned char vchFingerprint[4]; + unsigned int nChild; + unsigned char vchChainCode[32]; + CPubKey pubkey; + + friend bool operator==(const CExtPubKey& a, const CExtPubKey& b) + { + return a.nDepth == b.nDepth && memcmp(&a.vchFingerprint[0], &b.vchFingerprint[0], 4) == 0 && a.nChild == b.nChild && + memcmp(&a.vchChainCode[0], &b.vchChainCode[0], 32) == 0 && a.pubkey == b.pubkey; + } + + void Encode(unsigned char code[74]) const; + void Decode(const unsigned char code[74]); + bool Derive(CExtPubKey& out, unsigned int nChild) const; +}; + +#endif // BITCOIN_PUBKEY_H diff --git a/src/qt/addressbookpage.h b/src/qt/addressbookpage.h index 20beb51ec4..031c424785 100644 --- a/src/qt/addressbookpage.h +++ b/src/qt/addressbookpage.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef ADDRESSBOOKPAGE_H -#define ADDRESSBOOKPAGE_H +#ifndef BITCOIN_QT_ADDRESSBOOKPAGE_H +#define BITCOIN_QT_ADDRESSBOOKPAGE_H #include <QDialog> @@ -84,4 +84,4 @@ signals: void sendCoins(QString addr); }; -#endif // ADDRESSBOOKPAGE_H +#endif // BITCOIN_QT_ADDRESSBOOKPAGE_H diff --git a/src/qt/addresstablemodel.h b/src/qt/addresstablemodel.h index 71691f5a26..310647d7c3 100644 --- a/src/qt/addresstablemodel.h +++ b/src/qt/addresstablemodel.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef ADDRESSTABLEMODEL_H -#define ADDRESSTABLEMODEL_H +#ifndef BITCOIN_QT_ADDRESSTABLEMODEL_H +#define BITCOIN_QT_ADDRESSTABLEMODEL_H #include <QAbstractTableModel> #include <QStringList> @@ -92,4 +92,4 @@ public slots: friend class AddressTablePriv; }; -#endif // ADDRESSTABLEMODEL_H +#endif // BITCOIN_QT_ADDRESSTABLEMODEL_H diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp index a448d5a9a0..fa9ac6b135 100644 --- a/src/qt/askpassphrasedialog.cpp +++ b/src/qt/askpassphrasedialog.cpp @@ -23,6 +23,10 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : { ui->setupUi(this); + ui->passEdit1->setMinimumSize(ui->passEdit1->sizeHint()); + ui->passEdit2->setMinimumSize(ui->passEdit2->sizeHint()); + ui->passEdit3->setMinimumSize(ui->passEdit3->sizeHint()); + ui->passEdit1->setMaxLength(MAX_PASSPHRASE_SIZE); ui->passEdit2->setMaxLength(MAX_PASSPHRASE_SIZE); ui->passEdit3->setMaxLength(MAX_PASSPHRASE_SIZE); @@ -35,9 +39,9 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : switch(mode) { case Encrypt: // Ask passphrase x2 + ui->warningLabel->setText(tr("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>.")); ui->passLabel1->hide(); ui->passEdit1->hide(); - ui->warningLabel->setText(tr("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>.")); setWindowTitle(tr("Encrypt wallet")); break; case Unlock: // Ask passphrase @@ -61,7 +65,6 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : ui->warningLabel->setText(tr("Enter the old and new passphrase to the wallet.")); break; } - textChanged(); connect(ui->passEdit1, SIGNAL(textChanged(QString)), this, SLOT(textChanged())); connect(ui->passEdit2, SIGNAL(textChanged(QString)), this, SLOT(textChanged())); diff --git a/src/qt/askpassphrasedialog.h b/src/qt/askpassphrasedialog.h index 1119e0861f..6605086060 100644 --- a/src/qt/askpassphrasedialog.h +++ b/src/qt/askpassphrasedialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef ASKPASSPHRASEDIALOG_H -#define ASKPASSPHRASEDIALOG_H +#ifndef BITCOIN_QT_ASKPASSPHRASEDIALOG_H +#define BITCOIN_QT_ASKPASSPHRASEDIALOG_H #include <QDialog> @@ -48,4 +48,4 @@ protected: bool eventFilter(QObject *object, QEvent *event); }; -#endif // ASKPASSPHRASEDIALOG_H +#endif // BITCOIN_QT_ASKPASSPHRASEDIALOG_H diff --git a/src/qt/bitcoinaddressvalidator.h b/src/qt/bitcoinaddressvalidator.h index 0fb779f7d8..15a6245da4 100644 --- a/src/qt/bitcoinaddressvalidator.h +++ b/src/qt/bitcoinaddressvalidator.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOINADDRESSVALIDATOR_H -#define BITCOINADDRESSVALIDATOR_H +#ifndef BITCOIN_QT_BITCOINADDRESSVALIDATOR_H +#define BITCOIN_QT_BITCOINADDRESSVALIDATOR_H #include <QValidator> @@ -32,4 +32,4 @@ public: State validate(QString &input, int &pos) const; }; -#endif // BITCOINADDRESSVALIDATOR_H +#endif // BITCOIN_QT_BITCOINADDRESSVALIDATOR_H diff --git a/src/qt/bitcoinamountfield.cpp b/src/qt/bitcoinamountfield.cpp index 6e35bf17b3..5b8ab23b26 100644 --- a/src/qt/bitcoinamountfield.cpp +++ b/src/qt/bitcoinamountfield.cpp @@ -130,6 +130,7 @@ public: extra += hint - style()->subControlRect(QStyle::CC_SpinBox, &opt, QStyle::SC_SpinBoxEditField, this).size(); hint += extra; + hint.setHeight(h); opt.rect = rect(); @@ -220,6 +221,12 @@ void BitcoinAmountField::clear() unit->setCurrentIndex(0); } +void BitcoinAmountField::setEnabled(bool fEnabled) +{ + amount->setEnabled(fEnabled); + unit->setEnabled(fEnabled); +} + bool BitcoinAmountField::validate() { bool valid = false; diff --git a/src/qt/bitcoinamountfield.h b/src/qt/bitcoinamountfield.h index 040a234177..1bad8ce1b8 100644 --- a/src/qt/bitcoinamountfield.h +++ b/src/qt/bitcoinamountfield.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOINAMOUNTFIELD_H -#define BITCOINAMOUNTFIELD_H +#ifndef BITCOIN_QT_BITCOINAMOUNTFIELD_H +#define BITCOIN_QT_BITCOINAMOUNTFIELD_H #include "amount.h" @@ -48,6 +48,9 @@ public: /** Make field empty and ready for new input. */ void clear(); + /** Enable/Disable. */ + void setEnabled(bool fEnabled); + /** Qt messes up the tab chain by default in some cases (issue https://bugreports.qt-project.org/browse/QTBUG-10907), in these cases we have to set it up manually. */ @@ -69,4 +72,4 @@ private slots: }; -#endif // BITCOINAMOUNTFIELD_H +#endif // BITCOIN_QT_BITCOINAMOUNTFIELD_H diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index f0471c32f9..6a457d361f 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -19,7 +19,7 @@ #ifdef ENABLE_WALLET #include "walletframe.h" #include "walletmodel.h" -#endif +#endif // ENABLE_WALLET #ifdef Q_OS_MAC #include "macdockiconhandler.h" @@ -103,10 +103,10 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : QString windowTitle = tr("Bitcoin Core") + " - "; #ifdef ENABLE_WALLET /* if compiled with wallet support, -disablewallet can still disable the wallet */ - bool enableWallet = !GetBoolArg("-disablewallet", false); + enableWallet = !GetBoolArg("-disablewallet", false); #else - bool enableWallet = false; -#endif + enableWallet = false; +#endif // ENABLE_WALLET if(enableWallet) { windowTitle += tr("Wallet"); @@ -136,7 +136,7 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : walletFrame = new WalletFrame(this); setCentralWidget(walletFrame); } else -#endif +#endif // ENABLE_WALLET { /* When compiled without wallet or -disablewallet is provided, * the central widget is the rpc console. @@ -190,7 +190,7 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : // Progress bar and label for blocks download progressBarLabel = new QLabel(); progressBarLabel->setVisible(false); - progressBar = new QProgressBar(); + progressBar = new GUIUtil::ProgressBar(); progressBar->setAlignment(Qt::AlignCenter); progressBar->setVisible(false); @@ -268,6 +268,7 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle) historyAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_4)); tabGroup->addAction(historyAction); +#ifdef ENABLE_WALLET // These showNormalIfMinimized are needed because Send Coins and Receive Coins // can be triggered from the tray menu, and need to show the GUI to be useful. connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); @@ -278,6 +279,7 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle) connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage())); connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage())); +#endif // ENABLE_WALLET quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this); quitAction->setStatusTip(tr("Quit application")); @@ -343,7 +345,7 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle) connect(usedReceivingAddressesAction, SIGNAL(triggered()), walletFrame, SLOT(usedReceivingAddresses())); connect(openAction, SIGNAL(triggered()), this, SLOT(openClicked())); } -#endif +#endif // ENABLE_WALLET } void BitcoinGUI::createMenuBar() @@ -433,7 +435,7 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel) { walletFrame->setClientModel(clientModel); } -#endif +#endif // ENABLE_WALLET unitDisplayControl->setOptionsModel(clientModel->getOptionsModel()); } else { // Disable possibility to show main window via action @@ -469,7 +471,7 @@ void BitcoinGUI::removeAllWallets() setWalletActionsEnabled(false); walletFrame->removeAllWallets(); } -#endif +#endif // ENABLE_WALLET void BitcoinGUI::setWalletActionsEnabled(bool enabled) { @@ -552,7 +554,7 @@ void BitcoinGUI::optionsClicked() if(!clientModel || !clientModel->getOptionsModel()) return; - OptionsDialog dlg(this); + OptionsDialog dlg(this, enableWallet); dlg.setModel(clientModel->getOptionsModel()); dlg.exec(); } @@ -616,7 +618,7 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr) { if (walletFrame) walletFrame->gotoVerifyMessageTab(addr); } -#endif +#endif // ENABLE_WALLET void BitcoinGUI::setNumConnections(int count) { @@ -676,7 +678,7 @@ void BitcoinGUI::setNumBlocks(int count) #ifdef ENABLE_WALLET if(walletFrame) walletFrame->showOutOfSyncWarning(false); -#endif +#endif // ENABLE_WALLET progressBarLabel->setVisible(false); progressBar->setVisible(false); @@ -727,7 +729,7 @@ void BitcoinGUI::setNumBlocks(int count) #ifdef ENABLE_WALLET if(walletFrame) walletFrame->showOutOfSyncWarning(true); -#endif +#endif // ENABLE_WALLET tooltip += QString("<br>"); tooltip += tr("Last received block was generated %1 ago.").arg(timeBehindText); @@ -850,7 +852,7 @@ void BitcoinGUI::incomingTransaction(const QString& date, int unit, const CAmoun .arg(type) .arg(address), CClientUIInterface::MSG_INFORMATION); } -#endif +#endif // ENABLE_WALLET void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event) { @@ -924,7 +926,7 @@ void BitcoinGUI::setEncryptionStatus(int status) break; } } -#endif +#endif // ENABLE_WALLET void BitcoinGUI::showNormalIfMinimized(bool fToggleHidden) { diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index f65f0e9137..662ef9d9e8 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOINGUI_H -#define BITCOINGUI_H +#ifndef BITCOIN_QT_BITCOINGUI_H +#define BITCOIN_QT_BITCOINGUI_H #if defined(HAVE_CONFIG_H) #include "config/bitcoin-config.h" @@ -63,7 +63,8 @@ public: bool addWallet(const QString& name, WalletModel *walletModel); bool setCurrentWallet(const QString& name); void removeAllWallets(); -#endif +#endif // ENABLE_WALLET + bool enableWallet; protected: void changeEvent(QEvent *e); @@ -163,7 +164,7 @@ public slots: /** Show incoming transaction notification for new transactions. */ void incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address); -#endif +#endif // ENABLE_WALLET private slots: #ifdef ENABLE_WALLET @@ -183,7 +184,7 @@ private slots: /** Show open dialog */ void openClicked(); -#endif +#endif // ENABLE_WALLET /** Show configuration dialog */ void optionsClicked(); /** Show about dialog */ @@ -236,4 +237,4 @@ private slots: void onMenuSelection(QAction* action); }; -#endif // BITCOINGUI_H +#endif // BITCOIN_QT_BITCOINGUI_H diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp index 1073b6a472..548529865a 100644 --- a/src/qt/bitcoinstrings.cpp +++ b/src/qt/bitcoinstrings.cpp @@ -54,7 +54,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "Delete all wallet transactions and only recover those parts of the " "blockchain through -rescan on startup"), QT_TRANSLATE_NOOP("bitcoin-core", "" -"Distributed under the MIT/X11 software license, see the accompanying file " +"Distributed under the MIT software license, see the accompanying file " "COPYING or <http://www.opensource.org/licenses/mit-license.php>."), QT_TRANSLATE_NOOP("bitcoin-core", "" "Enter regression test mode, which uses a special chain in which blocks can " @@ -103,6 +103,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "Maintain a full transaction index, used by the getrawtransaction rpc call " "(default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "" +"Maximum size of data in data carrier transactions we relay and mine " +"(default: %u)"), +QT_TRANSLATE_NOOP("bitcoin-core", "" "Number of seconds to keep misbehaving peers from reconnecting (default: %u)"), QT_TRANSLATE_NOOP("bitcoin-core", "" "Output debugging information (default: %u, supplying <category> is optional)"), @@ -115,8 +118,8 @@ QT_TRANSLATE_NOOP("bitcoin-core", "" "Set the number of script verification threads (%u to %d, 0 = auto, <0 = " "leave that many cores free, default: %d)"), QT_TRANSLATE_NOOP("bitcoin-core", "" -"Set the processor limit for when generation is on (-1 = unlimited, default: " -"%d)"), +"Set the number of threads for coin generation if enabled (-1 = all cores, " +"default: %d)"), QT_TRANSLATE_NOOP("bitcoin-core", "" "This is a pre-release test build - use at your own risk - do not use for " "mining or merchant applications"), @@ -250,6 +253,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Rescanning..."), QT_TRANSLATE_NOOP("bitcoin-core", "Run a thread to flush wallet periodically (default: %u)"), 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", "Server certificate file (default: %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "Server private key (default: %s)"), QT_TRANSLATE_NOOP("bitcoin-core", "Set database cache size in megabytes (%d to %d, default: %d)"), diff --git a/src/qt/bitcoinunits.h b/src/qt/bitcoinunits.h index a392c42b9b..7a4f38274d 100644 --- a/src/qt/bitcoinunits.h +++ b/src/qt/bitcoinunits.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOINUNITS_H -#define BITCOINUNITS_H +#ifndef BITCOIN_QT_BITCOINUNITS_H +#define BITCOIN_QT_BITCOINUNITS_H #include "amount.h" @@ -126,4 +126,4 @@ private: }; typedef BitcoinUnits::Unit BitcoinUnit; -#endif // BITCOINUNITS_H +#endif // BITCOIN_QT_BITCOINUNITS_H diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index 738fb48ef8..aedda49071 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -10,6 +10,7 @@ #include "alert.h" #include "chainparams.h" #include "checkpoints.h" +#include "clientversion.h" #include "main.h" #include "net.h" #include "ui_interface.h" diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h index c7bd60bd41..c7a05e287d 100644 --- a/src/qt/clientmodel.h +++ b/src/qt/clientmodel.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef CLIENTMODEL_H -#define CLIENTMODEL_H +#ifndef BITCOIN_QT_CLIENTMODEL_H +#define BITCOIN_QT_CLIENTMODEL_H #include <QObject> @@ -102,4 +102,4 @@ public slots: void updateAlert(const QString &hash, int status); }; -#endif // CLIENTMODEL_H +#endif // BITCOIN_QT_CLIENTMODEL_H diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index ba0febe546..85b43b7b1f 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -24,6 +24,7 @@ #include <QDialogButtonBox> #include <QFlags> #include <QIcon> +#include <QSettings> #include <QString> #include <QTreeWidget> #include <QTreeWidgetItem> @@ -130,10 +131,22 @@ CoinControlDialog::CoinControlDialog(QWidget *parent) : // default view is sorted by amount desc sortView(COLUMN_AMOUNT_INT64, Qt::DescendingOrder); + + // restore list mode and sortorder as a convenience feature + QSettings settings; + if (settings.contains("nCoinControlMode") && !settings.value("nCoinControlMode").toBool()) + ui->radioTreeMode->click(); + if (settings.contains("nCoinControlSortColumn") && settings.contains("nCoinControlSortOrder")) + sortView(settings.value("nCoinControlSortColumn").toInt(), ((Qt::SortOrder)settings.value("nCoinControlSortOrder").toInt())); } CoinControlDialog::~CoinControlDialog() { + QSettings settings; + settings.setValue("nCoinControlMode", ui->radioListMode->isChecked()); + settings.setValue("nCoinControlSortColumn", sortColumn); + settings.setValue("nCoinControlSortOrder", (int)sortOrder); + delete ui; } @@ -290,19 +303,19 @@ void CoinControlDialog::clipboardAmount() // copy label "Fee" to clipboard void CoinControlDialog::clipboardFee() { - GUIUtil::setClipboard(ui->labelCoinControlFee->text().left(ui->labelCoinControlFee->text().indexOf(" "))); + GUIUtil::setClipboard(ui->labelCoinControlFee->text().left(ui->labelCoinControlFee->text().indexOf(" ")).replace("~", "")); } // copy label "After fee" to clipboard void CoinControlDialog::clipboardAfterFee() { - GUIUtil::setClipboard(ui->labelCoinControlAfterFee->text().left(ui->labelCoinControlAfterFee->text().indexOf(" "))); + GUIUtil::setClipboard(ui->labelCoinControlAfterFee->text().left(ui->labelCoinControlAfterFee->text().indexOf(" ")).replace("~", "")); } // copy label "Bytes" to clipboard void CoinControlDialog::clipboardBytes() { - GUIUtil::setClipboard(ui->labelCoinControlBytes->text()); + GUIUtil::setClipboard(ui->labelCoinControlBytes->text().replace("~", "")); } // copy label "Priority" to clipboard @@ -320,7 +333,7 @@ void CoinControlDialog::clipboardLowOutput() // copy label "Change" to clipboard void CoinControlDialog::clipboardChange() { - GUIUtil::setClipboard(ui->labelCoinControlChange->text().left(ui->labelCoinControlChange->text().indexOf(" "))); + GUIUtil::setClipboard(ui->labelCoinControlChange->text().left(ui->labelCoinControlChange->text().indexOf(" ")).replace("~", "")); } // treeview: sort @@ -402,26 +415,22 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column) } // return human readable label for priority number -QString CoinControlDialog::getPriorityLabel(const CTxMemPool& pool, double dPriority) +QString CoinControlDialog::getPriorityLabel(double dPriority, double mempoolEstimatePriority) { - // confirmations -> textual description - typedef std::map<unsigned int, QString> PriorityDescription; - const static PriorityDescription priorityDescriptions = boost::assign::map_list_of - (1, tr("highest"))(2, tr("higher"))(3, tr("high")) - (5, tr("medium-high"))(6, tr("medium")) - (10, tr("low-medium"))(15, tr("low")) - (20, tr("lower")); - - BOOST_FOREACH(const PriorityDescription::value_type& i, priorityDescriptions) - { - double p = mempool.estimatePriority(i.first); - if (p > 0 && dPriority >= p) return i.second; - } - // Note: if mempool hasn't accumulated enough history (estimatePriority - // returns -1) we're conservative and classify as "lowest" - if (mempool.estimatePriority(nTxConfirmTarget) <= 0 && AllowFree(dPriority)) - return ">=" + tr("medium"); - return tr("lowest"); + double dPriorityMedium = mempoolEstimatePriority; + + if (dPriorityMedium <= 0) + dPriorityMedium = AllowFreeThreshold(); // not enough data, back to hard-coded + + if (dPriority / 1000000 > dPriorityMedium) return tr("highest"); + else if (dPriority / 100000 > dPriorityMedium) return tr("higher"); + else if (dPriority / 10000 > dPriorityMedium) return tr("high"); + else if (dPriority / 1000 > dPriorityMedium) return tr("medium-high"); + else if (dPriority > dPriorityMedium) return tr("medium"); + else if (dPriority * 10 > dPriorityMedium) return tr("low-medium"); + else if (dPriority * 100 > dPriorityMedium) return tr("low"); + else if (dPriority * 1000 > dPriorityMedium) return tr("lower"); + else return tr("lowest"); } // shows count of locked unspent outputs @@ -470,6 +479,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) double dPriorityInputs = 0; unsigned int nQuantity = 0; int nQuantityUncompressed = 0; + bool fAllowFree = false; vector<COutPoint> vCoinControl; vector<COutput> vOutputs; @@ -522,24 +532,22 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) nBytes = nBytesInputs + ((CoinControlDialog::payAmounts.size() > 0 ? CoinControlDialog::payAmounts.size() + 1 : 2) * 34) + 10; // always assume +1 output for change here // Priority + double mempoolEstimatePriority = mempool.estimatePriority(nTxConfirmTarget); dPriority = dPriorityInputs / (nBytes - nBytesInputs + (nQuantityUncompressed * 29)); // 29 = 180 - 151 (uncompressed public keys are over the limit. max 151 bytes of the input are ignored for priority) - sPriorityLabel = CoinControlDialog::getPriorityLabel(mempool, dPriority); + sPriorityLabel = CoinControlDialog::getPriorityLabel(dPriority, mempoolEstimatePriority); - // Voluntary Fee - nPayFee = payTxFee.GetFee(max((unsigned int)1000, nBytes)); + // Fee + nPayFee = CWallet::GetMinimumFee(nBytes, nTxConfirmTarget, mempool); - // Min Fee - if (nPayFee == 0) - { - nPayFee = CWallet::GetMinimumFee(nBytes, nTxConfirmTarget, mempool); - - double dPriorityNeeded = mempool.estimatePriority(nTxConfirmTarget); - if (dPriorityNeeded <= 0 && !AllowFree(dPriority)) // not enough mempool history: never send free - dPriorityNeeded = std::numeric_limits<double>::max(); + // Allow free? + double dPriorityNeeded = mempoolEstimatePriority; + if (dPriorityNeeded <= 0) + dPriorityNeeded = AllowFreeThreshold(); // not enough data, back to hard-coded + fAllowFree = (dPriority >= dPriorityNeeded); - if (nBytes <= MAX_FREE_TRANSACTION_CREATE_SIZE && dPriority >= dPriorityNeeded) + if (fSendFreeTransactions) + if (fAllowFree && nBytes <= MAX_FREE_TRANSACTION_CREATE_SIZE) nPayFee = 0; - } if (nPayAmount > 0) { @@ -595,7 +603,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) l6->setText(sPriorityLabel); // Priority l7->setText(fDust ? tr("yes") : tr("no")); // Dust l8->setText(BitcoinUnits::formatWithUnit(nDisplayUnit, nChange)); // Change - if (nPayFee > 0) + if (nPayFee > 0 && !(payTxFee.GetFeePerK() > 0 && fPayAtLeastCustomFee && nBytes < 1000)) { l3->setText("~" + l3->text()); l4->setText("~" + l4->text()); @@ -605,7 +613,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) // turn labels "red" l5->setStyleSheet((nBytes >= MAX_FREE_TRANSACTION_CREATE_SIZE) ? "color:red;" : "");// Bytes >= 1000 - l6->setStyleSheet((dPriority > 0 && !AllowFree(dPriority)) ? "color:red;" : ""); // Priority < "medium" + l6->setStyleSheet((dPriority > 0 && !fAllowFree) ? "color:red;" : ""); // Priority < "medium" l7->setStyleSheet((fDust) ? "color:red;" : ""); // Dust = "yes" // tool tips @@ -620,7 +628,11 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) QString toolTip3 = tr("This label turns red, if any recipient receives an amount smaller than %1.").arg(BitcoinUnits::formatWithUnit(nDisplayUnit, ::minRelayTxFee.GetFee(546))); // how many satoshis the estimated fee can vary per byte we guess wrong - double dFeeVary = (double)std::max(CWallet::minTxFee.GetFeePerK(), std::max(payTxFee.GetFeePerK(), mempool.estimateFee(nTxConfirmTarget).GetFeePerK())) / 1000; + double dFeeVary; + if (payTxFee.GetFeePerK() > 0) + dFeeVary = (double)std::max(CWallet::minTxFee.GetFeePerK(), payTxFee.GetFeePerK()) / 1000; + else + dFeeVary = (double)std::max(CWallet::minTxFee.GetFeePerK(), mempool.estimateFee(nTxConfirmTarget).GetFeePerK()) / 1000; QString toolTip4 = tr("Can vary +/- %1 satoshi(s) per input.").arg(dFeeVary); l3->setToolTip(toolTip4); @@ -656,6 +668,7 @@ void CoinControlDialog::updateView() QFlags<Qt::ItemFlag> flgTristate = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsTristate; int nDisplayUnit = model->getOptionsModel()->getDisplayUnit(); + double mempoolEstimatePriority = mempool.estimatePriority(nTxConfirmTarget); map<QString, vector<COutput> > mapCoins; model->listCoins(mapCoins); @@ -745,7 +758,7 @@ void CoinControlDialog::updateView() // priority double dPriority = ((double)out.tx->vout[out.i].nValue / (nInputSize + 78)) * (out.nDepth+1); // 78 = 2 * 34 + 10 - itemOutput->setText(COLUMN_PRIORITY, CoinControlDialog::getPriorityLabel(mempool, dPriority)); + itemOutput->setText(COLUMN_PRIORITY, CoinControlDialog::getPriorityLabel(dPriority, mempoolEstimatePriority)); itemOutput->setText(COLUMN_PRIORITY_INT64, strPad(QString::number((int64_t)dPriority), 20, " ")); dPrioritySum += (double)out.tx->vout[out.i].nValue * (out.nDepth+1); nInputSum += nInputSize; @@ -778,7 +791,7 @@ void CoinControlDialog::updateView() itemWalletAddress->setText(COLUMN_CHECKBOX, "(" + QString::number(nChildren) + ")"); itemWalletAddress->setText(COLUMN_AMOUNT, BitcoinUnits::format(nDisplayUnit, nSum)); itemWalletAddress->setText(COLUMN_AMOUNT_INT64, strPad(QString::number(nSum), 15, " ")); - itemWalletAddress->setText(COLUMN_PRIORITY, CoinControlDialog::getPriorityLabel(mempool, dPrioritySum)); + itemWalletAddress->setText(COLUMN_PRIORITY, CoinControlDialog::getPriorityLabel(dPrioritySum, mempoolEstimatePriority)); itemWalletAddress->setText(COLUMN_PRIORITY_INT64, strPad(QString::number((int64_t)dPrioritySum), 20, " ")); } } diff --git a/src/qt/coincontroldialog.h b/src/qt/coincontroldialog.h index 9eaa8eb41d..bd4f5d7f1e 100644 --- a/src/qt/coincontroldialog.h +++ b/src/qt/coincontroldialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef COINCONTROLDIALOG_H -#define COINCONTROLDIALOG_H +#ifndef BITCOIN_QT_COINCONTROLDIALOG_H +#define BITCOIN_QT_COINCONTROLDIALOG_H #include "amount.h" @@ -37,7 +37,7 @@ public: // static because also called from sendcoinsdialog static void updateLabels(WalletModel*, QDialog*); - static QString getPriorityLabel(const CTxMemPool& pool, double); + static QString getPriorityLabel(double dPriority, double mempoolEstimatePriority); static QList<CAmount> payAmounts; static CCoinControl *coinControl; @@ -124,4 +124,4 @@ private slots: void updateLabelLocked(); }; -#endif // COINCONTROLDIALOG_H +#endif // BITCOIN_QT_COINCONTROLDIALOG_H diff --git a/src/qt/coincontroltreewidget.h b/src/qt/coincontroltreewidget.h index a2cd34eb88..643eaf0c70 100644 --- a/src/qt/coincontroltreewidget.h +++ b/src/qt/coincontroltreewidget.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef COINCONTROLTREEWIDGET_H -#define COINCONTROLTREEWIDGET_H +#ifndef BITCOIN_QT_COINCONTROLTREEWIDGET_H +#define BITCOIN_QT_COINCONTROLTREEWIDGET_H #include <QKeyEvent> #include <QTreeWidget> @@ -19,4 +19,4 @@ protected: virtual void keyPressEvent(QKeyEvent *event); }; -#endif // COINCONTROLTREEWIDGET_H
\ No newline at end of file +#endif // BITCOIN_QT_COINCONTROLTREEWIDGET_H diff --git a/src/qt/csvmodelwriter.h b/src/qt/csvmodelwriter.h index 29de251efe..c613ce73eb 100644 --- a/src/qt/csvmodelwriter.h +++ b/src/qt/csvmodelwriter.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef CSVMODELWRITER_H -#define CSVMODELWRITER_H +#ifndef BITCOIN_QT_CSVMODELWRITER_H +#define BITCOIN_QT_CSVMODELWRITER_H #include <QList> #include <QObject> @@ -43,4 +43,4 @@ private: QList<Column> columns; }; -#endif // CSVMODELWRITER_H +#endif // BITCOIN_QT_CSVMODELWRITER_H diff --git a/src/qt/editaddressdialog.h b/src/qt/editaddressdialog.h index 6910c667cd..aa1103a2f5 100644 --- a/src/qt/editaddressdialog.h +++ b/src/qt/editaddressdialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef EDITADDRESSDIALOG_H -#define EDITADDRESSDIALOG_H +#ifndef BITCOIN_QT_EDITADDRESSDIALOG_H +#define BITCOIN_QT_EDITADDRESSDIALOG_H #include <QDialog> @@ -54,4 +54,4 @@ private: QString address; }; -#endif // EDITADDRESSDIALOG_H +#endif // BITCOIN_QT_EDITADDRESSDIALOG_H diff --git a/src/qt/forms/askpassphrasedialog.ui b/src/qt/forms/askpassphrasedialog.ui index bc4921455f..a2105ecd0a 100644 --- a/src/qt/forms/askpassphrasedialog.ui +++ b/src/qt/forms/askpassphrasedialog.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>598</width> - <height>198</height> + <height>222</height> </rect> </property> <property name="sizePolicy"> @@ -26,8 +26,14 @@ <string>Passphrase Dialog</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetMinimumSize</enum> + </property> <item> <widget class="QLabel" name="warningLabel"> + <property name="text"> + <string notr="true">Placeholder text</string> + </property> <property name="textFormat"> <enum>Qt::RichText</enum> </property> @@ -38,6 +44,9 @@ </item> <item> <layout class="QFormLayout" name="formLayout"> + <property name="sizeConstraint"> + <enum>QLayout::SetMinimumSize</enum> + </property> <property name="fieldGrowthPolicy"> <enum>QFormLayout::AllNonFixedFieldsGrow</enum> </property> diff --git a/src/qt/forms/coincontroldialog.ui b/src/qt/forms/coincontroldialog.ui index cbe58fec65..c1fef6b9b1 100644 --- a/src/qt/forms/coincontroldialog.ui +++ b/src/qt/forms/coincontroldialog.ui @@ -11,7 +11,7 @@ </rect> </property> <property name="windowTitle"> - <string>Coin Control Address Selection</string> + <string>Coin Selection</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> @@ -379,9 +379,6 @@ <property name="text"> <string>Tree mode</string> </property> - <property name="checked"> - <bool>true</bool> - </property> </widget> </item> <item> @@ -395,6 +392,9 @@ <property name="text"> <string>List mode</string> </property> + <property name="checked"> + <bool>true</bool> + </property> </widget> </item> <item> @@ -451,12 +451,12 @@ </column> <column> <property name="text"> - <string notr="true">Label</string> + <string>Received with label</string> </property> </column> <column> <property name="text"> - <string>Address</string> + <string>Received with address</string> </property> </column> <column> diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index 9d094c1a73..51156ade4f 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -138,65 +138,6 @@ </attribute> <layout class="QVBoxLayout" name="verticalLayout_Wallet"> <item> - <widget class="QLabel" name="transactionFeeInfoLabel"> - <property name="text"> - <string>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</string> - </property> - <property name="textFormat"> - <enum>Qt::PlainText</enum> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_1_Wallet"> - <item> - <widget class="QLabel" name="transactionFeeLabel"> - <property name="text"> - <string>Pay transaction &fee</string> - </property> - <property name="textFormat"> - <enum>Qt::PlainText</enum> - </property> - <property name="buddy"> - <cstring>transactionFee</cstring> - </property> - </widget> - </item> - <item> - <widget class="BitcoinAmountField" name="transactionFee"/> - </item> - <item> - <spacer name="horizontalSpacer_1_Wallet"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <spacer name="verticalSpacer_Wallet"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Expert</string> @@ -225,6 +166,19 @@ </layout> </widget> </item> + <item> + <spacer name="verticalSpacer_Wallet"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> </layout> </widget> <widget class="QWidget" name="tabNetwork"> @@ -255,10 +209,10 @@ <item> <widget class="QCheckBox" name="connectSocks"> <property name="toolTip"> - <string>Connect to the Bitcoin network through a SOCKS proxy.</string> + <string>Connect to the Bitcoin network through a SOCKS5 proxy.</string> </property> <property name="text"> - <string>&Connect through SOCKS proxy (default proxy):</string> + <string>&Connect through SOCKS5 proxy (default proxy):</string> </property> </widget> </item> @@ -633,12 +587,6 @@ </widget> <customwidgets> <customwidget> - <class>BitcoinAmountField</class> - <extends>QLineEdit</extends> - <header>bitcoinamountfield.h</header> - <container>1</container> - </customwidget> - <customwidget> <class>QValidatedLineEdit</class> <extends>QLineEdit</extends> <header>qvalidatedlineedit.h</header> diff --git a/src/qt/forms/rpcconsole.ui b/src/qt/forms/rpcconsole.ui index 898df2b080..c5ac371619 100644 --- a/src/qt/forms/rpcconsole.ui +++ b/src/qt/forms/rpcconsole.ui @@ -689,7 +689,7 @@ <item row="0" column="0" rowspan="2"> <widget class="QTableView" name="peerWidget"> <property name="horizontalScrollBarPolicy"> - <enum>Qt::ScrollBarAlwaysOff</enum> + <enum>Qt::ScrollBarAsNeeded</enum> </property> <property name="sortingEnabled"> <bool>true</bool> diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui index dce7f4ce4c..0bf04c75eb 100644 --- a/src/qt/forms/sendcoinsdialog.ui +++ b/src/qt/forms/sendcoinsdialog.ui @@ -7,13 +7,13 @@ <x>0</x> <y>0</y> <width>850</width> - <height>400</height> + <height>526</height> </rect> </property> <property name="windowTitle"> <string>Send Coins</string> </property> - <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0"> + <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0,0"> <property name="bottomMargin"> <number>8</number> </property> @@ -617,7 +617,7 @@ <x>0</x> <y>0</y> <width>830</width> - <height>178</height> + <height>68</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,1"> @@ -658,6 +658,590 @@ </widget> </item> <item> + <widget class="QFrame" name="frameFee"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>16777215</height> + </size> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <layout class="QVBoxLayout" name="verticalLayoutFee1"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QVBoxLayout" name="verticalLayoutFee2" stretch="0,0,0"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>10</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutFee1"> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QVBoxLayout" name="verticalLayoutFee7"> + <property name="spacing"> + <number>0</number> + </property> + <item> + <spacer name="verticalSpacerSmartFee"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>4</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutSmartFee"> + <property name="spacing"> + <number>10</number> + </property> + <item> + <widget class="QLabel" name="labelFeeHeadline"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="styleSheet"> + <string notr="true">font-weight:bold;</string> + </property> + <property name="text"> + <string>Transaction Fee:</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="labelFeeMinimized"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonChooseFee"> + <property name="text"> + <string>Choose...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonMinimizeFee"> + <property name="toolTip"> + <string>collapse fee-settings</string> + </property> + <property name="text"> + <string>Minimize</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_5"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QFrame" name="frameFeeSelection"> + <layout class="QVBoxLayout" name="verticalLayoutFee12"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QGridLayout" name="gridLayoutFee"> + <property name="topMargin"> + <number>10</number> + </property> + <property name="bottomMargin"> + <number>4</number> + </property> + <property name="horizontalSpacing"> + <number>10</number> + </property> + <property name="verticalSpacing"> + <number>4</number> + </property> + <item row="1" column="1"> + <layout class="QVBoxLayout" name="verticalLayoutFee8"> + <property name="spacing"> + <number>6</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutFee13"> + <item> + <widget class="QRadioButton" name="radioCustomPerKilobyte"> + <property name="toolTip"> + <string>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 "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</string> + </property> + <property name="text"> + <string>per kilobyte</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <attribute name="buttonGroup"> + <string notr="true">groupCustomFee</string> + </attribute> + </widget> + </item> + <item> + <widget class="QRadioButton" name="radioCustomAtLeast"> + <property name="toolTip"> + <string>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.</string> + </property> + <property name="text"> + <string>total at least</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">groupCustomFee</string> + </attribute> + </widget> + </item> + <item> + <widget class="BitcoinAmountField" name="customFee"/> + </item> + <item> + <spacer name="horizontalSpacer_6"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutFee8"> + <item> + <widget class="QCheckBox" name="checkBoxMinimumFee"> + <property name="toolTip"> + <string>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.</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="labelMinFeeWarning"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="toolTip"> + <string>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.</string> + </property> + <property name="text"> + <string>(read the tooltip)</string> + </property> + <property name="margin"> + <number>5</number> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </item> + <item row="0" column="0"> + <layout class="QVBoxLayout" name="verticalLayoutFee4" stretch="0,1"> + <item> + <widget class="QRadioButton" name="radioSmartFee"> + <property name="text"> + <string>Recommended:</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <attribute name="buttonGroup"> + <string notr="true">groupFee</string> + </attribute> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QVBoxLayout" name="verticalLayoutFee9" stretch="0,1"> + <item> + <widget class="QRadioButton" name="radioCustomFee"> + <property name="text"> + <string>Custom:</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">groupFee</string> + </attribute> + </widget> + </item> + <item> + <spacer name="verticalSpacer_6"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayoutFee3" stretch="0,0,1"> + <property name="spacing"> + <number>6</number> + </property> + <property name="topMargin"> + <number>2</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutFee12"> + <item> + <widget class="QLabel" name="labelSmartFee"> + <property name="text"> + <string/> + </property> + <property name="margin"> + <number>2</number> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="labelFeeEstimation"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="labelSmartFee2"> + <property name="text"> + <string>(Smart fee not initialized yet. This usually takes a few blocks...)</string> + </property> + <property name="margin"> + <number>2</number> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutFee9"> + <item> + <layout class="QVBoxLayout" name="verticalLayoutFee6"> + <item> + <widget class="QLabel" name="labelSmartFee3"> + <property name="text"> + <string>Confirmation time:</string> + </property> + <property name="margin"> + <number>2</number> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayoutFee5"> + <property name="rightMargin"> + <number>30</number> + </property> + <item> + <widget class="QSlider" name="sliderSmartFee"> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>24</number> + </property> + <property name="pageStep"> + <number>1</number> + </property> + <property name="value"> + <number>0</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="invertedAppearance"> + <bool>false</bool> + </property> + <property name="invertedControls"> + <bool>false</bool> + </property> + <property name="tickPosition"> + <enum>QSlider::NoTicks</enum> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutFee10"> + <item> + <widget class="QLabel" name="labelSmartFeeNormal"> + <property name="text"> + <string>normal</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="labelSmartFeeFast"> + <property name="text"> + <string>fast</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_4"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutFee5" stretch="0,0,0"> + <property name="spacing"> + <number>8</number> + </property> + <property name="bottomMargin"> + <number>4</number> + </property> + <item> + <widget class="QCheckBox" name="checkBoxFreeTx"> + <property name="text"> + <string>Send as zero-fee transaction if possible</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="labelFreeTx"> + <property name="text"> + <string>(confirmation may take longer)</string> + </property> + <property name="margin"> + <number>5</number> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacerFee5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacerFee2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacerFee"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>800</width> + <height>1</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QPushButton" name="sendButton"> @@ -787,9 +1371,19 @@ <extends>QLineEdit</extends> <header>qvalidatedlineedit.h</header> </customwidget> + <customwidget> + <class>BitcoinAmountField</class> + <extends>QLineEdit</extends> + <header>bitcoinamountfield.h</header> + <container>1</container> + </customwidget> </customwidgets> <resources> <include location="../bitcoin.qrc"/> </resources> <connections/> + <buttongroups> + <buttongroup name="groupFee"/> + <buttongroup name="groupCustomFee"/> + </buttongroups> </ui> diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index 4c8a67b663..f23175049a 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef GUICONSTANTS_H -#define GUICONSTANTS_H +#ifndef BITCOIN_QT_GUICONSTANTS_H +#define BITCOIN_QT_GUICONSTANTS_H /* Milliseconds between model updates */ static const int MODEL_UPDATE_DELAY = 250; @@ -52,4 +52,4 @@ static const int MAX_PAYMENT_REQUEST_SIZE = 50000; // bytes #define QAPP_APP_NAME_DEFAULT "Bitcoin-Qt" #define QAPP_APP_NAME_TESTNET "Bitcoin-Qt-testnet" -#endif // GUICONSTANTS_H +#endif // BITCOIN_QT_GUICONSTANTS_H diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 0939c78f64..09c79db2d9 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -2,14 +2,16 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef GUIUTIL_H -#define GUIUTIL_H +#ifndef BITCOIN_QT_GUIUTIL_H +#define BITCOIN_QT_GUIUTIL_H #include "amount.h" +#include <QEvent> #include <QHeaderView> #include <QMessageBox> #include <QObject> +#include <QProgressBar> #include <QString> #include <QTableView> @@ -186,6 +188,21 @@ namespace GUIUtil /* Format a CNodeCombinedStats.dPingTime into a user-readable string or display N/A, if 0*/ QString formatPingTime(double dPingTime); + +#if defined(Q_OS_MAC) && QT_VERSION >= 0x050000 + // workaround for Qt OSX Bug: + // https://bugreports.qt-project.org/browse/QTBUG-15631 + // QProgressBar uses around 10% CPU even when app is in background + class ProgressBar : public QProgressBar + { + bool event(QEvent *e) { + return (e->type() != QEvent::StyleAnimationUpdate) ? QProgressBar::event(e) : false; + } + }; +#else + typedef QProgressBar ProgressBar; +#endif + } // namespace GUIUtil -#endif // GUIUTIL_H +#endif // BITCOIN_QT_GUIUTIL_H diff --git a/src/qt/intro.h b/src/qt/intro.h index e3e396d369..c9c0d448fa 100644 --- a/src/qt/intro.h +++ b/src/qt/intro.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef INTRO_H -#define INTRO_H +#ifndef BITCOIN_QT_INTRO_H +#define BITCOIN_QT_INTRO_H #include <QDialog> #include <QMutex> @@ -70,4 +70,4 @@ private: friend class FreespaceChecker; }; -#endif // INTRO_H +#endif // BITCOIN_QT_INTRO_H diff --git a/src/qt/locale/bitcoin_ach.ts b/src/qt/locale/bitcoin_ach.ts index 835ddb8eaa..ddb9fb85ce 100644 --- a/src/qt/locale/bitcoin_ach.ts +++ b/src/qt/locale/bitcoin_ach.ts @@ -1,4 +1,4 @@ -<TS language="ach" version="2.1"> +<TS language="ach" version="2.0"> <context> <name>AddressBookPage</name> </context> diff --git a/src/qt/locale/bitcoin_af_ZA.ts b/src/qt/locale/bitcoin_af_ZA.ts index 474b6b3298..c369c3c68f 100644 --- a/src/qt/locale/bitcoin_af_ZA.ts +++ b/src/qt/locale/bitcoin_af_ZA.ts @@ -1,4 +1,4 @@ -<TS language="af_ZA" version="2.1"> +<TS language="af_ZA" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -201,10 +201,6 @@ <translation>Bedrag</translation> </message> <message> - <source>Address</source> - <translation>Adres</translation> - </message> - <message> <source>Date</source> <translation>Datum</translation> </message> @@ -277,14 +273,6 @@ <source>Form</source> <translation>Vorm</translation> </message> - <message> - <source>Wallet</source> - <translation>Beursie</translation> - </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Onlangse transaksies</b></translation> - </message> </context> <context> <name>PaymentServer</name> @@ -651,14 +639,6 @@ <translation>Opsies:</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Luister vir konneksies op <port> (standaard: 8333 of testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Onderhou op die meeste <n> konneksies na eweknieë (standaard: 125)</translation> - </message> - <message> <source>Use the test network</source> <translation>Gebruik die toets netwerk</translation> </message> @@ -671,10 +651,6 @@ <translation>Informasie</translation> </message> <message> - <source>System error: </source> - <translation>Sisteem fout:</translation> - </message> - <message> <source>This help message</source> <translation>Hierdie help boodskap</translation> </message> diff --git a/src/qt/locale/bitcoin_ar.ts b/src/qt/locale/bitcoin_ar.ts index ea1bc0ea4b..101f51f8dc 100644 --- a/src/qt/locale/bitcoin_ar.ts +++ b/src/qt/locale/bitcoin_ar.ts @@ -1,4 +1,4 @@ -<TS language="ar" version="2.1"> +<TS language="ar" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -34,6 +34,10 @@ <translation>حذف العنوان المحدد من القائمة</translation> </message> <message> + <source>Export the data in the current tab to a file</source> + <translation>تحميل البيانات في علامة التبويب الحالية إلى ملف.</translation> + </message> + <message> <source>&Export</source> <translation>&تصدير</translation> </message> @@ -62,6 +66,14 @@ <translation>استقبال العناوين</translation> </message> <message> + <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> + <translation>هذه هي عناوين Bitcion التابعة لك من أجل إرسال الدفعات. تحقق دائما من المبلغ و عنوان المرسل المستقبل قبل إرسال العملات</translation> + </message> + <message> + <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> + <translation>هذه هي عناوين Bitcion التابعة لك من أجل إستقبال الدفعات. ينصح استخدام عنوان جديد من أجل كل صفقة</translation> + </message> + <message> <source>Copy &Label</source> <translation>نسخ &الوصف</translation> </message> @@ -74,6 +86,10 @@ <translation>تصدير قائمة العناوين</translation> </message> <message> + <source>Comma separated file (*.csv)</source> + <translation>ملف مفصول بفواصل (*.csv)</translation> + </message> + <message> <source>Exporting Failed</source> <translation>فشل التصدير</translation> </message> @@ -96,6 +112,10 @@ <context> <name>AskPassphraseDialog</name> <message> + <source>Passphrase Dialog</source> + <translation>حوار جملة السر</translation> + </message> + <message> <source>Enter passphrase</source> <translation>ادخل كلمة المرور</translation> </message> @@ -140,6 +160,18 @@ <translation>تأكيد تشفير المحفظة</translation> </message> <message> + <source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source> + <translation>تحذير: إذا قمت بتشفير محفظتك وفقدت كلمة المرور الخاص بك, ستفقد كل عملات BITCOINS الخاصة بك.</translation> + </message> + <message> + <source>Are you sure you wish to encrypt your wallet?</source> + <translation>هل أنت متأكد من رغبتك في تشفير محفظتك ؟</translation> + </message> + <message> + <source>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.</source> + <translation>هام: أي نسخة إحتياطية سابقة قمت بها لمحفظتك يجب استبدالها بأخرى حديثة، مشفرة. لأسباب أمنية، النسخ الاحتياطية السابقة لملفات المحفظة الغير مشفرة تصبح عديمة الفائدة مع بداية استخدام المحفظة المشفرة الجديدة.</translation> + </message> + <message> <source>Warning: The Caps Lock key is on!</source> <translation>تحذير: مفتاح الحروف الكبيرة مفعل</translation> </message> @@ -148,6 +180,10 @@ <translation>محفظة مشفرة</translation> </message> <message> + <source>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>.</source> + <translation>أدخل عبارة مرور جديدة إلى المحفظة. الرجاء استخدام عبارة مرور تتكون من10 حروف عشوائية على الاقل, أو أكثر من 7 كلمات</translation> + </message> + <message> <source>Bitcoin 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.</source> <translation>بتكوين سوف يغلق الآن لإنهاء عملية التشفير. تذكر أن التشفير لا يستطيع حماية محفظتك تمامًا من السرقة من خلال البرمجيات الخبيثة التي تصيب جهازك </translation> </message> @@ -175,7 +211,11 @@ <source>Wallet decryption failed</source> <translation>فشل فك التشفير المحفظة</translation> </message> - </context> + <message> + <source>Wallet passphrase was successfully changed.</source> + <translation>لقد تم تغير عبارة مرور المحفظة بنجاح</translation> + </message> +</context> <context> <name>BitcoinGUI</name> <message> @@ -239,14 +279,30 @@ <translation>&تغيير كلمة المرور</translation> </message> <message> + <source>&Sending addresses...</source> + <translation>ارسال العناوين.</translation> + </message> + <message> + <source>&Receiving addresses...</source> + <translation>استقبال العناوين</translation> + </message> + <message> <source>Open &URI...</source> <translation>افتح &URI...</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>عميل bitcion core</translation> + </message> + <message> <source>Send coins to a Bitcoin address</source> <translation>ارسل عملات الى عنوان بيتكوين</translation> </message> <message> + <source>Modify configuration options for Bitcoin</source> + <translation>تعديل إعدادات bitcoin</translation> + </message> + <message> <source>Backup wallet to another location</source> <translation>احفظ نسخة احتياطية للمحفظة في مكان آخر</translation> </message> @@ -275,6 +331,10 @@ <translation>&استقبل</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation> اظهار معلومات حول bitcion core</translation> + </message> + <message> <source>&Show / Hide</source> <translation>&عرض / اخفاء</translation> </message> @@ -283,6 +343,10 @@ <translation>عرض او اخفاء النافذة الرئيسية</translation> </message> <message> + <source>Encrypt the private keys that belong to your wallet</source> + <translation>تشفير المفتاح الخاص لمحفظتك</translation> + </message> + <message> <source>&File</source> <translation>&ملف</translation> </message> @@ -299,13 +363,13 @@ <translation>شريط أدوات علامات التبويب</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>جوهر البيت كوين</translation> </message> + <message> + <source>&About Bitcoin Core</source> + <translation>حول bitcoin core</translation> + </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n ساعة</numerusform><numerusform>%n ساعة</numerusform><numerusform>%n ساعة</numerusform><numerusform>%n ساعات</numerusform><numerusform>%n ساعات</numerusform><numerusform>%n ساعات</numerusform></translation> @@ -393,10 +457,6 @@ <translation>المبلغ</translation> </message> <message> - <source>Address</source> - <translation>عنوان</translation> - </message> - <message> <source>Date</source> <translation>التاريخ</translation> </message> @@ -461,6 +521,10 @@ <translation>عالي</translation> </message> <message> + <source>medium-high</source> + <translation>متوسط-مرتفع</translation> + </message> + <message> <source>low</source> <translation>منخفض</translation> </message> @@ -596,10 +660,6 @@ <source>Error</source> <translation>خطأ</translation> </message> - <message> - <source>GB of free space available</source> - <translation>قيقا بايت مساحة متاحة</translation> - </message> </context> <context> <name>OpenURIDialog</name> @@ -623,10 +683,6 @@ <translation>&الرئيسي</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>ادفع &رسوم المعاملة</translation> - </message> - <message> <source>MB</source> <translation>م ب</translation> </message> @@ -710,10 +766,6 @@ <translation>نمودج</translation> </message> <message> - <source>Wallet</source> - <translation>محفظة</translation> - </message> - <message> <source>Available:</source> <translation>متوفر</translation> </message> @@ -734,10 +786,6 @@ <translation>رصيدك الكلي الحالي</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation>اخر المعملات </translation> - </message> - <message> <source>out of sync</source> <translation>خارج المزامنه</translation> </message> @@ -877,14 +925,6 @@ <translation>استخدم اسهم الاعلى و الاسفل للتنقل بين السجلات و <b>Ctrl-L</b> لمسح الشاشة</translation> </message> <message> - <source>Yes</source> - <translation>نعم</translation> - </message> - <message> - <source>No</source> - <translation>لا</translation> - </message> - <message> <source>Unknown</source> <translation>غير معرف</translation> </message> @@ -1540,6 +1580,10 @@ <translation>نجح التصدير</translation> </message> <message> + <source>Comma separated file (*.csv)</source> + <translation>ملف مفصول بفواصل (*.csv)</translation> + </message> + <message> <source>Confirmed</source> <translation>تأكيد</translation> </message> @@ -1592,6 +1636,10 @@ <translation>&تصدير</translation> </message> <message> + <source>Export the data in the current tab to a file</source> + <translation>تحميل البيانات في علامة التبويب الحالية إلى ملف.</translation> + </message> + <message> <source>Backup Wallet</source> <translation>نسخ احتياط للمحفظة</translation> </message> @@ -1631,10 +1679,6 @@ <translation>تحذير: المحفظة مغلقة , لا تستطيع تنفيذ المعاملة</translation> </message> <message> - <source>Error: system error: </source> - <translation>خطأ: خطأ في النظام:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>فشل في الاستماع على أي منفذ. استخدام الاستماع = 0 إذا كنت تريد هذا.</translation> </message> @@ -1659,10 +1703,6 @@ <translation>فشل توقيع المعاملة</translation> </message> <message> - <source>System error: </source> - <translation>خطأ في النظام :</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>قيمة العملية صغيره جدا</translation> </message> @@ -1687,10 +1727,6 @@ <translation>تحديث المحفظة للنسخة الاخيرة</translation> </message> <message> - <source>Server private key (default: server.pem)</source> - <translation>المفتاح الخاص بالسيرفر (default: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>رسالة المساعدة هذه</translation> </message> diff --git a/src/qt/locale/bitcoin_be_BY.ts b/src/qt/locale/bitcoin_be_BY.ts index 8fac417b73..e63628396c 100644 --- a/src/qt/locale/bitcoin_be_BY.ts +++ b/src/qt/locale/bitcoin_be_BY.ts @@ -1,4 +1,4 @@ -<TS language="be_BY" version="2.1"> +<TS language="be_BY" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -10,10 +10,34 @@ <translation>Стварыць новы адрас</translation> </message> <message> + <source>&New</source> + <translation>Новы</translation> + </message> + <message> <source>Copy the currently selected address to the system clipboard</source> <translation>Капіяваць пазначаны адрас у сістэмны буфер абмену</translation> </message> <message> + <source>&Copy</source> + <translation>Капіяваць</translation> + </message> + <message> + <source>C&lose</source> + <translation>Зачыніць</translation> + </message> + <message> + <source>&Copy Address</source> + <translation>Капіяваць адрас</translation> + </message> + <message> + <source>Delete the currently selected address from the list</source> + <translation>Выдаліць абраны адрас са спісу</translation> + </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Экспартаваць гэтыя звесткі у файл</translation> + </message> + <message> <source>&Export</source> <translation>Экспарт</translation> </message> @@ -22,9 +46,37 @@ <translation>Выдаліць</translation> </message> <message> + <source>Choose the address to send coins to</source> + <translation>Выбраць адрас, куды выслаць сродкі</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Выбраць адрас, на які атрымаць сродкі</translation> + </message> + <message> + <source>C&hoose</source> + <translation>Выбраць</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>адрасы Адпраўкі</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>адрасы Прымання</translation> + </message> + <message> + <source>&Edit</source> + <translation>Рэдагаваць</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> <translation>Коскамі падзелены файл (*.csv)</translation> </message> + <message> + <source>Exporting Failed</source> + <translation>Экспартаванне няўдалае</translation> + </message> </context> <context> <name>AddressTableModel</name> @@ -88,6 +140,18 @@ <translation>Пацвердзіце шыфраванне гаманца</translation> </message> <message> + <source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source> + <translation>Увага: калі вы зашыфруеце свой гаманец і страціце парольную фразу, то <b>СТРАЦІЦЕ ЎСЕ СВАЕ БІТКОЙНЫ</b>!</translation> + </message> + <message> + <source>Are you sure you wish to encrypt your wallet?</source> + <translation>Ці ўпэўненыя вы, што жадаеце зашыфраваць свой гаманец?</translation> + </message> + <message> + <source>Warning: The Caps Lock key is on!</source> + <translation>Увага: Caps Lock уключаны!</translation> + </message> + <message> <source>Wallet encrypted</source> <translation>Гаманец зашыфраваны</translation> </message> @@ -119,10 +183,18 @@ <source>Wallet decryption failed</source> <translation>Расшыфраванне гаманца няўдалае</translation> </message> - </context> + <message> + <source>Wallet passphrase was successfully changed.</source> + <translation>Парольная фраза гаманца паспяхова зменена.</translation> + </message> +</context> <context> <name>BitcoinGUI</name> <message> + <source>Sign &message...</source> + <translation>Падпісаць паведамленне...</translation> + </message> + <message> <source>Synchronizing with network...</source> <translation>Сінхранізацыя з сецівам...</translation> </message> @@ -131,6 +203,10 @@ <translation>Агляд</translation> </message> <message> + <source>Node</source> + <translation>Вузел</translation> + </message> + <message> <source>Show general overview of wallet</source> <translation>Паказвае агульныя звесткі аб гаманцы</translation> </message> @@ -163,6 +239,14 @@ <translation>Опцыі...</translation> </message> <message> + <source>&Encrypt Wallet...</source> + <translation>Зашыфраваць Гаманец...</translation> + </message> + <message> + <source>Open &URI...</source> + <translation>Адчыниць &URI...</translation> + </message> + <message> <source>Backup wallet to another location</source> <translation>Зрабіце копію гаманца ў іншае месца</translation> </message> @@ -171,6 +255,14 @@ <translation>Змяніць пароль шыфравання гаманца</translation> </message> <message> + <source>&Debug window</source> + <translation>Вакно адладкі</translation> + </message> + <message> + <source>Wallet</source> + <translation>Гаманец</translation> + </message> + <message> <source>&Send</source> <translation>Даслаць</translation> </message> @@ -179,6 +271,18 @@ <translation>Атрымаць</translation> </message> <message> + <source>&Show / Hide</source> + <translation>&Паказаць / Схаваць</translation> + </message> + <message> + <source>Show or hide the main Window</source> + <translation>Паказаць альбо схаваць галоўнае вакно</translation> + </message> + <message> + <source>Encrypt the private keys that belong to your wallet</source> + <translation>Зашыфраваць прыватныя ключы, якия належаць вашаму гаманцу</translation> + </message> + <message> <source>&File</source> <translation>Ф&айл</translation> </message> @@ -190,10 +294,6 @@ <source>&Help</source> <translation>Дапамога</translation> </message> - <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n актыўнае злучэнне з Bitcoin-сецівам</numerusform><numerusform>%n актыўных злучэнняў з Bitcoin-сецівам</numerusform></translation> @@ -245,12 +345,12 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Amount</source> - <translation>Колькасць</translation> + <source>Amount:</source> + <translation>Колькасць:</translation> </message> <message> - <source>Address</source> - <translation>Адрас</translation> + <source>Amount</source> + <translation>Колькасць</translation> </message> <message> <source>Date</source> @@ -330,6 +430,14 @@ Address: %4 <context> <name>HelpMessageDialog</name> <message> + <source>(%1-bit)</source> + <translation>(%1-біт)</translation> + </message> + <message> + <source>About Bitcoin Core</source> + <translation>Аб Bitcoin Core</translation> + </message> + <message> <source>Usage:</source> <translation>Ужыванне:</translation> </message> @@ -357,10 +465,6 @@ Address: %4 <source>Form</source> <translation>Форма</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Нядаўнія транзаццыі</b></translation> - </message> </context> <context> <name>PaymentServer</name> @@ -437,6 +541,10 @@ Address: %4 <translation>Даслаць Манеты</translation> </message> <message> + <source>Amount:</source> + <translation>Колькасць:</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Даслаць адразу некалькім атрымальнікам</translation> </message> @@ -517,6 +625,10 @@ Address: %4 <context> <name>SplashScreen</name> <message> + <source>The Bitcoin Core developers</source> + <translation>Распрацоўнікі Bitcoin Core</translation> + </message> + <message> <source>[testnet]</source> <translation>[testnet]</translation> </message> @@ -716,6 +828,10 @@ Address: %4 <translation>Рэдагаваць пазнаку</translation> </message> <message> + <source>Exporting Failed</source> + <translation>Экспартаванне няўдалае</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> <translation>Коскамі падзелены файл (*.csv)</translation> </message> @@ -771,6 +887,10 @@ Address: %4 <source>&Export</source> <translation>Экспарт</translation> </message> + <message> + <source>Export the data in the current tab to a file</source> + <translation>Экспартаваць гэтыя звесткі у файл</translation> + </message> </context> <context> <name>bitcoin-core</name> @@ -779,34 +899,10 @@ Address: %4 <translation>Опцыі:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Вызначыць канфігурацыйны файл (зыходна: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Вызначыць pid-файл (зыходна: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Вызначыць каталог даных</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Слухаць злучэнні на <port> (зыходна: 8333 ці testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Трымаць не больш за <n> злучэнняў на асобу (зыходна: 125)</translation> - </message> - <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Парог для адлучэння злаўмысных карыстальнікаў (тыпова: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Колькасць секунд для ўстрымання асобаў да перадалучэння (заходна: 86400)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Прымаць камандны радок і JSON-RPC каманды</translation> </message> @@ -839,10 +935,6 @@ Address: %4 <translation>Абнавіць гаманец на новы фармат</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Устанавіць памер фонда ключоў у <n> (тыпова: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Перасканаваць ланцуг блокаў дзеля пошуку адсутных транзакцый</translation> </message> @@ -851,14 +943,6 @@ Address: %4 <translation>Ужываць OpenSSL (https) для JSON-RPC злучэнняў</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Файл-сертыфікат сервера (зыходна: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Прыватны ключ сервера (зыходна: server.pem)</translation> - </message> - <message> <source>Loading addresses...</source> <translation>Загружаем адрасы...</translation> </message> diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts index 11bf594a42..3095aa1172 100644 --- a/src/qt/locale/bitcoin_bg.ts +++ b/src/qt/locale/bitcoin_bg.ts @@ -1,4 +1,4 @@ -<TS language="bg" version="2.1"> +<TS language="bg" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -278,10 +278,6 @@ <source>Tabs toolbar</source> <translation>Раздели</translation> </message> - <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n връзка към Биткоин мрежата</numerusform><numerusform>%n връзки към Биткоин мрежата</numerusform></translation> @@ -369,10 +365,6 @@ <translation>Сума</translation> </message> <message> - <source>Address</source> - <translation>Адрес</translation> - </message> - <message> <source>Date</source> <translation>Дата</translation> </message> @@ -515,10 +507,6 @@ <translation>&Основни</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>&Такса за изходяща трансакция</translation> - </message> - <message> <source>&Start Bitcoin on system login</source> <translation>&Пускане на Биткоин при вход в системата</translation> </message> @@ -610,10 +598,6 @@ <translation>Форма</translation> </message> <message> - <source>Wallet</source> - <translation>Портфейл</translation> - </message> - <message> <source>Available:</source> <translation>Налично:</translation> </message> @@ -630,10 +614,6 @@ <translation>Текущият ви общ баланс</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Последни трансакции</b></translation> - </message> - <message> <source>out of sync</source> <translation>несинхронизиран</translation> </message> @@ -1427,22 +1407,10 @@ <translation>Опции:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Задаване на файл с настройки (по подразбиране bitcoin.conf)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Определете директория за данните</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Праг на прекъсване на връзката при непорядъчно държащи се пиъри (по подразбиране:100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Брой секунди до възтановяване на връзката за зле държащите се пиъри (по подразбиране:86400)</translation> - </message> - <message> <source>Use the test network</source> <translation>Използвайте тестовата мрежа</translation> </message> @@ -1455,10 +1423,6 @@ <translation>(по подразбиране 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(по подразбиране wallet.dat)</translation> - </message> - <message> <source>Connection options:</source> <translation>Настройки на връзката:</translation> </message> @@ -1467,30 +1431,10 @@ <translation>Грешка: мястото на диска е малко!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Грешка: системна грешка:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Провалено "слушане" на всеки порт. Използвайте -listen=0 ако искате това.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Грешка при четене данни на блок</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Грешка при четене на блок</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Грешка при запис данни на блок</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Грешка при запис на блок</translation> - </message> - <message> <source>Importing...</source> <translation>Внасяне...</translation> </message> @@ -1515,18 +1459,6 @@ <translation>Изпрати локализиращата или дебъг информацията към конзолата, вместо файлът debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Задайте минимален размер на блок-а в байтове (подразбиране: 0)</translation> - </message> - <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Определете таймаут за свързване в милисекунди (подразбиране: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Системна грешка:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Сумата на трансакцията е твърде малка</translation> </message> @@ -1567,14 +1499,6 @@ <translation>Използвайте OpenSSL (https) за JSON-RPC връзките</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Сертификатен файл на сървъра (По подразбиране:server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Поверителен ключ за сървъра (default: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Това помощно съобщение</translation> </message> diff --git a/src/qt/locale/bitcoin_bs.ts b/src/qt/locale/bitcoin_bs.ts index fc5e6d270e..86526022fe 100644 --- a/src/qt/locale/bitcoin_bs.ts +++ b/src/qt/locale/bitcoin_bs.ts @@ -1,4 +1,4 @@ -<TS language="bs" version="2.1"> +<TS language="bs" version="2.0"> <context> <name>AddressBookPage</name> </context> diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts index 0d45ab63b6..8f06ac3aa7 100644 --- a/src/qt/locale/bitcoin_ca.ts +++ b/src/qt/locale/bitcoin_ca.ts @@ -1,4 +1,4 @@ -<TS language="ca" version="2.1"> +<TS language="ca" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Barra d'eines de les pestanyes</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Nucli de Bitcoin</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>No hi ha cap font de bloc disponible...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Proccessats %1 blocs del històric de transaccions.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n hora</numerusform><numerusform>%n hores</numerusform></translation> @@ -525,10 +517,6 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Selecció de l'adreça de control de monedes</translation> - </message> - <message> <source>Quantity:</source> <translation>Quantitat:</translation> </message> @@ -577,10 +565,6 @@ Address: %4 <translation>Quantitat</translation> </message> <message> - <source>Address</source> - <translation>Adreça</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -912,15 +896,7 @@ Address: %4 <source>Error</source> <translation>Error</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB d'espai lliure disponible</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(d' %1GB necessari)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -955,14 +931,6 @@ Address: %4 <translation>&Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Comissió opcional de transacció per kB que ajuda a assegurar que les transaccions es processen ràpidament. La majoria de transaccions són d'1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Paga &comissió de transacció</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Inicia automàticament el Bitcoin després de l'inici de sessió del sistema.</translation> </message> @@ -991,14 +959,6 @@ Address: %4 <translation>Permet connexions entrants</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Connecta a la xarxa Bitcoin a través d'un proxy SOCKS.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Connecta a través d'un proxy SOCKS (proxy per defecte):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Adreça IP del proxy (p. ex. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1162,8 +1122,8 @@ Address: %4 <translation>La informació mostrada pot no estar al día. El teu moneder es sincronitza automàticament amb la xarxa Bitcoin un cop s'ha establert connexió, però aquest proces no s'ha completat encara.</translation> </message> <message> - <source>Wallet</source> - <translation>Moneder</translation> + <source>Watch-only:</source> + <translation>Només lectura:</translation> </message> <message> <source>Available:</source> @@ -1198,8 +1158,20 @@ Address: %4 <translation>El balanç total actual</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transaccions recents</b></translation> + <source>Your current balance in watch-only addresses</source> + <translation>El vostre balanç actual en adreces de només lectura</translation> + </message> + <message> + <source>Unconfirmed transactions to watch-only addresses</source> + <translation>Transaccions sense confirmar a adreces de només lectura</translation> + </message> + <message> + <source>Mined balance in watch-only addresses that has not yet matured</source> + <translation>Balanç minat en adreces de només lectura que encara no ha madurat</translation> + </message> + <message> + <source>Current total balance in watch-only addresses</source> + <translation>Balanç total actual en adreces de només lectura</translation> </message> <message> <source>out of sync</source> @@ -1461,8 +1433,36 @@ Address: %4 <translation>Serveis</translation> </message> <message> - <source>Sync Node</source> - <translation>Node de sincronització</translation> + <source>Starting Height</source> + <translation>Alçada inicial</translation> + </message> + <message> + <source>Sync Height</source> + <translation>Sincronitza l'alçada</translation> + </message> + <message> + <source>Ban Score</source> + <translation>Puntuació de bandeig</translation> + </message> + <message> + <source>Connection Time</source> + <translation>Temps de connexió</translation> + </message> + <message> + <source>Last Send</source> + <translation>Darrer enviament</translation> + </message> + <message> + <source>Last Receive</source> + <translation>Darrera recepció</translation> + </message> + <message> + <source>Bytes Sent</source> + <translation>Bytes enviats</translation> + </message> + <message> + <source>Bytes Received</source> + <translation>Bytes rebuts</translation> </message> <message> <source>Ping Time</source> @@ -1544,7 +1544,31 @@ Address: %4 <source>%1 GB</source> <translation>%1 GB</translation> </message> - </context> + <message> + <source>via %1</source> + <translation>a través de %1</translation> + </message> + <message> + <source>never</source> + <translation>mai</translation> + </message> + <message> + <source>Inbound</source> + <translation>Entrant</translation> + </message> + <message> + <source>Outbound</source> + <translation>Sortint</translation> + </message> + <message> + <source>Unknown</source> + <translation>Desconegut</translation> + </message> + <message> + <source>Fetching...</source> + <translation>S'està obtenint...</translation> + </message> +</context> <context> <name>ReceiveCoinsDialog</name> <message> @@ -1928,6 +1952,10 @@ Address: %4 <translation>Això és un pagament normal.</translation> </message> <message> + <source>The Bitcoin address to send the payment to</source> + <translation>L'adreça Bitcoin on enviar el pagament</translation> + </message> + <message> <source>Alt+A</source> <translation>Alta+A</translation> </message> @@ -1998,6 +2026,10 @@ Address: %4 <translation>Podeu signar missatges amb la vostra adreça per provar que són vostres. Aneu amb compte no signar qualsevol cosa, ja que els atacs de pesca electrònica (phishing) poden provar de confondre-us perquè els signeu amb la vostra identitat. Només signeu als documents completament detallats amb què hi esteu d'acord.</translation> </message> <message> + <source>The Bitcoin address to sign the message with</source> + <translation>L'adreça Bitcoin amb què signar el missatge</translation> + </message> + <message> <source>Choose previously used address</source> <translation>Tria les adreces fetes servir amb anterioritat</translation> </message> @@ -2050,6 +2082,10 @@ Address: %4 <translation>Introdueixi l'adreça signant, missatge (assegura't que copies salts de línia, espais, tabuladors, etc excactament tot el text) i la signatura a sota per verificar el missatge. Per evitar ser enganyat per un atac home-entre-mig, vés amb compte de no llegir més en la signatura del que hi ha al missatge signat mateix.</translation> </message> <message> + <source>The Bitcoin address the message was signed with</source> + <translation>L'adreça Bitcoin amb què va ser signat el missatge</translation> + </message> + <message> <source>Verify the message to ensure it was signed with the specified Bitcoin address</source> <translation>Verificar el missatge per assegurar-se que ha estat signat amb una adreça Bitcoin específica</translation> </message> @@ -2191,6 +2227,10 @@ Address: %4 <translation>Adreça pròpia</translation> </message> <message> + <source>watch-only</source> + <translation>només lectura</translation> + </message> + <message> <source>label</source> <translation>etiqueta</translation> </message> @@ -2211,6 +2251,14 @@ Address: %4 <translation>Dèbit</translation> </message> <message> + <source>Total debit</source> + <translation>Dèbit total</translation> + </message> + <message> + <source>Total credit</source> + <translation>Crèdit total</translation> + </message> + <message> <source>Transaction fee</source> <translation>Comissió de transacció</translation> </message> @@ -2361,6 +2409,10 @@ Address: %4 <translation>Minat</translation> </message> <message> + <source>watch-only</source> + <translation>només lectura</translation> + </message> + <message> <source>(n/a)</source> <translation>(n/a)</translation> </message> @@ -2526,7 +2578,11 @@ Address: %4 </context> <context> <name>UnitDisplayStatusBarControl</name> - </context> + <message> + <source>Unit to show amounts in. Click to select another unit.</source> + <translation>Unitat en què mostrar els imports. Feu clic per seleccionar una altra unitat.</translation> + </message> +</context> <context> <name>WalletFrame</name> <message> @@ -2583,26 +2639,10 @@ Address: %4 <translation>Opcions:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especifica un fitxer de configuració (per defecte: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especifica un fitxer pid (per defecte: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especifica el directori de dades</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Escolta connexions a <port> (per defecte: 8333 o testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Manté com a molt <n> connexions a iguals (per defecte: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Connecta al node per obtenir les adreces de les connexions, i desconnecta</translation> </message> @@ -2611,18 +2651,6 @@ Address: %4 <translation>Especifiqueu la vostra adreça pública</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Límit per a desconectar connexions errònies (per defecte: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Nombre de segons abans de reconectar amb connexions errònies (per defecte: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escolta connexions JSON-RPC al port <port> (per defecte: 8332 o testnet:18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Accepta la línia d'ordres i ordres JSON-RPC </translation> </message> @@ -2662,16 +2690,12 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Xifrats acceptables (per defecte: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Vincula a una adreça específica i sempre escolta-hi. Utilitza la notació [host]:port per IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Limita contínuament les transaccions gratuïtes a <n>*1000 bytes per minut (per defecte: 15)</translation> + <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> + <translation>Elimina totes les transaccions del moneder i només recupera aquelles de la cadena de blocs a través de -rescan a l'inici</translation> </message> <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> @@ -2690,14 +2714,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Executa una ordre quan una transacció del moneder canviï (%s en cmd es canvia per TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Buida l'activitat de la base de dades de la memòria disponible al registre del disc cada <n> megabytes (per defecte: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Com d'exhaustiva és la verificació de blocs de -checkblocks is (0-4, per defecte: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>En aquest mode -genproclimit controla quants blocs es generen immediatament.</translation> </message> @@ -2706,10 +2722,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Defineix el nombre de fils de verificació d'scripts (%u a %d, 0 = auto, <0 = deixa tants nuclis lliures, per defecte: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Defineix el límit de processadors quan està activada la generació (-1 = sense límit, per defecte: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Aquesta és una versió de pre-llançament - utilitza-la sota la teva responsabilitat - No usar per a minería o aplicacions de compra-venda</translation> </message> @@ -2718,10 +2730,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No es pot enllaçar %s a aquest ordinador. El Bitcoin Core probablement ja estigui executant-s'hi.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Utilitza un proxy SOCKS5 apart per arribar a iguals a través de serveis de Tor ocults (per defecte: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Avís: el -paytxfee és molt elevat! Aquesta és la comissió de transacció que pagareu si envieu una transacció.</translation> </message> @@ -2746,10 +2754,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>(per defecte: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(per defecte: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> pot ser:</translation> </message> @@ -2778,10 +2782,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Opcions de depuració/proves:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Inhabilia el mode segur (safemode), invalida un esdeveniment de mode segur real (per defecte: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Descobreix la pròpia adreça IP (per defecte: 1 quan escoltant i no -externalip)</translation> </message> @@ -2818,66 +2818,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Error: El moneder està bloquejat, no és possible crear la transacció!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Error: error de sistema: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Ha fallat escoltar a qualsevol port. Feu servir -listen=0 si voleu fer això.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Ha fallat la lectura de la informació del bloc</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Ha fallat la lectura del bloc</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Ha fallat la sincronització de l'índex de blocs</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Ha fallat la escriptura de l'índex de blocs</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Ha fallat la escriptura de la informació de bloc</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Ha fallat l'escriptura del bloc</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Ha fallat l'escriptura de la informació de fitxer</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Ha fallat l'escriptura de la basse de dades de monedes</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Ha fallat l'escriptura de l'índex de transaccions</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Ha fallat el desfer de dades</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Força el mode segur (per defecte: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Genera monedes (per defecte: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Quants blocs s'han de confirmar a l'inici (per defecte: 288, 0 = tots)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Si no se subministra <category>, mostra tota la informació de depuració.</translation> </message> @@ -2898,10 +2842,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No hi ha suficient descriptors de fitxers disponibles.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Posa davant de la sortida de depuració una marca horària (per defecte: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers actuals blk000??.dat</translation> </message> @@ -2914,18 +2854,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Defineix la mida màxim del bloc en bytes (per defecte: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Estableix el nombre de fils per atendre trucades RPC (per defecte: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Especifica un fitxer de moneder (dins del directori de dades)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Gasta el canvi sense confirmar en enviar transaccions (per defecte: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Això es així per a eines de proves de regressió per al desenvolupament d'aplicacions.</translation> </message> @@ -2954,26 +2886,102 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Importa blocs de un fitxer blk000??.dat extern</translation> </message> <message> + <source>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</source> + <translation>Permet les connexions JSON-RPC d'una font específica. Vàlid per a <ip> són una IP individual (p. ex., 1.2.3.4), una xarxa / màscara de xarxa (p. ex., 1.2.3.4/255.255.255.0) o una xarxa/CIDR (p. ex., 1.2.3.4/24). Es pot especificar aquesta opció moltes vegades</translation> + </message> + <message> + <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source> + <translation>Vincula l'adreça donada i posa a la llista blanca els iguals que s'hi connectin. Feu servir la notació [host]:port per a IPv6</translation> + </message> + <message> + <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source> + <translation>Vincula a l'adreça donada per a escoltar les connexions JSON-RPC. Feu servir la notació [host]:port per a IPv6. Aquesta opció pot ser especificada moltes vegades (per defecte: vincula a totes les interfícies)</translation> + </message> + <message> <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source> <translation>No es pot obtenir un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estigui executant.</translation> </message> <message> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Crea fitxers nous amb els permisos per defecte del sistema, en comptes de l'umask 077 (només efectiu amb la funcionalitat de moneder inhabilitada)</translation> + </message> + <message> + <source>Error: Listening for incoming connections failed (listen returned error %s)</source> + <translation>Error: ha fallat escoltar les connexions entrants (l'escoltament ha retornat l'error %s)</translation> + </message> + <message> + <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source> + <translation>Error: s'ha trobat un argument no permès de -socks. Ja no es pot definir més la versió de SOCKS, només s'accepten els proxies de SOCKS5.ç</translation> + </message> + <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Executa l'ordre quan es rebi un avís rellevant o veiem una forquilla molt llarga (%s en cmd és reemplaçat per un missatge)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Informació de la depuració de sortida (per defecte: 0, proporcionar <category> és opcional)</translation> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source> + <translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la transmissió (per defecte: %s)</translation> + </message> + <message> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source> + <translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la creació de la transacció (per defecte: %s)</translation> + </message> + <message> + <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> + <translation>Consulta a adreces d'iguals a través de DNS, si es troba baix en adreces (per defecte: 1 a menys que -connect)</translation> </message> <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>Defineix la mida màxima de transaccions d'alta prioritat / baixa comissió en bytes (per defecte: %d)</translation> </message> <message> + <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> + <translation>Aquest producte inclou programari desenvolupat pel projecte OpenSSL per a ús a l'OpenSSL Toolkit <https://www.openssl.org/> i programari criptogràfic escrit per Eric Young i programari UPnP escrit per Thomas Bernard.</translation> + </message> + <message> + <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source> + <translation>Avís: comproveu que la data i hora del vostre ordinador siguin correctes! Si el vostre rellotge no és correcte, el Bitcoin Core no funcionarà correctament.</translation> + </message> + <message> + <source>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</source> + <translation>Els iguals en la llista blanca no poden ser bandejats per DoS i es transmetran sempre llurs transaccions, fins i tot si ja són a la mempool. Això és útil, p. ex., per a una passarel·la</translation> + </message> + <message> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation> + </message> + <message> + <source>Connect through SOCKS5 proxy</source> + <translation>Connecta a través del proxy SOCKS5</translation> + </message> + <message> + <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> + <translation>Copyright (C) 2009-%i Els desenvolupadors del Bitcoin Core</translation> + </message> + <message> + <source>Could not parse -rpcbind value %s as network address</source> + <translation>No s'ha pogut analitzar el valor -rpcbind %s com una adreça de xarxa</translation> + </message> + <message> + <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source> + <translation>Error en carregar wallet.dat: el moneder requereix una versió més nova del Bitcoin core</translation> + </message> + <message> + <source>Error: Unsupported argument -tor found, use -onion.</source> + <translation>Error: s'ha trobat un argument -tor no acceptat. Feu servir -onion.</translation> + </message> + <message> + <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source> + <translation>Comissió en (BTC/kB) per afegir a les transaccions que envieu (per defecte: %s)</translation> + </message> + <message> <source>Information</source> <translation>&Informació</translation> </message> <message> + <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source> + <translation>Ha fallat la inicialització de la comprovació de validesa. El Bitcoin Core s'està aturant.</translation> + </message> + <message> <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> <translation>Import no vàlid per a -minrelaytxfee=<amount>: «%s»</translation> </message> @@ -2982,42 +2990,30 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Import no vàlid per a -mintxfee=<amount>: «%s»</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Mida límit de la memòria cau de signatura per a <n> entrades (per defecte: 50000)</translation> + <source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source> + <translation>Import no vàlid per a -paytxfee=<amount>: «%s» (ha de ser com a mínim %s)</translation> </message> <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Registra la prioritat de transacció i comissió per kB en minar blocs (per defecte: 0)</translation> + <source>Invalid netmask specified in -whitelist: '%s'</source> + <translation>S'ha especificat una màscara de xarxa no vàlida a -whitelist: «%s»</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Manté l'índex sencer de transaccions (per defecte: 0)</translation> + <source>Keep at most <n> unconnectable blocks in memory (default: %u)</source> + <translation>Manté com a màxim <n> blocs no connectables en memòria (per defecte: %u)</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Mida màxima del buffer de recepció per a cada connexió, <n>*1000 bytes (default: 5000)</translation> + <source>Need to specify a port with -whitebind: '%s'</source> + <translation>Cal especificar un port amb -whitebind: «%s»</translation> </message> <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Mida màxima del buffer d'enviament per a cada connexió, <n>*1000 bytes (default: 5000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Només accepta cadenes de blocs que coincideixin amb els punts de prova (per defecte: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Només connecta als nodes de la xarxa <net> (IPv4, IPv6 o Tor)</translation> + <source>Node relay options:</source> + <translation>Opcions de transmissió del node:</translation> </message> <message> <source>Print block on startup, if found in block index</source> <translation>Imprimeix el block a l'inici, si es troba l'índex de blocs</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Imprimeix l'arbre de blocs a l'inici (per defecte: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Opcions RPC SSL: (veieu el wiki del Bitcoin per a instruccions de configuració de l'SSL)</translation> </message> @@ -3034,22 +3030,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Introdueix incertesa en 1 de cada <n> missatges de la xarxa</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Executa un fil per buidar el moneder periòdicament (per defecte: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Defineix una mida mínima de bloc en bytes (per defecte: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Defineix el senyal DB_PRIVATE en l'entorn db del moneder (per defecte: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation> </message> @@ -3062,12 +3046,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ha fallat la signatura de la transacció</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especifica el temps limit per a un intent de connexió en mil·lisegons (per defecte: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Error de sistema: </translation> + <source>This is experimental software.</source> + <translation>Això és programari experimental.</translation> </message> <message> <source>Transaction amount too small</source> @@ -3082,8 +3062,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>La transacció és massa gran</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Utilitza UPnP per a mapejar els ports d'escolta (per defecte: 0)</translation> + <source>Unable to bind to %s on this computer (bind returned error %s)</source> + <translation>No s'ha pogut vincular a %s en aquest ordinador (la vinculació ha retornat l'error %s)</translation> </message> <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> @@ -3094,6 +3074,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Nom d'usuari per a connexions JSON-RPC</translation> </message> <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>Cal reescriure el moneder: reiniceu el Bitcoin Core per completar-ho.</translation> + </message> + <message> <source>Warning</source> <translation>Avís</translation> </message> @@ -3102,6 +3086,14 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Avís: aquesta versió està obsoleta. És necessari actualitzar-la!</translation> </message> <message> + <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source> + <translation>Avís: s'ha ignorat l'argument no acceptat de -benchmark. Feu servir -debug=bench.</translation> + </message> + <message> + <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source> + <translation>Avís: s'ha ignorat l'argument no acceptat de -debugnet. Feu servir -debug=net.</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>Se suprimeixen totes les transaccions del moneder...</translation> </message> @@ -3126,10 +3118,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Actualitza el moneder a l'últim format</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Defineix el límit de nombre de claus a <n> (per defecte: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Reescaneja la cadena de blocs en les transaccions de moneder perdudes</translation> </message> @@ -3138,14 +3126,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Utilitza OpenSSL (https) per a connexions JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Fitxer del certificat de servidor (per defecte: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clau privada del servidor (per defecte: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Aquest misatge d'ajuda</translation> </message> diff --git a/src/qt/locale/bitcoin_ca@valencia.ts b/src/qt/locale/bitcoin_ca@valencia.ts index 0d43d95d2a..d3bf33ebfb 100644 --- a/src/qt/locale/bitcoin_ca@valencia.ts +++ b/src/qt/locale/bitcoin_ca@valencia.ts @@ -1,13 +1,13 @@ -<TS language="ca@valencia" version="2.1"> +<TS language="ca@valencia" version="2.0"> <context> <name>AddressBookPage</name> <message> <source>Double-click to edit address or label</source> - <translation>Doble click per editar la direccio o la etiqueta</translation> + <translation>Feu doble clic per editar l'adreça o l'etiqueta</translation> </message> <message> <source>Create a new address</source> - <translation>Crear nova direccio</translation> + <translation>Crea una nova adreça</translation> </message> <message> <source>&New</source> @@ -15,7 +15,7 @@ </message> <message> <source>Copy the currently selected address to the system clipboard</source> - <translation>Copieu l'adreça seleccionada al porta-retalls del sistema</translation> + <translation>Copia l'adreça seleccionada al porta-retalls del sistema</translation> </message> <message> <source>&Copy</source> @@ -43,7 +43,7 @@ </message> <message> <source>&Delete</source> - <translation>Eliminar</translation> + <translation>&Elimina</translation> </message> <message> <source>Choose the address to send coins to</source> @@ -93,7 +93,11 @@ <source>Exporting Failed</source> <translation>L'exportació ha fallat</translation> </message> - </context> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>S'ha produït un error en guardar la llista d'adreces a %1. Torneu-ho a provar.</translation> + </message> +</context> <context> <name>AddressTableModel</name> <message> @@ -180,6 +184,10 @@ <translation>Moneder encriptat</translation> </message> <message> + <source>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>.</source> + <translation>Introduïu la contrasenya nova al moneder.<br/>Utilitzeu una contrasenya de <b>deu o més caràcters aleatoris</b>, o <b>vuit o més paraules</b>.</translation> + </message> + <message> <source>Bitcoin 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.</source> <translation>Bitcoin es tancarà ara per acabar el procés d'encriptació. Recordeu que encriptar el moneder no protegeix completament els bitcoins de ser robats per programari maliciós instal·lat a l'ordinador.</translation> </message> @@ -287,6 +295,10 @@ <translation>Obri un &URI...</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>Client del Bitcoin Core</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>S'estan important els blocs del disc...</translation> </message> @@ -339,6 +351,10 @@ <translation>&Rep</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation>Mostra informació del Bitcoin Core</translation> + </message> + <message> <source>&Show / Hide</source> <translation>&Mostra / Amaga</translation> </message> @@ -375,12 +391,8 @@ <translation>Barra d'eines de les pestanyes</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> - <translation>Bitcoin Core</translation> + <translation>Nucli de Bitcoin</translation> </message> <message> <source>Request payments (generates QR codes and bitcoin: URIs)</source> @@ -415,10 +427,6 @@ <translation>No hi ha cap font de bloc disponible...</translation> </message> <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Proccessats %1 blocs del històric de transaccions.</translation> - </message> - <message> <source>%1 and %2</source> <translation>%1 i %2</translation> </message> @@ -489,10 +497,6 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Selecció de l'adreça de control de monedes</translation> - </message> - <message> <source>Quantity:</source> <translation>Quantitat:</translation> </message> @@ -513,8 +517,12 @@ Address: %4 <translation>Quota:</translation> </message> <message> + <source>Dust:</source> + <translation>Polsim:</translation> + </message> + <message> <source>After Fee:</source> - <translation>Comissió posterior:</translation> + <translation>Quota posterior:</translation> </message> <message> <source>Change:</source> @@ -534,11 +542,7 @@ Address: %4 </message> <message> <source>Amount</source> - <translation>Import</translation> - </message> - <message> - <source>Address</source> - <translation>Adreça</translation> + <translation>Quantitat</translation> </message> <message> <source>Date</source> @@ -601,6 +605,10 @@ Address: %4 <translation>Copia la prioritat</translation> </message> <message> + <source>Copy dust</source> + <translation>Copia el polsim</translation> + </message> + <message> <source>Copy change</source> <translation>Copia el canvi</translation> </message> @@ -649,6 +657,10 @@ Address: %4 <translation>cap</translation> </message> <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>Pot variar +/- %1 satoshi(s) per entrada.</translation> + </message> + <message> <source>yes</source> <translation>sí</translation> </message> @@ -775,7 +787,7 @@ Address: %4 <name>HelpMessageDialog</name> <message> <source>Bitcoin Core</source> - <translation>Bitcoin Core</translation> + <translation>Nucli de Bitcoin</translation> </message> <message> <source>version</source> @@ -790,6 +802,10 @@ Address: %4 <translation>Quant al Bitcoin Core</translation> </message> <message> + <source>Command-line options</source> + <translation>Opcions de línia d'ordes</translation> + </message> + <message> <source>Usage:</source> <translation>Ús:</translation> </message> @@ -850,21 +866,17 @@ Address: %4 </message> <message> <source>Bitcoin Core</source> - <translation>Bitcoin Core</translation> - </message> - <message> - <source>Error</source> - <translation>Error</translation> + <translation>Nucli de Bitcoin</translation> </message> <message> - <source>GB of free space available</source> - <translation>GB d'espai lliure disponible</translation> + <source>Error: Specified data directory "%1" cannot be created.</source> + <translation>Error: el directori de dades «%1» especificat no pot ser creat.</translation> </message> <message> - <source>(of %1GB needed)</source> - <translation>(d' %1GB necessari)</translation> + <source>Error</source> + <translation>Error</translation> </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -899,14 +911,6 @@ Address: %4 <translation>&Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Comissió opcional de transacció per kB que ajuda a assegurar que les transaccions es processen ràpidament. La majoria de transaccions són d'1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Paga &comissió de transacció</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Inicia automàticament el Bitcoin després de l'inici de sessió del sistema.</translation> </message> @@ -927,12 +931,12 @@ Address: %4 <translation>Nombre de fils de &verificació d'scripts</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Connecta a la xarxa Bitcoin a través d'un proxy SOCKS.</translation> + <source>Accept connections from outside</source> + <translation>Accepta connexions de fora</translation> </message> <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Connecta a través d'un proxy SOCKS (proxy per defecte):</translation> + <source>Allow incoming connections</source> + <translation>Permet connexions entrants</translation> </message> <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> @@ -1098,8 +1102,8 @@ Address: %4 <translation>La informació mostrada pot no estar al día. El teu moneder es sincronitza automàticament amb la xarxa Bitcoin un cop s'ha establit connexió, però este proces no s'ha completat encara.</translation> </message> <message> - <source>Wallet</source> - <translation>Moneder</translation> + <source>Watch-only:</source> + <translation>Només lectura:</translation> </message> <message> <source>Available:</source> @@ -1134,8 +1138,20 @@ Address: %4 <translation>El balanç total actual</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transaccions recents</b></translation> + <source>Your current balance in watch-only addresses</source> + <translation>El vostre balanç actual en adreces de només lectura</translation> + </message> + <message> + <source>Unconfirmed transactions to watch-only addresses</source> + <translation>Transaccions sense confirmar a adreces de només lectura</translation> + </message> + <message> + <source>Mined balance in watch-only addresses that has not yet matured</source> + <translation>Balanç minat en adreces de només lectura que encara no ha madurat</translation> + </message> + <message> + <source>Current total balance in watch-only addresses</source> + <translation>Balanç total actual en adreces de només lectura</translation> </message> <message> <source>out of sync</source> @@ -1153,6 +1169,22 @@ Address: %4 <translation>Adreça de pagament no vàlida %1</translation> </message> <message> + <source>Payment request rejected</source> + <translation>La sol·licitud de pagament s'ha rebutjat</translation> + </message> + <message> + <source>Payment request network doesn't match client network.</source> + <translation>La xarxa de la sol·licitud de pagament no coincideix amb la xarxa del client.</translation> + </message> + <message> + <source>Payment request has expired.</source> + <translation>La sol·licitud de pagament ha caducat.</translation> + </message> + <message> + <source>Payment request is not initialized.</source> + <translation>La sol·licitud de pagament no està inicialitzada.</translation> + </message> + <message> <source>Requested payment amount of %1 is too small (considered dust).</source> <translation>L'import de pagament sol·licitat %1 és massa petit (es considera polsim).</translation> </message> @@ -1169,10 +1201,18 @@ Address: %4 <translation>L'URL de recuperació de la sol·licitud de pagament no és vàlida: %1</translation> </message> <message> + <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source> + <translation>L'URI no pot ser analitzat! Això pot ser a causa d'una adreça de Bitcoin no vàlida o per paràmetres URI amb mal format.</translation> + </message> + <message> <source>Payment request file handling</source> <translation>Gestió de fitxers de les sol·licituds de pagament</translation> </message> <message> + <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source> + <translation>No es pot llegir el fitxer de la sol·licitud de pagament. Això pot ser causat per un fitxer de sol·licitud de pagament no vàlid.</translation> + </message> + <message> <source>Unverified payment requests to custom payment scripts are unsupported.</source> <translation>No s'accepten sol·licituds de pagament no verificades a scripts de pagament personalitzats.</translation> </message> @@ -1185,6 +1225,10 @@ Address: %4 <translation>Error en comunicar amb %1: %2</translation> </message> <message> + <source>Payment request cannot be parsed!</source> + <translation>No es pot analitzar la sol·licitud de pagament!</translation> + </message> + <message> <source>Bad response from server %1</source> <translation>Mala resposta del servidor %1</translation> </message> @@ -1199,12 +1243,32 @@ Address: %4 </context> <context> <name>PeerTableModel</name> - </context> + <message> + <source>User Agent</source> + <translation>Agent d'usuari</translation> + </message> + <message> + <source>Address/Hostname</source> + <translation>Adreça / nom de l'ordinador</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Temps de ping</translation> + </message> +</context> <context> <name>QObject</name> <message> <source>Amount</source> - <translation>Import</translation> + <translation>Quantitat</translation> + </message> + <message> + <source>Enter a Bitcoin address (e.g. %1)</source> + <translation>Introduïu una adreça de Bitcoin (p. ex. %1)</translation> + </message> + <message> + <source>%1 d</source> + <translation>%1 d</translation> </message> <message> <source>%1 h</source> @@ -1215,10 +1279,30 @@ Address: %4 <translation>%1 m</translation> </message> <message> + <source>%1 s</source> + <translation>%1 s</translation> + </message> + <message> + <source>NETWORK</source> + <translation>XARXA</translation> + </message> + <message> + <source>UNKNOWN</source> + <translation>DESCONEGUT</translation> + </message> + <message> + <source>None</source> + <translation>Cap</translation> + </message> + <message> <source>N/A</source> - <translation>N/D</translation> + <translation>N/A</translation> </message> - </context> + <message> + <source>%1 ms</source> + <translation>%1 ms</translation> + </message> +</context> <context> <name>QRImageWidget</name> <message> @@ -1246,7 +1330,7 @@ Address: %4 </message> <message> <source>N/A</source> - <translation>N/D</translation> + <translation>N/A</translation> </message> <message> <source>Client version</source> @@ -1269,6 +1353,10 @@ Address: %4 <translation>Utilitzant OpenSSL versió</translation> </message> <message> + <source>Using BerkeleyDB version</source> + <translation>Utilitzant BerkeleyDB versió</translation> + </message> + <message> <source>Startup time</source> <translation>&Temps d'inici</translation> </message> @@ -1293,6 +1381,74 @@ Address: %4 <translation>Nombre de blocs actuals</translation> </message> <message> + <source>Received</source> + <translation>Rebut</translation> + </message> + <message> + <source>Sent</source> + <translation>Enviat</translation> + </message> + <message> + <source>&Peers</source> + <translation>&Iguals</translation> + </message> + <message> + <source>Select a peer to view detailed information.</source> + <translation>Seleccioneu un igual per mostrar informació detallada.</translation> + </message> + <message> + <source>Direction</source> + <translation>Direcció</translation> + </message> + <message> + <source>Version</source> + <translation>Versió</translation> + </message> + <message> + <source>User Agent</source> + <translation>Agent d'usuari</translation> + </message> + <message> + <source>Services</source> + <translation>Serveis</translation> + </message> + <message> + <source>Starting Height</source> + <translation>Alçada inicial</translation> + </message> + <message> + <source>Sync Height</source> + <translation>Sincronitza l'alçada</translation> + </message> + <message> + <source>Ban Score</source> + <translation>Puntuació de bandeig</translation> + </message> + <message> + <source>Connection Time</source> + <translation>Temps de connexió</translation> + </message> + <message> + <source>Last Send</source> + <translation>Darrer enviament</translation> + </message> + <message> + <source>Last Receive</source> + <translation>Darrera recepció</translation> + </message> + <message> + <source>Bytes Sent</source> + <translation>Bytes enviats</translation> + </message> + <message> + <source>Bytes Received</source> + <translation>Bytes rebuts</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Temps de ping</translation> + </message> + <message> <source>Last block time</source> <translation>Últim temps de bloc</translation> </message> @@ -1368,7 +1524,31 @@ Address: %4 <source>%1 GB</source> <translation>%1 GB</translation> </message> - </context> + <message> + <source>via %1</source> + <translation>a través de %1</translation> + </message> + <message> + <source>never</source> + <translation>mai</translation> + </message> + <message> + <source>Inbound</source> + <translation>Entrant</translation> + </message> + <message> + <source>Outbound</source> + <translation>Eixint</translation> + </message> + <message> + <source>Unknown</source> + <translation>Desconegut</translation> + </message> + <message> + <source>Fetching...</source> + <translation>S'està obtenint...</translation> + </message> +</context> <context> <name>ReceiveCoinsDialog</name> <message> @@ -1409,7 +1589,7 @@ Address: %4 </message> <message> <source>Clear all fields of the form.</source> - <translation>Neteja tots els camps del formulari.</translation> + <translation>Esborra tots els camps del formuari.</translation> </message> <message> <source>Clear</source> @@ -1441,7 +1621,7 @@ Address: %4 </message> <message> <source>Copy label</source> - <translation>Copiar etiqueta</translation> + <translation>Copia l'etiqueta</translation> </message> <message> <source>Copy message</source> @@ -1578,11 +1758,11 @@ Address: %4 </message> <message> <source>Fee:</source> - <translation>Quota:</translation> + <translation>Comissió:</translation> </message> <message> <source>After Fee:</source> - <translation>Comissió posterior:</translation> + <translation>Quota posterior:</translation> </message> <message> <source>Change:</source> @@ -1606,7 +1786,11 @@ Address: %4 </message> <message> <source>Clear all fields of the form.</source> - <translation>Neteja tots els camps del formulari.</translation> + <translation>Netejar tots els camps del formulari.</translation> + </message> + <message> + <source>Dust:</source> + <translation>Polsim:</translation> </message> <message> <source>Clear &All</source> @@ -1642,7 +1826,7 @@ Address: %4 </message> <message> <source>Copy fee</source> - <translation>Copia la comissió</translation> + <translation>Copia la comissi</translation> </message> <message> <source>Copy after fee</source> @@ -1709,6 +1893,10 @@ Address: %4 <translation>Avís: adreça de canvi desconeguda</translation> </message> <message> + <source>Copy dust</source> + <translation>Copia el polsim</translation> + </message> + <message> <source>Are you sure you want to send?</source> <translation>Esteu segur que ho voleu enviar?</translation> </message> @@ -1737,19 +1925,23 @@ Address: %4 </message> <message> <source>Choose previously used address</source> - <translation>Tria les adreces fetes servir amb anterioritat</translation> + <translation>Trieu una adreça feta servir anteriorment</translation> </message> <message> <source>This is a normal payment.</source> <translation>Això és un pagament normal.</translation> </message> <message> + <source>The Bitcoin address to send the payment to</source> + <translation>L'adreça Bitcoin on enviar el pagament</translation> + </message> + <message> <source>Alt+A</source> - <translation>Alt+A</translation> + <translation>Alta+A</translation> </message> <message> <source>Paste address from clipboard</source> - <translation>Apega l'adreça del porta-retalls</translation> + <translation>Apegar adreça del porta-retalls</translation> </message> <message> <source>Alt+P</source> @@ -1814,6 +2006,10 @@ Address: %4 <translation>Podeu signar missatges amb la vostra adreça per provar que són vostres. Aneu amb compte no signar qualsevol cosa, ja que els atacs de pesca electrònica (phishing) poden provar de confondre-vos perquè els signeu amb la vostra identitat. Només signeu als documents completament detallats amb què hi esteu d'acord.</translation> </message> <message> + <source>The Bitcoin address to sign the message with</source> + <translation>L'adreça Bitcoin amb què signar el missatge</translation> + </message> + <message> <source>Choose previously used address</source> <translation>Tria les adreces fetes servir amb anterioritat</translation> </message> @@ -1866,6 +2062,10 @@ Address: %4 <translation>Introduïsca l'adreça signant, missatge (assegura't que copies salts de línia, espais, tabuladors, etc excactament tot el text) i la signatura a sota per verificar el missatge. Per evitar ser enganyat per un atac home-entre-mig, vés amb compte de no llegir més en la signatura del que hi ha al missatge signat mateix.</translation> </message> <message> + <source>The Bitcoin address the message was signed with</source> + <translation>L'adreça Bitcoin amb què va ser signat el missatge</translation> + </message> + <message> <source>Verify the message to ensure it was signed with the specified Bitcoin address</source> <translation>Verificar el missatge per assegurar-se que ha estat signat amb una adreça Bitcoin específica</translation> </message> @@ -2003,6 +2203,10 @@ Address: %4 <translation>Adreça pròpia</translation> </message> <message> + <source>watch-only</source> + <translation>només lectura</translation> + </message> + <message> <source>label</source> <translation>etiqueta</translation> </message> @@ -2019,6 +2223,14 @@ Address: %4 <translation>Dèbit</translation> </message> <message> + <source>Total debit</source> + <translation>Dèbit total</translation> + </message> + <message> + <source>Total credit</source> + <translation>Crèdit total</translation> + </message> + <message> <source>Transaction fee</source> <translation>Comissió de transacció</translation> </message> @@ -2060,7 +2272,7 @@ Address: %4 </message> <message> <source>Amount</source> - <translation>Import</translation> + <translation>Quantitat</translation> </message> <message> <source>true</source> @@ -2161,6 +2373,10 @@ Address: %4 <translation>Minat</translation> </message> <message> + <source>watch-only</source> + <translation>només lectura</translation> + </message> + <message> <source>(n/a)</source> <translation>(n/a)</translation> </message> @@ -2245,7 +2461,7 @@ Address: %4 </message> <message> <source>Copy address</source> - <translation>Copiar adreça </translation> + <translation>Copia l'adreça</translation> </message> <message> <source>Copy label</source> @@ -2289,7 +2505,7 @@ Address: %4 </message> <message> <source>Comma separated file (*.csv)</source> - <translation>Fitxer de separació amb comes (*.csv)</translation> + <translation>Fitxer separat per comes (*.csv)</translation> </message> <message> <source>Confirmed</source> @@ -2326,7 +2542,11 @@ Address: %4 </context> <context> <name>UnitDisplayStatusBarControl</name> - </context> + <message> + <source>Unit to show amounts in. Click to select another unit.</source> + <translation>Unitat en què mostrar els imports. Feu clic per seleccionar una altra unitat.</translation> + </message> +</context> <context> <name>WalletFrame</name> <message> @@ -2383,26 +2603,10 @@ Address: %4 <translation>Opcions:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especifica un fitxer de configuració (per defecte: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especifica un fitxer pid (per defecte: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especifica el directori de dades</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Escolta connexions a <port> (per defecte: 8333 o testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Manté com a molt <n> connexions a iguals (per defecte: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Connecta al node per obtindre les adreces de les connexions, i desconnecta</translation> </message> @@ -2411,18 +2615,6 @@ Address: %4 <translation>Especifiqueu la vostra adreça pública</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Límit per a desconectar connexions errònies (per defecte: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Nombre de segons abans de reconectar amb connexions errònies (per defecte: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escolta connexions JSON-RPC al port <port> (per defecte: 8332 o testnet:18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Accepta la línia d'ordes i ordes JSON-RPC </translation> </message> @@ -2462,16 +2654,12 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Xifrats acceptables (per defecte: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Vincula a una adreça específica i sempre escolta-hi. Utilitza la notació [host]:port per IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Limita contínuament les transaccions gratuïtes a <n>*1000 bytes per minut (per defecte: 15)</translation> + <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> + <translation>Elimina totes les transaccions del moneder i només recupera aquelles de la cadena de blocs a través de -rescan a l'inici</translation> </message> <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> @@ -2490,14 +2678,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Executa una orde quan una transacció del moneder canvie (%s en cmd es canvia per TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Buida l'activitat de la base de dades de la memòria disponible al registre del disc cada <n> megabytes (per defecte: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Com d'exhaustiva és la verificació de blocs de -checkblocks is (0-4, per defecte: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>En este mode -genproclimit controla quants blocs es generen immediatament.</translation> </message> @@ -2506,10 +2686,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Defineix el nombre de fils de verificació d'scripts (%u a %d, 0 = auto, <0 = deixa tants nuclis lliures, per defecte: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Defineix el límit de processadors quan està activada la generació (-1 = sense límit, per defecte: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Esta és una versió de pre-llançament - utilitza-la sota la teva responsabilitat - No usar per a minería o aplicacions de compra-venda</translation> </message> @@ -2518,10 +2694,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No es pot enllaçar %s a este ordinador. El Bitcoin Core probablement ja estiga executant-s'hi.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Utilitza un proxy SOCKS5 apart per arribar a iguals a través de serveis de Tor ocults (per defecte: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Avís: el -paytxfee és molt elevat! Esta és la comissió de transacció que pagareu si envieu una transacció.</translation> </message> @@ -2546,10 +2718,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>(per defecte: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(per defecte: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> pot ser:</translation> </message> @@ -2578,10 +2746,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Opcions de depuració/proves:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Inhabilia el mode segur (safemode), invalida un esdeveniment de mode segur real (per defecte: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Descobreix la pròpia adreça IP (per defecte: 1 quan escoltant i no -externalip)</translation> </message> @@ -2618,66 +2782,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Error: El moneder està bloquejat, no és possible crear la transacció!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Error: error de sistema: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Ha fallat escoltar a qualsevol port. Feu servir -listen=0 si voleu fer això.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Ha fallat la lectura de la informació del bloc</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Ha fallat la lectura del bloc</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Ha fallat la sincronització de l'índex de blocs</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Ha fallat la escriptura de l'índex de blocs</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Ha fallat la escriptura de la informació de bloc</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Ha fallat l'escriptura del bloc</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Ha fallat l'escriptura de la informació de fitxer</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Ha fallat l'escriptura de la basse de dades de monedes</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Ha fallat l'escriptura de l'índex de transaccions</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Ha fallat el desfer de dades</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Força el mode segur (per defecte: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Genera monedes (per defecte: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Quants blocs s'han de confirmar a l'inici (per defecte: 288, 0 = tots)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Si no se subministra <category>, mostra tota la informació de depuració.</translation> </message> @@ -2698,10 +2806,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No hi ha suficient descriptors de fitxers disponibles.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Posa davant de l'eixida de depuració una marca horària (per defecte: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers actuals blk000??.dat</translation> </message> @@ -2714,18 +2818,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Defineix la mida màxim del bloc en bytes (per defecte: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Estableix el nombre de fils per atendre trucades RPC (per defecte: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Especifica un fitxer de moneder (dins del directori de dades)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Gasta el canvi sense confirmar en enviar transaccions (per defecte: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Això s'així per a eines de proves de regressió per al desenvolupament d'aplicacions.</translation> </message> @@ -2754,24 +2850,100 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Importa blocs d'un fitxer blk000??.dat extern</translation> </message> <message> + <source>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</source> + <translation>Permet les connexions JSON-RPC d'una font específica. Vàlid per a <ip> són una IP individual (p. ex., 1.2.3.4), una xarxa / màscara de xarxa (p. ex., 1.2.3.4/255.255.255.0) o una xarxa/CIDR (p. ex., 1.2.3.4/24). Es pot especificar esta opció moltes vegades</translation> + </message> + <message> + <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source> + <translation>Vincula l'adreça donada i posa a la llista blanca els iguals que s'hi connecten. Feu servir la notació [host]:port per a IPv6</translation> + </message> + <message> + <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source> + <translation>Vincula a l'adreça donada per a escoltar les connexions JSON-RPC. Feu servir la notació [host]:port per a IPv6. Esta opció pot ser especificada moltes vegades (per defecte: vincula a totes les interfícies)</translation> + </message> + <message> <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source> <translation>No es pot obtindre un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estiga executant.</translation> </message> <message> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Crea fitxers nous amb els permisos per defecte del sistema, en comptes de l'umask 077 (només efectiu amb la funcionalitat de moneder inhabilitada)</translation> + </message> + <message> + <source>Error: Listening for incoming connections failed (listen returned error %s)</source> + <translation>Error: ha fallat escoltar les connexions entrants (l'escoltament ha retornat l'error %s)</translation> + </message> + <message> + <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source> + <translation>Error: s'ha trobat un argument no permés de -socks. Ja no es pot definir més la versió de SOCKS, només s'accepten els proxies de SOCKS5.ç</translation> + </message> + <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Executa l'orde quan es reba un avís rellevant o veiem una forquilla molt llarga (%s en cmd és reemplaçat per un missatge)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Informació de la depuració d'eixida (per defecte: 0, proporcionar <category> és opcional)</translation> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source> + <translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la transmissió (per defecte: %s)</translation> + </message> + <message> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source> + <translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la creació de la transacció (per defecte: %s)</translation> + </message> + <message> + <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> + <translation>Consulta a adreces d'iguals a través de DNS, si es troba baix en adreces (per defecte: 1 a menys que -connect)</translation> </message> <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>Defineix la mida màxima de transaccions d'alta prioritat / baixa comissió en bytes (per defecte: %d)</translation> </message> <message> + <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> + <translation>Este producte inclou programari desenvolupat pel projecte OpenSSL per a ús a l'OpenSSL Toolkit <https://www.openssl.org/> i programari criptogràfic escrit per Eric Young i programari UPnP escrit per Thomas Bernard.</translation> + </message> + <message> + <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source> + <translation>Avís: comproveu que la data i hora del vostre ordinador siguen correctes! Si el vostre rellotge no és correcte, el Bitcoin Core no funcionarà correctament.</translation> + </message> + <message> + <source>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</source> + <translation>Els iguals en la llista blanca no poden ser bandejats per DoS i es transmetran sempre llurs transaccions, fins i tot si ja són a la mempool. Això és útil, p. ex., per a una passarel·la</translation> + </message> + <message> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation> + </message> + <message> + <source>Connect through SOCKS5 proxy</source> + <translation>Connecta a través del proxy SOCKS5</translation> + </message> + <message> + <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> + <translation>Copyright (C) 2009-%i Els desenvolupadors del Bitcoin Core</translation> + </message> + <message> + <source>Could not parse -rpcbind value %s as network address</source> + <translation>No s'ha pogut analitzar el valor -rpcbind %s com una adreça de xarxa</translation> + </message> + <message> + <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source> + <translation>Error en carregar wallet.dat: el moneder requereix una versió més nova del Bitcoin core</translation> + </message> + <message> + <source>Error: Unsupported argument -tor found, use -onion.</source> + <translation>Error: s'ha trobat un argument -tor no acceptat. Feu servir -onion.</translation> + </message> + <message> + <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source> + <translation>Comissió en (BTC/kB) per afegir a les transaccions que envieu (per defecte: %s)</translation> + </message> + <message> <source>Information</source> - <translation>Informació</translation> + <translation>&Informació</translation> + </message> + <message> + <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source> + <translation>Ha fallat la inicialització de la comprovació de validesa. El Bitcoin Core s'està parant.</translation> </message> <message> <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> @@ -2782,42 +2954,30 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Import no vàlid per a -mintxfee=<amount>: «%s»</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Mida límit de la memòria cau de signatura per a <n> entrades (per defecte: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Registra la prioritat de transacció i comissió per kB en minar blocs (per defecte: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Manté l'índex sencer de transaccions (per defecte: 0)</translation> + <source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source> + <translation>Import no vàlid per a -paytxfee=<amount>: «%s» (ha de ser com a mínim %s)</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Mida màxima del buffer de recepció per a cada connexió, <n>*1000 bytes (default: 5000)</translation> + <source>Invalid netmask specified in -whitelist: '%s'</source> + <translation>S'ha especificat una màscara de xarxa no vàlida a -whitelist: «%s»</translation> </message> <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Mida màxima del buffer d'enviament per a cada connexió, <n>*1000 bytes (default: 5000)</translation> + <source>Keep at most <n> unconnectable blocks in memory (default: %u)</source> + <translation>Manté com a màxim <n> blocs no connectables en memòria (per defecte: %u)</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Només accepta cadenes de blocs que coincidisquen amb els punts de prova (per defecte: 1)</translation> + <source>Need to specify a port with -whitebind: '%s'</source> + <translation>Cal especificar un port amb -whitebind: «%s»</translation> </message> <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Només connecta als nodes de la xarxa <net> (IPv4, IPv6 o Tor)</translation> + <source>Node relay options:</source> + <translation>Opcions de transmissió del node:</translation> </message> <message> <source>Print block on startup, if found in block index</source> <translation>Imprimeix el block a l'inici, si es troba l'índex de blocs</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Imprimeix l'arbre de blocs a l'inici (per defecte: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Opcions RPC SSL: (veieu el wiki del Bitcoin per a instruccions de configuració de l'SSL)</translation> </message> @@ -2834,22 +2994,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Introdueix incertesa en 1 de cada <n> missatges de la xarxa</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Executa un fil per buidar el moneder periòdicament (per defecte: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Defineix una mida mínima de bloc en bytes (per defecte: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Defineix el senyal DB_PRIVATE en l'entorn db del moneder (per defecte: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation> </message> @@ -2862,12 +3010,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ha fallat la signatura de la transacció</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especifica el temps limit per a un intent de connexió en mil·lisegons (per defecte: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Error de sistema: </translation> + <source>This is experimental software.</source> + <translation>Això és programari experimental.</translation> </message> <message> <source>Transaction amount too small</source> @@ -2882,8 +3026,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>La transacció és massa gran</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Utilitza UPnP per a mapejar els ports d'escolta (per defecte: 0)</translation> + <source>Unable to bind to %s on this computer (bind returned error %s)</source> + <translation>No s'ha pogut vincular a %s en este ordinador (la vinculació ha retornat l'error %s)</translation> </message> <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> @@ -2894,6 +3038,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Nom d'usuari per a connexions JSON-RPC</translation> </message> <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>Cal reescriure el moneder: reiniceu el Bitcoin Core per completar-ho.</translation> + </message> + <message> <source>Warning</source> <translation>Avís</translation> </message> @@ -2902,6 +3050,14 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Avís: esta versió està obsoleta. És necessari actualitzar-la!</translation> </message> <message> + <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source> + <translation>Avís: s'ha ignorat l'argument no acceptat de -benchmark. Feu servir -debug=bench.</translation> + </message> + <message> + <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source> + <translation>Avís: s'ha ignorat l'argument no acceptat de -debugnet. Feu servir -debug=net.</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>Se suprimeixen totes les transaccions del moneder...</translation> </message> @@ -2926,10 +3082,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Actualitza el moneder a l'últim format</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Defineix el límit de nombre de claus a <n> (per defecte: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Reescaneja la cadena de blocs en les transaccions de moneder perdudes</translation> </message> @@ -2938,14 +3090,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Utilitza OpenSSL (https) per a connexions JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Fitxer del certificat de servidor (per defecte: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clau privada del servidor (per defecte: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Este misatge d'ajuda</translation> </message> diff --git a/src/qt/locale/bitcoin_ca_ES.ts b/src/qt/locale/bitcoin_ca_ES.ts index f3b2b4a926..60c6fa30f4 100644 --- a/src/qt/locale/bitcoin_ca_ES.ts +++ b/src/qt/locale/bitcoin_ca_ES.ts @@ -1,4 +1,4 @@ -<TS language="ca_ES" version="2.1"> +<TS language="ca_ES" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Barra d'eines de les pestanyes</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Nucli de Bitcoin</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>No hi ha cap font de bloc disponible...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Proccessats %1 blocs del històric de transaccions.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n hora</numerusform><numerusform>%n hores</numerusform></translation> @@ -525,10 +517,6 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Selecció de l'adreça de control de monedes</translation> - </message> - <message> <source>Quantity:</source> <translation>Quantitat:</translation> </message> @@ -577,10 +565,6 @@ Address: %4 <translation>Quantitat</translation> </message> <message> - <source>Address</source> - <translation>Adreça</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -912,15 +896,7 @@ Address: %4 <source>Error</source> <translation>Error</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB d'espai lliure disponible</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(d' %1GB necessari)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -955,14 +931,6 @@ Address: %4 <translation>&Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Comissió opcional de transacció per kB que ajuda a assegurar que les transaccions es processen ràpidament. La majoria de transaccions són d'1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Paga &comissió de transacció</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Inicia automàticament el Bitcoin després de l'inici de sessió del sistema.</translation> </message> @@ -991,14 +959,6 @@ Address: %4 <translation>Permet connexions entrants</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Connecta a la xarxa Bitcoin a través d'un proxy SOCKS.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Connecta a través d'un proxy SOCKS (proxy per defecte):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Adreça IP del proxy (p. ex. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1162,10 +1122,6 @@ Address: %4 <translation>La informació mostrada pot no estar al día. El teu moneder es sincronitza automàticament amb la xarxa Bitcoin un cop s'ha establert connexió, però aquest proces no s'ha completat encara.</translation> </message> <message> - <source>Wallet</source> - <translation>Moneder</translation> - </message> - <message> <source>Watch-only:</source> <translation>Només lectura:</translation> </message> @@ -1218,10 +1174,6 @@ Address: %4 <translation>Balanç total actual en adreces de només lectura</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transaccions recents</b></translation> - </message> - <message> <source>out of sync</source> <translation>Fora de sincronia</translation> </message> @@ -1481,10 +1433,6 @@ Address: %4 <translation>Serveis</translation> </message> <message> - <source>Sync Node</source> - <translation>Node de sincronització</translation> - </message> - <message> <source>Starting Height</source> <translation>Alçada inicial</translation> </message> @@ -1613,14 +1561,6 @@ Address: %4 <translation>Sortint</translation> </message> <message> - <source>Yes</source> - <translation>Sí</translation> - </message> - <message> - <source>No</source> - <translation>No</translation> - </message> - <message> <source>Unknown</source> <translation>Desconegut</translation> </message> @@ -2469,6 +2409,10 @@ Address: %4 <translation>Minat</translation> </message> <message> + <source>watch-only</source> + <translation>només lectura</translation> + </message> + <message> <source>(n/a)</source> <translation>(n/a)</translation> </message> @@ -2695,26 +2639,10 @@ Address: %4 <translation>Opcions:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especifica un fitxer de configuració (per defecte: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especifica un fitxer pid (per defecte: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especifica el directori de dades</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Escolta connexions a <port> (per defecte: 8333 o testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Manté com a molt <n> connexions a iguals (per defecte: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Connecta al node per obtenir les adreces de les connexions, i desconnecta</translation> </message> @@ -2723,18 +2651,6 @@ Address: %4 <translation>Especifiqueu la vostra adreça pública</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Límit per a desconectar connexions errònies (per defecte: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Nombre de segons abans de reconectar amb connexions errònies (per defecte: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escolta connexions JSON-RPC al port <port> (per defecte: 8332 o testnet:18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Accepta la línia d'ordres i ordres JSON-RPC </translation> </message> @@ -2774,18 +2690,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Xifrats acceptables (per defecte: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Vincula a una adreça específica i sempre escolta-hi. Utilitza la notació [host]:port per IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Limita contínuament les transaccions gratuïtes a <n>*1000 bytes per minut (per defecte: 15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>Elimina totes les transaccions del moneder i només recupera aquelles de la cadena de blocs a través de -rescan a l'inici</translation> </message> @@ -2806,14 +2714,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Executa una ordre quan una transacció del moneder canviï (%s en cmd es canvia per TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Buida l'activitat de la base de dades de la memòria disponible al registre del disc cada <n> megabytes (per defecte: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Com d'exhaustiva és la verificació de blocs de -checkblocks is (0-4, per defecte: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>En aquest mode -genproclimit controla quants blocs es generen immediatament.</translation> </message> @@ -2822,10 +2722,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Defineix el nombre de fils de verificació d'scripts (%u a %d, 0 = auto, <0 = deixa tants nuclis lliures, per defecte: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Defineix el límit de processadors quan està activada la generació (-1 = sense límit, per defecte: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Aquesta és una versió de pre-llançament - utilitza-la sota la teva responsabilitat - No usar per a minería o aplicacions de compra-venda</translation> </message> @@ -2834,10 +2730,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No es pot enllaçar %s a aquest ordinador. El Bitcoin Core probablement ja estigui executant-s'hi.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Utilitza un proxy SOCKS5 apart per arribar a iguals a través de serveis de Tor ocults (per defecte: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Avís: el -paytxfee és molt elevat! Aquesta és la comissió de transacció que pagareu si envieu una transacció.</translation> </message> @@ -2862,10 +2754,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>(per defecte: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(per defecte: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> pot ser:</translation> </message> @@ -2894,10 +2782,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Opcions de depuració/proves:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Inhabilia el mode segur (safemode), invalida un esdeveniment de mode segur real (per defecte: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Descobreix la pròpia adreça IP (per defecte: 1 quan escoltant i no -externalip)</translation> </message> @@ -2934,66 +2818,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Error: El moneder està bloquejat, no és possible crear la transacció!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Error: error de sistema: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Ha fallat escoltar a qualsevol port. Feu servir -listen=0 si voleu fer això.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Ha fallat la lectura de la informació del bloc</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Ha fallat la lectura del bloc</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Ha fallat la sincronització de l'índex de blocs</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Ha fallat la escriptura de l'índex de blocs</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Ha fallat la escriptura de la informació de bloc</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Ha fallat l'escriptura del bloc</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Ha fallat l'escriptura de la informació de fitxer</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Ha fallat l'escriptura de la basse de dades de monedes</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Ha fallat l'escriptura de l'índex de transaccions</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Ha fallat el desfer de dades</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Força el mode segur (per defecte: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Genera monedes (per defecte: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Quants blocs s'han de confirmar a l'inici (per defecte: 288, 0 = tots)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Si no se subministra <category>, mostra tota la informació de depuració.</translation> </message> @@ -3014,10 +2842,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No hi ha suficient descriptors de fitxers disponibles.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Posa davant de la sortida de depuració una marca horària (per defecte: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers actuals blk000??.dat</translation> </message> @@ -3030,22 +2854,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Defineix la mida màxim del bloc en bytes (per defecte: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Estableix el nombre de fils per atendre trucades RPC (per defecte: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Especifica un fitxer de moneder (dins del directori de dades)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Gasta el canvi sense confirmar en enviar transaccions (per defecte: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Atura l'execució després d'importar blocs del disc (per defecte: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Això es així per a eines de proves de regressió per al desenvolupament d'aplicacions.</translation> </message> @@ -3074,10 +2886,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Importa blocs de un fitxer blk000??.dat extern</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(per defecte: 1, 1 = mantingues les metadades de les tx, p. ex., el propietari del compte i la informació de sol·licitud de pagament, 2 = descarta les metadades de tx) </translation> - </message> - <message> <source>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</source> <translation>Permet les connexions JSON-RPC d'una font específica. Vàlid per a <ip> són una IP individual (p. ex., 1.2.3.4), una xarxa / màscara de xarxa (p. ex., 1.2.3.4/255.255.255.0) o una xarxa/CIDR (p. ex., 1.2.3.4/24). Es pot especificar aquesta opció moltes vegades</translation> </message> @@ -3098,10 +2906,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Crea fitxers nous amb els permisos per defecte del sistema, en comptes de l'umask 077 (només efectiu amb la funcionalitat de moneder inhabilitada)</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>Distribuït sota la llicència de programari MIT/X11. Vegeu el fitxer acompanyant COPYING o <http://www.opensource.org/licenses/mit-license.php>.</translation> - </message> - <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> <translation>Error: ha fallat escoltar les connexions entrants (l'escoltament ha retornat l'error %s)</translation> </message> @@ -3110,10 +2914,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Error: s'ha trobat un argument no permès de -socks. Ja no es pot definir més la versió de SOCKS, només s'accepten els proxies de SOCKS5.ç</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Executa l'ordre quan una tx de xarxa gasta de nou una tx d'entrada del moneder (%s=torna a gastar TxID, %t=TxID del moneder)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Executa l'ordre quan es rebi un avís rellevant o veiem una forquilla molt llarga (%s en cmd és reemplaçat per un missatge)</translation> </message> @@ -3126,14 +2926,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la creació de la transacció (per defecte: %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>Si no s'ha definit paytxfee, inclou comissió suficient per tal que les transaccions siguin confirmades dins d'una mitja de n blocs (per defecte: 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Informació de la depuració de sortida (per defecte: 0, proporcionar <category> és opcional)</translation> - </message> - <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> <translation>Consulta a adreces d'iguals a través de DNS, si es troba baix en adreces (per defecte: 1 a menys que -connect)</translation> </message> @@ -3150,18 +2942,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Avís: comproveu que la data i hora del vostre ordinador siguin correctes! Si el vostre rellotge no és correcte, el Bitcoin Core no funcionarà correctament.</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>Posa en la llista blanca els iguals que es connectin de la màscara de xarxa o ip donada. Es pot especificar moltes vegades.</translation> - </message> - <message> <source>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</source> <translation>Els iguals en la llista blanca no poden ser bandejats per DoS i es transmetran sempre llurs transaccions, fins i tot si ja són a la mempool. Això és útil, p. ex., per a una passarel·la</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>Consulta sempre adreces d'iguals a través de consultes DNS (per defecte: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>No es pot resoldre l'adreça -whitebind: «%s»</translation> </message> @@ -3190,14 +2974,14 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Comissió en (BTC/kB) per afegir a les transaccions que envieu (per defecte: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Inclou adreces IP en la sortida de depuració (per defecte: 0)</translation> - </message> - <message> <source>Information</source> <translation>&Informació</translation> </message> <message> + <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source> + <translation>Ha fallat la inicialització de la comprovació de validesa. El Bitcoin Core s'està aturant.</translation> + </message> + <message> <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> <translation>Import no vàlid per a -minrelaytxfee=<amount>: «%s»</translation> </message> @@ -3206,42 +2990,30 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Import no vàlid per a -mintxfee=<amount>: «%s»</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Mida límit de la memòria cau de signatura per a <n> entrades (per defecte: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Registra la prioritat de transacció i comissió per kB en minar blocs (per defecte: 0)</translation> + <source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source> + <translation>Import no vàlid per a -paytxfee=<amount>: «%s» (ha de ser com a mínim %s)</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Manté l'índex sencer de transaccions (per defecte: 0)</translation> + <source>Invalid netmask specified in -whitelist: '%s'</source> + <translation>S'ha especificat una màscara de xarxa no vàlida a -whitelist: «%s»</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Mida màxima del buffer de recepció per a cada connexió, <n>*1000 bytes (default: 5000)</translation> + <source>Keep at most <n> unconnectable blocks in memory (default: %u)</source> + <translation>Manté com a màxim <n> blocs no connectables en memòria (per defecte: %u)</translation> </message> <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Mida màxima del buffer d'enviament per a cada connexió, <n>*1000 bytes (default: 5000)</translation> + <source>Need to specify a port with -whitebind: '%s'</source> + <translation>Cal especificar un port amb -whitebind: «%s»</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Només accepta cadenes de blocs que coincideixin amb els punts de prova (per defecte: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Només connecta als nodes de la xarxa <net> (IPv4, IPv6 o Tor)</translation> + <source>Node relay options:</source> + <translation>Opcions de transmissió del node:</translation> </message> <message> <source>Print block on startup, if found in block index</source> <translation>Imprimeix el block a l'inici, si es troba l'índex de blocs</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Imprimeix l'arbre de blocs a l'inici (per defecte: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Opcions RPC SSL: (veieu el wiki del Bitcoin per a instruccions de configuració de l'SSL)</translation> </message> @@ -3258,22 +3030,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Introdueix incertesa en 1 de cada <n> missatges de la xarxa</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Executa un fil per buidar el moneder periòdicament (per defecte: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Defineix una mida mínima de bloc en bytes (per defecte: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Defineix el senyal DB_PRIVATE en l'entorn db del moneder (per defecte: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation> </message> @@ -3286,12 +3046,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ha fallat la signatura de la transacció</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especifica el temps limit per a un intent de connexió en mil·lisegons (per defecte: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Error de sistema: </translation> + <source>This is experimental software.</source> + <translation>Això és programari experimental.</translation> </message> <message> <source>Transaction amount too small</source> @@ -3306,8 +3062,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>La transacció és massa gran</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Utilitza UPnP per a mapejar els ports d'escolta (per defecte: 0)</translation> + <source>Unable to bind to %s on this computer (bind returned error %s)</source> + <translation>No s'ha pogut vincular a %s en aquest ordinador (la vinculació ha retornat l'error %s)</translation> </message> <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> @@ -3362,10 +3118,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Actualitza el moneder a l'últim format</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Defineix el límit de nombre de claus a <n> (per defecte: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Reescaneja la cadena de blocs en les transaccions de moneder perdudes</translation> </message> @@ -3374,14 +3126,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Utilitza OpenSSL (https) per a connexions JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Fitxer del certificat de servidor (per defecte: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clau privada del servidor (per defecte: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Aquest misatge d'ajuda</translation> </message> diff --git a/src/qt/locale/bitcoin_cmn.ts b/src/qt/locale/bitcoin_cmn.ts index 3286f12698..09ff0acf02 100644 --- a/src/qt/locale/bitcoin_cmn.ts +++ b/src/qt/locale/bitcoin_cmn.ts @@ -1,4 +1,4 @@ -<TS language="cmn" version="2.1"> +<TS language="cmn" version="2.0"> <context> <name>AddressBookPage</name> </context> diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts index 2aa017fdf8..bc2a2ef7b5 100644 --- a/src/qt/locale/bitcoin_cs.ts +++ b/src/qt/locale/bitcoin_cs.ts @@ -1,4 +1,4 @@ -<TS language="cs" version="2.1"> +<TS language="cs" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Panel s listy</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -435,10 +431,6 @@ <translation>Není dostupný žádný zdroj bloků...</translation> </message> <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Zpracováno %1 bloků transakční historie.</translation> - </message> - <message> <source>%1 and %2</source> <translation>%1 a %2</translation> </message> @@ -513,10 +505,6 @@ Adresa: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Volba adres v rámci ruční správy mincí</translation> - </message> - <message> <source>Quantity:</source> <translation>Počet:</translation> </message> @@ -565,10 +553,6 @@ Adresa: %4 <translation>Částka</translation> </message> <message> - <source>Address</source> - <translation>Adresa</translation> - </message> - <message> <source>Date</source> <translation>Datum</translation> </message> @@ -900,15 +884,7 @@ Adresa: %4 <source>Error</source> <translation>Chyba</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB volného místa</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(z potřebných %1 GB)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -943,14 +919,6 @@ Adresa: %4 <translation>&Hlavní</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Dobrovolný transakční poplatek za každý započatý kB dopomáhá k rychlému zpracování tvých transakcí. Většina transakcí má do 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Platit &transakční poplatek</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Automaticky spustí Bitcoin po přihlášení do systému.</translation> </message> @@ -979,14 +947,6 @@ Adresa: %4 <translation>Přijímat příchozí spojení</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Připojí se do Bitcoinové sítě přes SOCKS proxy.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Připojit přes SOCKS proxy (výchozí proxy):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>IP adresa proxy (např. IPv4: 127.0.0.1/IPv6: ::1)</translation> </message> @@ -1150,10 +1110,6 @@ Adresa: %4 <translation>Zobrazené informace nemusí být aktuální. Tvá peněženka se automaticky sesynchronizuje s Bitcoinovou sítí, jakmile se s ní spojí. Zatím ale ještě není synchronizace dokončena.</translation> </message> <message> - <source>Wallet</source> - <translation>Peněženka</translation> - </message> - <message> <source>Watch-only:</source> <translation>Sledované:</translation> </message> @@ -1206,10 +1162,6 @@ Adresa: %4 <translation>Aktuální stav účtu sledovaných adres</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Poslední transakce</b></translation> - </message> - <message> <source>out of sync</source> <translation>nesynchronizováno</translation> </message> @@ -1469,10 +1421,6 @@ Adresa: %4 <translation>Služby</translation> </message> <message> - <source>Sync Node</source> - <translation>Synchronizační uzel</translation> - </message> - <message> <source>Starting Height</source> <translation>Prvotní výška</translation> </message> @@ -1601,14 +1549,6 @@ Adresa: %4 <translation>Ven</translation> </message> <message> - <source>Yes</source> - <translation>Ano</translation> - </message> - <message> - <source>No</source> - <translation>Ne</translation> - </message> - <message> <source>Unknown</source> <translation>Neznámá</translation> </message> @@ -2453,6 +2393,10 @@ Adresa: %4 <translation>Vytěženo</translation> </message> <message> + <source>watch-only</source> + <translation>sledovací</translation> + </message> + <message> <source>(n/a)</source> <translation>(n/a)</translation> </message> @@ -2679,26 +2623,10 @@ Adresa: %4 <translation>Možnosti:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Konfigurační soubor (výchozí: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>PID soubor (výchozí: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Adresář pro data</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Čekat na spojení na <portu> (výchozí: 8333 nebo testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Povolit nejvýše <n> protějšků (výchozí: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Připojit se k uzlu, získat adresy jeho protějšků a odpojit se</translation> </message> @@ -2707,18 +2635,6 @@ Adresa: %4 <translation>Specifikuj svou veřejnou adresu</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Práh pro odpojování zlobivých protějšků (výchozí: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Doba ve vteřinách, po kterou se nebudou moci zlobivé protějšky znovu připojit (výchozí: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Čekat na JSON RPC spojení na <portu> (výchozí: 8332 nebo testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Akceptovat příkazy z příkazové řádky a přes JSON-RPC</translation> </message> @@ -2759,18 +2675,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Akceptovatelné šifry (výchozí: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Poslouchat na zadané adrese. Pro zápis IPv6 adresy použij notaci [adresa]:port</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Kontinuálně omezovat bezpoplatkové transakce na <n>*1000 bajtů za minutu (výchozí: 15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>Smazat všechny transakce peněženky a při startu obnovit pouze relevantní části řetězce bloků pomocí -rescan</translation> </message> @@ -2791,14 +2699,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Spustit příkaz, když se objeví transakce týkající se peněženky (%s se v příkazu nahradí za TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Promítnout databázovou aktivitu z paměťového prostoru do záznamu na disku každých <n> megabajtů (výchozí: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Jak moc důkladná má být verifikace bloků -checkblocks (0-4, výchozí: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>V tomto módu -genproclimit určuje, kolik bloků je vygenerováno okamžitě.</translation> </message> @@ -2807,10 +2707,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Nastavení počtu vláken pro verifikaci skriptů (%u až %d, 0 = automaticky, <0 = nechat daný počet jader volný, výchozí: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Nastavit omezení procesoru pro zapnuté generování (-1 = bez omezení, výchozí: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Tohle je testovací verze – používej ji jen na vlastní riziko, ale rozhodně ji nepoužívej k těžbě nebo pro obchodní aplikace</translation> </message> @@ -2819,10 +2715,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Nedaří se mi připojit na %s na tomhle počítači. Bitcoin Core už pravděpodobně jednou běží.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Použít samostatnou SOCKS5 proxy ke spojení s protějšky přes skryté služby v Toru (výchozí: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Upozornění: -paytxfee je nastaveno velmi vysoko! Toto je transakční poplatek, který zaplatíš za každou poslanou transakci.</translation> </message> @@ -2847,10 +2739,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>(výchozí: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(výchozí: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> může být:</translation> </message> @@ -2879,10 +2767,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Možnosti ladění/testování:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Vypnout bezpečný režim (safemode), překrýt skutečnou událost bezpečného režimu (výchozí: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Zjistit vlastní IP adresu (výchozí: 1, pokud naslouchá a není zadáno -externalip)</translation> </message> @@ -2919,66 +2803,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Chyba: Peněženka je zamčená, nemohu vytvořit transakci!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Chyba: systémová chyba: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Nepodařilo se naslouchat na žádném portu. Použij -listen=0, pokud to byl tvůj záměr.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Nepodařilo se přečíst informace o bloku</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Nepodařilo se přečíst blok</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Nepodařilo se sesynchronizovat index bloků</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Nepodařilo se zapsat index bloků</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Nepodařilo se zapsat informace o bloku</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Nepodařilo se zapsat blok</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Nepodařilo se zapsat informace o souboru</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Selhal zápis do databáze mincí</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Nepodařilo se zapsat index transakcí</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Nepodařilo se zapsat data o vracení změn</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Vynutit bezpečný mód (výchozí: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generovat mince (výchozí: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Kolik bloků při startu zkontrolovat (výchozí: 288, 0 = všechny)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Pokud není <category> zadána, bude tisknout veškeré ladicí informace.</translation> </message> @@ -2999,10 +2827,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Je nedostatek deskriptorů souborů.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Připojit před ladicí výstup časové razítko (výchozí: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Znovu vytvořit index řetězce bloků z aktuálních blk000??.dat souborů</translation> </message> @@ -3015,22 +2839,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Nastavit maximální velikost bloku v bajtech (výchozí: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Nastavení počtu vláken pro servisní RPC volání (výchozí: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Udej název souboru s peněženkou (v rámci datového adresáře)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Utrácet i ještě nepotvrzené drobné při posílání transakcí (výchozí: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Ukončit se po importu bloků z disku (výchozí: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Tohle je určeno pro nástroje na regresní testování a vyvíjení aplikací.</translation> </message> @@ -3059,10 +2871,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Importovat bloky z externího souboru blk000??.dat</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(výchozí: 1, 1 = ukládat transakční metadata, např. majitele účtu a informace o platebním požadavku, 2 = mazat transakční metadata)</translation> - </message> - <message> <source>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</source> <translation>Povolit JSON-RPC spojení ze specifikovaného zdroje. Platnou hodnotou <ip> je jednotlivá IP adresa (např. 1.2.3.4), síť/maska (např. 1.2.3.4/255.255.255.0) nebo síť/CIDR (např. 1.2.3.4/24). Tuto volbu lze použít i vícekrát</translation> </message> @@ -3087,10 +2895,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Vytvářet nové soubory s výchozími systémovými právy namísto umask 077 (uplatní se, pouze pokud je vypnutá funkce peněženky)</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>Šířen pod licencí MIT/X11, viz přiložený soubor COPYING nebo <http://www.opensource.org/licenses/mit-license.php>.</translation> - </message> - <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> <translation>Chyba: Nelze naslouchat příchozí spojení (listen vrátil chybu %s)</translation> </message> @@ -3099,10 +2903,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Chyba: Byl použit nepodporovaný argument -socks. Nastavení verze SOCKS už není možné, podporovány jsou pouze SOCKS5 proxy.</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Spustit příkaz, když nějaká transakce na síti znovu utrácí vstup transakce této peněženky (%s=TxID cizí transakce, %t=TxID transakce peněženky)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Spustit příkaz, když přijde relevantní upozornění nebo když dojde k opravdu dlouhému rozštěpení řetezce bloků (%s se v příkazu nahradí zprávou)</translation> </message> @@ -3115,14 +2915,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Poplatky (v BTC/Kb) menší než tato hodnota jsou považovány za nulové pro účely vytváření transakcí (výchozí: %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>Pokud paytxfee není nastaveno, platit dostatečný poplatek na to, aby byly transakce potvrzeny v průměru během n bloků (výchozí: 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Tisknout ladicí informace (výchozí: 0, zadání <category> je volitelné)</translation> - </message> - <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> <translation>Při nedostatku adres získat další protějšky z DNS (výchozí: 1, pokud není použito -connect)</translation> </message> @@ -3139,18 +2931,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Upozornění: Zkontroluj, že máš v počítači správně nastavený datum a čas! Pokud jsou nastaveny špatně, Bitcoin Core nebude fungovat správně.</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>Umístit na bílou listinu protějšky připojující se z dané podsítě či ip. Lze zadat i vícekrát.</translation> - </message> - <message> <source>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</source> <translation>Na protějšky na bílé listině se nevztahuje DoS klatba a jejich transakce jsou vždy přeposílány, i když už třeba jsou v mempoolu, což je užitečné např. pro bránu</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>Vždy získávat adresy dalších protějšků přes DNS (výchozí: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>Nemohu přeložit -whitebind adresu: '%s'</translation> </message> @@ -3179,10 +2963,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Poplatek (v BTC/kB), který se přidá ke každé odeslané transakci (výchozí: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Zaznamenávat do ladicích výstupů i IP adresy (výchozí: 0)</translation> - </message> - <message> <source>Information</source> <translation>Informace</translation> </message> @@ -3211,26 +2991,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Držet v paměti nejvýše <n> nespojitelných bloků (výchozí: %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Omezit velikost vyrovnávací paměti pro podpisy na <n> položek (výchozí: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Zaznamenávat během těžení bloků prioritu transakce a poplatek za kB (výchozí: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Spravovat úplný index transakcí (výchozí: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maximální velikost přijímacího bufferu pro každé spojení, <n>*1000 bajtů (výchozí: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maximální velikost odesílacího bufferu pro každé spojení, <n>*1000 bajtů (výchozí: 1000)</translation> - </message> - <message> <source>Need to specify a port with -whitebind: '%s'</source> <translation>V rámci -whitebind je třeba specifikovat i port: '%s'</translation> </message> @@ -3239,22 +2999,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Možnosti přeposílání:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Uznávat pouze řetězec bloků, který odpovídá vnitřním kontrolním bodům (výchozí: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Připojit se pouze k uzlům v <net> síti (IPv4, IPv6 nebo Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Vypsat při startu blok,pokud se nachází v indexu bloků</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Vypsat při startu strom bloků (výchozí: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Možnosti SSL pro RPC: (viz instrukce nastavení SSL na Bitcoin Wiki)</translation> </message> @@ -3271,30 +3019,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Náhodně pozměňovat jednu z každých <n> síťových zpráv</translation> </message> <message> - <source>Relay and mine data carrier transactions (default: 1)</source> - <translation>Přeposílat a těžit transakce nesoucí data (výchozí: 1)</translation> - </message> - <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>Přeposílat ne-P2SH multisig (výchozí: 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Spustit vlákno pročišťující periodicky peněženku (výchozí: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Posílat stopovací/ladicí informace do konzole místo do souboru debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Nastavit minimální velikost bloku v bajtech (výchozí: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Nastavit příznak DB_PRIVATE v databázovém prostředí peněženky (výchozí: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Zobrazit všechny možnosti ladění (užití: --help -help-debug)</translation> </message> @@ -3307,14 +3035,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Nepodařilo se podepsat transakci</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Zadej časový limit spojení v milisekundách (výchozí: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Systémová chyba: </translation> - </message> - <message> <source>This is experimental software.</source> <translation>Tohle je experimentální program.</translation> </message> @@ -3335,10 +3055,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Nedaří se mi připojit na %s na tomhle počítači (operace bind vrátila chybu %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Použít UPnP k namapování naslouchacího portu (výchozí: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Použít UPnP k namapování naslouchacího portu (výchozí: 1, pokud naslouchá)</translation> </message> @@ -3391,10 +3107,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Převést peněženku na nejnovější formát</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Nastavit zásobník klíčů na velikost <n> (výchozí: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Přeskenovat řetězec bloků na chybějící transakce tvé pěněženky</translation> </message> @@ -3403,14 +3115,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Použít OpenSSL (https) pro JSON-RPC spojení</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Soubor se serverovým certifikátem (výchozí: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Soubor se serverovým soukromým klíčem (výchozí: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Tato nápověda</translation> </message> diff --git a/src/qt/locale/bitcoin_cy.ts b/src/qt/locale/bitcoin_cy.ts index 3380733c63..c68fc274f3 100644 --- a/src/qt/locale/bitcoin_cy.ts +++ b/src/qt/locale/bitcoin_cy.ts @@ -1,4 +1,4 @@ -<TS language="cy" version="2.1"> +<TS language="cy" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -155,10 +155,6 @@ <translation>Bar offer tabiau</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Error</source> <translation>Gwall</translation> </message> @@ -201,10 +197,6 @@ <context> <name>CoinControlDialog</name> <message> - <source>Address</source> - <translation>Cyfeiriad</translation> - </message> - <message> <source>Date</source> <translation>Dyddiad</translation> </message> @@ -285,10 +277,6 @@ <source>Form</source> <translation>Ffurflen</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Trafodion diweddar</b></translation> - </message> </context> <context> <name>PaymentServer</name> diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts index f292766ec8..f733591098 100644 --- a/src/qt/locale/bitcoin_da.ts +++ b/src/qt/locale/bitcoin_da.ts @@ -1,4 +1,4 @@ -<TS language="da" version="2.1"> +<TS language="da" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -11,7 +11,7 @@ </message> <message> <source>&New</source> - <translation>Ny</translation> + <translation>&Ny</translation> </message> <message> <source>Copy the currently selected address to the system clipboard</source> @@ -19,15 +19,15 @@ </message> <message> <source>&Copy</source> - <translation>Kopiér</translation> + <translation>&Kopiér</translation> </message> <message> <source>C&lose</source> - <translation>Luk</translation> + <translation>&Luk</translation> </message> <message> <source>&Copy Address</source> - <translation>Kopiér adresse</translation> + <translation>&Kopiér adresse</translation> </message> <message> <source>Delete the currently selected address from the list</source> @@ -39,11 +39,11 @@ </message> <message> <source>&Export</source> - <translation>Eksportér</translation> + <translation>&Eksportér</translation> </message> <message> <source>&Delete</source> - <translation>Slet</translation> + <translation>&Slet</translation> </message> <message> <source>Choose the address to send coins to</source> @@ -55,7 +55,7 @@ </message> <message> <source>C&hoose</source> - <translation>Vælg</translation> + <translation>&Vælg</translation> </message> <message> <source>Sending addresses</source> @@ -75,11 +75,11 @@ </message> <message> <source>Copy &Label</source> - <translation>Kopiér mærkat</translation> + <translation>Kopiér &mærkat</translation> </message> <message> <source>&Edit</source> - <translation>Redigér</translation> + <translation>&Redigér</translation> </message> <message> <source>Export Address List</source> @@ -224,7 +224,7 @@ <name>BitcoinGUI</name> <message> <source>Sign &message...</source> - <translation>Underskriv besked …</translation> + <translation>Underskriv &besked …</translation> </message> <message> <source>Synchronizing with network...</source> @@ -232,7 +232,7 @@ </message> <message> <source>&Overview</source> - <translation>Oversigt</translation> + <translation>&Oversigt</translation> </message> <message> <source>Node</source> @@ -244,7 +244,7 @@ </message> <message> <source>&Transactions</source> - <translation>Transaktioner</translation> + <translation>&Transaktioner</translation> </message> <message> <source>Browse transaction history</source> @@ -252,7 +252,7 @@ </message> <message> <source>E&xit</source> - <translation>Luk</translation> + <translation>&Luk</translation> </message> <message> <source>Quit application</source> @@ -260,7 +260,7 @@ </message> <message> <source>About &Qt</source> - <translation>Om Qt</translation> + <translation>Om &Qt</translation> </message> <message> <source>Show information about Qt</source> @@ -268,31 +268,31 @@ </message> <message> <source>&Options...</source> - <translation>Indstillinger …</translation> + <translation>&Indstillinger …</translation> </message> <message> <source>&Encrypt Wallet...</source> - <translation>Kryptér tegnebog …</translation> + <translation>&Kryptér tegnebog …</translation> </message> <message> <source>&Backup Wallet...</source> - <translation>Sikkerhedskopiér tegnebog …</translation> + <translation>&Sikkerhedskopiér tegnebog …</translation> </message> <message> <source>&Change Passphrase...</source> - <translation>Skift adgangskode …</translation> + <translation>&Skift adgangskode …</translation> </message> <message> <source>&Sending addresses...</source> - <translation>Afsendelsesadresser …</translation> + <translation>&Afsendelsesadresser …</translation> </message> <message> <source>&Receiving addresses...</source> - <translation>Modtagelsesadresser …</translation> + <translation>&Modtagelsesadresser …</translation> </message> <message> <source>Open &URI...</source> - <translation>Åbn URI …</translation> + <translation>&Åbn URI …</translation> </message> <message> <source>Bitcoin Core client</source> @@ -324,7 +324,7 @@ </message> <message> <source>&Debug window</source> - <translation>Fejlsøgningsvindue</translation> + <translation>&Fejlsøgningsvindue</translation> </message> <message> <source>Open debugging and diagnostic console</source> @@ -332,7 +332,7 @@ </message> <message> <source>&Verify message...</source> - <translation>Verificér besked …</translation> + <translation>&Verificér besked …</translation> </message> <message> <source>Bitcoin</source> @@ -344,11 +344,11 @@ </message> <message> <source>&Send</source> - <translation>Send</translation> + <translation>&Send</translation> </message> <message> <source>&Receive</source> - <translation>Modtag</translation> + <translation>&Modtag</translation> </message> <message> <source>Show information about Bitcoin Core</source> @@ -356,7 +356,7 @@ </message> <message> <source>&Show / Hide</source> - <translation>Vis / skjul</translation> + <translation>&Vis / skjul</translation> </message> <message> <source>Show or hide the main Window</source> @@ -376,25 +376,21 @@ </message> <message> <source>&File</source> - <translation>Fil</translation> + <translation>&Fil</translation> </message> <message> <source>&Settings</source> - <translation>Opsætning</translation> + <translation>&Opsætning</translation> </message> <message> <source>&Help</source> - <translation>Hjælp</translation> + <translation>&Hjælp</translation> </message> <message> <source>Tabs toolbar</source> <translation>Faneværktøjslinje</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnetværk]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -404,7 +400,7 @@ </message> <message> <source>&About Bitcoin Core</source> - <translation>Om Bitcoin Core</translation> + <translation>&Om Bitcoin Core</translation> </message> <message> <source>Show the list of used sending addresses and labels</source> @@ -420,7 +416,7 @@ </message> <message> <source>&Command-line options</source> - <translation>Tilvalg for kommandolinje</translation> + <translation>Tilvalg for &kommandolinje</translation> </message> <message> <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Ingen blokkilde tilgængelig …</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Behandlet %1 blokke af transaktionshistorikken.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n time</numerusform><numerusform>%n timer</numerusform></translation> @@ -486,6 +478,10 @@ <source>Up to date</source> <translation>Opdateret</translation> </message> + <message numerus="yes"> + <source>Processed %n blocks of transaction history.</source> + <translation><numerusform>%n blok af transaktionshistorikken er blevet behandlet.</numerusform><numerusform>%n blokke af transaktionshistorikken er blevet behandlet.</numerusform></translation> + </message> <message> <source>Catching up...</source> <translation>Indhenter …</translation> @@ -529,8 +525,8 @@ Adresse: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Adressevalg for coin-styring</translation> + <source>Coin Selection</source> + <translation>Coin-styring</translation> </message> <message> <source>Quantity:</source> @@ -581,8 +577,12 @@ Adresse: %4 <translation>Beløb</translation> </message> <message> - <source>Address</source> - <translation>Adresse</translation> + <source>Received with label</source> + <translation>Modtaget med mærke</translation> + </message> + <message> + <source>Received with address</source> + <translation>Modtaget med adresse</translation> </message> <message> <source>Date</source> @@ -753,7 +753,7 @@ Adresse: %4 </message> <message> <source>&Label</source> - <translation>Mærkat</translation> + <translation>&Mærkat</translation> </message> <message> <source>The label associated with this address list entry</source> @@ -765,7 +765,7 @@ Adresse: %4 </message> <message> <source>&Address</source> - <translation>Adresse</translation> + <translation>&Adresse</translation> </message> <message> <source>New receiving address</source> @@ -916,15 +916,11 @@ Adresse: %4 <source>Error</source> <translation>Fejl</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB fri plads tilgængelig</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(ud af %1 GB behøvet)</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB fri plads tilgængelig</numerusform><numerusform>%n GB fri plads tilgængelig</numerusform></translation> </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -956,15 +952,7 @@ Adresse: %4 </message> <message> <source>&Main</source> - <translation>Generelt</translation> - </message> - <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Valgfrit transaktionsgebyr pr. kB, der hjælper dine transaktioner med at blive behandlet hurtigt. De fleste transaktioner er på 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Betal transaktionsgebyr</translation> + <translation>&Generelt</translation> </message> <message> <source>Automatically start Bitcoin after logging in to the system.</source> @@ -972,11 +960,11 @@ Adresse: %4 </message> <message> <source>&Start Bitcoin on system login</source> - <translation>Start Bitcoin ved systemlogin</translation> + <translation>&Start Bitcoin ved systemlogin</translation> </message> <message> <source>Size of &database cache</source> - <translation>Størrelsen på databasens cache</translation> + <translation>Størrelsen på &databasens cache</translation> </message> <message> <source>MB</source> @@ -984,7 +972,7 @@ Adresse: %4 </message> <message> <source>Number of script &verification threads</source> - <translation>Antallet af scriptverificeringstråde</translation> + <translation>Antallet af script&verificeringstråde</translation> </message> <message> <source>Accept connections from outside</source> @@ -995,14 +983,6 @@ Adresse: %4 <translation>Tillad indkommende forbindelser</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Forbind til Bitcoin-netværket gennem en SOCKS-proxy.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>Forbind gennem SOCKS-proxy (standard-proxy):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>IP-adresse for proxyen (fx IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1024,11 +1004,11 @@ Adresse: %4 </message> <message> <source>&Reset Options</source> - <translation>Nulstil indstillinger</translation> + <translation>&Nulstil indstillinger</translation> </message> <message> <source>&Network</source> - <translation>Netværk</translation> + <translation>&Netværk</translation> </message> <message> <source>(0 = auto, <0 = leave that many cores free)</source> @@ -1036,7 +1016,7 @@ Adresse: %4 </message> <message> <source>W&allet</source> - <translation>Tegnebog</translation> + <translation>&Tegnebog</translation> </message> <message> <source>Expert</source> @@ -1044,7 +1024,7 @@ Adresse: %4 </message> <message> <source>Enable coin &control features</source> - <translation>Slå egenskaber for coin-styring til</translation> + <translation>Slå egenskaber for &coin-styring til</translation> </message> <message> <source>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.</source> @@ -1052,7 +1032,7 @@ Adresse: %4 </message> <message> <source>&Spend unconfirmed change</source> - <translation>Brug ubekræftede byttepenge</translation> + <translation>&Brug ubekræftede byttepenge</translation> </message> <message> <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source> @@ -1060,15 +1040,23 @@ Adresse: %4 </message> <message> <source>Map port using &UPnP</source> - <translation>Konfigurér port vha. UPnP</translation> + <translation>Konfigurér port vha. &UPnP</translation> + </message> + <message> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation>Forbind til Bitcoin-netværket gennem en SOCKS5-proxy.</translation> + </message> + <message> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation>&Forbind gennem SOCKS5-proxy (standard-proxy):</translation> </message> <message> <source>Proxy &IP:</source> - <translation>Proxy-IP:</translation> + <translation>Proxy-&IP:</translation> </message> <message> <source>&Port:</source> - <translation>Port:</translation> + <translation>&Port:</translation> </message> <message> <source>Port of the proxy (e.g. 9050)</source> @@ -1076,7 +1064,7 @@ Adresse: %4 </message> <message> <source>&Window</source> - <translation>Vindue</translation> + <translation>&Vindue</translation> </message> <message> <source>Show only a tray icon after minimizing the window.</source> @@ -1084,7 +1072,7 @@ Adresse: %4 </message> <message> <source>&Minimize to the tray instead of the taskbar</source> - <translation>Minimér til statusfeltet i stedet for proceslinjen</translation> + <translation>&Minimér til statusfeltet i stedet for proceslinjen</translation> </message> <message> <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source> @@ -1092,15 +1080,15 @@ Adresse: %4 </message> <message> <source>M&inimize on close</source> - <translation>Minimér ved lukning</translation> + <translation>M&inimér ved lukning</translation> </message> <message> <source>&Display</source> - <translation>Visning</translation> + <translation>&Visning</translation> </message> <message> <source>User Interface &language:</source> - <translation>Sprog for brugergrænseflade:</translation> + <translation>&Sprog for brugergrænseflade:</translation> </message> <message> <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source> @@ -1108,7 +1096,7 @@ Adresse: %4 </message> <message> <source>&Unit to show amounts in:</source> - <translation>Enhed at vise beløb i:</translation> + <translation>&Enhed at vise beløb i:</translation> </message> <message> <source>Choose the default subdivision unit to show in the interface and when sending coins.</source> @@ -1120,11 +1108,11 @@ Adresse: %4 </message> <message> <source>&OK</source> - <translation>OK</translation> + <translation>&O.k.</translation> </message> <message> <source>&Cancel</source> - <translation>Annullér</translation> + <translation>&Annullér</translation> </message> <message> <source>default</source> @@ -1166,10 +1154,6 @@ Adresse: %4 <translation>Den viste information kan være forældet. Din tegnebog synkroniserer automatisk med Bitcoin-netværket, når en forbindelse etableres, men denne proces er ikke gennemført endnu.</translation> </message> <message> - <source>Wallet</source> - <translation>Tegnebog</translation> - </message> - <message> <source>Watch-only:</source> <translation>Kigge:</translation> </message> @@ -1198,6 +1182,10 @@ Adresse: %4 <translation>Minet saldo, som endnu ikke er modnet</translation> </message> <message> + <source>Balances</source> + <translation>Saldi:</translation> + </message> + <message> <source>Total:</source> <translation>Total:</translation> </message> @@ -1210,6 +1198,14 @@ Adresse: %4 <translation>Din nuværende saldo på kigge-adresser</translation> </message> <message> + <source>Spendable:</source> + <translation>Spendérbar:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Nylige transaktioner</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>Ubekræftede transaktioner til kigge-adresser</translation> </message> @@ -1222,10 +1218,6 @@ Adresse: %4 <translation>Nuværende totalsaldo på kigge-adresser</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Nyeste transaktioner</b></translation> - </message> - <message> <source>out of sync</source> <translation>ikke synkroniseret</translation> </message> @@ -1379,11 +1371,11 @@ Adresse: %4 <name>QRImageWidget</name> <message> <source>&Save Image...</source> - <translation>Gem billede …</translation> + <translation>&Gem billede …</translation> </message> <message> <source>&Copy Image</source> - <translation>Kopiér foto</translation> + <translation>&Kopiér foto</translation> </message> <message> <source>Save QR Code</source> @@ -1410,7 +1402,7 @@ Adresse: %4 </message> <message> <source>&Information</source> - <translation>Information</translation> + <translation>&Information</translation> </message> <message> <source>Debug window</source> @@ -1462,7 +1454,7 @@ Adresse: %4 </message> <message> <source>&Peers</source> - <translation>Andre knuder</translation> + <translation>Andre &knuder</translation> </message> <message> <source>Select a peer to view detailed information.</source> @@ -1485,10 +1477,6 @@ Adresse: %4 <translation>Tjenester</translation> </message> <message> - <source>Sync Node</source> - <translation>Synkroniseringsknude</translation> - </message> - <message> <source>Starting Height</source> <translation>Starthøjde</translation> </message> @@ -1530,19 +1518,19 @@ Adresse: %4 </message> <message> <source>&Open</source> - <translation>Åbn</translation> + <translation>&Åbn</translation> </message> <message> <source>&Console</source> - <translation>Konsol</translation> + <translation>&Konsol</translation> </message> <message> <source>&Network Traffic</source> - <translation>Netværkstrafik</translation> + <translation>&Netværkstrafik</translation> </message> <message> <source>&Clear</source> - <translation>Ryd</translation> + <translation>&Ryd</translation> </message> <message> <source>Totals</source> @@ -1617,14 +1605,6 @@ Adresse: %4 <translation>Udgående</translation> </message> <message> - <source>Yes</source> - <translation>Ja</translation> - </message> - <message> - <source>No</source> - <translation>Nej</translation> - </message> - <message> <source>Unknown</source> <translation>Ukendt</translation> </message> @@ -1637,15 +1617,15 @@ Adresse: %4 <name>ReceiveCoinsDialog</name> <message> <source>&Amount:</source> - <translation>Beløb:</translation> + <translation>&Beløb:</translation> </message> <message> <source>&Label:</source> - <translation>Mærkat:</translation> + <translation>&Mærkat:</translation> </message> <message> <source>&Message:</source> - <translation>Besked:</translation> + <translation>&Besked:</translation> </message> <message> <source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source> @@ -1653,7 +1633,7 @@ Adresse: %4 </message> <message> <source>R&euse an existing receiving address (not recommended)</source> - <translation>Genbrug en eksisterende modtagelsesadresse (anbefales ikke)</translation> + <translation>&Genbrug en eksisterende modtagelsesadresse (anbefales ikke)</translation> </message> <message> <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source> @@ -1685,7 +1665,7 @@ Adresse: %4 </message> <message> <source>&Request payment</source> - <translation>Anmod om betaling</translation> + <translation>&Anmod om betaling</translation> </message> <message> <source>Show the selected request (does the same as double clicking an entry)</source> @@ -1724,15 +1704,15 @@ Adresse: %4 </message> <message> <source>Copy &URI</source> - <translation>Kopiér URI</translation> + <translation>Kopiér &URI</translation> </message> <message> <source>Copy &Address</source> - <translation>Kopiér adresse</translation> + <translation>Kopiér &adresse</translation> </message> <message> <source>&Save Image...</source> - <translation>Gem billede …</translation> + <translation>&Gem billede …</translation> </message> <message> <source>Request payment to %1</source> @@ -1861,12 +1841,84 @@ Adresse: %4 <translation>Tilpasset byttepengeadresse</translation> </message> <message> + <source>Transaction Fee:</source> + <translation>Transaktionsgebyr:</translation> + </message> + <message> + <source>Choose...</source> + <translation>Vælg …</translation> + </message> + <message> + <source>collapse fee-settings</source> + <translation>sammenfold gebyropsætning</translation> + </message> + <message> + <source>Minimize</source> + <translation>Minimér</translation> + </message> + <message> + <source>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 "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source> + <translation>Hvis det brugertilpassede gebyr er sat til 1000 satoshis, og transaktionen kun fylder 250 byte, betaler "pr. kilobyte" kun 250 satoshis i gebyr, mens "mindst" betaler 1000 satoshis. For transaktioner større end en kilobyte betaler begge pr. kilobyte.</translation> + </message> + <message> + <source>per kilobyte</source> + <translation>pr. kilobyte</translation> + </message> + <message> + <source>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.</source> + <translation>Hvis det brugertilpassede gebyr er sat til 1000 satoshis, og transaktionen kun fylder 250 byte, betaler "pr. kilobyte" kun 250 satoshis i gebyr, mens "total mindst" betaler 1000 satoshis. For transaktioner større end en kilobyte betaler begge pr. kilobyte.</translation> + </message> + <message> + <source>total at least</source> + <translation>total mindst</translation> + </message> + <message> + <source>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.</source> + <translation>Det er helt fint kun at betale det minimale gebyr, så længe den totale transaktionsvolumen er mindre end den plads, der er tilgængelig i blokkene. Men vær opmærksom på, at dette kan ende ud i transaktioner, der aldrig bliver bekræftet, når der bliver større forespørgsel efter bitcoin-transaktioner, end hvad netværket kan bearbejde.</translation> + </message> + <message> + <source>(read the tooltip)</source> + <translation>(læs værktøjstippet)</translation> + </message> + <message> + <source>Recommended:</source> + <translation>Anbefalet:</translation> + </message> + <message> + <source>Custom:</source> + <translation>Brugertilpasset:</translation> + </message> + <message> + <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source> + <translation>(Smart-gebyr er ikke initialiseret endnu. Dette tager typisk nogle få blokke …)</translation> + </message> + <message> + <source>Confirmation time:</source> + <translation>Bekræftelsestid:</translation> + </message> + <message> + <source>normal</source> + <translation>normal</translation> + </message> + <message> + <source>fast</source> + <translation>hurtig</translation> + </message> + <message> + <source>Send as zero-fee transaction if possible</source> + <translation>Send som nul-gebyr-transaktion hvis muligt</translation> + </message> + <message> + <source>(confirmation may take longer)</source> + <translation>(bekræftelse kan tage længere)</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Send til flere modtagere på en gang</translation> </message> <message> <source>Add &Recipient</source> - <translation>Tilføj modtager</translation> + <translation>Tilføj &modtager</translation> </message> <message> <source>Clear all fields of the form.</source> @@ -1878,7 +1930,7 @@ Adresse: %4 </message> <message> <source>Clear &All</source> - <translation>Ryd alle</translation> + <translation>Ryd &alle</translation> </message> <message> <source>Balance:</source> @@ -1890,7 +1942,7 @@ Adresse: %4 </message> <message> <source>S&end</source> - <translation>Afsend</translation> + <translation>&Afsend</translation> </message> <message> <source>Confirm send coins</source> @@ -1965,6 +2017,18 @@ Adresse: %4 <translation>Transaktionen blev afvist! Dette kan ske, hvis nogle af dine bitcoins i din tegnebog allerede er brugt, som hvis du brugte en kopi af wallet.dat og dine bitcoins er blevet brugt i kopien, men ikke er markeret som brugt her.</translation> </message> <message> + <source>A fee higher than %1 is considered an insanely high fee.</source> + <translation>Et gebyr højere end %1 anses som et vanvittigt højt gebyr.</translation> + </message> + <message> + <source>Pay only the minimum fee of %1</source> + <translation>Betal kun det minimale gebyr på %1</translation> + </message> + <message> + <source>Estimated to begin confirmation within %1 block(s).</source> + <translation>Bekræftelse vurderes at begynde inden for %1 blok(ke).</translation> + </message> + <message> <source>Warning: Invalid Bitcoin address</source> <translation>Advarsel: Ugyldig Bitcoin-adresse</translation> </message> @@ -1993,11 +2057,11 @@ Adresse: %4 <name>SendCoinsEntry</name> <message> <source>A&mount:</source> - <translation>Beløb:</translation> + <translation>&Beløb:</translation> </message> <message> <source>Pay &To:</source> - <translation>Betal til:</translation> + <translation>Betal &til:</translation> </message> <message> <source>Enter a label for this address to add it to your address book</source> @@ -2005,7 +2069,7 @@ Adresse: %4 </message> <message> <source>&Label:</source> - <translation>Mærkat:</translation> + <translation>&Mærkat:</translation> </message> <message> <source>Choose previously used address</source> @@ -2083,7 +2147,7 @@ Adresse: %4 </message> <message> <source>&Sign Message</source> - <translation>Underskriv besked</translation> + <translation>&Underskriv besked</translation> </message> <message> <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source> @@ -2127,7 +2191,7 @@ Adresse: %4 </message> <message> <source>Sign &Message</source> - <translation>Underskriv besked</translation> + <translation>Underskriv &besked</translation> </message> <message> <source>Reset all sign message fields</source> @@ -2135,11 +2199,11 @@ Adresse: %4 </message> <message> <source>Clear &All</source> - <translation>Ryd alle</translation> + <translation>Ryd &alle</translation> </message> <message> <source>&Verify Message</source> - <translation>Verificér besked</translation> + <translation>&Verificér besked</translation> </message> <message> <source>Enter the signing 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.</source> @@ -2155,7 +2219,7 @@ Adresse: %4 </message> <message> <source>Verify &Message</source> - <translation>Verificér besked</translation> + <translation>Verificér &besked</translation> </message> <message> <source>Reset all verify message fields</source> @@ -2473,6 +2537,10 @@ Adresse: %4 <translation>Minet</translation> </message> <message> + <source>watch-only</source> + <translation>kigge</translation> + </message> + <message> <source>(n/a)</source> <translation>(n/a)</translation> </message> @@ -2489,6 +2557,10 @@ Adresse: %4 <translation>Transaktionstype.</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Afgør hvorvidt en kigge-adresse er involveret i denne transaktion.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>Destinationsadresse for transaktion.</translation> </message> @@ -2584,6 +2656,10 @@ Adresse: %4 <translation>Historik for eksport af transaktioner</translation> </message> <message> + <source>Watch-only</source> + <translation>Kigge</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Eksport mislykkedes</translation> </message> @@ -2661,7 +2737,7 @@ Adresse: %4 <name>WalletView</name> <message> <source>&Export</source> - <translation>Eksportér</translation> + <translation>&Eksportér</translation> </message> <message> <source>Export the data in the current tab to a file</source> @@ -2699,26 +2775,10 @@ Adresse: %4 <translation>Indstillinger:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Angiv konfigurationsfil (standard: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Angiv pid-fil (default: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Angiv datamappe</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Lyt til forbindelser på <port> (standard: 8333 eller testnetværk: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Oprethold højest <n> forbindelser til andre knuder i netværket (standard: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Forbind til en knude for at modtage adresser på andre knuder, og afbryd derefter</translation> </message> @@ -2727,18 +2787,6 @@ Adresse: %4 <translation>Angiv din egen offentlige adresse</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Grænse for frakobling fra andre knuder, der opfører sig dårligt (standard: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Antal sekunder, som andre knuder der opfører sig dårligt, skal vente før reetablering af forbindelse (standard: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Lyt til JSON-RPC-forbindelser på <port> (standard: 8332 eller testnetværk: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Acceptér kommandolinje- og JSON-RPC-kommandoer</translation> </message> @@ -2779,22 +2827,18 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Accepterede krypteringer (standard: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Tildel til den givne adresse og lyt altid på den. Brug [vært]:port-notation for IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Rate-begræns kontinuerligt frie transaktioner til <n>*1000 byte i minuttet (standard:15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>Slet alle transaktioner i tegnebogen og genskab kun disse dele af blokkæden gennem -rescan under opstart</translation> </message> <message> + <source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> + <translation>Distribueret under MIT-softwarelicensen; se den vedlagte fil COPYING eller <http://www.opensource.org/licenses/mit-license.php>.</translation> + </message> + <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Start regressionstesttilstand, som bruger en speciel kæde, hvor blokke kan løses med det samme.</translation> </message> @@ -2811,14 +2855,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Udfør kommando, når en transaktion i tegnebogen ændres (%s i kommandoen erstattes med TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Flyt databaseaktivitet fra hukommelsespulje til disklog hver <n> megabytes (standard: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Hvor gennemarbejdet blokverificeringen for -checkblocks er (0-4; standard: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>I denne tilstand styrer -genproclimit hvor mange blokke, der genereres med det samme.</translation> </message> @@ -2827,10 +2863,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Sæt antallet af scriptverificeringstråde (%u til %d, 0 = auto, <0 = efterlad det antal kernet fri, standard: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Sæt processorbegrænsning for når generering er slået til (-1 = ubegrænset, standard: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Dette er en foreløbig testudgivelse - brug på eget ansvar - brug ikke til udvinding eller handelsprogrammer</translation> </message> @@ -2839,10 +2871,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ikke i stand til at tildele til %s på denne computer. Bitcoin Core kører sansynligvis allerede.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Brug separat SOCS5-proxy for at nå andre knuder via tjenester skjult med Tor (standard: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Advarsel: -paytxfee er sat meget højt! Dette er det gebyr du vil betale, hvis du sender en transaktion.</translation> </message> @@ -2863,12 +2891,12 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Advarsel: wallet.dat ødelagt, data reddet! Oprindelig wallet.dat gemt som wallet.{timestamp}.bak i %s; hvis din saldo eller dine transaktioner er forkert, bør du genskabe fra en sikkerhedskopi.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(standard: 1)</translation> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Sæt andre knuder, der forbinder fra den angivne netmaske eller IP, på hvidliste. Kan angives flere gange.</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(standard: wallet.dat)</translation> + <source>(default: 1)</source> + <translation>(standard: 1)</translation> </message> <message> <source><category> can be:</source> @@ -2899,10 +2927,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Tilvalg for fejlfinding/test:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Slå sikker tilstand fra, tilsidesæt hændelser fra sikker tilstand (standard: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Find egen IP-adresse (standard: 1 når lytter og ingen -externalip)</translation> </message> @@ -2931,6 +2955,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Åbning af blokdatabase mislykkedes</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Fejl: En fatal intern fejl opstod; se debug.log for detaljer</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Fejl: Mangel på ledig diskplads!</translation> </message> @@ -2939,66 +2967,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Fejl: Tegnebog låst, kan ikke oprette transaktion!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Fejl: systemfejl: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Lytning på enhver port mislykkedes. Brug -listen=0, hvis du ønsker dette.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Læsning af blokinformation mislykkedes</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Læsning af blok mislykkedes</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Synkronisering af blokindeks mislykkedes</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Skrivning af blokindeks mislykkedes</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Skrivning af blokinformation mislykkedes</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Skrivning af blok mislykkedes</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Skriving af filinformation mislykkedes</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Skrivning af bitcoin-database mislykkedes</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Skrivning af transaktionsindeks mislykkedes</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Skrivning af genskabelsesdata mislykkedes</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Gennemtving sikker tilstand (standard: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generér bitcoins (standard: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Antal blokke som tjekkes ved opstart (standard: 288, 0=alle)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Hvis <kategori> ikke angives, udskriv al fejlsøgningsinformation.</translation> </message> @@ -3019,8 +2991,8 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>For få tilgængelige fildeskriptorer.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Føj tidsstempel foran fejlsøgningsoutput (standard: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Tilslut kun til knuder i netværk <net> (IPv4, IPv6 eller Onion)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3035,26 +3007,18 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Sæt maksimum blokstørrelse i byte (standard: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Angiv antallet af tråde til at håndtere RPC-kald (standard: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Angiv tegnebogsfil (inden for datamappe)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Brug ubekræftede byttepenge under afsendelse af transaktioner (standard: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Stop kørsel efter import af blokke fra disk (standard: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>This is intended for regression testing tools and app development.</translation> </message> <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Brug UPnP til at konfigurere den lyttende port (standard: %u)</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Verificerer blokke …</translation> </message> @@ -3079,10 +3043,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Importerer blokke fra ekstern blk000??.dat fil</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(standard: 1, 1 = behold metadata for transaktion, fx kontoindehaver og information om betalingsanmodning, 2 = drop metadata for transaktion)</translation> - </message> - <message> <source>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</source> <translation>Tillad JSON-RPC-forbindelser fra angivet kilde. Gyldig for <ip> er en enkelt IP (fx 1.2.3.4), et netværk/netmaske (fx 1.2.3.4/255.255.255.0) eller et netværk/CIDR (fx 1.2.3.4/24). Dette tilvalg kan angives flere gange</translation> </message> @@ -3103,12 +3063,12 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Kan ikke opnå en lås på datamappe %s. Bitcoin Core kører sansynligvis allerede.</translation> </message> <message> - <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> - <translation>Opret nye filer med systemstandard for rettigheder i stedet for umask 077 (kun virksomt med tegnebogsfunktionalitet slået fra)</translation> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Rate-begræns kontinuerligt gratis transaktioner til <n>*1000 byte i minuttet (standard: %u)</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>Distribueret under MIT/X11-softwarelicensen. Se medfølgende fil COPYING eller <http://www.opensource.org/licenses/mit-license.php>.</translation> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Opret nye filer med systemstandard for rettigheder i stedet for umask 077 (kun virksomt med tegnebogsfunktionalitet slået fra)</translation> </message> <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> @@ -3119,10 +3079,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Fejl: Ikke understøttet argument -socks blev fundet. Det er ikke muligt at angive SOCKS-version længere, da kun SOCKS5-proxier er understøttet.</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Udfør kommando når en netværkstransaktion genspenderer input fra tegnebogstransaktion (%s=transaktions-ID fra genspendering, %t=transaktions-ID fra tegnebog)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Udfør kommando, når en relevant alarm modtages eller vi ser en virkelig lang udsplitning (%s i cmd erstattes af besked)</translation> </message> @@ -3135,12 +3091,8 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Gebyrer (i BTC/Kb) mindre end dette opfattes som nulgebyr for oprettelse af transaktion (standard: %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>Hvis paytxfee ikke er angivet, inkludér da nok gebyr til at transaktioner gennemsnitligt bekræftes inden for n blokke (standard: 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Udskriv fejlsøgningsinformation (standard: 0, angivelse af <kategori> er valgfri)</translation> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation>Maksimal størrelse på data i transaktioner til dataoverførsel, som vi videresender og miner (standard: %u)</translation> </message> <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> @@ -3151,6 +3103,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Sæt maksimumstørrelse for højprioritet/lavgebyr-transaktioner i byte (standard: %d)</translation> </message> <message> + <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source> + <translation>Sæt antaller af tråde for coin-generering, hvis aktiveret (-1 = alle kerner, standard: %d)</translation> + </message> + <message> <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> <translation>Dette produkt indeholder software, der er udviklet af OpenSSL-projektet for brug i OpenSSL-værktøjskassen <https://www.openssl.org/>, samt kryptografisk software, der er skrevet af Eric Young, samt UPnP-software, der er skrevet af Thomas Bernard.</translation> </message> @@ -3159,18 +3115,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Advarsel: Undersøg venligst at din computers dato og klokkeslet er korrekt indstillet! Hvis der er fejl i disse vil Bitcoin Core ikke fungere korrekt.</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>Sæt andre knuder, der forbinder fra den angivne netmaske eller ip, på hvidliste. Kan angives flere gange.</translation> - </message> - <message> <source>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</source> <translation>Andre knuder på hvidliste kan ikke DoS-bandlyses, og deres transaktioner videresendes altid, selv hvis de allerede er i mempool'en. Brugbart til fx et adgangspunkt</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>Forespørg altid adresser på andre knuder via DNS-opslag (default: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>Kan ikke løse -whitebind adresse: "%s"</translation> </message> @@ -3199,10 +3147,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Gebyr (i BTC/kB) som skal føjes til transaktioner, du sender (standard: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Inkludér IP-adresser i fejlretningsoutput (standard: 0)</translation> - </message> - <message> <source>Information</source> <translation>Information</translation> </message> @@ -3231,24 +3175,8 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Behold højest <n> uforbindelige blokke i hukommelsen (standard: %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Begræns størrelsen på signaturcache til <n> indgange (standard: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Prioritet for transaktionslog og gebyr pr. kB under udvinding af blokke (standard: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Vedligehold et komplet transaktionsindeks (standard: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maksimum for modtagelsesbuffer pr. forbindelse, <n>*1000 byte (standard: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maksimum for afsendelsesbuffer pr. forbindelse, <n>*1000 byte (standard: 1000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Behold højest <n> uforbindelige transaktioner i hukommelsen (standard: %u)</translation> </message> <message> <source>Need to specify a port with -whitebind: '%s'</source> @@ -3259,22 +3187,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Videresendelsesvalgmuligheder for knude:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Acceptér kun blokkæde, som matcher indbyggede kontrolposter (standard: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Tilslut kun til knuder i netværk <net> (IPv4, IPv6 eller Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Udskriv blok under opstart, hvis den findes i blokindeks</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Udskriv bloktræ under startop (standard: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Tilvalg for RPC SSL: (se Bitcoin Wiki for instruktioner i SSL-opstart)</translation> </message> @@ -3291,28 +3207,12 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Slør tilfældigt 1 ud af hver <n> netværksbeskeder</translation> </message> <message> - <source>Relay and mine data carrier transactions (default: 1)</source> - <translation>Videresend og mine databærer-transaktioner (standard: 1)</translation> - </message> - <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>Videresend ikke-P2SH multisig (standard: 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Kør en tråd for at rydde tegnebog periodisk (standard: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Send sporings-/fejlsøgningsinformation til konsollen i stedet for debug.log filen</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Angiv minimumsblokstørrelse i byte (standard: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Sætter DB_PRIVATE-flaget i tegnebogens db-miljø (standard: 1)</translation> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Send transaktioner som nul-gebyr-transaktioner hvis muligt (standard: %u)</translation> </message> <message> <source>Show all debugging options (usage: --help -help-debug)</source> @@ -3327,14 +3227,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Underskrift af transaktion mislykkedes</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Angiv tilslutningstimeout i millisekunder (standard: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Systemfejl: </translation> - </message> - <message> <source>This is experimental software.</source> <translation>Dette er eksperimentelt software.</translation> </message> @@ -3355,10 +3247,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ikke i stand til at tildele til %s på denne computer (bind returnerede fejl %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Brug UPnP til at konfigurere den lyttende port (standard: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Brug UPnP til at konfigurere den lyttende port (standard: 1 under lytning)</translation> </message> @@ -3411,10 +3299,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Opgrader tegnebog til seneste format</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Angiv nøglepoolstørrelse til <n> (standard: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Gennemsøg blokkæden for manglende tegnebogstransaktioner</translation> </message> @@ -3423,14 +3307,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Brug OpenSSL (https) for JSON-RPC-forbindelser</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Servercertifikat-fil (standard: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Serverens private nøgle (standard: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Denne hjælpebesked</translation> </message> @@ -3447,14 +3323,180 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Fejl ved indlæsning af wallet.dat: Tegnebog ødelagt</translation> </message> <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = behold metadata for transaktion, fx kontoindehaver og information om betalingsanmodning, 2 = drop metadata for transaktion)</translation> + </message> + <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Flyt databaseaktivitet fra hukommelsespulje til disklog hver <n> megabyte (standard: %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>Hvor gennemarbejdet blokverificeringen for -checkblocks er (0-4; standard: %u)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source> + <translation>Hvis paytxfee ikke er angivet, inkludér da nok gebyr til at transaktioner gennemsnitligt bekræftes inden for n blokke (standard: %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Prioritet for transaktionslog og gebyr pr. kB under udvinding af blokke (standard: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Vedligehold et komplet transaktionsindeks, der bruges af rpc-kaldet getrawtransaction (standard: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Antal sekunder, som knuder der opfører sig upassende, skal vente før reetablering (standard: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Udskriv fejlsøgningsinformation (standard: %u, angivelse af <kategori> er valgfri)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Brug separat SOCS5-proxy for at nå andre knuder via Tor skjulte tjenester (standard: %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(standard: %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Accepterede kodninger (standard: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Forespørg altid adresser på andre knuder via DNS-opslag (default: %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Slå sikker tilstand fra, tilsidesæt hændelser fra sikker tilstand (standard: %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>Fejl ved indlæsning af wallet.dat</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Gennemtving sikker tilstand (standard: %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Generér bitcoins (standard: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Antal blokke som tjekkes ved opstart (standard: %u, 0 = alle)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Inkludér IP-adresser i fejlretningsoutput (standard: %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Ugyldig -proxy adresse: "%s"</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>Begræns størrelsen på signaturcache til <n> indgange (standard: %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>Lyt efter JSON-RPC-forbindelser på <port> (standard: %u eller testnet: %u)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Lyt efter forbindelser på <port> (standard: %u eller testnet: %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Oprethold højest <n> forbindelser til andre knuder (standard: %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maksimum for modtagelsesbuffer pr. forbindelse, <n>*1000 byte (standard: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maksimum for afsendelsesbuffer pr. forbindelse, <n>*1000 byte (standard: %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>Acceptér kun indbyggede kontrolposter, der matcher blokkæden (standard: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Føj tidsstempel foran fejlsøgningsoutput (standard: %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Udskriv bloktræ under opstart (standard: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Videresend og udvind databærer-transaktioner (standard: %u)</translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>Videresend ikke-P2SH multisig (standard: %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Kør en tråd for periodisk at rydde tegnebog (standard: %u)</translation> + </message> + <message> + <source>Server certificate file (default: %s)</source> + <translation>Servercertifikat-fil (standard: %s) +</translation> + </message> + <message> + <source>Server private key (default: %s)</source> + <translation>Serverens private nøgle (standard: %s)</translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Sæt nøglepuljestørrelse til <n> (standard: %u) +</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Angiv minimumsblokstørrelse i byte (standard: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Angiv antallet af tråde til at håndtere RPC-kald (standard: %d)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>Sætter DB_PRIVATE-flaget i tegnebogens db-miljø (standard: %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Angiv konfigurationsfil (standard: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Angiv tilslutningstimeout i millisekunder (minimum: 1, standard: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Angiv pid-fil (standard: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Brug ubekræftede byttepenge under afsendelse af transaktioner (standard: %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Stop kørsel efter import af blokke fra disk (standard: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Grænse for afbrydelse af forbindelse til knuder, der opfører sig upassende (standard: %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>Ukendt netværk anført i -onlynet: "%s"</translation> </message> diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts index 667f0eb239..9462f668d3 100644 --- a/src/qt/locale/bitcoin_de.ts +++ b/src/qt/locale/bitcoin_de.ts @@ -1,4 +1,4 @@ -<TS language="de" version="2.1"> +<TS language="de" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Registerkartenleiste</translation> </message> <message> - <source>[testnet]</source> - <translation>[Testnetz]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Keine Blockquelle verfügbar...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>%1 Blöcke des Transaktionsverlaufs verarbeitet.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n Stunde</numerusform><numerusform>%n Stunden</numerusform></translation> @@ -528,8 +520,8 @@ Adresse: %4</translation> <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>"Coin Control"-Adressauswahl</translation> + <source>Coin Selection</source> + <translation>Münzauswahl ("Coin Control")</translation> </message> <message> <source>Quantity:</source> @@ -580,8 +572,12 @@ Adresse: %4</translation> <translation>Betrag</translation> </message> <message> - <source>Address</source> - <translation>Adresse</translation> + <source>Received with label</source> + <translation>Empfangen über Bezeichnung</translation> + </message> + <message> + <source>Received with address</source> + <translation>Empfangen über Adresse</translation> </message> <message> <source>Date</source> @@ -915,13 +911,13 @@ Adresse: %4</translation> <source>Error</source> <translation>Fehler</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB freier Speicherplatz verfügbar</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB freier Speicherplatz verfügbar</numerusform><numerusform>%n GB freier Speicherplatz verfügbar</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(von benötigten %1GB)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(von benötigtem %n GB)</numerusform><numerusform>(von benötigten %n GB)</numerusform></translation> </message> </context> <context> @@ -958,14 +954,6 @@ Adresse: %4</translation> <translation>&Allgemein</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Optionale Transaktionsgebühr pro kB, die sicherstellt, dass Ihre Transaktionen schnell bearbeitet werden. Die meisten Transaktionen sind 1 kB groß.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Transaktions&gebühr bezahlen</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Bitcoin nach der Anmeldung am System automatisch ausführen.</translation> </message> @@ -994,14 +982,6 @@ Adresse: %4</translation> <translation>Erlaubt eingehende Verbindungen</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Über einen SOCKS-Proxy mit dem Bitcoin-Netzwerk verbinden.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>Über einen SOCKS-Proxy &verbinden (Standardproxy):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>IP-Adresse des Proxies (z.B. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1062,6 +1042,14 @@ Adresse: %4</translation> <translation>Portweiterleitung via &UPnP</translation> </message> <message> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation>Über einen SOCKS5-Proxy mit dem Bitcoin-Netzwerk verbinden.</translation> + </message> + <message> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation>Über einen SOCKS5-Proxy &verbinden (Standardproxy):</translation> + </message> + <message> <source>Proxy &IP:</source> <translation>Proxy-&IP:</translation> </message> @@ -1165,10 +1153,6 @@ Adresse: %4</translation> <translation>Die angezeigten Informationen sind möglicherweise nicht mehr aktuell. Ihre Wallet wird automatisch synchronisiert, nachdem eine Verbindung zum Bitcoin-Netzwerk hergestellt wurde. Dieser Prozess ist jedoch derzeit noch nicht abgeschlossen.</translation> </message> <message> - <source>Wallet</source> - <translation>Wallet</translation> - </message> - <message> <source>Watch-only:</source> <translation>Beobachtet:</translation> </message> @@ -1197,6 +1181,10 @@ Adresse: %4</translation> <translation>Erarbeiteter Betrag der noch nicht gereift ist</translation> </message> <message> + <source>Balances</source> + <translation>Kontostände</translation> + </message> + <message> <source>Total:</source> <translation>Gesamtbetrag:</translation> </message> @@ -1209,6 +1197,14 @@ Adresse: %4</translation> <translation>Ihr aktueller Kontostand beobachteter Adressen</translation> </message> <message> + <source>Spendable:</source> + <translation>Verfügbar:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Letzte Transaktionen</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>Unbestätigte Transaktionen von beobachteten Adressen</translation> </message> @@ -1221,10 +1217,6 @@ Adresse: %4</translation> <translation>Aktueller Gesamtbetrag in beobachteten Adressen aus obigen Kategorien</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Letzte Transaktionen</b></translation> - </message> - <message> <source>out of sync</source> <translation>nicht synchron</translation> </message> @@ -1484,10 +1476,6 @@ Adresse: %4</translation> <translation>Dienste</translation> </message> <message> - <source>Sync Node</source> - <translation>Sync-Knoten</translation> - </message> - <message> <source>Starting Height</source> <translation>Start-Höhe</translation> </message> @@ -1616,14 +1604,6 @@ Adresse: %4</translation> <translation>ausgehend</translation> </message> <message> - <source>Yes</source> - <translation>Ja</translation> - </message> - <message> - <source>No</source> - <translation>Nein</translation> - </message> - <message> <source>Unknown</source> <translation>Unbekannt</translation> </message> @@ -1860,6 +1840,66 @@ Adresse: %4</translation> <translation>Benutzerdefinierte Wechselgeld-Adresse</translation> </message> <message> + <source>Transaction Fee:</source> + <translation>Transaktionsgebühr:</translation> + </message> + <message> + <source>Choose...</source> + <translation>Auswählen...</translation> + </message> + <message> + <source>collapse fee-settings</source> + <translation>Transaktionsgebühreneinstellungen ausblenden</translation> + </message> + <message> + <source>Minimize</source> + <translation>Minimieren</translation> + </message> + <message> + <source>per kilobyte</source> + <translation>pro Kilobyte</translation> + </message> + <message> + <source>total at least</source> + <translation>Mindestbetrag</translation> + </message> + <message> + <source>(read the tooltip)</source> + <translation>(den Hinweistext lesen)</translation> + </message> + <message> + <source>Recommended:</source> + <translation>Empfehlungen:</translation> + </message> + <message> + <source>Custom:</source> + <translation>Benutzerdefiniert:</translation> + </message> + <message> + <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source> + <translation>(Intelligente Gebührenlogik ist noch nicht verfügbar. Normalerweise dauert dies einige Blöcke lang...)</translation> + </message> + <message> + <source>Confirmation time:</source> + <translation>Bestätigungszeit:</translation> + </message> + <message> + <source>normal</source> + <translation>normal</translation> + </message> + <message> + <source>fast</source> + <translation>schnell</translation> + </message> + <message> + <source>Send as zero-fee transaction if possible</source> + <translation>Wenn möglich als gebührenfreie Transaktion senden</translation> + </message> + <message> + <source>(confirmation may take longer)</source> + <translation>(Bestätigung kann länger dauern)</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>An mehrere Empfänger auf einmal überweisen</translation> </message> @@ -1964,6 +2004,18 @@ Adresse: %4</translation> <translation>Die Transaktion wurde abgelehnt! Dies kann passieren, wenn einige Bitcoins aus Ihrer Wallet bereits ausgegeben wurden. Beispielsweise weil Sie eine Kopie Ihrer wallet.dat genutzt, die Bitcoins dort ausgegeben haben und dies daher in der derzeit aktiven Wallet nicht vermerkt ist.</translation> </message> <message> + <source>A fee higher than %1 is considered an insanely high fee.</source> + <translation>Eine höhere Gebühr als %1 wird als unsinnig hohe Gebühr angesehen.</translation> + </message> + <message> + <source>Pay only the minimum fee of %1</source> + <translation>Nur die minimale Gebühr in Höhe von %1 zahlen</translation> + </message> + <message> + <source>Estimated to begin confirmation within %1 block(s).</source> + <translation>Voraussichtlicher Beginn der Bestätigung innerhalb von %1 Blöcken.</translation> + </message> + <message> <source>Warning: Invalid Bitcoin address</source> <translation>Warnung: Ungültige Bitcoin-Adresse</translation> </message> @@ -2472,6 +2524,10 @@ Adresse: %4</translation> <translation>Erarbeitet</translation> </message> <message> + <source>watch-only</source> + <translation>beobachtet</translation> + </message> + <message> <source>(n/a)</source> <translation>(k.A.)</translation> </message> @@ -2488,6 +2544,10 @@ Adresse: %4</translation> <translation>Art der Transaktion</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Zeigt an, ob eine beobachtete Adresse in diese Transaktion involviert ist.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>Zieladresse der Transaktion.</translation> </message> @@ -2583,6 +2643,10 @@ Adresse: %4</translation> <translation>Transaktionsverlauf exportieren</translation> </message> <message> + <source>Watch-only</source> + <translation>Beobachtet</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Exportieren fehlgeschlagen</translation> </message> @@ -2698,26 +2762,10 @@ Adresse: %4</translation> <translation>Optionen:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Konfigurationsdatei festlegen (Standard: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>PID-Datei festlegen (Standard: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Datenverzeichnis festlegen</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation><port> nach Verbindungen abhören (Standard: 8333 oder Testnetz: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Maximal <n> Verbindungen zu Gegenstellen aufrechterhalten (Standard: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Mit dem angegebenen Knoten verbinden, um Adressen von Gegenstellen abzufragen, danach trennen</translation> </message> @@ -2726,18 +2774,6 @@ Adresse: %4</translation> <translation>Die eigene öffentliche Adresse angeben</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Schwellenwert, um Verbindungen zu sich nicht konform verhaltenden Gegenstellen zu beenden (Standard: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Anzahl Sekunden, während denen sich nicht konform verhaltenden Gegenstellen die Wiederverbindung verweigert wird (Standard: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation><port> nach JSON-RPC-Verbindungen abhören (Standard: 8332 oder Testnetz: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Kommandozeilen- und JSON-RPC-Befehle annehmen</translation> </message> @@ -2778,16 +2814,8 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Zulässige Chiffren (Standard: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> - <translation>An die angegebene Adresse binden und immer abhören. Für IPv6 "[Host]:Port"-Schreibweise verwenden</translation> - </message> - <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Anzahl der freien Transaktionen auf <n> * 1000 Byte pro Minute begrenzen (Standard: 15)</translation> + <translation>An die angegebene Adresse binden und immer abhören. Für IPv6 "[Host]:Port"-Notation verwenden</translation> </message> <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> @@ -2807,15 +2835,7 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com </message> <message> <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source> - <translation>Befehl ausführen wenn sich eine Wallet-Transaktion verändert (%s im Befehl wird durch die TxID ersetzt)</translation> - </message> - <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Datenbankaktivitäten vom Arbeitsspeicher-Pool alle <n> Megabyte auf den Datenträger schreiben (Standard: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Legt fest, wie gründlich die Blockverifikation von -checkblocks ist (0-4, Standard: 3)</translation> + <translation>Befehl ausführen wenn sich eine Wallet-Transaktion verändert (%s im Befehl wird durch die Transaktions-ID ersetzt)</translation> </message> <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> @@ -2826,10 +2846,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Maximale Anzahl an Skript-Verifizierungs-Threads festlegen (%u bis %d, 0 = automatisch, <0 = so viele Kerne frei lassen, Standard: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Legt ein Prozessor-/CPU-Kernlimit fest, wenn CPU-Mining aktiviert ist (-1 = unbegrenzt, Standard: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Dies ist eine Vorab-Testversion - Verwendung auf eigene Gefahr - nicht für Mining- oder Handelsanwendungen nutzen!</translation> </message> @@ -2838,10 +2854,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Kann auf diesem Computer nicht an %s binden, da Bitcoin Core wahrscheinlich bereits gestartet wurde.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Separaten SOCKS5-Proxy verwenden, um Gegenstellen über versteckte Tor-Dienste zu erreichen (Standard: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Warnung: -paytxfee ist auf einen sehr hohen Wert festgelegt! Dies ist die Gebühr die beim Senden einer Transaktion fällig wird.</translation> </message> @@ -2862,12 +2874,12 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Warnung: wallet.dat beschädigt, Datenrettung erfolgreich! Original wallet.dat wurde als wallet.{Zeitstempel}.dat in %s gespeichert. Falls Ihr Kontostand oder Transaktionen nicht korrekt sind, sollten Sie von einer Datensicherung wiederherstellen.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(Standard: 1)</translation> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Gegenstellen die sich von der angegebenen Netzmaske oder IP-Adresse aus verbinden immer zulassen. Kann mehrmals angegeben werden.</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(Standard: wallet.dat)</translation> + <source>(default: 1)</source> + <translation>(Standard: 1)</translation> </message> <message> <source><category> can be:</source> @@ -2898,10 +2910,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Debugging-/Testoptionen:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Sicherheitsmodus deaktivieren, übergeht ein echtes Sicherheitsmodusereignis (Standard: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Eigene IP-Adresse erkennen (Standard: 1, wenn abgehört wird und nicht -externalip)</translation> </message> @@ -2930,6 +2938,10 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Fehler beim Öffnen der Blockdatenbank</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Fehler: Ein schwerer Fehler ist aufgetreten, für Details debug.log ansehen.</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Fehler: Zu wenig freier Speicherplatz auf dem Datenträger!</translation> </message> @@ -2938,66 +2950,10 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Fehler: Wallet gesperrt, Transaktion kann nicht erstellt werden!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Fehler: Systemfehler: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Fehler, es konnte kein Port abgehört werden. Wenn dies so gewünscht wird -listen=0 verwenden.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Lesen der Blockinformationen fehlgeschlagen</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Lesen des Blocks fehlgeschlagen</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Synchronisation des Blockindex fehlgeschlagen</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Schreiben des Blockindex fehlgeschlagen</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Schreiben der Blockinformationen fehlgeschlagen</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Schreiben des Blocks fehlgeschlagen</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Schreiben der Dateiinformationen fehlgeschlagen</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Schreiben in die Münzendatenbank fehlgeschlagen</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Schreiben des Transaktionsindex fehlgeschlagen</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Schreiben der Rücksetzdaten fehlgeschlagen</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Sicherheitsmodus erzwingen (Standard: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Bitcoins erzeugen (Standard: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Wieviele Blöcke beim Starten geprüft werden sollen (Standard: 288, 0 = alle)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Wenn <category> nicht angegeben wird, jegliche Debugginginformationen ausgeben.</translation> </message> @@ -3018,8 +2974,8 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Nicht genügend Datei-Deskriptoren verfügbar.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Debugausgaben einen Zeitstempel voranstellen (Standard: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Nur zu Knoten des Netzwerktyps <net> verbinden (ipv4, ipv6 oder onion)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3034,26 +2990,18 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Maximale Blockgröße in Byte festlegen (Standard: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Maximale Anzahl an Threads zur Verarbeitung von RPC-Anfragen festlegen (Standard: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Wallet-Datei angeben (innerhalb des Datenverzeichnisses)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Unbestätigtes Wechselgeld beim Senden von Transaktionen ausgeben (Standard: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Beenden, nachdem Blöcke vom Datenträger importiert wurden (Standard: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Dies ist für Regressionstest-Tools und Anwendungsentwicklung gedacht.</translation> </message> <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>UPnP verwenden, um eine Portweiterleitung einzurichten (Standard: %u)</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Verifiziere Blöcke...</translation> </message> @@ -3078,16 +3026,32 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Blöcke aus externer Datei blk000??.dat importieren</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(Standard: 1, 1 = TX-Metadaten wie z.B. Accountbesitzer und Zahlungsanforderungsinformationen behalten, 2 = TX-Metadaten verwerfen)</translation> + <source>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</source> + <translation>JSON-RPC-Verbindungen von der angegeben Quelle erlauben. Gültig für <ip> ist eine einzelne IP-Adresse (z.B. 1.2.3.4), ein Netzwerk bzw. eine Netzmaske (z.B. 1.2.3.4/255.255.255.0), oder die CIDR-Notation (z.B. 1.2.3.4/24). Kann mehrmals angegeben werden.</translation> + </message> + <message> + <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source> + <translation>Beim Einrichten der abzuhörenden RPC-Adresse %s auf Port %u ist ein Fehler aufgetreten: %s</translation> + </message> + <message> + <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source> + <translation>An die angegebene Adresse binden und Gegenstellen, die sich dorthin verbinden, immer zulassen. Für IPv6 "[Host]:Port"-Notation verwenden</translation> + </message> + <message> + <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source> + <translation>An die angegebene Adresse binden und nach eingehenden JSON-RPC-Verbindungen abhören. Für IPv6 "[Host]:Port"-Notation verwenden. Kann mehrmals angegeben werden. (Standard: an alle Schnittstellen binden)</translation> </message> <message> <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source> <translation>Datenverzeichnis %s kann nicht gesperrt werden, da Bitcoin Core wahrscheinlich bereits gestartet wurde.</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>Veröffentlicht unter der MIT/X11-Softwarelizenz, siehe beiligende Datei COPYING oder <http://www.opensource.org/licenses/mit-license.php>.</translation> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Anzahl der freien Transaktionen auf <n> * 1000 Byte pro Minute begrenzen (Standard: %u)</translation> + </message> + <message> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Neue Dateien mit Standard-Systemrechten erzeugen, anstatt mit umask 077 (nur mit deaktivierter Walletfunktion nutzbar)</translation> </message> <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> @@ -3103,19 +3067,27 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com </message> <message> <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source> - <translation>Niedrigere Gebühren (in BTC/Kb) als diese werden bei der Vermittlung als gebührenfrei angesehen (Standard: %s)</translation> + <translation>Niedrigere Gebühren (in BTC/Kb) als diese werden bei der Weiterleitung als gebührenfrei angesehen (Standard: %s)</translation> </message> <message> <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source> <translation>Niedrigere Gebühren (in BTC/Kb) als diese werden bei der Transaktionserstellung als gebührenfrei angesehen (Standard: %s)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Debugginginformationen ausgeben (Standard: 0, <category> anzugeben ist optional)</translation> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation>Maximale Datengröße in "Data Carrier"-Transaktionen die weitergeleitet und erarbeitet werden (Standard: %u)</translation> + </message> + <message> + <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> + <translation>Adressen von Gegenstellen via DNS-Namensauflösung finden, falls zu wenige Adressen verfügbar sind (Standard: 1, außer bei -connect)</translation> </message> <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> - <translation>Maximale Größe in Byte von Transaktionen hoher Priorität/mit niedrigen Gebühren festlegen (Standard: %d)</translation> + <translation>Maximale Größe in Byte von "high-priority/low-fee"-Transaktionen festlegen (Standard: %d)</translation> + </message> + <message> + <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source> + <translation>Maximale Anzahl an Threads zur Bitcoinerzeugung, wenn aktiviert, festlegen (-1 = alle Kerne, Standard: %d)</translation> </message> <message> <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> @@ -3123,7 +3095,15 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com </message> <message> <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source> - <translation>Warnung: Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da Bitcoin Core ansonsten nicht ordnungsgemäß funktionieren wird!</translation> + <translation>Warnung: Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da Bitcoin Core ansonsten nicht ordnungsgemäß funktionieren wird.</translation> + </message> + <message> + <source>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</source> + <translation>Erlaubte Gegenstellen werden nicht für DoS-Attacken gesperrt und ihre Transkationen werden immer weitergeleitet, auch wenn sie sich bereits im Speicherpool befinden, was z.B. für Gateways sinnvoll ist.</translation> + </message> + <message> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>Kann Adresse in -whitebind nicht auflösen: '%s'</translation> </message> <message> <source>Connect through SOCKS5 proxy</source> @@ -3146,10 +3126,18 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Fehler: Nicht unterstütztes Argument -tor gefunden, bitte -onion verwenden.</translation> </message> <message> + <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source> + <translation>Gebühr (in BTC/kB), die von Ihnen gesendeten Transaktionen hinzugefügt wird (Standard: %s)</translation> + </message> + <message> <source>Information</source> <translation>Hinweis</translation> </message> <message> + <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source> + <translation>Initialisierungsplausibilitätsprüfung fehlgeschlagen. Bitcoin Core wird beendet.</translation> + </message> + <message> <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> <translation>Ungültiger Betrag für -minrelaytxfee=<amount>: '%s'</translation> </message> @@ -3158,46 +3146,34 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Ungültiger Betrag für -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Größe des Signaturcaches auf <n> Einträge begrenzen (Standard: 50000)</translation> + <source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source> + <translation>Ungültiger Betrag für -paytxfee=<amount>: '%s' (muss mindestens %s sein)</translation> </message> <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Transaktionspriorität und Gebühr pro kB beim Erzeugen von Blöcken protokollieren (Standard: 0)</translation> + <source>Invalid netmask specified in -whitelist: '%s'</source> + <translation>Ungültige Netzmaske angegeben in -whitelist: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Einen vollständigen Transaktionsindex führen (Standard: 0)</translation> + <source>Keep at most <n> unconnectable blocks in memory (default: %u)</source> + <translation>Maximal <n> nicht-verbindbare Blöcke im Speicher halten (Standard: %u)</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maximale Größe des Empfangspuffers pro Verbindung, <n> * 1000 Byte (Standard: 5000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Maximal <n> nicht-verbindbare Transaktionen im Speicher halten (Standard: %u)</translation> </message> <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maximale Größe des Sendepuffers pro Verbindung, <n> * 1000 Byte (Standard: 1000)</translation> + <source>Need to specify a port with -whitebind: '%s'</source> + <translation>Angabe eines Ports benötigt für -whitebind: '%s'</translation> </message> <message> <source>Node relay options:</source> - <translation>Knoten-Vermittlungsoptionen:</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Blockkette nur als gültig ansehen, wenn sie mit den integrierten Prüfpunkten übereinstimmt (Standard: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Verbinde nur zu Knoten des Netztyps <net> (IPv4, IPv6 oder Tor)</translation> + <translation>Knoten-Weiterleitungsoptionen:</translation> </message> <message> <source>Print block on startup, if found in block index</source> <translation>Block beim Starten ausgeben, wenn dieser im Blockindex gefunden wurde.</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Blockbaum beim Starten ausgeben (Standard: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC-SSL-Optionen (siehe Bitcoin-Wiki für SSL-Einrichtung):</translation> </message> @@ -3214,20 +3190,12 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Zufällig eine von <n> Netzwerknachrichten verwürfeln</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Einen Thread starten, der periodisch die Wallet sicher auf den Datenträger schreibt (Standard: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Rückverfolgungs- und Debuginformationen an die Konsole senden, anstatt sie in debug.log zu schreiben</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Minimale Blockgröße in Byte festlegen (Standard: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>DB_PRIVATE-Flag in der Wallet-Datenbankumgebung setzen (Standard: 1)</translation> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Transaktionen, wenn möglich, als gebührenfreie Transaktion senden (Standard: %u)</translation> </message> <message> <source>Show all debugging options (usage: --help -help-debug)</source> @@ -3242,14 +3210,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Signierung der Transaktion fehlgeschlagen</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Verbindungzeitüberschreitung in Millisekunden festlegen (Standard: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Systemfehler: </translation> - </message> - <message> <source>This is experimental software.</source> <translation>Dies ist experimentelle Software.</translation> </message> @@ -3266,8 +3226,8 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Transaktion zu groß</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>UPnP verwenden, um eine Portweiterleitung einzurichten (Standard: 0)</translation> + <source>Unable to bind to %s on this computer (bind returned error %s)</source> + <translation>Kann auf diesem Computer nicht an %s binden (bind meldete Fehler %s)</translation> </message> <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> @@ -3322,10 +3282,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Wallet auf das neueste Format aktualisieren</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Größe des Schlüsselpools festlegen auf <n> (Standard: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Blockkette erneut nach fehlenden Wallet-Transaktionen durchsuchen</translation> </message> @@ -3334,14 +3290,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>OpenSSL (https) für JSON-RPC-Verbindungen verwenden</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Serverzertifikat (Standard: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Privater Serverschlüssel (Standard: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Dieser Hilfetext</translation> </message> @@ -3358,14 +3306,174 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com <translation>Fehler beim Laden von wallet.dat: Wallet beschädigt</translation> </message> <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = TX-Metadaten wie z.B. Accountbesitzer und Zahlungsanforderungsinformationen behalten, 2 = TX-Metadaten verwerfen)</translation> + </message> + <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Datenbankaktivitäten vom Arbeitsspeicher-Pool alle <n> Megabyte auf den Datenträger schreiben (Standard: %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>Legt fest, wie gründlich die Blockverifikation von -checkblocks ist (0-4, Standard: %u)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source> + <translation>Wenn keine Transaktionsgebühr festgelegt wurde eine Gebühr einbeziehen, sodass Transaktionen im Schnitt innerhalb von <n> Blöcken bestätigt werden (Standard: %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Transaktionspriorität und Gebühr pro kB beim Erzeugen von Blöcken protokollieren (Standard: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Einen vollständigen Transaktionsindex führen, der vom RPC-Befehl "getrawtransaction" genutzt wird (Standard: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Anzahl Sekunden, während denen sich nicht konform verhaltenden Gegenstellen die Wiederverbindung verweigert wird (Standard: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Debugginginformationen ausgeben (Standard: %u, <category> anzugeben ist optional)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Separaten SOCKS5-Proxy verwenden, um Gegenstellen über versteckte Tor-Dienste zu erreichen (Standard: %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(Standard: %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Zulässige Chiffren (Standard: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Adressen von Gegenstellen immer über DNS-Namensauflösung abfragen (Standard: %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Sicherheitsmodus deaktivieren, übergeht ein echtes Sicherheitsmodusereignis (Standard: %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>Fehler beim Laden von wallet.dat</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Sicherheitsmodus erzwingen (Standard: %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Bitcoins erzeugen (Standard: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Wieviele Blöcke beim Starten geprüft werden sollen (Standard: %u, 0 = alle)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>IP-Adressen in Debugausgabe einschließen (Standard: %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Ungültige Adresse in -proxy: '%s'</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>Größe des Signaturcaches auf <n> Einträge begrenzen (Standard: %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation><port> nach JSON-RPC-Verbindungen abhören (Standard: %u oder Testnetz: %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Maximal <n> Verbindungen zu Gegenstellen aufrechterhalten (Standard: %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maximale Größe des Empfangspuffers pro Verbindung, <n> * 1000 Byte (Standard: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maximale Größe des Sendepuffers pro Verbindung, <n> * 1000 Byte (Standard: %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>Blockkette nur als gültig ansehen, wenn sie mit den integrierten Prüfpunkten übereinstimmt (Standard: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Debugausgaben einen Zeitstempel voranstellen (Standard: %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Blockbaum beim Starten ausgeben (Standard: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>"Data Carrier"-Transaktionen weiterleiten und erarbeiten (Standard: %u)</translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>Nicht-"P2SH-Multisig" weiterleiten (Standard: %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Einen Thread starten, der periodisch die Wallet sicher auf den Datenträger schreibt (Standard: %u)</translation> + </message> + <message> + <source>Server certificate file (default: %s)</source> + <translation>Serverzertifikat (Standard: %s)</translation> + </message> + <message> + <source>Server private key (default: %s)</source> + <translation>Privater Serverschlüssel (Standard: %s)</translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Größe des Schlüsselpools festlegen auf <n> (Standard: %u)</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Minimale Blockgröße in Byte festlegen (Standard: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Maximale Anzahl an Threads zur Verarbeitung von RPC-Anfragen festlegen (Standard: %d)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>"DB_PRIVATE"-Flag in der Wallet-Datenbankumgebung setzen (Standard: %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Konfigurationsdatei festlegen (Standard: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Verbindungzeitüberschreitung in Millisekunden festlegen (Minimum: 1, Standard: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>PID-Datei festlegen (Standard: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Unbestätigtes Wechselgeld darf beim Senden von Transaktionen ausgegeben werden (Standard: %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Beenden, nachdem Blöcke vom Datenträger importiert wurden (Standard: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Schwellenwert, um Verbindungen zu sich nicht konform verhaltenden Gegenstellen zu beenden (Standard: %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>Unbekannter Netztyp in -onlynet angegeben: '%s'</translation> </message> diff --git a/src/qt/locale/bitcoin_el_GR.ts b/src/qt/locale/bitcoin_el_GR.ts index d5e9b57d99..1a1c918c5b 100644 --- a/src/qt/locale/bitcoin_el_GR.ts +++ b/src/qt/locale/bitcoin_el_GR.ts @@ -1,4 +1,4 @@ -<TS language="el_GR" version="2.1"> +<TS language="el_GR" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -352,10 +352,6 @@ <translation>Εργαλειοθήκη καρτελών</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -383,10 +379,6 @@ <source>No block source available...</source> <translation>Η πηγή του μπλοκ δεν ειναι διαθέσιμη... </translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Έγινε λήψη %1 μπλοκ ιστορικού συναλλαγών</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n ώρες </numerusform><numerusform>%n ώρες </numerusform></translation> @@ -506,10 +498,6 @@ Address: %4 <translation>Ποσό</translation> </message> <message> - <source>Address</source> - <translation>Διεύθυνση</translation> - </message> - <message> <source>Date</source> <translation>Ημερομηνία</translation> </message> @@ -610,6 +598,10 @@ Address: %4 <translation>όχι</translation> </message> <message> + <source>This label turns red, if the transaction size is greater than 1000 bytes.</source> + <translation>Η ετικετα γινετε κοκκινη , αν το μεγεθος της συναλαγης ειναι μεγαλητερο απο 1000 bytes.</translation> + </message> + <message> <source>(no label)</source> <translation>(χωρίς ετικέτα)</translation> </message> @@ -766,15 +758,7 @@ Address: %4 <source>Error</source> <translation>Σφάλμα</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB ελεύθερου χώρου διαθέσιμα</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(από τα %1GB που χρειάζονται)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> </context> @@ -789,14 +773,6 @@ Address: %4 <translation>&Κύριο</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Η προαιρετική αμοιβή για κάθε kB επισπεύδει την επεξεργασία των συναλλαγών σας. Οι περισσότερες συναλλαγές είναι 1 kB. </translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Αμοιβή &συναλλαγής</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Αυτόματη εκκίνηση του Bitcoin μετά την εισαγωγή στο σύστημα</translation> </message> @@ -924,10 +900,6 @@ Address: %4 <translation>Οι πληροφορίες που εμφανίζονται μπορεί να είναι ξεπερασμένες. Το πορτοφόλι σας συγχρονίζεται αυτόματα με το δίκτυο Bitcoin μετά από μια σύνδεση, αλλά αυτή η διαδικασία δεν έχει ακόμη ολοκληρωθεί. </translation> </message> <message> - <source>Wallet</source> - <translation>Πορτοφόλι</translation> - </message> - <message> <source>Available:</source> <translation>Διαθέσιμο:</translation> </message> @@ -956,10 +928,6 @@ Address: %4 <translation>Το τρέχον συνολικό υπόλοιπο</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Πρόσφατες συναλλαγές</b></translation> - </message> - <message> <source>out of sync</source> <translation>εκτός συγχρονισμού</translation> </message> @@ -2053,26 +2021,10 @@ Address: %4 <translation>Επιλογές:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Ορίστε αρχείο ρυθμίσεων (προεπιλογή: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Ορίστε αρχείο pid (προεπιλογή: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Ορισμός φακέλου δεδομένων</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Εισερχόμενες συνδέσεις στη θύρα <port> (προεπιλογή: 8333 ή στο testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Μέγιστες αριθμός συνδέσεων με τους peers <n> (προεπιλογή: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Σύνδεση σε έναν κόμβο για την ανάκτηση διευθύνσεων από ομοτίμους, και αποσυνδέσh</translation> </message> @@ -2081,18 +2033,6 @@ Address: %4 <translation>Διευκρινίστε τη δικιά σας δημόσια διεύθυνση.</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Όριο αποσύνδεσης προβληματικών peers (προεπιλογή: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Δευτερόλεπτα πριν επιτραπεί ξανά η σύνδεση των προβληματικών peers (προεπιλογή: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Εισερχόμενες συνδέσεις JSON-RPC στη θύρα <port> (προεπιλογή: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Αποδοχή εντολών κονσόλας και JSON-RPC</translation> </message> @@ -2170,10 +2110,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>(προεπιλογή: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(προεπιλογή: wallet.dat)</translation> - </message> - <message> <source>Attempt to recover private keys from a corrupt wallet.dat</source> <translation>Προσπάθεια για ανακτησει ιδιωτικων κλειδιων από ενα διεφθαρμένο αρχειο wallet.dat </translation> </message> @@ -2226,62 +2162,10 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Σφάλμα: το πορτοφόλι είναι κλειδωμένο, δεν μπορεί να δημιουργηθεί συναλλαγή</translation> </message> <message> - <source>Error: system error: </source> - <translation>Λάθος: λάθος συστήματος:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>ταλαιπωρηθειτε για να ακούσετε σε οποιαδήποτε θύρα. Χρήση - ακούστε = 0 , αν θέλετε αυτό.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Αποτυχία αναγνωσης των block πληροφοριων</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Η αναγνωση του μπλοκ απετυχε</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Ο συγχρονισμος του μπλοκ ευρετηριου απετυχε</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Η δημιουργια του μπλοκ ευρετηριου απετυχε</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Η δημιουργια των μπλοκ πληροφοριων απετυχε</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Η δημιουργια του μπλοκ απετυχε</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Αδυναμία εγγραφής πληροφοριων αρχειου</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Αποτυχία εγγραφής στη βάση δεδομένων νομίσματος</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Αποτυχία εγγραφής δείκτη συναλλαγών </translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Αποτυχία εγγραφής αναίρεσης δεδομένων </translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Δημιουργία νομισμάτων (προκαθορισμος: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Πόσα μπλοκ να ελέγχθουν κατά την εκκίνηση (προεπιλογή:288,0=όλα)</translation> - </message> - <message> <source>Invalid -onion address: '%s'</source> <translation>Άκυρη διεύθυνση -onion : '%s'</translation> </message> @@ -2294,10 +2178,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Εισαγωγή μπλοκ από εξωτερικό αρχείο blk000?.dat</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Ορίσμος του αριθμόυ θεματων στην υπηρεσία κλήσεων RPC (προεπιλογή: 4) </translation> - </message> - <message> <source>Verifying blocks...</source> <translation>Επαλήθευση των μπλοκ... </translation> </message> @@ -2326,34 +2206,10 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Μη έγκυρο ποσό για την παράμετρο -paytxfee=<amount>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Διατηρήση ένος πλήρες ευρετήριου συναλλαγών (προεπιλογή: 0) </translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Μέγιστος buffer λήψης ανά σύνδεση, <n>*1000 bytes (προεπιλογή: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Μέγιστος buffer αποστολής ανά σύνδεση, <n>*1000 bytes (προεπιλογή: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Μονο αποδοχη αλυσίδας μπλοκ που ταιριάζει με τα ενσωματωμένα σημεία ελέγχου (προεπιλογή: 1) </translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation> Συνδέση μόνο σε κόμβους του δικτύου <net> (IPv4, IPv6 ή Tor) </translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Αποστολή πληροφοριών εντοπισμού σφαλμάτων στην κονσόλα αντί του αρχείου debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Ορίστε το μέγιστο μέγεθος μπλοκ σε bytes (προεπιλογή: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Συρρίκνωση του αρχείο debug.log κατα την εκκίνηση του πελάτη (προεπιλογή: 1 όταν δεν-debug)</translation> </message> @@ -2362,14 +2218,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Η υπογραφή συναλλαγής απέτυχε </translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Ορισμός λήξης χρονικού ορίου σε χιλιοστά του δευτερολέπτου(προεπιλογή:5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Λάθος Συστήματος:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Το ποσό της συναλλαγής είναι πολύ μικρο </translation> </message> @@ -2382,10 +2230,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Η συναλλαγή ειναι πολύ μεγάλη </translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Χρησιμοποίηση του UPnP για την χρήση της πόρτας αναμονής (προεπιλογή:0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Χρησιμοποίηση του UPnP για την χρήση της πόρτας αναμονής (προεπιλογή:1)</translation> </message> @@ -2422,10 +2266,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Αναβάθμισε το πορτοφόλι στην τελευταία έκδοση</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Όριο πλήθους κλειδιών pool <n> (προεπιλογή: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Επανέλεγχος της αλυσίδας μπλοκ για απούσες συναλλαγές</translation> </message> @@ -2434,14 +2274,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Χρήση του OpenSSL (https) για συνδέσεις JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Αρχείο πιστοποιητικού του διακομιστή (προεπιλογή: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Προσωπικό κλειδί του διακομιστή (προεπιλογή: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Αυτό το κείμενο βοήθειας</translation> </message> diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts index df285441e1..71c626be4b 100644 --- a/src/qt/locale/bitcoin_en.ts +++ b/src/qt/locale/bitcoin_en.ts @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> -<TS version="2.1" language="en"> +<TS version="2.0" language="en"> <context> <name>AddressBookPage</name> <message> @@ -150,7 +150,7 @@ <translation>Passphrase Dialog</translation> </message> <message> - <location line="+21"/> + <location line="+30"/> <source>Enter passphrase</source> <translation>Enter passphrase</translation> </message> @@ -165,7 +165,7 @@ <translation>Repeat new passphrase</translation> </message> <message> - <location filename="../askpassphrasedialog.cpp" line="+41"/> + <location filename="../askpassphrasedialog.cpp" line="+45"/> <source>Encrypt wallet</source> <translation>Encrypt wallet</translation> </message> @@ -200,7 +200,7 @@ <translation>Enter the old and new passphrase to the wallet.</translation> </message> <message> - <location line="+46"/> + <location line="+45"/> <source>Confirm wallet encryption</source> <translation>Confirm wallet encryption</translation> </message> @@ -232,12 +232,12 @@ <translation>Wallet encrypted</translation> </message> <message> - <location line="-135"/> + <location line="-136"/> <source>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>.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>Bitcoin 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.</source> <translation>Bitcoin 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.</translation> </message> @@ -286,7 +286,7 @@ <context> <name>BitcoinGUI</name> <message> - <location filename="../bitcoingui.cpp" line="+309"/> + <location filename="../bitcoingui.cpp" line="+311"/> <source>Sign &message...</source> <translation>Sign &message...</translation> </message> @@ -296,7 +296,7 @@ <translation>Synchronizing with network...</translation> </message> <message> - <location line="-405"/> + <location line="-407"/> <source>&Overview</source> <translation>&Overview</translation> </message> @@ -321,7 +321,7 @@ <translation>Browse transaction history</translation> </message> <message> - <location line="+17"/> + <location line="+19"/> <source>E&xit</source> <translation>E&xit</translation> </message> @@ -392,12 +392,12 @@ <translation>Reindexing blocks on disk...</translation> </message> <message> - <location line="-403"/> + <location line="-405"/> <source>Send coins to a Bitcoin address</source> <translation>Send coins to a Bitcoin address</translation> </message> <message> - <location line="+46"/> + <location line="+48"/> <source>Modify configuration options for Bitcoin</source> <translation>Modify configuration options for Bitcoin</translation> </message> @@ -432,7 +432,7 @@ <translation>Bitcoin</translation> </message> <message> - <location line="-636"/> + <location line="-638"/> <source>Wallet</source> <translation>Wallet</translation> </message> @@ -447,7 +447,7 @@ <translation>&Receive</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>Show information about Bitcoin Core</source> <translation type="unfinished"></translation> </message> @@ -497,7 +497,7 @@ <translation>Tabs toolbar</translation> </message> <message> - <location line="-295"/> + <location line="-297"/> <source>Bitcoin Core</source> <translation type="unfinished">Bitcoin Core</translation> </message> @@ -507,7 +507,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+30"/> <source>&About Bitcoin Core</source> <translation type="unfinished"></translation> </message> @@ -672,7 +672,7 @@ Address: %4 <context> <name>ClientModel</name> <message> - <location filename="../clientmodel.cpp" line="+139"/> + <location filename="../clientmodel.cpp" line="+140"/> <source>Network Alert</source> <translation>Network Alert</translation> </message> @@ -681,7 +681,7 @@ Address: %4 <name>CoinControlDialog</name> <message> <location filename="../forms/coincontroldialog.ui" line="+14"/> - <source>Coin Control Address Selection</source> + <source>Coin Selection</source> <translation type="unfinished"></translation> </message> <message> @@ -735,19 +735,24 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+13"/> <source>List mode</source> <translation type="unfinished"></translation> </message> <message> - <location line="+53"/> + <location line="+56"/> <source>Amount</source> <translation type="unfinished">Amount</translation> </message> <message> - <location line="+10"/> - <source>Address</source> - <translation type="unfinished">Address</translation> + <location line="+5"/> + <source>Received with label</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+5"/> + <source>Received with address</source> + <translation type="unfinished"></translation> </message> <message> <location line="+5"/> @@ -770,7 +775,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location filename="../coincontroldialog.cpp" line="+43"/> + <location filename="../coincontroldialog.cpp" line="+44"/> <source>Copy address</source> <translation type="unfinished">Copy address</translation> </message> @@ -836,17 +841,17 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+333"/> + <location line="+347"/> <source>highest</source> <translation type="unfinished"></translation> </message> <message> - <location line="+0"/> + <location line="+1"/> <source>higher</source> <translation type="unfinished"></translation> </message> <message> - <location line="+0"/> + <location line="+1"/> <source>high</source> <translation type="unfinished"></translation> </message> @@ -856,18 +861,17 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+0"/> - <location line="+12"/> + <location line="+1"/> <source>medium</source> <translation type="unfinished"></translation> </message> <message> - <location line="-11"/> + <location line="+1"/> <source>low-medium</source> <translation type="unfinished"></translation> </message> <message> - <location line="+0"/> + <location line="+1"/> <source>low</source> <translation type="unfinished"></translation> </message> @@ -877,7 +881,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+1"/> <source>lowest</source> <translation type="unfinished"></translation> </message> @@ -892,12 +896,12 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+162"/> + <location line="+165"/> <source>Can vary +/- %1 satoshi(s) per input.</source> <translation type="unfinished"></translation> </message> <message> - <location line="-28"/> + <location line="-32"/> <source>yes</source> <translation type="unfinished"></translation> </message> @@ -938,7 +942,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+50"/> + <location line="+55"/> <location line="+61"/> <source>(no label)</source> <translation type="unfinished">(no label)</translation> @@ -1224,17 +1228,7 @@ Address: %4 <translation>&Main</translation> </message> <message> - <location line="+116"/> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</translation> - </message> - <message> - <location line="+15"/> - <source>Pay transaction &fee</source> - <translation>Pay transaction &fee</translation> - </message> - <message> - <location line="-125"/> + <location line="+6"/> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Automatically start Bitcoin after logging in to the system.</translation> </message> @@ -1259,7 +1253,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+160"/> + <location line="+114"/> <source>Accept connections from outside</source> <translation type="unfinished"></translation> </message> @@ -1269,17 +1263,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+3"/> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+34"/> + <location line="+44"/> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation type="unfinished"></translation> </message> @@ -1315,7 +1299,7 @@ Address: %4 <translation>&Network</translation> </message> <message> - <location line="-131"/> + <location line="-85"/> <source>(0 = auto, <0 = leave that many cores free)</source> <translation type="unfinished"></translation> </message> @@ -1325,7 +1309,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+65"/> + <location line="+6"/> <source>Expert</source> <translation type="unfinished"></translation> </message> @@ -1345,7 +1329,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+17"/> + <location line="+30"/> <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source> <translation>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</translation> </message> @@ -1355,7 +1339,17 @@ Address: %4 <translation>Map port using &UPnP</translation> </message> <message> - <location line="+29"/> + <location line="+17"/> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+9"/> <source>Proxy &IP:</source> <translation>Proxy &IP:</translation> </message> @@ -1420,12 +1414,12 @@ Address: %4 <translation>Choose the default subdivision unit to show in the interface and when sending coins.</translation> </message> <message> - <location line="-240"/> + <location line="-253"/> <source>Whether to show coin control features or not.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+402"/> + <location line="+415"/> <source>&OK</source> <translation>&OK</translation> </message> @@ -1435,17 +1429,17 @@ Address: %4 <translation>&Cancel</translation> </message> <message> - <location filename="../optionsdialog.cpp" line="+71"/> + <location filename="../optionsdialog.cpp" line="+76"/> <source>default</source> <translation>default</translation> </message> <message> - <location line="+63"/> + <location line="+60"/> <source>none</source> <translation type="unfinished"></translation> </message> <message> - <location line="+82"/> + <location line="+76"/> <source>Confirm options reset</source> <translation>Confirm options reset</translation> </message> @@ -1466,7 +1460,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+34"/> + <location line="+25"/> <source>The supplied proxy address is invalid.</source> <translation>The supplied proxy address is invalid.</translation> </message> @@ -2268,7 +2262,7 @@ Address: %4 <context> <name>RecentRequestsTableModel</name> <message> - <location filename="../recentrequeststablemodel.cpp" line="+26"/> + <location filename="../recentrequeststablemodel.cpp" line="+28"/> <source>Date</source> <translation type="unfinished">Date</translation> </message> @@ -2307,7 +2301,7 @@ Address: %4 <name>SendCoinsDialog</name> <message> <location filename="../forms/sendcoinsdialog.ui" line="+14"/> - <location filename="../sendcoinsdialog.cpp" line="+447"/> + <location filename="../sendcoinsdialog.cpp" line="+529"/> <source>Send Coins</source> <translation>Send Coins</translation> </message> @@ -2377,7 +2371,98 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+206"/> + <source>Transaction Fee:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+14"/> + <source>Choose...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>collapse fee-settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Minimize</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+78"/> + <source>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 "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>per kilobyte</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>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.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>total at least</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+30"/> + <location line="+13"/> + <source>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.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>(read the tooltip)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+29"/> + <source>Recommended:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+30"/> + <source>Custom:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+52"/> + <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+29"/> + <source>Confirmation time:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+60"/> + <source>normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>fast</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+38"/> + <source>Send as zero-fee transaction if possible</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>(confirmation may take longer)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+110"/> <source>Send to multiple recipients at once</source> <translation>Send to multiple recipients at once</translation> </message> @@ -2392,12 +2477,12 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="-274"/> + <location line="-858"/> <source>Dust:</source> <translation type="unfinished"></translation> </message> <message> - <location line="+277"/> + <location line="+861"/> <source>Clear &All</source> <translation>Clear &All</translation> </message> @@ -2417,12 +2502,12 @@ Address: %4 <translation>S&end</translation> </message> <message> - <location filename="../sendcoinsdialog.cpp" line="-215"/> + <location filename="../sendcoinsdialog.cpp" line="-221"/> <source>Confirm send coins</source> <translation>Confirm send coins</translation> </message> <message> - <location line="-74"/> + <location line="-77"/> <location line="+5"/> <location line="+5"/> <location line="+4"/> @@ -2430,7 +2515,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="-122"/> + <location line="-192"/> <source>Copy quantity</source> <translation type="unfinished"></translation> </message> @@ -2465,7 +2550,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+171"/> + <location line="+244"/> <source>Total Amount %1 (= %2)</source> <translation type="unfinished"></translation> </message> @@ -2475,7 +2560,7 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+189"/> + <location line="+192"/> <source>The recipient address is not valid, please recheck.</source> <translation>The recipient address is not valid, please recheck.</translation> </message> @@ -2510,7 +2595,22 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="+113"/> + <location line="+4"/> + <source>A fee higher than %1 is considered an insanely high fee.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> + <source>Pay only the minimum fee of %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+22"/> + <source>Estimated to begin confirmation within %1 block(s).</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+107"/> <source>Warning: Invalid Bitcoin address</source> <translation type="unfinished"></translation> </message> @@ -2525,12 +2625,12 @@ Address: %4 <translation type="unfinished"></translation> </message> <message> - <location line="-504"/> + <location line="-687"/> <source>Copy dust</source> <translation type="unfinished"></translation> </message> <message> - <location line="+151"/> + <location line="+221"/> <source>Are you sure you want to send?</source> <translation type="unfinished"></translation> </message> @@ -3087,7 +3187,7 @@ Address: %4 <context> <name>TransactionTableModel</name> <message> - <location filename="../transactiontablemodel.cpp" line="+235"/> + <location filename="../transactiontablemodel.cpp" line="+229"/> <source>Date</source> <translation>Date</translation> </message> @@ -3102,7 +3202,7 @@ Address: %4 <translation>Address</translation> </message> <message> - <location line="+76"/> + <location line="+79"/> <source>Immature (%1 confirmations, will be available after %2)</source> <translation type="unfinished"></translation> </message> @@ -3418,7 +3518,7 @@ Address: %4 <context> <name>WalletModel</name> <message> - <location filename="../walletmodel.cpp" line="+280"/> + <location filename="../walletmodel.cpp" line="+276"/> <source>Send Coins</source> <translation>Send Coins</translation> </message> @@ -3436,7 +3536,7 @@ Address: %4 <translation>Export the data in the current tab to a file</translation> </message> <message> - <location line="+184"/> + <location line="+187"/> <source>Backup Wallet</source> <translation>Backup Wallet</translation> </message> @@ -3469,27 +3569,27 @@ Address: %4 <context> <name>bitcoin-core</name> <message> - <location filename="../bitcoinstrings.cpp" line="+236"/> + <location filename="../bitcoinstrings.cpp" line="+239"/> <source>Options:</source> <translation>Options:</translation> </message> <message> - <location line="+30"/> + <location line="+31"/> <source>Specify data directory</source> <translation>Specify data directory</translation> </message> <message> - <location line="-90"/> + <location line="-91"/> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Connect to a node to retrieve peer addresses, and disconnect</translation> </message> <message> - <location line="+93"/> + <location line="+94"/> <source>Specify your own public address</source> <translation>Specify your own public address</translation> </message> <message> - <location line="-108"/> + <location line="-109"/> <source>Accept command line and JSON-RPC commands</source> <translation>Accept command line and JSON-RPC commands</translation> </message> @@ -3499,17 +3599,17 @@ Address: %4 <translation>Run in the background as a daemon and accept commands</translation> </message> <message> - <location line="+35"/> + <location line="+36"/> <source>Use the test network</source> <translation>Use the test network</translation> </message> <message> - <location line="-124"/> + <location line="-125"/> <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source> <translation>Accept connections from outside (default: 1 if no -proxy or -connect)</translation> </message> <message> - <location line="-150"/> + <location line="-153"/> <source>%s, you must set a rpcpassword in the configuration file: %s It is recommended you use the following random password: @@ -3544,7 +3644,12 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+3"/> + <source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation type="unfinished"></translation> </message> @@ -3569,7 +3674,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation type="unfinished"></translation> </message> <message> - <location line="+17"/> + <location line="+20"/> <source>Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)</source> <translation type="unfinished"></translation> </message> @@ -3744,7 +3849,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation>Rebuild block chain index from current blk000??.dat files</translation> </message> <message> - <location line="+10"/> + <location line="+11"/> <source>Set database cache size in megabytes (%d to %d, default: %d)</source> <translation type="unfinished"></translation> </message> @@ -3794,12 +3899,12 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation>You need to rebuild the database using -reindex to change -txindex</translation> </message> <message> - <location line="-91"/> + <location line="-92"/> <source>Imports blocks from external blk000??.dat file</source> <translation>Imports blocks from external blk000??.dat file</translation> </message> <message> - <location line="-179"/> + <location line="-182"/> <source>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</source> <translation type="unfinished"></translation> </message> @@ -3834,12 +3939,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+6"/> + <location line="+12"/> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> <translation type="unfinished"></translation> </message> @@ -3864,7 +3964,12 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation type="unfinished"></translation> </message> <message> - <location line="+23"/> + <location line="+19"/> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> <translation type="unfinished"></translation> </message> @@ -3874,7 +3979,12 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+5"/> + <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+6"/> <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> <translation type="unfinished"></translation> </message> @@ -4004,6 +4114,11 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation>Send trace/debug info to console instead of debug.log file</translation> </message> <message> + <location line="+1"/> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation type="unfinished"></translation> + </message> + <message> <location line="+9"/> <source>Show all debugging options (usage: --help -help-debug)</source> <translation type="unfinished"></translation> @@ -4094,27 +4209,27 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation>wallet.dat corrupt, salvage failed</translation> </message> <message> - <location line="-63"/> + <location line="-64"/> <source>Password for JSON-RPC connections</source> <translation>Password for JSON-RPC connections</translation> </message> <message> - <location line="-157"/> + <location line="-160"/> <source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source> <translation>Execute command when the best block changes (%s in cmd is replaced by block hash)</translation> </message> <message> - <location line="+202"/> + <location line="+206"/> <source>Upgrade wallet to latest format</source> <translation>Upgrade wallet to latest format</translation> </message> <message> - <location line="-34"/> + <location line="-35"/> <source>Rescan the block chain for missing wallet transactions</source> <translation>Rescan the block chain for missing wallet transactions</translation> </message> <message> - <location line="+35"/> + <location line="+36"/> <source>Use OpenSSL (https) for JSON-RPC connections</source> <translation>Use OpenSSL (https) for JSON-RPC connections</translation> </message> @@ -4124,7 +4239,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation>This help message</translation> </message> <message> - <location line="-107"/> + <location line="-108"/> <source>Allow DNS lookups for -addnode, -seednode and -connect</source> <translation>Allow DNS lookups for -addnode, -seednode and -connect</translation> </message> @@ -4139,7 +4254,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation>Error loading wallet.dat: Wallet corrupted</translation> </message> <message> - <location line="-167"/> + <location line="-170"/> <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> <translation type="unfinished"></translation> </message> @@ -4169,7 +4284,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+6"/> <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> <translation type="unfinished"></translation> </message> @@ -4179,12 +4294,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation type="unfinished"></translation> </message> <message> - <location line="+10"/> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: %d)</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+13"/> + <location line="+23"/> <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> <translation type="unfinished"></translation> </message> @@ -4299,7 +4409,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>Server certificate file (default: %s)</source> <translation type="unfinished"></translation> </message> @@ -4364,7 +4474,7 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation>Unknown network specified in -onlynet: '%s'</translation> </message> <message> - <location line="-111"/> + <location line="-112"/> <source>Cannot resolve -bind address: '%s'</source> <translation>Cannot resolve -bind address: '%s'</translation> </message> @@ -4424,12 +4534,12 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo. <translation>Done loading</translation> </message> <message> - <location line="+90"/> + <location line="+91"/> <source>To use the %s option</source> <translation>To use the %s option</translation> </message> <message> - <location line="-82"/> + <location line="-83"/> <source>Error</source> <translation>Error</translation> </message> diff --git a/src/qt/locale/bitcoin_eo.ts b/src/qt/locale/bitcoin_eo.ts index 652ee2d9bf..5189310e64 100644 --- a/src/qt/locale/bitcoin_eo.ts +++ b/src/qt/locale/bitcoin_eo.ts @@ -1,4 +1,4 @@ -<TS language="eo" version="2.1"> +<TS language="eo" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -371,10 +371,6 @@ <translation>Langeto-breto</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Kerno de Bitmono</translation> </message> @@ -410,10 +406,6 @@ <source>No block source available...</source> <translation>Neniu fonto de blokoj trovebla...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Traktis %1 blokoj de la transakcia historio.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n horo</numerusform><numerusform>%n horoj</numerusform></translation> @@ -545,10 +537,6 @@ Adreso: %4 <translation>Sumo</translation> </message> <message> - <source>Address</source> - <translation>Adreso</translation> - </message> - <message> <source>Date</source> <translation>Dato</translation> </message> @@ -856,15 +844,7 @@ Adreso: %4 <source>Error</source> <translation>Eraro</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB de libera loko disponebla</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(el %1GB bezonataj)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -899,14 +879,6 @@ Adreso: %4 <translation>Ĉ&efa</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Nedeviga krompago por ĉiu kB, kiu helpas plirapidigi la traktadon de via transakcio. Plej multaj transakcioj grandas je 1kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Krompago</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Aŭtomate lanĉi Bitmonon post ensaluto al la sistemo.</translation> </message> @@ -1034,10 +1006,6 @@ Adreso: %4 <translation>Eblas, ke la informoj videblaj ĉi tie estas eksdataj. Via monujo aŭtomate sinkoniĝas kun la bitmona reto kiam ili konektiĝas, sed tiu procezo ankoraŭ ne finfariĝis.</translation> </message> <message> - <source>Wallet</source> - <translation>Monujo</translation> - </message> - <message> <source>Your current spendable balance</source> <translation>via aktuala elspezebla saldo</translation> </message> @@ -1062,10 +1030,6 @@ Adreso: %4 <translation>via aktuala totala saldo</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Lastaj transakcioj</b></translation> - </message> - <message> <source>out of sync</source> <translation>nesinkronigita</translation> </message> @@ -2199,26 +2163,10 @@ Adreso: %4 <translation>Agordoj:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Specifi konfiguran dosieron (defaŭlte: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Specifi pid-dosieron (defaŭlte: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Specifi dosieron por datumoj</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Aŭskulti al <port> por konektoj (defaŭlte: 8333 aŭ testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Subteni maksimume <n> konektojn al samtavolanoj (defaŭlte: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Konekti al nodo por ricevi adresojn de samtavolanoj, kaj malkonekti</translation> </message> @@ -2227,18 +2175,6 @@ Adreso: %4 <translation>Specifi vian propran publikan adreson</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Sojlo por malkonekti misagantajn samtavolanojn (defaŭlte: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Nombro da sekundoj por rifuzi rekonekton de misagantaj samtavolanoj (defaŭlte: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Aŭskulti al <port> por JSON-RPC-konektoj (defaŭlte: 8332 aŭ testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Akcepti komandojn JSON-RPC kaj el komandlinio</translation> </message> @@ -2279,10 +2215,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Akcepteblaj ĉifroj (defaŭlte: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Bindi al donita adreso kaj ĉiam aŭskulti per ĝi. Uzu la formaton [gastigo]:pordo por IPv6</translation> </message> @@ -2375,62 +2307,10 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com <translation>Eraro: monujo ŝlosita, ne eblas krei transakcion!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Eraro: sistema eraro: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Ne sukcesis aŭskulti ajnan pordon. Uzu -listen=0 se tion vi volas.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Malsukcesis legi blokinformojn</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Malsukcesis legi blokon</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Malsukcesis sinkronigi blokindekson</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Malsukcesis skribi blokindekson</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Malsukcesis skribi blokinformojn</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Malsukcesis skribi blokon</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Malsukcesis skribi dosierinformojn</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Malsukcesis skribi Bitmon-datumbazon</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Malsukcesis skribi transakcian indekson</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Malsukcesis skribi malfarajn datumojn</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generi Bitmonon (defaŭlte: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Kiom da blokoj kontrolendas dum lanĉo (defaŭlte: 288, 0=ĉiuj)</translation> - </message> - <message> <source>Incorrect or no genesis block found. Wrong datadir for network?</source> <translation>Geneza bloko aŭ netrovita aŭ neĝusta. Ĉu eble la datadir de la reto malĝustas?</translation> </message> @@ -2447,10 +2327,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com <translation>Rekontrui blokĉenan indekson el la aktualaj blk000??.dat dosieroj</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Specifi la nombron de fadenoj por priatenti RPC-alvokojn (defaŭlte: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Specifi monujan dosieron (ene de dosierujo por datumoj)</translation> </message> @@ -2495,34 +2371,10 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com <translation>Nevalida sumo por -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Varti kompletan transakcian indekton (defaŭlte: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maksimuma po riceva bufro por konektoj, <n>*1000 bajtoj (defaŭlte: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maksimuma po senda bufro por konektoj, <n>*1000 bajtoj (defaŭlte: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Akcepti nur blokĉenon, kiu kongruas kun integritaj kontrolpunktoj (defaŭlte: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Konekti nur la nodoj en la reto <net> (IPv4, IPv6 aŭ Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Sendi spurajn/sencimigajn informojn al la konzolo anstataŭ al dosiero debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Agordi minimuman grandon de blokoj je bajtoj (defaŭlte: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Malpligrandigi la sencimigan protokol-dosieron kiam kliento lanĉiĝas (defaŭlte: 1 kiam mankas -debug)</translation> </message> @@ -2531,14 +2383,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com <translation>Subskriba transakcio fiaskis</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Specifi konektan tempolimon je milisekundoj (defaŭlte: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Sistema eraro: </translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Transakcia sumo tro malgranda</translation> </message> @@ -2551,10 +2395,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com <translation>Transakcio estas tro granda</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Uzi UPnP por mapi la aŭskultan pordon (defaŭlte: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Uzi UPnP por mapi la aŭskultan pordon (defaŭlte: 1 dum aŭskultado)</translation> </message> @@ -2587,10 +2427,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com <translation>Ĝisdatigi monujon al plej lasta formato</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Agordi la grandon de la ŝlosilo-vico al <n> (defaŭlte: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Reskani la blokĉenon por mankantaj monujaj transakcioj</translation> </message> @@ -2599,14 +2435,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com <translation>Uzi OpenSSL (https) por konektoj JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Dosiero de servila atestilo (defaŭlte: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Dosiero de servila privata ŝlosilo (defaŭlte: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Tiu ĉi helpmesaĝo</translation> </message> diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts index fad8c9bbe8..71f7e9f4c9 100644 --- a/src/qt/locale/bitcoin_es.ts +++ b/src/qt/locale/bitcoin_es.ts @@ -1,4 +1,4 @@ -<TS language="es" version="2.1"> +<TS language="es" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Barra de pestañas</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Ninguna fuente de bloques disponible ...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Procesados %1 bloques del historial de transacciones.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n hora</numerusform><numerusform>%n horas</numerusform></translation> @@ -486,6 +478,10 @@ <source>Up to date</source> <translation>Actualizado</translation> </message> + <message numerus="yes"> + <source>Processed %n blocks of transaction history.</source> + <translation><numerusform>%n bloques procesados del historial de transacciones</numerusform><numerusform>Procesados %n bloques del historial de transacciones</numerusform></translation> + </message> <message> <source>Catching up...</source> <translation>Actualizando...</translation> @@ -529,10 +525,6 @@ Dirección: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Selección de direcciones bajo Coin Control</translation> - </message> - <message> <source>Quantity:</source> <translation>Cantidad:</translation> </message> @@ -581,10 +573,6 @@ Dirección: %4 <translation>Cantidad</translation> </message> <message> - <source>Address</source> - <translation>Dirección</translation> - </message> - <message> <source>Date</source> <translation>Fecha</translation> </message> @@ -916,13 +904,13 @@ Dirección: %4 <source>Error</source> <translation>Error</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB de espacio libre disponible</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB de espacio libre</numerusform><numerusform>%n GB de espacio disponible</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(de los %1GB necesarios)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(de %n GB necesitados)</numerusform><numerusform>(de %n GB requeridos)</numerusform></translation> </message> </context> <context> @@ -959,14 +947,6 @@ Dirección: %4 <translation>&Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Comisión de transacción opcional por kB que ayuda a asegurar que sus transacciones sean procesadas rápidamente. La mayoría de transacciones son de 1kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Pagar comisión de &transacción</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Iniciar Bitcoin automáticamente al encender el sistema.</translation> </message> @@ -995,14 +975,6 @@ Dirección: %4 <translation>Aceptar conexiones entrantes</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Conectarse a la red Bitcoin a través de un proxy SOCKS.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Conectarse a través de proxy SOCKS (proxy predeterminado):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Dirección IP del proxy (p. ej. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1166,10 +1138,6 @@ Dirección: %4 <translation>La información mostrada puede estar desactualizada. Su monedero se sincroniza automáticamente con la red Bitcoin después de que se haya establecido una conexión, pero este proceso aún no se ha completado.</translation> </message> <message> - <source>Wallet</source> - <translation>Monedero</translation> - </message> - <message> <source>Watch-only:</source> <translation>De observación:</translation> </message> @@ -1198,6 +1166,10 @@ Dirección: %4 <translation>Saldo recién minado que aún no ha madurado.</translation> </message> <message> + <source>Balances</source> + <translation>Saldos</translation> + </message> + <message> <source>Total:</source> <translation>Total:</translation> </message> @@ -1210,6 +1182,14 @@ Dirección: %4 <translation>Su saldo actual en direcciones watch-only</translation> </message> <message> + <source>Spendable:</source> + <translation>Gastable:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Transacciones recientes</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>Transacciones sin confirmar en direcciones watch-only</translation> </message> @@ -1222,10 +1202,6 @@ Dirección: %4 <translation>Saldo total en las direcciones watch-only</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transacciones recientes</b></translation> - </message> - <message> <source>out of sync</source> <translation>desincronizado</translation> </message> @@ -1485,10 +1461,6 @@ Dirección: %4 <translation>Servicios</translation> </message> <message> - <source>Sync Node</source> - <translation>Sincronizar Nodo</translation> - </message> - <message> <source>Starting Height</source> <translation>Altura de comienzo</translation> </message> @@ -1617,14 +1589,6 @@ Dirección: %4 <translation>Saliente</translation> </message> <message> - <source>Yes</source> - <translation>Sí</translation> - </message> - <message> - <source>No</source> - <translation>No</translation> - </message> - <message> <source>Unknown</source> <translation>Desconocido</translation> </message> @@ -2473,6 +2437,10 @@ Dirección: %4 <translation>Minado</translation> </message> <message> + <source>watch-only</source> + <translation>de observación</translation> + </message> + <message> <source>(n/a)</source> <translation>(nd)</translation> </message> @@ -2489,6 +2457,10 @@ Dirección: %4 <translation>Tipo de transacción.</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Sea o no una dirección sólo está involucrada en esta transacción.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>Dirección de destino de la transacción.</translation> </message> @@ -2584,6 +2556,10 @@ Dirección: %4 <translation>Exportar historial de transacciones</translation> </message> <message> + <source>Watch-only</source> + <translation>De observación</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Error exportando</translation> </message> @@ -2700,28 +2676,10 @@ Dirección: %4 </translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especificar archivo de configuración (predeterminado: bitcoin.conf) -</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especificar archivo pid (predeterminado: bitcoin.pid) -</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especificar directorio para los datos</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Escuchar conexiones en <puerto> (predeterminado: 8333 o testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Mantener como máximo <n> conexiones a pares (predeterminado: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Conectar a un nodo para obtener direcciones de pares y desconectar</translation> </message> @@ -2730,18 +2688,6 @@ Dirección: %4 <translation>Especifique su propia dirección pública</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Umbral para la desconexión de pares con mal comportamiento (predeterminado: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Número de segundos en que se evita la reconexión de pares con mal comportamiento (predeterminado: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escuchar conexiones JSON-RPC en <puerto> (predeterminado: 8332 o testnet:18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Aceptar comandos consola y JSON-RPC </translation> @@ -2785,16 +2731,12 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Cifrados aceptables (predeterminados: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Vincular a la dirección dada y escuchar siempre en ella. Utilice la notación [host]:port para IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Limitar continuamente las transacciones gratuitas a <n>*1000 bytes por minuto (predeterminado:15)</translation> + <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> + <translation>Borrar todas las transacciones del monedero y sólo recuperar aquellas partes de la cadena de bloques por medio de -rescan on startup.</translation> </message> <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> @@ -2813,14 +2755,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ejecutar comando cuando una transacción del monedero cambia (%s en cmd se remplazará por TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Volcar la actividad de la base de datos de memoria al registro en disco cada <n> megabytes (predeterminado: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Nivel de rigor en la verificación de bloques de -checkblocks (0-4; predeterminado: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>En este modo -genproclimit controla cuántos bloques se generan de inmediato.</translation> </message> @@ -2829,10 +2763,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Establecer el número de hilos (threads) de verificación de scripts (entre %u y %d, 0 = automático, <0 = dejar libres ese número de núcleos; predeterminado: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Establecer el límite de procesadores cuando está activada la generación (-1 = sin límite; predeterminado: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Esta es una versión de pre-prueba - utilícela bajo su propio riesgo. No la utilice para usos comerciales o de minería.</translation> </message> @@ -2841,10 +2771,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No se ha podido acceder a %s en esta máquina. Probablemente ya se está ejecutando Bitcoin Core.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Usar proxy SOCKS5 distinto para comunicarse vía Tor de forma anónima (Predeterminado: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Aviso: ¡-paytxfee tiene un valor muy alto! Esta es la comisión que pagará si envía una transacción.</translation> </message> @@ -2865,12 +2791,12 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Aviso: ¡Recuperados datos de wallet.dat corrupto! El wallet.dat original se ha guardado como wallet.{timestamp}.bak en %s; si hubiera errores en su saldo o transacciones, deberá restaurar una copia de seguridad.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(predeterminado: 1)</translation> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Poner en lista blanca a los equipos que se conecten desde la máscara de subred o dirección IP especificada. Se puede especificar múltiples veces.</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(predeterminado: wallet.dat)</translation> + <source>(default: 1)</source> + <translation>(predeterminado: 1)</translation> </message> <message> <source><category> can be:</source> @@ -2901,10 +2827,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Opciones de depuración/pruebas:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Inhabilitar el modo seguro, no considerar un suceso real de modo seguro (predeterminado: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Descubrir dirección IP propia (predeterminado: 1 al escuchar sin -externalip)</translation> </message> @@ -2933,6 +2855,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Error al abrir base de datos de bloques.</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Error: un error grave interno ocurrió, sea debug.log para más detalles.</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Error: ¡Espacio en disco bajo!</translation> </message> @@ -2941,66 +2867,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Error: ¡El monedero está bloqueado; no se puede crear la transacción!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Error: error de sistema: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Ha fallado la escucha en todos los puertos. Use -listen=0 si desea esto.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>No se ha podido leer la información de bloque</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>No se ha podido leer el bloque</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>No se ha podido sincronizar el índice de bloques</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>No se ha podido escribir en el índice de bloques</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>No se ha podido escribir la información de bloques</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>No se ha podido escribir el bloque</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>No se ha podido escribir la información de archivo</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>No se ha podido escribir en la base de datos de bitcoins</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>No se ha podido escribir en el índice de transacciones</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>No se han podido escribir los datos de deshacer</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Forzar modo seguro (predeterminado: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generar bitcoins (predeterminado: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Cuántos bloques comprobar al iniciar (predeterminado: 288, 0 = todos)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Si no se proporciona <category>, mostrar toda la depuración</translation> </message> @@ -3021,8 +2891,8 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No hay suficientes descriptores de archivo disponibles. </translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Anteponer marca temporal a la información de depuración (predeterminado: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Sólo conectar a nodos en redes <net> (ipv4, ipv6 o onion)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3037,22 +2907,18 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Establecer tamaño máximo de bloque en bytes (predeterminado: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Establecer el número de procesos para atender las llamadas RPC (predeterminado: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Especificar archivo de monedero (dentro del directorio de datos)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Gastar cambio no confirmado al enviar transacciones (predeterminado: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Esto afecta a las herramientas de prueba de regresión y al desarrollo informático de la aplicación.</translation> </message> <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Usar UPnP para asignar el puerto de escucha (predeterminado:: %u)</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Verificando bloques...</translation> </message> @@ -3077,16 +2943,56 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Importa los bloques desde un archivo blk000??.dat externo</translation> </message> <message> + <source>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</source> + <translation>Permitir conexiones JSON-RPC de origen especificado. Válido para son una sola IP (por ejemplo 1.2.3.4), una red/máscara de red (por ejemplo 1.2.3.4/255.255.255.0) o una red/CIDR (e.g. 1.2.3.4/24). Esta opción se puede especificar varias veces</translation> + </message> + <message> + <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source> + <translation>Ocurrió un error al configurar la dirección de RPC %s puerto %u para escuchar en: %s</translation> + </message> + <message> + <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source> + <translation>Ligar a las direcciones especificadas y poner en lista blanca a los equipos conectados a ellas. Usar la notación para IPv6 [host]:puerto.</translation> + </message> + <message> + <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source> + <translation>Ligar a las direcciones especificadas para escuchar por conexiones JSON-RPC. Usar la notación para IPv6 [host]:puerto. Esta opción se puede especificar múltiples veces (por defecto: ligar a todas las interfaces)</translation> + </message> + <message> <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source> <translation>No se ha podido bloquear el directorio de datos %s. Probablemente ya se está ejecutando Bitcoin Core.</translation> </message> <message> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Limitar continuamente las transacciones gratuitas a <n>*1000 bytes por minuto (predeterminado:%u)</translation> + </message> + <message> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Crear nuevos archivos con permisos por defecto del sistema, en lugar de umask 077 (sólo efectivo con la funcionalidad de monedero desactivada)</translation> + </message> + <message> + <source>Error: Listening for incoming connections failed (listen returned error %s)</source> + <translation>Error: la escucha para conexiones entrantes falló (la escucha regresó el error %s)</translation> + </message> + <message> + <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source> + <translation>Error: Unsupported argumento -socks encontrados. SOCKS versión ajuste ya no es posible, sólo SOCKS5 proxies son compatibles.</translation> + </message> + <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Ejecutar un comando cuando se reciba una alerta importante o cuando veamos un fork demasiado largo (%s en cmd se reemplazará por el mensaje)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Mostrar información de depuración (predeterminado: 0, proporcionar <category> es opcional)</translation> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source> + <translation>Tarifas (en BTC/Kb) más pequeños que esto se consideran cero cuota de reinstalación (por defecto: %s)</translation> + </message> + <message> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source> + <translation>Tarifas (en BTC/Kb) más pequeños que esto se consideran cero cuota para la creación de la transacción (por defecto: %s)</translation> + </message> + <message> + <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> + <translation>Consulta de direcciones pares mediante búsqueda de DNS, si bajo en direcciones (por defecto: 1 a menos que - conectar)</translation> </message> <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> @@ -3101,6 +3007,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Aviso: ¡Comprueba la fecha y hora de tu ordenador y verifica si es correcta! Si no es correcta Bitcoin Core no funcionará adecuadamente.</translation> </message> <message> + <source>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</source> + <translation>A los equipos en lista blanca no se les pueden prohibir los ataques DoS y sus transacciones siempre son retransmitidas, incluso si ya están en el mempool, es útil por ejemplo para un gateway.</translation> + </message> + <message> <source>Connect through SOCKS5 proxy</source> <translation>Conectar usando SOCKS5 proxy</translation> </message> @@ -3109,10 +3019,22 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Copyright (C) 2009-%i The Bitcoin Core Developers</translation> </message> <message> + <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source> + <translation>Error al cargar wallet.dat: El monedero requiere una versión más reciente de Bitcoin Core</translation> + </message> + <message> + <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source> + <translation>Cuota (in BTC/kB) para añadir a las transacciones que envíes (por defecto: %s)</translation> + </message> + <message> <source>Information</source> <translation>Información</translation> </message> <message> + <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source> + <translation>La inicialización de la verificación de validez falló. Se está apagando Bitcoin Core.</translation> + </message> + <message> <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> <translation>Cantidad inválida para -minrelaytxfee=<amount>: '%s'</translation> </message> @@ -3121,42 +3043,34 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Cantidad inválida para -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Limitar tamaño de la cache de firmas a <n> entradas (predeterminado: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Registrar en el log la prioridad de transacciones y la comisión por kB al minar bloques (predeterminado: 0)</translation> + <source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source> + <translation>Cantidad inválida para -paytxfee=<amount>: '%s' (debe ser por lo menos %s)</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Mantener índice de transacciones completo (predeterminado: 0)</translation> + <source>Invalid netmask specified in -whitelist: '%s'</source> + <translation>Máscara de red inválida especificada en -whitelist: '%s'</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Búfer de recepción máximo por conexión, <n>*1000 bytes (predeterminado: 5000)</translation> + <source>Keep at most <n> unconnectable blocks in memory (default: %u)</source> + <translation>Mantener como máximo <n> bloques no conectables en memoria (por defecto: %u)</translation> </message> <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Búfer de recepción máximo por conexión, , <n>*1000 bytes (predeterminado: 1000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Mantener como máximo <n> transacciones no conectables en memoria (por defecto: %u)</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Aceptar solamente cadena de bloques que concuerde con los puntos de control internos (predeterminado: 1)</translation> + <source>Need to specify a port with -whitebind: '%s'</source> + <translation>Necesita especificar un puerto con -whitebind: '%s'</translation> </message> <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Conectarse solo a nodos de la red <net> (IPv4, IPv6 o Tor)</translation> + <source>Node relay options:</source> + <translation>Opciones de nodos de retransmisión:</translation> </message> <message> <source>Print block on startup, if found in block index</source> <translation>Imprimir bloque al iniciar, si se encuentra en el índice de bloques</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Imprimir árbol de bloques al iniciar (predeterminado: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Opciones SSL de RPC: (véase la wiki de Bitcoin para las instrucciones de instalación de SSL)</translation> </message> @@ -3173,22 +3087,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Introducir datos fuzz en 1 de cada <n> mensajes de red al azar</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Ejecutar un hilo (thread) para limpiar de la memoria el monedero periódicamente (predeterminado: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Enviar información de trazas/depuración a la consola en lugar de al archivo debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Establecer tamaño mínimo de bloque en bytes (predeterminado: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Establece la opción DB_PRIVATE en el entorno de base de datos del monedero (predeterminado: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Muestra todas las opciones de depuración (uso: --help -help-debug)</translation> </message> @@ -3201,14 +3103,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Transacción falló</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especificar el tiempo máximo de conexión en milisegundos (predeterminado: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Error de sistema: </translation> - </message> - <message> <source>This is experimental software.</source> <translation>Este software es experimental.</translation> </message> @@ -3225,8 +3119,8 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Transacción demasiado grande</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Usar UPnP para asignar el puerto de escucha (predeterminado: 0)</translation> + <source>Unable to bind to %s on this computer (bind returned error %s)</source> + <translation>No es posible conectar con %s en este sistema (bind ha dado el error %s)</translation> </message> <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> @@ -3238,6 +3132,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>Monedero es necesario volver a escribir: reiniciar Bitcoin Core para completar</translation> + </message> + <message> <source>Warning</source> <translation>Aviso</translation> </message> @@ -3246,6 +3144,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Aviso: Esta versión es obsoleta, actualización necesaria!</translation> </message> <message> + <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source> + <translation>Aviso: Argumento no sportado -debugnet anticuado, utilice -debug=net.</translation> + </message> + <message> <source>Zapping all transactions from wallet...</source> <translation>Eliminando todas las transacciones del monedero...</translation> </message> @@ -3271,11 +3173,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Actualizar el monedero al último formato</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Ajustar el número de claves en reserva <n> (predeterminado: 100) -</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Volver a examinar la cadena de bloques en busca de transacciones del monedero perdidas</translation> </message> @@ -3285,16 +3182,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Certificado del servidor (predeterminado: server.cert) -</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clave privada del servidor (predeterminado: server.pem) -</translation> - </message> - <message> <source>This help message</source> <translation>Este mensaje de ayuda </translation> @@ -3312,14 +3199,166 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Error al cargar wallet.dat: el monedero está dañado</translation> </message> <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Volcar la actividad de la base de datos de memoria al registro en disco cada <n> megabytes (predeterminado: %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>Nivel de rigor en la verificación de bloques de -checkblocks (0-4; predeterminado: %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Registrar prioridad de las transacciones y cuota por kB cuando se minen bloques (por defecto: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Mantener el índice completo de transacciones, usado por la llamada rpc de getrawtransaction (por defecto: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Número de segundos en que se evita la reconexión de pares con mal comportamiento (predeterminado: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Mostrar depuración (por defecto: %u, proporcionar <category> es opcional)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Usar distintos proxys SOCKS5 para comunicarse vía Tor de forma anónima (Por defecto: %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(predeterminado: %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Aceptar cifrado (por defecto: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Siempre consultar direcciones de otros equipos por medio de DNS lookup (por defecto: %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Inhabilitar el modo seguro, no considerar un suceso real de modo seguro (predeterminado: %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>Error al cargar wallet.dat</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Forzar modo seguro (por defecto: %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Generar monedas (por defecto: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Cuántos bloques comprobar al iniciar (predeterminado: %u, 0 = todos)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Incluir direcciones IP en la salida de depuración (por defecto: %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Dirección -proxy inválida: '%s'</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>Limitar tamaño de la cache de firmas a <n> entradas (predeterminado: %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>Escuchar conexiones JSON-RPC en <puerto> (predeterminado: %u o testnet: %u)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Escuchar conexiones en <puerto> (predeterminado: %u o testnet: %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Mantener como máximo <n> conexiones a pares (predeterminado: %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Búfer de recepción máximo por conexión, <n>*1000 bytes (por defecto: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Búfer de recepción máximo por conexión, , <n>*1000 bytes (por defecto: %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>Aceptar solamente cadena de bloques que concuerde con los puntos de control internos (predeterminado: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Anteponer marca temporal a la información de depuración (por defecto: %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Imprimir árbol de bloques al iniciar (predeterminado: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Retransmitir y minar transacciones de transporte de datos (por defecto: %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Ejecutar un hilo para limpiar de la memoria el monedero periódicamente (predeterminado: %u)</translation> + </message> + <message> + <source>Server certificate file (default: %s)</source> + <translation>Archivo de certificado del servidor (por defecto: %s)</translation> + </message> + <message> + <source>Server private key (default: %s)</source> + <translation>Llave privada del servidor (por defecto: %s)</translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Ajustar el número de claves en reserva <n> (predeterminado: %u)</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Establecer tamaño mínimo de bloque en bytes (por defecto: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Establecer el número de procesos para llamadas del servicio RPC (por defecto: %d)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>Establece la opción DB_PRIVATE en el entorno de base de datos del monedero (predeterminado: %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Especificar archivo de configuración (por defecto: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Especificar tiempo de espera de la conexión (mínimo: 1, por defecto: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Especificar archivo pid (predeterminado: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Gastar cambio no confirmado al enviar transacciones (predeterminado: %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Detener después de importar los bloques del disco (por defecto: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Umbral para la desconexión de pares con mal comportamiento (predeterminado: %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>La red especificada en -onlynet '%s' es desconocida</translation> </message> @@ -3369,7 +3408,7 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </message> <message> <source>Done loading</source> - <translation>Generado pero no aceptado</translation> + <translation>Se terminó de cargar</translation> </message> <message> <source>To use the %s option</source> diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts index b22ad3fb8e..e6f81e650f 100644 --- a/src/qt/locale/bitcoin_es_CL.ts +++ b/src/qt/locale/bitcoin_es_CL.ts @@ -1,4 +1,4 @@ -<TS language="es_CL" version="2.1"> +<TS language="es_CL" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -274,10 +274,6 @@ <source>Tabs toolbar</source> <translation>Barra de pestañas</translation> </message> - <message> - <source>[testnet]</source> - <translation>[red-de-pruebas]</translation> - </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n conexión activa hacia la red Bitcoin</numerusform><numerusform>%n conexiones activas hacia la red Bitcoin</numerusform></translation> @@ -360,10 +356,6 @@ Dirección: %4</translation> <translation>Cantidad</translation> </message> <message> - <source>Address</source> - <translation>Dirección</translation> - </message> - <message> <source>Date</source> <translation>Fecha</translation> </message> @@ -483,10 +475,6 @@ Dirección: %4</translation> <translation>&Principal</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>Comisión de &transacciónes</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Inicia Bitcoin automáticamente despues de encender el computador</translation> </message> @@ -574,18 +562,10 @@ Dirección: %4</translation> <translation>Formulario</translation> </message> <message> - <source>Wallet</source> - <translation>Cartera</translation> - </message> - <message> <source>Total:</source> <translation>Total:</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transacciones recientes</b></translation> - </message> - <message> <source>out of sync</source> <translation>desincronizado</translation> </message> @@ -1280,37 +1260,11 @@ Dirección: %4</translation> </translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especifica archivo de configuración (predeterminado: bitcoin.conf) -</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especifica archivo pid (predeterminado: bitcoin.pid) -</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especifica directorio para los datos </translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Escuchar por conecciones en <puerto> (Por defecto: 8333 o red de prueba: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Mantener al menos <n> conecciones por cliente (por defecto: 125) </translation> - </message> - <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Umbral de desconección de clientes con mal comportamiento (por defecto: 100)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escucha conexiones JSON-RPC en el puerto <port> (predeterminado: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Aceptar comandos consola y JSON-RPC </translation> @@ -1343,34 +1297,6 @@ Dirección: %4</translation> <translation>Atención: Poco espacio en el disco duro</translation> </message> <message> - <source>Error: system error: </source> - <translation>Error: error de sistema:</translation> - </message> - <message> - <source>Failed to read block info</source> - <translation>Falló la lectura de la información del bloque</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Falló la lectura del bloque</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Falló sincronización del índice del bloque</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Falló la escritura del bloque del índice</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Falló la escritura de la información del bloque</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Falló la escritura del bloque</translation> - </message> - <message> <source>Imports blocks from external blk000??.dat file</source> <translation>Importar bloques desde el archivo externo blk000??.dat </translation> </message> @@ -1383,22 +1309,6 @@ Dirección: %4</translation> <translation>Enviar informacion de seguimiento a la consola en vez del archivo debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Establezca el tamaño mínimo del bloque en bytes (por defecto: 0)</translation> - </message> - <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especifica tiempo de espera para conexion en milisegundos (predeterminado: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Error de sistema:</translation> - </message> - <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Intenta usar UPnP para mapear el puerto de escucha (default: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Intenta usar UPnP para mapear el puerto de escucha (default: 1 when listening)</translation> </message> @@ -1429,11 +1339,6 @@ Dirección: %4</translation> <translation>Actualizar billetera al formato actual</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Ajusta el numero de claves en reserva <n> (predeterminado: 100) -</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Rescanea la cadena de bloques para transacciones perdidas de la cartera </translation> @@ -1444,16 +1349,6 @@ Dirección: %4</translation> </translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Certificado del servidor (Predeterminado: server.cert) -</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clave privada del servidor (Predeterminado: server.pem) -</translation> - </message> - <message> <source>This help message</source> <translation>Este mensaje de ayuda </translation> diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts index a9cfe90895..2e5daf4cdb 100644 --- a/src/qt/locale/bitcoin_es_DO.ts +++ b/src/qt/locale/bitcoin_es_DO.ts @@ -1,4 +1,4 @@ -<TS language="es_DO" version="2.1"> +<TS language="es_DO" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -375,10 +375,6 @@ <translation>Barra de pestañas</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Núcleo de Bitcoin</translation> </message> @@ -411,10 +407,6 @@ <translation>Ninguna fuente de bloques disponible ...</translation> </message> <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Procesados %1 bloques del historial de transacciones.</translation> - </message> - <message> <source>%1 behind</source> <translation>%1 atrás</translation> </message> @@ -485,10 +477,6 @@ Dirección: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Selección de la dirección de control de la moneda</translation> - </message> - <message> <source>Quantity:</source> <translation>Cantidad:</translation> </message> @@ -533,10 +521,6 @@ Dirección: %4 <translation>Cantidad</translation> </message> <message> - <source>Address</source> - <translation>Dirección</translation> - </message> - <message> <source>Date</source> <translation>Fecha</translation> </message> @@ -848,15 +832,7 @@ Dirección: %4 <source>Error</source> <translation>Error</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB de espacio libre disponible</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(de los %1GB necesarios)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -891,14 +867,6 @@ Dirección: %4 <translation>&Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Tarifa de transacción opcional por kB que ayuda a asegurar que sus transacciones sean procesadas rápidamente. La mayoría de transacciones son de 1kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Comisión de &transacciones</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Iniciar Bitcoin automáticamente al encender el sistema.</translation> </message> @@ -911,10 +879,6 @@ Dirección: %4 <translation>MB</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Conéctese a la red Bitcoin través de un proxy SOCKS.</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Dirección IP del proxy (ej. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1042,10 +1006,6 @@ Dirección: %4 <translation>La información mostrada puede estar desactualizada. Su monedero se sincroniza automáticamente con la red Bitcoin después de que se haya establecido una conexión, pero este proceso aún no se ha completado.</translation> </message> <message> - <source>Wallet</source> - <translation>Monedero</translation> - </message> - <message> <source>Your current spendable balance</source> <translation>Su balance actual gastable</translation> </message> @@ -1070,10 +1030,6 @@ Dirección: %4 <translation>Su balance actual total</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Movimientos recientes</b></translation> - </message> - <message> <source>out of sync</source> <translation>desincronizado</translation> </message> @@ -2244,28 +2200,10 @@ Dirección: %4 </translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especificar archivo de configuración (predeterminado: bitcoin.conf) -</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especificar archivo pid (predeterminado: bitcoin.pid) -</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especificar directorio para los datos</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Escuchar conexiones en <puerto> (predeterminado: 8333 o testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Mantener como máximo <n> conexiones a pares (predeterminado: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Conectar a un nodo para obtener direcciones de pares y desconectar</translation> </message> @@ -2274,18 +2212,6 @@ Dirección: %4 <translation>Especifique su propia dirección pública</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Umbral para la desconexión de pares con mal comportamiento (predeterminado: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Número de segundos en que se evita la reconexión de pares con mal comportamiento (predeterminado: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escuchar conexiones JSON-RPC en <puerto> (predeterminado: 8332 o testnet:18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Aceptar comandos consola y JSON-RPC </translation> @@ -2329,10 +2255,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Cifradores aceptables (por defecto: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Vincular a la dirección dada y escuchar siempre en ella. Utilice la notación [host]:port para IPv6</translation> </message> @@ -2353,10 +2275,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Esta es una versión de pre-prueba - utilícela bajo su propio riesgo. No la utilice para usos comerciales o de minería.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Usar distintos proxys SOCKS5 para comunicarse vía Tor de forma anónima (Por defecto: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Aviso: ¡-paytxfee tiene un valor muy alto! Esta es la comisión que pagará si envía una transacción.</translation> </message> @@ -2429,62 +2347,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Error: ¡El monedero está bloqueado; no se puede crear la transacción!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Error: error de sistema: </translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Ha fallado la escucha en todos los puertos. Use -listen=0 si desea esto.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>No se ha podido leer la información de bloque</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>No se ha podido leer el bloque</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>No se ha podido sincronizar el índice de bloques</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>No se ha podido escribir en el índice de bloques</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>No se ha podido escribir la información de bloques</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>No se ha podido escribir el bloque</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>No se ha podido escribir la información de archivo</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>No se ha podido escribir en la base de datos de monedas</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>No se ha podido escribir en el índice de transacciones</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>No se han podido escribir los datos de deshacer</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generar monedas (por defecto: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Cuántos bloques comprobar al iniciar (predeterminado: 288, 0 = todos)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Si no se proporciona <category>, mostrar toda la depuración</translation> </message> @@ -2501,10 +2367,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>No hay suficientes descriptores de archivo disponibles. </translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Anteponer marca temporal a la información de depuración (por defecto: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Reconstruir el índice de la cadena de bloques a partir de los archivos blk000??.dat actuales</translation> </message> @@ -2513,10 +2375,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Establecer tamaño máximo de bloque en bytes (por defecto: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Establecer el número de hilos para atender las llamadas RPC (predeterminado: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Especificar archivo de monedero (dentro del directorio de datos)</translation> </message> @@ -2545,10 +2403,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ejecutar un comando cuando se reciba una alerta importante o cuando veamos un fork demasiado largo (%s en cmd se reemplazará por el mensaje)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Mostrar depuración (por defecto: 0, proporcionar <category> es opcional)</translation> - </message> - <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>Establecer tamaño máximo de las transacciones de alta prioridad/comisión baja en bytes (por defecto: %d)</translation> </message> @@ -2565,34 +2419,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Inválido por el monto -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Mantener índice de transacciones completo (predeterminado: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Búfer de recepción máximo por conexión, <n>*1000 bytes (predeterminado: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Búfer de recepción máximo por conexión, , <n>*1000 bytes (predeterminado: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Aceptar solamente cadena de bloques que concuerde con los puntos de control internos (predeterminado: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Conectarse solo a nodos de la red <net> (IPv4, IPv6 o Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Enviar información de trazas/depuración a la consola en lugar de al archivo debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Establecer tamaño mínimo de bloque en bytes (predeterminado: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Reducir el archivo debug.log al iniciar el cliente (predeterminado: 1 sin -debug)</translation> </message> @@ -2601,14 +2431,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Transacción falló</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especificar el tiempo máximo de conexión en milisegundos (predeterminado: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Error de sistema: </translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Monto de la transacción muy pequeño</translation> </message> @@ -2621,10 +2443,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Transacción demasiado grande</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Usar UPnP para asignar el puerto de escucha (predeterminado: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Usar UPnP para asignar el puerto de escucha (predeterminado: 1 al escuchar)</translation> </message> @@ -2659,11 +2477,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Actualizar el monedero al último formato</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Ajustar el número de claves en reserva <n> (predeterminado: 100) -</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Volver a examinar la cadena de bloques en busca de transacciones del monedero perdidas</translation> </message> @@ -2673,16 +2486,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Certificado del servidor (predeterminado: server.cert) -</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clave privada del servidor (predeterminado: server.pem) -</translation> - </message> - <message> <source>This help message</source> <translation>Este mensaje de ayuda </translation> diff --git a/src/qt/locale/bitcoin_es_MX.ts b/src/qt/locale/bitcoin_es_MX.ts index c89ac5c6ef..bedc5d243e 100644 --- a/src/qt/locale/bitcoin_es_MX.ts +++ b/src/qt/locale/bitcoin_es_MX.ts @@ -1,4 +1,4 @@ -<TS language="es_MX" version="2.1"> +<TS language="es_MX" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -397,10 +397,6 @@ <translation>Monto</translation> </message> <message> - <source>Address</source> - <translation>Domicilio</translation> - </message> - <message> <source>Date</source> <translation>Fecha</translation> </message> @@ -569,10 +565,6 @@ <source>Form</source> <translation>Formulario</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Transacciones recientes</b></translation> - </message> </context> <context> <name>PaymentServer</name> diff --git a/src/qt/locale/bitcoin_es_UY.ts b/src/qt/locale/bitcoin_es_UY.ts index 321e5312ad..a5a1583b19 100644 --- a/src/qt/locale/bitcoin_es_UY.ts +++ b/src/qt/locale/bitcoin_es_UY.ts @@ -1,4 +1,4 @@ -<TS language="es_UY" version="2.1"> +<TS language="es_UY" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -162,10 +162,6 @@ <source>Tabs toolbar</source> <translation>Barra de herramientas</translation> </message> - <message> - <source>[testnet]</source> - <translation>[prueba_de_red]</translation> - </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n conexión activa a la red Bitcoin </numerusform><numerusform>%n conexiones activas a la red Bitcoin</numerusform></translation> @@ -201,10 +197,6 @@ <context> <name>CoinControlDialog</name> <message> - <source>Address</source> - <translation>Direccion </translation> - </message> - <message> <source>Date</source> <translation>Fecha</translation> </message> @@ -277,10 +269,6 @@ <source>Form</source> <translation>Formulario</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Transacciones recientes</b></translation> - </message> </context> <context> <name>PaymentServer</name> diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts index cd3a39b6b9..801fcf6258 100644 --- a/src/qt/locale/bitcoin_et.ts +++ b/src/qt/locale/bitcoin_et.ts @@ -1,4 +1,4 @@ -<TS language="et" version="2.1"> +<TS language="et" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -311,10 +311,6 @@ <translation>Vahelehe tööriistariba</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoini tuumik</translation> </message> @@ -322,10 +318,6 @@ <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n aktiivne ühendus Bitcoini võrku</numerusform><numerusform>%n aktiivset ühendust Bitcoini võrku</numerusform></translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Protsessitud %1 tehingute ajaloo blokki.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n tund</numerusform><numerusform>%n tundi</numerusform></translation> @@ -416,10 +408,6 @@ Aadress: %4⏎</translation> <translation>Kogus</translation> </message> <message> - <source>Address</source> - <translation>Aadress</translation> - </message> - <message> <source>Date</source> <translation>Kuupäev</translation> </message> @@ -558,10 +546,6 @@ Aadress: %4⏎</translation> <translation>Valikud</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>Tasu tehingu &fee</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Käivita Bitcoin süsteemi logimisel.</translation> </message> @@ -673,10 +657,6 @@ Aadress: %4⏎</translation> <translation>Kuvatav info ei pruugi olla ajakohane. Ühenduse loomisel süngitakse sinu rahakott automaatselt Bitconi võrgustikuga, kuid see toiming on hetkel lõpetamata.</translation> </message> <message> - <source>Wallet</source> - <translation>Rahakott</translation> - </message> - <message> <source>Immature:</source> <translation>Ebaküps:</translation> </message> @@ -685,10 +665,6 @@ Aadress: %4⏎</translation> <translation>Mitte aegunud mine'itud jääk</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Uuesti saadetud tehingud</b></translation> - </message> - <message> <source>out of sync</source> <translation>sünkimata</translation> </message> @@ -1494,26 +1470,10 @@ Aadress: %4⏎</translation> <translation>Valikud:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Täpsusta sätete fail (vaikimisi: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Täpsusta PID fail (vaikimisi: bitcoin.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Täpsusta andmekataloog</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Kuula ühendusi pordil <port> (vaikeväärtus: 8333 või testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Säilita vähemalt <n> ühendust peeridega (vaikeväärtus: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Peeri aadressi saamiseks ühendu korraks node'iga</translation> </message> @@ -1522,18 +1482,6 @@ Aadress: %4⏎</translation> <translation>Täpsusta enda avalik aadress</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Ulakate peeride valulävi (vaikeväärtus: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Mitme sekundi pärast ulakad peerid tagasi võivad tulla (vaikeväärtus: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Kuula JSON-RPC ühendusel seda porti <port> (vaikeväärtus: 8332 või testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Luba käsurea ning JSON-RPC käsklusi</translation> </message> @@ -1654,66 +1602,14 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com <translation>Tõrge: Rahakott on lukus, tehingu loomine ei ole võimalik!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Tõrge: süsteemi tõrge:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Pordi kuulamine nurjus. Soovikorral kasuta -listen=0.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Tõrge bloki sisu lugemisel</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Bloki lugemine ebaõnnestus</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Bloki indeksi sünkimine ebaõnnestus</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Bloki indeksi kirjutamine ebaõnnestus</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Bloki sisu kirjutamine ebaõnnestus</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Tõrge bloki sisu kirjutamisel</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Tõrge faili info kirjutamisel</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Tõrge mündi andmebaasi kirjutamisel</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Tehingu indeksi kirjutamine ebaõnnestus</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Tagasivõtmise andmete kirjutamine ebaõnnestus</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Käivitamisel kontrollitavate blokkide arv (vaikeväärtus: 288, 0=kõik)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Taasta bloki jada indeks blk000??.dat failist</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Määra RPC kõnede haldurite arv (vaikeväärtus: 4)</translation> - </message> - <message> <source>Verifying blocks...</source> <translation>Kontrollin blokke...</translation> </message> @@ -1730,50 +1626,14 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com <translation>Informatsioon</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Säilita kogu tehingu indeks (vaikeväärtus: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maksimaalne saamise puhver -connection kohta , <n>*1000 baiti (vaikeväärtus: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maksimaalne saatmise puhver -connection kohta , <n>*1000 baiti (vaikeväärtus: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Tunnusta ainult sisseehitatud turvapunktidele vastavaid bloki jadu (vaikeväärtus: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Ühenda ainult node'idega <net> võrgus (IPv4, IPv6 või Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Saada jälitus/debug, debug.log faili asemel, konsooli</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Sea minimaalne bloki suurus baitides (vaikeväärtus: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Kahanda programmi käivitamisel debug.log faili (vaikeväärtus: 1, kui ei ole -debug)</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Sea ühenduse timeout millisekundites (vaikeväärtus: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Süsteemi tõrge:</translation> - </message> - <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Kasuta kuulatava pordi määramiseks UPnP ühendust (vaikeväärtus: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Kasuta kuulatava pordi määramiseks UPnP ühendust (vaikeväärtus: 1, kui kuulatakse)</translation> </message> @@ -1806,10 +1666,6 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com <translation>Uuenda rahakott uusimasse vormingusse</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Sea võtmete hulgaks <n> (vaikeväärtus: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Otsi ploki jadast rahakoti kadunud tehinguid</translation> </message> @@ -1818,14 +1674,6 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com <translation>Kasuta JSON-RPC ühenduste jaoks OpenSSL'i (https)</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Serveri sertifikaadifail (vaikeväärtus: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Serveri privaatvõti (vaikeväärtus: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Käesolev abitekst</translation> </message> diff --git a/src/qt/locale/bitcoin_eu_ES.ts b/src/qt/locale/bitcoin_eu_ES.ts index f8f03c3d29..ea0ce1a67d 100644 --- a/src/qt/locale/bitcoin_eu_ES.ts +++ b/src/qt/locale/bitcoin_eu_ES.ts @@ -1,4 +1,4 @@ -<TS language="eu_ES" version="2.1"> +<TS language="eu_ES" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -175,10 +175,6 @@ <translation>Fitxen tresna-barra</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Up to date</source> <translation>Egunean</translation> </message> @@ -217,10 +213,6 @@ <translation>Kopurua</translation> </message> <message> - <source>Address</source> - <translation>Helbidea</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -305,10 +297,6 @@ <source>Form</source> <translation>Inprimakia</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Azken transakzioak</b></translation> - </message> </context> <context> <name>PaymentServer</name> @@ -695,14 +683,6 @@ <translation>Aukerak</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Ezarpen fitxategia aukeratu (berezkoa: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>pid fitxategia aukeratu (berezkoa: bitcoind.pid)</translation> - </message> - <message> <source>This help message</source> <translation>Laguntza mezu hau</translation> </message> diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts index d806fa47ef..475515f4b7 100644 --- a/src/qt/locale/bitcoin_fa.ts +++ b/src/qt/locale/bitcoin_fa.ts @@ -1,4 +1,4 @@ -<TS language="fa" version="2.1"> +<TS language="fa" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -10,6 +10,10 @@ <translation>ایجاد نشانی جدید</translation> </message> <message> + <source>&New</source> + <translation>&جدید</translation> + </message> + <message> <source>Copy the currently selected address to the system clipboard</source> <translation>کپی نشانی انتخاب شده به حافظهٔ سیستم</translation> </message> @@ -61,6 +65,10 @@ <source>Comma separated file (*.csv)</source> <translation>پروندهٔ نوع CSV جداشونده با کاما (*.csv)</translation> </message> + <message> + <source>Exporting Failed</source> + <translation>استخراج انجام نشد</translation> + </message> </context> <context> <name>AddressTableModel</name> @@ -327,10 +335,6 @@ <translation>نوارابزار برگهها</translation> </message> <message> - <source>[testnet]</source> - <translation>[شبکهٔ آزمایش]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation> هسته Bitcoin </translation> </message> @@ -342,10 +346,6 @@ <source>No block source available...</source> <translation>منبعی برای دریافت بلاک در دسترس نیست...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>%1 بلاک از تاریخچهٔ تراکنشها پردازش شده است.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n ساعت</numerusform></translation> @@ -437,10 +437,6 @@ Address: %4 <translation>مبلغ</translation> </message> <message> - <source>Address</source> - <translation>نشانی</translation> - </message> - <message> <source>Date</source> <translation>تاریخ</translation> </message> @@ -612,15 +608,7 @@ Address: %4 <source>Error</source> <translation>خطا</translation> </message> - <message> - <source>GB of free space available</source> - <translation>گیگابات فضا موجود است</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(از %1 گیگابایت فضای مورد نیاز)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> </context> @@ -635,14 +623,6 @@ Address: %4 <translation>&عمومی</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>کارمزد اختیاریِ هر کیلوبایت برای انتقال سریعتر تراکنش. اکثر تراکنشها ۱ کیلوبایتی هستند.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>پرداخت &کارمزد تراکنش</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>اجرای خودکار بیتکوین در زمان ورود به سیستم.</translation> </message> @@ -762,10 +742,6 @@ Address: %4 <translation>اطلاعات نمایشداده شده ممکن است قدیمی باشند. بعد از این که یک اتصال با شبکه برقرار شد، کیف پول شما بهصورت خودکار با شبکهٔ بیتکوین همگامسازی میشود. اما این روند هنوز کامل نشده است.</translation> </message> <message> - <source>Wallet</source> - <translation>کیف پول</translation> - </message> - <message> <source>Available:</source> <translation>در دسترس:</translation> </message> @@ -794,10 +770,6 @@ Address: %4 <translation>تراز کل فعلی شما</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>تراکنشهای اخیر</b></translation> - </message> - <message> <source>out of sync</source> <translation>ناهمگام</translation> </message> @@ -924,6 +896,10 @@ Address: %4 <source>Type <b>help</b> for an overview of available commands.</source> <translation>برای نمایش یک مرور کلی از دستورات ممکن، عبارت <b>help</b> را بنویسید.</translation> </message> + <message> + <source>Unknown</source> + <translation>ناشناخته</translation> + </message> </context> <context> <name>ReceiveCoinsDialog</name> @@ -1544,6 +1520,10 @@ Address: %4 <translation>نمایش جزئیات تراکنش</translation> </message> <message> + <source>Exporting Failed</source> + <translation>استخراج انجام نشد</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> <translation>پروندهٔ نوع CSV جداشونده با کاما (*.csv)</translation> </message> @@ -1627,26 +1607,10 @@ Address: %4 <translation>گزینهها:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>مشخص کردن فایل پیکربندی (پیشفرض: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>مشخص کردن فایل شناسهٔ پردازش - pid - (پیشفرض: bitcoin.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>مشخص کردن دایرکتوری دادهها</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>پذیرش اتصالات روی پورت <port> (پیشفرض: 8833 یا شبکهٔ آزمایشی: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>حداکثر <n> اتصال با همتایان برقرار شود (پیشفرض: ۱۲۵)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>اتصال به یک گره برای دریافت آدرسهای همتا و قطع اتصال پس از اتمام عملیات</translation> </message> @@ -1655,18 +1619,6 @@ Address: %4 <translation>آدرس عمومی خود را مشخص کنید</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>حد آستانه برای قطع ارتباط با همتایان بدرفتار (پیشفرض: ۱۰۰)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>مدت زمان جلوگیری از اتصال مجدد همتایان بدرفتار، به ثانیه (پیشفرض: ۸۴۶۰۰)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>پورت مورد شنود برای اتصالات JSON-RPC (پیشفرض: 8332 برای شبکهٔ تست 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>پذیرش دستورات خط فرمان و دستورات JSON-RPC</translation> </message> @@ -1739,58 +1691,10 @@ Address: %4 <translation>خطا در بازگشایی پایگاه داده ی بلوک</translation> </message> <message> - <source>Error: system error: </source> - <translation>خطا: خطای سامانه:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>شنیدن هر گونه درگاه انجام پذیر نیست. ازlisten=0 برای اینکار استفاده کیند.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>خواندن اطلاعات بلوک با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>خواندن بلوک با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>همگام سازی فهرست بلوک با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>نوشتن فهرست بلوک با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>نوشتن اطلاعات بلوک با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>نوشتن بلوک با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>نوشتن اطلاعات پرونده با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>نوشتن اطلاعات در پایگاه داده ی سکه ها با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>نوشتن فهرست تراکنش ها با شکست مواجه شد</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>عملیات بازگشت دادن اطلاعات با شکست مواجه شدن</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>چند بلوک نیاز است که در ابتدای راه اندازی بررسی شوند(پیش فرض:288 ،0=همه)</translation> - </message> - <message> <source>Verifying blocks...</source> <translation>در حال بازبینی بلوک ها...</translation> </message> @@ -1803,42 +1707,14 @@ Address: %4 <translation>اطلاعات</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>حداکثر بافر دریافت شده بر اساس اتصال <n>* 1000 بایت (پیش فرض:5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>حداکثر بافر دریافت شده بر اساس اتصال <n>* 1000 بایت (پیش فرض:1000)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>تنها =به گره ها در شبکه متصا شوید <net> (IPv4, IPv6 or Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>اطلاعات ردگیری/اشکالزدایی را به جای فایل لاگ اشکالزدایی به کنسول بفرستید</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>حداقل سایز بلاک بر اساس بایت تنظیم شود (پیش فرض: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>فایل debug.log را در startup مشتری کوچک کن (پیش فرض:1 اگر اشکال زدایی روی نداد)</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>(میلی ثانیه )فاصله ارتباط خاص</translation> - </message> - <message> - <source>System error: </source> - <translation>خطای سامانه</translation> - </message> - <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>از UPnP برای شناسایی درگاه شنیداری استفاده کنید (پیش فرض:0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>از UPnP برای شناسایی درگاه شنیداری استفاده کنید (پیش فرض:1 در زمان شنیدن)</translation> </message> @@ -1867,10 +1743,6 @@ Address: %4 <translation>wallet را به جدیدترین فرمت روزآمد کنید</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation> (100پیش فرض:)&lt;n&gt; گذاشتن اندازه کلید روی </translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>اسکان مجدد زنجیر بلوکها برای گم والت معامله</translation> </message> @@ -1879,14 +1751,6 @@ Address: %4 <translation>JSON-RPCبرای ارتباطات استفاده کنید OpenSSL (https)</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation> (server.certپیش فرض: )گواهی نامه سرور</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>(server.pemپیش فرض: ) کلید خصوصی سرور</translation> - </message> - <message> <source>This help message</source> <translation>پیام کمکی</translation> </message> diff --git a/src/qt/locale/bitcoin_fa_IR.ts b/src/qt/locale/bitcoin_fa_IR.ts index 92e0722767..1a639a8592 100644 --- a/src/qt/locale/bitcoin_fa_IR.ts +++ b/src/qt/locale/bitcoin_fa_IR.ts @@ -1,4 +1,4 @@ -<TS language="fa_IR" version="2.1"> +<TS language="fa_IR" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -235,10 +235,6 @@ <translation>نوار ابزار</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Error</source> <translation>خطا</translation> </message> @@ -294,10 +290,6 @@ Address: %4 <translation>میزان</translation> </message> <message> - <source>Address</source> - <translation>حساب</translation> - </message> - <message> <source>Date</source> <translation>تاریخ</translation> </message> @@ -420,14 +412,6 @@ Address: %4 <translation>اطلاعات نمایش داده شده ممکن است روزآمد نباشد. wallet شما به صورت خودکار بعد از برقراری اتصال با شبکه bitcoin به روز می شود اما این فرایند هنوز تکمیل نشده است.</translation> </message> <message> - <source>Wallet</source> - <translation>کیف پول</translation> - </message> - <message> - <source><b>Recent transactions</b></source> - <translation>تراکنشهای اخیر</translation> - </message> - <message> <source>out of sync</source> <translation>خارج از روزآمد سازی</translation> </message> @@ -938,38 +922,10 @@ Address: %4 <translation>انتخابها:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>فایل پیکربندیِ را مشخص کنید (پیش فرض: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>فایل pid را مشخص کنید (پیش فرض: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>دایرکتوری داده را مشخص کن</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>ارتباطات را در <PORT> بشنوید (پیش فرض: 8333 or testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>نگهداری <N> ارتباطات برای قرینه سازی (پیش فرض:125)</translation> - </message> - <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>آستانه قطع برای قرینه سازی اشتباه (پیش فرض:100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>تعداد ثانیه ها برای اتصال دوباره قرینه های اشتباه (پیش فرض:86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>ارتباطاتِ JSON-RPC را در <port> گوش کنید (پیش فرض:8332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>command line و JSON-RPC commands را قبول کنید</translation> </message> @@ -986,10 +942,6 @@ Address: %4 <translation>ارسال اطلاعات پیگیری/خطایابی به کنسول به جای ارسال به فایل debug.log</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>تعیین مدت زمان وقفه (time out) به هزارم ثانیه</translation> - </message> - <message> <source>Username for JSON-RPC connections</source> <translation>شناسه کاربری برای ارتباطاتِ JSON-RPC</translation> </message> @@ -1006,10 +958,6 @@ Address: %4 <translation>wallet را به جدیدترین نسخه روزآمد کنید</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>حجم key pool را به اندازه <n> تنظیم کنید (پیش فرض:100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>زنجیره بلاک را برای تراکنش جا افتاده در WALLET دوباره اسکن کنید</translation> </message> @@ -1018,14 +966,6 @@ Address: %4 <translation>برای ارتباطاتِ JSON-RPC از OpenSSL (https) استفاده کنید</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>فایل certificate سرور (پیش فرض server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>رمز اختصاصی سرور (پیش فرض: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>این پیام راهنما</translation> </message> diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts index 3541c58fcf..9a2eadd6ea 100644 --- a/src/qt/locale/bitcoin_fi.ts +++ b/src/qt/locale/bitcoin_fi.ts @@ -1,4 +1,4 @@ -<TS language="fi" version="2.1"> +<TS language="fi" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Välilehtipalkki</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin-ydin</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Lohkojen lähdettä ei saatavilla...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Käsitelty %1 lohkoa rahansiirtohistoriasta</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n tunti</numerusform><numerusform>%n tuntia</numerusform></translation> @@ -528,10 +520,6 @@ Osoite: %4</translation> <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Kolikkokontrollin osoitteen valinta</translation> - </message> - <message> <source>Quantity:</source> <translation>Määrä:</translation> </message> @@ -580,10 +568,6 @@ Osoite: %4</translation> <translation>Määrä</translation> </message> <message> - <source>Address</source> - <translation>Osoite</translation> - </message> - <message> <source>Date</source> <translation>Aika</translation> </message> @@ -915,15 +899,7 @@ Osoite: %4</translation> <source>Error</source> <translation>Virhe</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB vapaata tilaa</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(tarvitaan %1GB)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -958,14 +934,6 @@ Osoite: %4</translation> <translation>&Yleiset</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Valinnainen rahansiirtopalkkio per kB auttaa varmistamaan että rahansiirtosi prosessoidaan nopeasti. Useimmat rahansiirrot ovat alle 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Maksa rahansiirtopalkkio</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Käynnistä Bitcoin kirjautumisen yhteydessä.</translation> </message> @@ -994,14 +962,6 @@ Osoite: %4</translation> <translation>Hyväksy sisääntulevia yhteyksiä</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Yhdistä Bitcoin-verkkoon SOCKS proxyn kautta.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Yhdistä SOCKS proxyn kautta (oletus proxy):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>IP osoite proxille (esim. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1165,10 +1125,6 @@ Osoite: %4</translation> <translation>Näytetyt tiedot eivät välttämättä ole ajantasalla. Lompakkosi synkronoituu Bitcoin-verkon kanssa automaattisesti yhteyden muodostamisen jälkeen, mutta synkronointi on vielä meneillään.</translation> </message> <message> - <source>Wallet</source> - <translation>Lompakko</translation> - </message> - <message> <source>Watch-only:</source> <translation>Seuranta:</translation> </message> @@ -1209,8 +1165,8 @@ Osoite: %4</translation> <translation>Nykyinen tase seurantaosoitetteissa</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Viimeisimmät rahansiirrot</b></translation> + <source>Current total balance in watch-only addresses</source> + <translation>Nykyinen tase seurantaosoitetteissa</translation> </message> <message> <source>out of sync</source> @@ -1228,6 +1184,14 @@ Osoite: %4</translation> <translation>Virheellinen maksuosoite %1</translation> </message> <message> + <source>Payment request rejected</source> + <translation>Maksupyyntö hylätty</translation> + </message> + <message> + <source>Payment request has expired.</source> + <translation>Maksupyyntö on vanhentunut.</translation> + </message> + <message> <source>Requested payment amount of %1 is too small (considered dust).</source> <translation>Maksupyyntö %1 on liian pieni (huomioidaan tomuna).</translation> </message> @@ -1244,6 +1208,10 @@ Osoite: %4</translation> <translation>Maksupyynnön haku URL on virheellinen: %1</translation> </message> <message> + <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source> + <translation>URIa ei voitu jäsentää! Tämä voi johtua kelvottomasta Bitcoin-osoitteesta tai virheellisistä URI parametreista.</translation> + </message> + <message> <source>Payment request file handling</source> <translation>Maksupyynnön tiedoston käsittely</translation> </message> @@ -1274,6 +1242,10 @@ Osoite: %4</translation> </context> <context> <name>PeerTableModel</name> + <message> + <source>User Agent</source> + <translation>Käyttöliittymä</translation> + </message> </context> <context> <name>QObject</name> @@ -1282,6 +1254,10 @@ Osoite: %4</translation> <translation>Määrä</translation> </message> <message> + <source>%1 d</source> + <translation>%1 d</translation> + </message> + <message> <source>%1 h</source> <translation>%1 h</translation> </message> @@ -1290,10 +1266,18 @@ Osoite: %4</translation> <translation>%1 m</translation> </message> <message> + <source>%1 s</source> + <translation>%1 s</translation> + </message> + <message> <source>N/A</source> <translation>Ei saatavilla</translation> </message> - </context> + <message> + <source>%1 ms</source> + <translation>%1 ms</translation> + </message> +</context> <context> <name>QRImageWidget</name> <message> @@ -1368,6 +1352,22 @@ Osoite: %4</translation> <translation>Nykyinen Lohkojen määrä</translation> </message> <message> + <source>Received</source> + <translation>Vastaanotetut</translation> + </message> + <message> + <source>Sent</source> + <translation>Lähetetyt</translation> + </message> + <message> + <source>Version</source> + <translation>Versio</translation> + </message> + <message> + <source>User Agent</source> + <translation>Käyttöliittymä</translation> + </message> + <message> <source>Last block time</source> <translation>Viimeisimmän lohkon aika</translation> </message> @@ -1443,6 +1443,10 @@ Osoite: %4</translation> <source>%1 GB</source> <translation>%1 GB</translation> </message> + <message> + <source>Unknown</source> + <translation>Tuntematon</translation> + </message> </context> <context> <name>ReceiveCoinsDialog</name> @@ -2482,26 +2486,10 @@ Osoite: %4</translation> <translation>Asetukset:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Määritä asetustiedosto (oletus: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Määritä pid-tiedosto (oletus: bitcoin.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Määritä data-hakemisto</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Kuuntele yhteyksiä portista <port> (oletus: 8333 tai testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Pidä enintään <n> yhteyttä verkkoihin (oletus: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Yhdistä noodiin hakeaksesi naapurien osoitteet ja katkaise yhteys</translation> </message> @@ -2510,18 +2498,6 @@ Osoite: %4</translation> <translation>Määritä julkinen osoitteesi</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Kynnysarvo aikakatkaisulle heikosti toimiville verkoille (oletus: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Sekuntien määrä, kuinka kauan uudelleenkytkeydytään verkkoihin (oletus: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Kuuntele JSON-RPC -yhteyksiä portista <port> (oletus: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Hyväksy merkkipohjaiset- ja JSON-RPC-käskyt</translation> </message> @@ -2562,18 +2538,10 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Hyväksytyt koodit (oletus: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Kytkeydy annettuun osoitteeseen ja pidä linja aina auki. Käytä [host]:portin merkintätapaa IPv6:lle.</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Yhtäaikaisesti rajaa vapaat rahansiirrot <n>*1000 tavua per minuutti (oletus: 15)</translation> - </message> - <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Aloita regression testimoodi joka käyttää erikoisketjua jossa lohkoja voidaan ratkaista välittömästi.</translation> </message> @@ -2590,14 +2558,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Suorita käsky kun lompakossa rahansiirto muuttuu (%s cmd on vaihdettu TxID kanssa)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Aja tietokannan toimet muistivarannosta kovalevylogiin joka <n> megatavu (oletus: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Kuinka vaativa lohkonvarmistus -checkblocks on (0-4, oletus: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>Tässä moodissa -genproclimit ohjaa kuinka monta lohkoa luodaan välittömästi.</translation> </message> @@ -2606,10 +2566,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Aseta script varmistuksen threadien lukumäärä (%u - %d, 0= auto, <0 = jätä näin monta ydintä vapaaksi, oletus: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Aseta prosessorin raja kun luonti on päällä (-1 = rajoittamaton, oletus: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Tämä on esi-julkaistu testiversio - Käytä omalla riskillä - Ei saa käytää louhimiseen tai kauppasovelluksiin.</translation> </message> @@ -2618,10 +2574,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ei voida yhdistää %s tässä tietokoneessa. Bitcoin Core on luultavasti jo käynnissä.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Käytä erillistä SOCKS5 proxya tavoittaaksesi vertaiset Tor palvelun kautta (oletus: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Varoitus: -paytxfee on asetettu erittäin korkeaksi! Tämä on maksukulu jonka tulet maksamaan kun lähetät siirron.</translation> </message> @@ -2646,10 +2598,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>(oletus: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(oletus: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> voi olla:</translation> </message> @@ -2678,10 +2626,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Debuggaus/Testauksen valinnat:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Poista safemode, ohita oikea turvallinen mooditapahtuma (oletus: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Hae oma IP osoite (vakioasetus: 1 kun kuuntelemassa ja ei -externalip)</translation> </message> @@ -2718,66 +2662,10 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Virhe: Lompakko on lukittu, rahansiirtoa ei voida luoda</translation> </message> <message> - <source>Error: system error: </source> - <translation>Virhe: Järjestelmävirhe</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Ei onnistuttu kuuntelemaan missään portissa. Käytä -listen=0 jos haluat tätä.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Lohkotietojen luku epäonnistui</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Lohkon luku epäonnistui</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Lohkoindeksin synkronointi epäonnistui</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Lohkoindeksin kirjoitus epäonnistui</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Lohkotiedon kirjoitus epäonnistui</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Lohkon kirjoitus epäonnistui</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Tiedoston tietojen kirjoitus epäonnistui</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Kolikkotietokannan kirjoitus epäonnistui</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Rahasiirtojen indeksin kirjoitus epäonnistui</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Palautustiedon kirjoitus epäonnistui</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Pakota safe moodi (oletus: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generoi kolikoita (vakio: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Kuinka monta lohkoa tarkistetaan käynnistettäessä (oletus: 288, 0 = kaikki)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Jos <kategoria> ei annettu, tulosta kaikki debuggaustieto.</translation> </message> @@ -2798,10 +2686,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ei tarpeeksi tiedostomerkintöjä vapaana.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Lisää aikamerkki debug tulosteen eteen (oletus: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Uudelleenrakenna lohkoketjuindeksi nykyisistä blk000??.dat tiedostoista</translation> </message> @@ -2814,18 +2698,10 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Aseta lohkon maksimikoko tavuissa (oletus: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Aseta threadien lukumäärä RPC kutsuille (oletus: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Aseta lompakkotiedosto (data-hakemiston sisällä)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Käytä varmistamattomia vaihtorahoja lähetettäessä rahansiirtoja (oletus: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Tämä on tarkoitettu regression testityökaluille ja ohjelman kehittämiseen.</translation> </message> @@ -2862,62 +2738,38 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Aja komento kun olennainen hälytys vastaanotetaan tai nähdään todella pitkä haara (%s komennossa korvataan viestillä)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Tulosta debuggaustieto (oletus: 0, annettu <kategoria> valinnainen)</translation> - </message> - <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>Aseta maksimikoko korkea prioriteetti/pieni palkkio rahansiirtoihin tavuissa (oletus: %d)</translation> </message> <message> - <source>Information</source> - <translation>Tietoa</translation> - </message> - <message> - <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> - <translation>Virheellinen määrä -minrelaytxfee=<amount>: '%s'</translation> - </message> - <message> - <source>Invalid amount for -mintxfee=<amount>: '%s'</source> - <translation>Virheellinen määrä -mintxfee=<amount>: '%s'</translation> - </message> - <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Rajaa allekirjoituksen välimuistin koko <n> alkioon (oletus: 50000)</translation> + <source>Connect through SOCKS5 proxy</source> + <translation>Yhdistä SOCKS5 proxin kautta</translation> </message> <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Kirjaa rahansiirron prioriteetti ja palkkio per kB kun louhitaan lohkoja (oletus: 0)</translation> + <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> + <translation>Copyright (C) 2009-%i Bitcoin kehittäjät</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Ylläpidä täydellistä rahasiirtojen indeksiä (oletus: 0)</translation> + <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source> + <translation>Virhe ladattaessa wallet.dat-tiedostoa: Tarvitset uudemman version Bitcoinista</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Suurin vastaanottopuskuri yksittäiselle yhteydelle, <n>*1000 tavua (vakioasetus: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Suurin lähetyspuskuri yksittäiselle yhteydelle, <n>*1000 tavua (vakioasetus: 1000)</translation> + <source>Information</source> + <translation>Tietoa</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Hyväksy vain lohkoketjua vastaavat sisäänrakennetut varmistuspisteet (Oletus: 1)</translation> + <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> + <translation>Virheellinen määrä -minrelaytxfee=<amount>: '%s'</translation> </message> <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Yhdistä vain noodeihin verkossa <net> (IPv4, IPv6 tai Tor)</translation> + <source>Invalid amount for -mintxfee=<amount>: '%s'</source> + <translation>Virheellinen määrä -mintxfee=<amount>: '%s'</translation> </message> <message> <source>Print block on startup, if found in block index</source> <translation>Tulosta lohko käynnistyksessä jos löydetään lohkoindeksistä</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Tulosta lohkopuu käynnistyksessä (oletus: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL valinnat: (katso Bitcoin Wikistä SSL-asennuksen ohjeet)</translation> </message> @@ -2934,22 +2786,10 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Satunnaisesti sekoita 1 joka <n> verkkoviestistä</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Aja threadi jossa tallennetaan lompakko ajoittain (oletus: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Lähetä jäljitys/debug-tieto konsoliin, debug.log-tiedoston sijaan</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Asetan pienin lohkon koko tavuissa (vakioasetus: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Asettaa DB_PRIVATE lipun lompakon tietokantaympäristössä (oletus: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Näytä kaikki debuggaus valinnat: (käyttö: --help -help-debug)</translation> </message> @@ -2962,14 +2802,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Siirron vahvistus epäonnistui</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Määritä yhteyden aikakataisu millisekunneissa (vakioasetus: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Järjestelmävirhe:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Siirtosumma liian pieni</translation> </message> @@ -2982,10 +2814,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Siirtosumma liian iso</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Käytä UPnP:tä kuunneltavan portin avaamiseen (vakioasetus: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Käytä UPnP:tä kuunneltavan portin avaamiseen (vakioasetus: 1 kun kuuntelemassa)</translation> </message> @@ -2994,6 +2822,10 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Käyttäjätunnus JSON-RPC-yhteyksille</translation> </message> <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>Lompakko tarvitsee uudelleenkirjoittaa: käynnistä Bitcoin uudelleen</translation> + </message> + <message> <source>Warning</source> <translation>Varoitus</translation> </message> @@ -3026,10 +2858,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Päivitä lompakko uusimpaan formaattiin</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Aseta avainpoolin koko arvoon <n> (oletus: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Skannaa uudelleen lohkoketju lompakon puuttuvien rahasiirtojen vuoksi</translation> </message> @@ -3038,14 +2866,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Käytä OpenSSL:ää (https) JSON-RPC-yhteyksille</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Palvelimen sertifikaatti-tiedosto (oletus: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Palvelimen yksityisavain (oletus: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Tämä ohjeviesti</translation> </message> diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts index dfd7081593..71a1519411 100644 --- a/src/qt/locale/bitcoin_fr.ts +++ b/src/qt/locale/bitcoin_fr.ts @@ -1,4 +1,4 @@ -<TS language="fr" version="2.1"> +<TS language="fr" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Barre d'outils des onglets</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Aucune source de blocs disponible...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>À traité %1 blocs de l'historique des transactions.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n heure</numerusform><numerusform>%n heures</numerusform></translation> @@ -486,6 +478,10 @@ <source>Up to date</source> <translation>À jour</translation> </message> + <message numerus="yes"> + <source>Processed %n blocks of transaction history.</source> + <translation><numerusform>%n bloc de l'historique transactionnel a été traité</numerusform><numerusform>%n blocs de l'historique transactionnel ont été traités</numerusform></translation> + </message> <message> <source>Catching up...</source> <translation>Rattrapage en cours…</translation> @@ -529,8 +525,8 @@ Adresse : %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Sélection de l'adresse de contrôle des pièces</translation> + <source>Coin Selection</source> + <translation>Sélection des pièces</translation> </message> <message> <source>Quantity:</source> @@ -581,8 +577,12 @@ Adresse : %4 <translation>Montant</translation> </message> <message> - <source>Address</source> - <translation>Adresse</translation> + <source>Received with label</source> + <translation>Reçu avec une étiquette</translation> + </message> + <message> + <source>Received with address</source> + <translation>Reçu avec une adresse</translation> </message> <message> <source>Date</source> @@ -912,15 +912,11 @@ Adresse : %4 <source>Error</source> <translation>Erreur</translation> </message> - <message> - <source>GB of free space available</source> - <translation>Go d'espace libre disponible</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(sur %1Go nécessaires)</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n Go d'espace libre disponible</numerusform><numerusform>%n Go d'espace libre disponibles</numerusform></translation> </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -955,14 +951,6 @@ Adresse : %4 <translation>Réglages &principaux</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Frais de transaction optionnel par ko qui aident à garantir un traitement rapide des transactions. La plupart des transactions utilisent 1 ko.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Payer des &frais de transaction</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Démarrer Bitcoin automatiquement après avoir ouvert une session sur l'ordinateur.</translation> </message> @@ -991,14 +979,6 @@ Adresse : %4 <translation>Permettre les transactions entrantes</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Se connecter au réseau Bitcoin par un mandataire SOCKS.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>Se &connecter par un mandataire SOCKS (mandataire par défaut) :</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Adresse IP du mandataire (par ex. IPv4 : 127.0.0.1 / IPv6 : ::1)</translation> </message> @@ -1059,6 +1039,14 @@ Adresse : %4 <translation>Mapper le port avec l'&UPnP</translation> </message> <message> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation>Se connecter au réseau Bitcoin par un mandataire SOCKS5.</translation> + </message> + <message> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation>Se &connecter par un mandataire SOCKS5 (mandataire par défaut) :</translation> + </message> + <message> <source>Proxy &IP:</source> <translation>&IP du serveur mandataire :</translation> </message> @@ -1162,10 +1150,6 @@ Adresse : %4 <translation>Les informations affichées peuvent être obsolètes. Votre portefeuille est automatiquement synchronisé avec le réseau Bitcoin lorsque la connexion s'établit, or ce processus n'est pas encore terminé.</translation> </message> <message> - <source>Wallet</source> - <translation>Portefeuille</translation> - </message> - <message> <source>Watch-only:</source> <translation>Juste-regarder :</translation> </message> @@ -1194,6 +1178,10 @@ Adresse : %4 <translation>Le solde généré n'est pas encore mûr</translation> </message> <message> + <source>Balances</source> + <translation>Soldes</translation> + </message> + <message> <source>Total:</source> <translation>Total :</translation> </message> @@ -1206,6 +1194,14 @@ Adresse : %4 <translation>Votre balance actuelle en adresses juste-regarder</translation> </message> <message> + <source>Spendable:</source> + <translation>Disponible :</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Transactions récentes</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>Transactions non confirmées vers des adresses juste-regarder</translation> </message> @@ -1218,10 +1214,6 @@ Adresse : %4 <translation>Solde total actuel dans des adresses juste-regarder</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transactions récentes</b></translation> - </message> - <message> <source>out of sync</source> <translation>désynchronisé</translation> </message> @@ -1481,10 +1473,6 @@ Adresse : %4 <translation>Services</translation> </message> <message> - <source>Sync Node</source> - <translation>Nœud de synchro</translation> - </message> - <message> <source>Starting Height</source> <translation>Hauteur de démarrage</translation> </message> @@ -1613,14 +1601,6 @@ Adresse : %4 <translation>Sortant</translation> </message> <message> - <source>Yes</source> - <translation>Oui</translation> - </message> - <message> - <source>No</source> - <translation>Non</translation> - </message> - <message> <source>Unknown</source> <translation>Inconnu</translation> </message> @@ -1857,6 +1837,78 @@ Adresse : %4 <translation>Adresse personnalisée de monnaie rendue</translation> </message> <message> + <source>Transaction Fee:</source> + <translation>Frais de transaction :</translation> + </message> + <message> + <source>Choose...</source> + <translation>Choisir...</translation> + </message> + <message> + <source>collapse fee-settings</source> + <translation>réduire les paramètres des frais</translation> + </message> + <message> + <source>Minimize</source> + <translation>Minimiser</translation> + </message> + <message> + <source>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 "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source> + <translation>Si les frais personnalisés sont définis à 1 000 satoshis et que la transaction est seulement de 250 octets, donc le « par kilo-octet » ne paiera que 250 satoshis de frais, alors que le « au moins » paiera 1 000 satoshis. Pour des transactions supérieures à un kilo-octet, les deux paieront par kilo-octets.</translation> + </message> + <message> + <source>per kilobyte</source> + <translation>par kilo-octet</translation> + </message> + <message> + <source>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.</source> + <translation>Si les frais personnalisés sont définis à 1 000 satoshis et que la transaction est seulement de 250 octets, donc le « par kilo-octet » ne paiera que 250 satoshis de frais, alors que le « total au moins » paiera 1 000 satoshis. Pour des transactions supérieures à un kilo-octet, les deux paieront par kilo-octets.</translation> + </message> + <message> + <source>total at least</source> + <translation>total au moins</translation> + </message> + <message> + <source>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.</source> + <translation>Il est correct de payer les frais minimum tant que le volume transactionnel est inférieur à l'espace dans les blocs. Mais soyez conscient que ceci pourrait résulter en une transaction n'étant jamais confirmée une fois qu'il y aura plus de transactions que le réseau ne pourra en traiter.</translation> + </message> + <message> + <source>(read the tooltip)</source> + <translation>(lire l'infobulle)</translation> + </message> + <message> + <source>Recommended:</source> + <translation>Recommandés :</translation> + </message> + <message> + <source>Custom:</source> + <translation>Personnalisés : </translation> + </message> + <message> + <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source> + <translation>(Les frais intelligents ne sont pas encore initialisés. Ceci prend habituellement quelques blocs...)</translation> + </message> + <message> + <source>Confirmation time:</source> + <translation>Temps de confirmation :</translation> + </message> + <message> + <source>normal</source> + <translation>normal</translation> + </message> + <message> + <source>fast</source> + <translation>rapide</translation> + </message> + <message> + <source>Send as zero-fee transaction if possible</source> + <translation>Envoyer si possible une transaction sans frais</translation> + </message> + <message> + <source>(confirmation may take longer)</source> + <translation>(la confirmation pourrait prendre plus longtemps)</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Envoyer à plusieurs destinataires à la fois</translation> </message> @@ -1961,6 +2013,18 @@ Adresse : %4 <translation>La transaction a été rejetée ! Ceci peut arriver si certaines pièces de votre portefeuille étaient déjà dépensées, par exemple si vous avez utilisé une copie de wallet.dat et que des pièces ont été dépensées dans la copie sans être marquées comme telles ici.</translation> </message> <message> + <source>A fee higher than %1 is considered an insanely high fee.</source> + <translation>Des frais supérieurs à %1 sont considérés comme follement élevés.</translation> + </message> + <message> + <source>Pay only the minimum fee of %1</source> + <translation>Payer seulement les frais minimum de %1</translation> + </message> + <message> + <source>Estimated to begin confirmation within %1 block(s).</source> + <translation>Début de confirmation estimé à %1 bloc(s).</translation> + </message> + <message> <source>Warning: Invalid Bitcoin address</source> <translation>Avertissement : adresse Bitcoin invalide</translation> </message> @@ -2469,6 +2533,10 @@ Adresse : %4 <translation>Miné</translation> </message> <message> + <source>watch-only</source> + <translation>juste-regarder</translation> + </message> + <message> <source>(n/a)</source> <translation>(n.d)</translation> </message> @@ -2485,6 +2553,10 @@ Adresse : %4 <translation>Type de transaction.</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Une adresse juste-regarder est-elle impliquée dans cette transaction.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>L’adresse de destination de la transaction.</translation> </message> @@ -2580,6 +2652,10 @@ Adresse : %4 <translation>Exporter l'historique des transactions</translation> </message> <message> + <source>Watch-only</source> + <translation>Juste-regarder :</translation> + </message> + <message> <source>Exporting Failed</source> <translation>L'exportation a échoué</translation> </message> @@ -2695,26 +2771,10 @@ Adresse : %4 <translation>Options :</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Spécifier le fichier de configuration (par défaut : bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Spécifier le fichier PID (par défaut : bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Spécifier le répertoire de données</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Écouter les connexions sur le <port> (par défaut : 8333 ou testnet : 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Garder au plus <n> connexions avec les pairs (par défaut : 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Se connecter à un nœud pour obtenir des adresses de pairs puis se déconnecter</translation> </message> @@ -2723,18 +2783,6 @@ Adresse : %4 <translation>Spécifier votre propre adresse publique</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Seuil de déconnexion des pairs de mauvaise qualité (par défaut : 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Délai en secondes de refus de reconnexion aux pairs de mauvaise qualité (par défaut : 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Écouter les connexions JSON-RPC sur le <port> (par défaut : 8332 ou tesnet : 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Accepter les commandes de JSON-RPC et de la ligne de commande</translation> </message> @@ -2775,22 +2823,18 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Chiffrements acceptables (par défaut : TLSv1.2+HIGH : TLSv1+HIGH : !SSLv2 : !aNULL : !eNULL : !3DES : @STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Se lier à l'adresse donnée et toujours l'écouter. Utilisez la notation [host]:port pour l'IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Limiter continuellement les transactions gratuites à <n>*1000 octets par minute (par défaut : 15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>Supprimer toutes les transactions du portefeuille et ne récupérer que ces parties de la chaîne de bloc avec -rescan au démarrage</translation> </message> <message> + <source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> + <translation>Distribué sous la licence MIT d'utilisation d'un logiciel. Consultez le fichier joint COPYING ou <http://www.opensource.org/licenses/mit-license.php>.</translation> + </message> + <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Passer en mode de test de régression qui utilise une chaîne spéciale dans laquelle les blocs sont résolus instantanément.</translation> </message> @@ -2807,14 +2851,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Exécuter la commande lorsqu'une transaction de portefeuille change (%s dans la commande est remplacée par TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Purger l’activité de la base de données de la mémoire vers le journal sur disque tous les <n> mégaoctets (par défaut : 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>À quel point la vérification des blocs -checkblocks est approfondie (0-4, par défaut : 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>Dans ce mode -genproclimit contrôle combien de blocs sont générés immédiatement.</translation> </message> @@ -2823,10 +2859,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Définir le nombre d'exétrons de vérification des scripts (%u à %d, 0 = auto, < 0 = laisser ce nombre de cœurs inutilisés, par défaut : %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Définir la limite processeur définissant quand la génération est en fonction (-1 = illimité, par défaut : -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Ceci est une pré-version de test - l'utiliser à vos risques et périls - ne pas l'utiliser pour miner ou pour des applications marchandes</translation> </message> @@ -2835,10 +2867,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Impossible de se lier à %s sur cet ordinateur. Bitcoin Core fonctionne probablement déjà.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Utiliser un serveur mandataire SOCKS5 séparé pour atteindre les pairs par les services cachés de Tor (par défaut : -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Avertissement : -paytxfee est réglé sur un montant très élevé ! Il s'agit des frais de transaction que vous payerez si vous envoyez une transaction.</translation> </message> @@ -2859,12 +2887,12 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Avertissement : wallet.dat corrompu, données récupérées ! Le fichier wallet.dat original a été enregistré en tant que wallet.{timestamp}.bak dans %s ; si votre solde ou transactions sont incorrects vous devriez effectuer une restauration depuis une sauvegarde.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(par défaut : 1)</translation> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Pairs de la liste blanche se connectant à partir du masque réseau ou de l'IP donné. Peut être spécifié plusieurs fois.</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(par défaut : wallet.dat)</translation> + <source>(default: 1)</source> + <translation>(par défaut : 1)</translation> </message> <message> <source><category> can be:</source> @@ -2895,10 +2923,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Options de test/de débogage :</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Désactiver le mode sans échec, passer outre un événement sans échec réel (par défaut : 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Découvrir sa propre adresse IP (par défaut : 1 lors de l'écoute et si aucun -externalip)</translation> </message> @@ -2927,6 +2951,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Erreur lors de l'ouverture de la base de données des blocs</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Erreur : une erreur interne fatale s'est produite. Voir debug.log pour des détails</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Erreur : l'espace disque est faible !</translation> </message> @@ -2935,66 +2963,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Erreur : Portefeuille verrouillé, impossible de créer la transaction !</translation> </message> <message> - <source>Error: system error: </source> - <translation>Erreur : erreur système :</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Échec de l'écoute sur un port quelconque. Utilisez -listen=0 si vous voulez ceci.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>La lecture des informations de bloc a échoué</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>La lecture du bloc a échoué</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>La synchronisation de l'index des blocs a échoué</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>L''écriture de l'index des blocs a échoué</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>L'écriture des informations du bloc a échoué</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>L'écriture du bloc a échoué</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>L'écriture des informations de fichier a échoué</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>L'écriture dans la base de données des pièces a échoué</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>L'écriture de l'index des transactions a échoué</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>L'écriture des données d'annulation a échoué</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Forcer le mode sans échec (par défaut : 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Générer des pièces (défaut : 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Nombre de blocs à vérifier au démarrage (par défaut : 288, 0 = tout)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Si <category> n'est pas indiqué, extraire toutes les données de débogage.</translation> </message> @@ -3015,8 +2987,8 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Pas assez de descripteurs de fichiers de disponibles.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Ajouter l'horodatage au début des résultats de débogage (par défaut : 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Seulement se connecter aux nœuds du réseau <net> (IPv4, IPv6 ou oignon)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3031,26 +3003,18 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Définir la taille minimale de bloc en octets (par défaut : %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Définir le nombre d'exétrons pour desservir les appels RPC (par défaut : 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Spécifiez le fichier de portefeuille (dans le répertoire de données)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Dépenser la monnaie non confirmée lors de l'envoi de transactions (par défaut : 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Arrêter l'exécution après l'importation des blocs du disque (par défaut : 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Ceci est à l'intention des outils de test de régression et du développement applicatif.</translation> </message> <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Utiliser l'UPnP pour mapper le port d'écoute (par défaut : %u)</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Vérification des blocs en cours...</translation> </message> @@ -3075,10 +3039,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Importe des blocs depuis un fichier blk000??.dat externe</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(par défaut : 1, 1 = conserver les données de transmission c.-à-d. propriétaire du compte et information de demande de paiement, 2 = abandonner les données de transmission)</translation> - </message> - <message> <source>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</source> <translation>Permettre les connexions JSON-RPC de sources spécifiques. Valide pour <ip> qui sont une IP simple (p. ex. 1.2.3.4), un réseau/masque réseau (p. ex. 1.2.3.4/255.255.255.0) ou un réseau/CIDR (p. ex. 1.2.3.4/24). Cette option peut être être spécifiée plusieurs fois</translation> </message> @@ -3099,12 +3059,12 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Impossible d’obtenir un verrou sur le répertoire de données %s. Bitcoin Core fonctionne probablement déjà.</translation> </message> <message> - <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> - <translation>Créer de nouveaux fichiers avec les permissions système par défaut, au lieu de umask 077 (effectif seulement avec la fonction du portefeuille désactivée)</translation> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Limiter continuellement les transactions gratuites à <n>*1000 octets par minute (par défaut : %u)</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>Distribué sous la licence logiciel MIT/X11, consultez le fichier joint COPYING ou <http://www.opensource.org/licenses/mit-license.php>.</translation> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Créer de nouveaux fichiers avec les permissions système par défaut, au lieu de umask 077 (effectif seulement avec la fonction du portefeuille désactivée)</translation> </message> <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> @@ -3115,10 +3075,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Erreur : l'argument non pris en charge -socks a été trouvé. Il n'est plus possible de définir la version de SOCKS, seuls les serveurs mandataires SOCKS5 sont pris en charge.</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Exécuter la commande quand une transmission réseau redépense l'entrée d'une transmission du portefeuille (%s=respend TxID, %t=wallet TxID)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Exécuter une commande lorsqu'une alerte pertinente est reçue ou si nous voyons une bifurcation vraiment étendue (%s dans la commande est remplacé par le message)</translation> </message> @@ -3131,12 +3087,8 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Les frais (en BTC/Ko) inférieurs à ce seuil sont considérés comme étant nuls pour la création de transactions (par défaut : %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>Si paytxfee n'est pas défini, inclure suffisamment de frais afin que les transactions soient confirmées avant n blocs (par défaut : 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Informations du résultat de débogage (par défaut : 0, fournir <category> est optionnel)</translation> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation>Quantité maximale de données dans les transactions du porteur de données que nous relayons et minons (par défaut : %u)</translation> </message> <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> @@ -3147,6 +3099,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Définir la taille maximale en octets des transactions prioritaires/à frais modiques (par défaut : %d)</translation> </message> <message> + <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source> + <translation>Définir le nombre de fils de génération de pièces, si elle est activée (-1 = tous les cœurs, par défaut : %d)</translation> + </message> + <message> <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> <translation>Ce produit comprend des logiciels développés par le projet OpenSSL pour être utilisés dans la boîte à outils OpenSSL <https://www.openssl.org/> et un logiciel cryptographique écrit par Eric Young, ainsi qu'un logiciel UPnP écrit par Thomas Bernard.</translation> </message> @@ -3155,18 +3111,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Avertissement : veuillez vérifier que l'heure et la date de votre ordinateur sont correctes ! Si votre horloge n'est pas à l'heure, Bitcoin Core ne fonctionnera pas correctement.</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>Pairs de la liste blanche se connectant à partir du masque réseau ou de l'IP donné. Peut être spécifié plusieurs fois.</translation> - </message> - <message> <source>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</source> <translation>Les pairs de la liste blanche ne peuvent pas être bannis DoS et leurs transactions sont toujours relayées, même si elles sont déjà dans le mempool, utile p. ex. pour une passerelle</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>Toujours demander les adresses de pairs par recherche DNS (par défaut : 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>Impossible de résoudre l'adresse -whitebind : « %s »</translation> </message> @@ -3195,10 +3143,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Les frais (en BTC/ko) à ajouter aux transactions que vous envoyez (par défaut : %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Inclure les adresses IP dans la sortie de débogage (par défaut : 0)</translation> - </message> - <message> <source>Information</source> <translation>Informations</translation> </message> @@ -3227,24 +3171,8 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Garder au plus <n> blocs non connectables en mémoire (par défaut : %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Limiter la taille du cache des signatures à <n> entrées (par défaut : 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Journaliser la priorité des transactions et les frais par ko lors du minage (par défaut : 0) </translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Maintenir un index complet des transactions (par défaut : 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Tampon maximal de réception par « -connection » <n>*1 000 octets (par défaut : 5 000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Tampon maximal d'envoi par « -connection », <n>*1 000 octets (par défaut : 1 000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Garder au plus <n> transactions non connectables en mémoire (par défaut : %u)</translation> </message> <message> <source>Need to specify a port with -whitebind: '%s'</source> @@ -3255,22 +3183,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Options de relais du nœud :</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>N'accepter que la chaîne de blocs correspondant aux points de vérification internes (par défaut : 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Se connecter uniquement aux nœuds du réseau <net> (IPv4, IPv6 ou Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Imprimer le bloc au démarrage s'il est trouvé dans l'index des blocs</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Imprimer l'arborescence des blocs au démarrage (par défaut : 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Options RPC SSL : (voir le wiki Bitcoin pour les instructions de configuration de SSL)</translation> </message> @@ -3287,28 +3203,12 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Tester aléatoirement 1 message du réseau sur <n></translation> </message> <message> - <source>Relay and mine data carrier transactions (default: 1)</source> - <translation>Relayer et miner les transactions du porteur de données (par défaut : 1)</translation> - </message> - <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>Relayer les multisig non-P2SH (par défaut : 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Exécuter un exétron pour purger le portefeuille périodiquement (par défaut : 1) </translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Envoyer les informations de débogage/trace à la console au lieu du fichier debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Définir la taille minimale de bloc en octets (par défaut : 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Définit le drapeau DB_PRIVATE dans l'environnement de la base de données du portefeuille (par défaut : 1)</translation> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Envoyer si possible les transactions comme étant sans frais (par défaut : %u)</translation> </message> <message> <source>Show all debugging options (usage: --help -help-debug)</source> @@ -3323,14 +3223,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>La signature de la transaction a échoué</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Spécifier le délai d'expiration de la connexion en millisecondes (par défaut : 5 000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Erreur système :</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Ceci est un logiciel expérimental.</translation> </message> @@ -3351,12 +3243,8 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Impossible de se lier à %s sur cet ordinateur (bind a retourné l'erreur %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Utiliser l'UPnP pour rediriger le port d'écoute (par défaut : 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> - <translation>Utiliser l'UPnP pour rediriger le port d'écoute (par défaut : 1 lors de l'écoute)</translation> + <translation>Utiliser l'UPnP pour mapper le port d'écoute (par défaut : 1 lors de l'écoute)</translation> </message> <message> <source>Username for JSON-RPC connections</source> @@ -3407,10 +3295,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Mettre à niveau le portefeuille vers le format le plus récent</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Régler la taille de la réserve de clefs sur <n> (par défaut : 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Réanalyser la chaîne de blocs pour les transactions de portefeuille manquantes</translation> </message> @@ -3419,14 +3303,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Utiliser OpenSSL (https) pour les connexions JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Fichier de certificat serveur (par défaut : server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clef privée du serveur (par défaut : server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Ce message d'aide</translation> </message> @@ -3443,14 +3319,166 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com <translation>Erreur lors du chargement de wallet.dat : portefeuille corrompu</translation> </message> <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = conserver les métadonnées de transmission, par ex. les informations du propriétaire du compte et de la demande de paiement, 2 = abandonner les métadonnées de transmission)</translation> + </message> + <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Purger l’activité de la base de données de la zone de mémoire vers le journal sur disque tous les <n> mégaoctets (par défaut : %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>Degré de profondeur de la vérification des blocs -checkblocks (0-4, par défaut : %u)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source> + <translation>Si paytxfee n'est pas défini, inclure des frais suffisants afin que les transactions soient confirmées en moyenne en n blocs (par défaut : %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Lors du minage, journaliser la priorité des transactions et les frais par ko (par défaut : %u) </translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Maintenir un index complet des transactions, utilisé par l'appel RPC getrawtransaction (obtenir la transaction brute) (par défaut : %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Délai en secondes de refus de reconnexion pour les pairs présentant un mauvais comportement (par défaut : %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Extraire les informations de débogage (par défaut : %u, fournir <category> est optionnel)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Utiliser un serveur mandataire SOCKS5 séparé pour atteindre les pairs par les services cachés de Tor (par défaut : %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(par défaut : %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Chiffrements acceptables (par défaut : %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Toujours demander les adresses des pairs par recherche DNS (par défaut : %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Désactiver le mode sans échec, passer outre un événement sans échec réel (par défaut : %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>Erreur lors du chargement de wallet.dat</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Forcer le mode sans échec (par défaut : %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Générer des pièces (défaut : %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Nombre de blocs à vérifier au démarrage (par défaut : %u, 0 = tous)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Inclure les adresses IP à la sortie de débogage (par défaut : %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Adresse -proxy invalide : « %s »</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>Limiter la taille du cache des signatures à <n> entrées (par défaut : %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>Écouter les connexions JSON-RPC sur <port> (par défaut : %u ou tesnet : %u)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Écouter les connexions sur <port> (par défaut : %u ou tesnet : %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Garder au plus <n> connexions avec les pairs (par défaut : %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Tampon maximal de réception par connexion, <n>*1000 octets (par défaut : %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Tampon maximal d'envoi par connexion », <n>*1000 octets (par défaut : %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>N'accepter qu'une chaîne de blocs correspondant aux points de vérification intégrés (par défaut : %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Ajouter l'horodatage au début de la sortie de débogage (par défaut : %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Imprimer l'arborescence des blocs au démarrage (par défaut : %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Relayer et miner les transactions du porteur de données (par défaut : %u)</translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>Relayer les multisignatures non-P2SH (par défaut : %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Exécuter une tâche pour purger le portefeuille périodiquement (par défaut : %u) </translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Définir la taille de la réserve de clefs à <n> (par défaut : %u)</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Définir la taille de bloc minimale en octets (par défaut : %u)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>Définit le drapeau DB_PRIVATE dans l'environnement de la BD du portefeuille (par défaut : %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Spécifier le fichier de configuration (par défaut : %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Spécifier le délai d'expiration de la connexion en millisecondes (minimum : 1, par défaut : %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Spécifier le fichier pid (par défaut : %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Dépenser la monnaie non confirmée lors de l'envoi de transactions (par défaut : %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Cesser l'exécution après l'importation des blocs du disque (par défaut : %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Seuil de déconnexion des pairs présentant un mauvais comportement (par défaut : %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>Réseau inconnu spécifié sur -onlynet : « %s »</translation> </message> diff --git a/src/qt/locale/bitcoin_fr_CA.ts b/src/qt/locale/bitcoin_fr_CA.ts index 56be717a8d..eae0b00b76 100644 --- a/src/qt/locale/bitcoin_fr_CA.ts +++ b/src/qt/locale/bitcoin_fr_CA.ts @@ -1,4 +1,4 @@ -<TS language="fr_CA" version="2.1"> +<TS language="fr_CA" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -77,10 +77,6 @@ <context> <name>CoinControlDialog</name> <message> - <source>Address</source> - <translation>Addresse</translation> - </message> - <message> <source>(no label)</source> <translation>(pas de record)</translation> </message> diff --git a/src/qt/locale/bitcoin_gl.ts b/src/qt/locale/bitcoin_gl.ts index b047bb5a4b..2252baec73 100644 --- a/src/qt/locale/bitcoin_gl.ts +++ b/src/qt/locale/bitcoin_gl.ts @@ -1,4 +1,4 @@ -<TS language="gl" version="2.1"> +<TS language="gl" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -359,10 +359,6 @@ <translation>Barra de ferramentas</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Core de Bitcoin</translation> </message> @@ -394,10 +390,6 @@ <source>No block source available...</source> <translation>Non hai orixe de bloques dispoñible...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Procesados %1 bloques do historial de transacccións.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n hora</numerusform><numerusform>%n horas</numerusform></translation> @@ -521,10 +513,6 @@ Dirección: %4 <translation>Cantidade</translation> </message> <message> - <source>Address</source> - <translation>Dirección</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -792,15 +780,7 @@ Dirección: %4 <source>Error</source> <translation>Erro</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB de espacio libre dispoñible</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(de %1 GB precisados)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -835,14 +815,6 @@ Dirección: %4 <translation>&Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Tarifa por kB de transacción opcional que axuda a asegurar que as túas transaccións son procesadas rapidamente. A maioría das transaccións son 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Pagar &tarifa da transacción</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Comezar Bitcoin automáticamente despois de loguearse no sistema.</translation> </message> @@ -954,10 +926,6 @@ Dirección: %4 <translation>A información amosada por estar desactualizada. O teu moedeiro sincronízase automáticamente coa rede Bitcoin despois de que se estableza unha conexión, pero este proceso non está todavía rematado.</translation> </message> <message> - <source>Wallet</source> - <translation>Moedeiro</translation> - </message> - <message> <source>Your current spendable balance</source> <translation>O teu balance actualmente dispoñible</translation> </message> @@ -982,10 +950,6 @@ Dirección: %4 <translation>O teu balance actual total</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transaccións recentes</b></translation> - </message> - <message> <source>out of sync</source> <translation>non sincronizado</translation> </message> @@ -2071,26 +2035,10 @@ Dirección: %4 <translation>Opcións:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especificar arquivo de configuración (por defecto: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especificar arquivo de pid (por defecto: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especificar directorio de datos</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Escoitar conexións no <porto> (por defecto: 8333 ou testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Manter como moito <n> conexións con pares (por defecto: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Conectar a nodo para recuperar direccións de pares, e desconectar</translation> </message> @@ -2099,18 +2047,6 @@ Dirección: %4 <translation>Especificar a túa propia dirección pública</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Umbral para desconectar pares con mal comportamento (por defecto: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Número de segundos para manter sen reconectar aos pares con mal comportamento (por defecto: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escoitar conexións JSON-RPC no <porto> (por defecto: 8332 ou testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Aceptar liña de comandos e comandos JSON-RPC</translation> </message> @@ -2151,10 +2087,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Cifradores aceptables (por defecto: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Enlazar a unha dirección dada e escoitar sempre nela. Emprega a notación [host]:post para IPv6</translation> </message> @@ -2247,62 +2179,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Erro: Moedeiro bloqueado, imposible crear transacción!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Erro: erro do sistema:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Fallou escoitar en calquera porto. Emprega -listen=0 se queres esto.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Fallou a lectura da información do bloque</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Fallou a lectura do bloque</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Fallou a sincronización do índice do bloque</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Fallou a escritura do índice do bloque</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Fallou a escritura da información do bloque</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Fallou a escritura do bloque</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Fallou a escritura da información do arquivo</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Fallou a escritura na base de datos de moedas</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Fallou a escritura do índice de transaccións</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Fallou a escritura dos datos para desfacer</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Xerar moedas (por defecto: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Cantos bloques para chequear ao arrancar (por defecto: 288, 0 = todos)</translation> - </message> - <message> <source>Incorrect or no genesis block found. Wrong datadir for network?</source> <translation>Bloque genesis incorrecto o no existente. Datadir erróneo para a rede?</translation> </message> @@ -2319,10 +2199,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Reconstruír índice de cadea de bloque dende os ficheiros actuais blk000??.dat</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Fixar o número de fíos para as chamadas aos servicios RPC (por defecto: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Especificar arquivo do moedeiro (dentro do directorio de datos)</translation> </message> @@ -2363,34 +2239,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Cantidade inválida para -mintxfee=<cantidade>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Manter un índice completo de transaccións (por defecto: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Máximo buffer por-conexión para recibir, <n>*1000 bytes (por defecto: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Máximo buffer por-conexión para enviar, <n>*1000 bytes (por defecto: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Aceptar so cadeas de bloques coincidentes con check-points incorporados (por defecto: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Conectar so a nodos na rede <net> (IPv4, IPv6 ou Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Enviar traza/información de depuración á consola en lugar de ao arquivo debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Fixar tamaño mínimo de bloque en bytes (por defecto: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Recortar o arquivo debug.log ao arrancar o cliente (por defecto: 1 cando no-debug)</translation> </message> @@ -2399,14 +2251,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Fallou a sinatura da transacción</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especificar tempo límite da conexión en milisegundos (por defecto: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Erro do sistema:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>A cantidade da transacción é demasiado pequena</translation> </message> @@ -2419,10 +2263,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>A transacción é demasiado grande</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Usar UPnP para mapear o porto de escoita (por defecto: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Usar UPnP para mapear o porto de escoita (por defecto: 1 se á escoita)</translation> </message> @@ -2455,10 +2295,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Actualizar moedeiro ao formato máis recente</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Fixar tamaño do pool de claves a <n> (por defecto: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Rescanear transaccións ausentes na cadea de bloques</translation> </message> @@ -2467,14 +2303,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Empregar OpenSSL (https) para conexións JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Arquivo de certificado do servidor (por defecto: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clave privada do servidor (por defecto: server.perm)</translation> - </message> - <message> <source>This help message</source> <translation>Esta mensaxe de axuda</translation> </message> diff --git a/src/qt/locale/bitcoin_gu_IN.ts b/src/qt/locale/bitcoin_gu_IN.ts index b7b091aa39..ef99b0dd39 100644 --- a/src/qt/locale/bitcoin_gu_IN.ts +++ b/src/qt/locale/bitcoin_gu_IN.ts @@ -1,4 +1,4 @@ -<TS language="gu_IN" version="2.1"> +<TS language="gu_IN" version="2.0"> <context> <name>AddressBookPage</name> </context> diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts index ae96d9f570..b547058986 100644 --- a/src/qt/locale/bitcoin_he.ts +++ b/src/qt/locale/bitcoin_he.ts @@ -1,9 +1,9 @@ -<TS language="he" version="2.1"> +<TS language="he" version="2.0"> <context> <name>AddressBookPage</name> <message> <source>Double-click to edit address or label</source> - <translation>לחץ לחיצה כפולה לערוך כתובת או תוית</translation> + <translation>לחיצה כפולה לעריכת כתובת או תווית</translation> </message> <message> <source>Create a new address</source> @@ -11,15 +11,15 @@ </message> <message> <source>&New</source> - <translation>&חדש</translation> + <translation>&חדשה</translation> </message> <message> <source>Copy the currently selected address to the system clipboard</source> - <translation>העתק את הכתובת המסומנת ללוח העריכה</translation> + <translation>העתקת הכתובת המסומנת ללוח הגזירים</translation> </message> <message> <source>&Copy</source> - <translation>&העתק</translation> + <translation>ה&עתקה</translation> </message> <message> <source>C&lose</source> @@ -27,78 +27,82 @@ </message> <message> <source>&Copy Address</source> - <translation>העתק כתובת</translation> + <translation>העתקת כתובת</translation> </message> <message> <source>Delete the currently selected address from the list</source> - <translation>מחק את הכתובת שנבחרה מהרשימה</translation> + <translation>מחיקת הכתובת שנבחרה מהרשימה</translation> </message> <message> <source>Export the data in the current tab to a file</source> - <translation>יצוא הנתונים בטאב הנוכחי לקובץ</translation> + <translation>יצוא הנתונים מהלשונית הנוכחית לקובץ</translation> </message> <message> <source>&Export</source> - <translation>&ייצא</translation> + <translation>י&צוא</translation> </message> <message> <source>&Delete</source> - <translation>&מחק</translation> + <translation>מ&חיקה</translation> </message> <message> <source>Choose the address to send coins to</source> - <translation>בחר את הכתובת אליה תרצה לשלוח את המטבעות</translation> + <translation>נא לבחור את הכתובת המבוקשת לשליחת המטבעות</translation> </message> <message> <source>Choose the address to receive coins with</source> - <translation>בחר את הכתובת איתה תרצה לקבל את המטבעות</translation> + <translation>נא לבחור את הכתובת המבוקשת לקבלת המטבעות</translation> </message> <message> <source>C&hoose</source> - <translation>בחר</translation> + <translation>בחירה</translation> </message> <message> <source>Sending addresses</source> - <translation>כתובת לשליחה</translation> + <translation>כתובות לשליחה</translation> </message> <message> <source>Receiving addresses</source> - <translation>קבל כתובות</translation> + <translation>כתובות לקבלה</translation> </message> <message> <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> - <translation>אלה כתובת הביטקוין שלך עבור שליחת תשלומים. תמיד בדוק את מספר ואת כתובות מקבלי התשלומים לפני שליחת מטבעות.</translation> + <translation>אלה כתובת הביטקוין שלך לצורך שליחת תשלומים. תמיד יש לבדוק את הכמות ואת כתובות מקבלי התשלומים לפני שליחת מטבעות.</translation> </message> <message> <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> - <translation>אלה כתובות הביטקוין שלך עבור קבלת תשלומים. מומלץ להשתמש בכתובת חדשה לכל פעולה.</translation> + <translation>אלה כתובות הביטקוין שלך לצורך קבלת תשלומים. מומלץ להשתמש בכתובת קבלה חדשה לכל העברה.</translation> </message> <message> <source>Copy &Label</source> - <translation>העתק תוית</translation> + <translation>העתקת &תווית</translation> </message> <message> <source>&Edit</source> - <translation>עריכה</translation> + <translation>ע&ריכה</translation> </message> <message> <source>Export Address List</source> - <translation>ייצוא רשימת כתובות</translation> + <translation>יצוא רשימת כתובות</translation> </message> <message> <source>Comma separated file (*.csv)</source> - <translation>קובץ מופרד בפסיקים (*.csv)</translation> + <translation>קובץ מופרד בפסיקים (*.csv)</translation> </message> <message> <source>Exporting Failed</source> - <translation>הייצוא נכשל</translation> + <translation>היצוא נכשל</translation> </message> - </context> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>אירעה שגיאה בעת הניסיון לשמור את רשימת הכתובת אל %1. נא לנסות שוב.</translation> + </message> +</context> <context> <name>AddressTableModel</name> <message> <source>Label</source> - <translation>תוית</translation> + <translation>תווית</translation> </message> <message> <source>Address</source> @@ -106,34 +110,34 @@ </message> <message> <source>(no label)</source> - <translation>(ללא תוית)</translation> + <translation>(ללא תווית)</translation> </message> </context> <context> <name>AskPassphraseDialog</name> <message> <source>Passphrase Dialog</source> - <translation>שיח סיסמא</translation> + <translation>דו־שיח מילת צופן</translation> </message> <message> <source>Enter passphrase</source> - <translation>הכנס סיסמה</translation> + <translation>נא להזין מילת צופן</translation> </message> <message> <source>New passphrase</source> - <translation>סיסמה חדשה</translation> + <translation>מילת צופן חדשה</translation> </message> <message> <source>Repeat new passphrase</source> - <translation>חזור על הסיסמה החדשה</translation> + <translation>נא לחזור על מילת הצופן החדשה</translation> </message> <message> <source>Encrypt wallet</source> - <translation>הצפן ארנק</translation> + <translation>הצפנת הארנק</translation> </message> <message> <source>This operation needs your wallet passphrase to unlock the wallet.</source> - <translation>הפעולה הזו דורשת את סיסמת הארנק שלך בשביל לפתוח את הארנק.</translation> + <translation>פעולה זו דורשת את מילת הצופן של הארנק שלך כדי לפתוח את הארנק.</translation> </message> <message> <source>Unlock wallet</source> @@ -141,7 +145,7 @@ </message> <message> <source>This operation needs your wallet passphrase to decrypt the wallet.</source> - <translation>הפעולה הזו דורשת את סיסמת הארנק שלך בשביל לפענח את הארנק.</translation> + <translation>פעולה זו דורשת את מילת הצופן של הארנק שלך כדי לפענח את הארנק.</translation> </message> <message> <source>Decrypt wallet</source> @@ -149,39 +153,43 @@ </message> <message> <source>Change passphrase</source> - <translation>שינוי סיסמה</translation> + <translation>שינוי מילת צופן</translation> </message> <message> <source>Enter the old and new passphrase to the wallet.</source> - <translation>הכנס את הסיסמות הישנה והחדשה לארנק.</translation> + <translation>נא להכניס את מילות הצופן הישנה והחדשה לארנק.</translation> </message> <message> <source>Confirm wallet encryption</source> - <translation>אשר הצפנת ארנק</translation> + <translation>אישור הצפנת הארנק</translation> </message> <message> <source>Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>!</source> - <translation>אזהרה: אם אתה מצפין את הארנק ומאבד את הסיסמא, אתה <b>תאבד את כל הביטקוינים שלך</b>!</translation> + <translation>אזהרה: הצפנת הארנק ואיבוד מילת הצופן עשויה להוביל <b>לאיבוד כל הביטקוינים שלך</b>!</translation> </message> <message> <source>Are you sure you wish to encrypt your wallet?</source> - <translation>האם אתה בטוח שברצונך להצפין את הארנק?</translation> + <translation>האם אכן להצפין את הארנק?</translation> </message> <message> <source>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.</source> - <translation>חשוב! כל גיבוי קודם שעשית לארנק שלך יש להחליף עם קובץ הארנק המוצפן שזה עתה נוצר. מסיבות אבטחה, גיבויים קודמים של קובץ הארנק הלא-מוצפן יהפכו לחסרי שימוש ברגע שתתחיל להשתמש בארנק החדש המוצפן.</translation> + <translation>לתשומת לבך: כל גיבוי קודם שביצעת לארנק שלך יש להחליף בקובץ הארנק המוצפן שזה עתה נוצר. מטעמי אבטחה, גיבויים קודמים של קובץ הארנק הבלתי-מוצפן יהפכו לחסרי תועלת עם התחלת השימוש בארנק החדש המוצפן.</translation> </message> <message> <source>Warning: The Caps Lock key is on!</source> - <translation>זהירות: מקש Caps Lock מופעל!</translation> + <translation>זהירות: מקש Caps Lock פעיל!</translation> </message> <message> <source>Wallet encrypted</source> <translation>הארנק הוצפן</translation> </message> <message> + <source>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>.</source> + <translation>נא להזין את מילת הצופן החדשה לארנק.<br/>כדאי להשתמש במילת צופן המורכבת מ<b>עשרה תווים אקראיים ומעלה</b>, או <b>שמונה מילים ומעלה</b>.</translation> + </message> + <message> <source>Bitcoin 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.</source> - <translation>ביטקוין ייסגר עכשיו כדי להשלים את תהליך ההצפנה. זכור שהצפנת הארנק שלך אינו יכול להגן באופן מלא על הביטקוינים שלך מתוכנות זדוניות המושתלות על המחשב.</translation> + <translation>ביטקוין ייסגר כעת כדי להשלים את תהליך ההצפנה. עליך לזכור שהצפנת הארנק שלך אינה מגנה באופן מלא על הביטקוינים שלך מתכניות זדוניות המושתלות על המחשב.</translation> </message> <message> <source>Wallet encryption failed</source> @@ -193,7 +201,7 @@ </message> <message> <source>The supplied passphrases do not match.</source> - <translation>הסיסמות שניתנו אינן תואמות.</translation> + <translation>מילות הצופן שסופקו אינן תואמות.</translation> </message> <message> <source>Wallet unlock failed</source> @@ -201,7 +209,7 @@ </message> <message> <source>The passphrase entered for the wallet decryption was incorrect.</source> - <translation>הסיסמה שהוכנסה לפענוח הארנק שגויה.</translation> + <translation>מילת הצופן שהוכנסה לפענוח הארנק שגויה.</translation> </message> <message> <source>Wallet decryption failed</source> @@ -209,34 +217,38 @@ </message> <message> <source>Wallet passphrase was successfully changed.</source> - <translation>סיסמת הארנק שונתה בהצלחה.</translation> + <translation>מילת הצופן של הארנק שונתה בהצלחה.</translation> </message> </context> <context> <name>BitcoinGUI</name> <message> <source>Sign &message...</source> - <translation>חתום על הודעה</translation> + <translation>&חתימה על הודעה…</translation> </message> <message> <source>Synchronizing with network...</source> - <translation>מסתנכרן עם הרשת...</translation> + <translation>בסנכרון עם הרשת…</translation> </message> <message> <source>&Overview</source> <translation>&סקירה</translation> </message> <message> + <source>Node</source> + <translation>מפרק</translation> + </message> + <message> <source>Show general overview of wallet</source> - <translation>הצג סקירה כללית של הארנק</translation> + <translation>הצגת סקירה כללית של הארנק</translation> </message> <message> <source>&Transactions</source> - <translation>&פעולות</translation> + <translation>ה&עברות</translation> </message> <message> <source>Browse transaction history</source> - <translation>דפדף בהיסטוריית הפעולות</translation> + <translation>עיון בהיסטוריית ההעברות</translation> </message> <message> <source>E&xit</source> @@ -244,67 +256,83 @@ </message> <message> <source>Quit application</source> - <translation>סגור תוכנה</translation> + <translation>יציאה מהתכנית</translation> </message> <message> <source>About &Qt</source> - <translation>אודות Qt</translation> + <translation>על אודות Qt</translation> </message> <message> <source>Show information about Qt</source> - <translation>הצג מידע על Qt</translation> + <translation>הצגת מידע על Qt</translation> </message> <message> <source>&Options...</source> - <translation>&אפשרויות</translation> + <translation>&אפשרויות…</translation> </message> <message> <source>&Encrypt Wallet...</source> - <translation>הצפן ארנק</translation> + <translation>ה&צפנת הארנק…</translation> </message> <message> <source>&Backup Wallet...</source> - <translation>גיבוי ארנק</translation> + <translation>&גיבוי הארנק…</translation> </message> <message> <source>&Change Passphrase...</source> - <translation>שנה סיסמא</translation> + <translation>ה&חלפת מילת הצופן…</translation> + </message> + <message> + <source>&Sending addresses...</source> + <translation>כתובת ה&שליחה…</translation> + </message> + <message> + <source>&Receiving addresses...</source> + <translation>כתובות ה&קבלה…</translation> + </message> + <message> + <source>Open &URI...</source> + <translation>פתיחת &כתובת משאב…</translation> + </message> + <message> + <source>Bitcoin Core client</source> + <translation>לקוח ליבה של ביטקוין</translation> </message> <message> <source>Importing blocks from disk...</source> - <translation>מייבא בלוקים מהדיסק...</translation> + <translation>מקטעים מיובאים מהכונן…</translation> </message> <message> <source>Reindexing blocks on disk...</source> - <translation>מחדש את אינדקס הבלוקים בדיסק...</translation> + <translation>המקטעים נוספים למפתח בכונן…</translation> </message> <message> <source>Send coins to a Bitcoin address</source> - <translation>שלח מטבעות לכתובת ביטקוין</translation> + <translation>שליחת מטבעות לכתובת ביטקוין</translation> </message> <message> <source>Modify configuration options for Bitcoin</source> - <translation>שנה אפשרויות תצורה עבור ביטקוין</translation> + <translation>שינוי התצורה של ביטקוין</translation> </message> <message> <source>Backup wallet to another location</source> - <translation>גיבוי הארנק למקום אחר</translation> + <translation>גיבוי הארנק למיקום אחר</translation> </message> <message> <source>Change the passphrase used for wallet encryption</source> - <translation>שנה את הסיסמה להצפנת הארנק</translation> + <translation>החלפת מילת הצופן להצפנת הארנק</translation> </message> <message> <source>&Debug window</source> - <translation>חלון ניפוי</translation> + <translation>חלון &ניפוי</translation> </message> <message> <source>Open debugging and diagnostic console</source> - <translation>פתח את לוח הבקרה לאבחון וניפוי</translation> + <translation>פתיחת לוח הבקרה לאבחון ולניפוי</translation> </message> <message> <source>&Verify message...</source> - <translation>אמת הודעה...</translation> + <translation>&אימות הודעה…</translation> </message> <message> <source>Bitcoin</source> @@ -316,23 +344,27 @@ </message> <message> <source>&Send</source> - <translation>&שלח</translation> + <translation>&שליחה</translation> </message> <message> <source>&Receive</source> - <translation>וקבל</translation> + <translation>&קבלה</translation> + </message> + <message> + <source>Show information about Bitcoin Core</source> + <translation>הצגת מידע על ליבת ביטקוין</translation> </message> <message> <source>&Show / Hide</source> - <translation>הצג / הסתר</translation> + <translation>ה&צגה / הסתרה</translation> </message> <message> <source>Show or hide the main Window</source> - <translation>הצג או הסתר את החלון הראשי</translation> + <translation>הצגה או הסתרה של החלון הראשי</translation> </message> <message> <source>Encrypt the private keys that belong to your wallet</source> - <translation>הצפן את המפתחות הפרטיים ששייכים לארנק שלך</translation> + <translation>הצפנת המפתחות הפרטיים ששייכים לארנק שלך</translation> </message> <message> <source>Sign messages with your Bitcoin addresses to prove you own them</source> @@ -352,15 +384,11 @@ </message> <message> <source>&Help</source> - <translation>&עזרה</translation> + <translation>ע&זרה</translation> </message> <message> <source>Tabs toolbar</source> - <translation>סרגל כלים טאבים</translation> - </message> - <message> - <source>[testnet]</source> - <translation>[רשת-בדיקה]</translation> + <translation>סרגל כלים לשוניות</translation> </message> <message> <source>Bitcoin Core</source> @@ -368,11 +396,11 @@ </message> <message> <source>Request payments (generates QR codes and bitcoin: URIs)</source> - <translation>בקש תשלומים (מייצר קודיי QR וסכימות URI של :bitcoin)</translation> + <translation>בקשת תשלומים (יצירה של קודים מסוג QR וסכימות כתובות משאב של :bitcoin)</translation> </message> <message> <source>&About Bitcoin Core</source> - <translation>&אודות קליינט ביטקוין</translation> + <translation>על &אודות ליבת ביטקוין</translation> </message> <message> <source>Show the list of used sending addresses and labels</source> @@ -380,19 +408,23 @@ </message> <message> <source>Show the list of used receiving addresses and labels</source> - <translation>הצג את רשימת הכתובות והתויות המשומשות</translation> + <translation>הצגת רשימת הכתובות והתוויות הנמצאות בשימוש</translation> </message> <message> <source>Open a bitcoin: URI or payment request</source> - <translation>פתח ביטקוין: URI או בקשת תשלום</translation> + <translation>פתיחת ביטקוין: כתובת משאב או בקשת תשלום</translation> </message> <message> - <source>No block source available...</source> - <translation>אין קוד נתון</translation> + <source>&Command-line options</source> + <translation>אפשרויות &שורת הפקודה</translation> </message> <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>הושלם עיבוד של %1 בלוקים של היסטוריית פעולות.</translation> + <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> + <translation>הצגת הודעות העזרה של ליבת ביטקוין כדי לקבל רשימה עם אפשרויות שורת הפקודה האפשריות של ביטקוין</translation> + </message> + <message> + <source>No block source available...</source> + <translation>אין מקור מקטעים זמין…</translation> </message> <message numerus="yes"> <source>%n hour(s)</source> @@ -407,12 +439,16 @@ <translation><numerusform>%n שבוע</numerusform><numerusform>%n שבועות</numerusform></translation> </message> <message> + <source>%1 and %2</source> + <translation>%1 ו%2</translation> + </message> + <message> <source>Last received block was generated %1 ago.</source> - <translation>הבלוק האחרון שהתקבל נוצר לפני %1</translation> + <translation>המקטע האחרון שהתקבל נוצר לפני %1.</translation> </message> <message> <source>Transactions after this will not yet be visible.</source> - <translation>לאחר זאת פעולות נספות טרם יהיו גלויות</translation> + <translation>ההעברות שבוצעו לאחר העברה זו לא יופיעו.</translation> </message> <message> <source>Error</source> @@ -432,15 +468,15 @@ </message> <message> <source>Catching up...</source> - <translation>מתעדכן...</translation> + <translation>מתבצע עדכון…</translation> </message> <message> <source>Sent transaction</source> - <translation>פעולה שנשלחה</translation> + <translation>העברת שליחה</translation> </message> <message> <source>Incoming transaction</source> - <translation>פעולה שהתקבלה</translation> + <translation>העברת קבלה</translation> </message> <message> <source>Date: %1 @@ -455,11 +491,11 @@ Address: %4 </message> <message> <source>Wallet is <b>encrypted</b> and currently <b>unlocked</b></source> - <translation>הארנק <b>מוצפן</b> וכרגע <b>פתוח</b></translation> + <translation>הארנק <b>מוצפן</b> ו<b>פתוח</b> כרגע</translation> </message> <message> <source>Wallet is <b>encrypted</b> and currently <b>locked</b></source> - <translation>הארנק <b>מוצפן</b> וכרגע <b>נעול</b></translation> + <translation>הארנק <b>מוצפן</b> ו<b>נעול</b> כרגע</translation> </message> </context> <context> @@ -472,16 +508,12 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>בחירת כתובת שליטת מטבעות</translation> - </message> - <message> <source>Quantity:</source> <translation>כמות:</translation> </message> <message> <source>Bytes:</source> - <translation>בייטים:</translation> + <translation>בתים:</translation> </message> <message> <source>Amount:</source> @@ -489,13 +521,17 @@ Address: %4 </message> <message> <source>Priority:</source> - <translation>קדימות:</translation> + <translation>עדיפות:</translation> </message> <message> <source>Fee:</source> <translation>תשלום:</translation> </message> <message> + <source>Dust:</source> + <translation>אבק:</translation> + </message> + <message> <source>After Fee:</source> <translation>לאחר עמלה:</translation> </message> @@ -505,7 +541,7 @@ Address: %4 </message> <message> <source>(un)select all</source> - <translation>(מחק)(בחר) הכל</translation> + <translation>ביטול/אישור הבחירה</translation> </message> <message> <source>Tree mode</source> @@ -513,17 +549,13 @@ Address: %4 </message> <message> <source>List mode</source> - <translation>מצר רשימה</translation> + <translation>מצב רשימה</translation> </message> <message> <source>Amount</source> <translation>כמות</translation> </message> <message> - <source>Address</source> - <translation>כתובת</translation> - </message> - <message> <source>Date</source> <translation>תאריך</translation> </message> @@ -537,63 +569,67 @@ Address: %4 </message> <message> <source>Priority</source> - <translation>קדימות</translation> + <translation>עדיפות</translation> </message> <message> <source>Copy address</source> - <translation>העתק כתובת</translation> + <translation>העתקת כתובת</translation> </message> <message> <source>Copy label</source> - <translation>העתק תוית</translation> + <translation>העתקת תווית</translation> </message> <message> <source>Copy amount</source> - <translation>העתק כמות</translation> + <translation>העתקת כמות</translation> </message> <message> <source>Copy transaction ID</source> - <translation>העתק מזהה פעולה</translation> + <translation>העתקת מזהה העברה</translation> </message> <message> <source>Lock unspent</source> - <translation>נעל יתרה</translation> + <translation>נעילת יתרה</translation> </message> <message> <source>Unlock unspent</source> - <translation>פתח יתרה</translation> + <translation>פתיחת יתרה</translation> </message> <message> <source>Copy quantity</source> - <translation>העתק כמות</translation> + <translation>העתקת כמות</translation> </message> <message> <source>Copy fee</source> - <translation>העתק מחיר</translation> + <translation>העתקת מחיר</translation> </message> <message> <source>Copy after fee</source> - <translation>העתק אחרי עמלה</translation> + <translation>העתקת אחרי עמלה</translation> </message> <message> <source>Copy bytes</source> - <translation>העתק בייטים</translation> + <translation>העתקת בתים</translation> </message> <message> <source>Copy priority</source> - <translation>העתק קדימות</translation> + <translation>העתקת עדיפות</translation> + </message> + <message> + <source>Copy dust</source> + <translation>העתקת אבק</translation> </message> <message> <source>Copy change</source> - <translation>העתק עודף</translation> + <translation>העתקת עודף</translation> </message> <message> <source>highest</source> - <translation>הכי גבוה</translation> + <translation>הגבוה ביותר</translation> </message> <message> <source>higher</source> - <translation>גבוהה יותר</translation> + <translation>גבוה יותר</translation> </message> <message> <source>high</source> @@ -601,7 +637,7 @@ Address: %4 </message> <message> <source>medium-high</source> - <translation>בנוני גבוה</translation> + <translation>בינוני - גבוה</translation> </message> <message> <source>medium</source> @@ -621,7 +657,15 @@ Address: %4 </message> <message> <source>lowest</source> - <translation>הכי נמוך</translation> + <translation>הנמוך ביותר</translation> + </message> + <message> + <source>none</source> + <translation>ללא</translation> + </message> + <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>יכולה להשתנות ב+/- %1 סטושי לקלט.</translation> </message> <message> <source>yes</source> @@ -633,23 +677,27 @@ Address: %4 </message> <message> <source>This label turns red, if the transaction size is greater than 1000 bytes.</source> - <translation>תווית זו מאדימה במידה וגודל הפעולה עולה על 1000 בייט</translation> + <translation>תווית זו מאדימה אם גודל ההעברה עולה על 1000 בתים.</translation> </message> <message> <source>This means a fee of at least %1 per kB is required.</source> - <translation>זאת אומרת שנחוצה עמלה של לא פחות מ־%1 לכל קילו בייט.</translation> + <translation>זאת אומרת שנחוצה עמלה של לא פחות מ־%1 לכל קילו בית.</translation> </message> <message> <source>Can vary +/- 1 byte per input.</source> - <translation>הערך יכול להיות +/- בייט 1 פר כניסה</translation> + <translation>הערך יכול להיות +/- בית אחד לכל קלט.</translation> </message> <message> <source>Transactions with higher priority are more likely to get included into a block.</source> - <translation>העברות עם עדיפות גבוהה, יותר סיכוי שיכנסו לתוך הבלוק</translation> + <translation>העברות עם עדיפות גבוהה, יותר סיכוי שיכנסו לתוך המקטע.</translation> + </message> + <message> + <source>This label turns red, if the priority is smaller than "medium".</source> + <translation>תווית זו מאדימה אם העדיפות היא פחות מ„בינוני“</translation> </message> <message> <source>(no label)</source> - <translation>(ללא תוית)</translation> + <translation>(אין תווית)</translation> </message> <message> <source>change from %1 (%2)</source> @@ -664,15 +712,15 @@ Address: %4 <name>EditAddressDialog</name> <message> <source>Edit Address</source> - <translation>ערוך כתובת</translation> + <translation>עריכת כתובת</translation> </message> <message> <source>&Label</source> - <translation>ת&וית</translation> + <translation>ת&ווית</translation> </message> <message> <source>The label associated with this address list entry</source> - <translation>התוית המשויכת לרשומה הזו ברשימת הכתובות</translation> + <translation>התווית המשויכת לרשומה הזו ברשימת הכתובות</translation> </message> <message> <source>The address associated with this address list entry. This can only be modified for sending addresses.</source> @@ -692,19 +740,19 @@ Address: %4 </message> <message> <source>Edit receiving address</source> - <translation>ערוך כתובת לקבלה</translation> + <translation>עריכת כתובת לקבלה</translation> </message> <message> <source>Edit sending address</source> - <translation>ערוך כתובת לשליחה</translation> + <translation>עריכת כתובת לשליחה</translation> </message> <message> <source>The entered address "%1" is already in the address book.</source> - <translation>הכתובת שהכנסת "%1" כבר נמצאת בפנקס הכתובות.</translation> + <translation>הכתובת שהוכנסה „%1“ כבר נמצאת בפנקס הכתובות.</translation> </message> <message> <source>The entered address "%1" is not a valid Bitcoin address.</source> - <translation>הכתובת שהוכנסה "%1" אינה כתובת ביטקוין תקינה.</translation> + <translation>הכתובת שהוכנסה „%1“ אינה כתובת ביטקוין תקנית.</translation> </message> <message> <source>Could not unlock wallet.</source> @@ -719,7 +767,7 @@ Address: %4 <name>FreespaceChecker</name> <message> <source>A new data directory will be created.</source> - <translation>ספריית מידע חדשה תיווצר.</translation> + <translation>תיקיית נתונים חדשה תיווצר.</translation> </message> <message> <source>name</source> @@ -727,15 +775,15 @@ Address: %4 </message> <message> <source>Directory already exists. Add %1 if you intend to create a new directory here.</source> - <translation>הספריה כבר קיימת. הוסף %1 אם ברצונך ליצור ספריה חדשה כאן.</translation> + <translation>התיקייה כבר קיימת. ניתן להוסיף %1 אם יש ליצור תיקייה חדשה כאן.</translation> </message> <message> <source>Path already exists, and is not a directory.</source> - <translation>הנתיב כבר קיים ואינו מצביע על ספרייה.</translation> + <translation>הנתיב כבר קיים ואינו מצביע על תיקייה.</translation> </message> <message> <source>Cannot create data directory here.</source> - <translation>לא ניתן ליצור ספריית מידע כאן.</translation> + <translation>לא ניתן ליצור כאן תיקיית נתונים.</translation> </message> </context> <context> @@ -749,6 +797,10 @@ Address: %4 <translation>גרסה</translation> </message> <message> + <source>(%1-bit)</source> + <translation>(%1-סיביות)</translation> + </message> + <message> <source>About Bitcoin Core</source> <translation>על אודות ליבת ביטקוין</translation> </message> @@ -766,21 +818,29 @@ Address: %4 </message> <message> <source>UI options</source> - <translation>אפשרויות ממשק</translation> + <translation>אפשרויות מנשק</translation> </message> <message> <source>Set language, for example "de_DE" (default: system locale)</source> - <translation>קבע שפה, למשל "he_il" (ברירת מחדל: שפת המערכת)</translation> + <translation>הגדרת שפה, למשל „he_il“ (בררת מחדל: שפת המערכת)</translation> </message> <message> <source>Start minimized</source> - <translation>התחל ממוזער</translation> + <translation>התחלה במצב ממוזער</translation> + </message> + <message> + <source>Set SSL root certificates for payment request (default: -system-)</source> + <translation>הגדרות אישורי בסיס של SSL לבקשות תשלום (בררת המחדל: -מערכת-)</translation> </message> <message> <source>Show splash screen on startup (default: 1)</source> - <translation>הצג מסך פתיחה בעת הפעלה (ברירת מחדל: 1)</translation> + <translation>הצגת מסך פתיחה בעת הפעלה (בררת מחדל: 1)</translation> </message> - </context> + <message> + <source>Choose data directory on startup (default: 0)</source> + <translation>בחירת תיקיית נתונים עם ההפעלה (בררת מחדל: 0)</translation> + </message> +</context> <context> <name>Intro</name> <message> @@ -789,54 +849,50 @@ Address: %4 </message> <message> <source>Welcome to Bitcoin Core.</source> - <translation>ברוך הבא לקליינט ביטקוין</translation> + <translation>ברוך בואך לליבת ביטקוין</translation> </message> <message> <source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source> - <translation>מכיוון שזאת הפעם הראשונה שהתוכנה הופעלה תוכל לבחור איפה ביטקויין קור תאכסן את </translation> + <translation>מכיוון שזאת הפעם הראשונה שהתכנית פועלת ניתן לבחור איפה ליבת ביטקוין תאחסן את הנתונים שלה.</translation> </message> <message> <source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source> - <translation>קליינט ביטקוין יוריד וישמור העתק של שרשרת הבלוקים של ביטקוין. לפחות %1GB מהנתונים יאוכסנו בתיקיה הזו, ויגדל עם הזמן. הארנק גם יאוחסן בתיקיה הזו.</translation> + <translation>לקוח ביטקוין יוריד וישמור העתק של שרשרת המקטעים של ביטקוין. לפחות %1 ג״ב מהנתונים יאוחסנו בתיקייה זו, והיא תגדל עם הזמן. הארנק גם יאוחסן בתיקייה הזו.</translation> </message> <message> <source>Use the default data directory</source> - <translation>השתמש בברירת המחדל עבור ספריית המידע.</translation> + <translation>שימוש בבררת המחדל של תיקיית הנתונים.</translation> </message> <message> <source>Use a custom data directory:</source> - <translation>השתמש בספריית מידע מותאמת אישית:</translation> + <translation>שימוש בתיקיית נתונים מותאמת אישית:</translation> </message> <message> <source>Bitcoin Core</source> <translation>ליבת ביטקוין</translation> </message> <message> - <source>Error</source> - <translation>שגיאה</translation> - </message> - <message> - <source>GB of free space available</source> - <translation>ג"ב של שטח אחסון פנוי</translation> + <source>Error: Specified data directory "%1" cannot be created.</source> + <translation>שגיאה: לא ניתן ליצור את תיקיית הנתונים שצוינה „%1“.</translation> </message> <message> - <source>(of %1GB needed)</source> - <translation>(מתוך %1 ג"ב נחוצים)</translation> + <source>Error</source> + <translation>שגיאה</translation> </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> <source>Open URI</source> - <translation>פתח URI</translation> + <translation>פתיחת כתובת משאב</translation> </message> <message> <source>Open payment request from URI or file</source> - <translation>פתח בקשת תשלום מ-URI או קובץ</translation> + <translation>פתיחת בקשת תשלום מכתובת משאב או מקובץ</translation> </message> <message> <source>URI:</source> - <translation>כתובת:</translation> + <translation>כתובת משאב:</translation> </message> <message> <source>Select payment request file</source> @@ -855,63 +911,111 @@ Address: %4 </message> <message> <source>&Main</source> - <translation>ראשי</translation> + <translation>&ראשי</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>עמלת פעולה אופציונלית לכל kB תבטיח שהפעולה שלך תעובד בזריזות. רוב הפעולות הן 1 kB.</translation> + <source>Automatically start Bitcoin after logging in to the system.</source> + <translation>הפעלת ביטקוין אוטומטית לאחר כניסה למערכת.</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>שלם &עמלת פעולה</translation> + <source>&Start Bitcoin on system login</source> + <translation>ה&פעלת ביטקוין בעת הכניסה למערכת</translation> </message> <message> - <source>Automatically start Bitcoin after logging in to the system.</source> - <translation>הפעל את ביטקוין באופן עצמאי לאחר התחברות למערכת.</translation> + <source>Size of &database cache</source> + <translation>גודל מ&טמון מסד הנתונים</translation> </message> <message> - <source>&Start Bitcoin on system login</source> - <translation>התחל את ביטקוין בעת התחברות למערכת</translation> + <source>MB</source> + <translation>מ״ב</translation> </message> <message> - <source>MB</source> - <translation>מגה בייט</translation> + <source>Number of script &verification threads</source> + <translation>מספר תהליכי ה&אימות של הסקריפט</translation> + </message> + <message> + <source>Accept connections from outside</source> + <translation>קבלת חיבורים מבחוץ</translation> + </message> + <message> + <source>Allow incoming connections</source> + <translation>לאפשר חיבורים נכנסים</translation> + </message> + <message> + <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> + <translation>כתובת ה־IP של המתווך (לדוגמה IPv4: 127.0.0.1 / IPv6: ::1)</translation> + </message> + <message> + <source>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 |.</source> + <translation>כתובות צד־שלישי (כגון: סייר מקטעים) שמופיעים בלשונית ההעברות בתור פריטים בתפריט ההקשר. %s בכתובת מוחלף בגיבוב ההעברה. מספר כתובות יופרדו בפס אנכי |.</translation> + </message> + <message> + <source>Third party transaction URLs</source> + <translation>כתובות העברה צד־שלישי</translation> + </message> + <message> + <source>Active command-line options that override above options:</source> + <translation>אפשרויות פעילות בשורת הפקודה שדורסות את האפשרויות שלהלן:</translation> </message> <message> <source>Reset all client options to default.</source> - <translation>אפס כל אפשרויות התוכנה לברירת המחדל.</translation> + <translation>איפוס כל אפשרויות התכנית לבררת המחדל.</translation> </message> <message> <source>&Reset Options</source> - <translation>איפוס אפשרויות</translation> + <translation>&איפוס אפשרויות</translation> </message> <message> <source>&Network</source> - <translation>רשת</translation> + <translation>&רשת</translation> + </message> + <message> + <source>(0 = auto, <0 = leave that many cores free)</source> + <translation>(0 = אוטומטי, <0 = להשאיר כזאת כמות של ליבות חופשיות)</translation> + </message> + <message> + <source>W&allet</source> + <translation>&ארנק</translation> + </message> + <message> + <source>Expert</source> + <translation>מומחה</translation> + </message> + <message> + <source>Enable coin &control features</source> + <translation>הפעלת תכונות &בקרת מטבעות</translation> + </message> + <message> + <source>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.</source> + <translation>אם אפשרות ההשקעה של עודף בלתי מאושר תנוטרל, לא ניתן יהיה להשתמש בעודף מההעברה עד שלהעברה יהיה לפחות אישור אחד. פעולה זו גם משפיעה על חישוב המאזן שלך.</translation> + </message> + <message> + <source>&Spend unconfirmed change</source> + <translation>עודף &בלתי מאושר מההשקעה</translation> </message> <message> <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source> - <translation>פתח את פורט ביטקוין בנתב באופן אוטומטי. עובד רק אם UPnP מאופשר ונתמך ע"י הנתב.</translation> + <translation>פתיחת הפתחה של ביטקוין בנתב באופן אוטומטי. עובד רק אם UPnP מופעל ונתמך בנתב.</translation> </message> <message> <source>Map port using &UPnP</source> - <translation>מיפוי פורט באמצעות UPnP</translation> + <translation>מיפוי פתחה באמצעות UPnP</translation> </message> <message> <source>Proxy &IP:</source> - <translation>כתובת IP של פרוקסי:</translation> + <translation>כתובת ה־IP של המ&תווך:</translation> </message> <message> <source>&Port:</source> - <translation>פורט:</translation> + <translation>&פתחה:</translation> </message> <message> <source>Port of the proxy (e.g. 9050)</source> - <translation>הפורט של הפרוקסי (למשל 9050)</translation> + <translation>הפתחה של המתווך (למשל 9050)</translation> </message> <message> <source>&Window</source> - <translation>חלון</translation> + <translation>&חלון</translation> </message> <message> <source>Show only a tray icon after minimizing the window.</source> @@ -919,59 +1023,75 @@ Address: %4 </message> <message> <source>&Minimize to the tray instead of the taskbar</source> - <translation>מ&זער למגש במקום לשורת המשימות</translation> + <translation>מ&זעור למגש במקום לשורת המשימות</translation> </message> <message> <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source> - <translation>מזער את התוכנה במקום לצאת ממנה כשהחלון נסגר. כשאפשרות זו פעילה, התוכנה תיסגר רק לאחר בחירת יציאה מהתפריט.</translation> + <translation>מזעור התכנית במקום לצאת ממנה כשהחלון נסגר. כשאפשרות זו פעילה, התכנית תיסגר רק לאחר בחירת יציאה מהתפריט.</translation> </message> <message> <source>M&inimize on close</source> - <translation>מזער בעת סגירה</translation> + <translation>מ&זעור עם סגירה</translation> </message> <message> <source>&Display</source> - <translation>תצוגה</translation> + <translation>ת&צוגה</translation> </message> <message> <source>User Interface &language:</source> - <translation>שפת ממשק המשתמש:</translation> + <translation>&שפת מנשק המשתמש:</translation> </message> <message> <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source> - <translation>ניתן לקבוע כאן את שפת ממשק המשתמש. הגדרה זו תחול לאחר הפעלה מחדש של ביטקוין.</translation> + <translation>להלן ניתן לקבוע את שפת מנשק המשתמש. הגדרה זו תיכנס לתוקף לאחר הפעלה מחדש של ביטקוין.</translation> </message> <message> <source>&Unit to show amounts in:</source> - <translation>יחידת מדידה להצגת כמויות:</translation> + <translation>י&חידת מידה להצגת כמויות:</translation> </message> <message> <source>Choose the default subdivision unit to show in the interface and when sending coins.</source> - <translation>בחר את ברירת המחדל ליחידת החלוקה אשר תוצג בממשק ובעת שליחת מטבעות.</translation> + <translation>ניתן לבחור את בררת המחדל ליחידת החלוקה שתוצג במנשק ובעת שליחת מטבעות.</translation> </message> <message> <source>Whether to show coin control features or not.</source> - <translation>הצג תכונות שליטת מטבע או לא.</translation> + <translation>האם להציג תכונות שליטת מטבע או לא.</translation> </message> <message> <source>&OK</source> - <translation>אישור</translation> + <translation>&אישור</translation> </message> <message> <source>&Cancel</source> - <translation>ביטול</translation> + <translation>&ביטול</translation> </message> <message> <source>default</source> - <translation>ברירת מחדל</translation> + <translation>בררת מחדל</translation> + </message> + <message> + <source>none</source> + <translation>ללא</translation> </message> <message> <source>Confirm options reset</source> - <translation>אשר את איפוס האפשרויות</translation> + <translation>אישור איפוס האפשרויות</translation> + </message> + <message> + <source>Client restart required to activate changes.</source> + <translation>נדרשת הפעלה מחדש של הלקוח כדי להפעיל את השינויים.</translation> + </message> + <message> + <source>Client will be shutdown, do you want to proceed?</source> + <translation>הלקוח יכבה, האם להמשיך?</translation> + </message> + <message> + <source>This change would require a client restart.</source> + <translation>שינוי זה ידרוש הפעלה מחדש של תכנית הלקוח.</translation> </message> <message> <source>The supplied proxy address is invalid.</source> - <translation>כתובת הפרוקסי שסופקה אינה תקינה.</translation> + <translation>כתובת המתווך שסופקה אינה תקינה.</translation> </message> </context> <context> @@ -982,19 +1102,27 @@ Address: %4 </message> <message> <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source> - <translation>המידע המוצג עשוי להיות מיושן. הארנק שלך מסתנכרן באופן אוטומטי עם רשת הביטקוין לאחר כינון חיבור, אך התהליך טרם הסתיים.</translation> + <translation>המידע המוצג עשוי להיות מיושן. הארנק שלך מסתנכרן באופן אוטומטי עם רשת הביטקוין לאחר יצירת החיבור, אך התהליך טרם הסתיים.</translation> </message> <message> - <source>Wallet</source> - <translation>ארנק</translation> + <source>Watch-only:</source> + <translation>צפייה בלבד:</translation> + </message> + <message> + <source>Available:</source> + <translation>זמין:</translation> </message> <message> <source>Your current spendable balance</source> <translation>היתרה הזמינה הנוכחית</translation> </message> <message> + <source>Pending:</source> + <translation>בהמתנה:</translation> + </message> + <message> <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source> - <translation>הסכום הכולל של פעולות שטרם אושרו, ועוד אינן נספרות בחישוב היתרה הזמינה</translation> + <translation>הסכום הכולל של העברות שטרם אושרו ועדיין אינן נספרות בחישוב היתרה הזמינה</translation> </message> <message> <source>Immature:</source> @@ -1005,6 +1133,10 @@ Address: %4 <translation>מאזן שנכרה וטרם הבשיל</translation> </message> <message> + <source>Balances</source> + <translation>מאזנים</translation> + </message> + <message> <source>Total:</source> <translation>סך הכול:</translation> </message> @@ -1013,27 +1145,59 @@ Address: %4 <translation>סך כל היתרה הנוכחית שלך</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>פעולות אחרונות</b></translation> + <source>Your current balance in watch-only addresses</source> + <translation>המאזן הנוכחי שלך בכתובות לקריאה בלבד</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>העברות אחרונות</translation> + </message> + <message> + <source>Unconfirmed transactions to watch-only addresses</source> + <translation>העברות בלתי מאושרות לכתובות לצפייה בלבד</translation> + </message> + <message> + <source>Mined balance in watch-only addresses that has not yet matured</source> + <translation>מאזן לאחר כרייה בכתובות לצפייה בלבד שעדיין לא הבשילו</translation> + </message> + <message> + <source>Current total balance in watch-only addresses</source> + <translation>המאזן הכולל הנוכחי בכתובות לצפייה בלבד</translation> </message> <message> <source>out of sync</source> - <translation>לא מסונכרן</translation> + <translation>לא בסנכרון</translation> </message> </context> <context> <name>PaymentServer</name> <message> <source>URI handling</source> - <translation>תפעול URI</translation> + <translation>תפעול כתובות משאב</translation> </message> <message> <source>Invalid payment address %1</source> <translation>כתובת תשלום שגויה %1</translation> </message> <message> + <source>Payment request rejected</source> + <translation>בקשת התשלום נדחתה</translation> + </message> + <message> + <source>Payment request network doesn't match client network.</source> + <translation>רשת בקשת התשלום אינה תואמת לרשת הלקוח.</translation> + </message> + <message> + <source>Payment request has expired.</source> + <translation>בקשת התשלום פגה.</translation> + </message> + <message> + <source>Payment request is not initialized.</source> + <translation>בקשת התשלום לא החלה.</translation> + </message> + <message> <source>Requested payment amount of %1 is too small (considered dust).</source> - <translation>הסכום הנדרש לתשלום %1 קטן מדי (נחשב לאבק)</translation> + <translation>הסכום על סך %1 הנדרש לתשלום קטן מדי (נחשב לאבק)</translation> </message> <message> <source>Payment request error</source> @@ -1041,11 +1205,27 @@ Address: %4 </message> <message> <source>Cannot start bitcoin: click-to-pay handler</source> - <translation>לא ניתן להתחיל את ביטקוין: מפעיל לחץ-לתשלום </translation> + <translation>לא ניתן להתחיל את ביטקוין: טיפול בלחיצה–לתשלום </translation> + </message> + <message> + <source>Payment request fetch URL is invalid: %1</source> + <translation>כתובת אחזור בקשת התשלום שגויה: %1</translation> + </message> + <message> + <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source> + <translation>לא ניתן לנתח את כתובת המשאב! מצב זה יכול לקרות עקב כתובת ביטקוין שגויה או פרמטרים שגויים בכתובת המשאב.</translation> + </message> + <message> + <source>Payment request file handling</source> + <translation>טיפול בקובצי בקשות תשלום</translation> + </message> + <message> + <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source> + <translation>לא ניתן לקרוא את קובץ בקשת התשלום! מצב כזה יכול לקרות בעקבות קובץ בקשת תשלום פגום.</translation> </message> <message> <source>Unverified payment requests to custom payment scripts are unsupported.</source> - <translation>בקשות לתשלום לסקריפטיי תשלום מותאמים אישית אינן נתמכות.</translation> + <translation>בקשות תשלום בלתי מאומתות לסקריפטים לתשלום מותאמים אישית אינן נתמכות.</translation> </message> <message> <source>Refund from %1</source> @@ -1056,6 +1236,10 @@ Address: %4 <translation>שגיאה בתקשורת עם %1: %2</translation> </message> <message> + <source>Payment request cannot be parsed!</source> + <translation>לא ניתן לפענח את בקשת התשלום!</translation> + </message> + <message> <source>Bad response from server %1</source> <translation>מענה שגוי משרת %1</translation> </message> @@ -1070,7 +1254,19 @@ Address: %4 </context> <context> <name>PeerTableModel</name> - </context> + <message> + <source>User Agent</source> + <translation>סוכן משתמש</translation> + </message> + <message> + <source>Address/Hostname</source> + <translation>כתובת/שם מארח</translation> + </message> + <message> + <source>Ping Time</source> + <translation>זמן המענה</translation> + </message> +</context> <context> <name>QObject</name> <message> @@ -1078,54 +1274,86 @@ Address: %4 <translation>כמות</translation> </message> <message> + <source>Enter a Bitcoin address (e.g. %1)</source> + <translation>נא להזין כתובת ביטקוין (למשל: %1)</translation> + </message> + <message> + <source>%1 d</source> + <translation>%1 ימים</translation> + </message> + <message> <source>%1 h</source> <translation>%1 שעות</translation> </message> <message> + <source>%1 m</source> + <translation>%1 דקות</translation> + </message> + <message> + <source>%1 s</source> + <translation>%1 שניות</translation> + </message> + <message> + <source>NETWORK</source> + <translation>רשת</translation> + </message> + <message> + <source>UNKNOWN</source> + <translation>לא ידוע</translation> + </message> + <message> + <source>None</source> + <translation>ללא</translation> + </message> + <message> <source>N/A</source> - <translation>N/A</translation> + <translation>לא זמין</translation> </message> - </context> + <message> + <source>%1 ms</source> + <translation>%1 מילישניות</translation> + </message> +</context> <context> <name>QRImageWidget</name> <message> <source>&Save Image...</source> - <translation>&שמור תמונה..</translation> + <translation>&שמירת תמונה…</translation> </message> <message> <source>&Copy Image</source> - <translation>&העתק תמונה</translation> + <translation>ה&עתקת תמונה</translation> </message> <message> <source>Save QR Code</source> - <translation>שמור קוד QR</translation> + <translation>שמירת קוד QR</translation> </message> <message> <source>PNG Image (*.png)</source> - <translation>תמונת PNG (*.png)</translation> + <translation>תמונת PNG (*.png)</translation> </message> </context> <context> <name>RPCConsole</name> <message> <source>Client name</source> - <translation>שם ממשק</translation> + <translation>שם לקוח</translation> </message> <message> <source>N/A</source> - <translation>N/A</translation> + <translation>לא זמין</translation> </message> <message> <source>Client version</source> - <translation>גרסת ממשק</translation> + <translation>גרסת מנשק</translation> </message> <message> <source>&Information</source> - <translation>מידע</translation> + <translation>מי&דע</translation> </message> <message> <source>Debug window</source> - <translation>חלון דיבאג</translation> + <translation>חלון ניפוי</translation> </message> <message> <source>General</source> @@ -1133,11 +1361,15 @@ Address: %4 </message> <message> <source>Using OpenSSL version</source> - <translation>משתמש ב-OpenSSL גרסה</translation> + <translation>שימוש ב־OpenSSL גרסה</translation> + </message> + <message> + <source>Using BerkeleyDB version</source> + <translation>שימוש ב־BerkeleyDB גרסה</translation> </message> <message> <source>Startup time</source> - <translation>זמן אתחול</translation> + <translation>זמן עלייה</translation> </message> <message> <source>Network</source> @@ -1153,23 +1385,91 @@ Address: %4 </message> <message> <source>Block chain</source> - <translation>שרשרת הבלוקים</translation> + <translation>שרשרת מקטעים</translation> </message> <message> <source>Current number of blocks</source> - <translation>מספר הבלוקים הנוכחי</translation> + <translation>מספר המקטעים הנוכחי</translation> + </message> + <message> + <source>Received</source> + <translation>התקבלו</translation> + </message> + <message> + <source>Sent</source> + <translation>נשלחו</translation> + </message> + <message> + <source>&Peers</source> + <translation>&עמיתים</translation> + </message> + <message> + <source>Select a peer to view detailed information.</source> + <translation>נא לבחור בעמית כדי להציג מידע מפורט.</translation> + </message> + <message> + <source>Direction</source> + <translation>כיוון</translation> + </message> + <message> + <source>Version</source> + <translation>גרסה</translation> + </message> + <message> + <source>User Agent</source> + <translation>סוכן משתמש</translation> + </message> + <message> + <source>Services</source> + <translation>שירותים</translation> + </message> + <message> + <source>Starting Height</source> + <translation>גובה התחלתי</translation> + </message> + <message> + <source>Sync Height</source> + <translation>גובה הסנכרון</translation> + </message> + <message> + <source>Ban Score</source> + <translation>דירוג חסימה</translation> + </message> + <message> + <source>Connection Time</source> + <translation>זמן החיבור</translation> + </message> + <message> + <source>Last Send</source> + <translation>שליחה אחרונה</translation> + </message> + <message> + <source>Last Receive</source> + <translation>קבלה אחרונה</translation> + </message> + <message> + <source>Bytes Sent</source> + <translation>בתים שנשלחו</translation> + </message> + <message> + <source>Bytes Received</source> + <translation>בתים שהתקבלו</translation> + </message> + <message> + <source>Ping Time</source> + <translation>זמן המענה</translation> </message> <message> <source>Last block time</source> - <translation>זמן הבלוק האחרון</translation> + <translation>זמן המקטע האחרון</translation> </message> <message> <source>&Open</source> - <translation>פתח</translation> + <translation>&פתיחה</translation> </message> <message> <source>&Console</source> - <translation>לוח בקרה</translation> + <translation>מ&סוף בקרה</translation> </message> <message> <source>&Network Traffic</source> @@ -1177,7 +1477,7 @@ Address: %4 </message> <message> <source>&Clear</source> - <translation>& נקה</translation> + <translation>&ניקוי</translation> </message> <message> <source>Totals</source> @@ -1193,7 +1493,7 @@ Address: %4 </message> <message> <source>Build date</source> - <translation>תאריך בניה</translation> + <translation>תאריך בנייה</translation> </message> <message> <source>Debug log file</source> @@ -1201,41 +1501,65 @@ Address: %4 </message> <message> <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source> - <translation>פתח את קובץ יומן הניפוי מתיקיית הנתונים הנוכחית. זה עשוי לקחת מספר שניות עבור קובצי יומן גדולים.</translation> + <translation>פתיחת קובץ יומן הניפוי מתיקיית הנתונים הנוכחית. פעולה זו עשויה להימשך מספר שניות עבור קובצי יומן גדולים.</translation> </message> <message> <source>Clear console</source> - <translation>נקה לוח בקרה</translation> + <translation>ניקוי מסוף הבקרה</translation> </message> <message> <source>Welcome to the Bitcoin RPC console.</source> - <translation>ברוכים הבאים ללוח בקרת RPC של ביטקוין</translation> + <translation>ברוכים הבאים למסוף ה־RPC של ביטקוין.</translation> </message> <message> <source>Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen.</source> - <translation>השתמש בחיצים למעלה ולמטה כדי לנווט בהיסטוריה, ו- <b>Ctrl-L</b> כדי לנקות את המסך.</translation> + <translation>יש להשתמש בחצים למעלה ולמטה כדי לנווט בהיסטוריה, וב־<b>Ctrl-L</b> כדי לנקות את המסך.</translation> </message> <message> <source>Type <b>help</b> for an overview of available commands.</source> - <translation>הקלד <b>help</b> בשביל סקירה של הפקודות הזמינות.</translation> + <translation>ניתן להקליד <b>help</b> לקבלת סקירה של הפקודות הזמינות.</translation> </message> <message> <source>%1 B</source> - <translation>%1 בייט</translation> + <translation>%1 ב׳</translation> </message> <message> <source>%1 KB</source> - <translation>%1 קילו בייט</translation> + <translation>%1 ק״ב</translation> </message> <message> <source>%1 MB</source> - <translation>%1 מגה בייט</translation> + <translation>%1 מ״ב</translation> </message> <message> <source>%1 GB</source> - <translation>%1 ג'יגה בייט</translation> + <translation>%1 ג״ב</translation> </message> - </context> + <message> + <source>via %1</source> + <translation>דרך %1</translation> + </message> + <message> + <source>never</source> + <translation>לעולם לא</translation> + </message> + <message> + <source>Inbound</source> + <translation>תעבורה נכנסת</translation> + </message> + <message> + <source>Outbound</source> + <translation>תעבורה יוצאת</translation> + </message> + <message> + <source>Unknown</source> + <translation>לא ידוע</translation> + </message> + <message> + <source>Fetching...</source> + <translation>מתקבל…</translation> + </message> +</context> <context> <name>ReceiveCoinsDialog</name> <message> @@ -1244,55 +1568,79 @@ Address: %4 </message> <message> <source>&Label:</source> - <translation>ת&וית:</translation> + <translation>ת&ווית:</translation> </message> <message> <source>&Message:</source> - <translation>&הודעה:</translation> + <translation>הו&דעה:</translation> </message> <message> <source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source> - <translation>השתמש שוב באחת מכתובות הקבלה שכבר נעשה בהן שימוש. לשימוש חוזר בכתובות ישהן השלכות אבטחה ופרטיות. השתמש בזה רק אם אתה מייצר מחדש בקשת תשלום שכבר נעשתה.</translation> + <translation>ניתן להשתמש שוב באחת מכתובות הקבלה שכבר נעשה בהן שימוש. לשימוש חוזר בכתובות ישנן השלכות אבטחה ופרטיות. מומלץ שלא להשתמש באפשרות זו למעט יצירה מחדש של בקשת תשלום שנוצרה בעבר.</translation> </message> <message> <source>R&euse an existing receiving address (not recommended)</source> - <translation>ש&ימוש חוזר בכתובת קבלה קיימת(לא מומלץ)</translation> + <translation>ש&ימוש &חוזר בכתובת קבלה קיימת (לא מומלץ)</translation> + </message> + <message> + <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source> + <translation>הודעת רשות לצירוף לבקשת התשלום שתוצג בעת פתיחת הבקשה. לתשומת לבך: ההודעה לא תישלח עם התשלום ברשת ביטקוין.</translation> + </message> + <message> + <source>An optional label to associate with the new receiving address.</source> + <translation>תווית רשות לשיוך עם כתובת הקבלה החדשה.</translation> + </message> + <message> + <source>Use this form to request payments. All fields are <b>optional</b>.</source> + <translation>יש להשתמש בטופס זה כדי לבקש תשלומים. כל השדות הם בגדר <b>רשות</b>.</translation> + </message> + <message> + <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source> + <translation>סכום כרשות לבקשה. ניתן להשאיר זאת ריק כדי לא לבקש סכום מסוים.</translation> </message> <message> <source>Clear all fields of the form.</source> - <translation>נקה את כל השדות</translation> + <translation>ניקוי כל השדות של הטופס.</translation> </message> <message> <source>Clear</source> - <translation>נקה</translation> + <translation>ניקוי</translation> + </message> + <message> + <source>Requested payments history</source> + <translation>היסטוריית בקשות תשלום</translation> </message> <message> <source>&Request payment</source> - <translation>&בקש תשלום</translation> + <translation>&בקשת תשלום</translation> </message> <message> <source>Show the selected request (does the same as double clicking an entry)</source> - <translation>הצג בקשות נבחרות (דומה ללחיצה כפולה על רשומה)</translation> + <translation>הצגת בקשות נבחרות (דומה ללחיצה כפולה על רשומה)</translation> </message> <message> <source>Show</source> - <translation>הצג</translation> + <translation>הצגה</translation> </message> <message> <source>Remove the selected entries from the list</source> - <translation>הסר הרשומות הנבחרות מהרשימה</translation> + <translation>הסרת הרשומות הנבחרות מהרשימה</translation> </message> <message> <source>Remove</source> - <translation>הסר</translation> + <translation>הסרה</translation> </message> <message> <source>Copy label</source> - <translation>העתק תוית</translation> + <translation>העתקת תווית</translation> + </message> + <message> + <source>Copy message</source> + <translation>העתקת הודעה</translation> </message> <message> <source>Copy amount</source> - <translation>העתק כמות</translation> + <translation>העתקת כמות</translation> </message> </context> <context> @@ -1303,27 +1651,27 @@ Address: %4 </message> <message> <source>Copy &URI</source> - <translation>העתק &URI</translation> + <translation>העתקת &כתובת משאב</translation> </message> <message> <source>Copy &Address</source> - <translation>התעק &כתובת</translation> + <translation>העתקת &כתובת</translation> </message> <message> <source>&Save Image...</source> - <translation>&שמור תמונה..</translation> + <translation>&שמירת תמונה…</translation> </message> <message> <source>Request payment to %1</source> - <translation>בקש תשלום ל %1</translation> + <translation>בקשת תשלום לטובת %1</translation> </message> <message> <source>Payment information</source> - <translation>אנפרומצייה על התשלום</translation> + <translation>מידע על תשלום</translation> </message> <message> <source>URI</source> - <translation>כתובת (אתר או משאב)</translation> + <translation>כתובת משאב</translation> </message> <message> <source>Address</source> @@ -1335,7 +1683,7 @@ Address: %4 </message> <message> <source>Label</source> - <translation>תוית</translation> + <translation>תווית</translation> </message> <message> <source>Message</source> @@ -1343,11 +1691,11 @@ Address: %4 </message> <message> <source>Resulting URI too long, try to reduce the text for label / message.</source> - <translation>המזהה המתקבל ארוך מדי, נסה להפחית את הטקסט בתוית / הודעה.</translation> + <translation>כתובת המשאב המתקבלת ארוכה מדי, כדאי לנסות לצמצם את הטקסט בתווית / הודעה.</translation> </message> <message> <source>Error encoding URI into QR Code.</source> - <translation>שגיאה בקידוד URI לקוד QR</translation> + <translation>שגיאה בקידוד כתובת משאב לקוד QR</translation> </message> </context> <context> @@ -1358,7 +1706,7 @@ Address: %4 </message> <message> <source>Label</source> - <translation>תוית</translation> + <translation>תווית</translation> </message> <message> <source>Message</source> @@ -1370,30 +1718,34 @@ Address: %4 </message> <message> <source>(no label)</source> - <translation>(ללא תוית)</translation> + <translation>(אין תווית)</translation> </message> <message> <source>(no message)</source> - <translation>(אין הודעות)</translation> + <translation>(אין הודעה)</translation> </message> - </context> + <message> + <source>(no amount)</source> + <translation>(אין סכום)</translation> + </message> +</context> <context> <name>SendCoinsDialog</name> <message> <source>Send Coins</source> - <translation>שלח מטבעות</translation> + <translation>שליחת מטבעות</translation> </message> <message> <source>Coin Control Features</source> - <translation>ה</translation> + <translation>תכונות בקרת מטבעות</translation> </message> <message> <source>Inputs...</source> - <translation>כניסות...</translation> + <translation>קלטים…</translation> </message> <message> <source>automatically selected</source> - <translation>נבחר אוטומאטית</translation> + <translation>בבחירה אוטומטית</translation> </message> <message> <source>Insufficient funds!</source> @@ -1405,19 +1757,19 @@ Address: %4 </message> <message> <source>Bytes:</source> - <translation>בייטים:</translation> + <translation>בתים:</translation> </message> <message> <source>Amount:</source> - <translation>כמות:</translation> + <translation>סכום:</translation> </message> <message> <source>Priority:</source> - <translation>קדימות:</translation> + <translation>עדיפות:</translation> </message> <message> <source>Fee:</source> - <translation>תשלום:</translation> + <translation>עמלה:</translation> </message> <message> <source>After Fee:</source> @@ -1425,7 +1777,11 @@ Address: %4 </message> <message> <source>Change:</source> - <translation>שינוי:</translation> + <translation>עודף:</translation> + </message> + <message> + <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source> + <translation>אם אפשרות זו מופעלת אך כתובת העודף ריקה או שגויה, העודף יישלח לכתובת חדשה שתיווצר.</translation> </message> <message> <source>Custom change address</source> @@ -1433,35 +1789,39 @@ Address: %4 </message> <message> <source>Send to multiple recipients at once</source> - <translation>שלח למספר מקבלים בו-זמנית</translation> + <translation>שליחה למספר מוטבים בו־זמנית</translation> </message> <message> <source>Add &Recipient</source> - <translation>הוסף מקבל</translation> + <translation>הוספת &מוטב</translation> </message> <message> <source>Clear all fields of the form.</source> - <translation>נקה את כל השדות</translation> + <translation>ניקוי של כל השדות בטופס.</translation> + </message> + <message> + <source>Dust:</source> + <translation>אבק:</translation> </message> <message> <source>Clear &All</source> - <translation>נקה הכל</translation> + <translation>ניקוי ה&כול</translation> </message> <message> <source>Balance:</source> - <translation>יתרה:</translation> + <translation>מאזן:</translation> </message> <message> <source>Confirm the send action</source> - <translation>אשר את פעולת השליחה</translation> + <translation>אישור פעולת השליחה</translation> </message> <message> <source>S&end</source> - <translation>שלח</translation> + <translation>&שליחה</translation> </message> <message> <source>Confirm send coins</source> - <translation>אשר שליחת מטבעות</translation> + <translation>אישור שליחת מטבעות</translation> </message> <message> <source>%1 to %2</source> @@ -1469,31 +1829,35 @@ Address: %4 </message> <message> <source>Copy quantity</source> - <translation>העתק כמות</translation> + <translation>העתקת כמות</translation> </message> <message> <source>Copy amount</source> - <translation>העתק כמות</translation> + <translation>העתקת סכום</translation> </message> <message> <source>Copy fee</source> - <translation>העתק מחיר</translation> + <translation>העתקת עמלה</translation> </message> <message> <source>Copy after fee</source> - <translation>העתק אחרי עמלה</translation> + <translation>העתקת אחרי עמלה</translation> </message> <message> <source>Copy bytes</source> - <translation>העתק בייטים</translation> + <translation>העתקת בתים</translation> </message> <message> <source>Copy priority</source> - <translation>העתק קדימות</translation> + <translation>העתקת עדיפות</translation> </message> <message> <source>Copy change</source> - <translation>העתק עודף</translation> + <translation>העתקת עודף</translation> + </message> + <message> + <source>Total Amount %1 (= %2)</source> + <translation>הסכום הכולל %1 (= %2)</translation> </message> <message> <source>or</source> @@ -1501,11 +1865,11 @@ Address: %4 </message> <message> <source>The recipient address is not valid, please recheck.</source> - <translation>כתובת המקבל אינה תקינה, אנא בדוק שנית.</translation> + <translation>כתובת המוטב אינה תקינה, נא לבדוק שוב.</translation> </message> <message> <source>The amount to pay must be larger than 0.</source> - <translation>הכמות לשלם חייבת להיות גדולה מ-0.</translation> + <translation>הכמות לתשלום חייבת להיות גדולה מ־0.</translation> </message> <message> <source>The amount exceeds your balance.</source> @@ -1513,7 +1877,7 @@ Address: %4 </message> <message> <source>The total exceeds your balance when the %1 transaction fee is included.</source> - <translation>הכמות הכוללת, ובכללה עמלת פעולה בסך %1, עולה על המאזן שלך.</translation> + <translation>הכמות הכוללת, ובכללה עמלת העברה בסך %1, עולה על המאזן שלך.</translation> </message> <message> <source>Duplicate address found, can only send to each address once per send operation.</source> @@ -1521,11 +1885,27 @@ Address: %4 </message> <message> <source>Transaction creation failed!</source> - <translation>יצירת הפעולה נכשלה!</translation> + <translation>יצירת ההעברה נכשלה!</translation> + </message> + <message> + <source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source> + <translation>ההעברה נדחתה! מצב כזה עשוי לקרות אם חלק מהמטבעות בארנק שלך כבר הושקעו, כמו למשל עקב שימוש בעותק של wallet.dat והמטבעות הושקעו בעותק אבל לא סומנו כאילו הושקעו דרך כאן.</translation> + </message> + <message> + <source>Warning: Invalid Bitcoin address</source> + <translation>אזהרה: כתובת ביטקוין שגויה</translation> </message> <message> <source>(no label)</source> - <translation>(ללא תוית)</translation> + <translation>(אין תווית)</translation> + </message> + <message> + <source>Warning: Unknown change address</source> + <translation>אזהרה: כתובת עודף בלתי ידועה</translation> + </message> + <message> + <source>Copy dust</source> + <translation>העתקת אבק</translation> </message> <message> <source>Are you sure you want to send?</source> @@ -1533,48 +1913,56 @@ Address: %4 </message> <message> <source>added as transaction fee</source> - <translation>הוסף מחיר טיפול</translation> + <translation>נוסף כעמלת העברה</translation> </message> </context> <context> <name>SendCoinsEntry</name> <message> <source>A&mount:</source> - <translation>כ&מות:</translation> + <translation>&כמות:</translation> </message> <message> <source>Pay &To:</source> - <translation>שלם &ל:</translation> + <translation>לשלם ל&טובת:</translation> </message> <message> <source>Enter a label for this address to add it to your address book</source> - <translation>הכנס תוית לכתובת הזאת כדי להכניס לפנקס הכתובות</translation> + <translation>נא להכניס תווית לכתובת הזאת כדי להוסיף לפנקס הכתובות</translation> </message> <message> <source>&Label:</source> - <translation>ת&וית:</translation> + <translation>ת&ווית:</translation> </message> <message> <source>Choose previously used address</source> - <translation>בחר כתובת שהייתה בשימוש</translation> + <translation>בחירת כתובת שהייתה בשימוש</translation> </message> <message> <source>This is a normal payment.</source> <translation>זהו תשלום רגיל.</translation> </message> <message> + <source>The Bitcoin address to send the payment to</source> + <translation>כתובת הביטקוין של המוטב</translation> + </message> + <message> <source>Alt+A</source> <translation>Alt+A</translation> </message> <message> <source>Paste address from clipboard</source> - <translation>הדבר כתובת מהלוח</translation> + <translation>הדבקת כתובת מלוח הגזירים</translation> </message> <message> <source>Alt+P</source> <translation>Alt+P</translation> </message> <message> + <source>Remove this entry</source> + <translation>הסרת רשומה זו</translation> + </message> + <message> <source>Message:</source> <translation>הודעה:</translation> </message> @@ -1584,7 +1972,11 @@ Address: %4 </message> <message> <source>Enter a label for this address to add it to the list of used addresses</source> - <translation>הקלד תווית עבור כתובת זו בכדי להוסיף אותה לרשימת הכתובות בשימוש</translation> + <translation>יש להזין תווית עבור כתובת זו כדי להוסיף אותה לרשימת הכתובות בשימוש</translation> + </message> + <message> + <source>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.</source> + <translation>הודעה שצורפה לביטקוין: כתובת שתאוחסן בהעברה לצורך מעקב מצדך. לתשומת לבך: הודעה זו לא תישלח ברשת הביטקוין.</translation> </message> <message> <source>This is an unverified payment request.</source> @@ -1592,7 +1984,7 @@ Address: %4 </message> <message> <source>Pay To:</source> - <translation>תשלום ל:</translation> + <translation>תשלום לטובת:</translation> </message> <message> <source>Memo:</source> @@ -1602,6 +1994,10 @@ Address: %4 <context> <name>ShutdownWindow</name> <message> + <source>Bitcoin Core is shutting down...</source> + <translation>ליבת ביטקוין נסגרת…</translation> + </message> + <message> <source>Do not shut down the computer until this window disappears.</source> <translation>אין לכבות את המחשב עד שחלון זה נעלם.</translation> </message> @@ -1610,19 +2006,23 @@ Address: %4 <name>SignVerifyMessageDialog</name> <message> <source>Signatures - Sign / Verify a Message</source> - <translation>חתימות - חתום או אמת הודעה</translation> + <translation>חתימות - חתימה או אימות של הודעה</translation> </message> <message> <source>&Sign Message</source> - <translation>חתום על הו&דעה</translation> + <translation>חתימה על הו&דעה</translation> </message> <message> <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source> - <translation>אתה יכול לחתום על הודעות עם הכתובות שלך כדי להוכיח שהן בבעלותך. היזהר לא לחתום על משהו מעורפל, שכן התקפות פישינג עשויות לגרום לך בעורמה למסור את זהותך. חתום רק על אמרות מפורטות לחלוטין שאתה מסכים עימן.</translation> + <translation>ניתן לחתום על הודעות עם הכתובות שלך כדי להוכיח שהן בבעלותך. מומלץ להיזהר לא לחתום על משהו מפוקפק, שכן התקפות דיוג עשויות לגרום לך בעורמה למסור את זהותך. רצוי לחתום רק על הצהרות מפורטות לחלוטין שהסכמת עמן.</translation> + </message> + <message> + <source>The Bitcoin address to sign the message with</source> + <translation>כתובת הביטקוין אתה לחתום אתה את ההודעה</translation> </message> <message> <source>Choose previously used address</source> - <translation>בחר כתובת שהייתה בשימוש</translation> + <translation>בחירת כתובת שהייתה בשימוש</translation> </message> <message> <source>Alt+A</source> @@ -1630,7 +2030,7 @@ Address: %4 </message> <message> <source>Paste address from clipboard</source> - <translation>הדבק כתובת מהלוח</translation> + <translation>הדבקת כתובת מלוח הגזירים</translation> </message> <message> <source>Alt+P</source> @@ -1638,7 +2038,7 @@ Address: %4 </message> <message> <source>Enter the message you want to sign here</source> - <translation>הכנס כאן את ההודעה שעליך ברצונך לחתום</translation> + <translation>יש להוסיף כאן את ההודעה עליה לחתום</translation> </message> <message> <source>Signature</source> @@ -1646,47 +2046,51 @@ Address: %4 </message> <message> <source>Copy the current signature to the system clipboard</source> - <translation>העתק את החתימה הנוכחית ללוח המערכת</translation> + <translation>העתקת החתימה הנוכחית ללוח הגזירים</translation> </message> <message> <source>Sign the message to prove you own this Bitcoin address</source> - <translation>חתום על ההודעה כדי להוכיח שכתובת הביטקוין הזו בבעלותך.</translation> + <translation>ניתן לחתום על ההודעה כדי להוכיח שכתובת הביטקוין הזו בבעלותך.</translation> </message> <message> <source>Sign &Message</source> - <translation>חתום על הודעה</translation> + <translation>&חתימה על הודעה</translation> </message> <message> <source>Reset all sign message fields</source> - <translation>אפס את כל שדות החתימה על הודעה</translation> + <translation>איפוס כל שדות החתימה על הודעה</translation> </message> <message> <source>Clear &All</source> - <translation>נקה הכל</translation> + <translation>&ניקוי הכול</translation> </message> <message> <source>&Verify Message</source> - <translation>אמת הודעה</translation> + <translation>&אימות הודעה</translation> </message> <message> <source>Enter the signing 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.</source> <translation>הכנס למטה את הכתובת החותמת, ההודעה (ודא שאתה מעתיק מעברי שורה, רווחים, טאבים וכו' באופן מדויק) והחתימה כדי לאמת את ההודעה. היזהר לא לפרש את החתימה כיותר ממה שמופיע בהודעה החתומה בעצמה, כדי להימנע מליפול קורבן למתקפת איש-באמצע.</translation> </message> <message> + <source>The Bitcoin address the message was signed with</source> + <translation>כתובת הביטקוין שאתה נחתמה ההודעה</translation> + </message> + <message> <source>Verify the message to ensure it was signed with the specified Bitcoin address</source> - <translation>אמת את ההודעה כדי להבטיח שהיא נחתמה עם כתובת הביטקוין הנתונה</translation> + <translation>ניתן לאמת את ההודעה כדי להבטיח שהיא נחתמה עם כתובת הביטקוין הנתונה</translation> </message> <message> <source>Verify &Message</source> - <translation>אימות הודעה</translation> + <translation>&אימות הודעה</translation> </message> <message> <source>Reset all verify message fields</source> - <translation>אפס את כל שדות אימות הודעה</translation> + <translation>איפוס כל שדות אימות ההודעה</translation> </message> <message> <source>Click "Sign Message" to generate signature</source> - <translation>לחץ "חתום על ההודעה" כדי לחולל חתימה</translation> + <translation>יש ללחוץ על „חתימה על ההודעה“ כדי לחולל חתימה</translation> </message> <message> <source>The entered address is invalid.</source> @@ -1694,7 +2098,7 @@ Address: %4 </message> <message> <source>Please check the address and try again.</source> - <translation>אנא בדוק את הכתובת ונסה שנית.</translation> + <translation>נא לבדוק את הכתובת לנסות שנית.</translation> </message> <message> <source>The entered address does not refer to a key.</source> @@ -1722,7 +2126,7 @@ Address: %4 </message> <message> <source>Please check the signature and try again.</source> - <translation>אנא בדוק את החתימה ונסה שנית.</translation> + <translation>נא לבדוק את החתימה ולנסות שנית.</translation> </message> <message> <source>The signature did not match the message digest.</source> @@ -1744,6 +2148,10 @@ Address: %4 <translation>ליבת ביטקוין</translation> </message> <message> + <source>The Bitcoin Core developers</source> + <translation>מתכנתי ליבת ביטקוין</translation> + </message> + <message> <source>[testnet]</source> <translation>[רשת-בדיקה]</translation> </message> @@ -1752,14 +2160,18 @@ Address: %4 <name>TrafficGraphWidget</name> <message> <source>KB/s</source> - <translation>קילו בייט לשניה</translation> + <translation>ק״ב/ש׳</translation> </message> </context> <context> <name>TransactionDesc</name> <message> <source>Open until %1</source> - <translation>פתוח עד %1</translation> + <translation>פתוחה עד %1</translation> + </message> + <message> + <source>conflicted</source> + <translation>מתנגש</translation> </message> <message> <source>%1/offline</source> @@ -1767,7 +2179,7 @@ Address: %4 </message> <message> <source>%1/unconfirmed</source> - <translation>%1/ממתין לאישור</translation> + <translation>%1/המתנה לאישור</translation> </message> <message> <source>%1 confirmations</source> @@ -1802,8 +2214,12 @@ Address: %4 <translation>כתובת עצמית</translation> </message> <message> + <source>watch-only</source> + <translation>צפייה בלבד</translation> + </message> + <message> <source>label</source> - <translation>תוית</translation> + <translation>תווית</translation> </message> <message> <source>Credit</source> @@ -1818,12 +2234,20 @@ Address: %4 <translation>חיוב</translation> </message> <message> + <source>Total debit</source> + <translation>סך כל החיוב</translation> + </message> + <message> + <source>Total credit</source> + <translation>סך כל האשראי</translation> + </message> + <message> <source>Transaction fee</source> - <translation>עמלת פעולה</translation> + <translation>עמלת העברה</translation> </message> <message> <source>Net amount</source> - <translation>כמות נקיה</translation> + <translation>כמות נקייה</translation> </message> <message> <source>Message</source> @@ -1835,7 +2259,7 @@ Address: %4 </message> <message> <source>Transaction ID</source> - <translation>זיהוי פעולה</translation> + <translation>מזהה העברה</translation> </message> <message> <source>Merchant</source> @@ -1843,7 +2267,7 @@ Address: %4 </message> <message> <source>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.</source> - <translation>מטבעות חדשים שנוצרו חייבים להבשיל במשך %1 בלוקים לפני שניתן לנצל אותם. כשבלוק זה נוצר הוא שודר ברשת על מנת שייכנס לשרשרת הבלוקים. במקרה והוא לא ייכנס לשרשרת, מצבו ישתנה ל"לא התקבל" ולא ניתן יהיה לנצלו. זה יכול לקרות מדי פעם אם במקרה צומת אחרת ייצרה בלוק בהבדל של שניות בודדות ממך.</translation> + <translation>מטבעות חדשים שנוצרו חייבים להבשיל במשך %1 מקטעים לפני שניתן לנצל אותם. כשמקטע זה נוצר הוא משודר ברשת על מנת שייכנס לשרשרת המקטעים. אם הוא לא ייכנס לשרשרת, מצבו ישתנה ל„לא התקבל“ ולא ניתן יהיה לנצלו. מצב כזה יכול לקרות מדי פעם אם במקרה מפרק אחר יצר מקטע בהבדל של שניות בודדות ממך.</translation> </message> <message> <source>Debug information</source> @@ -1851,7 +2275,7 @@ Address: %4 </message> <message> <source>Transaction</source> - <translation>פעולה</translation> + <translation>העברה</translation> </message> <message> <source>Inputs</source> @@ -1875,7 +2299,7 @@ Address: %4 </message> <message numerus="yes"> <source>Open for %n more block(s)</source> - <translation><numerusform>פתח למשך בלוק %n יותר</numerusform><numerusform>פתח למשך %n בלוקים נוספים</numerusform></translation> + <translation><numerusform>פתיחה למשך מקטע %n נוסף</numerusform><numerusform>פתיחה למשך %n מקטעים נוספים</numerusform></translation> </message> <message> <source>unknown</source> @@ -1886,11 +2310,11 @@ Address: %4 <name>TransactionDescDialog</name> <message> <source>Transaction details</source> - <translation>פרטי הפעולה</translation> + <translation>פרטי ההעברה</translation> </message> <message> <source>This pane shows a detailed description of the transaction</source> - <translation>חלונית זו מציגה תיאור מפורט של הפעולה</translation> + <translation>חלונית זו מציגה תיאור מפורט של ההעברה</translation> </message> </context> <context> @@ -1907,13 +2331,17 @@ Address: %4 <source>Address</source> <translation>כתובת</translation> </message> + <message> + <source>Immature (%1 confirmations, will be available after %2)</source> + <translation>לא בשל (%1 אישורים, יהיו זמינים לאחר %2)</translation> + </message> <message numerus="yes"> <source>Open for %n more block(s)</source> - <translation><numerusform>פתח למשך בלוק %n יותר</numerusform><numerusform>פתח למשך %n בלוקים נוספים</numerusform></translation> + <translation><numerusform>פתח למשך בלוק %n יותר</numerusform><numerusform>פתיחה למשך %n מקטעים נוספים</numerusform></translation> </message> <message> <source>Open until %1</source> - <translation>פתוח עד %1</translation> + <translation>פתוחה עד %1</translation> </message> <message> <source>Confirmed (%1 confirmations)</source> @@ -1921,13 +2349,29 @@ Address: %4 </message> <message> <source>This block was not received by any other nodes and will probably not be accepted!</source> - <translation>הבלוק הזה לא נקלט על ידי אף צומת אחר, וכנראה לא יתקבל!</translation> + <translation>המקטע הזה לא נקלט על ידי אף מפרק אחר, וכנראה לא יתקבל!</translation> </message> <message> <source>Generated but not accepted</source> <translation>נוצר אך לא התקבל</translation> </message> <message> + <source>Offline</source> + <translation>מנותק</translation> + </message> + <message> + <source>Unconfirmed</source> + <translation>ללא אישור</translation> + </message> + <message> + <source>Confirming (%1 of %2 recommended confirmations)</source> + <translation>מתקבל אישור (%1 מתוך %2 אישורים מומלצים)</translation> + </message> + <message> + <source>Conflicted</source> + <translation>מתנגש</translation> + </message> + <message> <source>Received with</source> <translation>התקבל עם</translation> </message> @@ -1937,7 +2381,7 @@ Address: %4 </message> <message> <source>Sent to</source> - <translation>נשלח ל</translation> + <translation>נשלח אל</translation> </message> <message> <source>Payment to yourself</source> @@ -1948,24 +2392,32 @@ Address: %4 <translation>נכרה</translation> </message> <message> + <source>watch-only</source> + <translation>צפייה בלבד</translation> + </message> + <message> <source>(n/a)</source> - <translation>(n/a)</translation> + <translation>(לא זמין)</translation> </message> <message> <source>Transaction status. Hover over this field to show number of confirmations.</source> - <translation>מצב הפעולה. השהה את הסמן מעל שדה זה כדי לראות את מספר האישורים.</translation> + <translation>מצב ההעברה. יש להמתין עם הסמן מעל שדה זה כדי לראות את מספר האישורים.</translation> </message> <message> <source>Date and time that the transaction was received.</source> - <translation>התאריך והשעה בה הפעולה הזאת התקבלה.</translation> + <translation>התאריך והשעה בה ההעברה הזאת התקבלה.</translation> </message> <message> <source>Type of transaction.</source> - <translation>סוג הפעולה.</translation> + <translation>סוג ההעברה.</translation> + </message> + <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>האם כתובות לצפייה בלבד מעורבות בהעברה זאת או שלא.</translation> </message> <message> <source>Destination address of transaction.</source> - <translation>כתובת היעד של הפעולה.</translation> + <translation>כתובת היעד של ההעברה.</translation> </message> <message> <source>Amount removed from or added to balance.</source> @@ -1976,7 +2428,7 @@ Address: %4 <name>TransactionView</name> <message> <source>All</source> - <translation>הכל</translation> + <translation>הכול</translation> </message> <message> <source>Today</source> @@ -2000,7 +2452,7 @@ Address: %4 </message> <message> <source>Range...</source> - <translation>טווח...</translation> + <translation>טווח…</translation> </message> <message> <source>Received with</source> @@ -2008,7 +2460,7 @@ Address: %4 </message> <message> <source>Sent to</source> - <translation>נשלח ל</translation> + <translation>נשלח אל</translation> </message> <message> <source>To yourself</source> @@ -2024,7 +2476,7 @@ Address: %4 </message> <message> <source>Enter address or label to search</source> - <translation>הכנס כתובת או תוית לחפש</translation> + <translation>נא להכניס כתובת או תווית לחיפוש</translation> </message> <message> <source>Min amount</source> @@ -2032,47 +2484,55 @@ Address: %4 </message> <message> <source>Copy address</source> - <translation>העתק כתובת</translation> + <translation>העתקת כתובת</translation> </message> <message> <source>Copy label</source> - <translation>העתק תוית</translation> + <translation>העתקת תווית</translation> </message> <message> <source>Copy amount</source> - <translation>העתק כמות</translation> + <translation>העתקת כמות</translation> </message> <message> <source>Copy transaction ID</source> - <translation>העתק מזהה פעולה</translation> + <translation>העתקת מזהה העברה</translation> </message> <message> <source>Edit label</source> - <translation>ערוך תוית</translation> + <translation>עריכת תווית</translation> </message> <message> <source>Show transaction details</source> - <translation>הצג פרטי פעולה</translation> + <translation>הצגת פרטי העברה</translation> </message> <message> <source>Export Transaction History</source> - <translation>יצוא היסטוריית פעולות</translation> + <translation>יצוא היסטוריית העברות</translation> + </message> + <message> + <source>Watch-only</source> + <translation>צפייה בלבד</translation> </message> <message> <source>Exporting Failed</source> - <translation>הייצוא נכשל</translation> + <translation>היצוא נכשל</translation> + </message> + <message> + <source>There was an error trying to save the transaction history to %1.</source> + <translation>אירעה שגיאה בעת ניסיון לשמור את היסטוריית ההעברות אל %1.</translation> </message> <message> <source>Exporting Successful</source> - <translation>הייצוא בוצע בהצלחה</translation> + <translation>היצוא בוצע בהצלחה</translation> </message> <message> <source>The transaction history was successfully saved to %1.</source> - <translation>היסטוריית הפעולות נשמרה ל־%1 בהצלחה.</translation> + <translation>היסטוריית ההעברות נשמרה ל־%1 בהצלחה.</translation> </message> <message> <source>Comma separated file (*.csv)</source> - <translation>קובץ מופרד בפסיקים (*.csv)</translation> + <translation>קובץ מופרד בפסיקים (*.csv)</translation> </message> <message> <source>Confirmed</source> @@ -2088,7 +2548,7 @@ Address: %4 </message> <message> <source>Label</source> - <translation>תוית</translation> + <translation>תווית</translation> </message> <message> <source>Address</source> @@ -2109,7 +2569,11 @@ Address: %4 </context> <context> <name>UnitDisplayStatusBarControl</name> - </context> + <message> + <source>Unit to show amounts in. Click to select another unit.</source> + <translation>יחידת המידה להצגת הסכומים. יש ללחוץ כדי לבחור ביחידת מידה אחרת.</translation> + </message> +</context> <context> <name>WalletFrame</name> <message> @@ -2121,34 +2585,42 @@ Address: %4 <name>WalletModel</name> <message> <source>Send Coins</source> - <translation>שלח מטבעות</translation> + <translation>שליחת מטבעות</translation> </message> </context> <context> <name>WalletView</name> <message> <source>&Export</source> - <translation>&ייצא</translation> + <translation>י&צוא</translation> </message> <message> <source>Export the data in the current tab to a file</source> - <translation>יצוא הנתונים בטאב הנוכחי לקובץ</translation> + <translation>יצוא הנתונים מהלשונית הנוכחית לקובץ</translation> </message> <message> <source>Backup Wallet</source> - <translation>גבה ארנק</translation> + <translation>גיבוי ארנק</translation> </message> <message> <source>Wallet Data (*.dat)</source> - <translation>נתוני ארנק (*.dat)</translation> + <translation>נתוני ארנק (*.dat)</translation> </message> <message> <source>Backup Failed</source> <translation>גיבוי נכשל</translation> </message> <message> + <source>There was an error trying to save the wallet data to %1.</source> + <translation>אירעה שגיאה בעת ניסיון לשמירת נתוני הארנק אל %1.</translation> + </message> + <message> + <source>The wallet data was successfully saved to %1.</source> + <translation>נתוני הארנק נשמרו בהצלחה אל %1.</translation> + </message> + <message> <source>Backup Successful</source> - <translation>גיבוי הושלם בהצלחה</translation> + <translation>הגיבוי הושלם בהצלחה</translation> </message> </context> <context> @@ -2158,60 +2630,32 @@ Address: %4 <translation>אפשרויות:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>ציין קובץ הגדרות (ברירת מחדל: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>ציין קובץ pid (ברירת מחדל: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> - <translation>ציין תיקיית נתונים</translation> - </message> - <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>האזן לחיבורים ב<פורט> (ברירת מחדל: 8333 או ברשת הבדיקה: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>החזק לכל היותר <n> חיבורים לעמיתים (ברירת מחדל: 125)</translation> + <translation>ציון תיקיית נתונים</translation> </message> <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> - <translation>התחבר לצומת כדי לדלות כתובות עמיתים, ואז התנתק</translation> + <translation>יש להתחבר למפרק כדי לדלות כתובות עמיתים ואז להתנתק</translation> </message> <message> <source>Specify your own public address</source> - <translation>ציין את הכתובת הפומבית שלך</translation> - </message> - <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>סף להתנתקות מעמיתים הנוהגים שלא כהלכה (ברירת מחדל: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>מספר שניות למנוע מעמיתים הנוהגים שלא כהלכה מלהתחבר מחדש (ברירת מחדל: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>האזן לחיבורי JSON-RPC ב- <port> (ברירת מחדל: 8332 או רשת בדיקה: 18332)</translation> + <translation>נא לציין את הכתובת הפומבית שלך</translation> </message> <message> <source>Accept command line and JSON-RPC commands</source> - <translation>קבל פקודות משורת הפקודה ו- JSON-RPC</translation> + <translation>קבלת פקודות משורת הפקודה ומ־JSON-RPC</translation> </message> <message> <source>Run in the background as a daemon and accept commands</source> - <translation>רוץ ברקע כדימון וקבל פקודות</translation> + <translation>ריצה כסוכן ברקע וקבלת פקודות</translation> </message> <message> <source>Use the test network</source> - <translation>השתמש ברשת הבדיקה</translation> + <translation>שימוש ברשת הבדיקה</translation> </message> <message> <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source> - <translation>קבל חיבורים מבחוץ (ברירת מחדל: 1 ללא -proxy או -connect)</translation> + <translation>קבלת חיבורים מבחוץ (בררת מחדל: 1 ללא -proxy או -connect)</translation> </message> <message> <source>%s, you must set a rpcpassword in the configuration file: @@ -2225,61 +2669,77 @@ If the file does not exist, create it with owner-readable-only file permissions. It is also recommended to set alertnotify so you are notified of problems; for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </source> - <translation>%s, עליך לקבוע סיסמת RPC בקובץ הקונפיגורציה: + <translation>%s, עליך להגדיר את ססמת ה־RPC בקובץ התצורה: %s -מומלץ להשתמש בסיסמא האקראית הבאה: +מומלץ להשתמש בססמה האקראית הבאה: rpcuser=bitcoinrpc rpcpassword=%s -(אין צורך לזכור את הסיסמה) -אסור ששם המשתמש והסיסמא יהיו זהים. -אם הקובץ אינו קיים, צור אותו עם הרשאות קריאה לבעלים בלבד. -זה מומלץ לסמן alertnotify כדי לקבל דיווח על תקלות; +(אין צורך לזכור את הססמה) +אסור ששם המשתמש והססמה יהיו זהים. +אם הקובץ אינו קיים, יש ליצור אותו עם הרשאות קריאה לבעלים בלבד. +כמו כן, מומלץ להגדיר את alertnotify כדי לקבל דיווח על תקלות; למשל: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>צפנים קבילים (ברירת מחדל: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> + <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> + <translation>להתאגד לכתובת נתונה להאזין לה תמיד. יש להשתמש בצורה [host]:port עבור IPv6.</translation> </message> <message> - <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> - <translation>קשור עם כתובת נתונה והאזן לה תמיד. השתמש בסימון [host]:port עבוד IPv6.</translation> + <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> + <translation>מחיקת כל העברות הארנק ולשחזר רק את החלקים המסוימים בשרשרת המקטעים באמצעות -rescan עם ההפעלה</translation> + </message> + <message> + <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> + <translation>כניסה למצב בדיקת נסיגה, שמשתמש בשרשרת מיוחדת בה ניתן לפתור את המקטעים במהירות.</translation> </message> <message> <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source> - <translation>שגיאה: הפעולה נדחתה! זה עלול לקרות אם כמה מהמטבעות בארנק שלך כבר נוצלו, למשל אם השתמשת בעותק של wallet.dat ומטבעות נשלחו בעותק אך לא סומנו כמנוצלות כאן.</translation> + <translation>שגיאה: ההעברה נדחתה! מצב כזה עלול לקרות אם כמה מהמטבעות בארנק שלך כבר נוצלו, למשל אם השתמשת בעותק של wallet.dat ומטבעות נשלחו בעותק אך לא סומנו כמושקעות כאן.</translation> </message> <message> <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source> - <translation>שגיאה: הפעולה הזאת דורשת עמלת פעולה של לפחות %s עקב הכמות, המורכבות, או השימוש בכספים שהתקבלו לאחרונה!</translation> + <translation>שגיאה: ההעברה הזאת דורשת עמלת פעולה של לפחות %s עקב הכמות, המורכבות או השימוש בכספים שהתקבלו לאחרונה!</translation> </message> <message> <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source> - <translation>בצע פקודה כאשר פעולת ארנק משתנה (%s ב cmd יוחלף ב TxID)</translation> + <translation>ביצוע פקודה כאשר העברה בארנק משתנה (%s ב־cmd יוחלף ב־TxID)</translation> </message> <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>זוהי בניית ניסיון טרום-שחרור - השימוש בה על אחריותך - אין להשתמש לצורך כריה או יישומי מסחר</translation> </message> <message> + <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source> + <translation>לא ניתן להתאגד אל %s במחשב זה. כנראה שליבת ביטקוין כבר פועלת.</translation> + </message> + <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> - <translation>אזהרה: -paytxfee נקבע לערך מאד גבוה! זוהי עמלת הפעולה שתשלם אם אתה שולח פעולה.</translation> + <translation>אזהרה: -paytxfee נקבע לערך מאד גבוה! זוהי עמלת הפעולה שתשולם בעת העברת שליחה.</translation> </message> <message> <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source> - <translation>אזהרה: נראה שלא כל הרשת מסכימה! נראה שישנם כורים אשר נתקלים בבעיות.</translation> + <translation>אזהרה: נראה שלא כל הרשת מסכימה! נראה שישנם כורים שנתקלים בבעיות.</translation> </message> <message> <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source> - <translation>אזהרה: נראה שאנחנו לא מסכימים לחלוטין עם העמיתים שלנו! ייתכן ואנחנו צריכים לשדרג, או שצמתים אחרות צריכות לשדרג.</translation> + <translation>אזהרה: נראה שישנה אי־הסכמה בינינו לבין שאר העמיתים שלנו! יתכן שעדיף לשדרג או שכל שאר העמיתים צריכים לשדרג.</translation> </message> <message> <source>Warning: error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source> - <translation>אזהרה: שגיאה בקריאת wallet.dat! כל המתפחות נקראו באופן תקין, אך נתוני הפעולות או ספר הכתובות עלולים להיות חסרים או שגויים.</translation> + <translation>אזהרה: שגיאה בקריאת wallet.dat! כל המפתחות נקראו באופן תקין, אך נתוני ההעברות או ספר הכתובות עלולים להיות חסרים או שגויים.</translation> </message> <message> <source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source> - <translation>אזהרה: קובץ wallet.dat מושחת, המידע חולץ! קובץ wallet.dat המקורח נשמר כ - wallet.{timestamp}.bak ב - %s; אם המאזן או הפעולות שגויים עליך לשחזר גיבוי.</translation> + <translation>אזהרה: הקובץ wallet.dat הושחת, המידע חולץ! קובץ ה־wallet.dat המקורי נשמר בשם wallet.{timestamp}.bak במיקום %s; אם המאזן או ההעברות שגויים עליך לשחזר גיבוי.</translation> + </message> + <message> + <source>(default: 1)</source> + <translation>(בררת מחדל: 1)</translation> + </message> + <message> + <source><category> can be:</source> + <translation><קטגוריה> יכולה להיות:</translation> </message> <message> <source>Attempt to recover private keys from a corrupt wallet.dat</source> @@ -2287,7 +2747,7 @@ rpcpassword=%s </message> <message> <source>Block creation options:</source> - <translation>אפשרויות יצירת בלוק:</translation> + <translation>אפשרויות יצירת מקטע:</translation> </message> <message> <source>Connect only to the specified node(s)</source> @@ -2299,19 +2759,27 @@ rpcpassword=%s </message> <message> <source>Corrupted block database detected</source> - <translation>התגלה מסד נתוני בלוקים לא תקין</translation> + <translation>התגלה מסד נתוני מקטעים לא תקין</translation> + </message> + <message> + <source>Debugging/Testing options:</source> + <translation>אפשרויות ניפוי/בדיקה:</translation> </message> <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> - <translation>גלה את כתובת ה-IP העצמית (ברירת מחדל: 1 כשמאזינים וללא -externalip)</translation> + <translation>לגלות את כתובת ה־IP העצמית (בררת מחדל: 1 בעת האזנה וללא -externalip)</translation> + </message> + <message> + <source>Do not load the wallet and disable wallet RPC calls</source> + <translation>לא לטעון את הארנק ולנטרל קריאות RPC</translation> </message> <message> <source>Do you want to rebuild the block database now?</source> - <translation>האם תרצה כעט לבנות מחדש את מסד נתוני הבלוקים?</translation> + <translation>האם לבנות מחדש את מסד נתוני המקטעים?</translation> </message> <message> <source>Error initializing block database</source> - <translation>שגיאה באתחול מסד נתוני הבלוקים</translation> + <translation>שגיאה באתחול מסד נתוני המקטעים</translation> </message> <message> <source>Error initializing wallet database environment %s!</source> @@ -2319,209 +2787,229 @@ rpcpassword=%s </message> <message> <source>Error loading block database</source> - <translation>שגיאה בטעינת מסד נתוני הבלוקים</translation> + <translation>שגיאה בטעינת מסד נתוני המקטעים</translation> </message> <message> <source>Error opening block database</source> - <translation>שגיאה בטעינת מסד נתוני הבלוקים</translation> + <translation>שגיאה בטעינת מסד נתוני המקטעים</translation> </message> <message> <source>Error: Disk space is low!</source> - <translation>שגיאה: מעט מקום פנוי בדיסק!</translation> + <translation>שגיאה: מעט מקום פנוי בכונן!</translation> </message> <message> <source>Error: Wallet locked, unable to create transaction!</source> - <translation>שגיאה: הארנק נעול, אין אפשרות ליצור פעולה!</translation> - </message> - <message> - <source>Error: system error: </source> - <translation>שגיאה: שגיאת מערכת:</translation> + <translation>שגיאה: הארנק נעול, אין אפשרות ליצור העברה!</translation> </message> <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>האזנה נכשלה בכל פורט. השתמש ב- -listen=0 אם ברצונך בכך.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>קריאת מידע הבלוקים נכשלה</translation> + <source>If <category> is not supplied, output all debugging information.</source> + <translation>אם לא סופקה <קטגוריה> יש לייצא את כל פרטי הניפוי.</translation> + </message> + <message> + <source>Importing...</source> + <translation>מתבצע יבוא…</translation> + </message> + <message> + <source>Incorrect or no genesis block found. Wrong datadir for network?</source> + <translation>מקטע הפתיח הוא שגוי או לא נמצא. תיקיית נתונים שגויה עבור הרשת?</translation> + </message> + <message> + <source>Invalid -onion address: '%s'</source> + <translation>כתובת onion- שגויה: '%s'</translation> </message> <message> - <source>Failed to read block</source> - <translation>קריאת הבלוק נכשלה</translation> + <source>Not enough file descriptors available.</source> + <translation>אין מספיק מידע על הקובץ</translation> </message> <message> - <source>Failed to sync block index</source> - <translation>סנכרון אינדקס הבלוקים נכשל</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>תמיד להתחבר למפרקים ברשת <net> (ipv4, ipv6 או onion)</translation> </message> <message> - <source>Failed to write block index</source> - <translation>כתיבת אינדקס הבלוקים נכשל</translation> + <source>Rebuild block chain index from current blk000??.dat files</source> + <translation>בנייה מחדש של מפתח שרשרת המקטעים מקובצי ה־blk000??.dat הנוכחיים.</translation> </message> <message> - <source>Failed to write block info</source> - <translation>כתיבת מידע הבלוקים נכשל</translation> + <source>Set database cache size in megabytes (%d to %d, default: %d)</source> + <translation>הגדרת גודל מטמון מסדי הנתונים במגה בתים (%d עד %d, בררת מחדל: %d)</translation> </message> <message> - <source>Failed to write block</source> - <translation>כתיבת הבלוק נכשלה</translation> + <source>Set maximum block size in bytes (default: %d)</source> + <translation>הגדרת קובץ מקטע מרבי בבתים (בררת מחדל: %d)</translation> </message> <message> - <source>Failed to write file info</source> - <translation>כתיבת מידע הקבצים נכשלה</translation> + <source>Specify wallet file (within data directory)</source> + <translation>ציון קובץ ארנק (בתוך תיקיית הנתונים)</translation> </message> <message> - <source>Failed to write to coin database</source> - <translation>כתיבת מסד נתוני המטבעות נכשלה</translation> + <source>This is intended for regression testing tools and app development.</source> + <translation>תכונה זו מיועדת לכלי בדיקות נסיגה ופיתוח יישומים.</translation> </message> <message> - <source>Failed to write transaction index</source> - <translation>כתיבת אינדקס הפעולות נכשלה</translation> + <source>Verifying blocks...</source> + <translation>המקטעים מאומתים…</translation> </message> <message> - <source>Failed to write undo data</source> - <translation>כתיבת נתוני ביטול נכשלה</translation> + <source>Verifying wallet...</source> + <translation>הארנק מאומת…</translation> </message> <message> - <source>Generate coins (default: 0)</source> - <translation>ייצר מטבעות (ברגיל: 0)</translation> + <source>Wallet %s resides outside data directory %s</source> + <translation>הארנק %s יושב מחוץ לתיקיית הנתונים %s</translation> </message> <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>מספר הבלוקים לבדוק בעת אתחול (ברירת מחדל: 288, 0 = כולם)</translation> + <source>Wallet options:</source> + <translation>אפשרויות הארנק:</translation> </message> <message> - <source>Incorrect or no genesis block found. Wrong datadir for network?</source> - <translation>בלוק בראשית הינו שגוי או לא נמצא. ספריית מידע לא נכונה עבור הרשת?</translation> + <source>You need to rebuild the database using -reindex to change -txindex</source> + <translation>עליך לבנות מחדש את מסד הנתונים תוך שימוש ב־-reindex על מנת לשנות את -txindex</translation> </message> <message> - <source>Invalid -onion address: '%s'</source> - <translation>כתובת onion- שגויה: '%s'</translation> + <source>Imports blocks from external blk000??.dat file</source> + <translation>מיובאים מקטעים מקובצי blk000??.dat חיצוניים</translation> </message> <message> - <source>Not enough file descriptors available.</source> - <translation>אין מספיק מידע על הקובץ</translation> + <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> + <translation>הרץ פקודה כאשר ההתראה הרלוונטית מתקבלת או כשאנחנו עדים לפיצול ארוך מאוד (%s בשורת הפקודה יוחלף ע"י ההודעה)</translation> </message> <message> - <source>Rebuild block chain index from current blk000??.dat files</source> - <translation>בנה מחדש את אינדק שרשרת הבלוקים מקבצי ה-blk000??.dat הנוכחיים.</translation> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source> + <translation>העמלות (ב־BTC/ק״ב) הנמוכות מהסכום הזה נחשבות לעמלות אפס ליצירת העברה (בררת מחדל: %s)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>קבע את מספר תהליכוני לשירות קריאות RPC (ברירת מחדל: 4)</translation> + <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source> + <translation>אזהרה: נא לבדוק שהתאריך והשעה של המחשב שלך נכונים! אם השעון שלך שגוי ליבת ביטקוין לא תעבוד כראוי.</translation> </message> <message> - <source>Specify wallet file (within data directory)</source> - <translation>ציין קובץ ארנק (בתוך ספריית המידע)</translation> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>לא ניתן לפתור את הכתובת -whitebind: '%s'</translation> </message> <message> - <source>Verifying blocks...</source> - <translation>מאמת את שלמות מסד הנתונים...</translation> + <source>Connect through SOCKS5 proxy</source> + <translation>התחברות דרך מתווך SOCKS5</translation> </message> <message> - <source>Verifying wallet...</source> - <translation>מאמת את יושרת הארנק...</translation> + <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> + <translation>כל הזכויות שמורות (C) 2009-%i מתכנתי ליבת ביטקוין</translation> </message> <message> - <source>Wallet %s resides outside data directory %s</source> - <translation>הארנק %s יושב מחוץ לספריית המידע %s</translation> + <source>Could not parse -rpcbind value %s as network address</source> + <translation>לא ניתן לנתח את הערך של -rpcbind שצוין בתור %s ככתובת רשת</translation> </message> <message> - <source>You need to rebuild the database using -reindex to change -txindex</source> - <translation>עליך לבנות מחדש את מסד הנתונים תוך שימוש ב- -reindex על מנת לשנות את -txindex</translation> + <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source> + <translation>אירעה שגיאה בטעינת wallet.dat: הארנק דורש גרסה חדשה יותר של ליבת ביטקוין</translation> </message> <message> - <source>Imports blocks from external blk000??.dat file</source> - <translation>מייבא בלוקים מקובצי blk000??.dat חיצוניים</translation> + <source>Error: Unsupported argument -tor found, use -onion.</source> + <translation>שגיאה: נמצא ארגומנט בלתי נתמך -tor, יש להשתמש ב־-onion.</translation> </message> <message> - <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> - <translation>הרץ פקודה כאשר ההתראה הרלוונטית מתקבלת או כשאנחנו עדים לפיצול ארוך מאוד (%s בשורת הפקודה יוחלף ע"י ההודעה)</translation> + <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source> + <translation>עמלה (ב־BTC/ק״ב) להוספה להעברות שנשלחות ממך (בררת מחדל: %s)</translation> </message> <message> <source>Information</source> <translation>מידע</translation> </message> <message> + <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source> + <translation>בדיקת התקינות ההתחלתית נכשלה. ליבת ביטקוין תיסגר כעת.</translation> + </message> + <message> <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> <translation>כמות לא תקינה עבור -paytxfee=<amount>: '%s'</translation> </message> <message> <source>Invalid amount for -mintxfee=<amount>: '%s'</source> - <translation>כמות לא תקינה עבור -paytxfee=<amount>: '%s'</translation> + <translation>כמות לא תקינה עבור -mintxfee=<amount>: '%s'</translation> + </message> + <message> + <source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source> + <translation>כמות לא תקינה עבור -paytxfee=<amount>: '%s' (חייבת להיות לפחות %s)</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>תחזק אינדקס פעולות מלא (ברירת מחדל: 0)</translation> + <source>Invalid netmask specified in -whitelist: '%s'</source> + <translation>מסכת הרשת שצוינה עם -whitelist שגויה: '%s'</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>חוצץ קבלה מירבי לכל חיבור, <n>*1000 בתים (ברירת מחדל: 5000)</translation> + <source>Need to specify a port with -whitebind: '%s'</source> + <translation>עליך לציין פתחה עם -whitebind: '%s'</translation> </message> <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>חוצץ שליחה מירבי לכל חיבור, <n>*1000 בתים (ברירת מחדל: 1000)</translation> + <source>Node relay options:</source> + <translation>אפשרויות ממסר מפרק:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>קבל רק שרשרת בלוקים התואמת נקודות ביקורת מובנות (ברירת מחדל: 1)</translation> + <source>Print block on startup, if found in block index</source> + <translation>הצגת מקטע בהפעלה, אם נמצא במפתח המקטעים</translation> </message> <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>התחבר רק לצמתים ברשת <net> (IPv4, IPv6 או Tor)</translation> + <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> + <translation>אפשרויות RPC SSL: (נא לעיין בוויקי של ביטקוין לקבלת הנחיות על הגדרת SSL)</translation> </message> <message> <source>RPC server options:</source> <translation>הגדרות שרת RPC</translation> </message> <message> + <source>Randomly drop 1 of every <n> network messages</source> + <translation>להשמיט אקראית אחת מתוך כל <n> הודעות רשת</translation> + </message> + <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>שלח מידע דיבאג ועקבה לקונסולה במקום לקובץ debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>קבע את גודל הבלוק המינימלי בבתים (ברירת מחדל: 0)</translation> + <source>Show all debugging options (usage: --help -help-debug)</source> + <translation>הצגת כל אפשרויות הניפוי (שימוש: --help -help-debug)</translation> </message> <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> - <translation>כווץ את קובץ debug.log בהפעלת הקליינט (ברירת מחדל: 1 ללא -debug)</translation> + <translation>כיווץ הקובץ debug.log בהפעלת הלקוח (בררת מחדל: 1 ללא -debug)</translation> </message> <message> <source>Signing transaction failed</source> - <translation>פעולה העברה נכשלה</translation> + <translation>החתימה על ההעברה נכשלה</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>ציין הגבלת זמן לחיבור במילישניות (ברירת מחדל: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>שגיאת מערכת:</translation> + <source>This is experimental software.</source> + <translation>זוהי תכנית נסיונית.</translation> </message> <message> <source>Transaction amount too small</source> - <translation>סכום העברה קטן מדי</translation> + <translation>סכום ההעברה קטן מדי</translation> </message> <message> <source>Transaction amounts must be positive</source> - <translation>סכום ההעברה חייב להיות חיובי</translation> + <translation>סכומי ההעברות חייבים להיות חיוביים</translation> </message> <message> <source>Transaction too large</source> - <translation>סכום העברה גדול מדי</translation> + <translation>סכום ההעברה גדול מדי</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>השתמש ב-UPnP כדי למפות את הפורט להאזנה (ברירת מחדל: 0)</translation> + <source>Unable to bind to %s on this computer (bind returned error %s)</source> + <translation>לא ניתן להתאגד עם הפתחה %s במחשב זה (פעולת האיגוד החזירה את השגיאה %s)</translation> </message> <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> - <translation>השתמש ב-UPnP כדי למפות את הפורט להאזנה (ברירת מחדל: 1 בעת האזנה)</translation> + <translation>יש להשתמש ב־UPnP כדי למפות את הפתחה להאזנה (בררת מחדל: 1 בעת האזנה)</translation> </message> <message> <source>Username for JSON-RPC connections</source> <translation>שם משתמש לחיבורי JSON-RPC</translation> </message> <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>יש לכתוב את הארנק מחדש: נא להפעיל את ליבת ביטקוין מחדש כדי להשלים את הפעולה</translation> + </message> + <message> <source>Warning</source> <translation>אזהרה</translation> </message> @@ -2530,8 +3018,16 @@ rpcpassword=%s <translation>אזהרה: הגרסה הזאת מיושנת, יש צורך בשדרוג!</translation> </message> <message> + <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source> + <translation>אזהרה: הארגומנט שאינו נתמך עוד -benchmark לא הופעל, נא להשתמש ב־-debug=bench.</translation> + </message> + <message> + <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source> + <translation>אזהרה: הארגומנט שאינו נתמך עוד -debugnet לא הופעל, נא להשתמש ב־-debug=net.</translation> + </message> + <message> <source>on startup</source> - <translation>בפתיחה</translation> + <translation>עם ההפעלה</translation> </message> <message> <source>wallet.dat corrupt, salvage failed</source> @@ -2539,35 +3035,23 @@ rpcpassword=%s </message> <message> <source>Password for JSON-RPC connections</source> - <translation>סיסמה לחיבורי JSON-RPC</translation> + <translation>ססמה לחיבורי JSON-RPC</translation> </message> <message> <source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source> - <translation>בצע פקודה זו כשהבלוק הטוב ביותר משתנה (%s בפקודה יוחלף בגיבוב הבלוק)</translation> + <translation>יש לבצע פקודה זו כשהמקטע הטוב ביותר משתנה (%s בפקודה יוחלף בגיבוב המקטע)</translation> </message> <message> <source>Upgrade wallet to latest format</source> - <translation>שדרג את הארנק לפורמט העדכני</translation> - </message> - <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>קבע את גודל המאגר ל -<n> (ברירת מחדל: 100)</translation> + <translation>שדרוג הארנק למבנה העדכני</translation> </message> <message> <source>Rescan the block chain for missing wallet transactions</source> - <translation>סרוק מחדש את שרשרת הבלוקים למציאת פעולות חסרות בארנק</translation> + <translation>יש לסרוק מחדש את שרשרת המקטעים למציאת העברות חסרות בארנק</translation> </message> <message> <source>Use OpenSSL (https) for JSON-RPC connections</source> - <translation>השתמש ב-OpenSSL (https( עבור חיבורי JSON-RPC</translation> - </message> - <message> - <source>Server certificate file (default: server.cert)</source> - <translation>קובץ תעודת שרת (ברירת מחדל: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>מפתח פרטי של השרת (ברירת מחדל: server.pem)</translation> + <translation>שימוש ב־OpenSSL (https) עבור חיבורי JSON-RPC</translation> </message> <message> <source>This help message</source> @@ -2575,11 +3059,11 @@ rpcpassword=%s </message> <message> <source>Allow DNS lookups for -addnode, -seednode and -connect</source> - <translation>אפשר בדיקת DNS עבור -addnode, -seednode ו- -connect</translation> + <translation>הפעלת בדיקת DNS עבור -addnode, -seednode ו־-connect</translation> </message> <message> <source>Loading addresses...</source> - <translation>טוען כתובות...</translation> + <translation>הכתובות בטעינה…</translation> </message> <message> <source>Error loading wallet.dat: Wallet corrupted</source> @@ -2591,23 +3075,23 @@ rpcpassword=%s </message> <message> <source>Invalid -proxy address: '%s'</source> - <translation>כתובת -proxy לא תקינה: '%s'</translation> + <translation>כתובת -proxy לא תקינה: '%s'</translation> </message> <message> <source>Unknown network specified in -onlynet: '%s'</source> - <translation>רשת לא ידועה צוינה ב- -onlynet: '%s'</translation> + <translation>רשת לא ידועה צוינה דרך -onlynet: '%s'</translation> </message> <message> <source>Cannot resolve -bind address: '%s'</source> - <translation>לא מסוגל לפתור כתובת -bind: '%s'</translation> + <translation>לא ניתן לפתור את הכתובת -bind: '%s'</translation> </message> <message> <source>Cannot resolve -externalip address: '%s'</source> - <translation>לא מסוגל לפתור כתובת -externalip: '%s'</translation> + <translation>לא ניתן לפתור את הכתובת -externalip: '%s'</translation> </message> <message> <source>Invalid amount for -paytxfee=<amount>: '%s'</source> - <translation>כמות לא תקינה עבור -paytxfee=<amount>: '%s'</translation> + <translation>כמות לא תקינה עבור -paytxfee=<amount>: '%s'</translation> </message> <message> <source>Invalid amount</source> @@ -2619,27 +3103,27 @@ rpcpassword=%s </message> <message> <source>Loading block index...</source> - <translation>טוען את אינדקס הבלוקים...</translation> + <translation>מפתח המקטעים נטען…</translation> </message> <message> <source>Add a node to connect to and attempt to keep the connection open</source> - <translation>הוסף צומת להתחברות ונסה לשמור את החיבור פתוח</translation> + <translation>הוספת מפרק להתחברות ולנסות לשמור על החיבור פתוח</translation> </message> <message> <source>Loading wallet...</source> - <translation>טוען ארנק...</translation> + <translation>הארנק בטעינה…</translation> </message> <message> <source>Cannot downgrade wallet</source> - <translation>לא יכול להוריד דרגת הארנק</translation> + <translation>לא ניתן להחזיר את גרסת הארנק</translation> </message> <message> <source>Cannot write default address</source> - <translation>לא יכול לכתוב את כתובת ברירת המחדל</translation> + <translation>לא ניתן לכתוב את כתובת בררת המחדל</translation> </message> <message> <source>Rescanning...</source> - <translation>סורק מחדש...</translation> + <translation>סריקה מחדש…</translation> </message> <message> <source>Done loading</source> @@ -2647,7 +3131,7 @@ rpcpassword=%s </message> <message> <source>To use the %s option</source> - <translation>להשתמש באפשרות %s</translation> + <translation>שימוש באפשרות %s</translation> </message> <message> <source>Error</source> diff --git a/src/qt/locale/bitcoin_hi_IN.ts b/src/qt/locale/bitcoin_hi_IN.ts index 28778a0258..09a8392c27 100644 --- a/src/qt/locale/bitcoin_hi_IN.ts +++ b/src/qt/locale/bitcoin_hi_IN.ts @@ -1,4 +1,4 @@ -<TS language="hi_IN" version="2.1"> +<TS language="hi_IN" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -191,10 +191,6 @@ <source>Tabs toolbar</source> <translation>टैबस टूलबार</translation> </message> - <message> - <source>[testnet]</source> - <translation>[टेस्टनेट]</translation> - </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n सक्रिया संपर्क बीटकोइन नेटवर्क से</numerusform><numerusform>%n सक्रिया संपर्क बीटकोइन नेटवर्क से</numerusform></translation> @@ -273,10 +269,6 @@ Address: %4 <translation>राशि</translation> </message> <message> - <source>Address</source> - <translation>पता</translation> - </message> - <message> <source>Date</source> <translation>taareek</translation> </message> @@ -389,14 +381,6 @@ Address: %4 <source>Form</source> <translation>फार्म</translation> </message> - <message> - <source>Wallet</source> - <translation>वॉलेट</translation> - </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>हाल का लेन-देन</b></translation> - </message> </context> <context> <name>PaymentServer</name> @@ -861,14 +845,6 @@ Address: %4 <translation>विकल्प:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>configuraion की फाइल का विवरण दें (default: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>pid फाइल का विवरण दें (default: bitcoin.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>डेटा डायरेक्टरी बताएं </translation> </message> diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts index bf365bb57e..22831a0fd5 100644 --- a/src/qt/locale/bitcoin_hr.ts +++ b/src/qt/locale/bitcoin_hr.ts @@ -1,4 +1,4 @@ -<TS language="hr" version="2.1"> +<TS language="hr" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -10,14 +10,30 @@ <translation>Dodajte novu adresu</translation> </message> <message> + <source>&New</source> + <translation>&Nova</translation> + </message> + <message> <source>Copy the currently selected address to the system clipboard</source> <translation>Kopiraj trenutno odabranu adresu u međuspremnik</translation> </message> <message> + <source>&Copy</source> + <translation>&Kopiraj</translation> + </message> + <message> + <source>C&lose</source> + <translation>&Zatvori</translation> + </message> + <message> <source>&Copy Address</source> <translation>&Kopirati adresu</translation> </message> <message> + <source>Delete the currently selected address from the list</source> + <translation>Brisanje trenutno odabrane adrese s popisa.</translation> + </message> + <message> <source>Export the data in the current tab to a file</source> <translation>Izvoz podataka iz trenutnog taba u datoteku</translation> </message> @@ -30,6 +46,34 @@ <translation>&Brisanje</translation> </message> <message> + <source>Choose the address to send coins to</source> + <translation>Odaberi adresu na koju šalješ novac</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Odaberi adresu na koju primaš novac</translation> + </message> + <message> + <source>C&hoose</source> + <translation>&Odaberi</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>Adresa za slanje</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Adresa za primanje</translation> + </message> + <message> + <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> + <translation>Ovo su vaše Bitcoin adrese za slanje uplate. Uvijek provjerite iznos i adresu primatelja prije slanja novca.</translation> + </message> + <message> + <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> + <translation>Ovo su vaše Bitcoin adrese za primanje isplate. Preporučamo da koristite novu primateljsku adresu za svaku transakciju.</translation> + </message> + <message> <source>Copy &Label</source> <translation>Kopirati &oznaku</translation> </message> @@ -38,10 +82,22 @@ <translation>&Izmjeniti</translation> </message> <message> + <source>Export Address List</source> + <translation>Izvezi listu adresa</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> <translation>Datoteka vrijednosti odvojenih zarezom (*. csv)</translation> </message> - </context> + <message> + <source>Exporting Failed</source> + <translation>Izvoz neuspješan</translation> + </message> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>Došlo je do pogreške kod spremanja liste adresa na %1. Molimo pokušajte ponovno.</translation> + </message> +</context> <context> <name>AddressTableModel</name> <message> @@ -60,6 +116,10 @@ <context> <name>AskPassphraseDialog</name> <message> + <source>Passphrase Dialog</source> + <translation>Dijalog lozinke</translation> + </message> + <message> <source>Enter passphrase</source> <translation>Unesite lozinku</translation> </message> @@ -112,6 +172,10 @@ <translation>Jeste li sigurni da želite šifrirati svoj novčanik?</translation> </message> <message> + <source>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.</source> + <translation>VAŽNO: Sve prethodne pričuve vašeg novčanika trebale bi biti zamijenjene novo stvorenom, šifriranom datotekom novčanika. Zbog sigurnosnih razloga, prethodne pričuve nešifriranog novčanika će postati beskorisne čim počnete koristiti novi, šifrirani novčanik.</translation> + </message> + <message> <source>Warning: The Caps Lock key is on!</source> <translation>Upozorenje: Tipka Caps Lock je uključena!</translation> </message> @@ -120,6 +184,10 @@ <translation>Novčanik šifriran</translation> </message> <message> + <source>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>.</source> + <translation>Unesite novu lozinku za novčanik. <br/>Molimo Vas da koristite zaporku od <b>deset ili više slučajnih znakova</b>, ili <b>osam ili više riječi.</b></translation> + </message> + <message> <source>Bitcoin 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.</source> <translation>Bitcoin će se sada zatvoriti kako bi dovršio postupak šifriranja. Zapamtite da šifriranje vašeg novčanika ne može u potpunosti zaštititi vaše bitcoine od krađe preko zloćudnog softvera koji bi bio na vašem računalu.</translation> </message> @@ -156,7 +224,7 @@ <name>BitcoinGUI</name> <message> <source>Sign &message...</source> - <translation>&Potpišite poruku...</translation> + <translation>P&otpišite poruku...</translation> </message> <message> <source>Synchronizing with network...</source> @@ -167,6 +235,10 @@ <translation>&Pregled</translation> </message> <message> + <source>Node</source> + <translation>Čvor</translation> + </message> + <message> <source>Show general overview of wallet</source> <translation>Prikaži opći pregled novčanika</translation> </message> @@ -196,19 +268,35 @@ </message> <message> <source>&Options...</source> - <translation>&Postavke</translation> + <translation>Pos&tavke</translation> </message> <message> <source>&Encrypt Wallet...</source> - <translation>&Šifriraj novčanik...</translation> + <translation>Ši&friraj novčanik...</translation> </message> <message> <source>&Backup Wallet...</source> - <translation>&Backup novčanika...</translation> + <translation>Si&gurnosno kopiraj novčanik...</translation> </message> <message> <source>&Change Passphrase...</source> - <translation>&Promijena lozinke...</translation> + <translation>&Promjena lozinke...</translation> + </message> + <message> + <source>&Sending addresses...</source> + <translation>Adrese za s&lanje</translation> + </message> + <message> + <source>&Receiving addresses...</source> + <translation>Adrese za p&rimanje</translation> + </message> + <message> + <source>Open &URI...</source> + <translation>Otvori &URI...</translation> + </message> + <message> + <source>Bitcoin Core client</source> + <translation>Bitcoin Core klijent</translation> </message> <message> <source>Importing blocks from disk...</source> @@ -235,6 +323,14 @@ <translation>Promijenite lozinku za šifriranje novčanika</translation> </message> <message> + <source>&Debug window</source> + <translation>&Ispravljanje programerskih pogrešaka</translation> + </message> + <message> + <source>Open debugging and diagnostic console</source> + <translation>Otvori konzolu za dijagnostiku i otklanjanje programskih pogrešaka.</translation> + </message> + <message> <source>&Verify message...</source> <translation>&Potvrdite poruku...</translation> </message> @@ -251,12 +347,40 @@ <translation>&Pošalji</translation> </message> <message> + <source>&Receive</source> + <translation>Pri&miti</translation> + </message> + <message> + <source>Show information about Bitcoin Core</source> + <translation>Prikaži informacije o Bitcoin Coreu</translation> + </message> + <message> + <source>&Show / Hide</source> + <translation>Po&kaži / Sakrij</translation> + </message> + <message> + <source>Show or hide the main Window</source> + <translation>Prikaži ili sakrij glavni prozor</translation> + </message> + <message> + <source>Encrypt the private keys that belong to your wallet</source> + <translation>Šifriraj privatne ključeve koji pripadaju tvom novčaniku</translation> + </message> + <message> + <source>Sign messages with your Bitcoin addresses to prove you own them</source> + <translation>Potpiši poruke svojim Bitcoin adresama kako bi dokazao da si njihov vlasnik</translation> + </message> + <message> + <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source> + <translation>Provjerite porkue kako bi se uvjerili da su potpisane navedenim Bitcoin adresama</translation> + </message> + <message> <source>&File</source> <translation>&Datoteka</translation> </message> <message> <source>&Settings</source> - <translation>&Konfiguracija</translation> + <translation>&Postavke</translation> </message> <message> <source>&Help</source> @@ -267,22 +391,30 @@ <translation>Traka kartica</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Jezgra</translation> </message> + <message> + <source>Request payments (generates QR codes and bitcoin: URIs)</source> + <translation>Zatraži uplate (Stvara QR kodove i bitcoin: URIje)</translation> + </message> + <message> + <source>&About Bitcoin Core</source> + <translation>&O Bitcoin Jezgri</translation> + </message> + <message> + <source>Show the list of used sending addresses and labels</source> + <translation>Prikaži popis korištenih adresa i oznaka za slanje isplate</translation> + </message> + <message> + <source>Show the list of used receiving addresses and labels</source> + <translation>Prikaži popis korištenih adresa i oznaka za primanje isplate</translation> + </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n aktivna veza na Bitcoin mrežu</numerusform><numerusform>%n aktivne veze na Bitcoin mrežu</numerusform><numerusform>%n aktivnih veza na Bitcoin mrežu</numerusform></translation> </message> <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Obrađeno %1 blokova povijesti transakcije.</translation> - </message> - <message> <source>Error</source> <translation>Greška</translation> </message> @@ -345,10 +477,6 @@ Adresa:%4 <translation>Iznos</translation> </message> <message> - <source>Address</source> - <translation>Adresa</translation> - </message> - <message> <source>Date</source> <translation>Datum</translation> </message> @@ -468,11 +596,7 @@ Adresa:%4 <source>Error</source> <translation>Pogreška</translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(od potrebnog %1GB)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> </context> @@ -487,10 +611,6 @@ Adresa:%4 <translation>&Glavno</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>Plati &naknadu za transakciju</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Automatski pokreni Bitcoin kad se uključi računalo</translation> </message> @@ -578,17 +698,9 @@ Adresa:%4 <translation>Prikazani podatci mogu biti zastarjeli. Vaš novčanik se automatski sinkronizira s Bitcoin mrežom kada je veza uspostavljena, ali taj proces još nije završen.</translation> </message> <message> - <source>Wallet</source> - <translation>Novčanik</translation> - </message> - <message> <source>Total:</source> <translation>Ukupno:</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Nedavne transakcije</b></translation> - </message> </context> <context> <name>PaymentServer</name> @@ -1200,6 +1312,10 @@ Adresa:%4 <translation>Prikaži detalje transakcije</translation> </message> <message> + <source>Exporting Failed</source> + <translation>Izvoz neuspješan</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> <translation>Datoteka podataka odvojenih zarezima (*.csv)</translation> </message> @@ -1279,42 +1395,14 @@ Adresa:%4 <translation>Postavke:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Odredi konfiguracijsku datoteku (ugrađeni izbor: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Odredi proces ID datoteku (ugrađeni izbor: bitcoin.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Odredi direktorij za datoteke</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Slušaj na <port>u (default: 8333 ili testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Održavaj najviše <n> veza sa članovima (default: 125)</translation> - </message> - <message> <source>Specify your own public address</source> <translation>Odaberi vlastitu javnu adresu</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Prag za odspajanje članova koji se čudno ponašaju (default: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Broj sekundi koliko se članovima koji se čudno ponašaju neće dopustiti da se opet spoje (default: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Prihvaćaj JSON-RPC povezivanje na portu broj <port> (ugrađeni izbor: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Prihvati komande iz tekst moda i JSON-RPC</translation> </message> @@ -1343,10 +1431,6 @@ Adresa:%4 <translation>Pogreška: Nema prostora na disku!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Pogreška: sistemska pogreška:</translation> - </message> - <message> <source>Imports blocks from external blk000??.dat file</source> <translation>Importiraj blokove sa vanjskog blk000??.dat fajla</translation> </message> @@ -1355,30 +1439,10 @@ Adresa:%4 <translation>Informacija</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Prihvati samo lance blokova koji se podudaraju sa ugrađenim checkpoint-ovima (default: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Šalji trace/debug informacije na konzolu umjesto u debug.log datoteku</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Podesite minimalnu veličinu bloka u bajtovima (default: 0)</translation> - </message> - <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Odredi vremenski prozor za spajanje na mrežu u milisekundama (ugrađeni izbor: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Pogreška sistema:</translation> - </message> - <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Pokušaj koristiti UPnP da otvoriš port za uslugu (default: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Pokušaj koristiti UPnP da otvoriš port za uslugu (default: 1 when listening)</translation> </message> @@ -1403,10 +1467,6 @@ Adresa:%4 <translation>Nadogradite novčanik u posljednji format.</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Podesi memorijski prostor za ključeve na <n> (ugrađeni izbor: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Ponovno pretraži lanac blokova za transakcije koje nedostaju</translation> </message> @@ -1415,14 +1475,6 @@ Adresa:%4 <translation>Koristi OpenSSL (https) za JSON-RPC povezivanje</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Uslužnikov SSL certifikat (ugrađeni izbor: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Uslužnikov privatni ključ (ugrađeni izbor: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Ova poruka za pomoć</translation> </message> diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts index b5eb262442..8109542405 100644 --- a/src/qt/locale/bitcoin_hu.ts +++ b/src/qt/locale/bitcoin_hu.ts @@ -1,4 +1,4 @@ -<TS language="hu" version="2.1"> +<TS language="hu" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Fül eszköztár</translation> </message> <message> - <source>[testnet]</source> - <translation>[teszthálózat]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Blokk forrása ismeretlen...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>A tranzakció-történet %1 blokkja feldolgozva.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n óra</numerusform><numerusform>%n óra</numerusform></translation> @@ -529,10 +521,6 @@ Cím: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Ellenőrző cím kiválasztása</translation> - </message> - <message> <source>Quantity:</source> <translation>Mennyiség:</translation> </message> @@ -581,10 +569,6 @@ Cím: %4 <translation>Összeg</translation> </message> <message> - <source>Address</source> - <translation>Cím</translation> - </message> - <message> <source>Date</source> <translation>Dátum</translation> </message> @@ -893,15 +877,7 @@ Cím: %4 <source>Error</source> <translation>Hiba</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB hely érhető el</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>( ebből %1GB szükséges)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -932,14 +908,6 @@ Cím: %4 <translation>&Fő</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Opcionális, kB-onkénti tranzakciós díj a tranzakcióid minél gyorsabb feldolgozásának elősegítésére. A legtöbb tranzakció 1 kB-os.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Tranzakciós &díj fizetése</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Induljon el a Bitcoin a számítógép bekapcsolásakor</translation> </message> @@ -952,10 +920,6 @@ Cím: %4 <translation>MB</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>SOCKS proxyn keresztüli csatlakozás a Bitcoin hálózatához.</translation> - </message> - <message> <source>Reset all client options to default.</source> <translation>Minden kliensbeállítás alapértelmezettre állítása.</translation> </message> @@ -1063,10 +1027,6 @@ Cím: %4 <translation>A kijelzett információ lehet, hogy elavult. A pénztárcája automatikusan szinkronizálja magát a Bitcoin hálózattal miután a kapcsolat létrejön, de ez e folyamat még nem fejeződött be.</translation> </message> <message> - <source>Wallet</source> - <translation>Tárca</translation> - </message> - <message> <source>Available:</source> <translation>Elérhető:</translation> </message> @@ -1099,10 +1059,6 @@ Cím: %4 <translation>Aktuális egyenleged</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Legutóbbi tranzakciók</b></translation> - </message> - <message> <source>out of sync</source> <translation>Nincs szinkronban.</translation> </message> @@ -1289,14 +1245,6 @@ Cím: %4 <source>never</source> <translation>soha</translation> </message> - <message> - <source>Yes</source> - <translation>Igen</translation> - </message> - <message> - <source>No</source> - <translation>Nem</translation> - </message> </context> <context> <name>ReceiveCoinsDialog</name> @@ -2078,29 +2026,11 @@ Cím: %4 </translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Konfigurációs fájl (alapértelmezett: bitcoin.conf) -</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>pid-fájl (alapértelmezett: bitcoind.pid) -</translation> - </message> - <message> <source>Specify data directory</source> <translation>Adatkönyvtár </translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Csatlakozásokhoz figyelendő <port> (alapértelmezett: 8333 or testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Maximálisan <n> számú kapcsolat fenntartása a peerekkel (alapértelmezés: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Kapcsolódás egy csomóponthoz a peerek címeinek megszerzése miatt, majd szétkapcsolás</translation> </message> @@ -2109,18 +2039,6 @@ Cím: %4 <translation>Adja meg az Ön saját nyilvános címét</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Helytelenül viselkedő peerek leválasztási határértéke (alapértelmezés: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Helytelenül viselkedő peerek kizárási ideje másodpercben (alapértelmezés: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>JSON-RPC csatlakozásokhoz figyelendő <port> (alapértelmezett: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Parancssoros és JSON-RPC parancsok elfogadása </translation> @@ -2188,62 +2106,10 @@ Cím: %4 <translation>Hiba: kevés a hely a lemezen!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Hiba: rendszerhiba:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Egyik hálózati porton sem sikerül hallgatni. Használja a -listen=0 kapcsolót, ha ezt szeretné.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>A blokkinformáció olvasása nem sikerült</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>A blokk olvasása nem sikerült</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>A blokkindex szinkronizálása nem sikerült</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>A blokkindex írása nem sikerült</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>A blokkinformáció írása nem sikerült</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>A blokk írása nem sikerült</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>A fájlinformáció írása nem sikerült</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Az érme-adatbázis írása nem sikerült</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>A tranzakcióindex írása nem sikerült</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>A stornóadatok írása nem sikerült</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Érmék generálása (alapértelmezett: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Hány blokkot ellenőrizzen induláskor (alapértelmezett: 288, 0 = mindet)</translation> - </message> - <message> <source>Importing...</source> <translation>Importálás</translation> </message> @@ -2284,18 +2150,6 @@ Cím: %4 <translation>Érvénytelen -mintxfee=<amount>: '%s' összeg</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Teljes tranzakcióindex megőrzése (alapértelmezett: 0)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Csak blokklánccal egyező beépített ellenőrző pontok elfogadása (alapértelmezés: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Csak a <net> hálózat csomópontjaihoz kapcsolódjon (IPv4, IPv6 vagy Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>trace/debug információ küldése a konzolra a debog.log fájl helyett</translation> </message> @@ -2304,14 +2158,6 @@ Cím: %4 <translation>Tranzakció aláírása sikertelen</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Csatlakozás időkerete milliszekundumban (alapértelmezett: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Rendszerhiba:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Ez egy kísérleti szoftver.</translation> </message> @@ -2328,10 +2174,6 @@ Cím: %4 <translation>Túl nagy tranzakció</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>UPnP-használat engedélyezése a figyelő port feltérképezésénél (default: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>UPnP-használat engedélyezése a figyelő port feltérképezésénél (default: 1 when listening)</translation> </message> @@ -2358,11 +2200,6 @@ Cím: %4 <translation>A Tárca frissítése a legfrissebb formátumra</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Kulcskarika mérete <n> (alapértelmezett: 100) -</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Blokklánc újraszkennelése hiányzó tárca-tranzakciók után </translation> @@ -2373,16 +2210,6 @@ Cím: %4 </translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Szervertanúsítvány-fájl (alapértelmezett: server.cert) -</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Szerver titkos kulcsa (alapértelmezett: server.pem) -</translation> - </message> - <message> <source>This help message</source> <translation>Ez a súgó-üzenet </translation> diff --git a/src/qt/locale/bitcoin_id_ID.ts b/src/qt/locale/bitcoin_id_ID.ts index 80d4141beb..ea2750ed08 100644 --- a/src/qt/locale/bitcoin_id_ID.ts +++ b/src/qt/locale/bitcoin_id_ID.ts @@ -1,4 +1,4 @@ -<TS language="id_ID" version="2.1"> +<TS language="id_ID" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -279,6 +279,10 @@ <translation>Buka &URI</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>Client Bitcoin Inti</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>Blok-blok sedang di-impor dari disk</translation> </message> @@ -331,6 +335,10 @@ <translation>&Menerima</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation>Tampilkan informasi tentang Bitcoin Inti</translation> + </message> + <message> <source>&Show / Hide</source> <translation>&Sunjukkan / Menyembungi</translation> </message> @@ -367,10 +375,6 @@ <translation>Baris tab</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -410,10 +414,6 @@ <source>No block source available...</source> <translation>Sumber blok tidak tersedia...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>%1 blok-blok riwayat transaksi telah diproses</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n jam</numerusform></translation> @@ -505,10 +505,6 @@ Alamat: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Pilihan alamat pengaturan koin</translation> - </message> - <message> <source>Quantity:</source> <translation>Kuantitas:</translation> </message> @@ -553,10 +549,6 @@ Alamat: %4 <translation>Nilai</translation> </message> <message> - <source>Address</source> - <translation>Alamat</translation> - </message> - <message> <source>Date</source> <translation>Tanggal</translation> </message> @@ -852,15 +844,11 @@ Alamat: %4 <source>Error</source> <translation>Gagal</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB di hard disk yang masih tersedia</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(dari %1GB yang diperlu)</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB dari ruang yang tersedia</numerusform></translation> </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -895,14 +883,6 @@ Alamat: %4 <translation>&Utama</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Biaya transaksi untuk setiap kB yang membantu transaksi Andi diproses cepat (biayanya opsional). Ukuran transaksi biasanya 1kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Bayar &biaya transaksi</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Menyalakan Bitcoin secara otomatis setelah masuk ke dalam sistem.</translation> </message> @@ -915,14 +895,6 @@ Alamat: %4 <translation>MB</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Menghubungkan jaringan Bitcoin lewat proxy SOCKS.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Hubungkan melalui proxy SOCKS (proxy biasa):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Alamat IP proxy (cth. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1078,10 +1050,6 @@ Alamat: %4 <translation>Informasi terlampir mungkin sudah kedaluwarsa. Dompet Anda secara otomatis mensinkronisasi dengan jaringan Bitcoin ketika sebuah hubungan terbentuk, namun proses ini belum selesai.</translation> </message> <message> - <source>Wallet</source> - <translation>Dompet</translation> - </message> - <message> <source>Available:</source> <translation>Tersedia:</translation> </message> @@ -1114,10 +1082,6 @@ Alamat: %4 <translation>Jumlah saldo Anda sekarang</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transaksi sebelumnya</b></translation> - </message> - <message> <source>out of sync</source> <translation>tidak tersinkron</translation> </message> @@ -2315,26 +2279,10 @@ Alamat: %4 <translation>Pilihan:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Tentukan berkas konfigurasi (standar: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Tentukan berkas pid (standar: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Tentukan direktori data</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Menerima hubungan pada <port> (standar: 8333 atau testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Mengatur hubungan paling banyak <n> ke peer (standar: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Hubungkan ke node untuk menerima alamat peer, dan putuskan</translation> </message> @@ -2343,14 +2291,6 @@ Alamat: %4 <translation>Tentukan alamat publik Anda sendiri</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Batas untuk memutuskan peer buruk (standar: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Jumlah kedua untuk menjaga peer buruk dari hubung-ulang (standar: 86400)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Menerima perintah baris perintah dan JSON-RPC</translation> </message> @@ -2367,10 +2307,6 @@ Alamat: %4 <translation>Terima hubungan dari luar (standar: 1 kalau -proxy atau -connect tidak dipilih)</translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Sandi yang diterima (biasanya: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source> <translation>Gagal: Transaksi ditolak. Ini mungkin terjadi jika beberapa dari koin dalam dompet Anda telah digunakan, seperti ketika Anda menggunakan salinan wallet.dat dan beberapa koin telah dibelanjakan dalam salinan tersebut tetapi disini tidak tertandai sebagai terpakai.</translation> </message> @@ -2383,10 +2319,6 @@ Alamat: %4 <translation>Tidak bisa mengikat dengan %s di computer ini. Kemungkinan Bitcoin Core sudah mulai.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Gunakanlah proxy SOCKS5 yang tersendiri supaya menghubungkan peer dengan layanan tersembunyi Tor (biasanya: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Peringatan: -paytxfee sangat besar! Ini adalah biaya pengiriman yang akan dibayar oleh Anda jika transaksi terkirim.</translation> </message> @@ -2407,10 +2339,6 @@ Alamat: %4 <translation>(pengaturan awal: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(pengaturan awal: wallet.dat)</translation> - </message> - <message> <source>Attempt to recover private keys from a corrupt wallet.dat</source> <translation>Coba memulihkan kunci-kunci pribadi dari wallet.dat yang rusak</translation> </message> @@ -2467,58 +2395,6 @@ Alamat: %4 <translation>Gagal: Dompet terkunci, transaksi tidak bisa dibuat!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Error: system error:</translation> - </message> - <message> - <source>Failed to read block info</source> - <translation>Gagal membaca informasi dari blok</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Gagal membaca blok</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Gagal menyamakan daftar isi blok</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Gagal menulis daftar isi blok</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Gagal menulis info blok</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Gagal menulis blok</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Gagal menulis info arsip</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Gagal menuliskan ke dalam database koin</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Gagal menulis daftar isi transaksi</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Gagal menulis ulang data</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Buatlah koin (biasanya: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Periksakan berapa blok waktu mulai (biasanya: 288, 0 = setiapnya)</translation> - </message> - <message> <source>Importing...</source> <translation>mengimpor...</translation> </message> @@ -2539,18 +2415,10 @@ Alamat: %4 <translation>Atur ukuran maksimal untuk blok dalam byte (biasanya: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Mengatur jumlah urutan untuk layanan panggilan RPC (pengaturan awal: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Tentukan arsip dompet (dalam direktori data)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Perubahan saldo untuk transaksi yang belum dikonfirmasi setelah transaksi terkirim (default: 1)</translation> - </message> - <message> <source>Verifying blocks...</source> <translation>Blok-blok sedang diverifikasi...</translation> </message> @@ -2591,14 +2459,6 @@ Alamat: %4 <translation>Nilai yang salah untuk -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Jaga daftar transaksi yang lengkap (biasanya: 0)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Dilarang menghubungkan node-node selain <net> (IPv4, IPv6 atau Tor)</translation> - </message> - <message> <source>RPC server options:</source> <translation>Opsi server RPC:</translation> </message> @@ -2607,10 +2467,6 @@ Alamat: %4 <translation>Kirim info jejak/debug ke konsol bukan berkas debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Atur ukuran minimal untuk blok dalam byte (standar: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Mengecilkan berkas debug.log saat klien berjalan (Standar: 1 jika tidak -debug)</translation> </message> @@ -2619,14 +2475,6 @@ Alamat: %4 <translation>Tandatangani transaksi tergagal</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Menetapkan waktu berakhir koneksi di milidetik (biasanya: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Kesalahan sistem:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Nilai transaksi terlalu kecil</translation> </message> @@ -2671,10 +2519,6 @@ Alamat: %4 <translation>Perbarui dompet ke format terbaru</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Kirim ukuran kolam kunci ke <n> (standar: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Pindai ulang rantai-blok untuk transaksi dompet yang hilang</translation> </message> @@ -2683,14 +2527,6 @@ Alamat: %4 <translation>Gunakan OpenSSL (https) untuk hubungan JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Berkas sertifikat server (standar: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Kunci pribadi server (standar: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Pesan bantuan ini</translation> </message> diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts index a803241d10..5dbe98b0f8 100644 --- a/src/qt/locale/bitcoin_it.ts +++ b/src/qt/locale/bitcoin_it.ts @@ -1,4 +1,4 @@ -<TS language="it" version="2.1"> +<TS language="it" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -35,7 +35,7 @@ </message> <message> <source>Export the data in the current tab to a file</source> - <translation>Esporta su file i dati della tabella corrente </translation> + <translation>Esporta i dati nella tabella corrente in un file</translation> </message> <message> <source>&Export</source> @@ -93,7 +93,11 @@ <source>Exporting Failed</source> <translation>Esportazione Fallita.</translation> </message> - </context> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>Si è verificato un errore tentando di salvare la lista degli indirizzi. %1. Riprova</translation> + </message> +</context> <context> <name>AddressTableModel</name> <message> @@ -113,19 +117,19 @@ <name>AskPassphraseDialog</name> <message> <source>Passphrase Dialog</source> - <translation>Finestra passphrase</translation> + <translation>Finestra parola d'ordine</translation> </message> <message> <source>Enter passphrase</source> - <translation>Inserisci la passphrase</translation> + <translation>Inserisci la parola d'ordine</translation> </message> <message> <source>New passphrase</source> - <translation>Nuova passphrase</translation> + <translation>Nuova parola d'ordine</translation> </message> <message> <source>Repeat new passphrase</source> - <translation>Ripeti la nuova passphrase</translation> + <translation>Ripeti la nuova parola d'ordine</translation> </message> <message> <source>Encrypt wallet</source> @@ -180,6 +184,10 @@ <translation>Portamonete cifrato</translation> </message> <message> + <source>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>.</source> + <translation>Inserisci una nuona password per il postafoglio.<br/>Perfavore usa una password di<b>dieci o più caratteri</b>, o <b>otto o più parole</b>.</translation> + </message> + <message> <source>Bitcoin 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.</source> <translation>Bitcoin si chiuderà per portare a termine il processo di cifratura. Ricorda che cifrare il tuo portamonete non può fornire una protezione totale contro i furti causati da infezioni malware.</translation> </message> @@ -287,6 +295,10 @@ <translation>Apri &URI...</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>Bitcoin Core client</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>Importazione blocchi dal disco...</translation> </message> @@ -339,6 +351,10 @@ <translation>&Ricevi</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation>Mostra le informazioni riguardo a Bitcoin core</translation> + </message> + <message> <source>&Show / Hide</source> <translation>&Mostra / Nascondi</translation> </message> @@ -375,10 +391,6 @@ <translation>Barra degli strumenti "Tabs"</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -418,10 +430,6 @@ <source>No block source available...</source> <translation>Nessuna fonte di blocchi disponibile</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Processati %1 blocchi della cronologia transazioni.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n ora</numerusform><numerusform>%n ore</numerusform></translation> @@ -514,10 +522,6 @@ Indirizzo: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Selezione Indirizzo Coin Control</translation> - </message> - <message> <source>Quantity:</source> <translation>Quantità:</translation> </message> @@ -538,6 +542,10 @@ Indirizzo: %4 <translation>Commissione:</translation> </message> <message> + <source>Dust:</source> + <translation>Importo</translation> + </message> + <message> <source>After Fee:</source> <translation>Dopo Commissione:</translation> </message> @@ -562,10 +570,6 @@ Indirizzo: %4 <translation>Importo</translation> </message> <message> - <source>Address</source> - <translation>Indirizzo</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -626,6 +630,10 @@ Indirizzo: %4 <translation>Copia priorità</translation> </message> <message> + <source>Copy dust</source> + <translation>Copia l'importo</translation> + </message> + <message> <source>Copy change</source> <translation>Copia resto</translation> </message> @@ -674,6 +682,10 @@ Indirizzo: %4 <translation>nessuno</translation> </message> <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>Può variare +/- %1 satoshi(s) per input.</translation> + </message> + <message> <source>yes</source> <translation>sì</translation> </message> @@ -882,18 +894,14 @@ Indirizzo: %4 <translation>Bitcoin Core</translation> </message> <message> - <source>Error</source> - <translation>Errore</translation> + <source>Error: Specified data directory "%1" cannot be created.</source> + <translation>Errore: La cartella dati "%1" specificata non può essere creata.</translation> </message> <message> - <source>GB of free space available</source> - <translation>GB di spazio libero disponibile</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(di %1GB richiesti)</translation> + <source>Error</source> + <translation>Errore</translation> </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -928,14 +936,6 @@ Indirizzo: %4 <translation>&Principale</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Commissione di transazione per kB: è opzionale e contribuisce ad assicurare che le transazioni siano elaborate velocemente. La maggior parte della transazioni ha dimensioni pari a 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Paga la &commissione</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Avvia automaticamente Bitcoin una volta effettuato l'accesso al sistema.</translation> </message> @@ -956,12 +956,12 @@ Indirizzo: %4 <translation>Numero di thread di &verifica degli script </translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Connessione alla rete Bitcoin attraverso un proxy SOCKS.</translation> + <source>Accept connections from outside</source> + <translation>Accetta connessioni da fuori</translation> </message> <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Connessione attraverso proxy SOCKS (proxy predefinito):</translation> + <source>Allow incoming connections</source> + <translation>Permetti connessioni in entrata</translation> </message> <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> @@ -1128,8 +1128,8 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Le informazioni visualizzate potrebbero non essere aggiornate. Il portamonete si sincronizza automaticamente con la rete Bitcoin una volta stabilita una connessione, ma questo processo non è ancora stato completato.</translation> </message> <message> - <source>Wallet</source> - <translation>Portamonete</translation> + <source>Watch-only:</source> + <translation>Guarda solo</translation> </message> <message> <source>Available:</source> @@ -1156,6 +1156,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Importo generato dal mining e non ancora maturato</translation> </message> <message> + <source>Balances</source> + <translation>Saldo</translation> + </message> + <message> <source>Total:</source> <translation>Totale:</translation> </message> @@ -1164,8 +1168,24 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Saldo totale attuale</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transazioni recenti</b></translation> + <source>Your current balance in watch-only addresses</source> + <translation>Il tuo saldo attuale negli indirizzi watch-only</translation> + </message> + <message> + <source>Spendable:</source> + <translation>Saldo Spendibile:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Transazioni recenti</translation> + </message> + <message> + <source>Unconfirmed transactions to watch-only addresses</source> + <translation>Transazioni non confermate su indirizzi di sola lettura</translation> + </message> + <message> + <source>Mined balance in watch-only addresses that has not yet matured</source> + <translation>l'equilibrio estratto solo nello sguardo degli indirizzi non è ancora maturo </translation> </message> <message> <source>out of sync</source> @@ -1183,6 +1203,22 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Indirizzo di pagamento non valido %1</translation> </message> <message> + <source>Payment request rejected</source> + <translation>Richiesta di pagamento rifiutata</translation> + </message> + <message> + <source>Payment request network doesn't match client network.</source> + <translation>Il network della richiesta di pagamento non corrisponde al network del client.</translation> + </message> + <message> + <source>Payment request has expired.</source> + <translation>Richieda di pagamento scaduta</translation> + </message> + <message> + <source>Payment request is not initialized.</source> + <translation>La richiesta di pagamento non è stata inizializzata.</translation> + </message> + <message> <source>Requested payment amount of %1 is too small (considered dust).</source> <translation>L'importo di pagamento richiesto di %1 è troppo basso (considerato come trascurabile).</translation> </message> @@ -1199,10 +1235,18 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>URL di recupero della Richiesta di pagamento non valido: %1</translation> </message> <message> + <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source> + <translation>Impossibile interpretare l'URI! Ciò può essere causato da un indirizzo Bitcoin invalido o da parametri URI non corretti.</translation> + </message> + <message> <source>Payment request file handling</source> <translation>Gestione del file di richiesta del pagamento</translation> </message> <message> + <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source> + <translation>Il file di richiesta del pagamento non può essere letto o elaborato! Questo può essere causato da una richiesta di pagamento non valida.</translation> + </message> + <message> <source>Unverified payment requests to custom payment scripts are unsupported.</source> <translation>Le richieste di pagamento non verificate verso script di pagamento personalizzati non sono supportate.</translation> </message> @@ -1215,6 +1259,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Errore di comunicazione con %1: %2</translation> </message> <message> + <source>Payment request cannot be parsed!</source> + <translation>La richiesta di pagamento non può essere analizzata.</translation> + </message> + <message> <source>Bad response from server %1</source> <translation>Risposta errata da parte del server %1</translation> </message> @@ -1229,7 +1277,19 @@ Più URL vengono separati da una barra verticale |.</translation> </context> <context> <name>PeerTableModel</name> - </context> + <message> + <source>User Agent</source> + <translation>User Agent</translation> + </message> + <message> + <source>Address/Hostname</source> + <translation>Indirizzo/Hostname</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Tempo di ping</translation> + </message> +</context> <context> <name>QObject</name> <message> @@ -1237,6 +1297,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Importo</translation> </message> <message> + <source>Enter a Bitcoin address (e.g. %1)</source> + <translation>Inserisci un indirizzo Bitcoin (e.g. %1)</translation> + </message> + <message> <source>%1 d</source> <translation>%1 d</translation> </message> @@ -1253,10 +1317,26 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>%1 s</translation> </message> <message> + <source>NETWORK</source> + <translation>RETE</translation> + </message> + <message> + <source>UNKNOWN</source> + <translation>SCONOSCIUTO</translation> + </message> + <message> + <source>None</source> + <translation>Nessuno</translation> + </message> + <message> <source>N/A</source> <translation>N/D</translation> </message> - </context> + <message> + <source>%1 ms</source> + <translation>%1 ms</translation> + </message> +</context> <context> <name>QRImageWidget</name> <message> @@ -1307,6 +1387,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Versione OpenSSL in uso</translation> </message> <message> + <source>Using BerkeleyDB version</source> + <translation>Versione BerkeleyDB in uso</translation> + </message> + <message> <source>Startup time</source> <translation>Tempo di avvio</translation> </message> @@ -1331,6 +1415,74 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Numero attuale di blocchi</translation> </message> <message> + <source>Received</source> + <translation>Ricevuto</translation> + </message> + <message> + <source>Sent</source> + <translation>Inviato</translation> + </message> + <message> + <source>&Peers</source> + <translation>&Peers</translation> + </message> + <message> + <source>Select a peer to view detailed information.</source> + <translation>Seleziona un peer per visualizzare informazioni più dettagliate.</translation> + </message> + <message> + <source>Direction</source> + <translation>Direzione</translation> + </message> + <message> + <source>Version</source> + <translation>Versione</translation> + </message> + <message> + <source>User Agent</source> + <translation>User Agent</translation> + </message> + <message> + <source>Services</source> + <translation>Servizi</translation> + </message> + <message> + <source>Starting Height</source> + <translation>Blocco di partenza</translation> + </message> + <message> + <source>Sync Height</source> + <translation>valore di sincronizzazione</translation> + </message> + <message> + <source>Ban Score</source> + <translation>divieto di segnalazione </translation> + </message> + <message> + <source>Connection Time</source> + <translation>Tempo di connessione</translation> + </message> + <message> + <source>Last Send</source> + <translation>Ultimo invio</translation> + </message> + <message> + <source>Last Receive</source> + <translation>Ultima ricevuta</translation> + </message> + <message> + <source>Bytes Sent</source> + <translation>Bytes Inviati</translation> + </message> + <message> + <source>Bytes Received</source> + <translation>Bytes Ricevuti</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Tempo di Ping</translation> + </message> + <message> <source>Last block time</source> <translation>Ora del blocco più recente</translation> </message> @@ -1407,18 +1559,30 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>%1 GB</translation> </message> <message> + <source>via %1</source> + <translation>via %1</translation> + </message> + <message> <source>never</source> <translation>mai</translation> </message> <message> - <source>Yes</source> - <translation>Si</translation> + <source>Inbound</source> + <translation>In entrata</translation> </message> <message> - <source>No</source> - <translation>No</translation> + <source>Outbound</source> + <translation>In uscita</translation> </message> - </context> + <message> + <source>Unknown</source> + <translation>Sconosciuto</translation> + </message> + <message> + <source>Fetching...</source> + <translation>attraente</translation> + </message> +</context> <context> <name>ReceiveCoinsDialog</name> <message> @@ -1659,6 +1823,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Cancellare tutti i campi del modulo.</translation> </message> <message> + <source>Dust:</source> + <translation>Trascurabile</translation> + </message> + <message> <source>Clear &All</source> <translation>Cancella &tutto</translation> </message> @@ -1759,6 +1927,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Attenzione: Indirizzo per il resto sconosciuto</translation> </message> <message> + <source>Copy dust</source> + <translation>Copia l'importo</translation> + </message> + <message> <source>Are you sure you want to send?</source> <translation>Sei sicuro di voler inviare?</translation> </message> @@ -1794,6 +1966,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Questo è un normale pagamento.</translation> </message> <message> + <source>The Bitcoin address to send the payment to</source> + <translation>L'indirizzo Bitcoin a cui vuoi inviare il pagamento</translation> + </message> + <message> <source>Alt+A</source> <translation>Alt+A</translation> </message> @@ -1864,6 +2040,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Puoi firmare messaggi con i tuoi indirizzi in modo da dimostrarne il possesso. Presta attenzione a non firmare dichiarazioni vaghe, attacchi di phishing potrebbero cercare di spingerti ad apporre la tua firma su di esse. Firma solo dichiarazioni completamente dettagliate e delle quali condividi in pieno il contenuto.</translation> </message> <message> + <source>The Bitcoin address to sign the message with</source> + <translation>L'indirizzo Bitcoin con cui vuoi contrassegnare il messaggio</translation> + </message> + <message> <source>Choose previously used address</source> <translation>Scegli un indirizzo usato precedentemente</translation> </message> @@ -1916,6 +2096,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Inserisci l'indirizzo del firmatario, il messaggio (assicurati di copiare esattamente anche i ritorni a capo, gli spazi, le tabulazioni, etc..) e la firma qui sotto, per verificare il messaggio. Presta attenzione a non vedere nella firma più di quanto non sia riportato nel messaggio stesso, per evitare di cadere vittima di attacchi di tipo man-in-the-middle.</translation> </message> <message> + <source>The Bitcoin address the message was signed with</source> + <translation>L'indirizzo Bitcoin con cui è stato contrassegnato il messaggio</translation> + </message> + <message> <source>Verify the message to ensure it was signed with the specified Bitcoin address</source> <translation>Verifica il messaggio per accertare che sia stato firmato con l'indirizzo specificato</translation> </message> @@ -2057,6 +2241,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>proprio indirizzo</translation> </message> <message> + <source>watch-only</source> + <translation>Guarda solo</translation> + </message> + <message> <source>label</source> <translation>etichetta</translation> </message> @@ -2077,6 +2265,14 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Debito</translation> </message> <message> + <source>Total debit</source> + <translation>Credito Totale</translation> + </message> + <message> + <source>Total credit</source> + <translation>Credito totale</translation> + </message> + <message> <source>Transaction fee</source> <translation>Commissione transazione</translation> </message> @@ -2227,6 +2423,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Ottenuto dal mining</translation> </message> <message> + <source>watch-only</source> + <translation>Guarda solo</translation> + </message> + <message> <source>(n/a)</source> <translation>(N / a)</translation> </message> @@ -2338,6 +2538,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Esporta lo storico delle transazioni</translation> </message> <message> + <source>Watch-only</source> + <translation>Sola lettura</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Esportazione Fallita.</translation> </message> @@ -2392,7 +2596,11 @@ Più URL vengono separati da una barra verticale |.</translation> </context> <context> <name>UnitDisplayStatusBarControl</name> - </context> + <message> + <source>Unit to show amounts in. Click to select another unit.</source> + <translation>Tipo di unità visualizzata. Clicca per selezionare un altra unità</translation> + </message> +</context> <context> <name>WalletFrame</name> <message> @@ -2449,26 +2657,10 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Opzioni:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Specifica il file di configurazione (predefinito: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Specifica il file pid (predefinito: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Specifica la cartella dati</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Attendi le connessioni su <porta> (predefinita: 8333 o testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Mantieni al massimo <n> connessioni ai peer (predefinite: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Connettiti ad un nodo per recuperare gli indirizzi dei peer e scollegati</translation> </message> @@ -2477,18 +2669,6 @@ Più URL vengono separati da una barra verticale |.</translation> <translation>Specifica il tuo indirizzo pubblico</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Soglia di disconnessione dei peer di cattiva qualità (predefinita: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Numero di secondi di sospensione che i peer di cattiva qualità devono attendere prima di potersi riconnettere (predefiniti: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Attendi le connessioni JSON-RPC su <porta> (predefinita: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Accetta comandi da riga di comando e JSON-RPC</translation> </message> @@ -2529,16 +2709,12 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Cifrature accettabili (predefinito: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Associa all'indirizzo indicato e resta permanentemente in ascolto su questo. Usa la notazione [host]:porta per l'IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Limita la quantità di transazioni gratuite ad <n>*1000 byte al minuto (predefinito: 15)</translation> + <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> + <translation>Elimina tutte le transazioni dal wallet e recupera solo le parti della blockchain con il comando -rescan all'avvio.</translation> </message> <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> @@ -2557,14 +2733,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Esegui comando quando una transazione del portamonete cambia (%s in cmd è sostituito da TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Scarica l'attività del database dalla memoria al log su disco ogni <n> megabytes (predefinito: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Determina quanto sarà approfondita la verifica da parte di -checkblocks (0-4, predefinito: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>In questa modalità -genproclimit determina quanti blocchi saranno generati immediatamente.</translation> </message> @@ -2573,10 +2741,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Imposta il numero di thread per la verifica degli script (da %u a %d, 0 = automatico, <0 = lascia questo numero di core liberi, predefinito: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Imposta il limite della cpu quando la generazione è abilitata (-1 = non limitato, predefinito: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Questa versione è una compilazione pre-rilascio - usala a tuo rischio - non utilizzarla per la generazione o per applicazioni di commercio</translation> </message> @@ -2585,10 +2749,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Impossibile associarsi a %s su questo computer. Probabilmente Bitcoin Core è già in esecuzione.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Usa un SOCKS5 proxy separato per raggiungere servizi nascosti di Tor (predefinito: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Attenzione: -paytxfee è molto alta. Questa è la commissione che si paga quando si invia una transazione.</translation> </message> @@ -2613,10 +2773,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>(predefinito: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(predefinito: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> può essere:</translation> </message> @@ -2645,10 +2801,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Opzioni di Debug/Test:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Disabilita la modalità sicura, escludi effettivamente gli eventi di modalità sicura (predefinito: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Scopre il proprio indirizzo IP (predefinito: 1 se in ascolto e no -externalip)</translation> </message> @@ -2677,6 +2829,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Errore caricamento database blocchi</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Errore: si è verificato un errore fatale, consulta il file debug.log for maggiori dettagli.</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Errore: la spazio libero sul disco è insufficiente!</translation> </message> @@ -2685,66 +2841,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Errore: portamonete bloccato, impossibile creare la transazione!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Errore: errore di sistema:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Nessuna porta disponibile per l'ascolto. Usa -listen=0 se vuoi procedere comunque.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Lettura informazioni blocco fallita</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Lettura blocco fallita</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Sincronizzazione dell'indice del blocco fallita</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Scrittura dell'indice del blocco fallita</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Scrittura informazioni blocco fallita</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Scrittura blocco fallita</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Scrittura informazioni file fallita</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Scrittura nel database dei bitcoin fallita</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Scrittura dell'indice di transazione fallita</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Scrittura dei dati di ripristino fallita</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Forza modalità provvisoria (predefinito: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Genera Bitcoin (predefinito: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Numero di blocchi da controllare all'avvio (predefinito: 288, 0 = tutti)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Se <category> non è specificata, mostra tutte le informazioni di debug.</translation> </message> @@ -2765,8 +2865,8 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Non ci sono abbastanza descrittori di file disponibili.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Preponi timestamp all'output di debug (predefinito: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Connetti solo ai nodi nella rete <net> (ipv4, ipv6 o Tor)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -2781,18 +2881,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Imposta la dimensione massima del blocco in byte (predefinita: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Specifica il numero massimo di richieste RPC in parallelo (predefinito: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Specifica il file portamonete (all'interno della cartella dati)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Spendi il resto non confermato quando si inviano transazioni (predefinito: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Questo è previsto per l'uso con test di regressione e per lo sviluppo di applicazioni.</translation> </message> @@ -2821,16 +2913,28 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Importa blocchi da un file blk000??.dat esterno</translation> </message> <message> + <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source> + <translation>Si è verificato un errore durante l'impostazione della %s porta %u RPC per l'ascolto su: %s</translation> + </message> + <message> <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source> <translation>Non è possibile ottenere un lock sulla cartella %s. Probabilmente Bitcoin Core è già in esecuzione.</translation> </message> <message> + <source>Error: Listening for incoming connections failed (listen returned error %s)</source> + <translation>Errore: l'ascolto per per connessioni in arrivo fallito (errore riportato %s)</translation> + </message> + <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Esegue un comando quando viene ricevuto un allarme rilevante o quando vediamo un fork veramente lungo (%s in cmd è sostituito dal messaggio)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Emette informazioni di debug in output (predefinito: 0, fornire <category> è opzionale)</translation> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source> + <translation>Le commissioni (in BTC/kb) minori di questa saranno considerate nulle per la trasmissione (predefinito: %s)</translation> + </message> + <message> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source> + <translation>Le commissioni inferiori a questo valore saranno considerate nulle per la creazione della transazione (predefinito: %s)</translation> </message> <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> @@ -2849,42 +2953,14 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Importo non valido per -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Limita la dimensione della cache delle firme a <n> voci (predefinito: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Abilita il log della priorità di transazione e della commissione per kB quando si generano blocchi (default: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Mantieni un indice di transazione completo (predefinito: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Buffer di ricezione massimo per connessione, <n>*1000 byte (predefinito: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Buffer di invio massimo per connessione, <n>*1000 byte (predefinito: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Accetta solo una catena di blocchi che corrisponde ai checkpoint predefiniti (predefinito: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Connetti solo a nodi nella rete <net> (IPv4, IPv6 o Tor)</translation> + <source>Node relay options:</source> + <translation>Opzioni relay nodo:</translation> </message> <message> <source>Print block on startup, if found in block index</source> <translation>Stampa il blocco all'avvio, se presente nell'indice dei blocchi</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Stampa l'albero dei blocchi all'avvio (default: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Opzioni RPC SSL: (consulta la Bitcoin Wiki per le istruzioni relative alla configurazione SSL)</translation> </message> @@ -2901,22 +2977,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Altera casualmente 1 ogni <n> messaggi di rete</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Mantieni in esecuzione un thread per scaricare periodicamente il portafoglio (predefinito: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Invia le informazioni di trace/debug alla console invece che al file debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Imposta dimensione minima del blocco in bytes (predefinita: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Imposta il flag DB_PRIVATE nell'ambiente di database del portamonete (predefinito: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Mostra tutte le opzioni di debug (utilizzo: --help -help-debug)</translation> </message> @@ -2929,14 +2993,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Transazione di firma fallita</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Specifica il timeout di connessione in millisecondi (predefinito: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Errore di sistema:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Questo è un software sperimentale.</translation> </message> @@ -2953,10 +3009,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Transazione troppo grande</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Usa UPnP per mappare la porta in ascolto (predefinito: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Usa UPnP per mappare la porta in ascolto (predefinito: 1 when listening)</translation> </message> @@ -2966,6 +3018,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com </translation> </message> <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>Il wallet ha bisogno di essere reiscritto : riavvia Bitcoin Core per completare l'operazione</translation> + </message> + <message> <source>Warning</source> <translation>Attenzione</translation> </message> @@ -2999,10 +3055,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com <translation>Aggiorna il wallet all'ultimo formato</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Impostare la quantità di chiavi nel key pool a <n> (predefinita: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Ripeti analisi della catena dei blocchi per cercare le transazioni mancanti dal portamonete </translation> @@ -3013,14 +3065,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com </translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>File certificato del server (predefinito: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Chiave privata del server (predefinito: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Questo messaggio di aiuto </translation> diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts index f056dd401e..dd2d8c8c72 100644 --- a/src/qt/locale/bitcoin_ja.ts +++ b/src/qt/locale/bitcoin_ja.ts @@ -1,4 +1,4 @@ -<TS language="ja" version="2.1"> +<TS language="ja" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -371,10 +371,6 @@ <translation>タブツールバー</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin のコア</translation> </message> @@ -398,10 +394,6 @@ <source>No block source available...</source> <translation>利用可能なブロックがありません...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>取引履歴の %1 ブロックを処理しました。</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n 時間</numerusform></translation> @@ -532,10 +524,6 @@ Address: %4 <translation>総額</translation> </message> <message> - <source>Address</source> - <translation>アドレス</translation> - </message> - <message> <source>Date</source> <translation>日付</translation> </message> @@ -728,6 +716,10 @@ Address: %4 <translation>ようこそ</translation> </message> <message> + <source>Welcome to Bitcoin Core.</source> + <translation>ようこそ!</translation> + </message> + <message> <source>Use the default data directory</source> <translation>初期値のデータ ディレクトリを使用</translation> </message> @@ -743,15 +735,7 @@ Address: %4 <source>Error</source> <translation>エラー</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GBの利用可能な空き領域</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(%1GB が必要)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -786,14 +770,6 @@ Address: %4 <translation>メイン (&M)</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>あたなの取引が早く処理されるように任意で kB 毎の取引手数料を設定します。ほとんどの取引は 1 kB です。</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>支払う取引手数料 (&f)</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>システムにログインした時に自動的に Bitcoin を起動します。</translation> </message> @@ -933,10 +909,6 @@ Address: %4 <translation>表示された情報は古いかもしれません。接続が確立されると、あなたのウォレットは Bitcoin ネットワークと自動的に同期しますが、このプロセスはまだ完了していません。</translation> </message> <message> - <source>Wallet</source> - <translation>ウォレット</translation> - </message> - <message> <source>Your current spendable balance</source> <translation>あなたの利用可能残高</translation> </message> @@ -961,10 +933,6 @@ Address: %4 <translation>あなたの現在の残高</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>最近の取引</b></translation> - </message> - <message> <source>out of sync</source> <translation>同期していない</translation> </message> @@ -2030,26 +1998,10 @@ Address: %4 <translation>オプション:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>設定ファイルの指定 (初期値: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>pid ファイルの指定 (初期値: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>データ ディレクトリの指定</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>接続のポート番号 (初期値: 8333、testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>ピアの最大接続数 (初期値: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>ピア アドレスを取得するためにノードに接続し、そして切断します</translation> </message> @@ -2058,18 +2010,6 @@ Address: %4 <translation>あなた自身のパブリックなアドレスを指定</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>不正なピアを切断するためのしきい値 (初期値: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>不正なピアを再接続するまでの秒数 (初期値: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation><port> で JSON-RPC 接続をリスン (初期値: 8332、testnet は 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>コマンドラインと JSON-RPC コマンドを許可</translation> </message> @@ -2153,10 +2093,6 @@ rpcpassword=%s <translation>(デフォルト: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(デフォルト: wallet.dat)</translation> - </message> - <message> <source>Attempt to recover private keys from a corrupt wallet.dat</source> <translation>壊れた wallet.dat から秘密鍵を復旧することを試す</translation> </message> @@ -2210,66 +2146,10 @@ rpcpassword=%s <translation>エラー: ウォレットはロックされ、取引を作成できません!</translation> </message> <message> - <source>Error: system error: </source> - <translation>エラー: システム エラー:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>ポートのリスンに失敗しました。必要であれば -listen=0 を使用してください。</translation> </message> <message> - <source>Failed to read block info</source> - <translation>ブロック情報の読み取りに失敗しました</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>ブロックの読み取りに失敗しました</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>ブロック インデックスの同期に失敗しました</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>ブロック インデックスの書き込みに失敗しました</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>ブロック情報の書き込みに失敗しました</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>ブロックの書き込みに失敗しました</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>ファイル情報の書き込みに失敗しました</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>コインデータベースへの書き込みに失敗しました</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>取引インデックスの書き込みに失敗しました</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>元へ戻すデータの書き込みに失敗しました</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>セーフモードを矯正する (デフォルト: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>コインを生成 (初期値: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>起動時に点検するブロック数 (初期値: 288, 0=すべて)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation><category> が与えられなかった場合には、すべてのデバッグ情報が出力されます。</translation> </message> @@ -2286,10 +2166,6 @@ rpcpassword=%s <translation>現在の blk000??.dat ファイルからブロック チェーンのインデックスを再構築</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>RPC サービスのスレッド数を設定 (初期値: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>ウォレットのファイルを指定 (データ・ディレクトリの中に)</translation> </message> @@ -2330,34 +2206,6 @@ rpcpassword=%s <translation>不正な額 -minrelaytxfee=<amount>: '%s'</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>署名キャッシュのサイズを <n> エントリーに制限する (デフォルト: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>ブロックの採掘時にトランザクションの優先度と1kBあたりの手数料をログに残す (デフォルト: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>完全な取引インデックスを維持する (初期値: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>接続毎の最大受信バッファ <n>*1000 バイト (初期値: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>接続毎の最大送信バッファ <n>*1000 バイト (初期値: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>内蔵のチェックポイントと一致するブロック チェーンのみを許可 (初期値: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation><net> (IPv4, IPv6, Tor) ネットワーク内のノードだけに接続する</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL オプション: (SSLのセットアップ手順はビットコインWikiを参照してください)</translation> </message> @@ -2370,10 +2218,6 @@ rpcpassword=%s <translation>トレース/デバッグ情報を debug.log ファイルの代わりにコンソールへ送る</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>最小ブロックサイズをバイトで設定 (初期値: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>クライアント起動時に debug.log ファイルを縮小 (初期値: -debug オプションを指定しない場合は1)</translation> </message> @@ -2382,14 +2226,6 @@ rpcpassword=%s <translation>取引の署名に失敗しました</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>接続のタイムアウトをミリセコンドで指定 (初期値: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>システム エラー:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>取引の額が小さ過ぎます</translation> </message> @@ -2402,10 +2238,6 @@ rpcpassword=%s <translation>取引が大き過ぎます</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>リスン ポートの割当に UPnP を使用 (初期値: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>リスン ポートの割当に UPnP を使用 (初期値: リスン中は1)</translation> </message> @@ -2438,10 +2270,6 @@ rpcpassword=%s <translation>ウォレットを最新のフォーマットにアップグレード</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>key pool のサイズを <n> (初期値: 100) にセット</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>失ったウォレットの取引のブロック チェーンを再スキャン</translation> </message> @@ -2450,14 +2278,6 @@ rpcpassword=%s <translation>JSON-RPC 接続に OpenSSL (https) を使用</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>サーバ証明書ファイル (初期値: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>サーバの秘密鍵 (初期値: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>このヘルプ メッセージ</translation> </message> diff --git a/src/qt/locale/bitcoin_ka.ts b/src/qt/locale/bitcoin_ka.ts index c23367171d..3faad159ad 100644 --- a/src/qt/locale/bitcoin_ka.ts +++ b/src/qt/locale/bitcoin_ka.ts @@ -1,4 +1,4 @@ -<TS language="ka" version="2.1"> +<TS language="ka" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -375,10 +375,6 @@ <translation>ბარათების პანელი</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -415,10 +411,6 @@ <translation>ბლოკების წყარო მიუწვდომელია...</translation> </message> <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>დამუშავებულია ტრანსაქციების ისტორიის %1 ბლოკი.</translation> - </message> - <message> <source>%1 and %2</source> <translation>%1 და %2</translation> </message> @@ -493,10 +485,6 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>მონეტების კონტროლის მისამართის არჩევა</translation> - </message> - <message> <source>Quantity:</source> <translation>რაოდენობა:</translation> </message> @@ -541,10 +529,6 @@ Address: %4 <translation>თანხა</translation> </message> <message> - <source>Address</source> - <translation>მისამართი</translation> - </message> - <message> <source>Date</source> <translation>თარიღი</translation> </message> @@ -852,15 +836,7 @@ Address: %4 <source>Error</source> <translation>შეცდომა</translation> </message> - <message> - <source>GB of free space available</source> - <translation>გიგაბაიტია თავისუფალი</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(საჭიროა %1GB)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -895,14 +871,6 @@ Address: %4 <translation>&მთავარი</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>დამატებითი საკომისიო თითო კილობაიტზე; აჩქარებს ტრანსაქციის შესრულებას. ტრანსაქციების უმეტესობა არის 1 კბ.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>ტრანსაქციის სა&ფასურის გადახდა</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>სისტემაში შესვლის შემდეგ Bitcoin-ის ავტომატური გაშვება.</translation> </message> @@ -923,14 +891,6 @@ Address: %4 <translation>სკრიპტის &ვერიფიცირების ნაკადების რაოდენობა</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Bitcoin-ქსელზე მიერთება SOCKS-პროქსით.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>SO&CKS (ნაგულისხმევი) პროქსი მიერთებისათვის:</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>პროქსის IP-მისამართი (მაგ.: IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1070,10 +1030,6 @@ Address: %4 <translation>ნაჩვენები ინფორმაცია შეიძლება მოძველებული იყოს. თქვენი საფულე ავტომატურად სინქრონიზდება Bitcoin-ის ქსელთან კავშირის დამყარების შემდეგ, ეს პროცესი ჯერ არ არის დასრულებული.</translation> </message> <message> - <source>Wallet</source> - <translation>საფულე</translation> - </message> - <message> <source>Available:</source> <translation>ხელმისაწვდომია:</translation> </message> @@ -1106,10 +1062,6 @@ Address: %4 <translation>თქვენი სრული მიმდინარე ბალანსი</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>ბოლო ტრანსაქციები</b></translation> - </message> - <message> <source>out of sync</source> <translation>არ არის სინქრონიზებული</translation> </message> @@ -2351,26 +2303,10 @@ Address: %4 <translation>ოპციები:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>მიუთითეთ საკონფიგურაციო ფაილი (ნაგულისხმევია: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>მიუთითეთ pid ფაილი (ნაგულისხმევია: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>მიუთითეთ მონაცემთა კატალოგი</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>მიყურადება პორტზე <port> (ნაგულისხმევი: 8333 ან სატესტო ქსელში: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>არაუმეტეს <n> შეერთებისა პირებზე (ნაგულისხმევი: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>მიერთება კვანძთან, პირების მისამართების მიღება და გათიშვა</translation> </message> @@ -2379,18 +2315,6 @@ Address: %4 <translation>მიუთითეთ თქვენი საჯარო მისამართი</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>არასწორად მოქმედი პირების გათიშვის ზღვარი (ნაგულისხმევი:100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>არასწორად მოქმედი პირების ბლოკირების დრო წამებში (ნაგულისხმევი: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation> JSON-RPC-შეერთებების მიყურადება პორტზე <port> (ნაგულისხმევი: 8332 ან სატესტო ქსელში: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>საკომანდო სტრიქონისა და JSON-RPC-კომამდების ნებართვა</translation> </message> @@ -2431,10 +2355,6 @@ rpcpassword=%s </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>დაშვებული ალგორითმები (ნაგულისხმევი: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>მოცემულ მისამართზე მიჯაჭვა მუდმივად მასზე მიყურადებით. გამოიყენეთ [host]:port ფორმა IPv6-სათვის</translation> </message> @@ -2459,10 +2379,6 @@ rpcpassword=%s <translation>ეს არის წინასწარი სატესტო ვერსია - გამოიყენეთ საკუთარი რისკით - არ გამოიყენოთ მოპოვებისა ან კომერციული მიზნებისათვის</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>ფარული Tor-სერვისებით პირების წვდომისათვის სხვა SOCKS5 პროქსის გამოყენება (ნაგულისხმევია: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>ყურადღება: ძალიან მაღალია -paytxfee - საკომისო, რომელსაც თქვენ გადაიხდით ამ ტრანსაქციის გაგზავნის საფასურად.</translation> </message> @@ -2539,62 +2455,10 @@ rpcpassword=%s <translation>შეცდომა: საფულე დაბლოკილია, ტრანსაქცია ვერ შეიქმნება!</translation> </message> <message> - <source>Error: system error: </source> - <translation>შეცდომა: სისტემური შეცდომა:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>ვერ ხერხდება პორტების მიყურადება. თუ გსურთ, გამოიყენეთ -listen=0.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>ბლოკის ინფორმაცია არ იკითხება</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>ბლოკი არ იკითხება</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>ბლოკების ინდექსის სინქრონიზება ვერ მოხერხდა</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>ბლოკების ინდექსის ჩაწერა ვერ მოხერხდა</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>ბლოკის ინფორმაციის ჩაწერა ვერ მოხერხდა</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>ბლოკის ჩაწერა ვერ მოხერხდა</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>ფაილის ინფორმაციის ჩაწერა ვერ მოხერხდა</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>მონეტების ბაზის ჩაწერა ვერ მოხერხდა</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>ტრანსაქციების ინდექსის ჩაწერა ვერ მოხერხდა</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>ცვლილებების გაუქმების მონაცემთა ჩაწერა ვერ მოხერხდა</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>მონეტების გენერირება (ნაგულისხმევი: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>რამდენი ბლოკი შემოწმდეს გაშვებისას (ნაგულისხმევი: 288, 0 - ყველა)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>თუ <category> არ არის მითითებული, ნაჩვენები იქნება სრული დახვეწის ინფორმაცია.</translation> </message> @@ -2611,10 +2475,6 @@ rpcpassword=%s <translation>არ არის საკმარისი ფაილ-დესკრიპტორები.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>დაემატოს დახვეწის ინფორმაციას დროის ჭდეები (ნაგულისხმევი: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>ბლოკთა ჯაჭვის ინდექსის ხელახლა აგება blk000??.dat ფაილიდან</translation> </message> @@ -2623,18 +2483,10 @@ rpcpassword=%s <translation>ბლოკის მაქსიმალური ზომის განსაზღვრა ბაიტებში (ნადულისხმევი: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>RPC-ნაკადების რაოდენობა (ნაგულისხმევი: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>მიუთითეთ საფულის ფაილი (კატალოგში)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>დაუდასტურებელი ხურდის გამოყენება ტრანსაქციის გაგზავნისას (ნაგულისხმევი: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>გამოიყენება რეგრესული ტესტირების ინსტრუმენტებისა და პროგრამების შემუშავებისას.</translation> </message> @@ -2667,10 +2519,6 @@ rpcpassword=%s <translation>ბრძანების შესრულება შესაბამისი უწყების მიღებისას ან როცა შეინიშნება საგრძნობი გახლეჩა (cmd-ში %s შეიცვლება მესიჯით)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>დახვეწის ინფორმაციის გამოყვანა (ნაგულისხმევი: 0, <category> - არააუცილებელი არგუმენტია)</translation> - </message> - <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>მაღალპრიორიტეტული/დაბალსაკომისიოიანი ტრანსაქციების მაქსიმალური ზომა ბაიტებში (ნაგულისხმევი: %d)</translation> </message> @@ -2687,34 +2535,10 @@ rpcpassword=%s <translation>დაუშვებელი მნიშვნელობა -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>ტრანსაქციის სრული ინდექსი (ნაგულისხმევი: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>მიღების ბუფერის მაქსიმალური ზომა შეერთებაზე, <n>*1000 ბაიტი (ნაგულისხმევი: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>გაგზავნის ბუფერის მაქსიმალური ზომა შეერთებაზე, <n>*1000 ბაიტი (ნაგულისხმევი: 5000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>ბლოკთა ჯაჭვი მიიღეთ მხოლოდ მაშინ, თუ ემთხვევა შიდა ჩეკპოინტები (ნაგულისხმევი: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>შეერთება მხოლოდ <net> ქსელის კვანძებთან (IPv4, IPv6 ან Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>ტრასირების/დახვეწის ინფოს გაგზავნა კონსოლზე debug.log ფაილის ნაცვლად</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>დააყენეთ ბლოკის მინიმალური ზომა ბაიტებში (ნაგულისხმევი: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>debug.log ფაილის შეკუმშვა გაშვებისას (ნაგულისხმევია: 1 როცა არ აყენია -debug)</translation> </message> @@ -2723,14 +2547,6 @@ rpcpassword=%s <translation>ტრანსაქციების ხელმოწერა ვერ მოხერხდა</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>მიუთითეთ შეერთების ტაიმაუტი მილიწამებში (ნაგულისხმევი: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>სისტემური შეცდომა:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>ტრანსაქციების რაოდენობა ძალიან ცოტაა</translation> </message> @@ -2743,10 +2559,6 @@ rpcpassword=%s <translation>ტრანსაქცია ძალიან დიდია</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>გამოიყენეთ UPnP მისაყურადებელი პორტის გადასამისამართებლად (ნაგულისხმევი: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>გამოიყენეთ UPnP მისაყურადებელი პორტის გადასამისამართებლად (ნაგულისხმევი: 1 როცა ჩართულია მიყურადება)</translation> </message> @@ -2783,10 +2595,6 @@ rpcpassword=%s <translation>საფულის ფორმატის განახლება</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>გასაღების პულის ზომა იქნება <n> (ნაგულისხმევი: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>ბლოკების ჯაჭვის გადამოწმება საფულეში გამორჩენილ ტრანსაქციებზე</translation> </message> @@ -2795,14 +2603,6 @@ rpcpassword=%s <translation>OpenSSL-ის (https) გამოყენება JSON-RPC-შეერთებებისათვის</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>სერვერის სერტიფიკატის ფაილი (ნაგულისხმევი: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>სერვერის პირადი გასაღები (ნაგულისხმევი: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>ეს ტექსტი</translation> </message> diff --git a/src/qt/locale/bitcoin_kk_KZ.ts b/src/qt/locale/bitcoin_kk_KZ.ts index e9eddd503c..3d38b00217 100644 --- a/src/qt/locale/bitcoin_kk_KZ.ts +++ b/src/qt/locale/bitcoin_kk_KZ.ts @@ -1,4 +1,4 @@ -<TS language="kk_KZ" version="2.1"> +<TS language="kk_KZ" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -85,10 +85,6 @@ <context> <name>CoinControlDialog</name> <message> - <source>Address</source> - <translation>Адрес</translation> - </message> - <message> <source>(no label)</source> <translation>(таңбасыз)</translation> </message> diff --git a/src/qt/locale/bitcoin_ko_KR.ts b/src/qt/locale/bitcoin_ko_KR.ts index 9fe31b4330..efc41ec6b7 100644 --- a/src/qt/locale/bitcoin_ko_KR.ts +++ b/src/qt/locale/bitcoin_ko_KR.ts @@ -1,4 +1,4 @@ -<TS language="ko_KR" version="2.1"> +<TS language="ko_KR" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -287,6 +287,10 @@ <translation>URI&열기...</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>비트코인 코어 클라이언트</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>디스크에서 블록 가져오는 중...</translation> </message> @@ -339,6 +343,10 @@ <translation>받기(&R)</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation>비트코인 코어에 관한 정보입니다.</translation> + </message> + <message> <source>&Show / Hide</source> <translation>보이기/숨기기(&S)</translation> </message> @@ -375,10 +383,6 @@ <translation>툴바 색인표</translation> </message> <message> - <source>[testnet]</source> - <translation>[테스트넷]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>비트코인 코어</translation> </message> @@ -414,10 +418,6 @@ <source>No block source available...</source> <translation>사용 가능한 블록이 없습니다...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>%1 블록의 거래 기록들이 처리됨.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n시간</numerusform></translation> @@ -505,10 +505,6 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>코인 컨트롤 주소 선택</translation> - </message> - <message> <source>Quantity:</source> <translation>수량:</translation> </message> @@ -529,10 +525,18 @@ Address: %4 <translation>수수료:</translation> </message> <message> + <source>Dust:</source> + <translation>더스트:</translation> + </message> + <message> <source>After Fee:</source> <translation>수수료 이후:</translation> </message> <message> + <source>Change:</source> + <translation>체인지:</translation> + </message> + <message> <source>(un)select all</source> <translation>모두 선택(하지 않음)</translation> </message> @@ -549,10 +553,6 @@ Address: %4 <translation>거래량</translation> </message> <message> - <source>Address</source> - <translation>주소</translation> - </message> - <message> <source>Date</source> <translation>날짜</translation> </message> @@ -852,15 +852,7 @@ Address: %4 <source>Error</source> <translation>오류</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB가 사용가능</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(%1GB가 필요)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -895,14 +887,6 @@ Address: %4 <translation>메인(&M)</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>당신의 거래가 더욱 빠르게 처리될 수 있도록 선택적으로 kBd당 거래 수수료를 지정합니다. 참고로 대부분의 거래들은 1kB입니다.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>송금 수수료(&F)</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>시스템 로그인후에 비트코인을 자동으로 시작합니다.</translation> </message> @@ -923,12 +907,12 @@ Address: %4 <translation>스크립트 인증 쓰레드의 개수</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>SOCKS 프록시를 통해 비트코인 네트워크 연결</translation> + <source>Accept connections from outside</source> + <translation>외부로부터의 연결을 승인합니다.</translation> </message> <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>SOCKS 프록시를 거쳐 연결합니다 (기본값 프록시):</translation> + <source>Allow incoming connections</source> + <translation>연결 요청을 허용합니다.</translation> </message> <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> @@ -1082,8 +1066,8 @@ Address: %4 <translation>표시한 정보가 오래된 것 같습니다. 비트코인 네트워크에 연결하고 난 다음에 지갑을 자동으로 동기화 하지만, 아직 과정이 끝나지는 않았습니다.</translation> </message> <message> - <source>Wallet</source> - <translation>지갑</translation> + <source>Watch-only:</source> + <translation>모니터링 지갑:</translation> </message> <message> <source>Available:</source> @@ -1118,8 +1102,8 @@ Address: %4 <translation>당신의 현재 총액</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>최근 거래내역</b></translation> + <source>Your current balance in watch-only addresses</source> + <translation>모니터링 지갑의 현재 잔액</translation> </message> <message> <source>out of sync</source> @@ -1537,6 +1521,10 @@ Address: %4 <translation>수수료 이후:</translation> </message> <message> + <source>Change:</source> + <translation>체인지:</translation> + </message> + <message> <source>Custom change address</source> <translation>주소변경</translation> </message> @@ -1553,6 +1541,10 @@ Address: %4 <translation>양식의 모든 필드를 지웁니다</translation> </message> <message> + <source>Dust:</source> + <translation>더스트:</translation> + </message> + <message> <source>Clear &All</source> <translation>모두 지우기(&A)</translation> </message> @@ -1712,6 +1704,10 @@ Address: %4 <translation>사용된 주소 목록에 새 주소를 추가하기 위해 제목을 입력합니다. </translation> </message> <message> + <source>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.</source> + <translation>비트코인에 첨부된 메시지: 참고용으로 거래와 함께 저장될 URI. 메모: 이 메시지는 비트코인 네트워크로 전송되지 않습니다.</translation> + </message> + <message> <source>This is an unverified payment request.</source> <translation>지급요청 미확인입니다</translation> </message> @@ -2319,26 +2315,10 @@ Address: %4 <translation>옵션:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>설정파일 지정 (기본값: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>pid 파일 지정 (기본값: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>데이터 폴더 지정</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation><port>로 연결을 허용한다 (기본값: 8333 또는 테스트넷: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>가장 잘 연결되는 사용자를 유지합니다(기본값: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>피어 주소를 받기 위해 노드에 연결하고, 받은 후에 연결을 끊습니다</translation> </message> @@ -2347,18 +2327,6 @@ Address: %4 <translation>공인 주소를 지정하십시오</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>이상행동 네트워크 참여자의 연결을 차단시키기 위한 한계치 (기본값: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>이상행동을 하는 네트워크 참여자들을 다시 연결시키는데 걸리는 시간 (기본값: 86400초)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>포트 <port>을 통해 JSON-RPC 연결 (기본값: 8332 또는 testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>명령줄과 JSON-RPC 명령 수락</translation> </message> @@ -2375,10 +2343,6 @@ Address: %4 <translation>외부 접속을 승인합니다</translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>암호 허용(기본값: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>선택된 주소로 고정하며 항상 리슨(Listen)합니다. IPv6 프로토콜인 경우 [host]:port 방식의 명령어 표기법을 사용합니다.</translation> </message> @@ -2401,10 +2365,6 @@ Address: %4 <translation>이 빌드 버전은 정식 출시 전 테스트의 목적이며, 예기치 않은 위험과 오류가 발생할 수 있습니다. 채굴과 상점용 소프트웨어로 사용하는 것을 권하지 않습니다.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Tor 서비스를 이용하여 네트워크에 참여하기 위해서 SOCKS5 프록시를 따로 사용함 (기본값: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>경고: -paytxfee값이 너무 큽니다! 이 값은 송금할때 지불할 송금 수수료입니다.</translation> </message> @@ -2429,10 +2389,6 @@ Address: %4 <translation>(기본값: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(기본값: wallet.dat)</translation> - </message> - <message> <source>Attempt to recover private keys from a corrupt wallet.dat</source> <translation>손상된 wallet.dat에서 개인키 복원을 시도합니다</translation> </message> @@ -2457,10 +2413,6 @@ Address: %4 <translation>디버그 및 테스트 설정</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>안전 모드를 비활성화하고 안전 모드의 이벤트가 발생하더라도 무시합니다. (기본값: 0, 비활성화)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>자신의 아이피 주소를 발견합니다 (기본값: 1 반응이 없거나 외부 아이피가 없을 때)</translation> </message> @@ -2493,64 +2445,12 @@ Address: %4 <translation>오류: 지갑이 잠금상태여서 거래를 생성할 수 없습니다!</translation> </message> <message> - <source>Error: system error: </source> - <translation>오류: 시스템 오류:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>어떤 포트도 반응하지 않습니다. 사용자 반응=0 만약 원한다면</translation> </message> <message> - <source>Failed to read block info</source> - <translation>블록 정보를 읽는데 실패했습니다</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>블록을 읽는데 실패했습니다</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>블록 인덱스를 동기화하는데 실패했습니다</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>블록 인덱스를 기록하는데 실패했습니다</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>블록 정보를 기록하는데 실패했습니다</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>블록을 기록하는데 실패했습니다</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>파일 정보를 기록하는데 실패했습니다</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>코인 데이터베이스에 기록하는데 실패했습니다</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>송금 인덱스에 기록하는데 실패했습니다</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>데이터 실행 취소를 기록하는데 실패했습니다</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>안전 모드로 강제 진입하는 기능입니다.(기본값: 0) </translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>코인 생성(기본값: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>시작할때 검사할 블록 갯수입니다(기본값: 288, 0 = 모두)</translation> + <source>If <category> is not supplied, output all debugging information.</source> + <translation><카테고리>가 제공되지 않을 경우, 모든 디버깅 정보를 출력</translation> </message> <message> <source>Importing...</source> @@ -2581,10 +2481,6 @@ Address: %4 <translation>최대 블락 크기를 Bytes로 지정하세요 (기본: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>원격 프로시져 호출 서비스를 위한 쓰레드 개수를 설정합니다 (기본값 : 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>데이터 폴더 안에 지갑 파일을 선택하세요.</translation> </message> @@ -2621,10 +2517,6 @@ Address: %4 <translation>이 사항과 관련있는 경고가 발생하거나 아주 긴 포크가 발생했을 때 명령어를 실행해 주세요. (cmd 명령어 목록에서 %s는 메시지로 대체됩니다) </translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>출력 오류 정보(기본값:0, 임의의 공급 카테고리)</translation> - </message> - <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>최대 크기를 최우선으로 설정 / 바이트당 최소 수수료로 거래(기본값: %d)</translation> </message> @@ -2641,42 +2533,10 @@ Address: %4 <translation>최저 거래 수수료가 부족합니다. -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation><n>번 째 순서에서 전자서명 캐쉬의 용량을 제한합니다. (기본값: 50000) </translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>블럭을 채굴할 때 kB당 거래 우선 순위와 수수료를 로그에 남깁니다. (기본값: 0, 비활성화)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>전체 거래 지수를 유지합니다(기본값: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>최대 연결마다 1000bytes 버퍼를 받는다. (기본값: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>최대 연결 마다 1000bytes 버퍼를 보낸다.(기본값: 1000) </translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>내부 중단점에 일치하는 블록 체인만 수용(기본값: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>노드가 있는 네트워크에만 접속 합니다(IPv4, IPv6 또는 Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>블럭 색인을 발견하면 구동 시 블럭을 출력합니다.</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>구동 시 블럭 트리를 출력합니다. (기본값: 0, 비활성화)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL 옵션: (비트코인 위키의 SSL 설정 설명서 참고)</translation> </message> @@ -2693,14 +2553,6 @@ Address: %4 <translation>추적오류 정보를 degug.log 자료로 보내는 대신 콘솔로 보내기</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>바이트 단위의 최소 블록 크기 설정(기본값: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>전자지갑 데이터베이스 환경에 DB_PRIVATE 플래그를 설정합니다. (기본값: 1, 활성화)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>모든 디버그 설정 보기(설정: --help -help-debug)</translation> </message> @@ -2713,14 +2565,6 @@ Address: %4 <translation>거래를 서명하는것을 실패하였습니다.</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>밀리초 단위로 연결 제한시간을 설정하십시오(기본값: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>시스템 오류:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>거래량이 너무 적습니다</translation> </message> @@ -2733,10 +2577,6 @@ Address: %4 <translation>너무 큰 거래</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>UPnP사용하여 지도에서 포트 반응기다리는 중 (기본값: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>UPnP사용하여 지도에서 포트 반응기다리는 중 (기본값: 1 반응이 생기면)</translation> </message> @@ -2777,10 +2617,6 @@ Address: %4 <translation>지갑을 최근 형식으로 개선하시오</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>키 풀 크기 설정 <n>(기본값: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>누락된 지갑 송금에 대한 블록 체인 다시 검색</translation> </message> @@ -2789,14 +2625,6 @@ Address: %4 <translation>JSON-RPC 연결에 OpenSSL(https) 사용</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>서버 인증 파일 (기본값: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>서버 개인 키(기본값: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>도움말 메시지입니다</translation> </message> diff --git a/src/qt/locale/bitcoin_ky.ts b/src/qt/locale/bitcoin_ky.ts index ad4b5eae03..ed7542261c 100644 --- a/src/qt/locale/bitcoin_ky.ts +++ b/src/qt/locale/bitcoin_ky.ts @@ -1,4 +1,4 @@ -<TS language="ky" version="2.1"> +<TS language="ky" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -73,10 +73,6 @@ <context> <name>CoinControlDialog</name> <message> - <source>Address</source> - <translation>Дарек</translation> - </message> - <message> <source>Date</source> <translation>Дата</translation> </message> @@ -154,10 +150,6 @@ <context> <name>OverviewPage</name> <message> - <source>Wallet</source> - <translation>Капчык</translation> - </message> - <message> <source>out of sync</source> <translation>синхрондоштурулган эмес</translation> </message> diff --git a/src/qt/locale/bitcoin_la.ts b/src/qt/locale/bitcoin_la.ts index 450228b221..c399f36159 100644 --- a/src/qt/locale/bitcoin_la.ts +++ b/src/qt/locale/bitcoin_la.ts @@ -1,4 +1,4 @@ -<TS language="la" version="2.1"> +<TS language="la" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -315,10 +315,6 @@ <translation>Tabella instrumentorum "Tabs"</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Nucleus</translation> </message> @@ -330,10 +326,6 @@ <source>No block source available...</source> <translation>Nulla fons frustorum absens...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Processae %1 frusta historiae transactionum.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n hora</numerusform><numerusform>%n horae</numerusform></translation> @@ -425,10 +417,6 @@ Inscriptio: %4 <translation>Quantitas</translation> </message> <message> - <source>Address</source> - <translation>Inscriptio</translation> - </message> - <message> <source>Date</source> <translation>Dies</translation> </message> @@ -571,14 +559,6 @@ Inscriptio: %4 <translation>&Princeps</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Optionalis merces transactionum singulis kB quae adiuvat curare tuas transactiones processas esse celeriter. Plurimi transactiones 1kB sunt.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Solve &mercedem transactionis</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Pelle Bitcoin per se postquam in systema inire.</translation> </message> @@ -690,10 +670,6 @@ Inscriptio: %4 <translation>Monstrata informatio fortasse non recentissima est. Tuum cassidile per se synchronizat cum rete Bitcoin postquam conexio constabilita est, sed hoc actio nondum perfecta est.</translation> </message> <message> - <source>Wallet</source> - <translation>Cassidile</translation> - </message> - <message> <source>Immature:</source> <translation>Immatura:</translation> </message> @@ -702,10 +678,6 @@ Inscriptio: %4 <translation>Fossum pendendum quod nondum maturum est</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Recentes transactiones</b></translation> - </message> - <message> <source>out of sync</source> <translation>non synchronizato</translation> </message> @@ -1515,26 +1487,10 @@ Inscriptio: %4 <translation>Optiones:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Specifica configurationis plicam (praedefinitum: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Specifica pid plicam (praedefinitum: bitcoin.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Specifica indicem datorum</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Ausculta pro conexionibus in <porta> (praedefinitum: 8333 vel testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Manutene non plures quam <n> conexiones ad paria (praedefinitum: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Conecta ad nodum acceptare inscriptiones parium, et disconecte</translation> </message> @@ -1543,18 +1499,6 @@ Inscriptio: %4 <translation>Specifica tuam propriam publicam inscriptionem</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Limen pro disconectendo paria improba (praedefinitum: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Numerum secundorum prohibere ne paria improba reconectant (praedefinitum: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Ausculta pro conexionibus JSON-RPC in <porta> (praedefinitum: 8332 vel testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Accipe terminalis et JSON-RPC mandata.</translation> </message> @@ -1675,62 +1619,10 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c <translation>Error: Cassidile seratum, non posse transactionem creare!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Error: systematis error:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Non potuisse auscultare in ulla porta. Utere -listen=0 si hoc vis.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Non potuisse informationem frusti legere </translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Non potuisse frustum legere</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Synchronizare indicem frustorum abortum est</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Scribere indicem frustorum abortum est</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Scribere informationem abortum est</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Scribere frustum abortum est</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Scribere informationem plicae abortum est</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Scribere databasem nummorum abortum est</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Scribere indicem transactionum abortum est</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Scribere data pro cancellando mutationes abortum est</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Genera nummos (praedefinitum: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Quot frusta proba ad initium (praedefinitum: 288, 0 = omnia)</translation> - </message> - <message> <source>Not enough file descriptors available.</source> <translation>Inopia descriptorum plicarum.</translation> </message> @@ -1739,10 +1631,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c <translation>Restituere indicem catenae frustorum ex activis plicis blk000??.dat</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Constitue numerum filorum ad tractandum RPC postulationes (praedefinitum: 4)</translation> - </message> - <message> <source>Verifying blocks...</source> <translation>Verificante frusta...</translation> </message> @@ -1767,34 +1655,10 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c <translation>Quantitas non valida pro -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Manutene completam indicem transactionum (praedefinitum: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maxima magnitudo memoriae pro datis accipendis singulis conexionibus, <n>*1000 octetis/bytes (praedefinitum: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maxima magnitudo memoriae pro datis mittendis singulis conexionibus, <n>*1000 octetis/bytes (praedefinitum: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Tantum accipe catenam frustorum convenientem internis lapidibus (praedefinitum: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Tantum conecte ad nodos in rete <net> (IPv4, IPv6 aut Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Mitte informationem vestigii/debug ad terminale potius quam plicam debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Constitue minimam magnitudinem frusti in octetis/bytes (praedefinitum: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Diminue plicam debug.log ad initium clientis (praedefinitum: 1 nisi -debug)</translation> </message> @@ -1803,14 +1667,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c <translation>Signandum transactionis abortum est</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Specifica tempumfati conexionis in millisecundis (praedefinitum: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Systematis error:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Magnitudo transactionis nimis parva</translation> </message> @@ -1823,10 +1679,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c <translation>Transactio nimis magna</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Utere UPnP designare portam auscultandi (praedefinitum: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Utere UPnP designare portam auscultandi (praedefinitum: 1 quando auscultans)</translation> </message> @@ -1859,10 +1711,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c <translation>Progredere cassidile ad formam recentissimam</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Constitue magnitudinem stagni clavium ad <n> (praedefinitum: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Iterum perlege catenam frustorum propter absentes cassidilis transactiones</translation> </message> @@ -1871,14 +1719,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c <translation>Utere OpenSSL (https) pro conexionibus JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Plica certificationis daemonis moderantis (praedefinitum: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Clavis privata daemonis moderans (praedefinitum: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Hic nuntius auxilii</translation> </message> diff --git a/src/qt/locale/bitcoin_lt.ts b/src/qt/locale/bitcoin_lt.ts index 6d0fb684da..1f70400df6 100644 --- a/src/qt/locale/bitcoin_lt.ts +++ b/src/qt/locale/bitcoin_lt.ts @@ -1,4 +1,4 @@ -<TS language="lt" version="2.1"> +<TS language="lt" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -38,6 +38,18 @@ <translation>&Trinti</translation> </message> <message> + <source>C&hoose</source> + <translation>P&asirinkti</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>Siunčiami adresai</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Gaunami adresai</translation> + </message> + <message> <source>Copy &Label</source> <translation>Kopijuoti ž&ymę</translation> </message> @@ -46,10 +58,22 @@ <translation>&Keisti</translation> </message> <message> + <source>Export Address List</source> + <translation>Eksportuoti adresų sąrašą</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> <translation>Kableliais išskirtas failas (*.csv)</translation> </message> - </context> + <message> + <source>Exporting Failed</source> + <translation>Eksportavimas nepavyko</translation> + </message> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>Bandant išsaugoti adresų sąrašą - įvyko klaida keliant į %1. Prašome bandyti dar kartą.</translation> + </message> +</context> <context> <name>AddressTableModel</name> <message> @@ -179,6 +203,10 @@ <translation>&Apžvalga</translation> </message> <message> + <source>Node</source> + <translation>Taškas</translation> + </message> + <message> <source>Show general overview of wallet</source> <translation>Rodyti piniginės bendrą apžvalgą</translation> </message> @@ -223,6 +251,18 @@ <translation>&Keisti slaptafrazę...</translation> </message> <message> + <source>&Sending addresses...</source> + <translation>&Siunčiami adresai...</translation> + </message> + <message> + <source>&Receiving addresses...</source> + <translation>&Gaunami adresai...</translation> + </message> + <message> + <source>Bitcoin Core client</source> + <translation>Bitcoin Core klientas</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>Blokai importuojami iš disko...</translation> </message> @@ -275,6 +315,10 @@ <translation>&Gauti</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation>Rodyti informaciją apie Bitcoin Core</translation> + </message> + <message> <source>&Show / Hide</source> <translation>&Rodyti / Slėpti</translation> </message> @@ -283,6 +327,10 @@ <translation>Rodyti arba slėpti pagrindinį langą</translation> </message> <message> + <source>Encrypt the private keys that belong to your wallet</source> + <translation>Užšifruoti privačius raktus, kurie priklauso jūsų piniginei</translation> + </message> + <message> <source>&File</source> <translation>&Failas</translation> </message> @@ -299,13 +347,13 @@ <translation>Kortelių įrankinė</translation> </message> <message> - <source>[testnet]</source> - <translation>[testavimotinklas]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin branduolys</translation> </message> + <message> + <source>&About Bitcoin Core</source> + <translation>&Apie Bitcoin Core</translation> + </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n Bitcoin tinklo aktyvus ryšys</numerusform><numerusform>%n Bitcoin tinklo aktyvūs ryšiai</numerusform><numerusform>%n Bitcoin tinklo aktyvūs ryšiai</numerusform></translation> @@ -322,6 +370,10 @@ <source>%n week(s)</source> <translation><numerusform>%n savaitė</numerusform><numerusform>%n savaitės</numerusform><numerusform>%n savaičių</numerusform></translation> </message> + <message numerus="yes"> + <source>%n year(s)</source> + <translation><numerusform>%n metas</numerusform><numerusform>%n metai</numerusform><numerusform>%n metų</numerusform></translation> + </message> <message> <source>Error</source> <translation>Klaida</translation> @@ -380,26 +432,66 @@ Adresas: %4</translation> <context> <name>CoinControlDialog</name> <message> + <source>Quantity:</source> + <translation>Kiekis:</translation> + </message> + <message> + <source>Bytes:</source> + <translation>Baitai:</translation> + </message> + <message> <source>Amount:</source> <translation>Suma:</translation> </message> <message> - <source>Amount</source> - <translation>Suma</translation> + <source>Priority:</source> + <translation>Pirmumas:</translation> </message> <message> - <source>Address</source> - <translation>Adresas</translation> + <source>Fee:</source> + <translation>Mokestis:</translation> + </message> + <message> + <source>After Fee:</source> + <translation>Po mokesčio:</translation> + </message> + <message> + <source>Change:</source> + <translation>Graža:</translation> + </message> + <message> + <source>(un)select all</source> + <translation>(ne)pasirinkti viską</translation> + </message> + <message> + <source>Tree mode</source> + <translation>Medžio režimas</translation> + </message> + <message> + <source>List mode</source> + <translation>Sąrašo režimas</translation> + </message> + <message> + <source>Amount</source> + <translation>Suma</translation> </message> <message> <source>Date</source> <translation>Data</translation> </message> <message> + <source>Confirmations</source> + <translation>Patvirtinimai</translation> + </message> + <message> <source>Confirmed</source> <translation>Patvirtintas</translation> </message> <message> + <source>Priority</source> + <translation>Pirmumas</translation> + </message> + <message> <source>Copy address</source> <translation>Kopijuoti adresą</translation> </message> @@ -412,6 +504,74 @@ Adresas: %4</translation> <translation>Kopijuoti sumą</translation> </message> <message> + <source>Copy quantity</source> + <translation>Kopijuoti kiekį</translation> + </message> + <message> + <source>Copy fee</source> + <translation>Kopijuoti mokestį</translation> + </message> + <message> + <source>Copy after fee</source> + <translation>Kopijuoti po mokesčio</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Kopijuoti baitus</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Kopijuoti pirmumą</translation> + </message> + <message> + <source>highest</source> + <translation>auksčiausias</translation> + </message> + <message> + <source>higher</source> + <translation>aukštesnis</translation> + </message> + <message> + <source>high</source> + <translation>aukštas</translation> + </message> + <message> + <source>medium-high</source> + <translation>vidutiniškai aukštas</translation> + </message> + <message> + <source>medium</source> + <translation>vidutiniškai</translation> + </message> + <message> + <source>low-medium</source> + <translation>žemai-vidutiniškas</translation> + </message> + <message> + <source>low</source> + <translation>žemas</translation> + </message> + <message> + <source>lower</source> + <translation>žemesnis</translation> + </message> + <message> + <source>lowest</source> + <translation>žemiausias</translation> + </message> + <message> + <source>none</source> + <translation>niekas</translation> + </message> + <message> + <source>yes</source> + <translation>taip</translation> + </message> + <message> + <source>no</source> + <translation>ne</translation> + </message> + <message> <source>(no label)</source> <translation>(nėra žymės)</translation> </message> @@ -465,6 +625,10 @@ Adresas: %4</translation> </context> <context> <name>FreespaceChecker</name> + <message> + <source>name</source> + <translation>pavadinimas</translation> + </message> </context> <context> <name>HelpMessageDialog</name> @@ -477,6 +641,10 @@ Adresas: %4</translation> <translation>versija</translation> </message> <message> + <source>About Bitcoin Core</source> + <translation>Apie Bitcoin Core</translation> + </message> + <message> <source>Command-line options</source> <translation>Komandinės eilutės parametrai</translation> </message> @@ -508,6 +676,10 @@ Adresas: %4</translation> <translation>Sveiki</translation> </message> <message> + <source>Welcome to Bitcoin Core.</source> + <translation>Sveiki atvykę į Bitcoin Core.</translation> + </message> + <message> <source>Bitcoin Core</source> <translation>Bitcoin branduolys</translation> </message> @@ -530,10 +702,6 @@ Adresas: %4</translation> <translation>&Pagrindinės</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>&Mokėti sandorio mokestį</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Automatiškai paleisti Bitkoin programą įjungus sistemą.</translation> </message> @@ -618,6 +786,10 @@ Adresas: %4</translation> <translation>numatyta</translation> </message> <message> + <source>none</source> + <translation>niekas</translation> + </message> + <message> <source>The supplied proxy address is invalid.</source> <translation>Nurodytas tarpinio serverio adresas negalioja.</translation> </message> @@ -629,10 +801,6 @@ Adresas: %4</translation> <translation>Forma</translation> </message> <message> - <source>Wallet</source> - <translation>Piniginė</translation> - </message> - <message> <source>Immature:</source> <translation>Nepribrendę:</translation> </message> @@ -645,10 +813,6 @@ Adresas: %4</translation> <translation>Jūsų balansas</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Naujausi sandoriai</b></translation> - </message> - <message> <source>out of sync</source> <translation>nesinchronizuota</translation> </message> @@ -860,10 +1024,34 @@ Adresas: %4</translation> <translation>Siųsti monetas</translation> </message> <message> + <source>Quantity:</source> + <translation>Kiekis:</translation> + </message> + <message> + <source>Bytes:</source> + <translation>Baitai:</translation> + </message> + <message> <source>Amount:</source> <translation>Suma:</translation> </message> <message> + <source>Priority:</source> + <translation>Pirmumas:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Mokestis:</translation> + </message> + <message> + <source>After Fee:</source> + <translation>Po mokesčio:</translation> + </message> + <message> + <source>Change:</source> + <translation>Graža:</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Siųsti keliems gavėjams vienu metu</translation> </message> @@ -892,10 +1080,30 @@ Adresas: %4</translation> <translation>Patvirtinti monetų siuntimą</translation> </message> <message> + <source>Copy quantity</source> + <translation>Kopijuoti kiekį</translation> + </message> + <message> <source>Copy amount</source> <translation>Kopijuoti sumą</translation> </message> <message> + <source>Copy fee</source> + <translation>Kopijuoti mokestį</translation> + </message> + <message> + <source>Copy after fee</source> + <translation>Kopijuoti po mokesčio</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Kopijuoti baitus</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Kopijuoti pirmumą</translation> + </message> + <message> <source>The recipient address is not valid, please recheck.</source> <translation>Negaliojantis gavėjo adresas. Patikrinkite.</translation> </message> @@ -1339,6 +1547,10 @@ Adresas: %4</translation> <translation>Rodyti sandėrio detales</translation> </message> <message> + <source>Exporting Failed</source> + <translation>Eksportavimas nepavyko</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> <translation>Kableliais atskirtų duomenų failas (*.csv)</translation> </message> @@ -1418,42 +1630,14 @@ Adresas: %4</translation> <translation>Parinktys:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Nurodyti konfigūracijos failą (pagal nutylėjimąt: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Nurodyti pid failą (pagal nutylėjimą: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Nustatyti duomenų aplanką</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Sujungimo klausymas prijungčiai <port> (pagal nutylėjimą: 8333 arba testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Palaikyti ne daugiau <n> jungčių kolegoms (pagal nutylėjimą: 125)</translation> - </message> - <message> <source>Specify your own public address</source> <translation>Nurodykite savo nuosavą viešą adresą</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Atjungimo dėl netinkamo kolegų elgesio riba (pagal nutylėjimą: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Sekundžių kiekis eikiamas palaikyti ryšį dėl lygiarangių nestabilumo (pagal nutylėjimą: 86.400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Klausymas JSON-RPC sujungimui prijungčiai <port> (pagal nutylėjimą: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Priimti komandinę eilutę ir JSON-RPC komandas</translation> </message> @@ -1478,30 +1662,6 @@ Adresas: %4</translation> <translation>Klaida atveriant blokų duombazę</translation> </message> <message> - <source>Error: system error: </source> - <translation>Klaida: sistemos klaida:</translation> - </message> - <message> - <source>Failed to read block info</source> - <translation>Nepavyko nuskaityti bloko informacijos</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Nepavyko nuskaityti bloko</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Nepavyko įrašyti bloko</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Nepavyko įrašyti failo informacijos</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generuoti monetas (numatyta: 0)</translation> - </message> - <message> <source>Verifying blocks...</source> <translation>Tikrinami blokai...</translation> </message> @@ -1514,30 +1674,10 @@ Adresas: %4</translation> <translation>Informacija</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maksimalus buferis priėmimo sujungimui <n>*1000 bitų (pagal nutylėjimą: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maksimalus buferis siuntimo sujungimui <n>*1000 bitų (pagal nutylėjimą: 1000)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Siųsti atsekimo/derinimo info į konsolę vietoj debug.log failo</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Nustatyti sujungimo trukmę milisekundėmis (pagal nutylėjimą: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Sistemos klaida:</translation> - </message> - <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Bandymas naudoti UPnP struktūra klausymosi prievadui (default: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Bandymas naudoti UPnP struktūra klausymosi prievadui (default: 1 when listening)</translation> </message> @@ -1558,10 +1698,6 @@ Adresas: %4</translation> <translation>Atnaujinti piniginę į naujausią formatą</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Nustatyti rakto apimties dydį <n> (pagal nutylėjimą: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Ieškoti prarastų piniginės sandorių blokų grandinėje</translation> </message> @@ -1570,14 +1706,6 @@ Adresas: %4</translation> <translation>Naudoti OpenSSL (https) jungimuisi JSON-RPC </translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Serverio sertifikato failas (pagal nutylėjimą: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Serverio privatus raktas (pagal nutylėjimą: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Pagelbos žinutė</translation> </message> diff --git a/src/qt/locale/bitcoin_lv_LV.ts b/src/qt/locale/bitcoin_lv_LV.ts index 81b2688d03..ac5a1a1396 100644 --- a/src/qt/locale/bitcoin_lv_LV.ts +++ b/src/qt/locale/bitcoin_lv_LV.ts @@ -1,4 +1,4 @@ -<TS language="lv_LV" version="2.1"> +<TS language="lv_LV" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -275,6 +275,10 @@ <translation>Atvērt &URI...</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>Bitcoin Core klients</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>Importē blokus no diska...</translation> </message> @@ -324,7 +328,11 @@ </message> <message> <source>&Receive</source> - <translation>Saņe&mt</translation> + <translation>&Saņemt</translation> + </message> + <message> + <source>Show information about Bitcoin Core</source> + <translation>Parādīt informāciju par Bitcoin Core</translation> </message> <message> <source>&Show / Hide</source> @@ -363,10 +371,6 @@ <translation>Ciļņu rīkjosla</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -394,10 +398,6 @@ <source>No block source available...</source> <translation>Nav pieejams neviens bloku avots...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Apstrādāti %1 bloki no transakciju vēstures.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n stundas</numerusform><numerusform>%n stunda</numerusform><numerusform>%n stundas</numerusform></translation> @@ -485,10 +485,6 @@ Adrese: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Bitcoin Kontroles Adrešu Atlase</translation> - </message> - <message> <source>Quantity:</source> <translation>Daudzums:</translation> </message> @@ -533,10 +529,6 @@ Adrese: %4 <translation>Daudzums</translation> </message> <message> - <source>Address</source> - <translation>Adrese</translation> - </message> - <message> <source>Date</source> <translation>Datums</translation> </message> @@ -800,15 +792,7 @@ Adrese: %4 <source>Error</source> <translation>Kļūda</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB ar brīvo vietu pieejams</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(no %1GB nepieciešams)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -843,10 +827,6 @@ Adrese: %4 <translation>&Galvenais</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>&Maksāt par transakciju</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Automātiski sākt Bitcoin pēc pieteikšanās sistēmā.</translation> </message> @@ -867,14 +847,6 @@ Adrese: %4 <translation>Skriptu &pārbaudes pavedienu skaits</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Savienoties ar Bitcoin tīklu caur SOCKS starpniekserveri.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Savienoties caur SOCKS starpniekserveri (noklusējuma starpniekserveris)</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Starpniekservera IP adrese (piem. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1018,10 +990,6 @@ Adrese: %4 <translation>Attēlotā informācija var būt novecojusi. Jūsu maciņš pēc savienojuma izveides automātiski sinhronizējas ar Bitcoin tīklu, taču šis process vēl nav beidzies.</translation> </message> <message> - <source>Wallet</source> - <translation>Maciņš</translation> - </message> - <message> <source>Available:</source> <translation>Pieejams:</translation> </message> @@ -1050,10 +1018,6 @@ Adrese: %4 <translation>Jūsu kopējā tekošā bilance</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Pēdējās transakcijas</b></translation> - </message> - <message> <source>out of sync</source> <translation>nav sinhronizēts</translation> </message> @@ -2211,26 +2175,10 @@ Adrese: %4 <translation>Iespējas:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Norādiet konfigurācijas failu (pēc noklusēšanas: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Norādiet pid failu (pēc noklusēšanas: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Norādiet datu direktoriju</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Gaidīt savienojumus portā <port> (pēc noklusēšanas: 8333 vai testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Uzturēt līdz <n> savienojumiem ar citiem mezgliem(pēc noklusēšanas: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Pievienoties mezglam, lai iegūtu citu mezglu adreses, un atvienoties</translation> </message> @@ -2239,14 +2187,6 @@ Adrese: %4 <translation>Norādiet savu publisko adresi</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Slieksnis pārkāpējmezglu atvienošanai (pēc noklusēšanas: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Sekundes, cik ilgi atturēt pārkāpējmezglus no atkārtotas pievienošanās (pēc noklusēšanas: 86400)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Pieņemt komandrindas un JSON-RPC komandas</translation> </message> @@ -2263,10 +2203,6 @@ Adrese: %4 <translation>(noklusējums: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(noklusējums: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> var būt:</translation> </message> @@ -2303,14 +2239,6 @@ Adrese: %4 <translation>Kļūda: Maciņš ir aizslēgts, nevar izveidot transakciju!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Kļūda: sistēmas kļūda:</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Piespiest drošo režīmu (noklusējums: 0)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Ja <category> nav norādīta, izvadīt visu atkļūdošanas informāciju.</translation> </message> @@ -2319,10 +2247,6 @@ Adrese: %4 <translation>Importē...</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Tērēt neapstiprinātu atlikumu kad sūta transakcijas (noklusējums: 1)</translation> - </message> - <message> <source>Verifying blocks...</source> <translation>Pārbauda blokus...</translation> </message> @@ -2355,10 +2279,6 @@ Adrese: %4 <translation>Transakcijas parakstīšana neizdevās</translation> </message> <message> - <source>System error: </source> - <translation>Sistēmas kļūda:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Transakcijas summa ir pārāk maza</translation> </message> @@ -2403,10 +2323,6 @@ Adrese: %4 <translation>Atjaunot maciņa formātu uz jaunāko</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Uzstādīt atslēgu bufera izmēru uz <n> (pēc noklusēšanas: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Atkārtoti skanēt bloku virkni, meklējot trūkstošās maciņa transakcijas</translation> </message> @@ -2415,14 +2331,6 @@ Adrese: %4 <translation>JSON-RPC savienojumiem izmantot OpenSSL (https)</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Servera sertifikāta fails (pēc noklusēšanas: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Servera privātā atslēga (pēc noklusēšanas: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Šis palīdzības paziņojums</translation> </message> diff --git a/src/qt/locale/bitcoin_mn.ts b/src/qt/locale/bitcoin_mn.ts index 4a296dfce7..f1b0174111 100644 --- a/src/qt/locale/bitcoin_mn.ts +++ b/src/qt/locale/bitcoin_mn.ts @@ -1,4 +1,4 @@ -<TS language="mn" version="2.1"> +<TS language="mn" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -288,10 +288,6 @@ Address: %4 <translation>Хэмжээ</translation> </message> <message> - <source>Address</source> - <translation>Хаяг</translation> - </message> - <message> <source>Date</source> <translation>Огноо</translation> </message> @@ -402,10 +398,6 @@ Address: %4 <translation>МБ</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Биткойны сүлжээрүү SOCKS проксигоор холбогдох.</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>проксигийн IP хаяг (жишээ нь: IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -425,17 +417,9 @@ Address: %4 <context> <name>OverviewPage</name> <message> - <source>Wallet</source> - <translation>Түрүйвч</translation> - </message> - <message> <source>Available:</source> <translation>Хэрэглэж болох хэмжээ:</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Сүүлд хийгдсэн гүйлгээнүүд</b></translation> - </message> </context> <context> <name>PaymentServer</name> @@ -1030,10 +1014,6 @@ Address: %4 <translation>Сонголтууд:</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation><port> дээрх холболтуудыг чагна (ѳгѳгдмѳл: 8333 эсвэл testnet: 18333)</translation> - </message> - <message> <source>Wallet options:</source> <translation>Түрүйвчийн сонголтууд:</translation> </message> diff --git a/src/qt/locale/bitcoin_ms_MY.ts b/src/qt/locale/bitcoin_ms_MY.ts index 428819e92f..d2e8efbb49 100644 --- a/src/qt/locale/bitcoin_ms_MY.ts +++ b/src/qt/locale/bitcoin_ms_MY.ts @@ -1,4 +1,4 @@ -<TS language="ms_MY" version="2.1"> +<TS language="ms_MY" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -10,14 +10,42 @@ <translation>Cipta alamat baru</translation> </message> <message> + <source>&New</source> + <translation>&Baru</translation> + </message> + <message> <source>Copy the currently selected address to the system clipboard</source> <translation>Salin alamat terpilih ke dalam sistem papan klip</translation> </message> <message> + <source>&Copy</source> + <translation>&Salin</translation> + </message> + <message> + <source>&Copy Address</source> + <translation>&Salin Alamat</translation> + </message> + <message> + <source>&Export</source> + <translation>&Eksport</translation> + </message> + <message> <source>&Delete</source> <translation>&Padam</translation> </message> <message> + <source>Choose the address to send coins to</source> + <translation>Pilih alamat untuk menghantar syiling</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Pilih alamat untuk menerima syiling</translation> + </message> + <message> + <source>C&hoose</source> + <translation>&Pilih</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> <translation>Fail yang dipisahkan dengan koma</translation> </message> @@ -44,10 +72,6 @@ </context> <context> <name>CoinControlDialog</name> - <message> - <source>Address</source> - <translation>Alamat</translation> - </message> </context> <context> <name>EditAddressDialog</name> @@ -163,6 +187,10 @@ </context> <context> <name>WalletView</name> + <message> + <source>&Export</source> + <translation>&Eksport</translation> + </message> </context> <context> <name>bitcoin-core</name> diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts index bb6b78849c..bdde3da534 100644 --- a/src/qt/locale/bitcoin_nb.ts +++ b/src/qt/locale/bitcoin_nb.ts @@ -1,4 +1,4 @@ -<TS language="nb" version="2.1"> +<TS language="nb" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Verktøylinje for faner</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnett]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Ingen kilde for blokker tilgjengelig...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Lastet %1 blokker med transaksjonshistorikk.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n time</numerusform><numerusform>%n timer</numerusform></translation> @@ -486,6 +478,10 @@ <source>Up to date</source> <translation>Ajour</translation> </message> + <message numerus="yes"> + <source>Processed %n blocks of transaction history.</source> + <translation><numerusform>Lastet %n blokk med transaksjonshistorikk.</numerusform><numerusform>Lastet %n blokker med transaksjonshistorikk.</numerusform></translation> + </message> <message> <source>Catching up...</source> <translation>Kommer ajour...</translation> @@ -529,8 +525,8 @@ Adresse: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Myntkontroll Adresse Valg</translation> + <source>Coin Selection</source> + <translation>Mynt Valg</translation> </message> <message> <source>Quantity:</source> @@ -581,8 +577,12 @@ Adresse: %4 <translation>Beløp</translation> </message> <message> - <source>Address</source> - <translation>Adresse</translation> + <source>Received with label</source> + <translation>Mottatt med merkelapp</translation> + </message> + <message> + <source>Received with address</source> + <translation>Mottatt med adresse</translation> </message> <message> <source>Date</source> @@ -916,13 +916,13 @@ Adresse: %4 <source>Error</source> <translation>Feil</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB ledig lagringsplass</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB med ledig lagringsplass</numerusform><numerusform>%n GB med ledig lagringsplass</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(av %1GB behøvd)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(av %n GB som trengs)</numerusform><numerusform>(av %n GB som trengs)</numerusform></translation> </message> </context> <context> @@ -959,14 +959,6 @@ Adresse: %4 <translation>&Hoved</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Valgfritt transaksjonsgebyr per kB som sikrer at dine transaksjoner blir raskt prosessert. De fleste transaksjoner er 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Betal &transaksjonsgebyr</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Start Bitcoin automatisk etter innlogging.</translation> </message> @@ -995,14 +987,6 @@ Adresse: %4 <translation>Tillatt innkommende tilkoblinger</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Koble til Bitcoin-nettverket gjennom en SOCKS proxy.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Koble til gjennom SOCKS proxy (standardvalg proxy):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>IP-adressen til proxyen (f.eks. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1063,6 +1047,14 @@ Adresse: %4 <translation>Sett opp port ved hjelp av &UPnP</translation> </message> <message> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation>Koble til Bitcoin-nettverket gjennom en SOCKS5 proxy.</translation> + </message> + <message> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation>&Koble til gjennom SOCKS5 proxy (standardvalg proxy):</translation> + </message> + <message> <source>Proxy &IP:</source> <translation>Proxy &IP:</translation> </message> @@ -1166,10 +1158,6 @@ Adresse: %4 <translation>Informasjonen som vises kan være foreldet. Din lommebok synkroniseres automatisk med Bitcoin-nettverket etter at tilkobling er opprettet, men denne prosessen er ikke ferdig enda.</translation> </message> <message> - <source>Wallet</source> - <translation>Lommebok</translation> - </message> - <message> <source>Watch-only:</source> <translation>Kun observerbar:</translation> </message> @@ -1198,6 +1186,10 @@ Adresse: %4 <translation>Minet saldo har ikke modnet enda</translation> </message> <message> + <source>Balances</source> + <translation>Saldoer</translation> + </message> + <message> <source>Total:</source> <translation>Totalt:</translation> </message> @@ -1210,6 +1202,14 @@ Adresse: %4 <translation>Din nåværende balanse i kun observerbare adresser</translation> </message> <message> + <source>Spendable:</source> + <translation>Kan brukes:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Nylige transaksjoner</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>Ubekreftede transaksjoner til kun observerbare adresser</translation> </message> @@ -1222,10 +1222,6 @@ Adresse: %4 <translation>Nåværende totale balanse i kun observerbare adresser</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Siste transaksjoner</b></translation> - </message> - <message> <source>out of sync</source> <translation>ute av synk</translation> </message> @@ -1485,10 +1481,6 @@ Adresse: %4 <translation>Tjenester</translation> </message> <message> - <source>Sync Node</source> - <translation>Synk-node</translation> - </message> - <message> <source>Starting Height</source> <translation>Starthøyde</translation> </message> @@ -1617,14 +1609,6 @@ Adresse: %4 <translation>Utgående</translation> </message> <message> - <source>Yes</source> - <translation>Ja</translation> - </message> - <message> - <source>No</source> - <translation>Nei</translation> - </message> - <message> <source>Unknown</source> <translation>Ukjent</translation> </message> @@ -1861,6 +1845,78 @@ Adresse: %4 <translation>Egendefinert adresse for veksel</translation> </message> <message> + <source>Transaction Fee:</source> + <translation>Transaksjonsgebyr:</translation> + </message> + <message> + <source>Choose...</source> + <translation>Velg...</translation> + </message> + <message> + <source>collapse fee-settings</source> + <translation>Legg ned gebyrinnstillinger</translation> + </message> + <message> + <source>Minimize</source> + <translation>Minimer</translation> + </message> + <message> + <source>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 "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source> + <translation>Hvis den egendefinerte avgiften er satt til 1000 satoshis og transaksjonen bare er 250 bytes, da vil "per kilobyte" bare betale 250 satoshis i gebyr, mens "minst" betaler 1000 satoshis. For transaksjoner større enn en kilobyte vil begge betale for antall kilobyte.</translation> + </message> + <message> + <source>per kilobyte</source> + <translation>per kilobyte</translation> + </message> + <message> + <source>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.</source> + <translation>Hvis den egendefinerte avgiften er satt til 1000 satoshis og transaksjonen bare er 250 bytes, da vil "per kilobyte" bare betale 250 satoshis i gebyr, mens "minstebeløp" betaler 1000 satoshis. For transaksjoner større enn en kilobyte vil begge betale for antall kilobyte.</translation> + </message> + <message> + <source>total at least</source> + <translation>minstebeløp</translation> + </message> + <message> + <source>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.</source> + <translation>Betaling av bare minimumsavgiften går helt fint så lenge det er mindre transaksjonsvolum enn plass i blokkene. Men vær klar over at dette kan ende opp i en transaksjon som aldri blir bekreftet når det er mer etterspørsel etter Bitcoin-transaksjoner enn nettverket kan behandle.</translation> + </message> + <message> + <source>(read the tooltip)</source> + <translation>(les verktøytipset)</translation> + </message> + <message> + <source>Recommended:</source> + <translation>Anbefalt:</translation> + </message> + <message> + <source>Custom:</source> + <translation>Egendefinert:</translation> + </message> + <message> + <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source> + <translation>(Smartgebyr ikke innført ennå. Dette tar vanligvis noen blokker...)</translation> + </message> + <message> + <source>Confirmation time:</source> + <translation>Bekreftelsestid:</translation> + </message> + <message> + <source>normal</source> + <translation>normal</translation> + </message> + <message> + <source>fast</source> + <translation>rask</translation> + </message> + <message> + <source>Send as zero-fee transaction if possible</source> + <translation>Send uten transaksjonsgebyr hvis mulig</translation> + </message> + <message> + <source>(confirmation may take longer)</source> + <translation>(bekreftelse kan ta lengre tid)</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Send til flere enn en mottaker</translation> </message> @@ -1965,6 +2021,18 @@ Adresse: %4 <translation>Transaksjonen ble avvist! Dette kan skje hvis noen av myntene i lommeboken allerede er brukt, som hvis du kopierte wallet.dat og mynter ble brukt i kopien uten å bli markert som brukt her.</translation> </message> <message> + <source>A fee higher than %1 is considered an insanely high fee.</source> + <translation>Et gebyr høyere enn %1 er ansett som et sinnsykt høyt gebyr.</translation> + </message> + <message> + <source>Pay only the minimum fee of %1</source> + <translation>Betal kun minimumsgebyret på %1</translation> + </message> + <message> + <source>Estimated to begin confirmation within %1 block(s).</source> + <translation>Beregner å begynne bekreftelse innen %1 blokk(er).</translation> + </message> + <message> <source>Warning: Invalid Bitcoin address</source> <translation>Advarsel: Ugyldig Bitcoin-adresse</translation> </message> @@ -2473,6 +2541,10 @@ Adresse: %4 <translation>Utvunnet</translation> </message> <message> + <source>watch-only</source> + <translation>kun observerbar</translation> + </message> + <message> <source>(n/a)</source> <translation>-</translation> </message> @@ -2489,6 +2561,10 @@ Adresse: %4 <translation>Type transaksjon.</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Hvorvidt en kun observerbar adresse er involvert i denne transaksjonen.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>Mottaksadresse for transaksjonen.</translation> </message> @@ -2584,6 +2660,10 @@ Adresse: %4 <translation>Eksporter Transaksjonshistorikk</translation> </message> <message> + <source>Watch-only</source> + <translation>Kun observer</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Ekport Feilet</translation> </message> @@ -2699,26 +2779,10 @@ Adresse: %4 <translation>Innstillinger:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Angi konfigurasjonsfil (standardverdi: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Angi pid-fil (standardverdi: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Angi mappe for datafiler</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Lytt etter tilkoblinger på <port> (standardverdi: 8333 eller testnett: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Hold maks <n> koblinger åpne til andre noder (standardverdi: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Koble til node for å hente adresser til andre noder, koble så fra igjen</translation> </message> @@ -2727,18 +2791,6 @@ Adresse: %4 <translation>Angi din egen offentlige adresse</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Grenseverdi for å koble fra noder med dårlig oppførsel (standardverdi: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Antall sekunder noder med dårlig oppførsel hindres fra å koble til på nytt (standardverdi: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Lytt etter JSON-RPC tilkoblinger på <port> (standardverdi: 8332 eller testnett: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Ta imot kommandolinje- og JSON-RPC-kommandoer</translation> </message> @@ -2778,22 +2830,18 @@ Det er også anbefalt at å sette varselsmelding slik du får melding om problem For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Akseptable krypteringsmetoder (standardverdi: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Bind til angitt adresse. Bruk [vertsmaskin]:port notasjon for IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Ratebegrens gratistransaksjoner kontinuerlig til <n>*1000 bytes per minutt (standard: 15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>Slett alle transaksjoner i lommeboken og gjenopprett kun de delene av blokkjeden gjennom -rescan ved oppstart</translation> </message> <message> + <source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> + <translation>Distribuert under MIT programvarelisensen, se medfølgende fil COPYING eller <http://www.opensource.org/licenses/mit-license.php>.</translation> + </message> + <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Gå til modus for regresjonstesting, som bruker en spesiell blokkjede der blokker kan bli løst momentant.</translation> </message> @@ -2810,14 +2858,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Kjør kommando når en lommeboktransaksjon endres (%s i kommando er erstattet med TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Overfør aktiviteten i databasen fra minnelageret til loggen på harddisken for hver <n> megabytes (standardverdi: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Hvor grundig blokkverifiseringen til -checkblocks er (0-4, standard: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>I denne modusen kontrollerer -genproclimit hvor mange blokker som genereres øyeblikkelig.</translation> </message> @@ -2826,10 +2866,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Angi antall tråder for skriptverifisering (%u til %d, 0 = auto, <0 = la det antallet kjerner være ledig, standard: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Sett prosessorgrensen for når blokkutvinning er på (-1 = ubegrenset, standard: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Dette er en forhåndssluppet testversjon - bruk på egen risiko - ikke for bruk til blokkutvinning eller bedriftsapplikasjoner</translation> </message> @@ -2838,10 +2874,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Ute av stand til å binde til %s på denne datamaskinen. Bitcoin Core kjører sannsynligvis allerede.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Bruk separate SOCKS5 proxyer for å nå noder via Tor skjulte tjenester (standardverdi: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Advarsel: -paytxfee er satt veldig høyt! Dette er transaksjonsgebyret du betaler når du sender transaksjoner.</translation> </message> @@ -2862,12 +2894,12 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Advarsel: wallet.dat korrupt, data reddet! Original wallet.dat lagret som wallet.{timestamp}.bak i %s; hvis din saldo eller dine transaksjoner ikke er korrekte bør du gjenopprette fra en backup.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(standardverdi: 1)</translation> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Hvitelist noder som kobler til fra den oppgitte nettmasken eller IP-adressen. Kan oppgis flere ganger.</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(standardverdi: wallet.dat)</translation> + <source>(default: 1)</source> + <translation>(standardverdi: 1)</translation> </message> <message> <source><category> can be:</source> @@ -2898,10 +2930,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Valg for feilsøking/testing:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Slå av sikkerhetsmodus, overstyr en virkelig sikkerhetsmodushendelse (standard: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Oppdag egen IP-adresse (standardverdi: 1 ved lytting og uten -externalip)</translation> </message> @@ -2930,6 +2958,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Feil under åpning av blokkdatabase</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Feil: En fatal intern feil oppstod, se debug.log for detaljer</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Feil: Lite ledig lagringsplass!</translation> </message> @@ -2938,66 +2970,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Feil: Lommebok låst, kan ikke opprette transaksjon!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Feil: systemfeil:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Kunne ikke lytte på noen port. Bruk -listen=0 hvis det er dette du vil.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Feil ved lesing av blokkinfo</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Feil ved lesing av blokk</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Feil ved synkronisering av blokkindeks</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Ved feil skriving av blokkindeks</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Feil ved skriving av blokkinfo</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Feil ved skriving av blokk</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Feil ved skriving av filinfo</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Feil ved skriving til bitcoin sin database</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Feil ved skriving av transaksjonsindeks</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Feil ved skriving av angredata</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Tving sikkerhetsmodus (standard: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generer bitcoins (standardverdi: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Hvor mange blokker skal sjekkes ved oppstart (standardverdi: 288, 0 = alle)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Hvis <category> ikke er oppgitt, ta ut all informasjon om feilsøking.</translation> </message> @@ -3018,8 +2994,8 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>For få fildeskriptorer tilgjengelig.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Sett inn tidsstempel i front av feilsøkingsdata (standardverdi: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Bare koble til noder i nettverket <net> (IPv4, IPv6 eller onion)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3034,26 +3010,18 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Sett maks blokkstørrelse i bytes (standardverdi: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Sett nummer av tråder til betjening av RPC-kall (standardverdi: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Angi lommebokfil (inne i datamappe)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Bruk ubekreftet veksel ved sending av transaksjoner (standardverdi: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Avslutt etter import av blokker fra disk (standard: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Dette er tiltenkt verktøy for regresjonstesting og apputvikling.</translation> </message> <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Bruk UPnP for å sette opp lytteport (standardverdi: %u)</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Verifiserer blokker...</translation> </message> @@ -3078,10 +3046,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Importerer blokker fra ekstern fil blk000??.dat</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(standardverdi: 1, 1 = behold metadata for transaksjon som f. eks. kontoeier og informasjon om betalingsanmodning, 2 = dropp metadata for transaksjon)</translation> - </message> - <message> <source>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</source> <translation>Tillat JSON-RPC-tilkoblinger fra angitt kilde. Gyldig for <ip> er en enkelt IP (f. eks. 1.2.3.4), et nettverk/nettmaske (f. eks. 1.2.3.4/255.255.255.0) eller et nettverk/CIDR (f. eks. 1.2.3.4/24). Dette alternativet kan angis flere ganger</translation> </message> @@ -3102,12 +3066,12 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Ute av stand til å låse datamappen %s. Bitcoin Core kjører sannsynligvis allerede.</translation> </message> <message> - <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> - <translation>Opprett nye filer med standardtillatelser i systemet, i stedet for umask 077 (kun virksom med lommebokfunksjonalitet slått av)</translation> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Ratebegrens gratistransaksjoner kontinuerlig til <n>*1000 bytes per minutt (standardverdi: %u)</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>Distribuert under MIT/X11 programvarelisensen, se medfølgende fil COPYING eller <http://www.opensource.org/licenses/mit-license.php>.</translation> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Opprett nye filer med standardtillatelser i systemet, i stedet for umask 077 (kun virksom med lommebokfunksjonalitet slått av)</translation> </message> <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> @@ -3118,10 +3082,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Feil: Argumentet -socks er ikke støttet. Det er ikke lenger mulig å sette SOCKS-versjon; bare SOCKS5-proxyer er støttet.</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Utfør kommando når et nettverkstransaksjon gjenbruker inndata fra lommeboktransaksjonen (%s=gjenbruk TxID, %t=lommebok TxID)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Utfør kommando når et relevant varsel er mottatt eller vi ser en veldig lang gaffel (%s i kommando er erstattet med melding)</translation> </message> @@ -3134,12 +3094,8 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Gebyrer (i BTC/Kb) mindre enn dette anses som null gebyr for laging av transaksjoner (standardverdi: %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>Hvis paytxfee ikke er angitt, inkluderer da nok gebyr til at transaksjoner gjennomsnittligt bekreftes innen n blokker (standardverdi: 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Ta ut feilsøkingsinformasjon (standardverdi: 0, bruk av <category> er valgfritt)</translation> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation>Maksimal størrelse på data i databærende transaksjoner vi videresender og ufører graving på (standardverdi: %u)</translation> </message> <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> @@ -3150,6 +3106,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Sett maksimum størrelse for transaksjoner med høy prioritet / lavt gebyr, i bytes (standardverdi: %d)</translation> </message> <message> + <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source> + <translation>Angi antall tråder for mynt generering hvis aktivert (-1 = alle kjerner, standardverdi: %d)</translation> + </message> + <message> <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> <translation>Dette produktet inneholder programvare utviklet av OpenSSL Project for bruk i OpenSSL Toolkit <https://www.openssl.org/> og kryptografisk programvare skrevet av Eric Young og UPnP-programvare skrevet av Thomas Bernard.</translation> </message> @@ -3158,18 +3118,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Advarsel: Vennligst undersøk at din datamaskin har riktig dato og klokkeslett! Hvis klokken er stilt feil vil ikke Bitcoin Core fungere riktig.</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>Hvitelist noder som kobler til fra den oppgitte nettmasken eller IP-adressen. Kan oppgis flere ganger.</translation> - </message> - <message> <source>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</source> <translation>Hvitlistede noder kan ikke DoS-blokkeres, og deres transaksjoner videresendes alltid, selv om de allerede er i minnelageret. Nyttig f.eks. for en gateway.</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>Alltid søk etter nodeadresser via DNS-oppslag (standardverdi: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>Kan ikke løse -whitebind-adresse: '%s'</translation> </message> @@ -3198,10 +3150,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Gebyr (i BTC/kB) for å legge til i transaksjoner du sender (standardverdi: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Inkludere IP-adresser i feilsøkingslogg (standard: 0)</translation> - </message> - <message> <source>Information</source> <translation>Informasjon</translation> </message> @@ -3230,24 +3178,8 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Behold på det meste <n> blokker i minnet som ikke er mulig å koble (standardverdi: %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Begrens størrelsen på signatur-hurtigbufferen til <n> oppføringer (standard: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Logg transaksjonsprioritet og gebyr per kB under blokkutvinning (standard: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Oppretthold en full transaksjonsindeks (standard: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maks mottaksbuffer per forbindelse, <n>*1000 bytes (standardverdi: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maks sendebuffer per forbindelse, <n>*1000 bytes (standardverdi: 1000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Hold på det meste <n> transaksjoner som ikke kobles i minnet (standardverdi: %u)</translation> </message> <message> <source>Need to specify a port with -whitebind: '%s'</source> @@ -3258,22 +3190,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Node alternativer for videresending:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Aksepter kun en blokkjede som passer med innebygde sjekkpunkter (standardvalg: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Koble kun til noder i nettverket <nett> (IPv4, IPv6 eller Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Skriv ut blokken ved oppstart, hvis funnet i blokkindeksen</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Skriv ut blokktreet ved oppstart (standardverdi: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL-valg: (se Bitcoin Wiki for oppsettsinstruksjoner for SSL)</translation> </message> @@ -3290,28 +3210,12 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Slumpvis bland 1 av hver <n> nettverksmeldinger</translation> </message> <message> - <source>Relay and mine data carrier transactions (default: 1)</source> - <translation>Videresend og ufør graving av databærende transaksjoner (standardverdi: 1)</translation> - </message> - <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>Videresende ikke-P2SH multisig (standard: 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Kjør en tråd som skriver lommeboken til disk periodisk (standard: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Send spor-/feilsøkingsinformasjon til konsollen istedenfor filen debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Sett minimum blokkstørrelse i bytes (standardverdi: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Setter flagget DB_PRIVATE i miljøet til lommebokdatabasen (standard: 1)</translation> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Send transaksjoner uten transaksjonsgebyr hvis mulig (standardverdi: %u)</translation> </message> <message> <source>Show all debugging options (usage: --help -help-debug)</source> @@ -3326,14 +3230,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Signering av transaksjon feilet</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Angi tidsavbrudd for forbindelse i millisekunder (standardverdi: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Systemfeil:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Dette er eksperimentell programvare.</translation> </message> @@ -3354,10 +3250,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Kan ikke binde til %s på denne datamaskinen (binding returnerte feilen %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Bruk UPnP for lytteport (standardverdi: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Bruk UPnP for lytteport (standardverdi: 1 ved lytting)</translation> </message> @@ -3410,10 +3302,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Oppgrader lommebok til nyeste format</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Angi størrelsen på nøkkellageret til <n> (standardverdi: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Se gjennom blokkjeden etter manglende lommeboktransaksjoner</translation> </message> @@ -3422,14 +3310,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Bruk OpenSSL (https) for JSON-RPC forbindelser</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Servers sertifikat (standardverdi: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Servers private nøkkel (standardverdi: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Denne hjelpemeldingen</translation> </message> @@ -3446,14 +3326,178 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t <translation>Feil ved lasting av wallet.dat: Lommeboken er skadet</translation> </message> <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = behold metadata for transaksjon som f. eks. kontoeier og informasjon om betalingsanmodning, 2 = dropp metadata for transaksjon)</translation> + </message> + <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Overfør aktiviteten i databasen fra minnelageret til loggen på harddisken for hver <n> megabytes (standardverdi: %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>Hvor grundig blokkverifiseringen til -checkblocks er (0-4, standardverdi: %u)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source> + <translation>Hvis paytxfee ikke er angitt, inkluderer da nok gebyr til at transaksjoner gjennomsnittligt bekreftes innen n blokker (standardverdi: %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Logg transaksjonsprioritet og gebyr per kB under blokkutvinning (standardverdi: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Oppretthold en full transaksjonsindeks, brukt av getrawtransaction RPC-kall (standardverdi: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Antall sekunder noder med dårlig oppførsel hindres fra å koble til på nytt (standardverdi: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Ta ut feilsøkingsinformasjon (standardverdi: %u, bruk av <category> er valgfritt)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Bruk separate SOCKS5 proxyer for å nå noder via Tor skjulte tjenester (standardverdi: %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(standardverdi: %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Akseptable sifre (standardverdi: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Alltid søk etter nodeadresser via DNS-oppslag (standardverdi: %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Slå av sikkerhetsmodus, overstyr en virkelig sikkerhetsmodushendelse (standardverdi: %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>Feil ved lasting av wallet.dat</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Tving sikkerhetsmodus (standardverdi: %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Generer mynter (standardverdi: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Hvor mange blokker skal sjekkes ved oppstart (standardverdi: %u, 0 = alle)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Inkludere IP-adresser i feilsøkingslogg (standardverdi: %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Ugyldig -proxy adresse: '%s'</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>Begrens størrelsen på hurtigbufferen for signaturer til <n> oppføringer (standardverdi: %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>Lytt etter JSON-RPC tilkoblinger på <port> (standardverdi: %u eller testnett: %u)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Lytt etter tilkoblinger på <port> (standardverdi: %u eller testnett: %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Hold maks <n> koblinger åpne til andre noder (standardverdi: %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maks mottaksbuffer per forbindelse, <n>*1000 bytes (standardverdi: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maks sendebuffer per forbindelse, <n>*1000 bytes (standardverdi: %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>Aksepter kun blokkjeden som stemmer med innebygde sjekkpunkter (standardvalg: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Sett inn tidsstempel i front av feilsøkingsdata (standardverdi: %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Skriv ut blokktreet ved oppstart (standardverdi: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Videresend og ufør graving av databærende transaksjoner (standardverdi: %u)</translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>Videresend ikke-P2SH multisig (standardverdi: %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Kjør en tråd som skriver lommeboken til disk periodisk (standardverdi: %u)</translation> + </message> + <message> + <source>Server certificate file (default: %s)</source> + <translation>Fil for tjenersertifikat (standardverdi: %s)</translation> + </message> + <message> + <source>Server private key (default: %s)</source> + <translation>Privat nøkkel for tjener (standardverdi: %s) </translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Angi størrelse på nøkkel-lager til <n> (standardverdi: %u)</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Sett minimum blokkstørrelse i bytes (standardverdi: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Sett antall tråder til betjening av RPC-kall (standardverdi: %d)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>Setter flagget DB_PRIVATE i miljøet til lommebokdatabasen (standardverdi: %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Angi konfigurasjonsfil (standardverdi: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Angi tidsavbrudd for forbindelse i millisekunder (minimum: 1, standardverdi: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Angi pid-fil (standardverdi: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Bruk ubekreftet veksel ved sending av transaksjoner (standardverdi: %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Avslutt etter import av blokker fra disk (standardverdi: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Grenseverdi for å koble fra noder med dårlig oppførsel (standardverdi: %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>Ukjent nettverk angitt i -onlynet '%s'</translation> </message> diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts index 0a9c6e2efa..e57362d7fd 100644 --- a/src/qt/locale/bitcoin_nl.ts +++ b/src/qt/locale/bitcoin_nl.ts @@ -1,9 +1,9 @@ -<TS language="nl" version="2.1"> +<TS language="nl" version="2.0"> <context> <name>AddressBookPage</name> <message> <source>Double-click to edit address or label</source> - <translation>Dubbelklik om adres of label te wijzigen</translation> + <translation>Dubbelklik om het adres of label te wijzigen</translation> </message> <message> <source>Create a new address</source> @@ -59,7 +59,7 @@ </message> <message> <source>Sending addresses</source> - <translation>Bezig met versturen adressen</translation> + <translation>Bezig met het versturen van de adressen</translation> </message> <message> <source>Receiving addresses</source> @@ -184,6 +184,10 @@ <translation>Portemonnee versleuteld</translation> </message> <message> + <source>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>.</source> + <translation>Vul een nieuw </translation> + </message> + <message> <source>Bitcoin 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.</source> <translation>Bitcoin zal nu afsluiten om het versleutelingsproces te voltooien. Onthoud dat het versleutelen van uw portemonnee u niet volledig kan beschermen: Malware kan uw computer infecteren en uw bitcoins stelen.</translation> </message> @@ -291,6 +295,10 @@ <translation>Open &URI...</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>Bitcoin kern applicatie</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>Blokken aan het importeren vanaf harde schijf...</translation> </message> @@ -343,6 +351,10 @@ <translation>&Ontvangen</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation>Toon informatie over bitcoin kern</translation> + </message> + <message> <source>&Show / Hide</source> <translation>&Toon / Verberg</translation> </message> @@ -379,10 +391,6 @@ <translation>Tab-werkbalk</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnetwerk]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Kern</translation> </message> @@ -422,10 +430,6 @@ <source>No block source available...</source> <translation>Geen bron van blokken beschikbaar...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>%1 blokken van transactiehistorie verwerkt.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n uur</numerusform><numerusform>%n uur</numerusform></translation> @@ -517,10 +521,6 @@ Adres: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Coin controle adres selectie</translation> - </message> - <message> <source>Quantity:</source> <translation>Kwantiteit</translation> </message> @@ -541,6 +541,10 @@ Adres: %4 <translation>Vergoeding:</translation> </message> <message> + <source>Dust:</source> + <translation>Stof:</translation> + </message> + <message> <source>After Fee:</source> <translation>Na vergoeding:</translation> </message> @@ -565,10 +569,6 @@ Adres: %4 <translation>Bedrag</translation> </message> <message> - <source>Address</source> - <translation>Adres</translation> - </message> - <message> <source>Date</source> <translation>Datum</translation> </message> @@ -629,6 +629,10 @@ Adres: %4 <translation>Kopieer prioriteit</translation> </message> <message> + <source>Copy dust</source> + <translation>Kopieër stof</translation> + </message> + <message> <source>Copy change</source> <translation>Kopieer wisselgeld</translation> </message> @@ -677,6 +681,10 @@ Adres: %4 <translation>geen</translation> </message> <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>Kan per input +/- %1 satoshi(s) variëren.</translation> + </message> + <message> <source>yes</source> <translation>ja</translation> </message> @@ -885,18 +893,18 @@ Adres: %4 <translation>Bitcoin Kern</translation> </message> <message> - <source>Error</source> - <translation>Fout</translation> + <source>Error: Specified data directory "%1" cannot be created.</source> + <translation>Fout: De gespecificeerde directory "%1" kan niet worden gecreëerd.</translation> </message> <message> - <source>GB of free space available</source> - <translation>GB aan vrije opslagruimte beschikbaar</translation> + <source>Error</source> + <translation>Fout</translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(van %1GB benodigd)</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB aan vrije oplsagruimte beschikbaar</numerusform><numerusform>%n GB aan vrije oplsagruimte beschikbaar</numerusform></translation> </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -931,14 +939,6 @@ Adres: %4 <translation>&Algemeen</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Optionele transactiekosten per kB. Transactiekosten helpen ervoor te zorgen dat uw transacties snel verwerkt worden. De meeste transacties zijn 1kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Betaal &transactiekosten</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Start Bitcoin automatisch na inloggen in het systeem</translation> </message> @@ -959,12 +959,12 @@ Adres: %4 <translation>Aantal threads voor &scriptverificatie</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Verbind met het Bitcoin-netwerk via een SOCKS-proxy.</translation> + <source>Accept connections from outside</source> + <translation>Accepteer binnenkomende verbindingen</translation> </message> <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Verbind via een SOCKS-proxy (standaardproxy):</translation> + <source>Allow incoming connections</source> + <translation>Sta inkomende verbindingen toe</translation> </message> <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> @@ -1130,8 +1130,8 @@ Adres: %4 <translation>De weergegeven informatie kan verouderd zijn. Uw portemonnee synchroniseert automaticsh met het Bitcoinnetwerk nadat een verbinding is gelegd, maar dit proces is nog niet voltooid.</translation> </message> <message> - <source>Wallet</source> - <translation>Portemonnee</translation> + <source>Watch-only:</source> + <translation>Alleen-bekijkbaar:</translation> </message> <message> <source>Available:</source> @@ -1166,8 +1166,8 @@ Adres: %4 <translation>Uw totale saldo</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Recente transacties</b></translation> + <source>Recent transactions</source> + <translation>Recente transacties</translation> </message> <message> <source>out of sync</source> @@ -1185,6 +1185,14 @@ Adres: %4 <translation>Ongeldig betalingsadres %1</translation> </message> <message> + <source>Payment request rejected</source> + <translation>Betalingsverzoek geweigerd</translation> + </message> + <message> + <source>Payment request has expired.</source> + <translation>Betalingsverzoek is verlopen.</translation> + </message> + <message> <source>Requested payment amount of %1 is too small (considered dust).</source> <translation>Het gevraagde betalingsbedrag van %1 is te weinig (beschouwd als stof).</translation> </message> @@ -1231,6 +1239,10 @@ Adres: %4 </context> <context> <name>PeerTableModel</name> + <message> + <source>User Agent</source> + <translation>User Agent</translation> + </message> </context> <context> <name>QObject</name> @@ -1239,6 +1251,14 @@ Adres: %4 <translation>Bedrag</translation> </message> <message> + <source>Enter a Bitcoin address (e.g. %1)</source> + <translation>Voer een Bitcoin-adres in (bijv. %1)</translation> + </message> + <message> + <source>%1 d</source> + <translation>%1d</translation> + </message> + <message> <source>%1 h</source> <translation>%1 uur</translation> </message> @@ -1247,10 +1267,30 @@ Adres: %4 <translation>%1 m</translation> </message> <message> + <source>%1 s</source> + <translation>%1s</translation> + </message> + <message> + <source>NETWORK</source> + <translation>Netwerk</translation> + </message> + <message> + <source>UNKNOWN</source> + <translation>ONBEKEND</translation> + </message> + <message> + <source>None</source> + <translation>Geen</translation> + </message> + <message> <source>N/A</source> <translation>N.v.t.</translation> </message> - </context> + <message> + <source>%1 ms</source> + <translation>%1 ms</translation> + </message> +</context> <context> <name>QRImageWidget</name> <message> @@ -1325,6 +1365,50 @@ Adres: %4 <translation>Huidig aantal blokken</translation> </message> <message> + <source>Received</source> + <translation>Ontvangen</translation> + </message> + <message> + <source>Sent</source> + <translation>Verstuurd</translation> + </message> + <message> + <source>Direction</source> + <translation>Directie</translation> + </message> + <message> + <source>Version</source> + <translation>Versie</translation> + </message> + <message> + <source>User Agent</source> + <translation>User Agent</translation> + </message> + <message> + <source>Services</source> + <translation>Services</translation> + </message> + <message> + <source>Connection Time</source> + <translation>Connectie tijd</translation> + </message> + <message> + <source>Last Send</source> + <translation>Laatst verstuurd</translation> + </message> + <message> + <source>Last Receive</source> + <translation>Laatst ontvangen</translation> + </message> + <message> + <source>Bytes Sent</source> + <translation>Bytes Verzonden</translation> + </message> + <message> + <source>Bytes Received</source> + <translation>Bytes Ontvangen</translation> + </message> + <message> <source>Last block time</source> <translation>Tijd laatste blok</translation> </message> @@ -1400,6 +1484,18 @@ Adres: %4 <source>%1 GB</source> <translation>%1 Gb</translation> </message> + <message> + <source>via %1</source> + <translation>via %1</translation> + </message> + <message> + <source>never</source> + <translation>nooit</translation> + </message> + <message> + <source>Unknown</source> + <translation>Onbekend</translation> + </message> </context> <context> <name>ReceiveCoinsDialog</name> @@ -1641,6 +1737,10 @@ Adres: %4 <translation>Wis alle velden van het formulier.</translation> </message> <message> + <source>Dust:</source> + <translation>Stof:</translation> + </message> + <message> <source>Clear &All</source> <translation>Verwijder &Alles</translation> </message> @@ -1741,6 +1841,10 @@ Adres: %4 <translation>Waarschuwing: Onbekend wisselgeldadres</translation> </message> <message> + <source>Copy dust</source> + <translation>Kopieër stof</translation> + </message> + <message> <source>Are you sure you want to send?</source> <translation>Weet u zeker dat u wilt verzenden?</translation> </message> @@ -2431,28 +2535,10 @@ Adres: %4 <translation>Opties:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Specificeer configuratiebestand (standaard: bitcoin.conf) -</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Specificeer pid-bestand (standaard: bitcoind.pid) -</translation> - </message> - <message> <source>Specify data directory</source> <translation>Stel datamap in</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Luister voor verbindingen op <poort> (standaard: 8333 of testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Onderhoud maximaal <n> verbindingen naar peers (standaard: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Verbind naar een node om adressen van anderen op te halen, en verbreek vervolgens de verbinding</translation> </message> @@ -2461,18 +2547,6 @@ Adres: %4 <translation>Specificeer uw eigen publieke adres</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Drempel om verbinding te verbreken naar zich misdragende peers (standaard: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Aantal seconden dat zich misdragende peers niet opnieuw mogen verbinden (standaard: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Wacht op JSON-RPC-connecties op poort <port> (standaard: 8332 of testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Aanvaard commandoregel- en JSON-RPC-commando's</translation> </message> @@ -2511,18 +2585,10 @@ Het is ook aan te bevelen "alertnotify" in te stellen zodat u op de hoogte geste bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Aanvaardbare cijfers (standaard: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Bind aan opgegeven adres en luister er altijd op. Gebruik [host]:port notatie voor IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Doorlopend tarief-limiet op gratis transacties toepassen tot <n>*1000 bytes per minuut (standaard: 15)</translation> - </message> - <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Schakel regressietest-modus in, die een speciale blokketen gebruikt waarin blokken onmiddellijk opgelost kunnen worden.</translation> </message> @@ -2539,14 +2605,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Voer opdracht uit zodra een portemonneetransactie verandert (%s in cmd wordt vervangen door TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Leeg database-activiteit uit de geheugenpool naar schijf log elke <n> megabytes (standaard: 100) </translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Hoe grondig de blokverificatie van -checkblocks is (0-4, standaard: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>In deze modus, -genproclimit controleert hoeveel blokken er onmiddellijk worden gegenereerd.</translation> </message> @@ -2555,10 +2613,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Kies het aantal script verificatie processen (%u tot %d, 0 = auto, <0 = laat dit aantal kernen vrij, standaard: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Kies de processorlimiet wanneer generation is aan (-1 = ongelimiteerd, standaard: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Dit is een pre-release testversie - gebruik op eigen risico! Gebruik deze niet voor het delven van munten of handelsdoeleinden</translation> </message> @@ -2567,10 +2621,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Niet in staat om %s te verbinden op deze computer. Bitcoin Core draait waarschijnlijk al.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Gebruik een aparte SOCKS5 proxy om 'Tor hidden services' te bereiken (standaard: hetzelfde als -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Waarschuwing: -paytxfee is zeer hoog ingesteld. Dit zijn de transactiekosten die u betaalt bij het versturen van een transactie.</translation> </message> @@ -2595,10 +2645,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>(standaard: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(standaard: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> kan zijn:</translation> </message> @@ -2627,10 +2673,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Foutopsporing/Testopties:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Veilige modus uitschakelen, hef een echte veilige modus gebeurtenis uit (default: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Ontdek eigen IP-adres (standaard: 1 als er wordt geluisterd en geen -externalip is opgegeven)</translation> </message> @@ -2667,66 +2709,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Fout: Portemonnee vergrendeld, aanmaak transactie niet mogelijk!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Fout: Systeemfout:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Mislukt om op welke poort dan ook te luisteren. Gebruik -listen=0 as u dit wilt.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Lezen van blokinformatie mislukt</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Lezen van blok mislukt</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Synchroniseren van blokindex mislukt</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Schrijven van blokindex mislukt</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Schrijven van blokinformatie mislukt</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Schrijven van blok mislukt</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Schrijven van bestandsinformatie mislukt</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Schrijven naar coindatabase mislukt</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Schrijven van transactieindex mislukt</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Schrijven van undo-data mislukt</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Forceer veilige modus (default: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Genereer munten (standaard: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Aantal te checken blokken bij het opstarten (standaard: 288, 0 = allemaal)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Als er geen <category> is opgegeven, laat dan alle debugging informatie zien.</translation> </message> @@ -2747,10 +2733,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Niet genoeg file descriptors beschikbaar.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Prepend debug output met tijdstempel (standaard: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Blokketen opnieuw opbouwen met behulp van huidige blk000??.dat-bestanden</translation> </message> @@ -2763,18 +2745,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Stel maximum blokgrootte in in bytes (standaard: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Stel het aantal threads in om RPC-aanvragen mee te bedienen (standaard: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Specificeer het portemonnee bestand (vanuit de gegevensmap)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Spendeer onbevestigd wisselgeld wanneer transacties verstuurd worden (standaard: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Dit is bedoeld voor regressie test toepassingen en applicatie onwikkeling.</translation> </message> @@ -2811,10 +2785,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Voer commando uit zodra een waarschuwing is ontvangen of wanneer we een erg lange fork detecteren (%s in commando wordt vervangen door bericht)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Output extra debugginginformatie (standaard: 0, het leveren van <category> is optioneel)</translation> - </message> - <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>Stel maximumgrootte in bytes in voor hoge-prioriteits-/lage-transactiekosten-transacties (standaard: %d)</translation> </message> @@ -2831,42 +2801,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Ongeldig bedrag voor -mintxfee=<bedrag>: '%s'</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Limiteer grootte van de handtekening cache tot <n> entries (default: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Log transactieprioriteit en vergoeding per kB bij mijnen blocks (standaard: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Onderhoud een volledige transactieindex (standaard: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maximum per-connectie ontvangstbuffer, <n>*1000 bytes (standaard: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maximum per-connectie zendbuffer, <n>*1000 bytes (standaard: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Accepteer alleen blokketen die overeenkomt met de ingebouwde checkpoints (standaard: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Verbind alleen naar nodes in netwerk <net> (IPv4, IPv6 of Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Toon block bij opstarten, wanneer gevonden in block index</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Toon block structuur bij opstarten (default: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL opties: (zie de Bitcoin Wiki voor SSL installatie-instructies)</translation> </message> @@ -2883,22 +2821,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Fuzz willekeurig 1 van elke <n> netwerkberichten</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Draai een proces om de wallet periodiek te flushen (default: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Stuur trace/debug-info naar de console in plaats van het debug.log bestand</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Stel minimum blokgrootte in in bytes (standaard: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Plaatst de DB_PRIVATE vlag in de wallet db omgeving (default: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Toon alle foutopsporingsopties (gebruik: --help -help-debug)</translation> </message> @@ -2911,12 +2837,8 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Ondertekenen van transactie mislukt</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Specificeer de time-outtijd in milliseconden (standaard: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Systeemfout:</translation> + <source>This is experimental software.</source> + <translation>Dit is experimentele software.</translation> </message> <message> <source>Transaction amount too small</source> @@ -2931,10 +2853,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Transactie te groot</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Gebruik UPnP om de luisterende poort te mappen (standaard: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Gebruik UPnP om de luisterende poort te mappen (standaard: 1 als er wordt geluisterd)</translation> </message> @@ -2975,10 +2893,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Vernieuw portemonnee naar nieuwste versie</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Stel sleutelpoelgrootte in op <n> (standaard: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Doorzoek de blokketen op ontbrekende portemonnee-transacties</translation> </message> @@ -2987,14 +2901,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran <translation>Gebruik OpenSSL (https) voor JSON-RPC-verbindingen</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Certificaat-bestand voor server (standaard: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Geheime sleutel voor server (standaard: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Dit helpbericht</translation> </message> diff --git a/src/qt/locale/bitcoin_pam.ts b/src/qt/locale/bitcoin_pam.ts index d109c24423..b0a92a1578 100644 --- a/src/qt/locale/bitcoin_pam.ts +++ b/src/qt/locale/bitcoin_pam.ts @@ -1,4 +1,4 @@ -<TS language="pam" version="2.1"> +<TS language="pam" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -10,10 +10,22 @@ <translation>Maglalang kang bayung address</translation> </message> <message> + <source>&New</source> + <translation>&Bayu</translation> + </message> + <message> <source>Copy the currently selected address to the system clipboard</source> <translation>Kopyan me ing salukuyan at makipiling address keng system clipboard</translation> </message> <message> + <source>&Copy</source> + <translation>&Kopyan</translation> + </message> + <message> + <source>C&lose</source> + <translation>I&sara</translation> + </message> + <message> <source>&Copy Address</source> <translation>&Kopyan ing address</translation> </message> @@ -26,10 +38,34 @@ <translation>&Ilako</translation> </message> <message> + <source>Choose the address to send coins to</source> + <translation>Pilinan ing address a magpadalang coins kang</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Pilinan ing address a tumanggap coins a atin</translation> + </message> + <message> + <source>C&hoose</source> + <translation>P&ilinan</translation> + </message> + <message> + <source>Sending addresses</source> + <translation>Address king pamag-Padala</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Address king pamag-Tanggap</translation> + </message> + <message> <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> <translation>Reni reng kekang Bitcoin address king pamagpadalang kabayaran. Lawan mulang masalese reng alaga ampo ing address na ning tumanggap bayu ka magpadalang barya.</translation> </message> <message> + <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> + <translation>Reni reng kekang Bitcoin addresses keng pamananggap bayad. Rerekomenda mi na gumamit kang bayung address keng balang transaksiyon.</translation> + </message> + <message> <source>Copy &Label</source> <translation>Kopyan ing &Label</translation> </message> @@ -279,10 +315,6 @@ <translation>Gamit para king Tabs</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Kapilubluban ning Bitcoin</translation> </message> @@ -357,10 +389,6 @@ Address: %4 <translation>Alaga</translation> </message> <message> - <source>Address</source> - <translation>Address</translation> - </message> - <message> <source>Date</source> <translation>Kaaldauan</translation> </message> @@ -503,10 +531,6 @@ Address: %4 <translation>&Pun</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>Mamayad &bayad para king transaksion </translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Umpisan yang antimu ing Bitcoin kaibat mekapag-log in king sistema.</translation> </message> @@ -606,10 +630,6 @@ Address: %4 <translation>Ing makaltong impormasion mapalyaring luma ne. Ing kekang wallet otomatiku yang mag-synchronize keng Bitcoin network istung mekakonekta ne king network, oneng ing prosesung ini ali ya pa kumpletu.</translation> </message> <message> - <source>Wallet</source> - <translation>Wallet</translation> - </message> - <message> <source>Your current spendable balance</source> <translation>Ing kekang kasalungsungan balanse a malyari mung gastusan</translation> </message> @@ -634,10 +654,6 @@ Address: %4 <translation>Ing kekang kasalungsungan kabuuang balanse</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Reng kapilan pamung transaksion</b></translation> - </message> - <message> <source>out of sync</source> <translation>ali ya maka-sync</translation> </message> @@ -1375,26 +1391,10 @@ Address: %4 <translation>Pipamilian:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Pilinan ing configuration file(default: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Pilinan ing pid file(default: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Pilinan ing data directory</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Makiramdam king koneksion king <port>(default: 8333 o testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Mag-maintain peka <n> koneksion keng peers (default: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Kumunekta king note ban ayakua mula reng peer address, at mako king panga konekta</translation> </message> @@ -1403,14 +1403,6 @@ Address: %4 <translation>Sabyan me ing kekang pampublikong address</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Threshold for disconnecting misbehaving peers (default: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Tumanggap command line at JSON-RPC commands</translation> </message> @@ -1463,58 +1455,10 @@ Address: %4 <translation>Kamalian: Mababa ne ing espasyu king disk!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Kamalian: kamalian na ning sistema:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Memali ya ing pamakiramdam kareng gang nanung port. Gamita me ini -listen=0 nung buri me ini.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Me-mali king pamagbasa king impormasion ning block</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Me-mali king pamagbasa keng block</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Me-mali para i-sync ing block index</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Me-mali king pamanyulat king block index</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Me-mali king pamanyulat king block info</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Me-mali king pamanyulat block</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Me-mali king pamanyulat king file info</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Me-mali king pamanyulat king coin database</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Me-mali king pamanyulat king index ning transaksion</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Me-mali king pamanyulat king undo data</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Pilan la reng block a lawan keng umpisa (default: 288, 0 = all)</translation> - </message> - <message> <source>Information</source> <translation>&Impormasion</translation> </message> @@ -1523,14 +1467,6 @@ Address: %4 <translation>Magpadalang trace/debug info okeng console kesa keng debug.log file</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Ilage ing pekaditak a dagul na ning block king bytes (default: 0)</translation> - </message> - <message> - <source>System error: </source> - <translation>Kamalian ning sistema:</translation> - </message> - <message> <source>Transaction too large</source> <translation>Maragul yang masiadu ing transaksion</translation> </message> @@ -1559,10 +1495,6 @@ Address: %4 <translation>I-upgrade ing wallet king pekabayung porma</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>I-set ing key pool size king <n>(default: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>I-scan pasibayu ing block chain para kareng mauaualang transaksion</translation> </message> @@ -1571,14 +1503,6 @@ Address: %4 <translation>Gumamit OpenSSL(https) para king JSON-RPC koneksion</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Server certificate file (default: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Server private key (default: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Ining saup a mensayi</translation> </message> diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts index 7cf3d042a1..c53a9970ef 100644 --- a/src/qt/locale/bitcoin_pl.ts +++ b/src/qt/locale/bitcoin_pl.ts @@ -1,4 +1,4 @@ -<TS language="pl" version="2.1"> +<TS language="pl" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -387,10 +387,6 @@ <translation>Pasek zakładek</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Rdzeń BitCoin</translation> </message> @@ -426,10 +422,6 @@ <source>No block source available...</source> <translation>Brak dostępnych źródeł bloków...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Pobrano %1 bloków z historią transakcji.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n godzina</numerusform><numerusform>%n godzin</numerusform><numerusform>%n godzin</numerusform></translation> @@ -565,10 +557,6 @@ Adres: %4 <translation>Kwota</translation> </message> <message> - <source>Address</source> - <translation>Adres</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -888,15 +876,7 @@ Adres: %4 <source>Error</source> <translation>Błąd</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB dostępnego wolnego miejsca</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(z %1GB potrzebnego)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -931,14 +911,6 @@ Adres: %4 <translation>Główne</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Opcjonalna prowizja za transakcje za kB, wspomaga ona szybkość przebiegu transakcji. Większość transakcji jest 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Płać prowizję za transakcje</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Automatycznie uruchamia Bitcoin po zalogowaniu do systemu.</translation> </message> @@ -963,10 +935,6 @@ Adres: %4 <translation>Zezwól na połączenia przychodzące</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Połącz się z siecią Bitcoin poprzez SOCKS proxy.</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Adres IP serwera proxy (np. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1102,10 +1070,6 @@ Adres: %4 <translation>Wyświetlana informacja może być nieaktualna. Twój portfel synchronizuje się automatycznie z siecią bitcoin, zaraz po tym jak uzyskano połączenie, ale proces ten nie został jeszcze ukończony.</translation> </message> <message> - <source>Wallet</source> - <translation>Portfel</translation> - </message> - <message> <source>Available:</source> <translation>Dostępne:</translation> </message> @@ -1138,10 +1102,6 @@ Adres: %4 <translation>Twoje obecne saldo</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Ostatnie transakcje</b></translation> - </message> - <message> <source>out of sync</source> <translation>desynchronizacja</translation> </message> @@ -2347,26 +2307,10 @@ Adres: %4 <translation>Opcje:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Wskaż plik konfiguracyjny (domyślnie: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Wskaż plik pid (domyślnie: bitcoin.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Wskaż folder danych</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Nasłuchuj połączeń na <port> (domyślnie: 8333 lub testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Utrzymuj maksymalnie <n> połączeń z peerami (domyślnie: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Podłącz się do węzła aby otrzymać adresy peerów i rozłącz</translation> </message> @@ -2375,18 +2319,6 @@ Adres: %4 <translation>Podaj swój publiczny adres</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Próg po którym nastąpi rozłączenie nietrzymających się zasad peerów (domyślnie: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Czas w sekundach, przez jaki nietrzymający się zasad peerzy nie będą mogli ponownie się podłączyć (domyślnie: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Nasłuchuj połączeń JSON-RPC na <port> (domyślnie: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Akceptuj linię poleceń oraz polecenia JSON-RPC</translation> </message> @@ -2426,10 +2358,6 @@ Zalecane jest ustawienie alertnotify aby poinformować o problemach:⏎ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Dopuszczalne szyfry (domyślnie: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Skojarz z podanym adresem. Użyj formatu [host]:port dla IPv6 </translation> </message> @@ -2474,10 +2402,6 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>(domyślnie: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(domyślnie: wallet.dat)</translation> - </message> - <message> <source>Attempt to recover private keys from a corrupt wallet.dat</source> <translation>Próbuj odzyskać klucze prywatne z uszkodzonego wallet.dat</translation> </message> @@ -2538,66 +2462,10 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>Błąd: Zablokowany portfel, nie można utworzyć transakcji!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Błąd: błąd systemu:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Próba otwarcia jakiegokolwiek portu nie powiodła się. Użyj -listen=0 jeśli tego chcesz.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Nie udało się odczytać informacji bloku</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Nie udało się odczytać bloku.</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Nie udało się zsynchronizować indeksu bloków.</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Nie udało się zapisać indeksu bloków.</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Nie udało się zapisać informacji bloku</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Nie udało się zapisać bloku</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Nie udało się zapisać informacji o pliku</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Nie udało się zapisać do bazy monet</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Nie udało się zapisać indeksu transakcji</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Nie udało się zapisać danych odtwarzających</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Wymuś tryb bezpieczny (domyślnie: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generuj monety (domyślnie: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Ile bloków sprawdzić przy starcie (domyślnie: 288, 0 = wszystkie)</translation> - </message> - <message> <source>Importing...</source> <translation>Importowanie…</translation> </message> @@ -2626,18 +2494,10 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>Ustaw maksymalną wielkość bloku w bajtach (domyślnie: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Ustaw liczbę wątków do odwołań RPC (domyślnie: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Określ plik portfela (w obrębie folderu danych)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Wydawaj niepotwierdzoną resztę podczas wysyłania transakcji (domyślnie: 1)</translation> - </message> - <message> <source>Verifying blocks...</source> <translation>Weryfikacja bloków...</translation> </message> @@ -2682,46 +2542,14 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>Nieprawidłowa kwota dla -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Ogranicz rozmiar pamięci podręcznej sygnatur do <n> wpisów (domyslnie: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Loguj priorytety transakcji i opłaty na kB podczas kopania bloków (domyślnie: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Utrzymuj pełen indeks transakcji (domyślnie: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maksymalny bufor odbioru na połączenie, <n>*1000 bajtów (domyślnie: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maksymalny bufor wysyłu na połączenie, <n>*1000 bajtów (domyślnie: 1000)</translation> - </message> - <message> <source>Node relay options:</source> <translation>Opcje przekaźnikowe węzła:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Akceptuj tylko łańcuch bloków zgodny z wbudowanymi punktami kontrolnymi (domyślnie: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Łącz z węzłami tylko w sieci <net> (IPv4, IPv6 lub Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Wyświetlaj blok podczas uruchamiania, jeżeli znaleziono indeks bloków</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Wypisz drzewo bloków podczas uruchomienia (domyślnie: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Opcje RPC SSL: (odwiedź Bitcoin Wiki w celu uzyskania instrukcji)</translation> </message> @@ -2738,18 +2566,10 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>Losowo ignoruje 1 z wszystkich <n> wiadomości sieciowych.</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Uruchom wątek do okresowego zapisywania portfela (domyślnie: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Wyślij informację/raport do konsoli zamiast do pliku debug.log.</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Ustaw minimalny rozmiar bloku w bajtach (domyślnie: 0)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Pokaż wszystkie opcje odpluskwiania (użycie: --help -help-debug)</translation> </message> @@ -2762,14 +2582,6 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>Podpisywanie transakcji nie powiodło się</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Wskaż czas oczekiwania bezczynności połączenia w milisekundach (domyślnie: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Błąd systemu:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>To oprogramowanie eksperymentalne.</translation> </message> @@ -2786,10 +2598,6 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>Transakcja zbyt duża</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Używaj UPnP do mapowania portu nasłuchu (domyślnie: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Używaj UPnP do mapowania portu nasłuchu (domyślnie: 1 gdy nasłuchuje)</translation> </message> @@ -2830,10 +2638,6 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>Zaktualizuj portfel do najnowszego formatu.</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Ustaw rozmiar puli kluczy na <n> (domyślnie: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Przeskanuj blok łańcuchów żeby znaleźć zaginione transakcje portfela</translation> </message> @@ -2842,14 +2646,6 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t <translation>Użyj OpenSSL (https) do połączeń JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Plik certyfikatu serwera (domyślnie: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Klucz prywatny serwera (domyślnie: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Ta wiadomość pomocy</translation> </message> diff --git a/src/qt/locale/bitcoin_pt_BR.ts b/src/qt/locale/bitcoin_pt_BR.ts index 0cdb7d6694..65f07ca59c 100644 --- a/src/qt/locale/bitcoin_pt_BR.ts +++ b/src/qt/locale/bitcoin_pt_BR.ts @@ -1,4 +1,4 @@ -<TS language="pt_BR" version="2.1"> +<TS language="pt_BR" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Barra de ferramentas</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Núcleo Bitcoin</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Nenhum servidor disponível...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Processado %1 blocos do histórico de transações.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n hora</numerusform><numerusform>%n horas</numerusform></translation> @@ -528,10 +520,6 @@ Endereço: %4</translation> <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Coin Control Address Selection</translation> - </message> - <message> <source>Quantity:</source> <translation>Quantidade:</translation> </message> @@ -580,10 +568,6 @@ Endereço: %4</translation> <translation>Quantidade</translation> </message> <message> - <source>Address</source> - <translation>Endereço</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -915,13 +899,13 @@ Endereço: %4</translation> <source>Error</source> <translation>Erro</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB de espaço disponível</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB de espaço livre disponível</numerusform><numerusform>%n GB de espaço livre disponível</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(Mais de %1GB necessário)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(de %n GB necessário)</numerusform><numerusform>(de %n GB necessário)</numerusform></translation> </message> </context> <context> @@ -958,14 +942,6 @@ Endereço: %4</translation> <translation>Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Taxa de transação opcional por kB que ajuda a garantir que suas transações sejam processadas rapidamente. A maioria das transações são de 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Pagar taxa de &transação</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Iniciar Bitcoin automaticamente após se logar no sistema.</translation> </message> @@ -994,14 +970,6 @@ Endereço: %4</translation> <translation>Permitir conexões de entrada</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Conectado na rede do Bitcoin através de proxy SOCKS.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Conectado via proxy SOCKS (padrão proxy):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Endereço de IP do proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1165,10 +1133,6 @@ Endereço: %4</translation> <translation>A informação mostrada pode estar desatualizada. Sua carteira sincroniza automaticamente com a rede Bitcoin depois que a conexão é estabelecida, mas este processo pode não estar completo ainda.</translation> </message> <message> - <source>Wallet</source> - <translation>Carteira</translation> - </message> - <message> <source>Watch-only:</source> <translation>Apenas visualizar:</translation> </message> @@ -1197,6 +1161,10 @@ Endereço: %4</translation> <translation>Saldo minerado que ainda não maturou</translation> </message> <message> + <source>Balances</source> + <translation>Saldos</translation> + </message> + <message> <source>Total:</source> <translation>Total:</translation> </message> @@ -1209,8 +1177,8 @@ Endereço: %4</translation> <translation>Sua balança atual em endereços apenas visualizados</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transações recentes</b></translation> + <source>Recent transactions</source> + <translation>Transações recentes</translation> </message> <message> <source>out of sync</source> @@ -1282,7 +1250,11 @@ Endereço: %4</translation> </context> <context> <name>PeerTableModel</name> - </context> + <message> + <source>Ping Time</source> + <translation>Tempo de Ping</translation> + </message> +</context> <context> <name>QObject</name> <message> @@ -1416,6 +1388,10 @@ Endereço: %4</translation> <translation>&Pares</translation> </message> <message> + <source>Direction</source> + <translation>Direção</translation> + </message> + <message> <source>Version</source> <translation>Versão</translation> </message> @@ -1424,6 +1400,30 @@ Endereço: %4</translation> <translation>Serviços</translation> </message> <message> + <source>Ban Score</source> + <translation>Banir pontuação</translation> + </message> + <message> + <source>Last Send</source> + <translation>Ultimo Envio</translation> + </message> + <message> + <source>Last Receive</source> + <translation>Ultimo Recebido</translation> + </message> + <message> + <source>Bytes Sent</source> + <translation>Bytes Enviados</translation> + </message> + <message> + <source>Bytes Received</source> + <translation>bytes Recebidos</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Tempo de Ping</translation> + </message> + <message> <source>Last block time</source> <translation>Horário do último bloco</translation> </message> @@ -1516,14 +1516,6 @@ Endereço: %4</translation> <translation>Saída</translation> </message> <message> - <source>Yes</source> - <translation>Sim</translation> - </message> - <message> - <source>No</source> - <translation>Não</translation> - </message> - <message> <source>Unknown</source> <translation>Desconhecido</translation> </message> @@ -1911,6 +1903,10 @@ Endereço: %4</translation> <translation>Este é um pagamento normal.</translation> </message> <message> + <source>The Bitcoin address to send the payment to</source> + <translation>O enderesso Bitcoin que enviarár o pagamento</translation> + </message> + <message> <source>Alt+A</source> <translation>Alt+A</translation> </message> @@ -1981,6 +1977,10 @@ Endereço: %4</translation> <translation>Você pode assinar mensagens com seus endereços para provar que você é o dono deles. Seja cuidadoso para não assinar algo vago, pois ataques de pishing podem tentar te enganar para dar sua assinatura de identidade para eles. Apenas assine afirmações completamente detalhadas com as quais você concorda.</translation> </message> <message> + <source>The Bitcoin address to sign the message with</source> + <translation>O enderesso Bitcoin que assinará a mensagem</translation> + </message> + <message> <source>Choose previously used address</source> <translation>Escolha um endereço usado anteriormente</translation> </message> @@ -2033,6 +2033,10 @@ Endereço: %4</translation> <translation>Forneça o endereço da assinatura, a mensagem (se assegure que você copiou quebras de linha, espaços, tabs, etc. exatamente) e a assinatura abaixo para verificar a mensagem. Cuidado para não ler mais na assinatura do que está escrito na mensagem propriamente, para evitar ser vítima de uma ataque do tipo "man-in-the-middle".</translation> </message> <message> + <source>The Bitcoin address the message was signed with</source> + <translation>O enderesso Bitcoin que assionou a mesnagem</translation> + </message> + <message> <source>Verify the message to ensure it was signed with the specified Bitcoin address</source> <translation>Verificar mensagem para se assegurar que ela foi assinada pelo dono de um endereço Bitcoin específico.</translation> </message> @@ -2174,6 +2178,10 @@ Endereço: %4</translation> <translation>seu próprio endereço</translation> </message> <message> + <source>watch-only</source> + <translation>Vizualização apenas</translation> + </message> + <message> <source>label</source> <translation>rótulo</translation> </message> @@ -2194,6 +2202,14 @@ Endereço: %4</translation> <translation>Débito</translation> </message> <message> + <source>Total debit</source> + <translation>Débito total</translation> + </message> + <message> + <source>Total credit</source> + <translation>Credito total</translation> + </message> + <message> <source>Transaction fee</source> <translation>Taxa de transação</translation> </message> @@ -2344,6 +2360,10 @@ Endereço: %4</translation> <translation>Minerado</translation> </message> <message> + <source>watch-only</source> + <translation>Vizualização apenas</translation> + </message> + <message> <source>(n/a)</source> <translation>(n/a)</translation> </message> @@ -2455,6 +2475,10 @@ Endereço: %4</translation> <translation>Exportar Histórico de Transação</translation> </message> <message> + <source>Watch-only</source> + <translation>Vizualização apenas</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Exportação Falhou</translation> </message> @@ -2566,26 +2590,10 @@ Endereço: %4</translation> <translation>Opções:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especifique um arquivo de configurações (padrão: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especifique um arquivo de pid (padrão: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especificar diretório de dados</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Procurar por conexões em <port> (padrão: 8333 ou testnet:18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Manter no máximo <n> conexões aos peers (padrão: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Conectar a um nó para receber endereços de participantes, e desconectar.</translation> </message> @@ -2594,18 +2602,6 @@ Endereço: %4</translation> <translation>Especificar seu próprio endereço público</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Limite para desconectar peers mal comportados (padrão: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Número de segundos para impedir que peers mal comportados reconectem (padrão: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escutar conexões JSON-RPC na porta <porta> (padrão: 8332 ou testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Aceitar linha de comando e comandos JSON-RPC</translation> </message> @@ -2646,18 +2642,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Codificadores aceitos (padrão: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Vincular ao endereço fornecido e sempre escutar nele. Use a notação [host]:port para IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Restringe a taxa de transações gratuitas para <n>*1000 bytes por minuto (padrão:15)</translation> - </message> - <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Entra no modo de teste de regressão, que usa uma cadeia especial onde os blocos podem ser resolvidos instantaneamente.</translation> </message> @@ -2674,14 +2662,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Executar comando quando uma transação da carteira mudar (%s no comando será substituído por TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Descarrega a atividade do banco de dados da memória para log em disco a cada <n> megabytes (padrão: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Quão completa a verificação de blocos do -checkblocks é (0-4, padrão: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>Neste modo -genproclimit controla quantos blocos são gerados imediatamente.</translation> </message> @@ -2690,10 +2670,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Define o número de threads de verificação de script (%u a %d, 0 = automático, <0 = número de cores deixados livres, padrão: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Define o limite de processador para quando geração está ativa (-1 = ilimitada, padrão: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Este pode ser um build de teste pré-lançamento - use por sua conta e risco - não use para mineração ou aplicações de comércio.</translation> </message> @@ -2702,10 +2678,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Impossível ouvir em %s neste computador. Bitcoin Core já está sendo executado provavelmente.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Use proxy SOCKS5 separado para alcançar nós via Tor hidden services (padrão: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Atenção: valor de -paytxfee escolhido é muito alto! Este é o valor da taxa de transação que você irá pagar se enviar a transação.</translation> </message> @@ -2730,10 +2702,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>(padrão: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(padrão: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> pode ser:</translation> </message> @@ -2762,10 +2730,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Opções de Debug/Teste:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Desabilita modo seguro, sobrepõe um evento de modo seguro real (padrão: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Descobrir os próprios endereços IP (padrão: 1 quando no modo listening e opção -externalip não estiver presente)</translation> </message> @@ -2794,6 +2758,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Erro ao abrir banco de dados de blocos</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Erro: Um erro interno fatal ocorreu, ver o debug.log para detalhes</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Erro: Espaço em disco insuficiente!</translation> </message> @@ -2802,66 +2770,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Erro: Carteira bloqueada, impossível criar transação!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Erro: erro de sistema</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Falha ao escutar em qualquer porta. Use -listen=0 se você quiser isso.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Falha ao ler informação de bloco</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Falha ao ler bloco</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Falha ao sincronizar índice de blocos</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Falha ao escrever índice de blocos</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Falha ao escrever informações de bloco</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Falha ao escrever bloco</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Falha ao escrever informções de arquivo</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Falha ao escrever banco de dados de moedas</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Falha ao escrever índice de transações</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Falha ao escrever dados para desfazer ações</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Força modo seguro (padrão: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Gerar moedas (padrão: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Quantos blocos checar ao inicializar (padrão: 288, 0 = todos)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Se <category> não for informada, logar toda informação de debug.</translation> </message> @@ -2882,10 +2794,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Decriptadores de arquivos disponíveis insuficientes.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Adiciona timestamp como prefixo no debug (padrão: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Reconstruir índice de blockchain a partir dos arquivos atuais blk000??.dat</translation> </message> @@ -2898,22 +2806,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Define o tamanho máximo de cada bloco em bytes (padrão: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Defina o número de threads de chamadas RPC (padrão: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Especifique o arquivo da carteira (dentro do diretório de dados)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Permite gastar troco não confirmado ao criar transações (padrão: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Parar de executar após importar blocos do disco (padrão: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Isso é usado para testes de regressão e ferramentas de desenvolvimento.</translation> </message> @@ -2954,10 +2850,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Erro: Escutar por conexões de entrada falhou (escutar retornou erro %s)</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Executa comando quando uma transação da rede gasta novamente uma transação de entrada da carteira (%s=TxID do gasto duplo, %t=TxID da Carteira)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Executa o comando quando um alerta relevante é recebido ou vemos uma longa segregação (%s em cmd é substituído pela mensagem)</translation> </message> @@ -2970,10 +2862,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Taxas (em BTC/Kb) menores do que este valor são consideradas inexistentes para a criação da transação (padrão: %s)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Informação de saída de debug (padrão: 0, definir <category> é opcional)</translation> - </message> - <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>Define o tamanho máximo de alta-prioridade por taxa baixa nas transações em bytes (padrão: %d)</translation> </message> @@ -2982,6 +2870,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Impossível resolver endereço -whitebind: '%s'</translation> </message> <message> + <source>Connect through SOCKS5 proxy</source> + <translation>Connecte-se através de um proxy SOCKS5</translation> + </message> + <message> <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> <translation>Copyright (C) 2009-%i Desenvolvedores Bitcoin Core</translation> </message> @@ -2994,10 +2886,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Taxa (em BTC/kB) a adicionar nas transações que você envia (padrão: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Incluir endereços IP na saída de depuração (padrão: 0)</translation> - </message> - <message> <source>Information</source> <translation>Informação</translation> </message> @@ -3022,46 +2910,14 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Manter no máximo <n> blocos pendentes em memória (padrão: %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Limita tamanho do cache de assinaturas em <n> entradas (padrão: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Registra log da prioridade de transação e taxa por kB quando minerando blocos (padrão: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Manter índice completo de transações (padrão: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Buffer máximo de recebimento por conexão, <n>*1000 bytes (padrão: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Buffer máximo de envio por conexão, <n>*1000 bytes (padrão: 1000)</translation> - </message> - <message> <source>Need to specify a port with -whitebind: '%s'</source> <translation>Necessário informar uma porta com -whitebind: '%s'</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Apenas aceitar cadeia de blocos correspondente a marcas de verificação internas (padrão: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Apenas conectar em nós na rede <net> (IPv4, IPv6, ou Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Imprime bloco ao iniciar, se encontrado no índice de blocos</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Imprime árvore de blocos ao iniciar (padrão: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Opções RPC SSL: (veja o Bitcoin Wiki para instruções de configuração SSL)</translation> </message> @@ -3078,22 +2934,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Aleatoriamente embaralha 1 em cada <n> mensagens da rede</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Executa uma thread para limpar a carteira periodicamente (padrão: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Mandar informação de trace/debug para o console em vez de para o arquivo debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Determinar tamanho mínimo de bloco em bytes (padrão: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Define a flag DB_PRIVATE no ambiente de banco de dados da carteira (padrão: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Exibir todas opções de debug (uso: --help -help-debug)</translation> </message> @@ -3106,14 +2950,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Assinatura de transação falhou</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especifique o tempo limite (timeout) da conexão em milissegundos (padrão: 5000) </translation> - </message> - <message> - <source>System error: </source> - <translation>Erro de sistema:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Este é um software experimental.</translation> </message> @@ -3134,10 +2970,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Impossível se ligar a %s neste computador (bind retornou erro %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Usar UPnP para mapear porta de escuta (padrão: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Usar UPnP para mapear porta de escuta (padrão: 1 quando estiver escutando)</translation> </message> @@ -3146,6 +2978,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Nome de usuário para conexões JSON-RPC</translation> </message> <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>Sua carteira precisou ser reescrita: favor reiniciar o Bitcoin para completar</translation> + </message> + <message> <source>Warning</source> <translation>Atenção</translation> </message> @@ -3178,10 +3014,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Atualizar carteira para o formato mais recente</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Determinar tamanho do pool de endereços para <n> (padrão: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Re-escanear blocos procurando por transações perdidas da carteira</translation> </message> @@ -3190,14 +3022,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Usar OpenSSL (https) para conexões JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Arquivo de certificado do servidor (padrão: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Chave privada do servidor (padrão: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Esta mensagem de ajuda</translation> </message> @@ -3222,6 +3046,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎ <translation>Endereço -proxy inválido: '%s'</translation> </message> <message> + <source>Specify pid file (default: %s)</source> + <translation>Especificar aqrquivo pid (default: %s)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>Rede desconhecida especificada em -onlynet: '%s'</translation> </message> diff --git a/src/qt/locale/bitcoin_pt_PT.ts b/src/qt/locale/bitcoin_pt_PT.ts index 2d277528b1..dc016623e4 100644 --- a/src/qt/locale/bitcoin_pt_PT.ts +++ b/src/qt/locale/bitcoin_pt_PT.ts @@ -1,4 +1,4 @@ -<TS language="pt_PT" version="2.1"> +<TS language="pt_PT" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -180,6 +180,10 @@ <translation>Carteira encriptada</translation> </message> <message> + <source>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>.</source> + <translation>Escreva a nova frase de seguraça da sua carteira. <br/> Por favor, use uma frase de <b>10 ou mais caracteres aleatórios,</b> ou <b>oito ou mais palavras</b>.</translation> + </message> + <message> <source>Bitcoin 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.</source> <translation>O cliente Bitcoin irá agora ser fechado para terminar o processo de encriptação. Recorde que a encriptação da sua carteira não protegerá totalmente os seus bitcoins de serem roubados por programas maliciosos que infectem o seu computador.</translation> </message> @@ -375,10 +379,6 @@ <translation>Barra de separadores</translation> </message> <message> - <source>[testnet]</source> - <translation>[rede de testes]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -418,10 +418,6 @@ <source>No block source available...</source> <translation>Nenhuma fonte de blocos disponível...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Processados %1 blocos do histórico de transações.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n hora</numerusform><numerusform>%n horas</numerusform></translation> @@ -512,10 +508,6 @@ Endereço: %4</translation> <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Seleção de Endereço Coin Control</translation> - </message> - <message> <source>Quantity:</source> <translation>Quantidade:</translation> </message> @@ -560,10 +552,6 @@ Endereço: %4</translation> <translation>Quantia</translation> </message> <message> - <source>Address</source> - <translation>Endereço</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -875,15 +863,7 @@ Endereço: %4</translation> <source>Error</source> <translation>Erro</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB de espaço livre disponível</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(de %1GB necessários)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -918,14 +898,6 @@ Endereço: %4</translation> <translation>&Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Taxa de transação opcional por KB que ajuda a assegurar que as suas transações serão processadas rapidamente. A maioria das transações tem 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Pagar &taxa de transação</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Começar o Bitcoin automaticamente ao iniciar sessão no sistema.</translation> </message> @@ -946,14 +918,6 @@ Endereço: %4</translation> <translation>Número de processos de &verificação de scripts</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Ligar à rede Bitcoin através de um proxy SOCKS.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>Ligar através de um proxy SO&CKS (proxy por defeito):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Endereço IP do proxy (p.ex. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1105,10 +1069,6 @@ Endereço: %4</translation> <translation>A informação mostrada poderá estar desatualizada. A sua carteira sincroniza automaticamente com a rede Bitcoin depois de estabelecer ligação, mas este processo ainda não está completo.</translation> </message> <message> - <source>Wallet</source> - <translation>Carteira</translation> - </message> - <message> <source>Available:</source> <translation>Disponível:</translation> </message> @@ -1141,10 +1101,6 @@ Endereço: %4</translation> <translation>O seu saldo total actual</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Transações recentes</b></translation> - </message> - <message> <source>out of sync</source> <translation>fora de sincronia</translation> </message> @@ -1160,6 +1116,10 @@ Endereço: %4</translation> <translation>Endereço de pagamento inválido %1</translation> </message> <message> + <source>Payment request rejected</source> + <translation>Pedido de pagamento rejeitado</translation> + </message> + <message> <source>Requested payment amount of %1 is too small (considered dust).</source> <translation>Quantia solicitada para pagamento de %1 é muito pequena (considerada "pó").</translation> </message> @@ -2406,26 +2366,10 @@ Endereço: %4</translation> <translation>Opções:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Especificar ficheiro de configuração (por defeito: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Especificar ficheiro pid (por defeito: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Especificar pasta de dados</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Escute ligações na porta <n> (por defeito: 8333 ou testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Manter no máximo <n> ligações a outros nós da rede (por defeito: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Ligar a um nó para recuperar endereços de pares, e desligar</translation> </message> @@ -2434,18 +2378,6 @@ Endereço: %4</translation> <translation>Especifique o seu endereço público</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Tolerância para desligar nós com comportamento indesejável (por defeito: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Número de segundos a impedir que nós com comportamento indesejado se liguem de novo (por defeito: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Escutar por ligações JSON-RPC na porta <n> (por defeito: 8332 ou rede de testes: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Aceitar comandos de linha de comandos e JSON-RPC</translation> </message> @@ -2485,10 +2417,6 @@ Também é recomendado definir um alertnotify para que seja alertado sobre probl por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Cifras aceitáveis (por defeito: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Associar a endereço específico e escutar sempre nele. Use a notação [anfitrião]:porta para IPv6</translation> </message> @@ -2517,10 +2445,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Incapaz de vincular à porta %s neste computador. O Bitcoin Core provavelmente já está a correr.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Usar um proxy SOCKS5 separado para aceder a pares através de Tor hidden services (por defeito: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Atenção: -paytxfee está definida com um valor muito alto! Esta é a taxa que irá pagar se enviar uma transação.</translation> </message> @@ -2597,62 +2521,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Erro: Carteira bloqueada, incapaz de criar transação! </translation> </message> <message> - <source>Error: system error: </source> - <translation>Erro: erro do sistema:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Falhou a escutar em qualquer porta. Use -listen=0 se quiser isto.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Falha ao ler informação do bloco</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Falha ao ler bloco</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Falha ao sincronizar índice de blocos</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Falha ao escrever índice de blocos</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Falha ao escrever informação do bloco</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Falha ao escrever bloco</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Falha ao escrever informação do ficheiro</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Falha ao escrever na base de dados de moedas</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Falha ao escrever índice de transações</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Falha ao escrever histórico de modificações</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Gerar moedas (por defeito: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Quantos blocos verificar ao inicializar (por defeito: 288, 0 = todos)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Se uma <categoria> não é fornecida, imprimir toda a informação de depuração.</translation> </message> @@ -2669,10 +2541,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Os descritores de ficheiros disponíveis são insuficientes.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Adicionar data e hora à informação de depuração (por defeito: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Reconstruir a cadeia de blocos a partir dos ficheiros blk000??.dat atuais</translation> </message> @@ -2685,18 +2553,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Definir tamanho máximo por bloco em bytes (por defeito: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Defina o número de processos para servir as chamadas RPC (por defeito: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Especifique ficheiro de carteira (dentro da pasta de dados)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Gastar saldo não confirmado ao enviar transações (padrão: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Isto têm como fim a realização de testes de regressão para pools e desenvolvimento de aplicações.</translation> </message> @@ -2733,10 +2593,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Executar comando quando um alerta relevante for recebido ou em caso de uma divisão longa da cadeia de blocos (no comando, %s é substituído pela mensagem)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Informação de depuração (por defeito: 0, fornecer uma <categoria> é opcional)</translation> - </message> - <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>Definir tamanho máximo de transações com alta-prioridade/baixa-taxa em bytes (por defeito: %d)</translation> </message> @@ -2753,34 +2609,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Quantia inválida para -mintxfee=<quantidade>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Manter índice de transações completo (por defeito: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maximo armazenamento intermédio de recepção por ligação, <n>*1000 bytes (por defeito: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maximo armazenamento intermédio de envio por ligação, <n>*1000 bytes (por defeito: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Apenas aceitar cadeia de blocos coincidente com pontos de controle internos (por defeito: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Apenas ligar a nós na rede <net> (IPv4, IPv6 ou Tor)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Enviar informação de rastreio/depuração para a consola e não para o ficheiro debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Definir tamanho minímo de um bloco em bytes (por defeito: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Encolher ficheiro debug.log ao iniciar o cliente (por defeito: 1 sem -debug definido)</translation> </message> @@ -2789,14 +2621,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Falhou assinatura da transação</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Especificar tempo de espera da ligação em millisegundos (por defeito: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Erro de sistema:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Quantia da transação é muito baixa</translation> </message> @@ -2809,10 +2633,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Transação grande demais</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Usar UPnP para mapear a porta de escuta (padrão: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Usar UPnP para mapear a porta de escuta (padrão: 1 ao escutar)</translation> </message> @@ -2849,10 +2669,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Atualize a carteira para o formato mais recente</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Definir o tamanho da memória de chaves para <n> (por defeito: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Procurar transações em falta na cadeia de blocos</translation> </message> @@ -2861,14 +2677,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran <translation>Usar OpenSSL (https) para ligações JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Ficheiro de certificado do servidor (por defeito: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Chave privada do servidor (por defeito: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Esta mensagem de ajuda</translation> </message> diff --git a/src/qt/locale/bitcoin_ro_RO.ts b/src/qt/locale/bitcoin_ro_RO.ts index c9cad3d92a..ccae9482da 100644 --- a/src/qt/locale/bitcoin_ro_RO.ts +++ b/src/qt/locale/bitcoin_ro_RO.ts @@ -1,4 +1,4 @@ -<TS language="ro_RO" version="2.1"> +<TS language="ro_RO" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -275,6 +275,14 @@ <translation>S&chimbă parola...</translation> </message> <message> + <source>&Sending addresses...</source> + <translation>&Trimitere adrese...</translation> + </message> + <message> + <source>&Receiving addresses...</source> + <translation>&Primire adrese...</translation> + </message> + <message> <source>Open &URI...</source> <translation>Vizitaţi &URI...</translation> </message> @@ -367,10 +375,6 @@ <translation>Bara de file</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -398,6 +402,10 @@ <source>&Command-line options</source> <translation>Command-line setări</translation> </message> + <message> + <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> + <translation>Arată mesajul de ajutor Bitcoin Core pentru a obține o listă cu opțiunile posibile de linii de comandă Bitcoin</translation> + </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n conexiune activă către rețeaua Bitcoin</numerusform><numerusform>%n conexiuni active către rețeaua Bitcoin</numerusform><numerusform>%n de conexiuni active către rețeaua Bitcoin</numerusform></translation> @@ -406,10 +414,6 @@ <source>No block source available...</source> <translation>Nici o sursă de bloc disponibil ...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>S-au procesat %1 blocuri din istoricul tranzacțiilor.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n oră</numerusform><numerusform>%n ore</numerusform><numerusform>%n ore</numerusform></translation> @@ -497,10 +501,6 @@ Adresa: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Selectare Adresă de Comandă Monedă</translation> - </message> - <message> <source>Quantity:</source> <translation>Cantitate:</translation> </message> @@ -545,10 +545,6 @@ Adresa: %4 <translation>Sumă</translation> </message> <message> - <source>Address</source> - <translation>Adresă</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -844,15 +840,7 @@ Adresa: %4 <source>Error</source> <translation>Eroare</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB de spațiu liber disponibil</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(din %1GB necesari)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -887,14 +875,6 @@ Adresa: %4 <translation>&Principal</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Taxa optionala de tranzactie per kB care ajuta ca tranzactiile dumneavoastra sa fie procesate rapid. Majoritatea tranzactiilor sunt 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Plăteşte comision pentru tranzacţie &f</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Porneşte automat programul Bitcoin la pornirea computerului.</translation> </message> @@ -907,10 +887,6 @@ Adresa: %4 <translation>MB</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Conecteaza-te la reteaua Bitcoin printr-un proxy SOCKS</translation> - </message> - <message> <source>Reset all client options to default.</source> <translation>Resetează toate setările clientului la valorile implicite.</translation> </message> @@ -1038,10 +1014,6 @@ Adresa: %4 <translation>Informațiile afișate pot neactualizate. Portofelul tău se sincronizează automat cu rețeaua Bitcoin după ce o conexiune este stabilită, dar acest proces nu a fost finalizat încă.</translation> </message> <message> - <source>Wallet</source> - <translation>Portofel</translation> - </message> - <message> <source>Available:</source> <translation>Disponibil:</translation> </message> @@ -1074,10 +1046,6 @@ Adresa: %4 <translation>Balanța totală curentă</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Tranzacții recente</b></translation> - </message> - <message> <source>out of sync</source> <translation>Nu este sincronizat</translation> </message> @@ -2279,26 +2247,10 @@ Adresa: %4 <translation>Setări:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Specifică fișierul de configurare (implicit: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Specifică fișierul pid (implicit bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Specifică dosarul de date</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Ascultă pentru conectări pe <port> (implicit: 8333 sau testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Menține cel mult <n> conexiuni cu partenerii (implicit: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Conectează-te la nod pentru a obține adresele partenerilor, și apoi deconectează-te</translation> </message> @@ -2307,18 +2259,6 @@ Adresa: %4 <translation>Specifică adresa ta publică</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Prag pentru deconectarea partenerilor care nu funcționează corect (implicit: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Numărul de secunde pentru a preveni reconectarea partenerilor care nu funcționează corect (implicit: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Ascultă pentru conexiuni JSON-RPC pe <port> (implicit:8332 sau testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Se acceptă comenzi din linia de comandă și comenzi JSON-RPC</translation> </message> @@ -2360,10 +2300,6 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Cifruri acceptabile (implicit: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Atasati adresei date si ascultati totdeauna pe ea. Folositi [host]:port notatia pentru IPv6</translation> </message> @@ -2384,10 +2320,6 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com <translation>Aceasta este o versiune de test preliminara - va asumati riscul folosind-o - nu folositi pentru minerit sau aplicatiile comerciantilor.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Utilizare proxy SOCKS5 separat pentru a ajunge la servicii ascunse TOR (implicit: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Atentie: setarea -paytxfee este foarte ridicata! Aceasta este taxa tranzactiei pe care o vei plati daca trimiti o tranzactie.</translation> </message> @@ -2460,66 +2392,10 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com <translation>Eroare: Portofel blocat, nu se poate crea o tranzacție!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Eroare: eroare de sistem:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Am esuat ascultarea pe orice port. Folositi -listen=0 daca vreti asta.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Citirea informațiilor despre bloc a eșuat</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Citirea blocului a eșuat</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>A eșuat sincronizarea indexului de blocuri</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>A eșuat scrierea indexului de blocuri</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Scrierea informațiilor despre bloc a eșuat</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Scrierea blocului a eșuat</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Nu a reușit scrierea informației în fișier</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Eșuarea scrierii în baza de date de monede</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Nu a reușit scrierea indexului de tranzacție</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Esuare in scrierea datelor anulate</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Pornire fortata a modului safe mode (prestabilit: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generează monede (implicit: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Cate block-uri se verifica la initializare (implicit: 288, 0=toate)</translation> - </message> - <message> <source>Incorrect or no genesis block found. Wrong datadir for network?</source> <translation>Incorect sau nici un bloc de Geneza găsite. Directorul de retea greşit?</translation> </message> @@ -2540,10 +2416,6 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com <translation>Setaţi dimensiunea maximă a unui block în bytes (implicit: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Stabileste numarul de thread-uri care servesc apeluri RPC (implicit: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Specifică fișierul wallet (în dosarul de date)</translation> </message> @@ -2592,42 +2464,14 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com <translation>Suma invalida pentru -mintxfee=<suma>: '%s'</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Păstrează un index complet al tranzacțiilor (implicit: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Tampon maxim pentru recepție per conexiune, <n>*1000 baiți (implicit: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Tampon maxim pentru transmitere per conexiune, <n>*1000 baiți (implicit: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Se accepta decat lantul de block care se potriveste punctului de control implementat (implicit: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Efectuează conexiuni doar către nodurile din rețeaua <net> (IPv4, IPv6 sau Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Publica bloc la pornire daca exista in index-ul de blocuri. </translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Publicare arbore blocuri la pornire (prestabilit: 0)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Trimite informațiile trace/debug la consolă în locul fișierului debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Setează mărimea minimă a blocului în baiți (implicit: 0)</translation> - </message> - <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> <translation>Micsorati fisierul debug.log la inceperea clientului (implicit: 1 cand nu -debug)</translation> </message> @@ -2636,14 +2480,6 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com <translation>Semnarea tranzacției a eșuat</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Specifică intervalul maxim de conectare în milisecunde (implicit: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Eroare de sistem:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Suma tranzacționată este prea mică</translation> </message> @@ -2656,10 +2492,6 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com <translation>Tranzacția este prea mare</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Foloseste UPnP pentru a vedea porturile (initial: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Foloseste UPnP pentru a vedea porturile (initial: 1 cand listezi)</translation> </message> @@ -2696,10 +2528,6 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com <translation>Actualizează portofelul la ultimul format</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Setează mărimea bazinului de chei la <n> (implicit: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Rescanează lanțul de bloc pentru tranzacțiile portofel lipsă</translation> </message> @@ -2708,14 +2536,6 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com <translation>Folosește OpenSSL (https) pentru conexiunile JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Certificatul serverului (implicit: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Cheia privată a serverului (implicit: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Acest mesaj de ajutor</translation> </message> diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts index d6a145928c..fa66297779 100644 --- a/src/qt/locale/bitcoin_ru.ts +++ b/src/qt/locale/bitcoin_ru.ts @@ -1,4 +1,4 @@ -<TS language="ru" version="2.1"> +<TS language="ru" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -264,7 +264,7 @@ </message> <message> <source>&Options...</source> - <translation>Опции</translation> + <translation>&Параметры</translation> </message> <message> <source>&Encrypt Wallet...</source> @@ -387,10 +387,6 @@ <translation>Панель вкладок</translation> </message> <message> - <source>[testnet]</source> - <translation>[тестовая сеть]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Core</translation> </message> @@ -416,11 +412,11 @@ </message> <message> <source>&Command-line options</source> - <translation>&Опции командной строки</translation> + <translation>&Пармаетры командной строки</translation> </message> <message> <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> - <translation>Показать помощь по Bitcoin Core и получить список доступных опций командной строки.</translation> + <translation>Показать помощь по Bitcoin Core и получить список доступных параметров командной строки.</translation> </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> @@ -430,10 +426,6 @@ <source>No block source available...</source> <translation>Источник блоков недоступен...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Обработано %1 блоков истории транзакций.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n час</numerusform><numerusform>%n часа</numerusform><numerusform>%n часов</numerusform></translation> @@ -482,6 +474,10 @@ <source>Up to date</source> <translation>Синхронизировано</translation> </message> + <message numerus="yes"> + <source>Processed %n blocks of transaction history.</source> + <translation><numerusform>Обработан %n блок истории транзакций.</numerusform><numerusform>Обработано %n блока истории транзакций.</numerusform><numerusform>Обработано %n блоков истории транзакций.</numerusform></translation> + </message> <message> <source>Catching up...</source> <translation>Синхронизируется...</translation> @@ -525,10 +521,6 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Выбор адреса контроля монет</translation> - </message> - <message> <source>Quantity:</source> <translation>Количество:</translation> </message> @@ -577,8 +569,12 @@ Address: %4 <translation>Сумма</translation> </message> <message> - <source>Address</source> - <translation>Адрес</translation> + <source>Received with label</source> + <translation>Получено с пометкой</translation> + </message> + <message> + <source>Received with address</source> + <translation>Получено с адреса</translation> </message> <message> <source>Date</source> @@ -847,11 +843,11 @@ Address: %4 </message> <message> <source>command-line options</source> - <translation>опции командной строки</translation> + <translation>параметры командной строки</translation> </message> <message> <source>UI options</source> - <translation>Опции интерфейса</translation> + <translation>Настройки интерфейса</translation> </message> <message> <source>Set language, for example "de_DE" (default: system locale)</source> @@ -912,13 +908,13 @@ Address: %4 <source>Error</source> <translation>Ошибка</translation> </message> - <message> - <source>GB of free space available</source> - <translation>ГБ свободного места доступно</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%nГБ свободного места доступно</numerusform><numerusform>%nГБ свободного места доступно</numerusform><numerusform>%nГБ свободного места доступно</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(из необходимых %1ГБ)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(из необходимых %nГБ)</numerusform><numerusform>(из необходимых %nГБ)</numerusform><numerusform>(из необходимых %nГБ)</numerusform></translation> </message> </context> <context> @@ -948,21 +944,13 @@ Address: %4 <name>OptionsDialog</name> <message> <source>Options</source> - <translation>Опции</translation> + <translation>Параметры</translation> </message> <message> <source>&Main</source> <translation>&Главная</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Необязательная комиссия за каждый КБ транзакции, которая ускоряет обработку Ваших транзакций. Большинство транзакций занимают 1КБ.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Заплатить ко&миссию</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Автоматически запускать Bitcoin после входа в систему</translation> </message> @@ -991,14 +979,6 @@ Address: %4 <translation>Разрешить входящие подключения</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Подключаться к сети Bitcoin через прокси SOCKS.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Подключаться через SOCKS прокси (прокси по умолчанию):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>IP-адрес прокси (например IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1016,11 +996,11 @@ Address: %4 </message> <message> <source>Reset all client options to default.</source> - <translation>Сбросить все опции клиента на значения по умолчанию.</translation> + <translation>Сбросить все настройки клиента на значения по умолчанию.</translation> </message> <message> <source>&Reset Options</source> - <translation>&Сбросить опции</translation> + <translation>&Сбросить параметры</translation> </message> <message> <source>&Network</source> @@ -1059,6 +1039,14 @@ Address: %4 <translation>Пробросить порт через &UPnP</translation> </message> <message> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation>Подключаться к сети Bitcoin через прокси SOCKS5</translation> + </message> + <message> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation>&Подключаться к сети Bitcoin через прокси SOCKS5 (прокси по умолчанию):</translation> + </message> + <message> <source>Proxy &IP:</source> <translation>&IP Прокси: </translation> </message> @@ -1132,7 +1120,7 @@ Address: %4 </message> <message> <source>Confirm options reset</source> - <translation>Подтвердите сброс опций</translation> + <translation>Подтвердите сброс параметров</translation> </message> <message> <source>Client restart required to activate changes.</source> @@ -1162,10 +1150,6 @@ Address: %4 <translation>Отображаемая информация может быть устаревшей. Ваш бумажник автоматически синхронизируется с сетью Bitcoin после подключения, но этот процесс пока не завершён.</translation> </message> <message> - <source>Wallet</source> - <translation>Бумажник</translation> - </message> - <message> <source>Watch-only:</source> <translation>Только наблюдение:</translation> </message> @@ -1194,6 +1178,10 @@ Address: %4 <translation>Баланс добытых монет, который ещё не созрел</translation> </message> <message> + <source>Balances</source> + <translation>Балансы</translation> + </message> + <message> <source>Total:</source> <translation>Итого:</translation> </message> @@ -1206,6 +1194,14 @@ Address: %4 <translation>Ваш текущий баланс в адресах наблюдения</translation> </message> <message> + <source>Spendable:</source> + <translation>Доступно:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Последние транзакции</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>Неподтверждённые транзакции на адреса наблюдения</translation> </message> @@ -1218,10 +1214,6 @@ Address: %4 <translation>Текущий общий баланс на адресах наблюдения</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Недавние транзакции</b></translation> - </message> - <message> <source>out of sync</source> <translation>не синхронизировано</translation> </message> @@ -1481,10 +1473,6 @@ Address: %4 <translation>Сервисы</translation> </message> <message> - <source>Sync Node</source> - <translation>Узел синхронизации</translation> - </message> - <message> <source>Starting Height</source> <translation>Начальная высота</translation> </message> @@ -1613,14 +1601,6 @@ Address: %4 <translation>Исходящие</translation> </message> <message> - <source>Yes</source> - <translation>Да</translation> - </message> - <message> - <source>No</source> - <translation>Нет</translation> - </message> - <message> <source>Unknown</source> <translation>Неизвестно</translation> </message> @@ -1857,6 +1837,54 @@ Address: %4 <translation>Свой адрес для сдачи</translation> </message> <message> + <source>Transaction Fee:</source> + <translation>Комиссия</translation> + </message> + <message> + <source>Choose...</source> + <translation>Выберите...</translation> + </message> + <message> + <source>Minimize</source> + <translation>Сворачивать</translation> + </message> + <message> + <source>per kilobyte</source> + <translation>за килобайт</translation> + </message> + <message> + <source>total at least</source> + <translation>Итого</translation> + </message> + <message> + <source>Recommended:</source> + <translation>Рекомендовано:</translation> + </message> + <message> + <source>Custom:</source> + <translation>Выборочно:</translation> + </message> + <message> + <source>Confirmation time:</source> + <translation>Время подтверждения:</translation> + </message> + <message> + <source>normal</source> + <translation>обычный</translation> + </message> + <message> + <source>fast</source> + <translation>ускоренный</translation> + </message> + <message> + <source>Send as zero-fee transaction if possible</source> + <translation>Осуществить транзакцию бесплатно, если возможно</translation> + </message> + <message> + <source>(confirmation may take longer)</source> + <translation>(подтверждение может занять больше времени)</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Отправить нескольким получателям одновременно</translation> </message> @@ -1961,6 +1989,14 @@ Address: %4 <translation>Транзакция была отклонена! Такое может произойти, если некоторые монеты уже были потрачены, например, если Вы используете одну копию бумажника (wallet.dat), а монеты были потрачены из другой копии, но не были отмечены как потраченные в этой.</translation> </message> <message> + <source>A fee higher than %1 is considered an insanely high fee.</source> + <translation>Комиссия больше, чем %1, считается невероятно большой.</translation> + </message> + <message> + <source>Estimated to begin confirmation within %1 block(s).</source> + <translation>Ожидается начать подтверждение через %1 блок(ов).</translation> + </message> + <message> <source>Warning: Invalid Bitcoin address</source> <translation>Внимание: неверный адрес Bitcoin</translation> </message> @@ -2465,6 +2501,10 @@ Address: %4 <translation>Добыто</translation> </message> <message> + <source>watch-only</source> + <translation>только наблюдение</translation> + </message> + <message> <source>(n/a)</source> <translation>[не доступно]</translation> </message> @@ -2481,6 +2521,10 @@ Address: %4 <translation>Тип транзакции.</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Использовался ли в транзакции адрес для наблюдения.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>Адрес назначения транзакции.</translation> </message> @@ -2576,6 +2620,10 @@ Address: %4 <translation>Экспортировать историю транзакций</translation> </message> <message> + <source>Watch-only</source> + <translation>Для наблюдения</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Экспорт не удался</translation> </message> @@ -2688,29 +2736,13 @@ Address: %4 <name>bitcoin-core</name> <message> <source>Options:</source> - <translation>Опции:</translation> - </message> - <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Указать конфигурационный файл (по умолчанию: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Задать pid-файл (по умолчанию: bitcoin.pid)</translation> + <translation>Параметры:</translation> </message> <message> <source>Specify data directory</source> <translation>Задать каталог данных</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Принимать входящие подключения на <port> (по умолчанию: 8333 или 18333 в тестовой сети)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Поддерживать не более <n> подключений к участникам (по умолчанию: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Подключиться к участнику, чтобы получить список адресов других участников и отключиться</translation> </message> @@ -2719,18 +2751,6 @@ Address: %4 <translation>Укажите ваш собственный публичный адрес</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Порог для отключения неправильно ведущих себя участников (по умолчанию: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Число секунд блокирования неправильно ведущих себя участников (по умолчанию: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Прослушивать подключения JSON-RPC на <порту> (по умолчанию: 8332 или для testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Принимать командную строку и команды JSON-RPC</translation> </message> @@ -2771,18 +2791,10 @@ rpcpassword=%s </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Разрешённые алгоритмы(по умолчанию: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Привязаться к указанному адресу и всегда прослушивать только его. Используйте [хост]:порт для IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Ограничить скорость передачи бесплатных транзакций до <n>*1000 байт в минуту (по умолчанию: 15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>Удалить все транзакции бумажника с возможностью восстановить эти части цепи блоков с помощью -rescan при запуске</translation> </message> @@ -2803,14 +2815,6 @@ rpcpassword=%s <translation>Выполнить команду, когда меняется транзакция в бумажнике (%s в команде заменяется на TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Сбрасывать активность базы данных из памяти на диск каждые <n> мегабайт (по умолчанию: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Насколько тщательна проверка контрольных блоков -checkblocks (0-4, по умолчанию: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>В этом режиме -genproclimit определяет, сколько блоков генерируется немедленно.</translation> </message> @@ -2819,10 +2823,6 @@ rpcpassword=%s <translation>Задать число потоков проверки скрипта (от %u до %d, 0=авто, <0 = оставить столько ядер свободными, по умолчанию: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Задать лимит процессора, когда генерация работает (-1 = безлимитно, по умолчанию: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Это пре-релизная тестовая сборка - используйте на свой страх и риск - не используйте для добычи или торговых приложений</translation> </message> @@ -2831,10 +2831,6 @@ rpcpassword=%s <translation>Не удалось забиндиться на %s на этом компьютере. Возможно, Bitcoin Core уже запущен.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Использовать отдельный прокси SOCKS5 для соединения с участниками через скрытые сервисы Tor (по умолчанию: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Внимание: установлено очень большое значение -paytxfee. Это комиссия, которую вы заплатите при проведении транзакции.</translation> </message> @@ -2855,12 +2851,12 @@ rpcpassword=%s <translation>Внимание: wallet.dat повреждён, данные спасены! Оригинальный wallet.dat сохранён как wallet.{timestamp}.bak в %s; если ваш баланс или транзакции некорректны, вы должны восстановить файл из резервной копии.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(по умолчанию: 1)</translation> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Вносить в белый список участников, подключающихся с указанной маски сети или IP. Можно использовать многократно.</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(по умолчанию: wallet.dat)</translation> + <source>(default: 1)</source> + <translation>(по умолчанию: 1)</translation> </message> <message> <source><category> can be:</source> @@ -2891,10 +2887,6 @@ rpcpassword=%s <translation>Параметры отладки/тестирования:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Отключить безопасный режим, отклонить реальное событие безопасного режима (по умолчанию: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Определить свой IP (по умолчанию: 1 при прослушивании и если не используется -externalip)</translation> </message> @@ -2923,6 +2915,10 @@ rpcpassword=%s <translation>Не удалось открыть БД блоков</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Ошибка: произошла неустранимая ошибка, детали в debug.log</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Ошибка: мало места на диске!</translation> </message> @@ -2931,66 +2927,10 @@ rpcpassword=%s <translation>Ошибка: бумажник заблокирован, невозможно создать транзакцию!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Ошибка: системная ошибка:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Не удалось начать прослушивание на порту. Используйте -listen=0 если вас это устраивает.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Не удалось прочитать информацию блока</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Не удалось прочитать блок</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Не удалось синхронизировать индекс блоков</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Не удалось записать индекс блоков</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Не удалось записать информацию блока</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Не удалось записать блок</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Не удалось записать информацию файла</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Не удалось записать БД монет</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Не удалось записать индекс транзакций</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Не удалось записать данные для отмены</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Принудительный безопасный режим (по умолчанию: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Включить добычу монет (по умолчанию: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Сколько блоков проверять при запуске (по умолчанию: 288, 0 = все)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Если <category> не предоставлена, выводить всю отладочную информацию.</translation> </message> @@ -3011,8 +2951,8 @@ rpcpassword=%s <translation>Недостаточно файловых дескрипторов.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Дописывать отметки времени к отладочному выводу (по умолчанию: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Соединяться только по сети <net> (ipv4, ipv6 или onion)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3027,26 +2967,18 @@ rpcpassword=%s <translation>Задать максимальный размер блока в байтах (по умолчанию: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Задать число потоков выполнения(по умолчанию: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Укажите файл бумажника (внутри каталога данных)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Тратить неподтвержденную сдачу при отправке транзакций (по умолчанию: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Остановиться после импорта блоков с диска (по умолчанию: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Это рассчитано на инструменты регрессионного тестирования и разработку приложений.</translation> </message> <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Использовать UPnP для проброса порта (по умолчанию: %u)</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Проверка блоков...</translation> </message> @@ -3060,7 +2992,7 @@ rpcpassword=%s </message> <message> <source>Wallet options:</source> - <translation>Опции бумажника:</translation> + <translation>Настройки бумажника:</translation> </message> <message> <source>You need to rebuild the database using -reindex to change -txindex</source> @@ -3071,10 +3003,6 @@ rpcpassword=%s <translation>Импортировать блоки из внешнего файла blk000??.dat</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(по умолчанию: 1, 1 = сохранять метаданные транзакции, например, владельца аккаунта и информацию запроса платежа, 2 = отбросить метаданные)</translation> - </message> - <message> <source>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</source> <translation>Разрешить подключения JSON-RPC с указанного источника. Разрешённые значения для <ip> — отдельный IP (например, 1.2.3.4), сеть/маска сети (например, 1.2.3.4/255.255.255.0) или сеть/CIDR (например, 1.2.3.4/24). Эту опцию можно использовать многократно</translation> </message> @@ -3095,12 +3023,12 @@ rpcpassword=%s <translation>Не удалось установить блокировку на каталог данных %s. Возможно, Bitcoin Core уже запущен.</translation> </message> <message> - <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> - <translation>Создавать новые файлы с системными правами по умолчанию вместо umask 077 (эффективно только при отключенном бумажнике)</translation> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Ограничить скорость передачи бесплатных транзакций до <n>*1000 байт в минуту (по умолчанию: %u)</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>Распространяется под лицензией MIT/X11, см. приложенный файл COPYING или <http://www.opensource.org/licenses/mit-license.php>.</translation> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Создавать новые файлы с системными правами по умолчанию вместо umask 077 (эффективно только при отключенном бумажнике)</translation> </message> <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> @@ -3111,10 +3039,6 @@ rpcpassword=%s <translation>Ошибка: обнаружен неподдерживаемый аргумент -socks. Выбор версии SOCKS более невозможен, поддерживаются только прокси SOCKS5.</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Выполнить команду, когда транзакция из сети повторно тратит вход транзакции в бумажнике (%s=TxID транзакции сети, %t=TxID транзакции в бумажнике)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Выполнить команду, когда приходит соответствующее сообщение о тревоге или наблюдается очень длинное расщепление цепи (%s в команде заменяется на сообщение)</translation> </message> @@ -3127,12 +3051,8 @@ rpcpassword=%s <translation>Комиссии (в BTC/Кб) меньшие этого значения считаются нулевыми для создания транзакции (по умолчанию: %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>Если paytxfee не задан, включить достаточную комиссию для подтверждения транзакции в среднем за n блоков (по умолчанию: 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Выводить отладочную информацию (по умолчанию: 0, указание <category> необязательно)</translation> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation>Наибольший размер данных в носителе данных транзакций, которые мы передаем и генерируем (по умолчанию: %u)</translation> </message> <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> @@ -3143,6 +3063,10 @@ rpcpassword=%s <translation>Задать максимальный размер высокоприоритетных/низкокомиссионных транзакций в байтах (по умолчанию: %d)</translation> </message> <message> + <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source> + <translation>Задать число потоков генерации монет, если включена (-1 = число ядер процессора, по умолчанию: %d)</translation> + </message> + <message> <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> <translation>Этот продукт включает ПО, разработанное OpenSSL Project для использования в OpenSSL Toolkit <https://www.openssl.org/> и криптографическое ПО, написанное Eric Young и ПО для работы с UPnP, написанное Thomas Bernard.</translation> </message> @@ -3151,18 +3075,10 @@ rpcpassword=%s <translation>Внимание: убедитесь, что дата и время на Вашем компьютере выставлены верно. Если Ваши часы идут неправильно, Bitcoin Core будет работать некорректно.</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>Вносить в белый список участников, подключающихся с указанной маски сети или ip. Можно использовать многократно.</translation> - </message> - <message> <source>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</source> <translation>Участники из белого списка не могуть быть забанены за DoS, и их транзакции всегда транслируются, даже если они уже содержатся в памяти. Полезно, например, для шлюза.</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>Всегда запрашивать адреса участников с помощью DNS (по умолчанию: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>Не удаётся разрешить адрес в параметре -whitebind: '%s'</translation> </message> @@ -3191,10 +3107,6 @@ rpcpassword=%s <translation>Комиссия (в BTC/Кб) для добавления к вашим транзакциям (по умолчанию: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Включать IP-адреса в отладочный вывод (по умолчанию: 0)</translation> - </message> - <message> <source>Information</source> <translation>Информация</translation> </message> @@ -3223,24 +3135,8 @@ rpcpassword=%s <translation>Хранить максимум <n> несоединённых блоков в памяти (по умолчанию: %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Ограничить размер кэша подписей <n> записями (по умолчанию: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Записывать в лог приоритет транзакции и комиссию на килобайт во время добычи блоков (по умолчанию: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Держать полный индекс транзакций (по умолчанию: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Максимальный размер буфера приёма на соединение, <n>*1000 байт (по умолчанию: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Максимальный размер буфера отправки на соединение, <n>*1000 байт (по умолчанию: 1000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Держать в памяти до <n> несвязных транзакций (по умолчанию: %u)</translation> </message> <message> <source>Need to specify a port with -whitebind: '%s'</source> @@ -3251,22 +3147,10 @@ rpcpassword=%s <translation>Параметры трансляции узла:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Принимать цепь блоков, только если она соответствует встроенным контрольным точкам (по умолчанию: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Подключаться только к узлам из сети <net> (IPv4, IPv6 или Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Печатать блок при запуске, если он найден в индексе блоков</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Печатать дерево блоков при запуске (по умолчанию: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Параметры RPC SSL: (см. Bitcoin вики для инструкций по настройке SSL)</translation> </message> @@ -3283,28 +3167,12 @@ rpcpassword=%s <translation>Случайно разбрасывать 1 из каждых <n> сетевых сообщений</translation> </message> <message> - <source>Relay and mine data carrier transactions (default: 1)</source> - <translation>Транслировать и генерировать транзакции носители данных (по умолчанию: 1)</translation> - </message> - <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>Транслировать не-P2SH мультиподпись (по умолчанию: 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Запустить поток для периодического сохранения бумажника (по умолчанию: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Выводить информацию трассировки/отладки на консоль вместо файла debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Минимальный размер блока в байтах (по умолчанию: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Установить флаг DB_PRIVATE в окружении базы данных бумажника (по умолчанию: 1)</translation> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Осуществить транзакцию бесплатно, если возможно (по умолчанию: %u)</translation> </message> <message> <source>Show all debugging options (usage: --help -help-debug)</source> @@ -3319,14 +3187,6 @@ rpcpassword=%s <translation>Не удалось подписать транзакцию</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Тайм-аут соединения в миллисекундах (по умолчанию: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Системная ошибка:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Это экспериментальное ПО.</translation> </message> @@ -3347,10 +3207,6 @@ rpcpassword=%s <translation>Невозможно привязаться к %s на этом компьютере (bind вернул ошибку %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Использовать UPnP для проброса порта (по умолчанию: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Использовать UPnP для проброса порта (по умолчанию: 1, если используется прослушивание)</translation> </message> @@ -3403,10 +3259,6 @@ rpcpassword=%s <translation>Обновить бумажник до последнего формата</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Установить размер запаса ключей в <n> (по умолчанию: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Перепроверить цепь блоков на предмет отсутствующих в бумажнике транзакций</translation> </message> @@ -3415,14 +3267,6 @@ rpcpassword=%s <translation>Использовать OpenSSL (https) для подключений JSON-RPC</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Файл серверного сертификата (по умолчанию: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Приватный ключ сервера (по умолчанию: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Эта справка</translation> </message> @@ -3439,14 +3283,174 @@ rpcpassword=%s <translation>Ошибка загрузки wallet.dat: Бумажник поврежден</translation> </message> <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = сохранять метаданные транзакции: например, владельца аккаунта и информацию запроса платежа; 2 = отбросить метаданные)</translation> + </message> + <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Сбрасывать активность базы данных из памяти на диск каждые <n> мегабайт (по умолчанию: %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>Насколько тщательна проверка контрольных блоков -checkblocks (0-4, по умолчанию: %u)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source> + <translation>Если paytxfee не задан, включить достаточную комиссию для подтверждения транзакции в среднем за n блоков (по умолчанию: %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Записывать в лог приоритет транзакции и комиссию на килобайт во время добычи блоков (по умолчанию: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Держать полный индекс транзакций, используемый RPC-запросом getrawtransaction (по умолчанию: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Число секунд блокирования неправильно ведущих себя узлов (по умолчанию: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Выводить отладочную информацию (по умолчанию: %u, указание <category> необязательно)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Использовать отдельный прокси SOCKS5 для соединения с участниками через скрытые сервисы Tor (по умолчанию: %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(по умолчанию: %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Допустимые шифры (по умолчанию: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Всегда запрашивать адреса участников с помощью DNS (по умолчанию: %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Отключить безопасный режим, отклонить реальное событие безопасного режима (по умолчанию: %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>Ошибка при загрузке wallet.dat</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Принудительный безопасный режим (по умолчанию: %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Включить добычу монет (по умолчанию: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Сколько блоков проверять при запуске (по умолчанию: %u, 0 = все)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Включить IP-адреса в отладочный вывод (по умолчанию: %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Неверный адрес -proxy: '%s'</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>Ограничить размер кэша подписей <n> записями (по умолчанию: %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>Прослушивать подключения JSON-RPC на <порту> (по умолчанию: %u или %u в тестовой сети)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Принимать входящие подключения на <port> (по умолчанию: %u или %u в тестовой сети)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Поддерживать не более <n> подключений к узлам (по умолчанию: %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Максимальный размер буфера приёма на соединение, <n>*1000 байт (по умолчанию: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Максимальный размер буфера отправки на соединение, <n>*1000 байт (по умолчанию: %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>Принимать цепь блоков, лишь если она соответствует встроенным контрольным точкам (по умолчанию: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Дописывать отметки времени к отладочному выводу (по умолчанию: %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Печатать дерево блоков при запуске (по умолчанию: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Транслировать и генерировать транзакции носителей данных (по умолчанию: %u)</translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>Транслировать не-P2SH мультиподпись (по умолчанию: %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Запустить поток для периодического сохранения бумажника (по умолчанию: %u)</translation> + </message> + <message> + <source>Server certificate file (default: %s)</source> + <translation>Файл сертификата сервера (по умолчанию: %s)</translation> + </message> + <message> + <source>Server private key (default: %s)</source> + <translation>Закрытый ключ сервера (по умолчанию: %s)</translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Установить размер пула ключей в <n> (по умолчанию: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Задать число потоков выполнения запросов RPC (по умолчанию: %d)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>Установить флаг DB_PRIVATE в окружении базы данных бумажника (по умолчанию: %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Указать конфигурационный файл (по умолчанию: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Указать тайм-аут соединения в миллисекундах (минимум: 1, по умолчанию: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Указать pid-файл (по умолчанию: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Тратить неподтвержденную сдачу при отправке транзакций (по умолчанию: %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Остановиться после импорта блоков с диска (по умолчанию: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Порог для отключения неправильно ведущих себя узлов (по умолчанию: %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>В параметре -onlynet указана неизвестная сеть: '%s'</translation> </message> diff --git a/src/qt/locale/bitcoin_sah.ts b/src/qt/locale/bitcoin_sah.ts index a951e10ab9..84b973bf92 100644 --- a/src/qt/locale/bitcoin_sah.ts +++ b/src/qt/locale/bitcoin_sah.ts @@ -1,4 +1,4 @@ -<TS language="sah" version="2.1"> +<TS language="sah" version="2.0"> <context> <name>AddressBookPage</name> <message> diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts index 793cbfa377..fe7c62cd60 100644 --- a/src/qt/locale/bitcoin_sk.ts +++ b/src/qt/locale/bitcoin_sk.ts @@ -1,4 +1,4 @@ -<TS language="sk" version="2.1"> +<TS language="sk" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -93,7 +93,11 @@ <source>Exporting Failed</source> <translation>Export zlyhal</translation> </message> - </context> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>Nastala chyba pri pokuse uložiť zoznam adries do %1. Skúste znovu.</translation> + </message> +</context> <context> <name>AddressTableModel</name> <message> @@ -180,6 +184,10 @@ <translation>Peňaženka zašifrovaná</translation> </message> <message> + <source>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>.</source> + <translation>Zadajte nové heslo k peňaženke.<br/>Prosím použite heslo s dĺžkou aspoň <b>10 alebo viac náhodných znakov</b>, alebo <b>8 alebo viac slov</b>.</translation> + </message> + <message> <source>Bitcoin 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.</source> <translation>Bitcoin sa teraz ukončí pre dokončenie procesu šifrovania. Pamätaj že šifrovanie peňaženky Ťa nemôže úplne ochrániť pred kráďežou bitcoinov pomocou škodlivého software.</translation> </message> @@ -287,6 +295,10 @@ <translation>Otvoriť &URI...</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>Bitcoin Core klient</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>Importujem bloky z disku...</translation> </message> @@ -339,6 +351,10 @@ <translation>&Prijať</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation>Zobraziť informácie o Bitcoin Core</translation> + </message> + <message> <source>&Show / Hide</source> <translation>Zobraziť / skryť</translation> </message> @@ -375,10 +391,6 @@ <translation>Lišta záložiek</translation> </message> <message> - <source>[testnet]</source> - <translation>[testovacia sieť]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Jadro Bitcoin</translation> </message> @@ -410,18 +422,34 @@ <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> <translation>Zobraziť pomocnú správu od Bitcoin Jadra pre získanie zoznamu dostupných možností príkazového riadku</translation> </message> + <message numerus="yes"> + <source>%n active connection(s) to Bitcoin network</source> + <translation><numerusform>%n aktívne pripojenie do siete Bitcoin</numerusform><numerusform>%n aktívne pripojenia do siete Bitcoin</numerusform><numerusform>%n aktívnych pripojení do siete Bitcoin</numerusform></translation> + </message> <message> <source>No block source available...</source> <translation>Nedostupný zdroj blokov...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Spracovaných %1 blokov transakčnej histórie.</translation> + <message numerus="yes"> + <source>%n hour(s)</source> + <translation><numerusform>%n hodina</numerusform><numerusform>%n hodiny</numerusform><numerusform>%n hodín</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n day(s)</source> + <translation><numerusform>%n deň</numerusform><numerusform>%n dni</numerusform><numerusform>%n dní</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n týždeň</numerusform><numerusform>%n týždne</numerusform><numerusform>%n týždňov</numerusform></translation> </message> <message> <source>%1 and %2</source> <translation> %1 a %2</translation> </message> + <message numerus="yes"> + <source>%n year(s)</source> + <translation><numerusform>%n rok</numerusform><numerusform>%n roky</numerusform><numerusform>%n rokov</numerusform></translation> + </message> <message> <source>%1 behind</source> <translation>%1 pozadu</translation> @@ -492,10 +520,6 @@ Adresa: %4</translation> <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Coin Control výber adresy</translation> - </message> - <message> <source>Quantity:</source> <translation>Množstvo:</translation> </message> @@ -540,10 +564,6 @@ Adresa: %4</translation> <translation>Suma</translation> </message> <message> - <source>Address</source> - <translation>Adresa</translation> - </message> - <message> <source>Date</source> <translation>Dátum</translation> </message> @@ -863,15 +883,7 @@ Adresa: %4</translation> <source>Error</source> <translation>Chyba</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB dostupného voľného miesta</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(z %1GB potrebných)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -906,14 +918,6 @@ Adresa: %4</translation> <translation>&Hlavné</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Voliteľný transakčný poplatok za kB ktorý pomôže rýchlemu spracovaniu transakcie. Väčšina transakcií má 1 kB. Poplatok 0.01 je odporúčaný.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Zaplatiť transakčné &poplatky</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Automaticky spustiť Bitcoin po zapnutí počítača</translation> </message> @@ -934,14 +938,6 @@ Adresa: %4</translation> <translation>Počet skript overujucich vlákien</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Pripojiť k Bitcoin sieti cez SOCKS proxy.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>Pripojiť sa cez SOCKS proxy (predvolené proxy)</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>IP adresy proxy (napr. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1105,10 +1101,6 @@ Adresa: %4</translation> <translation>Zobrazené informácie môžu byť neaktuápne. Vaša peňaženka sa automaticky synchronizuje so sieťou Bitcoin po nadviazaní spojenia ale tento proces ešte nieje ukončený.</translation> </message> <message> - <source>Wallet</source> - <translation>Peňaženka</translation> - </message> - <message> <source>Available:</source> <translation>Disponibilné:</translation> </message> @@ -1141,10 +1133,6 @@ Adresa: %4</translation> <translation>Váš súčasný celkový zostatok</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Nedávne transakcie</b></translation> - </message> - <message> <source>out of sync</source> <translation>nesynchronizované</translation> </message> @@ -2390,26 +2378,10 @@ Adresa: %4</translation> <translation>Možnosti:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Určiť súbor s nastaveniami (predvolené: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Určiť súbor pid (predvolené: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Určiť priečinok s dátami</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Načúvať spojeniam na <port> (prednastavené: 8333 alebo testovacia sieť: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Udržiavať maximálne <n> spojení (predvolené: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Pripojiť sa k nóde, získať adresy ďaľších počítačov v sieti a odpojit sa.</translation> </message> @@ -2418,18 +2390,6 @@ Adresa: %4</translation> <translation>Určite vašu vlastnú verejnú adresu</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Hranica pre odpojenie zle sa správajúcich peerov (predvolené: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Počet sekúnd kedy sa zabráni zle sa správajúcim peerom znovupripojenie (predvolené: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Počúvať JSON-RPC spojeniam na <port> (predvolené: 8332 or testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Prijímať príkazy z príkazového riadku a JSON-RPC</translation> </message> @@ -2470,18 +2430,10 @@ napríklad: alertnotify=echo %%s | mail -s "Bitcoin Výstraha" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Prijateľlné šifry (prednastavené: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Spojiť s danou adresou a vždy na nej počúvať. Použite zápis [host]:port pre IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Priebežne obmedzuj transakcie bez poplatku na <n>*1000 bajtov za minútu (prednastavené: 15)</translation> - </message> - <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Vojsť do režimu regresného testovania, ktorý používa špeciálnu reťaz v ktorej môžu byť bloky v okamihu vyriešené.</translation> </message> @@ -2498,14 +2450,6 @@ napríklad: alertnotify=echo %%s | mail -s "Bitcoin Výstraha" admin@foo.com <translation>Vykonaj príkaz keď sa zmení transakcia peňaženky (%s v príkaze je nahradená TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Odložiť aktivitu databázy spoločnej pamäti do logu na disku každých <n> megabajtov (prednastavené: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Ako dôkladne sú overované bloky -checkblocks (0-4, prednastavené: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>V tomto režime -getproclimit kontroluje koľko blokov sa vytvorí okamžite.</translation> </message> @@ -2514,10 +2458,6 @@ napríklad: alertnotify=echo %%s | mail -s "Bitcoin Výstraha" admin@foo.com <translation>Nastaviť počeť vlákien overujúcich skripty (%u až %d, 0 = auto, <0 = nechať toľkoto jadier voľných, prednastavené: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Nastaviť obmedzenie pre procesor keď je zapnuté generovanie (-1 = bez obmedzenia, prednastavené: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Toto je pred-testovacia verzia - použitie je na vlastné riziko - nepoužívajte na tvorbu bitcoin ani obchodovanie.</translation> </message> @@ -2526,10 +2466,6 @@ napríklad: alertnotify=echo %%s | mail -s "Bitcoin Výstraha" admin@foo.com <translation>Nepodarilo sa pripojiť na %s na tomto počítači. Bitcoin Jadro je už pravdepodobne spustené.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Použite rozdielne SOCKS5 proxy pre dosiahnutie peer-ov cez Tor skryté služby (prednastavené: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Varovanie: -paytxfee je nastavené veľmi vysoko. Toto sú transakčné poplatky ktoré zaplatíte ak odošlete transakciu.</translation> </message> @@ -2556,10 +2492,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>(predvolené: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(predvolené: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> môže byť:</translation> </message> @@ -2588,10 +2520,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Možnosti ladenia/testovania:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Vypnúť bezpečný režim, vypnúť udalosť skutočný bezpečný režim (prednastavené: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Zisti vlastnú IP adresu (predvolené: 1 pri počúvaní/listening a žiadnej -externalip)</translation> </message> @@ -2628,66 +2556,10 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Chyba: Peňaženka je zamknutá, nemôžem vytvoriť transakciu!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Chyba: systémová chyba:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Chyba počúvania na ktoromkoľvek porte. Použi -listen=0 ak toto chcete.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Zlyhalo čítanie info o bloku</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Zlyhalo čítanie bloku</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Zlyhalo synchronizovanie zoznamu blokov</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Zlyhalo zapisovanie do zoznamu blokov</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Zlyhal zápis info o bloku</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Zlyhal zápis bloku</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Zlyhalo zapisovanie informácié o súbore</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Zlyhalo zapisovanie do databázy coins</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Zlyhal zápis zoznamu transakcií</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Zlyhalo zapisovanie </translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Vnútiť bezpečný režim (prenastavené: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Vytvárať mince (predvolené: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Koľko blokov skontrolovať pri spustení (predvolené: 288, 0 = všetky)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Ak nie je uvedená <category>, na výstupe zobrazuj všetky informácie pre ladenie.</translation> </message> @@ -2708,10 +2580,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Nedostatok kľúčových slov súboru.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Na začiatok logu pre ladenie vlož dátum a čas (prednastavené: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>Znovu vytvoriť zoznam blokov zo súčasných blk000??.dat súborov</translation> </message> @@ -2724,18 +2592,10 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Nastaviť najväčšiu veľkosť bloku v bytoch (predvolené: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Nastaviť množstvo vlákien na obsluhu RPC volaní (predvolené: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Označ súbor peňaženky (v priečinku s dátami)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Míňať nepotvrdený výdavok pri odosielaní (prednastavené: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Toto je mienené nástrojom pre regresné testovania a vývoj programu.</translation> </message> @@ -2772,10 +2632,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Vykonať príkaz keď po prijatí patričné varovanie alebo vidíme veľmi dlhé rozdvojenie siete (%s v cmd je nahradené správou)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Výstup informácií pre ladenie (prednastavené: 0, uvádzanie <category> je voliteľné)</translation> - </message> - <message> <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> <translation>Nastaviť najväčšiu veľkosť vysoká-dôležitosť/nízke-poplatky transakcií v bajtoch (prednastavené: %d)</translation> </message> @@ -2792,42 +2648,10 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Neplatná suma pre -mintxfee=<amount>: '%s'</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Obmedziť veľkosť pomocnej pamäti pre podpisy na <n> vstupov (prednastavené: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Zaznamenávať dôležitosť transakcií a poplatky za kB ak hľadáme bloky (prednastavené: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Udržiavaj úplný zoznam transakcií (prednastavené: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maximálna veľkosť prijímacieho zásobníka pre jedno spojenie, <n>*1000 bytov (predvolené: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maximálna veľkosť vysielacieho zásobníka pre jedno spojenie, <n>*1000 bytov (predvolené: 1000)</translation> - </message> - <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Akceptuj iba kontrolné body zhodné s blockchain (prednastavené: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Pripájať sa len k nódam v sieti <net> (IPv4, IPv6 alebo Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Vytlač blok pri spustení, ak nájdený v zozname blokov</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Vytlačiť strom blokov pri spustení (prednastavené: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>Možnosti RPC SSL: (Pozri v Bitcoin Wiki pokyny pre SSL nastavenie)</translation> </message> @@ -2844,22 +2668,10 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Náhodne premiešaj 1 z každých <n> sieťových správ</translation> </message> <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Mať spustené vlákno pravidelného čístenia peňaženky (predvolené: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Odoslať trace/debug informácie na konzolu namiesto debug.info žurnálu</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Nastaviť minimálnu veľkosť bloku v bytoch (predvolené: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Nastaví DB_PRIVATE možnosť v db prostredí peňaženky (prednastavené: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>Zobraziť všetky možnosti ladenia (použitie: --help --help-debug)</translation> </message> @@ -2872,14 +2684,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Podpísanie správy zlyhalo</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Určiť aut spojenia v milisekundách (predvolené: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Systémová chyba:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Suma transakcie príliš malá</translation> </message> @@ -2892,10 +2696,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Transakcia príliš veľká</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Skúsiť použiť UPnP pre mapovanie počúvajúceho portu (default: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Skúsiť použiť UPnP pre mapovanie počúvajúceho portu (default: 1 when listening)</translation> </message> @@ -2936,10 +2736,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Aktualizuj peňaženku na najnovší formát.</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Nastaviť zásobu adries na <n> (predvolené: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Znovu skenovať reťaz blokov pre chýbajúce transakcie</translation> </message> @@ -2948,14 +2744,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin <translation>Použiť OpenSSL (https) pre JSON-RPC spojenia</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Súbor s certifikátom servra (predvolené: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Súkromný kľúč servra (predvolené: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Táto pomocná správa</translation> </message> diff --git a/src/qt/locale/bitcoin_sl_SI.ts b/src/qt/locale/bitcoin_sl_SI.ts index f615d31343..60fc4a93e5 100644 --- a/src/qt/locale/bitcoin_sl_SI.ts +++ b/src/qt/locale/bitcoin_sl_SI.ts @@ -1,4 +1,4 @@ -<TS language="sl_SI" version="2.1"> +<TS language="sl_SI" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -331,6 +331,10 @@ <translation>&Sprejmi</translation> </message> <message> + <source>Show information about Bitcoin Core</source> + <translation>Pokaži informacije o Bitcoin Core</translation> + </message> + <message> <source>&Show / Hide</source> <translation>&Prikaži / Skrij</translation> </message> @@ -363,10 +367,6 @@ <translation>Orodna vrstica zavihkov</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Jedro Bitcoina</translation> </message> @@ -402,6 +402,10 @@ <source>%n week(s)</source> <translation><numerusform>%n teden</numerusform><numerusform>%n tedna</numerusform><numerusform>%n tedni</numerusform><numerusform>%n tednov</numerusform></translation> </message> + <message> + <source>%1 and %2</source> + <translation>%1 in %2</translation> + </message> <message numerus="yes"> <source>%n year(s)</source> <translation><numerusform>%n leto</numerusform><numerusform>%n leti</numerusform><numerusform>%n leta</numerusform><numerusform>%n let</numerusform></translation> @@ -501,12 +505,20 @@ Naslov: %4 <translation>Sprememba:</translation> </message> <message> - <source>Amount</source> - <translation>Količina</translation> + <source>(un)select all</source> + <translation>(ne)izberi vse</translation> </message> <message> - <source>Address</source> - <translation>Naslov</translation> + <source>Tree mode</source> + <translation>Drevo</translation> + </message> + <message> + <source>List mode</source> + <translation>Seznam</translation> + </message> + <message> + <source>Amount</source> + <translation>Količina</translation> </message> <message> <source>Date</source> @@ -541,6 +553,14 @@ Naslov: %4 <translation>Kopiraj ID transakcije</translation> </message> <message> + <source>Lock unspent</source> + <translation>Zakleni neporabljeno</translation> + </message> + <message> + <source>Unlock unspent</source> + <translation>Odkleni neporabljeno</translation> + </message> + <message> <source>Copy quantity</source> <translation>Kopiraj količino</translation> </message> @@ -557,6 +577,14 @@ Naslov: %4 <translation>Kopiraj prednostno mesto</translation> </message> <message> + <source>Copy dust</source> + <translation>Kopiraj prah</translation> + </message> + <message> + <source>Copy change</source> + <translation>Kopiraj drobiž</translation> + </message> + <message> <source>highest</source> <translation>najvišja</translation> </message> @@ -597,6 +625,14 @@ Naslov: %4 <translation>(%1 zaklenjeno)</translation> </message> <message> + <source>none</source> + <translation>Nič</translation> + </message> + <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>Se lahko razlikuje +/- %1 satošijev na vnos.</translation> + </message> + <message> <source>yes</source> <translation>da</translation> </message> @@ -609,10 +645,30 @@ Naslov: %4 <translation>V primeru, da je velikost transakcije večja od 1000 bitov, se ta oznaka se obarva rdeče.</translation> </message> <message> + <source>Can vary +/- 1 byte per input.</source> + <translation>Se lahko razlikuje +/- 1 byte na vnos.</translation> + </message> + <message> + <source>Transactions with higher priority are more likely to get included into a block.</source> + <translation>Transakcije z višjo prioriteto imajo boljše možnosti za vključitev v blok.</translation> + </message> + <message> + <source>This label turns red, if the priority is smaller than "medium".</source> + <translation>Oznaka se obarva rdeče, kadar je prioriteta manjša od "srednje".</translation> + </message> + <message> <source>(no label)</source> <translation>(ni oznake)</translation> </message> - </context> + <message> + <source>change from %1 (%2)</source> + <translation>drobiž od %1 (%2)</translation> + </message> + <message> + <source>(change)</source> + <translation>(drobiž)</translation> + </message> +</context> <context> <name>EditAddressDialog</name> <message> @@ -628,6 +684,10 @@ Naslov: %4 <translation>Oznaka je povezana s tem vnosom seznama naslovov</translation> </message> <message> + <source>The address associated with this address list entry. This can only be modified for sending addresses.</source> + <translation>Naslov povezan s tem vnosom seznama naslovov. Sprememba je mogoča le za naslove namenjene pošiljanju.</translation> + </message> + <message> <source>&Address</source> <translation>&Naslov</translation> </message> @@ -663,10 +723,26 @@ Naslov: %4 <context> <name>FreespaceChecker</name> <message> + <source>A new data directory will be created.</source> + <translation>Ustvarjena bo nova mapa za shranjevanje podatkov.</translation> + </message> + <message> <source>name</source> <translation>ime</translation> </message> - </context> + <message> + <source>Directory already exists. Add %1 if you intend to create a new directory here.</source> + <translation>Mapa že obstaja. Dodaj %1, če tu želiš ustvariti novo mapo.</translation> + </message> + <message> + <source>Path already exists, and is not a directory.</source> + <translation>Pot že obstaja, vendar ni mapa.</translation> + </message> + <message> + <source>Cannot create data directory here.</source> + <translation>Na tem mestu ne moreš ustvariti nove mape.</translation> + </message> +</context> <context> <name>HelpMessageDialog</name> <message> @@ -678,6 +754,10 @@ Naslov: %4 <translation>različica</translation> </message> <message> + <source>(%1-bit)</source> + <translation>(%1-bit)</translation> + </message> + <message> <source>About Bitcoin Core</source> <translation>O jedru Bitcoina</translation> </message> @@ -705,7 +785,19 @@ Naslov: %4 <source>Start minimized</source> <translation>Zaženi pomanjšano</translation> </message> - </context> + <message> + <source>Set SSL root certificates for payment request (default: -system-)</source> + <translation>Nastavi korenske SSL certifikate za plačilni zahtevek (privzeto: -system-)</translation> + </message> + <message> + <source>Show splash screen on startup (default: 1)</source> + <translation>Ob zagonu prikaži uvodni zaslon (privzeto: 1)</translation> + </message> + <message> + <source>Choose data directory on startup (default: 0)</source> + <translation>Ob zagonu izberi mapo za shranjevanje podatkov (privzeto: 0)</translation> + </message> +</context> <context> <name>Intro</name> <message> @@ -717,16 +809,32 @@ Naslov: %4 <translation>Dobrodošli v jedru Bitcoina</translation> </message> <message> + <source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source> + <translation>Program poganjaš prvič. Izberi kje bo Bitcoin Core shranjeval svoje podatke.</translation> + </message> + <message> + <source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source> + <translation>Bitcoin Core bo prenesel in shranil kopijo Bitcoin verige blokov. V izbrano mapo bo shranjenih vsaj %1 GB podatkov, ta količina pa bo sčasoma še naraščala. Denarnica bo prav tako shranjena v to mapo.</translation> + </message> + <message> + <source>Use the default data directory</source> + <translation>Uporabi privzeto mapo za shranjevanje podatkov.</translation> + </message> + <message> + <source>Use a custom data directory:</source> + <translation>Uporabi to mapo za shranjevanje podatkov:</translation> + </message> + <message> <source>Bitcoin Core</source> <translation>Jedro Bitcoina</translation> </message> <message> - <source>Error</source> - <translation>Napaka</translation> + <source>Error: Specified data directory "%1" cannot be created.</source> + <translation>Napaka: Ne morem ustvariti mape "%1".</translation> </message> <message> - <source>GB of free space available</source> - <translation>GB prostora na voljo</translation> + <source>Error</source> + <translation>Napaka</translation> </message> </context> <context> @@ -743,7 +851,15 @@ Naslov: %4 <source>URI:</source> <translation>URI:</translation> </message> - </context> + <message> + <source>Select payment request file</source> + <translation>Izberi datoteko plačilnega zahtevka</translation> + </message> + <message> + <source>Select payment request file to open</source> + <translation>Izberi datoteko plačilnega zahtevka</translation> + </message> +</context> <context> <name>OptionsDialog</name> <message> @@ -755,10 +871,6 @@ Naslov: %4 <translation>&Glavno</translation> </message> <message> - <source>Pay transaction &fee</source> - <translation>Nakazilo plačila & provizija</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Po prijavi v sistem samodejno zaženite Bitcoin.</translation> </message> @@ -767,10 +879,30 @@ Naslov: %4 <translation>&Zaženi Bitcoin ob prijavi v sistem</translation> </message> <message> + <source>Size of &database cache</source> + <translation>Velikost lokalne zbirke &podatkovne baze</translation> + </message> + <message> <source>MB</source> <translation>megabite</translation> </message> <message> + <source>Accept connections from outside</source> + <translation>Sprejmi povezave od zunaj</translation> + </message> + <message> + <source>Allow incoming connections</source> + <translation>Dovoli prihajajoče povezave</translation> + </message> + <message> + <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> + <translation>IP naslov proxy strežnika (npr. IPv4: 127.0.0.1 ali IPv6: ::1)</translation> + </message> + <message> + <source>&Reset Options</source> + <translation>&Opcije resetiranja</translation> + </message> + <message> <source>&Network</source> <translation>&Omrežje</translation> </message> @@ -783,6 +915,10 @@ Naslov: %4 <translation>Poznavalec</translation> </message> <message> + <source>Enable coin &control features</source> + <translation>Omogoči Coin & Control funkcijo</translation> + </message> + <message> <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source> <translation>Avtomatično odpri vrata Bitcoin odjemalca na usmerjevalniku. To deluje samo, če vaš usmerjevalnik podpira UPnP in je omogočen.</translation> </message> @@ -850,6 +986,10 @@ Naslov: %4 <source>default</source> <translation>privzeto</translation> </message> + <message> + <source>none</source> + <translation>Nič</translation> + </message> </context> <context> <name>OverviewPage</name> @@ -862,8 +1002,8 @@ Naslov: %4 <translation>Prikazanim podatkom je lahko potekel rok. Vaša denarnica bo po vzpostavitvi povezave samodejno sinhronizirana z Bitcoin omrežjem, ampak ta proces še ni bil zaključen.</translation> </message> <message> - <source>Wallet</source> - <translation>Denarnica</translation> + <source>Watch-only:</source> + <translation>Samo gledanje</translation> </message> <message> <source>Available:</source> @@ -886,10 +1026,6 @@ Naslov: %4 <translation>Vaše trenutno skupno stanje</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Nedavne transakcije</></translation> - </message> - <message> <source>out of sync</source> <translation>iz sinhronizacije</translation> </message> @@ -1105,14 +1241,6 @@ Naslov: %4 <translation>nikoli</translation> </message> <message> - <source>Yes</source> - <translation>Da</translation> - </message> - <message> - <source>No</source> - <translation>Ne</translation> - </message> - <message> <source>Unknown</source> <translation>Neznano</translation> </message> @@ -1349,6 +1477,10 @@ Naslov: %4 <translation>Kopiraj prednostno mesto</translation> </message> <message> + <source>Copy change</source> + <translation>Kopiraj drobiž</translation> + </message> + <message> <source>or</source> <translation>ali</translation> </message> @@ -1373,6 +1505,10 @@ Naslov: %4 <translation>(ni oznake)</translation> </message> <message> + <source>Copy dust</source> + <translation>Kopiraj prah</translation> + </message> + <message> <source>Are you sure you want to send?</source> <translation>Ali ste prepričani, da želite poslati?</translation> </message> @@ -1923,26 +2059,10 @@ Naslov: %4 <translation>Možnosti:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Določi datoteko z nastavitvami (privzeta: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Določi pid datoteko (privzeta: bitcoin.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Določi podatkovni imenik</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Sprejmi povezave na <port> (privzeta vrata: 8333 ali testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Obdrži maksimalno število <n> povezav (privzeto: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Povežite se z vozliščem za pridobitev naslovov uporabnikov in nato prekinite povezavo.</translation> </message> @@ -1951,14 +2071,6 @@ Naslov: %4 <translation>Določite vaš lasten javni naslov</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Prag za prekinitev povezav s slabimi odjemalci (privzeto: 1000)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Število sekund za težavo pri vzpostavitvi povezave med uporabniki (privzeto: 86400)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Sprejmi ukaze iz ukazne vrstice in JSON-RPC</translation> </message> @@ -1987,10 +2099,6 @@ Naslov: %4 <translation>To je pred izdana poizkusna verzija - uporaba na lastno odgovornost - ne uporabljajte je za rudarstvo ali trgovske aplikacije</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Za doseg soležnikov preko Tor skritih storitev uporabi ločen SOCKS5 proxy (privzeto: -proxy)</translation> - </message> - <message> <source>Warning: error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source> <translation>Opozorilo: napaka pri branju wallet.dat! Vsi ključi so bili pravilno prebrani, podatki o transakciji ali imenik vnešenih naslovov so morda izgubljeni ali nepravilni.</translation> </message> @@ -1999,12 +2107,8 @@ Naslov: %4 <translation>(privzeto: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(privzeto: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> - <translation><kategorija> je lahko:</translation> + <translation><category> je lahko:</translation> </message> <message> <source>Block creation options:</source> @@ -2019,22 +2123,6 @@ Naslov: %4 <translation>Opozorilo: Denarnica je zaklenjena, ni mogoče opraviti transkacijo! </translation> </message> <message> - <source>Error: system error: </source> - <translation>Napaka: sistemska napaka:</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Zapisovanje informacij o datoteki neuspešno</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Neuspešno zapisovanje na bazi podatkov kovancev</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Ustvari kovance (privzeto: 0)</translation> - </message> - <message> <source>Importing...</source> <translation>Uvažam...</translation> </message> @@ -2051,10 +2139,6 @@ Naslov: %4 <translation>Podpisovanje transakcije spodletelo</translation> </message> <message> - <source>System error: </source> - <translation>Sistemska napaka:</translation> - </message> - <message> <source>Transaction amount too small</source> <translation>Količina transakcije je pramajhna</translation> </message> @@ -2095,10 +2179,6 @@ Naslov: %4 <translation>Posodobi denarnico v najnovejši zapis</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Nastavi velikost ključa bazena na <n> (privzeto: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Ponovno preglej verigo blokov za manjkajoče transakcije denarnice</translation> </message> @@ -2107,14 +2187,6 @@ Naslov: %4 <translation>Uporabi OpenSSL (https) za JSON-RPC povezave</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Datoteka potrdila strežnika (privzeta: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Zasebni ključ strežnika (privzet: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>To sporočilo pomoči</translation> </message> diff --git a/src/qt/locale/bitcoin_sq.ts b/src/qt/locale/bitcoin_sq.ts index f779e391c0..7e63f239ca 100644 --- a/src/qt/locale/bitcoin_sq.ts +++ b/src/qt/locale/bitcoin_sq.ts @@ -1,4 +1,4 @@ -<TS language="sq" version="2.1"> +<TS language="sq" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -163,10 +163,6 @@ <translation>Shiriti i mjeteve</translation> </message> <message> - <source>[testnet]</source> - <translation>[testo rrjetin]</translation> - </message> - <message> <source>Up to date</source> <translation>I azhornuar</translation> </message> @@ -201,10 +197,6 @@ <translation>Sasia</translation> </message> <message> - <source>Address</source> - <translation>Adresë</translation> - </message> - <message> <source>Date</source> <translation>Data</translation> </message> @@ -281,10 +273,6 @@ <source>Form</source> <translation>Formilarë</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Transaksionet e fundit</b></translation> - </message> </context> <context> <name>PaymentServer</name> diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts index f5723efece..64c68a2226 100644 --- a/src/qt/locale/bitcoin_sr.ts +++ b/src/qt/locale/bitcoin_sr.ts @@ -1,4 +1,4 @@ -<TS language="sr" version="2.1"> +<TS language="sr" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -219,10 +219,6 @@ <translation>Трака са картицама</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Up to date</source> <translation>Ажурно</translation> </message> @@ -269,10 +265,6 @@ Address: %4 <translation>iznos</translation> </message> <message> - <source>Address</source> - <translation>Адреса</translation> - </message> - <message> <source>Date</source> <translation>datum</translation> </message> @@ -330,6 +322,10 @@ Address: %4 <translation>верзија</translation> </message> <message> + <source>About Bitcoin Core</source> + <translation>O Bitcoin Coru</translation> + </message> + <message> <source>Usage:</source> <translation>Korišćenje:</translation> </message> @@ -361,14 +357,6 @@ Address: %4 <source>Form</source> <translation>Форма</translation> </message> - <message> - <source>Wallet</source> - <translation>новчаник</translation> - </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>Недавне трансакције</b></translation> - </message> </context> <context> <name>PaymentServer</name> @@ -763,27 +751,10 @@ Address: %4 <translation>Opcije</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Potvrdi željeni konfiguracioni fajl (podrazumevani:bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Konkretizuj pid fajl (podrazumevani: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Gde je konkretni data direktorijum </translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Slušaj konekcije na <port> (default: 8333 or testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Održavaj najviše <n> konekcija po priključku (default: 125) -</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Prihvati komandnu liniju i JSON-RPC komande</translation> </message> @@ -804,10 +775,6 @@ Address: %4 <translation>Lozinka za JSON-RPC konekcije</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Odredi veličinu zaštićenih ključeva na <n> (default: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Ponovo skeniraj lanac blokova za nedostajuće transakcije iz novčanika</translation> </message> @@ -816,10 +783,6 @@ Address: %4 <translation>Koristi OpenSSL (https) za JSON-RPC konekcije</translation> </message> <message> - <source>Server private key (default: server.pem)</source> - <translation>privatni ključ za Server (podrazumevan: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Ova poruka Pomoći</translation> </message> diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts index 8e771c5ce7..551f6976cf 100644 --- a/src/qt/locale/bitcoin_sv.ts +++ b/src/qt/locale/bitcoin_sv.ts @@ -1,4 +1,4 @@ -<TS language="sv" version="2.1"> +<TS language="sv" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -392,10 +392,6 @@ Var vänlig och försök igen.</translation> <translation>Verktygsfält för Tabbar</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Kärna</translation> </message> @@ -435,10 +431,6 @@ Var vänlig och försök igen.</translation> <source>No block source available...</source> <translation>Ingen block-källa tillgänglig...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Bearbetat %1 block i transaktionshistoriken.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n timme</numerusform><numerusform>%n timmar</numerusform></translation> @@ -487,6 +479,10 @@ Var vänlig och försök igen.</translation> <source>Up to date</source> <translation>Uppdaterad</translation> </message> + <message numerus="yes"> + <source>Processed %n blocks of transaction history.</source> + <translation><numerusform>Bearbetat %n block av transaktionshistoriken.</numerusform><numerusform>Bearbetat %n block av transaktionshistoriken.</numerusform></translation> + </message> <message> <source>Catching up...</source> <translation>Hämtar senaste...</translation> @@ -530,8 +526,8 @@ Adress: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Adressval för myntkontroll</translation> + <source>Coin Selection</source> + <translation>Myntval</translation> </message> <message> <source>Quantity:</source> @@ -582,8 +578,12 @@ Adress: %4 <translation>Mängd</translation> </message> <message> - <source>Address</source> - <translation>Adress</translation> + <source>Received with label</source> + <translation>Mottagen med etikett</translation> + </message> + <message> + <source>Received with address</source> + <translation>Mottagen med adress</translation> </message> <message> <source>Date</source> @@ -913,13 +913,13 @@ Adress: %4 <source>Error</source> <translation>Fel</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB ledigt utrymme är tillgängligt</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB fritt utrymme kvar</numerusform><numerusform>%n GB fritt utrymme kvar</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(av %1GB behövs)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(av %n GB behövs)</numerusform><numerusform>(av %n GB behövs)</numerusform></translation> </message> </context> <context> @@ -956,14 +956,6 @@ Adress: %4 <translation>&Allmänt</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Valfri transaktionsavgift per kB som ser till att dina transaktioner behandlas snabbt. De flesta transaktioner är 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Betala överförings&avgift</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Starta Bitcoin automatiskt efter inloggning.</translation> </message> @@ -992,14 +984,6 @@ Adress: %4 <translation>Acceptera inkommande anslutningar</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Anslut till Bitcoin-nätverket genom en SOCKS-proxy.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>&Anslut genom SOCKS-proxy (förvald proxy):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Proxyns IP-adress (t.ex. IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1060,6 +1044,14 @@ Adress: %4 <translation>Tilldela port med hjälp av &UPnP</translation> </message> <message> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation>Anslut till Bitcoin-nätverket genom en SOCKS5-proxy.</translation> + </message> + <message> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation>&Anslut genom SOCKS5-proxy (förvald proxy):</translation> + </message> + <message> <source>Proxy &IP:</source> <translation>Proxy-&IP: </translation> </message> @@ -1163,10 +1155,6 @@ Adress: %4 <translation>Den visade informationen kan vara inaktuell. Plånboken synkroniseras automatiskt med Bitcoin-nätverket efter att anslutningen är upprättad, men denna process har inte slutförts ännu.</translation> </message> <message> - <source>Wallet</source> - <translation>Plånbok</translation> - </message> - <message> <source>Watch-only:</source> <translation>Granska-bara:</translation> </message> @@ -1195,6 +1183,10 @@ Adress: %4 <translation>Den genererade balansen som ännu inte har mognat</translation> </message> <message> + <source>Balances</source> + <translation>Balanser</translation> + </message> + <message> <source>Total:</source> <translation>Totalt:</translation> </message> @@ -1207,6 +1199,14 @@ Adress: %4 <translation>Ditt nuvarande saldo i granska-bara adresser</translation> </message> <message> + <source>Spendable:</source> + <translation>Spenderbar:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Nyligen genomförda transaktioner</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>Okonfirmerade transaktioner till granska-bara adresser</translation> </message> @@ -1219,10 +1219,6 @@ Adress: %4 <translation>Nuvarande total balans i granska-bara adresser</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Nyligen genomförda transaktioner</b></translation> - </message> - <message> <source>out of sync</source> <translation>osynkroniserad</translation> </message> @@ -1482,10 +1478,6 @@ Adress: %4 <translation>Tjänster</translation> </message> <message> - <source>Sync Node</source> - <translation>Syncnod</translation> - </message> - <message> <source>Starting Height</source> <translation>Starthöjd</translation> </message> @@ -1614,14 +1606,6 @@ Adress: %4 <translation>Utgående</translation> </message> <message> - <source>Yes</source> - <translation>Ja</translation> - </message> - <message> - <source>No</source> - <translation>Nej</translation> - </message> - <message> <source>Unknown</source> <translation>Okänd</translation> </message> @@ -1854,6 +1838,78 @@ Adress: %4 <translation>Specialväxeladress</translation> </message> <message> + <source>Transaction Fee:</source> + <translation>Transaktionsavgift:</translation> + </message> + <message> + <source>Choose...</source> + <translation>Välj...</translation> + </message> + <message> + <source>collapse fee-settings</source> + <translation>Fäll ihop avgiftsinställningarna</translation> + </message> + <message> + <source>Minimize</source> + <translation>Minimera</translation> + </message> + <message> + <source>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 "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source> + <translation>Om den anpassad avgiften är satt till 1000 satoshi och transaktionen bara är 250 byte, betalar "per kilobyte" bara 250 satoshi i avgift, medans "minst" betalar 1000 satoshi. För transaktioner större än en kilobyte betalar både per kilobyte.</translation> + </message> + <message> + <source>per kilobyte</source> + <translation>per kilobyte</translation> + </message> + <message> + <source>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.</source> + <translation>Om den anpassad avgiften är satt till 1000 satoshi och transaktionen bara är 250 byte, betalar "per kilobyte" bara 250 satoshi i avgift, medans "totalt minst" betalar 1000 satoshi. För transaktioner större än en kilobyte betalar både per kilobyte.</translation> + </message> + <message> + <source>total at least</source> + <translation>totalt minst</translation> + </message> + <message> + <source>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.</source> + <translation>Att betala endast den minsta avgiften är bara bra så länge det är mindre transaktionsvolym än utrymme i blocken. Men tänk på att det kan hamna i en aldrig bekräftar transaktion när det finns mer efterfrågan på bitcoin transaktioner än nätverket kan bearbeta.</translation> + </message> + <message> + <source>(read the tooltip)</source> + <translation>(läs verktygstips)</translation> + </message> + <message> + <source>Recommended:</source> + <translation>Rekommenderad:</translation> + </message> + <message> + <source>Custom:</source> + <translation>Anpassad:</translation> + </message> + <message> + <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source> + <translation>(Smartavgiften är inte initierad än. Detta tar vanligen några block...)</translation> + </message> + <message> + <source>Confirmation time:</source> + <translation>Bekräftelsetid:</translation> + </message> + <message> + <source>normal</source> + <translation>normal</translation> + </message> + <message> + <source>fast</source> + <translation>snabb</translation> + </message> + <message> + <source>Send as zero-fee transaction if possible</source> + <translation>Sänd som nollavgiftstransaktion om möjligt</translation> + </message> + <message> + <source>(confirmation may take longer)</source> + <translation>(bekräftelse kan ta längre tid)</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Skicka till flera mottagare samtidigt</translation> </message> @@ -1958,6 +2014,18 @@ Adress: %4 <translation>Transaktionen avslogs! Detta kan hända om några av mynten i plånboken redan spenderats, t.ex om du använt en kopia av wallet.dat och mynt spenderades i kopian men inte markerats som spenderade här.</translation> </message> <message> + <source>A fee higher than %1 is considered an insanely high fee.</source> + <translation>En avgift högre än %1 anses som en onormalt hög avgift.</translation> + </message> + <message> + <source>Pay only the minimum fee of %1</source> + <translation>Betala endast den minimala avgiften på %1</translation> + </message> + <message> + <source>Estimated to begin confirmation within %1 block(s).</source> + <translation>Bekräftelsen beräknas börja inom %1 block.</translation> + </message> + <message> <source>Warning: Invalid Bitcoin address</source> <translation>Varning: Felaktig Bitcoinadress</translation> </message> @@ -2466,6 +2534,10 @@ Adress: %4 <translation>Genererade</translation> </message> <message> + <source>watch-only</source> + <translation>granska-bara</translation> + </message> + <message> <source>(n/a)</source> <translation>(n/a)</translation> </message> @@ -2482,6 +2554,10 @@ Adress: %4 <translation>Transaktionstyp.</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Anger om granska-bara--adresser är involverade i denna transaktion.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>Transaktionens destinationsadress.</translation> </message> @@ -2577,6 +2653,10 @@ Adress: %4 <translation>Exportera Transaktionshistoriken</translation> </message> <message> + <source>Watch-only</source> + <translation>Granska-bara</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Exporteringen misslyckades</translation> </message> @@ -2692,26 +2772,10 @@ Adress: %4 <translation>Inställningar:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Ange konfigurationsfil (förvalt: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Ange pid fil (förvalt: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Ange katalog för data</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Lyssna efter anslutningar på <port> (förvalt: 8333 eller testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Ha som mest <n> anslutningar till andra klienter (förvalt: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Anslut till en nod för att hämta klientadresser, och koppla från</translation> </message> @@ -2720,18 +2784,6 @@ Adress: %4 <translation>Ange din egen publika adress</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Tröskelvärde för att koppla ifrån klienter som missköter sig (förvalt: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Antal sekunder att hindra klienter som missköter sig från att ansluta (förvalt: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Lyssna på JSON-RPC-anslutningar på <port> (förvalt: 8332 eller testnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Tillåt kommandon från kommandotolken och JSON-RPC-kommandon</translation> </message> @@ -2772,22 +2824,18 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Accepterade krypteringsalgoritmer (förvalt: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Bind till given adress och lyssna alltid på den. Använd [värd]:port notation för IPv6</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Antalsbegränsa kontinuerligt fria transaktioner till <n>*1000 bytes per minut (förvalt:15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>Ta bort alla plånbokstransaktioner och återskapa bara dom som är en del av blockkedjan genom att ange -rescan vid uppstart</translation> </message> <message> + <source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> + <translation>Distribuerad under MIT mjukvarulicens, se den bifogade filen COPYING eller <http://www.opensource.org/licenses/mit-license.php>.</translation> + </message> + <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Ange regressiontestläge, som använder en speciell kedja i vilka block kan lösas omedelbart.</translation> </message> @@ -2804,14 +2852,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Exekvera kommando när en plånbokstransaktion ändras (%s i cmd är ersatt av TxID)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Töm databasens minnespool till disk varje <n> megabytes (förvalt: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>Hur grundlig blockverifikationen vid -checkblocks är (0-4, förvalt: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>I denna mode kontrollerar -genproclimit hur många block som genereras på en gång.</translation> </message> @@ -2820,10 +2860,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Ange antalet skriptkontrolltrådar (%u till %d, 0 = auto, <0 = lämna så många kärnor lediga, förval: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Sätt processorbegränsning när blockgenereringen är på (-1 = obegränsad, förvalt: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Detta är ett förhands testbygge - använd på egen risk - använd inte för mining eller handels applikationer</translation> </message> @@ -2832,10 +2868,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Det går inte att binda till %s på den här datorn. Bitcoin Core är förmodligen redan igång.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Använd separat SOCKS5 proxy för att nå kollegor via dolda tjänster i Tor (default: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Varning: -paytxfee är satt väldigt hög! Detta är avgiften du kommer betala för varje transaktion.</translation> </message> @@ -2856,12 +2888,12 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Varning: wallet.dat korrupt, datan har räddats! Den ursprungliga wallet.dat har sparas som wallet.{timestamp}.bak i %s; om ditt saldo eller transaktioner är felaktiga ska du återställa från en säkerhetskopia.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(förvalt: 1)</translation> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Vitlista klienter som ansluter från angivna nätmasker eller IP-adresser. Kan specificeras flera gånger.</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(förvalt: wallet.dat)</translation> + <source>(default: 1)</source> + <translation>(förvalt: 1)</translation> </message> <message> <source><category> can be:</source> @@ -2892,10 +2924,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Avlusnings/Testnings optioner:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Avaktivera säkert läge. Åsidosätt en riktigt säkert läge händelse (förvalt: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Hitta egen IP-adress (förvalt: 1 under lyssning och utan -externalip)</translation> </message> @@ -2924,6 +2952,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Fel vid öppning av blockdatabasen</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Fel: Ett fatalt internt fel inträffade. Se debug.log för detaljer</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Fel: Hårddiskutrymme är lågt!</translation> </message> @@ -2932,66 +2964,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Fel: Plånboken är låst, det går ej att skapa en transaktion!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Fel: systemfel:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Misslyckades att lyssna på någon port. Använd -listen=0 om du vill detta.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Misslyckades att läsa blockinformation</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Misslyckades att läsa blocket</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Misslyckades att synkronisera blockindex</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Misslyckades att skriva blockindex</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Misslyckades att skriva blockinformation</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Misslyckades att skriva blocket</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Misslyckades att skriva filinformation</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Misslyckades att skriva till myntdatabas</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Misslyckades att skriva transaktionsindex</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Misslyckades att skriva ångradata</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Tvångskör i säkert läge (förvalt: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Generera mynt (förvalt: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Hur många block att kontrollera vid uppstart (standardvärde: 288, 0 = alla)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>Om <category> inte anges, skrivs all avlusningsinformation ut.</translation> </message> @@ -3012,8 +2988,8 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Inte tillräckligt med filbeskrivningar tillgängliga.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Skriv ut tidsstämpel i avlusningsinformationen (förvalt: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Anslut enbart till noder i nätverket <net> (IPv4, IPv6 eller onion)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3028,26 +3004,18 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Sätt maximal blockstorlek i byte (förvalt: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Ange antalet trådar för att hantera RPC anrop (standard: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Ange plånboksfil (inom datakatalogen)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Spendera okonfirmerad växel när transaktioner sänds (förvalt: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Sluta köra efter importen av block från disk är klar (förvalt: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Detta är avsett för regressionstestningsverktyg och applikationsutveckling.</translation> </message> <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Använd UPnP för att mappa den lyssnande porten (förvalt: %u)</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Verifierar block...</translation> </message> @@ -3072,10 +3040,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Importerar block från extern blk000??.dat fil</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(förvalt: 1, 1 = spara tx metadata t.ex. kontoägare och betalningsbegäransinformation, 2 = släng tx metadata)</translation> - </message> - <message> <source>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</source> <translation>Tillåt JSON-RPC anslutningar från specifik kalla. Tillåtet för <ip> är enkel IP (t.ex 1.2.3.4), en nätverk/nätmask (t.ex. 1.2.3.4/255.255.255.0) eller ett nätverk/CIDR (t.ex. 1.2.3.4/24). Denna option kan specificeras flera gånger</translation> </message> @@ -3096,12 +3060,12 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Kan inte låsa data-mappen %s. Bitcoin Core körs förmodligen redan.</translation> </message> <message> - <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> - <translation>Skapa nya filer med systemets förvalda rättigheter, istället för umask 077 (bara effektivt med avaktiverad plånboks funktionalitet)</translation> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Antalsbegränsa kontinuerligt fria transaktioner till <n>*1000 bytes per minut (förvalt:%u)</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>Distribuerad under MIT/X11 mjukvarulicens, se den bifogade filen COPYING eller <http://www.opensource.org/licenses/mit-license.php>.</translation> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Skapa nya filer med systemets förvalda rättigheter, istället för umask 077 (bara effektivt med avaktiverad plånboks funktionalitet)</translation> </message> <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> @@ -3112,10 +3076,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Fel: Argumentet -socks stöds inte. Att sätta SOCKS version är inte möjligt längre. Endast SOCKS5 proxy stöds.</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Kör kommando när en nätverks tx återspenderar plånbokens tx input (%s=återspendera TxID, %t=plånbok TxID)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>Exekvera kommando när ett relevant meddelande är mottagen eller när vi ser en väldigt lång förgrening (%s i cmd är utbytt med ett meddelande)</translation> </message> @@ -3128,12 +3088,8 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Avgifter (i BTC/Kb) mindre än detta betraktas som nollavgift för transaktionsskapande (förvalt: %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>Om paytxfee inte är satt, inkludera tillräcklig avgift så att transaktionen konfirmeras inom n blocks (förvalt: 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Skriv ut avlusningsinformation (förvalt: 0, att ange <category> är frivilligt)</translation> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation>Maximal storlek på data i databärartransaktioner som vi reläar och bryter (förvalt: %u) </translation> </message> <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> @@ -3152,18 +3108,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Varning: Vänligen kolla så att din dators datum och tid är korrekt! Om din klocka går fel kommer Bitcoin Core inte att fungera korrekt.</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>Vitlista klienter som ansluter från angivna nätmasker eller ip adresser. Kan specificeras flera gånger.</translation> - </message> - <message> <source>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</source> <translation>Vitlistade klienter kan inte bli DoS bannade och deras transaktioner reläas alltid, även om dom redan är i mempoolen, användbart för t.ex en gateway </translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>Sök alltid efter klientadresser med DNS sökningen (förvalt: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>Kan inte matcha -whitebind adress: '%s'</translation> </message> @@ -3192,10 +3140,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Avgift (i BTC/Kb) att lägga till på transaktioner du skickar (förvalt: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Inkludera IP-adresser i debugutskrift (förvalt: 0)</translation> - </message> - <message> <source>Information</source> <translation>Information</translation> </message> @@ -3224,24 +3168,8 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Håll som mest <n> oanslutningsbara block i minnet (förvalt: %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>Begränsa signaturcachestorleken till <n> poster (förvalt: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Logga transaktionsprioritet och avgift per kB vid blockbrytning (förvalt: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Upprätthåll ett fullständigt transaktionsindex (förval: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Maximal buffert för mottagning per anslutning, <n>*1000 byte (förvalt: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Maximal buffert för sändning per anslutning, <n>*1000 byte (förvalt: 5000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Håll som mest <n> oanslutningsbara transaktioner i minnet (förvalt: %u)</translation> </message> <message> <source>Need to specify a port with -whitebind: '%s'</source> @@ -3252,22 +3180,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Nodreläoptioner:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Acceptera bara blockkedjans matchande inbyggda kontrollpunkter (förvalt: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Anslut enbart till noder i nätverket <net> (IPv4, IPv6 eller Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Skriv ut block vid uppstart, om det hittas i blockindexet</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Skriv ut blockträdet vid uppstart (förvalt: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL optioner: (se Bitcoin Wiki för SSL inställningsinstruktioner)</translation> </message> @@ -3284,28 +3200,12 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Slupmässigt brus 1 gång varje <n> nätverksmeddelande</translation> </message> <message> - <source>Relay and mine data carrier transactions (default: 1)</source> - <translation>Reläa och bearbeta databärartransaktioner (förvalt: 1) </translation> - </message> - <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>Reläa icke P2SH multisig (förvalt: 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Kör en tråd för att tömma plånboken periodiskt (förvalt: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Skicka trace-/debuginformation till terminalen istället för till debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Sätt minsta blockstorlek i byte (förvalt: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Sätt DB_PRIVATE flaggan i plånbokens databasmiljö (förvalt: 1)</translation> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Sänd transaktioner som nollavgiftstransaktioner om möjligt (förvalt: %u)</translation> </message> <message> <source>Show all debugging options (usage: --help -help-debug)</source> @@ -3320,14 +3220,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Signering av transaktion misslyckades</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Ange timeout för uppkoppling i millisekunder (förvalt: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Systemfel:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Detta är experimentmjukvara.</translation> </message> @@ -3348,10 +3240,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Det går inte att binda till %s på den här datorn (bind returnerade felmeddelande %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Använd UPnP för att mappa den lyssnande porten (förvalt: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Använd UPnP för att mappa den lyssnande porten (förvalt: 1 under lyssning)</translation> </message> @@ -3404,10 +3292,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Uppgradera plånboken till senaste formatet</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Sätt storleken på nyckelpoolen till <n> (förvalt: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Sök i blockkedjan efter saknade plånboks transaktioner</translation> </message> @@ -3416,14 +3300,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Använd OpenSSL (https) för JSON-RPC-anslutningar</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Serverns certifikatfil (förvalt: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Serverns privata nyckel (förvalt: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Det här hjälp medelandet</translation> </message> @@ -3440,14 +3316,178 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Fel vid inläsningen av wallet.dat: Plånboken är skadad</translation> </message> <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = spara tx metadata t.ex. kontoägare och betalningsbegäransinformation, 2 = släng tx metadata)</translation> + </message> + <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Töm databasens minnespool till disk varje <n> megabytes (förvalt: %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>Hur grundlig blockverifikationen vid -checkblocks är (0-4, förvalt: %u)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source> + <translation>Om paytxfee inte är satt, inkludera tillräcklig avgift så att transaktionen konfirmeras inom n blocks (förvalt: %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Logga transaktionsprioritet och avgift per kB vid blockbrytning (förvalt: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Upprätthåll ett fullständigt transaktionsindex, som används av getrawtransaction rpc-anrop (förval: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Antal sekunder att hindra klienter som missköter sig från att ansluta (förvalt: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Skriv ut avlusningsinformation (förvalt: %u, att ange <category> är frivilligt)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Använd separat SOCKS5 proxy för att nå kollegor via dolda tjänster i Tor (förvalt: -%s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(förvalt: %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Accepterbara chiffer (förvalt: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Sök alltid efter klientadresser med DNS sökningen (förvalt: %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Avaktivera säkert läge. Åsidosätt en riktigt säkert läge händelse (förvalt: %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>Fel vid inläsning av plånboksfilen wallet.dat</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Tvångskör i säkert läge (förvalt: %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Generera mynt (förvalt: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Hur många block att kontrollera vid uppstart (förvalt: %u, 0 = alla)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Inkludera IP-adresser i debugutskrift (förvalt: %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Ogiltig -proxy adress: '%s'</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>Begränsa signaturcachestorleken till <n> poster (förvalt: %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>Lyssna på JSON-RPC-anslutningar på <port> (förval: %u eller testnet: %u)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Lyssna efter anslutningar på <port> (förvalt: %u eller testnet: %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Ha som mest <n> anslutningar till andra klienter (förvalt: %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maximal mottagningsbuffert per anslutning, <n>*1000 byte (förvalt: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Maximal sändningsbuffert per anslutning, <n>*1000 byte (förvalt: %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>Acceptera bara blockkedjans matchande inbyggda kontrollpunkter (förvalt: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Skriv ut tidsstämpel i avlusningsinformationen (förvalt: %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Skriv ut blockträdet vid uppstart (förvalt: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Reläa och bearbeta databärartransaktioner (förvalt: %u) </translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>Reläa icke P2SH multisig (förvalt: %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Kör en tråd för att tömma plånboken periodiskt (förvalt: %u)</translation> + </message> + <message> + <source>Server certificate file (default: %s)</source> + <translation>Serverns certifikatfil (förvalt: %s)</translation> + </message> + <message> + <source>Server private key (default: %s)</source> + <translation>Serverns privata nyckel (förvalt: %s)</translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Sätt storleken på nyckelpoolen till <n> (förvalt: %u)</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Sätt minsta blockstorlek i byte (standard: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Ange antalet trådar för att hantera RPC anrop (förvalt: %d)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>Sätt DB_PRIVATE flaggan i plånbokens databasmiljö (förvalt: %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Ange konfigurationsfil (förvalt: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Ange timeout för uppkoppling i millisekunder (minimum:1, förvalt: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Ange pid-fil (förvalt: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Spendera okonfirmerad växel när transaktioner sänds (förvalt: %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Sluta köra efter importen av block från disk är klar (förvalt: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Tröskelvärde för att koppla ifrån klienter som missköter sig (förvalt: %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>Okänt nätverk som anges i -onlynet: '%s'</translation> </message> diff --git a/src/qt/locale/bitcoin_th_TH.ts b/src/qt/locale/bitcoin_th_TH.ts index cb52be61b2..174816aaef 100644 --- a/src/qt/locale/bitcoin_th_TH.ts +++ b/src/qt/locale/bitcoin_th_TH.ts @@ -1,4 +1,4 @@ -<TS language="th_TH" version="2.1"> +<TS language="th_TH" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -162,10 +162,6 @@ <source>Tabs toolbar</source> <translation>แถบเครื่องมือ</translation> </message> - <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n ที่ใช้งานการเชื่อมต่อกับเครือข่าย Bitcoin</numerusform></translation> @@ -201,10 +197,6 @@ <context> <name>CoinControlDialog</name> <message> - <source>Address</source> - <translation>ที่อยู่</translation> - </message> - <message> <source>(no label)</source> <translation>(ไม่มีชื่อ)</translation> </message> @@ -277,10 +269,6 @@ <source>Form</source> <translation>รูป</translation> </message> - <message> - <source><b>Recent transactions</b></source> - <translation><b>รายการทำธุรกรรมล่าสุด</b></translation> - </message> </context> <context> <name>PaymentServer</name> diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts index b2a14c92fc..ab02cc92a6 100644 --- a/src/qt/locale/bitcoin_tr.ts +++ b/src/qt/locale/bitcoin_tr.ts @@ -1,4 +1,4 @@ -<TS language="tr" version="2.1"> +<TS language="tr" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -391,10 +391,6 @@ <translation>Sekme araç çubuğu</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>Bitcoin Çekirdeği</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>Hiçbir blok kaynağı mevcut değil...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Muamele tarihçesinde %1 blok işlendi.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n saat</numerusform><numerusform>%n saat</numerusform></translation> @@ -486,6 +478,10 @@ <source>Up to date</source> <translation>Güncel</translation> </message> + <message numerus="yes"> + <source>Processed %n blocks of transaction history.</source> + <translation><numerusform>Muamele tarihçesinden %n blok işlendi</numerusform><numerusform>Muamele tarihçesinden %n blok işlendi</numerusform></translation> + </message> <message> <source>Catching up...</source> <translation>Aralık kapatılıyor...</translation> @@ -529,8 +525,8 @@ Adres: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>Para kontrolü adres seçimi</translation> + <source>Coin Selection</source> + <translation>Bitcoin Seçimi</translation> </message> <message> <source>Quantity:</source> @@ -581,8 +577,12 @@ Adres: %4 <translation>Meblağ</translation> </message> <message> - <source>Address</source> - <translation>Adres</translation> + <source>Received with label</source> + <translation>Şu etiketle alındı</translation> + </message> + <message> + <source>Received with address</source> + <translation>Şu adresle alındı</translation> </message> <message> <source>Date</source> @@ -916,13 +916,13 @@ Adres: %4 <source>Error</source> <translation>Hata</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB boş alan mevcuttur</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>%n GB boş alan mevcuttur</numerusform><numerusform>%n GB boş alan mevcuttur</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(gereken boyut: %1GB)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(gereken %n GB alandan)</numerusform><numerusform>(gereken %n GB alandan)</numerusform></translation> </message> </context> <context> @@ -959,14 +959,6 @@ Adres: %4 <translation>&Esas ayarlar</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Muamelelerin hızlı işlenmesini garantilemeye yardım eden, seçime dayalı kB başı muamele ücreti. Muamelelerin çoğunluğunun boyutu 1 kB'dir.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Muamele ücreti &öde</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Sistemde oturum açıldığında Bitcoin'i otomatik olarak başlat.</translation> </message> @@ -995,14 +987,6 @@ Adres: %4 <translation>Gelen bağlantılara izin ver</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>Bitcoin şebekesine bir SOCKS vekil sunucusu vasıtasıyla bağlan.</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>SOCKS vekil sunucusuyla &bağlan (varsayılan vekil):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>Vekil sunucusunun IP adresi (mesela IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1063,6 +1047,14 @@ Adres: %4 <translation>Portları &UPnP kullanarak haritala</translation> </message> <message> + <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source> + <translation>Bitcoin şebekesine SOCKS5 vekil sunucusu vasıtasıyla bağlan.</translation> + </message> + <message> + <source>&Connect through SOCKS5 proxy (default proxy):</source> + <translation>SOCKS5 vekil sunucusu vasıtasıyla &bağlan (varsayılan vekil sunucusu):</translation> + </message> + <message> <source>Proxy &IP:</source> <translation>Vekil &İP:</translation> </message> @@ -1166,10 +1158,6 @@ Adres: %4 <translation>Görüntülenen veriler zaman aşımına uğramış olabilir. Bağlantı kurulduğunda cüzdanınız otomatik olarak şebeke ile eşleşir ancak bu işlem henüz tamamlanmamıştır.</translation> </message> <message> - <source>Wallet</source> - <translation>Cüzdan</translation> - </message> - <message> <source>Watch-only:</source> <translation>Sadece-izlenen:</translation> </message> @@ -1198,6 +1186,10 @@ Adres: %4 <translation>Oluşturulan bakiye henüz olgunlaşmamıştır</translation> </message> <message> + <source>Balances</source> + <translation>Bakiyeler</translation> + </message> + <message> <source>Total:</source> <translation>Toplam:</translation> </message> @@ -1210,6 +1202,14 @@ Adres: %4 <translation>Sadece izlenen adreslerdeki güncel bakiyeniz</translation> </message> <message> + <source>Spendable:</source> + <translation>Harcanabilir:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Son muameleler</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>Sadece izlenen adreslere gelen teyit edilmemiş muameleler</translation> </message> @@ -1222,10 +1222,6 @@ Adres: %4 <translation>Sadece izlenen adreslerdeki güncel toplam bakiye</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Son muameleler</b></translation> - </message> - <message> <source>out of sync</source> <translation>eşleşme dışı</translation> </message> @@ -1485,10 +1481,6 @@ Adres: %4 <translation>Servisler</translation> </message> <message> - <source>Sync Node</source> - <translation>Eşleşme Düğümü</translation> - </message> - <message> <source>Starting Height</source> <translation>Başlama Yüksekliği</translation> </message> @@ -1617,14 +1609,6 @@ Adres: %4 <translation>Giden</translation> </message> <message> - <source>Yes</source> - <translation>Evet</translation> - </message> - <message> - <source>No</source> - <translation>Hayır</translation> - </message> - <message> <source>Unknown</source> <translation>Bilinmiyor</translation> </message> @@ -1861,6 +1845,78 @@ Adres: %4 <translation>Özel para üstü adresi</translation> </message> <message> + <source>Transaction Fee:</source> + <translation>Muamele ücreti:</translation> + </message> + <message> + <source>Choose...</source> + <translation>Seç...</translation> + </message> + <message> + <source>collapse fee-settings</source> + <translation>ücret-ayarlarını-küçült</translation> + </message> + <message> + <source>Minimize</source> + <translation>Küçült</translation> + </message> + <message> + <source>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 "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source> + <translation>Eğer özel ücret 1000 satoşi olarak ayarlandıysa ve muamele sadece 250 baytsa, "kilobayt başı" ücret olarak sadece 250 satoşi öder ve "asgari" 1000 satoşi öder. Bir kilobayttan yüksek muameleler için ikisi de kilobayt başı ödeme yapar.</translation> + </message> + <message> + <source>per kilobyte</source> + <translation>kilobayt başı</translation> + </message> + <message> + <source>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.</source> + <translation>Eğer özel ücret 1000 satoşi olarak ayarlandıysa ve muamele sadece 250 baytsa, "kilobayt başı" ücret olarak sadece 250 satoşi öder ve "toplam asgari" 1000 satoşi öder. Bir kilobayttan yüksek muameleler için ikisi de kilobayt başı ödeme yapar.</translation> + </message> + <message> + <source>total at least</source> + <translation>toplam asgari</translation> + </message> + <message> + <source>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.</source> + <translation>Asgari ücreti ödemek, bloklarda boşluktan daha az muamele hacmi olduğu sürece bir sorun çıkarmaz. Fakat şebekenin işleyecebileceğinden daha çok bitcoin muameleleri talebi olduğunda bunun asla teyit edilmeyen bir muamele olabileceğinin farkında olmalısınız.</translation> + </message> + <message> + <source>(read the tooltip)</source> + <translation>(bilgi balonunu oku)</translation> + </message> + <message> + <source>Recommended:</source> + <translation>Tavsiye edilen:</translation> + </message> + <message> + <source>Custom:</source> + <translation>Özel:</translation> + </message> + <message> + <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source> + <translation>(Zeki ücret henüz başlatılmadı. Bu genelde birkaç blok alır...)</translation> + </message> + <message> + <source>Confirmation time:</source> + <translation>Teyit süresi:</translation> + </message> + <message> + <source>normal</source> + <translation>normal</translation> + </message> + <message> + <source>fast</source> + <translation>çabuk</translation> + </message> + <message> + <source>Send as zero-fee transaction if possible</source> + <translation>Mümkünse ücretsiz muamele olarak gönder</translation> + </message> + <message> + <source>(confirmation may take longer)</source> + <translation>(teyit daha uzun süre alabilir)</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Birçok alıcıya aynı anda gönder</translation> </message> @@ -1965,6 +2021,18 @@ Adres: %4 <translation>Muamele reddedildi! Cüzdanınızdaki madenî paraların bazıları zaten harcanmış olduğunda bu meydana gelebilir. Örneğin wallet.dat dosyasının bir kopyasını kullandıysanız ve kopyada para harcandığında ancak burada harcandığı işaretlenmediğinde.</translation> </message> <message> + <source>A fee higher than %1 is considered an insanely high fee.</source> + <translation>%1 tutarından yüksek ücret delicesine aşırı yüksek bir ücret olarak kabul edilir.</translation> + </message> + <message> + <source>Pay only the minimum fee of %1</source> + <translation>Sadece asgari ücret olan %1 tutarını öde</translation> + </message> + <message> + <source>Estimated to begin confirmation within %1 block(s).</source> + <translation>Tahmini olarak %1 blok içinde teyide başlanacaktır.</translation> + </message> + <message> <source>Warning: Invalid Bitcoin address</source> <translation>Uyarı: geçersiz Bitcoin adresi</translation> </message> @@ -2473,6 +2541,10 @@ Adres: %4 <translation>Madenden çıkarılan</translation> </message> <message> + <source>watch-only</source> + <translation>sadece-izlenen</translation> + </message> + <message> <source>(n/a)</source> <translation>(mevcut değil)</translation> </message> @@ -2489,6 +2561,10 @@ Adres: %4 <translation>Muamele türü.</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Bu muamelede sadece izlenen bir adresin bulunup bulunmadığı.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>Muamelenin alıcı adresi.</translation> </message> @@ -2584,6 +2660,10 @@ Adres: %4 <translation>Muamele tarihçesini dışa aktar</translation> </message> <message> + <source>Watch-only</source> + <translation>Sadece izlenen</translation> + </message> + <message> <source>Exporting Failed</source> <translation>Dışa aktarım başarısız oldu</translation> </message> @@ -2699,26 +2779,10 @@ Adres: %4 <translation>Seçenekler:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Yapılandırma dosyası belirt (varsayılan: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Pid dosyası belirt (varsayılan: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Veri dizinini belirt</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Bağlantılar için dinlenecek <port> (varsayılan: 8333 ya da testnet: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Eşler ile en çok <n> adet bağlantı kur (varsayılan: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Eş adresleri elde etmek için bir düğüme bağlan ve ardından bağlantıyı kes</translation> </message> @@ -2727,18 +2791,6 @@ Adres: %4 <translation>Kendi genel adresinizi tanımlayın</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Aksaklık gösteren eşlerle bağlantıyı kesme sınırı (varsayılan: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Aksaklık gösteren eşlerle yeni bağlantıları engelleme süresi, saniye olarak (varsayılan: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>JSON-RPC bağlantılarını <port> üzerinde dinle (varsayılan: 8332 veya tesnet: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Komut satırı ve JSON-RPC komutlarını kabul et</translation> </message> @@ -2779,22 +2831,18 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>Kabul edilebilir şifreler (varsayılan: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>Belirtilen adrese bağlan ve daima ondan dinle. IPv6 için [makine]:port yazımını kullanınız</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>Devamlı olarak ücretsiz muameleleri dakikada <n>*1000 bayt olarak sınırla (varsayılan: 15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>Tüm cüzdan muamelelerini sil ve başlangıçta -rescan ile sadece blok zincirinin parçası olanları geri getir</translation> </message> <message> + <source>Distributed under the MIT software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> + <translation>MIT yazılım lisansı kapsamında yayınlanmıştır, ekteki COPYING dosyasına ya da <http://www.opensource.org/licenses/mit-license.php> adresine bakınız.</translation> + </message> + <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>Blokların anında çözülebileceği özel bir zincir kullanan regresyon deneme kipine gir.</translation> </message> @@ -2811,14 +2859,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Bir cüzdan muamelesi değiştiğinde komutu çalıştır (komuttaki %s muamele kimliği ile değiştirilecektir)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>Veritabanı etkinliğini bellekten disk kütüğüne her <n> megabaytta aktar (varsayılan: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>-checkblocks'un blok kontrolünün ne kadar kapsamlı olacağı (0 ilâ 4, varsayılan: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>Bu kipte -genproclimit kaç sayıda bloğun anında oluşturulduğunu kontrol eder.</translation> </message> @@ -2827,10 +2867,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Betik kontrolü iş parçacıklarının sayısını belirler (%u ilâ %d, 0 = otomatik, <0 = bu sayıda çekirdeği kullanma, varsayılan: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>Oluşturma etkinken işlemci sınırını belirler (-1 = sınırsız, varsayılan: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>Bu yayın öncesi bir deneme sürümüdür - tüm riski siz üstlenmiş olursunuz - bitcoin oluşturmak ya da ticari uygulamalar için kullanmayınız</translation> </message> @@ -2839,10 +2875,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Bu bilgisayarda %s unsuruna bağlanılamadı. Bitcoin Çekirdeği muhtemelen hâlihazırda çalışmaktadır.</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>Eşlere gizli Tor servisleri ile ulaşmak için ayrı SOCKS5 vekil sunucusu kullan (varsayılan: -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Uyarı: -paytxfee çok yüksek bir değere ayarlanmış! Bu, muamele gönderirseniz ödeyeceğiniz muamele ücretidir.</translation> </message> @@ -2863,12 +2895,12 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Uyarı: wallet.dat bozuk, veriler geri kazanıldı! Özgün wallet.dat, wallet.{zamandamgası}.bak olarak %s klasörüne kaydedildi; bakiyeniz ya da muameleleriniz yanlışsa bir yedeklemeden tekrar yüklemeniz gerekir.</translation> </message> <message> - <source>(default: 1)</source> - <translation>(varsayılan: 1)</translation> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Belirtilen ağ maskesi ya da IP adresinden bağlanan eşleri beyaz listeye al. Birden fazla kez belirtilebilir.</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(varsayılan: wallet.dat)</translation> + <source>(default: 1)</source> + <translation>(varsayılan: 1)</translation> </message> <message> <source><category> can be:</source> @@ -2899,10 +2931,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Hata ayıklama/deneme seçenekleri:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>Güvenli kipi devre dışı bırak, gerçek bir güvenli olayı geçersiz kıl (varsayılan: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>Kendi IP adresini keşfet (varsayılan: dinlenildiğinde ve -externalip yoksa 1)</translation> </message> @@ -2931,6 +2959,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Blok veritabanının açılışı sırasında hata</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Hata: Ölümcül dahili bir hata meydana geldi, ayrıntılar için debug.log dosyasına bakınız</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Hata: Disk alanı düşük!</translation> </message> @@ -2939,66 +2971,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Hata: Cüzdan kilitli, muamele oluşturulamadı!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Hata: sistem hatası:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>Herhangi bir portun dinlenmesi başarısız oldu. Bunu istiyorsanız -listen=0 seçeneğini kullanınız.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Blok verileri okunamadı</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>Blok okunamadı</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>Blok indeksi eşleştirilemedi</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>Blok indeksi yazılamadı</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>Blok verileri yazılamadı</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>Blok yazılamadı</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>Dosya verileri yazılamadı</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>Madenî para veritabanına yazılamadı</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>Muamele indeksi yazılamadı</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>Geri alma verilerinin yazılamadı</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>Güvenli kipi zorla (varsayılan: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>Bitcoin oluştur (varsayılan: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Başlangıçta kontrol edilecek blok sayısı (varsayılan: 288, 0 = hepsi)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation><kategori> sağlanmamışsa tüm hata ayıklama verilerini dök.</translation> </message> @@ -3019,8 +2995,8 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Kafi derecede dosya tanımlayıcıları mevcut değil.</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>Hata ayıklama verilerinin önüne zaman damgası ekle (varsayılan: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Sadece <net> şebekesindeki düğümlere bağlan (ipv4, ipv6 veya onion)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3035,26 +3011,18 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Azami blok boyutunu bayt olarak ayarla (varsayılan: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>RPC aramaları için iş parçacığı sayısını belirle (varsayılan: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>Cüzdan dosyası belirtiniz (veri klasörünün içinde)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>Gönderme muamelelerinde teyit edilmemiş para üstünü harca (varsayılan: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>Diskten blokları içeri aktardıktan sonra çalışmayı durdur (varsayılan: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>Bu, regresyon deneme araçları ve uygulama geliştirmesi için tasarlanmıştır. </translation> </message> <message> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Dinleme portunu haritalamak için UPnP kullan (varsayılan: %u)</translation> + </message> + <message> <source>Verifying blocks...</source> <translation>Bloklar kontrol ediliyor...</translation> </message> @@ -3079,10 +3047,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Harici blk000??.dat dosyasından blokları içe aktarır</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(varsayılan: 1, 1 = tx meta verilerini tut mesela hesap sahibi ve ödeme talebi bilgileri, 2 = tx meta verilerini at)</translation> - </message> - <message> <source>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</source> <translation>Belirtilen kaynaktan JSON-RPC bağlantılarını kabul et. Bir <ip> için geçerli olanlar şunlardır: salt IP adresi (mesela 1.2.3.4), bir şebeke/ağ maskesi (örneğin 1.2.3.4/255.255.255.0) ya da bir şebeke/CIDR (mesela 1.2.3.4/24). Bu seçenek birden fazla kez belirtilebilir</translation> </message> @@ -3103,12 +3067,12 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>%s veri dizininde kilit elde edilemedi. Bitcoin Çekirdeği muhtemelen hâlihazırda çalışmaktadır.</translation> </message> <message> - <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> - <translation>Yeni dosyaları umask 077 yerine varsayılan izinlerle oluştur (sadece devre dışı cüzdan işlevselliği ile etkilidir)</translation> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Devamlı olarak ücretsiz muameleleri dakikada <n>*1000 bayt olarak sınırla (varsayılan: %u)</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>MIT/X11 yazılım lisansı kapsamında yayınlanmıştır, ekteki COPYING dosyasına ya da <http://www.opensource.org/licenses/mit-license.php> adresine bakınız.</translation> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Yeni dosyaları umask 077 yerine varsayılan izinlerle oluştur (sadece devre dışı cüzdan işlevselliği ile etkilidir)</translation> </message> <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> @@ -3119,10 +3083,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Hata: Desteklenmeyen -socks argümanı bulundu. SOCKS sürümünün ayarlanması artık mümkün değildir, sadece SOCKS5 vekilleri desteklenmektedir.</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>Bir şebeke muamelesi cüzdan muamele girdisini tekrar harcadığında komut çalıştır (%s=tekrar harcama muamele kimliği, %t=cüzdan muamele kimliği)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>İlgili bir uyarı alındığında ya da gerçekten uzun bir çatallama gördüğümüzde komutu çalıştır (komuttaki %s mesaj ile değiştirilir)</translation> </message> @@ -3135,12 +3095,8 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Kb başına BTC olarak bundan düşük ücretler muamele oluşturulması için sıfır değerinde ücret olarak kabul edilir (varsayılan: %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>Eğer paytxfee ayarlanmadıysa, kafi derecede ücret ekleyin ki muameleler vasati n blok içinde teyit edilsin (varsayılan: 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>Hata ayıklama bilgisi dök (varsayılan:0, <kategori> sağlanması seçime dayalıdır)</translation> + <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source> + <translation>Aktardığımız ve oluşturduğumuz veri taşıyıcı muamelelerindeki azami veri boyutu (varsayılan: %u)</translation> </message> <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> @@ -3151,6 +3107,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Yüksek öncelikli/düşük ücretli muamelelerin azami boyutunu bayt olarak ayarla (varsayılan: %d)</translation> </message> <message> + <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source> + <translation>Etkinse bitcoin oluşuturulmasına atanan iş parçacığı sayısını ayarla (-1 = tüm çekirdekler, varsayılan: %d)</translation> + </message> + <message> <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> <translation>Bu ürün OpenSSL projesi tarafından OpenSSL araç takımı (http://www.openssl.org/) için geliştirilen yazılımlar, Eric Young (eay@cryptsoft.com) tarafından hazırlanmış şifreleme yazılımları ve Thomas Bernard tarafından programlanmış UPnP yazılımı içerir.</translation> </message> @@ -3159,18 +3119,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Uyarı: Lütfen bilgisayarınızın saat ve tarihinin doğru olduğunu kontol ediniz! Saatinizde gecikme varsa Bitcoin Çekirdeği doğru şekilde çalışamaz.</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>Belirtilen ağ maskesi ya da IP adresinden bağlanan eşleri beyaz listeye al. Birden fazla kez belirtilebilir.</translation> - </message> - <message> <source>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</source> <translation>Beyaz listeye alınan eşler DoS yasaklamasına uğramazlar ve muameleleri zaten mempool'da olsalar da daima aktarılır, bu mesela bir geçit için kullanışlıdır</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>Eş adreslerini daima DNS araması ile sorgula (varsayılan: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>-whitebind adresi çözümlenemedi: '%s'</translation> </message> @@ -3199,10 +3151,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Yolladığınız muamelelere kB başına BTC olarak eklenecek ücret (varsayılan: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>Hata ayıklama çıktısına IP adreslerini dahil et (varsayılan: 0)</translation> - </message> - <message> <source>Information</source> <translation>Bilgi</translation> </message> @@ -3231,24 +3179,8 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Hafızada en çok <n> bağlanılamaz blok tut (varsaylan: %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>İmza arabelleğinin boyutunu <n> unsurla sınırla (varsayılan: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>Blok oluşturulduğunda muamele önceliğini ve kB başı ücreti kütüğe al (varsayılan: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Muamelelerin tamamının indeksini tut (varsayılan: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Bağlantı başına azami alım tamponu, <n>*1000 bayt (varsayılan: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Bağlantı başına azami yollama tamponu, <n>*1000 bayt (varsayılan: 1000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Hafızada en çok <n> bağlanılamaz muamele tut (varsayılan: %u)</translation> </message> <message> <source>Need to specify a port with -whitebind: '%s'</source> @@ -3259,22 +3191,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Düğüm röle seçenekleri:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Sadece yerleşik kontrol noktalarıyla eşleşen blok zincirini kabul et (varsayılan: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Sadece <net> şebekesindeki düğümlere bağlan (IPv4, IPv6 ya da Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>Başlangıçta bloğu göster, blok indeksinde bulunduysa</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>Başlangıçta blok ağacını göster (varsayılan: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL seçenekleri: (SSL kurulumu yönergeleri için Bitcoin vikisine bakınız)</translation> </message> @@ -3291,28 +3211,12 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Her <n> şebeke mesajından rastgele birini bulanıklaştır</translation> </message> <message> - <source>Relay and mine data carrier transactions (default: 1)</source> - <translation>Veri taşıyıcı muameleleri oluştur ve aktar (varsayılan: 1)</translation> - </message> - <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>P2SH olmayan çoklu imzaları aktar (varsayılan: 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>Periyodik olarak cüdanı diske yazdırmak için bir iş parçacığı çalıştır (varsayılan: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Trace/hata ayıklama verilerini debug.log dosyası yerine konsola gönder</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Bayt olarak asgari blok boyutunu tanımla (varsayılan: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>Cüzdan veritabanı ortamında DB_PRIVATE bayrağını koyar (varsayılan: 1)</translation> + <source>Send transactions as zero-fee transactions if possible (default: %u)</source> + <translation>Muameleleri mümkünse ücretsiz olarak gönder (varsayılan: %u)</translation> </message> <message> <source>Show all debugging options (usage: --help -help-debug)</source> @@ -3327,14 +3231,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Muamelenin imzalanması başarısız oldu</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Bağlantı zaman aşım süresini milisaniye olarak belirt (varsayılan: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Sistem hatası:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>Bu, deneysel bir yazılımdır.</translation> </message> @@ -3355,10 +3251,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Bu bilgisayarda %s unsuruna bağlanılamadı (bağlanma %s hatasını verdi)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Dinlenecek portu haritalamak için UPnP kullan (varsayılan: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>Dinlenecek portu haritalamak için UPnP kullan (varsayılan: dinlenildiğinde 1)</translation> </message> @@ -3411,10 +3303,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>Cüzdanı en yeni biçime güncelle</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Anahtar alan boyutunu <n> değerine ayarla (varsayılan: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>Blok zincirini eksik cüzdan muameleleri için tekrar tara</translation> </message> @@ -3423,14 +3311,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>JSON-RPC bağlantıları için OpenSSL (https) kullan</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Sunucu sertifika dosyası (varsayılan: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Sunucu özel anahtarı (varsayılan: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Bu yardım mesajı</translation> </message> @@ -3447,14 +3327,178 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com <translation>wallet.dat dosyasının yüklenmesinde hata oluştu: bozuk cüzdan</translation> </message> <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = tx meta verilerini tut mesela hesap sahibi ve ödeme talebi bilgileri, 2 = tx meta verilerini at)</translation> + </message> + <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Veritabanı etkinliğini bellekten disk kütüğüne her <n> megabaytta aktar (varsayılan: %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>-checkblocks'un blok kontrolünün ne kadar kapsamlı olacağı (0 ilâ 4, varsayılan: %u)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source> + <translation>Eğer paytxfee ayarlanmadıysa, kafi derecede ücret ekleyin ki muameleler vasati n blok içinde teyit edilsin (varsayılan: %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Blok oluşturulduğunda muamele önceliğini ve kB başı ücreti kütüğe al (varsayılan: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Muamelelerin tamamının indeksini tut, getrawtransaction rpc çağrısı tarafından kullanılır (varsayılan: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Aksaklık gösteren eşlerle terkar bağlantıyı engelleme süresi, saniye olarak (varsayılan: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Hata ayıklama bilgisi dök (varsayılan: %u, <kategori> sağlanması seçime dayalıdır)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Eşlere gizli Tor servisleri ile ulaşmak için ayrı SOCKS5 vekil sunucusu kullan (varsayılan: %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(varsayılan: %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Kabul edilebilir şifreler (varsayılan: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Eş adresleri sorgulaması için daima DNS aramasını kullan (varsayılan: %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Güvenli kipi devre dışı bırak, gerçek bir güvenli olayı geçersiz kıl (varsayılan: %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>wallet.dat dosyasının yüklenmesinde hata oluştu</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Güvenli kipi zorla (varsayılan: %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Bitcoin oluştur (varsayılan: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Başlangıçta kontrol edilecek blok sayısı (varsayılan: %u, 0 = hepsi)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Hata ayıklama çıktısına IP adreslerini dahil et (varsayılan: %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Geçersiz -proxy adresi: '%s'</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>İmza arabelleğinin boyutunu <n> unsurla sınırla (varsayılan: %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>JSON-RPC bağlantılarını <port> üzerinde dinle (varsayılan: %u veya tesnet: %u)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Bağlantılar için dinlenecek <port> (varsayılan: %u ya da testnet: %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Eşler ile en çok <n> adet bağlantı kur (varsayılan: %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Her bağlantı için azami alım tamponu, <n>*1000 bayt (varsayılan: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Her bağlantı için azami yollama tamponu, <n>*1000 bayt (varsayılan: %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>Sadece yerleşik kontrol noktalarıyla eşleşen blok zincirini kabul et (varsayılan: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Hata ayıklama verilerinin önüne zaman damgası ekle (varsayılan: %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Başlangıçta blok ağacını göster (varsayılan: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Veri taşıyıcı muameleleri oluştur ve aktar (varsayılan: %u)</translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>P2SH olmayan çoklu imzaları aktar (varsayılan: %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Periyodik olarak cüdanı diske yazdırmak için bir iş parçacığı çalıştır (varsayılan: %u)</translation> + </message> + <message> + <source>Server certificate file (default: %s)</source> + <translation>Sunucu sertifika dosyası (varsayılan: %s)</translation> + </message> + <message> + <source>Server private key (default: %s)</source> + <translation>Sunucu özel anahtarı (varsayılan: %s)</translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Anahtar alan boyutunu <n> değerine ayarla (varsayılan: %u)</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Bayt olarak asgari blok boyutunu tanımla (varsayılan: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Hizmet RCP aramaları iş parçacığı sayısını belirle (varsayılan: %d)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>Cüzdan veritabanı ortamında DB_PRIVATE bayrağını koyar (varsayılan: %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Yapılandırma dosyası belirtiniz (varsayılan: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Bağlantı zaman aşım süresini milisaniye olarak belirt (asgari: 1, varsayılan: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Pid dosyası belirtiniz (varsayılan: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Gönderme muamelelerinde teyit edilmemiş para üstünü harca (varsayılan: %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Diskten blokları içeri aktardıktan sonra çalışmayı durdur (varsayılan: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Aksaklık gösteren eşlerle bağlantıyı kesme sınırı (varsayılan: %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>-onlynet için bilinmeyen bir şebeke belirtildi: '%s'</translation> </message> diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts index ff8ac68022..b6ba507e9b 100644 --- a/src/qt/locale/bitcoin_uk.ts +++ b/src/qt/locale/bitcoin_uk.ts @@ -1,4 +1,4 @@ -<TS language="uk" version="2.1"> +<TS language="uk" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -10,10 +10,22 @@ <translation>Створити нову адресу</translation> </message> <message> + <source>&New</source> + <translation>&Нова</translation> + </message> + <message> <source>Copy the currently selected address to the system clipboard</source> <translation>Копіювати виділену адресу в буфер обміну</translation> </message> <message> + <source>&Copy</source> + <translation>&Копіювати</translation> + </message> + <message> + <source>C&lose</source> + <translation>З&акрити</translation> + </message> + <message> <source>&Copy Address</source> <translation>&Скопіювати адресу</translation> </message> @@ -34,12 +46,28 @@ <translation>&Видалити</translation> </message> <message> + <source>Choose the address to send coins to</source> + <translation>Виберіть адресу для відправлення монет</translation> + </message> + <message> + <source>Choose the address to receive coins with</source> + <translation>Виберіть адресу для отримання монет</translation> + </message> + <message> <source>C&hoose</source> <translation>&Обрати</translation> </message> <message> + <source>Sending addresses</source> + <translation>Адреси для відправлення</translation> + </message> + <message> + <source>Receiving addresses</source> + <translation>Адреси для отримання</translation> + </message> + <message> <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source> - <translation>Це ваші Bitcoin адреси для відправки платежів. Перед відправкою монети Завжди перевіряйте суму та адресу прийому.</translation> + <translation>Це ваші Bitcoin-адреси для відправлення платежів. Перед відправленням монет завжди перевіряйте суму та адресу прийому.</translation> </message> <message> <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source> @@ -59,11 +87,15 @@ </message> <message> <source>Comma separated file (*.csv)</source> - <translation>Файли, розділені комою (*.csv)</translation> + <translation>Значення, розділені комою (*.csv)</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Помилка експорту</translation> </message> <message> <source>There was an error trying to save the address list to %1. Please try again.</source> - <translation>Сталася помилка підчас зберігання адрес до %1. Будь ласка спробуйте ще.</translation> + <translation>Виникла помилка при спробі зберігання адрес до %1. Будь ласка спробуйте ще.</translation> </message> </context> <context> @@ -141,7 +173,7 @@ </message> <message> <source>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.</source> - <translation>ВАЖЛИВО: Всі попередні резервні копії, які ви зробили з вашого файла гаманця повинні бути замінені новоствореним, зашифрованим файлом гаманця. З міркувань безпеки, попередні резервні копії в незашифрованого файла гаманця стануть марним, як тільки ви починаєте використовувати новий, зашифрований гаманець.</translation> + <translation>ВАЖЛИВО: Всі попередні резервні копії, які ви зробили з вашого файлу гаманця повинні бути замінені новоствореним, зашифрованим файлом гаманця. З міркувань безпеки, попередні резервні копії незашифрованого файла гаманця стануть марними одразу ж, як тільки ви почнете використовувати новий, зашифрований гаманець.</translation> </message> <message> <source>Warning: The Caps Lock key is on!</source> @@ -152,6 +184,10 @@ <translation>Гаманець зашифровано</translation> </message> <message> + <source>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>.</source> + <translation>Введіть нову кодову фразу для гаманця.<br/>Будь ласка, використовуйте кодові фрази що містять <b> як мінімум десять випадкових символів </b> або <b> як мінімум вісім слів </b>.</translation> + </message> + <message> <source>Bitcoin 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.</source> <translation>Біткоін-клієнт буде закрито для завершення процесу шифрування. Пам'ятайте, що шифрування гаманця не може повністю захистити ваші біткоіни від крадіжки, у випадку якщо ваш комп'ютер буде інфіковано шкідливими програмами.</translation> </message> @@ -173,7 +209,7 @@ </message> <message> <source>The passphrase entered for the wallet decryption was incorrect.</source> - <translation>Введений пароль є невірним.</translation> + <translation>Введений пароль є неправильним.</translation> </message> <message> <source>Wallet decryption failed</source> @@ -199,6 +235,10 @@ <translation>&Огляд</translation> </message> <message> + <source>Node</source> + <translation>Вузол</translation> + </message> + <message> <source>Show general overview of wallet</source> <translation>Показати загальний огляд гаманця</translation> </message> @@ -255,6 +295,10 @@ <translation>Відкрити &URI</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>Клієнт «Bitcoin Core»</translation> + </message> + <message> <source>Importing blocks from disk...</source> <translation>Імпорт блоків з диску...</translation> </message> @@ -288,7 +332,7 @@ </message> <message> <source>&Verify message...</source> - <translation>Перевірити повідомлення...</translation> + <translation>П&еревірити повідомлення...</translation> </message> <message> <source>Bitcoin</source> @@ -347,29 +391,45 @@ <translation>Панель вкладок</translation> </message> <message> - <source>[testnet]</source> - <translation>[тестова мережа]</translation> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> </message> <message> - <source>Bitcoin Core</source> - <translation>Bitcoin Ядро</translation> + <source>Request payments (generates QR codes and bitcoin: URIs)</source> + <translation>Створити запит платежу (генерує QR-код та bitcoin: URI)</translation> + </message> + <message> + <source>&About Bitcoin Core</source> + <translation>&Про Bitcoin Core</translation> + </message> + <message> + <source>Show the list of used sending addresses and labels</source> + <translation>Показати список адрес і міток, що були використані для відправлення</translation> + </message> + <message> + <source>Show the list of used receiving addresses and labels</source> + <translation>Показати список адрес і міток, що були використані для отримання</translation> + </message> + <message> + <source>Open a bitcoin: URI or payment request</source> + <translation>Відкрити bitcoin: URI чи запит платежу</translation> </message> <message> <source>&Command-line options</source> <translation>Параметри командного рядка</translation> </message> + <message> + <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> + <translation>Показати довідку Bitcoin Core для отримання переліку можливих параметрів командного рядка.</translation> + </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> - <translation><numerusform>%n активние з'єднання з мережею Bitcoin</numerusform><numerusform>%n активниих з'єднань з мережею Bitcoin</numerusform><numerusform>%n активних з'єднань з мережею Bitcoin</numerusform></translation> + <translation><numerusform>%n активне з'єднання з мережею</numerusform><numerusform>%n активні з'єднання з мережею</numerusform><numerusform>%n активних з'єднань з мережею Bitcoin</numerusform></translation> </message> <message> <source>No block source available...</source> <translation>Недоступно жодного джерела блоків...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Оброблено %1 блоків історії транзакцій.</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n година</numerusform><numerusform>%n години</numerusform><numerusform>%n годин</numerusform></translation> @@ -418,6 +478,10 @@ <source>Up to date</source> <translation>Синхронізовано</translation> </message> + <message numerus="yes"> + <source>Processed %n blocks of transaction history.</source> + <translation><numerusform>Оброблено %n блок історії транзакцій.</numerusform><numerusform>Оброблено %n блоки історії транзакцій.</numerusform><numerusform>Оброблено %n блоків історії транзакцій.</numerusform></translation> + </message> <message> <source>Catching up...</source> <translation>Синхронізується...</translation> @@ -428,7 +492,7 @@ </message> <message> <source>Incoming transaction</source> - <translation>Отримані перекази</translation> + <translation>Отримані транзакції</translation> </message> <message> <source>Date: %1 @@ -465,6 +529,10 @@ Address: %4 <translation>Кількість:</translation> </message> <message> + <source>Bytes:</source> + <translation>Байтів:</translation> + </message> + <message> <source>Amount:</source> <translation>Кількість:</translation> </message> @@ -477,30 +545,50 @@ Address: %4 <translation>Комісія:</translation> </message> <message> + <source>Dust:</source> + <translation>Пил:</translation> + </message> + <message> <source>After Fee:</source> - <translation>Після комісії</translation> + <translation>Після комісії:</translation> </message> <message> <source>Change:</source> <translation>Решта:</translation> </message> <message> - <source>Amount</source> - <translation>Кількість</translation> + <source>(un)select all</source> + <translation>Вибрати/зняти всі</translation> </message> <message> - <source>Address</source> - <translation>Адреса</translation> + <source>Tree mode</source> + <translation>Деревом</translation> + </message> + <message> + <source>List mode</source> + <translation>Списком</translation> + </message> + <message> + <source>Amount</source> + <translation>Кількість</translation> </message> <message> <source>Date</source> <translation>Дата</translation> </message> <message> + <source>Confirmations</source> + <translation>Підтверджень</translation> + </message> + <message> <source>Confirmed</source> <translation>Підтверджені</translation> </message> <message> + <source>Priority</source> + <translation>Пріоритет</translation> + </message> + <message> <source>Copy address</source> <translation>Скопіювати адресу</translation> </message> @@ -517,6 +605,14 @@ Address: %4 <translation>Копіювати ID транзакції </translation> </message> <message> + <source>Lock unspent</source> + <translation>Заблокувати</translation> + </message> + <message> + <source>Unlock unspent</source> + <translation>Розблокувати</translation> + </message> + <message> <source>Copy quantity</source> <translation>Копіювати кількість</translation> </message> @@ -537,6 +633,10 @@ Address: %4 <translation>Копіювати пріорітет</translation> </message> <message> + <source>Copy dust</source> + <translation>Копіювати пил</translation> + </message> + <message> <source>Copy change</source> <translation>Копіювати решту</translation> </message> @@ -577,6 +677,18 @@ Address: %4 <translation>найнижчий</translation> </message> <message> + <source>(%1 locked)</source> + <translation>(%1 заблоковано)</translation> + </message> + <message> + <source>none</source> + <translation>відсутній</translation> + </message> + <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>Може відрізнятися на +/- %1 сатоші за вхід</translation> + </message> + <message> <source>yes</source> <translation>так</translation> </message> @@ -589,8 +701,20 @@ Address: %4 <translation>Ця позначка буде червоною, якщо розмір транзакції вищий за 1000 байт.</translation> </message> <message> + <source>This means a fee of at least %1 per kB is required.</source> + <translation>Це означає, що необхідно внести комісію (щонайменше %1 за КБ).</translation> + </message> + <message> + <source>Can vary +/- 1 byte per input.</source> + <translation>Може відрізнятися на +/- 1 байт за вхід.</translation> + </message> + <message> + <source>Transactions with higher priority are more likely to get included into a block.</source> + <translation>Транзакції з вищим пріоритетом мають більше шансів бути включеними до блоку.</translation> + </message> + <message> <source>This label turns red, if the priority is smaller than "medium".</source> - <translation>Ця позначка буде червоною, якщо пріорітет транзакції нижчий за «середній»".</translation> + <translation>Ця позначка буде червоною, якщо пріоритет транзакції нижчий за «середній».</translation> </message> <message> <source>This label turns red, if any recipient receives an amount smaller than %1.</source> @@ -600,7 +724,15 @@ Address: %4 <source>(no label)</source> <translation>(немає назви)</translation> </message> - </context> + <message> + <source>change from %1 (%2)</source> + <translation>решта з %1 (%2)</translation> + </message> + <message> + <source>(change)</source> + <translation>(решта)</translation> + </message> +</context> <context> <name>EditAddressDialog</name> <message> @@ -612,6 +744,14 @@ Address: %4 <translation>&Мітка</translation> </message> <message> + <source>The label associated with this address list entry</source> + <translation>Мітка, пов'язана з цим записом списку адрес</translation> + </message> + <message> + <source>The address associated with this address list entry. This can only be modified for sending addresses.</source> + <translation>Адреса, пов'язана з цим записом списку адрес. Це поле може бути модифіковане лише для адрес відправлення.</translation> + </message> + <message> <source>&Address</source> <translation>&Адреса</translation> </message> @@ -675,11 +815,19 @@ Address: %4 <name>HelpMessageDialog</name> <message> <source>Bitcoin Core</source> - <translation>Bitcoin Ядро</translation> + <translation>Bitcoin Core</translation> </message> <message> <source>version</source> - <translation>версія</translation> + <translation>версії</translation> + </message> + <message> + <source>(%1-bit)</source> + <translation>(%1-бітний)</translation> + </message> + <message> + <source>About Bitcoin Core</source> + <translation>Про Bitcoin Core</translation> </message> <message> <source>Command-line options</source> @@ -706,6 +854,10 @@ Address: %4 <translation>Запускати згорнутим</translation> </message> <message> + <source>Set SSL root certificates for payment request (default: -system-)</source> + <translation>Вказати кореневі SSL-сертифікати для запиту платежу (типово: -системні-)</translation> + </message> + <message> <source>Show splash screen on startup (default: 1)</source> <translation>Показувати заставку під час запуску (типово: 1)</translation> </message> @@ -730,7 +882,7 @@ Address: %4 </message> <message> <source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source> - <translation>Bitcoin Core завантажить та збереже копію ланцюга Bitcoin блоків. Щонайменше %1Gb даних буде збережено в цьому каталозі. Гаманець теж буде збережено в цьому каталозі.</translation> + <translation>Bitcoin Core завантажить та збереже копію ланцюжка блоків Bitcoin. Щонайменше %1ГБ даних буде збережено в цьому каталозі. Гаманець теж буде збережено в цьому каталозі.</translation> </message> <message> <source>Use the default data directory</source> @@ -746,19 +898,19 @@ Address: %4 </message> <message> <source>Error: Specified data directory "%1" cannot be created.</source> - <translation>Помилка: неожливо створити обраний каталог даних «%1».</translation> + <translation>Помилка: неможливо створити обраний каталог даних «%1».</translation> </message> <message> <source>Error</source> <translation>Помилка</translation> </message> - <message> - <source>GB of free space available</source> - <translation>Gb вільного простору доступно</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>Доступно %n ГБ вільного простору</numerusform><numerusform>Доступно %n ГБ вільного простору</numerusform><numerusform>Доступно %n ГБ вільного простору</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(з %1Gb, що потрібно)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(в той час, як необхідно %n ГБ)</numerusform><numerusform>(в той час, як необхідно %n ГБ)</numerusform><numerusform>(в той час, як необхідно %n ГБ)</numerusform></translation> </message> </context> <context> @@ -768,10 +920,22 @@ Address: %4 <translation>Відкрити URI</translation> </message> <message> + <source>Open payment request from URI or file</source> + <translation>Відкрити запит платежу з URI або файлу</translation> + </message> + <message> <source>URI:</source> <translation>URI:</translation> </message> - </context> + <message> + <source>Select payment request file</source> + <translation>Виберіть файл запиту платежу</translation> + </message> + <message> + <source>Select payment request file to open</source> + <translation>Виберіть файл запиту платежу для відкриття</translation> + </message> +</context> <context> <name>OptionsDialog</name> <message> @@ -783,14 +947,6 @@ Address: %4 <translation>&Головні</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>Необов'язкова комісия за Кб допомагає переконатися, що ваші транзакції обробляються швидше. Більшість транзакцій є 1 Кб.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>Заплатити комісі&ю</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>Автоматично запускати гаманець при вході до системи.</translation> </message> @@ -799,6 +955,42 @@ Address: %4 <translation>&Запускати гаманець при вході в систему</translation> </message> <message> + <source>Size of &database cache</source> + <translation>Розмір &кешу бази даних</translation> + </message> + <message> + <source>MB</source> + <translation>МБ</translation> + </message> + <message> + <source>Number of script &verification threads</source> + <translation>Кількість потоків сценарію перевірки</translation> + </message> + <message> + <source>Accept connections from outside</source> + <translation>Приймати підключення ззовні</translation> + </message> + <message> + <source>Allow incoming connections</source> + <translation>Дозволити вхідні з’єднання</translation> + </message> + <message> + <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> + <translation>IP-адреса проксі-сервера (наприклад IPv4: 127.0.0.1 / IPv6: ::1)</translation> + </message> + <message> + <source>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 |.</source> + <translation>Сторонні URL (наприклад, block explorer), що з'являться на вкладці транзакцій у вигляді пункту контекстного меню. %s в URL буде замінено на хеш транзакції. Для відокремлення URLів використовуйте вертикальну риску |.</translation> + </message> + <message> + <source>Third party transaction URLs</source> + <translation>Сторонні URL транзакцій</translation> + </message> + <message> + <source>Active command-line options that override above options:</source> + <translation>Активовані параметри командного рядка, що перекривають вищевказані параметри:</translation> + </message> + <message> <source>Reset all client options to default.</source> <translation>Скинути всі параметри клієнта на типові.</translation> </message> @@ -811,6 +1003,30 @@ Address: %4 <translation>&Мережа</translation> </message> <message> + <source>(0 = auto, <0 = leave that many cores free)</source> + <translation>(0 = автоматично, <0 = вказує кількість вільних ядер)</translation> + </message> + <message> + <source>W&allet</source> + <translation>Г&аманець</translation> + </message> + <message> + <source>Expert</source> + <translation>Експерт</translation> + </message> + <message> + <source>Enable coin &control features</source> + <translation>Ввімкнути &керування входами</translation> + </message> + <message> + <source>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.</source> + <translation>Якщо вимкнути витрату непідтвердженої решти, то решту від транзакції не можна буде використати, допоки ця транзакція не матиме хоча б одне підтвердження. Це також впливає на розрахунок балансу.</translation> + </message> + <message> + <source>&Spend unconfirmed change</source> + <translation>&Витрачати непідтверджену решту</translation> + </message> + <message> <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source> <translation>Автоматично відкривати порт для клієнту біткоін на роутері. Працює лише якщо ваш роутер підтримує UPnP і ця функція увімкнена.</translation> </message> @@ -856,7 +1072,7 @@ Address: %4 </message> <message> <source>User Interface &language:</source> - <translation>Мова інтерфейсу користувача:</translation> + <translation>Мов&а інтерфейсу користувача:</translation> </message> <message> <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source> @@ -871,6 +1087,10 @@ Address: %4 <translation>Виберіть одиницю вимірювання монет, яка буде відображатись в гаманці та при відправленні.</translation> </message> <message> + <source>Whether to show coin control features or not.</source> + <translation>Показати або сховати керування входами.</translation> + </message> + <message> <source>&OK</source> <translation>&Гаразд</translation> </message> @@ -883,10 +1103,26 @@ Address: %4 <translation>типово</translation> </message> <message> + <source>none</source> + <translation>відсутні</translation> + </message> + <message> <source>Confirm options reset</source> <translation>Підтвердження скидання параметрів</translation> </message> <message> + <source>Client restart required to activate changes.</source> + <translation>Для застосування змін необхідно перезапустити клієнта.</translation> + </message> + <message> + <source>Client will be shutdown, do you want to proceed?</source> + <translation>Клієнт вимкнеться, продовжувати?</translation> + </message> + <message> + <source>This change would require a client restart.</source> + <translation>Ця зміна вступить в силу після перезапуску клієнта</translation> + </message> + <message> <source>The supplied proxy address is invalid.</source> <translation>Невірно вказано адресу проксі.</translation> </message> @@ -902,36 +1138,68 @@ Address: %4 <translation>Показана інформація вже може бути застарілою. Ваш гаманець буде автоматично синхронізовано з мережею Bitcoin після встановлення підключення, але цей процес ще не завершено.</translation> </message> <message> - <source>Wallet</source> - <translation>Гаманець</translation> + <source>Watch-only:</source> + <translation>Тільки спостереження:</translation> + </message> + <message> + <source>Available:</source> + <translation>Наявно:</translation> </message> <message> <source>Your current spendable balance</source> - <translation>Ваш поточний баланс расходуемого</translation> + <translation>Ваш поточний підтверджений баланс</translation> + </message> + <message> + <source>Pending:</source> + <translation>Очікується:</translation> </message> <message> <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source> - <translation>Всього угод, які ще мають бути підтверджені, і до цих пір не враховуються в расходуемого балансу</translation> + <translation>Сума монет у непідтверджених транзакціях</translation> </message> <message> <source>Immature:</source> - <translation>незрілі:</translation> + <translation>Незрілі:</translation> </message> <message> <source>Mined balance that has not yet matured</source> - <translation>Замінований баланс, який ще не дозрів</translation> + <translation>Баланс видобутих та ще недозрілих монет</translation> + </message> + <message> + <source>Balances</source> + <translation>Баланси</translation> </message> <message> <source>Total:</source> - <translation>всього:</translation> + <translation>Всього:</translation> </message> <message> <source>Your current total balance</source> - <translation>Ваше поточне Сукупний баланс</translation> + <translation>Ваш поточний сукупний баланс</translation> + </message> + <message> + <source>Your current balance in watch-only addresses</source> + <translation>Ваш поточний баланс в адресах для спостереження</translation> + </message> + <message> + <source>Spendable:</source> + <translation>Доступно:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Недавні транзакції</translation> + </message> + <message> + <source>Unconfirmed transactions to watch-only addresses</source> + <translation>Непідтверджені транзакції на адреси для спостереження</translation> + </message> + <message> + <source>Mined balance in watch-only addresses that has not yet matured</source> + <translation>Баланс видобутих та ще недозрілих монет на адресах для спостереження</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Недавні транзакції</b></translation> + <source>Current total balance in watch-only addresses</source> + <translation>Поточний сукупний баланс в адресах для спостереження</translation> </message> <message> <source>out of sync</source> @@ -944,10 +1212,98 @@ Address: %4 <source>URI handling</source> <translation>Обробка URI</translation> </message> - </context> + <message> + <source>Invalid payment address %1</source> + <translation>Помилка в адресі платежу %1</translation> + </message> + <message> + <source>Payment request rejected</source> + <translation>Запит платежу відхилено</translation> + </message> + <message> + <source>Payment request network doesn't match client network.</source> + <translation>Мережа запиту платежу не є мережею клієнта.</translation> + </message> + <message> + <source>Payment request has expired.</source> + <translation>Запит платежу прострочено.</translation> + </message> + <message> + <source>Payment request is not initialized.</source> + <translation>Запит платежу не ініціалізовано.</translation> + </message> + <message> + <source>Requested payment amount of %1 is too small (considered dust).</source> + <translation>Сума запиту платежу для %1 занадто мала (вважається пилом)</translation> + </message> + <message> + <source>Payment request error</source> + <translation>Помилка запиту платежу</translation> + </message> + <message> + <source>Cannot start bitcoin: click-to-pay handler</source> + <translation>Неможливо запустити bitcoin: обробник click-to-pay</translation> + </message> + <message> + <source>Payment request fetch URL is invalid: %1</source> + <translation>URL запиту платежу є некоректним: %1</translation> + </message> + <message> + <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source> + <translation>Неможливо обробити URI! Причиною цього може бути некоректна Bitcoin-адреса або неправильні параметри URI.</translation> + </message> + <message> + <source>Payment request file handling</source> + <translation>Обробка файлу запиту платежу</translation> + </message> + <message> + <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source> + <translation>Неможливо прочитати файл запиту платежу! Ймовірно, файл пошкоджено.</translation> + </message> + <message> + <source>Unverified payment requests to custom payment scripts are unsupported.</source> + <translation>Неперевірені запити платежів з власними платіжними сценаріями не підтримуються.</translation> + </message> + <message> + <source>Refund from %1</source> + <translation>Відшкодування з %1</translation> + </message> + <message> + <source>Error communicating with %1: %2</source> + <translation>Помилка зв'язку з %1: %2</translation> + </message> + <message> + <source>Payment request cannot be parsed!</source> + <translation>Неможливо розпізнати запит платежу!</translation> + </message> + <message> + <source>Bad response from server %1</source> + <translation>Погана відповідь від сервера %1</translation> + </message> + <message> + <source>Payment acknowledged</source> + <translation>Платіж підтверджено</translation> + </message> + <message> + <source>Network request error</source> + <translation>Помилка мережевого запиту</translation> + </message> +</context> <context> <name>PeerTableModel</name> - </context> + <message> + <source>User Agent</source> + <translation>Клієнт користувача</translation> + </message> + <message> + <source>Address/Hostname</source> + <translation>Адреса/Ім'я хоста</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Затримка</translation> + </message> +</context> <context> <name>QObject</name> <message> @@ -955,6 +1311,10 @@ Address: %4 <translation>Кількість</translation> </message> <message> + <source>Enter a Bitcoin address (e.g. %1)</source> + <translation>Введіть адресу Bitcoin (наприклад %1)</translation> + </message> + <message> <source>%1 d</source> <translation>%1 д</translation> </message> @@ -971,6 +1331,18 @@ Address: %4 <translation>%1 с</translation> </message> <message> + <source>NETWORK</source> + <translation>МЕРЕЖА</translation> + </message> + <message> + <source>UNKNOWN</source> + <translation>НЕВІДОМО</translation> + </message> + <message> + <source>None</source> + <translation>Відсутні</translation> + </message> + <message> <source>N/A</source> <translation>Н/Д</translation> </message> @@ -993,7 +1365,11 @@ Address: %4 <source>Save QR Code</source> <translation>Зберегти QR-код</translation> </message> - </context> + <message> + <source>PNG Image (*.png)</source> + <translation>Зображення PNG (*.png)</translation> + </message> +</context> <context> <name>RPCConsole</name> <message> @@ -1017,10 +1393,18 @@ Address: %4 <translation>Вікно зневадження</translation> </message> <message> + <source>General</source> + <translation>Загальна</translation> + </message> + <message> <source>Using OpenSSL version</source> <translation>Використовується OpenSSL версії</translation> </message> <message> + <source>Using BerkeleyDB version</source> + <translation>Використовується BerkeleyDB версії</translation> + </message> + <message> <source>Startup time</source> <translation>Час запуску</translation> </message> @@ -1053,10 +1437,66 @@ Address: %4 <translation>Відправлено</translation> </message> <message> + <source>&Peers</source> + <translation>&Учасники</translation> + </message> + <message> + <source>Select a peer to view detailed information.</source> + <translation>Виберіть учасника для перегляду детальнішої інформації</translation> + </message> + <message> + <source>Direction</source> + <translation>Напрямок</translation> + </message> + <message> <source>Version</source> <translation>Версія</translation> </message> <message> + <source>User Agent</source> + <translation>Клієнт користувача</translation> + </message> + <message> + <source>Services</source> + <translation>Сервіси</translation> + </message> + <message> + <source>Starting Height</source> + <translation>Початкова висота</translation> + </message> + <message> + <source>Sync Height</source> + <translation>Висота синхронізації</translation> + </message> + <message> + <source>Ban Score</source> + <translation>Очки бану</translation> + </message> + <message> + <source>Connection Time</source> + <translation>Час з'єднання</translation> + </message> + <message> + <source>Last Send</source> + <translation>Востаннє відправлено</translation> + </message> + <message> + <source>Last Receive</source> + <translation>Востаннє отримано</translation> + </message> + <message> + <source>Bytes Sent</source> + <translation>Байтів відправлено</translation> + </message> + <message> + <source>Bytes Received</source> + <translation>Байтів отримано</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Затримка</translation> + </message> + <message> <source>Last block time</source> <translation>Час останнього блоку</translation> </message> @@ -1069,8 +1509,24 @@ Address: %4 <translation>Консоль</translation> </message> <message> + <source>&Network Traffic</source> + <translation>&Мережевий трафік</translation> + </message> + <message> + <source>&Clear</source> + <translation>&Очистити</translation> + </message> + <message> <source>Totals</source> - <translation>всього:</translation> + <translation>Всього</translation> + </message> + <message> + <source>In:</source> + <translation>Вхідних:</translation> + </message> + <message> + <source>Out:</source> + <translation>Вихідних:</translation> </message> <message> <source>Build date</source> @@ -1082,7 +1538,7 @@ Address: %4 </message> <message> <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source> - <translation>Відкрийте налагодження файл журналу Bitcoin з поточного каталогу даних. Це може зайняти кілька секунд для великих файлів журналів.</translation> + <translation>Відкрийте файл журналу налагодження Bitcoin з поточного каталогу даних. Це може зайняти кілька секунд для великих файлів журналів.</translation> </message> <message> <source>Clear console</source> @@ -1101,18 +1557,46 @@ Address: %4 <translation>Наберіть <b>help</b> для перегляду доступних команд.</translation> </message> <message> + <source>%1 B</source> + <translation>%1 Б</translation> + </message> + <message> + <source>%1 KB</source> + <translation>%1 КБ</translation> + </message> + <message> + <source>%1 MB</source> + <translation>%1 МБ</translation> + </message> + <message> + <source>%1 GB</source> + <translation>%1 ГБ</translation> + </message> + <message> + <source>via %1</source> + <translation>через %1</translation> + </message> + <message> + <source>never</source> + <translation>ніколи</translation> + </message> + <message> <source>Inbound</source> <translation>Вхідний</translation> </message> <message> - <source>Yes</source> - <translation>Так</translation> + <source>Outbound</source> + <translation>Вихідний</translation> </message> <message> - <source>No</source> - <translation>Ні</translation> + <source>Unknown</source> + <translation>Невідома</translation> </message> - </context> + <message> + <source>Fetching...</source> + <translation>Отримання...</translation> + </message> +</context> <context> <name>ReceiveCoinsDialog</name> <message> @@ -1128,6 +1612,30 @@ Address: %4 <translation>&Повідомлення:</translation> </message> <message> + <source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source> + <translation>Повторно використати одну з адрес. Повторне використання адрес створює ризики безпеки та конфіденційності. Не використовуйте її, окрім як для створення повторного запиту платежу.</translation> + </message> + <message> + <source>R&euse an existing receiving address (not recommended)</source> + <translation>По&вторно використати адресу для отримання (не рекомендується)</translation> + </message> + <message> + <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source> + <translation>Необов'язкове повідомлення на додаток до запиту платежу, котре буде показане під час відкриття запиту. Примітка: Це повідомлення не буде відправлено з платежем через мережу Bitcoin.</translation> + </message> + <message> + <source>An optional label to associate with the new receiving address.</source> + <translation>Необов'язкове поле для мітки нової адреси отримувача.</translation> + </message> + <message> + <source>Use this form to request payments. All fields are <b>optional</b>.</source> + <translation>Використовуйте цю форму, щоб отримати платежі. Всі поля є <b>необов'язковими</b>.</translation> + </message> + <message> + <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source> + <translation>Необов'язкове поле для суми запиту. Залиште це поле пустим або впишіть нуль, щоб не надсилати у запиті конкретної суми.</translation> + </message> + <message> <source>Clear all fields of the form.</source> <translation>Очистити всі поля в формі</translation> </message> @@ -1136,6 +1644,30 @@ Address: %4 <translation>Очистити</translation> </message> <message> + <source>Requested payments history</source> + <translation>Історія запитів платежу</translation> + </message> + <message> + <source>&Request payment</source> + <translation>Н&адіслати запит платежу</translation> + </message> + <message> + <source>Show the selected request (does the same as double clicking an entry)</source> + <translation>Показати вибраний запит (робить те ж саме, що й подвійний клік по запису)</translation> + </message> + <message> + <source>Show</source> + <translation>Показати</translation> + </message> + <message> + <source>Remove the selected entries from the list</source> + <translation>Вилучити вибрані записи зі списку</translation> + </message> + <message> + <source>Remove</source> + <translation>Вилучити</translation> + </message> + <message> <source>Copy label</source> <translation>Скопіювати мітку</translation> </message> @@ -1167,6 +1699,14 @@ Address: %4 <translation>&Зберегти зображення...</translation> </message> <message> + <source>Request payment to %1</source> + <translation>Запит платежу на %1</translation> + </message> + <message> + <source>Payment information</source> + <translation>Інформація про платіж</translation> + </message> + <message> <source>URI</source> <translation>URI</translation> </message> @@ -1217,7 +1757,15 @@ Address: %4 <source>(no label)</source> <translation>(немає назви)</translation> </message> - </context> + <message> + <source>(no message)</source> + <translation>(без повідомлення)</translation> + </message> + <message> + <source>(no amount)</source> + <translation>(без суми)</translation> + </message> +</context> <context> <name>SendCoinsDialog</name> <message> @@ -1225,12 +1773,32 @@ Address: %4 <translation>Відправити</translation> </message> <message> + <source>Coin Control Features</source> + <translation>Керування монетами</translation> + </message> + <message> + <source>Inputs...</source> + <translation>Входи...</translation> + </message> + <message> + <source>automatically selected</source> + <translation>вибираються автоматично</translation> + </message> + <message> + <source>Insufficient funds!</source> + <translation>Недостатньо коштів!</translation> + </message> + <message> <source>Quantity:</source> <translation>Кількість:</translation> </message> <message> + <source>Bytes:</source> + <translation>Байтів:</translation> + </message> + <message> <source>Amount:</source> - <translation>Кількість:</translation> + <translation>Сума:</translation> </message> <message> <source>Priority:</source> @@ -1249,6 +1817,14 @@ Address: %4 <translation>Решта:</translation> </message> <message> + <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source> + <translation>Якщо це поле активовано, але адреса для решти відсутня або некоректна, то решта буде відправлена на новостворену адресу.</translation> + </message> + <message> + <source>Custom change address</source> + <translation>Вказати адресу для решти</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Відправити на декілька адрес</translation> </message> @@ -1261,6 +1837,10 @@ Address: %4 <translation>Очистити всі поля в формі</translation> </message> <message> + <source>Dust:</source> + <translation>Пил:</translation> + </message> + <message> <source>Clear &All</source> <translation>Очистити &все</translation> </message> @@ -1281,6 +1861,10 @@ Address: %4 <translation>Підтвердіть відправлення</translation> </message> <message> + <source>%1 to %2</source> + <translation>%1 на %2</translation> + </message> + <message> <source>Copy quantity</source> <translation>Копіювати кількість</translation> </message> @@ -1309,12 +1893,20 @@ Address: %4 <translation>Копіювати решту</translation> </message> <message> + <source>Total Amount %1 (= %2)</source> + <translation>Всього %1 (= %2)</translation> + </message> + <message> + <source>or</source> + <translation>або</translation> + </message> + <message> <source>The recipient address is not valid, please recheck.</source> <translation>Адреса отримувача невірна, будь ласка перепровірте.</translation> </message> <message> <source>The amount to pay must be larger than 0.</source> - <translation>Кількість монет для відправлення повинна бути більшою 0.</translation> + <translation>Кількість монет для відправлення повинна бути більше 0.</translation> </message> <message> <source>The amount exceeds your balance.</source> @@ -1329,14 +1921,38 @@ Address: %4 <translation>Знайдено адресу що дублюється. Відправлення на кожну адресу дозволяється лише один раз на кожну операцію переказу.</translation> </message> <message> + <source>Transaction creation failed!</source> + <translation>Не вдалося створити транзакцію!</translation> + </message> + <message> + <source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source> + <translation>Транзакцію відхилено! Це може статись, якщо декілька монет з вашого гаманця вже використані, наприклад, якщо ви використовуєте одну копію гаманця (wallet.dat), а монети були використані з іншої копії, але не позначені як використані в цій.</translation> + </message> + <message> + <source>Warning: Invalid Bitcoin address</source> + <translation>Увага: Неправильна Bitcoin-адреса</translation> + </message> + <message> <source>(no label)</source> <translation>(немає назви)</translation> </message> <message> + <source>Warning: Unknown change address</source> + <translation>Увага: Невідома адреса для решти</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Копіювати пил</translation> + </message> + <message> <source>Are you sure you want to send?</source> <translation>Ви впевнені, що хочете відправити?</translation> </message> - </context> + <message> + <source>added as transaction fee</source> + <translation>додано як комісія за транзакцію</translation> + </message> +</context> <context> <name>SendCoinsEntry</name> <message> @@ -1360,6 +1976,14 @@ Address: %4 <translation>Обрати ранiш використовувану адресу</translation> </message> <message> + <source>This is a normal payment.</source> + <translation>Це звичайний платіж.</translation> + </message> + <message> + <source>The Bitcoin address to send the payment to</source> + <translation>Адреса Bitcoin для відправлення платежу</translation> + </message> + <message> <source>Alt+A</source> <translation>Alt+A</translation> </message> @@ -1372,17 +1996,49 @@ Address: %4 <translation>Alt+P</translation> </message> <message> + <source>Remove this entry</source> + <translation>Видалити цей запис</translation> + </message> + <message> <source>Message:</source> <translation>Повідомлення:</translation> </message> <message> + <source>This is a verified payment request.</source> + <translation>Це перевірений запит платежу.</translation> + </message> + <message> + <source>Enter a label for this address to add it to the list of used addresses</source> + <translation>Введіть мітку для цієї адреси для додавання її в список використаних адрес</translation> + </message> + <message> + <source>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.</source> + <translation>Повідомлення, що було додане до bitcoin:URI та буде збережено разом з транзакцією для довідки. Примітка: Це повідомлення не буде відправлено в мережу Bitcoin.</translation> + </message> + <message> + <source>This is an unverified payment request.</source> + <translation>Це неперевірений запит платежу.</translation> + </message> + <message> + <source>Pay To:</source> + <translation>Отримувач:</translation> + </message> + <message> <source>Memo:</source> <translation>Нотатка:</translation> </message> </context> <context> <name>ShutdownWindow</name> - </context> + <message> + <source>Bitcoin Core is shutting down...</source> + <translation>Bitcoin Core вимикається...</translation> + </message> + <message> + <source>Do not shut down the computer until this window disappears.</source> + <translation>Не вимикайте комп’ютер до зникнення цього вікна.</translation> + </message> +</context> <context> <name>SignVerifyMessageDialog</name> <message> @@ -1395,7 +2051,11 @@ Address: %4 </message> <message> <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source> - <translation>Ви можете зареєструватися повідомленнями зі своїми адресами, щоб довести, що ви є їх власником. Будьте обережні, щоб не підписувати що-небудь неясне, як фішинг-атак може спробувати обдурити вас в підписанні вашу особистість до них. Тільки підписати повністю докладні свідчення, користувач зобов'язується.</translation> + <translation>Ви можете підписувати повідомлення зі своїми адресами, щоб довести, що ви є їх власником. Остерігайтеся підписувати будь-що незрозуміле, так як за допомогою фішинг-атаки вас можуть спробувати обдурити для отримання вашого підпису під чужими словами. Підписуйте тільки ті повідомлення, з якими ви повністю згодні.</translation> + </message> + <message> + <source>The Bitcoin address to sign the message with</source> + <translation>Адреса Bitcoin для підпису цього повідомлення</translation> </message> <message> <source>Choose previously used address</source> @@ -1447,7 +2107,11 @@ Address: %4 </message> <message> <source>Enter the signing 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.</source> - <translation>Введіть адресу підписання, повідомлення (забезпечення копіюванні розриви рядків, прогалини, вкладки і т.д. точно) і підпис нижче, щоб перевірити повідомлення. Будьте обережні, щоб не читати далі в підпис, ніж те, що в підписаному самого повідомлення, щоб уникнути обдурять нападу чоловік-в-середній.</translation> + <translation>Введіть нижче адресу підпису, повідомлення (впевніться, що ви точно скопіювали символи завершення рядку, табуляцію, пробіли тощо) та підпис для перевірки повідомлення. Впевніться, що в підпис не було додано зайвих символів: це допоможе уникнути атак типу «людина посередині».</translation> + </message> + <message> + <source>The Bitcoin address the message was signed with</source> + <translation>Адреса Bitcoin, якою було підписано це повідомлення</translation> </message> <message> <source>Verify the message to ensure it was signed with the specified Bitcoin address</source> @@ -1475,11 +2139,11 @@ Address: %4 </message> <message> <source>The entered address does not refer to a key.</source> - <translation>Введений адреса не відноситься до ключа.</translation> + <translation>Введена адреса не відноситься до ключа.</translation> </message> <message> <source>Wallet unlock was cancelled.</source> - <translation>Розблокування Гаманець був скасований.</translation> + <translation>Розблокування гаманця було скасоване.</translation> </message> <message> <source>Private key for the entered address is not available.</source> @@ -1503,7 +2167,7 @@ Address: %4 </message> <message> <source>The signature did not match the message digest.</source> - <translation>Підпис не відповідає дайджест повідомлення.</translation> + <translation>Підпис не збігається з хешем повідомлення.</translation> </message> <message> <source>Message verification failed.</source> @@ -1518,7 +2182,11 @@ Address: %4 <name>SplashScreen</name> <message> <source>Bitcoin Core</source> - <translation>Bitcoin Ядро</translation> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>The Bitcoin Core developers</source> + <translation>Розробники Bitcoin Core</translation> </message> <message> <source>[testnet]</source> @@ -1536,7 +2204,11 @@ Address: %4 <name>TransactionDesc</name> <message> <source>Open until %1</source> - <translation>Відкрити до %1</translation> + <translation>Відкрито до %1</translation> + </message> + <message> + <source>conflicted</source> + <translation>суперечить</translation> </message> <message> <source>%1/offline</source> @@ -1554,6 +2226,10 @@ Address: %4 <source>Status</source> <translation>Статус</translation> </message> + <message numerus="yes"> + <source>, broadcast through %n node(s)</source> + <translation><numerusform>, розіслано через %n вузол</numerusform><numerusform>, розіслано через %n вузли</numerusform><numerusform>, розіслано через %n вузлів</numerusform></translation> + </message> <message> <source>Date</source> <translation>Дата</translation> @@ -1579,6 +2255,10 @@ Address: %4 <translation>Власна адреса</translation> </message> <message> + <source>watch-only</source> + <translation>тільки спостереження</translation> + </message> + <message> <source>label</source> <translation>Мітка</translation> </message> @@ -1586,6 +2266,10 @@ Address: %4 <source>Credit</source> <translation>Кредит</translation> </message> + <message numerus="yes"> + <source>matures in %n more block(s)</source> + <translation><numerusform>«дозріє» через %n блок</numerusform><numerusform>«дозріє» через %n блоки</numerusform><numerusform>«дозріє» через %n блоків</numerusform></translation> + </message> <message> <source>not accepted</source> <translation>не прийнято</translation> @@ -1595,6 +2279,14 @@ Address: %4 <translation>Дебет</translation> </message> <message> + <source>Total debit</source> + <translation>Загальний дебет</translation> + </message> + <message> + <source>Total credit</source> + <translation>Загальний кредит</translation> + </message> + <message> <source>Transaction fee</source> <translation>Комісія за транзакцію</translation> </message> @@ -1615,8 +2307,16 @@ Address: %4 <translation>ID транзакції</translation> </message> <message> + <source>Merchant</source> + <translation>Продавець</translation> + </message> + <message> + <source>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.</source> + <translation>Після генерації монет, потрібно зачекати %1 блоків, перш ніж їх можна буде використати. Коли ви згенерували цей блок, його було відправлено в мережу для того, щоб він був доданий до ланцюжка блоків. Якщо ця процедура не вдасться, статус буде змінено на «не підтверджено» і ви не зможете витратити згенеровані монети. Таке може статись, якщо хтось інший згенерував блок на декілька секунд раніше.</translation> + </message> + <message> <source>Debug information</source> - <translation>Отладочна інформація</translation> + <translation>Налагоджувальна інформація</translation> </message> <message> <source>Transaction</source> @@ -1642,6 +2342,10 @@ Address: %4 <source>, has not been successfully broadcast yet</source> <translation>, ще не було успішно розіслано</translation> </message> + <message numerus="yes"> + <source>Open for %n more block(s)</source> + <translation><numerusform>Відкрито на %n блок</numerusform><numerusform>Відкрито на %n блоки</numerusform><numerusform>Відкрито на %n блоків</numerusform></translation> + </message> <message> <source>unknown</source> <translation>невідомо</translation> @@ -1673,8 +2377,16 @@ Address: %4 <translation>Адреса</translation> </message> <message> + <source>Immature (%1 confirmations, will be available after %2)</source> + <translation>Незрілі (%1 підтверджень, будуть доступні після %2)</translation> + </message> + <message numerus="yes"> + <source>Open for %n more block(s)</source> + <translation><numerusform>Відкрито на %n блок</numerusform><numerusform>Відкрито на %n блоки</numerusform><numerusform>Відкрито на %n блоків</numerusform></translation> + </message> + <message> <source>Open until %1</source> - <translation>Відкрити до %1</translation> + <translation>Відкрито до %1</translation> </message> <message> <source>Confirmed (%1 confirmations)</source> @@ -1689,6 +2401,22 @@ Address: %4 <translation>Згенеровано, але не підтверджено</translation> </message> <message> + <source>Offline</source> + <translation>Поза мережею</translation> + </message> + <message> + <source>Unconfirmed</source> + <translation>Не підтверджено</translation> + </message> + <message> + <source>Confirming (%1 of %2 recommended confirmations)</source> + <translation>Підтверджується (%1 з %2 рекомендованих підтверджень)</translation> + </message> + <message> + <source>Conflicted</source> + <translation>Суперечить</translation> + </message> + <message> <source>Received with</source> <translation>Отримані на</translation> </message> @@ -1709,6 +2437,10 @@ Address: %4 <translation>Добуті</translation> </message> <message> + <source>watch-only</source> + <translation>тільки спостереження</translation> + </message> + <message> <source>(n/a)</source> <translation>(недоступно)</translation> </message> @@ -1725,6 +2457,10 @@ Address: %4 <translation>Тип транзакції.</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>Показує, чи було залучено адресу для спостереження в цій транзакції.</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>Адреса отримувача транзакції.</translation> </message> @@ -1816,8 +2552,32 @@ Address: %4 <translation>Показати деталі транзакції</translation> </message> <message> + <source>Export Transaction History</source> + <translation>Експортувати історію транзакцій</translation> + </message> + <message> + <source>Watch-only</source> + <translation>Для спостереження</translation> + </message> + <message> + <source>Exporting Failed</source> + <translation>Помилка експорту</translation> + </message> + <message> + <source>There was an error trying to save the transaction history to %1.</source> + <translation>Виникла помилка при спробі зберігання історії транзакцій до %1.</translation> + </message> + <message> + <source>Exporting Successful</source> + <translation>Експорт успішно виконано</translation> + </message> + <message> + <source>The transaction history was successfully saved to %1.</source> + <translation>Історію транзакцій було успішно збережено до %1.</translation> + </message> + <message> <source>Comma separated file (*.csv)</source> - <translation>Файли, розділені комою (*.csv)</translation> + <translation>Значення, розділені комою (*.csv)</translation> </message> <message> <source>Confirmed</source> @@ -1854,10 +2614,18 @@ Address: %4 </context> <context> <name>UnitDisplayStatusBarControl</name> - </context> + <message> + <source>Unit to show amounts in. Click to select another unit.</source> + <translation>Одиниця виміру монет. Натисніть для вибору іншої.</translation> + </message> +</context> <context> <name>WalletFrame</name> - </context> + <message> + <source>No wallet has been loaded.</source> + <translation>Гаманець не завантажувався</translation> + </message> +</context> <context> <name>WalletModel</name> <message> @@ -1869,7 +2637,7 @@ Address: %4 <name>WalletView</name> <message> <source>&Export</source> - <translation>& Експорт</translation> + <translation>&Експорт</translation> </message> <message> <source>Export the data in the current tab to a file</source> @@ -1888,6 +2656,14 @@ Address: %4 <translation>Помилка резервного копіювання</translation> </message> <message> + <source>There was an error trying to save the wallet data to %1.</source> + <translation>Виникла помилка при спробі зберегти гаманець в %1.</translation> + </message> + <message> + <source>The wallet data was successfully saved to %1.</source> + <translation>Дані гаманця успішно збережено в %1.</translation> + </message> + <message> <source>Backup Successful</source> <translation>Успішне створення резервної копії</translation> </message> @@ -1899,26 +2675,10 @@ Address: %4 <translation>Параметри:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Вкажіть файл конфігурації (типово: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>Вкажіть pid-файл (типово: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Вкажіть робочий каталог</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>Чекати на з'єднання на <port> (типово: 8333 або тестова мережа: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>Підтримувати не більше <n> зв'язків з колегами (типово: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>Підключитись до вузла, щоб отримати список адрес інших учасників та від'єднатись</translation> </message> @@ -1927,18 +2687,6 @@ Address: %4 <translation>Вкажіть вашу власну публічну адресу</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>Поріг відключення неправильно під'єднаних пірів (типово: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>Максимальній розмір вхідного буферу на одне з'єднання (типово: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>Прослуховувати <port> для JSON-RPC-з'єднань (типово: 8332 або тестова мережа: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>Приймати команди із командного рядка та команди JSON-RPC</translation> </message> @@ -1952,25 +2700,85 @@ Address: %4 </message> <message> <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source> - <translation>Приймати з'єднання ззовні (за замовчуванням: 1, якщо ні-проксі або-з'єднання)</translation> + <translation>Приймати підключення ззовні (типово: 1 за відсутності -proxy чи -connect)</translation> + </message> + <message> + <source>%s, you must set a rpcpassword in the configuration file: +%s +It is recommended you use the following random password: +rpcuser=bitcoinrpc +rpcpassword=%s +(you do not need to remember this password) +The username and password MUST NOT be the same. +If the file does not exist, create it with owner-readable-only file permissions. +It is also recommended to set alertnotify so you are notified of problems; +for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com +</source> + <translation>%s, ви повинні встановити rpcpassword в файлі конфігурації: +%s +Рекомендується використати такий випадковий пароль: +rpcuser=bitcoinrpc +rpcpassword=%s +(ви не повинні пам'ятати цей пароль) +Ім’я користувача та пароль ПОВИННІ бути різними. +Якщо файлу не існує, створіть його, обмеживши доступ правом читання для власника. +Також рекомендується використовувати alertnotify для того, щоб отримувати сповіщення про проблеми; +наприклад: alertnotify=echo %%s | mail -s "Сповіщення Bitcoin" admin@foo.com +</translation> </message> <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> - <translation>Прив'язка до даного адресою і завжди слухати на ньому. Використовуйте [господаря]: позначення порту для IPv6</translation> + <translation>Прив'язатися до даної адреси та прослуховувати її. Використовуйте запис виду [хост]:порт для IPv6</translation> + </message> + <message> + <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> + <translation>Видалити всі транзакції гаманця та відновити ті, що будуть знайдені під час запуску за допомогою -rescan</translation> + </message> + <message> + <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> + <translation>Ввійти в режим регресивного тестування, що використовує спеціальний ланцюг з миттєвим знаходженням блоків.</translation> </message> <message> <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source> <translation>Помилка: транзакцію було відхилено. Це може статись, якщо декілька монет з вашого гаманця вже використані, наприклад, якщо ви використовуєте одну копію гаманця (wallet.dat), а монети були використані з іншої копії, але не позначені як використані в цій.</translation> </message> <message> + <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source> + <translation>Помилка: Ця транзакція потребує додавання комісії щонайменше в %s через її розмір, складність, або внаслідок використання недавно отриманих коштів!</translation> + </message> + <message> + <source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source> + <translation>Виконати команду, коли транзакція гаманця зміниться (замість %s в команді буде підставлено ідентифікатор транзакції)</translation> + </message> + <message> + <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> + <translation>В цьому режимі -genproclimit встановлює кількість блоків, що можуть бути згенеровані негайно.</translation> + </message> + <message> + <source>Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)</source> + <translation>Встановити кількість потоків скрипту перевірки (від %u до %d, 0 = автоматично, <0 = вказує кількість вільних ядер, типово: %d)</translation> + </message> + <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> - <translation>Це тест збірки попередньою версією - використовуйте на свій страх і ризик - не використовувати для гірничодобувних або торгових додатків</translation> + <translation>Це тестова збірка пре-релізної версії - використовуйте на свій страх і ризик - не застосовувати для добування монет або торгівлі</translation> + </message> + <message> + <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source> + <translation>Неможливо прив'язатися до %s на цьому комп'ютері. Можливо, Bitcoin Core вже запущено.</translation> </message> <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>Увага: встановлено занадто велику комісію (-paytxfee). Комісія зніматиметься кожен раз коли ви проводитимете транзакції.</translation> </message> <message> + <source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source> + <translation>Увага: Частина мережі використовує інший головний ланцюжок! Деякі добувачі, можливо, зазнають проблем.</translation> + </message> + <message> + <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source> + <translation>Увага: Наш ланцюжок блоків відрізняється від ланцюжків підключених учасників! Можливо, вам, або іншим вузлам, необхідно оновитися.</translation> + </message> + <message> <source>Warning: error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source> <translation>Увага: помилка читання wallet.dat! Всі ключі прочитано коректно, але дані транзакцій чи записи адресної книги можуть бути пропущені, або пошкоджені.</translation> </message> @@ -1979,6 +2787,18 @@ Address: %4 <translation>Увага: файл wallet.dat пошкоджено, дані врятовано! Оригінальний wallet.dat збережено як wallet.{timestamp}.bak до %s; якщо Ваш баланс чи транзакції неправильні, Ви можете відновити їх з резервної копії. </translation> </message> <message> + <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source> + <translation>Додати учасників, що під'єднуються з заданої підмережі чи IP-адреси, в білий список. Можна вказувати декілька разів.</translation> + </message> + <message> + <source>(default: 1)</source> + <translation>(типово: 1)</translation> + </message> + <message> + <source><category> can be:</source> + <translation><category> може бути:</translation> + </message> + <message> <source>Attempt to recover private keys from a corrupt wallet.dat</source> <translation>Спроба відновити закриті ключі з пошкодженого wallet.dat</translation> </message> @@ -1991,22 +2811,38 @@ Address: %4 <translation>Підключитись лише до вказаного вузла</translation> </message> <message> + <source>Connection options:</source> + <translation>Параметри з'єднання:</translation> + </message> + <message> <source>Corrupted block database detected</source> <translation>Виявлено пошкоджений блок бази даних</translation> </message> <message> + <source>Debugging/Testing options:</source> + <translation>Параметри тестування/налагодження:</translation> + </message> + <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> - <translation>Відкрийте власну IP-адресу (за замовчуванням: 1, коли не чує і-externalip)</translation> + <translation>Визначити власну IP-адресу (типово: 1 при прослуховуванні та за відсутності -externalip)</translation> + </message> + <message> + <source>Do not load the wallet and disable wallet RPC calls</source> + <translation>Не завантажувати гаманець та вимкнути звернення до нього через RPC</translation> </message> <message> <source>Do you want to rebuild the block database now?</source> - <translation>Ви хочете перебудувати базу даних блоку зараз?</translation> + <translation>Ви хочете перебудувати базу даних блоків зараз?</translation> </message> <message> <source>Error initializing block database</source> <translation>Помилка ініціалізації бази даних блоків</translation> </message> <message> + <source>Error initializing wallet database environment %s!</source> + <translation>Помилка ініціалізації середовища бази даних гаманця %s!</translation> + </message> + <message> <source>Error loading block database</source> <translation>Помилка завантаження бази даних блоків</translation> </message> @@ -2015,6 +2851,10 @@ Address: %4 <translation>Помилка відкриття блоку бази даних </translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>Помилка: Сталася фатальна помилка (детальніший опис наведено в debug.log)</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>Помилка: Мало вільного місця на диску!</translation> </message> @@ -2023,154 +2863,286 @@ Address: %4 <translation>Помилка: Гаманець заблокований, неможливо створити транзакцію!</translation> </message> <message> - <source>Error: system error: </source> - <translation>Помилка: системна помилка: </translation> + <source>Failed to listen on any port. Use -listen=0 if you want this.</source> + <translation>Не вдалося слухати на жодному порту. Використовуйте -listen=0, якщо ви хочете цього.</translation> </message> <message> - <source>Failed to listen on any port. Use -listen=0 if you want this.</source> - <translation>Не вдалося слухати на будь-якому порту. Використовуйте-слухати = 0, якщо ви хочете цього.</translation> + <source>If <category> is not supplied, output all debugging information.</source> + <translation>Якщо <category> не задано, виводить всю налагоджувальну інформацію.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>Не вдалося розпізнати блок інформації </translation> + <source>Importing...</source> + <translation>Імпорт...</translation> </message> <message> - <source>Failed to read block</source> - <translation>Не вдалося розпізнати блок</translation> + <source>Incorrect or no genesis block found. Wrong datadir for network?</source> + <translation>Початковий блок некоректний/відсутній. Чи правильно вказано каталог даних для обраної мережі?</translation> </message> <message> - <source>Failed to sync block index</source> - <translation>Не вдалося синхронізувати індекс блоку </translation> + <source>Invalid -onion address: '%s'</source> + <translation>Помилка в адресі -onion: «%s»</translation> </message> <message> - <source>Failed to write block index</source> - <translation>Не вдалося записати індекс блоку</translation> + <source>Not enough file descriptors available.</source> + <translation>Бракує доступних дескрипторів файлів.</translation> </message> <message> - <source>Failed to write block info</source> - <translation>Не вдалося записати інформацію індекса</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>Підключити тільки до вузлів в мережі <net> (ipv4, ipv6 або onion)</translation> </message> <message> - <source>Failed to write block</source> - <translation>Не вдалося записати блок</translation> + <source>Rebuild block chain index from current blk000??.dat files</source> + <translation>Перебудувати індекс ланцюжка блоків з поточних файлів blk000??.dat</translation> </message> <message> - <source>Failed to write file info</source> - <translation>Не вдалося записати інформацію файла</translation> + <source>Set database cache size in megabytes (%d to %d, default: %d)</source> + <translation>Встановити розмір кешу бази даних в мегабайтах (від %d до %d, типово: %d)</translation> </message> <message> - <source>Failed to write to coin database</source> - <translation>Не вдалося записати до бази даних монет</translation> + <source>Set maximum block size in bytes (default: %d)</source> + <translation>Встановити максимальний розмір блоку у байтах (типово: %d)</translation> </message> <message> - <source>Failed to write transaction index</source> - <translation>Не вдалося записати індекс транзакції</translation> + <source>Specify wallet file (within data directory)</source> + <translation>Вкажіть файл гаманця (в межах каталогу даних)</translation> </message> <message> - <source>Failed to write undo data</source> - <translation>Не вдалося записати скасувати дані</translation> + <source>This is intended for regression testing tools and app development.</source> + <translation>Це призначено для інструментів регресивного тестування та розробки додатків.</translation> </message> <message> - <source>Generate coins (default: 0)</source> - <translation>Генерація монети (за замовчуванням: 0)</translation> + <source>Use UPnP to map the listening port (default: %u)</source> + <translation>Намагатись використовувати UPnP для відображення порту, що прослуховується, на роутері (типово: %u)</translation> </message> <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>Скільки блоків перевіряти під час запуску (типово: 288, 0 = всі)</translation> + <source>Verifying blocks...</source> + <translation>Перевірка блоків...</translation> </message> <message> - <source>Not enough file descriptors available.</source> - <translation>Бракує дескрипторів файлів, доступних.</translation> + <source>Verifying wallet...</source> + <translation>Перевірка гаманця... </translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>Встановити число потоків до дзвінків служба RPC (за замовчуванням: 4)</translation> + <source>Wallet %s resides outside data directory %s</source> + <translation>Гаманець %s знаходиться поза каталогом даних %s</translation> </message> <message> - <source>Verifying blocks...</source> - <translation>Перевірка блоків...</translation> + <source>Wallet options:</source> + <translation>Параметри гаманця:</translation> </message> <message> - <source>Verifying wallet...</source> - <translation>Перевірка гаманця... </translation> + <source>You need to rebuild the database using -reindex to change -txindex</source> + <translation>Вам необхідно перебудувати базу даних з використанням -reindex для того, щоб змінити -txindex</translation> </message> <message> <source>Imports blocks from external blk000??.dat file</source> <translation>Імпорт блоків з зовнішнього файлу blk000??.dat</translation> </message> <message> + <source>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</source> + <translation>Дозволити підключення по протоколу JSON-RPC зі вказаного джерела. Правильною для <ip> є окрема IP-адреса (наприклад, 1.2.3.4), IP-адреса та маска підмережі (наприклад, 1.2.3.4/255.255.255.0) або CIDR-адреса (наприклад, 1.2.3.4/24). Цей параметр можна вказувати декілька разів.</translation> + </message> + <message> + <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source> + <translation>Сталася помилка при спробі відкрити порт RPC-адреси %s:%u для прослуховування: %s</translation> + </message> + <message> + <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source> + <translation>Прив'язатися до даної адреси та вносити до білого списку учасників, що під'єднуються до неї. Використовуйте запис виду [хост]:порт для IPv6</translation> + </message> + <message> + <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source> + <translation>Прив'язатися до даної адреси для прослуховування JSON-RPC підключень. Використовуйте запис виду [хост]:порт для IPv6. Цей параметр можна вказувати декілька разів (типово: прив'язуватися до всіх інтерфейсів)</translation> + </message> + <message> + <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source> + <translation>Не вдалося встановити блокування на каталог даних %s. Bitcoin Core, ймовірно, вже запущений.</translation> + </message> + <message> + <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)</source> + <translation>Обмежити швидкість передачі безкоштовних транзакцій до <n>*1000 байтів за хвилину (типово: %u)</translation> + </message> + <message> + <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source> + <translation>Створювати нові файли з типовими для системи атрибутами доступу замість маски 077 (діє тільки при вимкненому гаманці)</translation> + </message> + <message> + <source>Error: Listening for incoming connections failed (listen returned error %s)</source> + <translation>Помилка: Не вдалося налаштувати прослуховування вхідних підключень (listen повернув помилку: %s)</translation> + </message> + <message> + <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source> + <translation>Помилка: Параметр -socks не підтримується. Можливість вказувати версію SOCKS було видалено, так як підтримується лише SOCKS5.</translation> + </message> + <message> + <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> + <translation>Виконати команду при надходженні важливого сповіщення або при спостереженні тривалого розгалуження ланцюжка (замість %s буде підставлено повідомлення)</translation> + </message> + <message> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source> + <translation>Комісії (в BTC/КБ), що менші за вказану, вважатимуться нульовими (для ретрансляції) (типово: %s)</translation> + </message> + <message> + <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source> + <translation>Комісії (в BTC/КБ), що менші за вказану, вважатимуться нульовими (для створення транзакції) (типово: %s)</translation> + </message> + <message> + <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> + <translation>Дізнаватися адреси учасників через DNS при замалій кількості відомих адрес (типово: 1 за відсутності -connect)</translation> + </message> + <message> + <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source> + <translation>Встановити максимальний розмір транзакцій з високим пріоритетом та низькою комісією (в байтах) (типово: %d)</translation> + </message> + <message> + <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source> + <translation>Цей продукт включає в себе програмне забезпечення, розроблене в рамках проекту OpenSSL <https://www.openssl.org/>, криптографічне програмне забезпечення, написане Еріком Янгом, та функції для роботи з UPnP, написані Томасом Бернардом.</translation> + </message> + <message> + <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source> + <translation>Увага: будь ласка, перевірте дату і час на своєму комп'ютері! Якщо ваш годинник йде неправильно, Bitcoin Core може працювати некоректно.</translation> + </message> + <message> + <source>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</source> + <translation>Учасники, що знаходяться в білому списку, не можуть бути заблоковані за DoS та їхні транзакції завжди ретранслюватимуться (навіть якщо вони є в пам'яті), що може бути корисним, наприклад, для шлюзу</translation> + </message> + <message> + <source>Cannot resolve -whitebind address: '%s'</source> + <translation>Не вдалося розпізнати адресу для -whitebind: «%s»</translation> + </message> + <message> + <source>Connect through SOCKS5 proxy</source> + <translation>Підключитись через SOCKS5-проксі</translation> + </message> + <message> + <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source> + <translation>(C) 2009-%i Розробники Bitcoin Core</translation> + </message> + <message> + <source>Could not parse -rpcbind value %s as network address</source> + <translation>Неможливо розпізнати мережеву адресу для параметру -rpcbind (%s)</translation> + </message> + <message> + <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source> + <translation>Помилка при завантаженні wallet.dat: Гаманець потребує новішої версії Bitcoin Core</translation> + </message> + <message> + <source>Error: Unsupported argument -tor found, use -onion.</source> + <translation>Помилка: Параметр -tor не підтримується, використовуйте -onion</translation> + </message> + <message> + <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source> + <translation>Комісія (в BTC/КБ), що додаватиметься до вихідних транзакцій (типово: %s)</translation> + </message> + <message> <source>Information</source> <translation>Інформація</translation> </message> <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>Підтримувати індекс повний транзакцій (за замовчуванням: 0)</translation> + <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source> + <translation>Не вдалося пройти базові перевірки під час ініціалізації. Bitcoin Core буде вимкнено.</translation> + </message> + <message> + <source>Invalid amount for -minrelaytxfee=<amount>: '%s'</source> + <translation>Вказано некоректну суму для параметру -minrelaytxfee: «%s»</translation> + </message> + <message> + <source>Invalid amount for -mintxfee=<amount>: '%s'</source> + <translation>Вказано некоректну суму для параметру -mintxfee: «%s»</translation> </message> <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>Максимальний буфер, <n>*1000 байт (типово: 5000)</translation> + <source>Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)</source> + <translation>Вказано некоректну суму для параметру -paytxfee: «%s» (повинно бути щонайменше %s)</translation> </message> <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>Максимальній розмір вихідного буферу на одне з'єднання, <n>*1000 байт (типово: 1000)</translation> + <source>Invalid netmask specified in -whitelist: '%s'</source> + <translation>Вказано неправильну маску підмережі для -whitelist: «%s»</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>Тільки приймати блок відповідності ланцюга вбудованих контрольно-пропускних пунктів (за замовчуванням: 1)</translation> + <source>Keep at most <n> unconnectable blocks in memory (default: %u)</source> + <translation>Утримувати в пам'яті щонайбільше <n> блоків, не під'єднаних до основного ланцюжка (типово: %u)</translation> </message> <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>Підключити тільки до вузлів в мережі <net> (IPv4, IPv6 або Tor)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>Утримувати в пам'яті щонайбільше <n> транзакцій, що споживають невідомі входи (типово: %u)</translation> + </message> + <message> + <source>Need to specify a port with -whitebind: '%s'</source> + <translation>Необхідно вказати порт для -whitebind: «%s»</translation> + </message> + <message> + <source>Node relay options:</source> + <translation>Параметри вузла ретрансляції:</translation> + </message> + <message> + <source>Print block on startup, if found in block index</source> + <translation>Роздрукувати блок під час запуску (якщо він буде знайдений в індексі)</translation> + </message> + <message> + <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> + <translation>Параметри RPC SSL: (див. Bitcoin Wiki для налаштування SSL)</translation> + </message> + <message> + <source>RPC server options:</source> + <translation>Параметри сервера RPC:</translation> + </message> + <message> + <source>Randomly drop 1 of every <n> network messages</source> + <translation>Випадковим чином відкидати 1 з <n> мережевих повідомлень</translation> + </message> + <message> + <source>Randomly fuzz 1 of every <n> network messages</source> + <translation>Випадковим чином пошкоджувати 1 з <n> мережевих повідомлень</translation> </message> <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>Відсилати налагоджувальну інформацію на консоль, а не у файл debug.log</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>Встановити мінімальний розмір блоку у байтах (типово: 0)</translation> + <source>Show all debugging options (usage: --help -help-debug)</source> + <translation>Показати всі налагоджувальні параметри (використання: --help -help-debug)</translation> </message> <message> <source>Shrink debug.log file on client startup (default: 1 when no -debug)</source> - <translation>Стискати файл debug.log під час старту клієнта (типово: 1 коли відсутутній параметр -debug)</translation> + <translation>Стискати файл debug.log під час старту клієнта (типово: 1 коли відсутній параметр -debug)</translation> </message> <message> <source>Signing transaction failed</source> - <translation>Підписання угоди не вдалося</translation> + <translation>Підписання транзакції не вдалося</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>Вказати тайм-аут підключення у мілісекундах (типово: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>Системна помилка: </translation> + <source>This is experimental software.</source> + <translation>Це програмне забезпечення є експериментальним.</translation> </message> <message> <source>Transaction amount too small</source> - <translation>Сума угоди занадто малий</translation> + <translation>Сума транзакції занадто мала</translation> </message> <message> <source>Transaction amounts must be positive</source> - <translation>Суми угоди має бути позитивним</translation> + <translation>Суми монет у транзакції мають бути позитивними</translation> </message> <message> <source>Transaction too large</source> - <translation>Угода занадто великий</translation> + <translation>Транзакція занадто велика</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>Намагатись використовувати UPnP для відображення порту, що прослуховується на роутері (default: 0)</translation> + <source>Unable to bind to %s on this computer (bind returned error %s)</source> + <translation>Неможливо прив'язатися до %s на цьому комп'ютері (bind повернув помилку: %s)</translation> </message> <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> - <translation>Намагатись використовувати UPnP для відображення порту, що прослуховується на роутері (default: 1 when listening)</translation> + <translation>Намагатись використовувати UPnP для відображення порту, що прослуховується на роутері (типово: 1 коли прослуховується)</translation> </message> <message> <source>Username for JSON-RPC connections</source> <translation>Ім'я користувача для JSON-RPC-з'єднань</translation> </message> <message> + <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source> + <translation>Потрібно перезаписати гаманець: перезапустіть Bitcoin Core для завершення</translation> + </message> + <message> <source>Warning</source> <translation>Попередження</translation> </message> @@ -2179,6 +3151,22 @@ Address: %4 <translation>Увага: Поточна версія застаріла, необхідне оновлення!</translation> </message> <message> + <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source> + <translation>Увага: Параметр -benchmark не підтримується та буде проігнорований, використовуйте -debug=bench.</translation> + </message> + <message> + <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source> + <translation>Увага: Параметр -debugnet не підтримується та буде проігнорований, використовуйте -debug=net.</translation> + </message> + <message> + <source>Zapping all transactions from wallet...</source> + <translation>Видалення всіх транзакцій з гаманця...</translation> + </message> + <message> + <source>on startup</source> + <translation>під час запуску</translation> + </message> + <message> <source>wallet.dat corrupt, salvage failed</source> <translation>wallet.dat пошкоджено, відновлення не вдалося</translation> </message> @@ -2192,11 +3180,7 @@ Address: %4 </message> <message> <source>Upgrade wallet to latest format</source> - <translation>Модернізувати гаманець до останнього формату</translation> - </message> - <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>Встановити розмір пулу ключів <n> (типово: 100)</translation> + <translation>Модернізувати гаманець до найновішого формату</translation> </message> <message> <source>Rescan the block chain for missing wallet transactions</source> @@ -2207,14 +3191,6 @@ Address: %4 <translation>Використовувати OpenSSL (https) для JSON-RPC-з'єднань</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Файл сертифіката сервера (типово: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Закритий ключ сервера (типово: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Дана довідка</translation> </message> @@ -2231,18 +3207,190 @@ Address: %4 <translation>Помилка при завантаженні wallet.dat: Гаманець пошкоджено</translation> </message> <message> + <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> + <translation>(1 = утримувати метадані транзакцій (до яких відноситься інформація про власника рахунку та запити платежів), 2 - відкинути)</translation> + </message> + <message> + <source>Flush database activity from memory pool to disk log every <n> megabytes (default: %u)</source> + <translation>Записувати зміни в базі даних до файлу кожні <n> мегабайтів (типово: %u)</translation> + </message> + <message> + <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source> + <translation>Рівень ретельності перевірки блоків (0-4, типово: %u)</translation> + </message> + <message> + <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source> + <translation>Якщо параметр paytxfee не встановлено, включити комісію, достатню для підтвердження транзакцій протягом n блоків (типово: %u)</translation> + </message> + <message> + <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source> + <translation>Записувати в лог-файл пріоритет транзакції та комісію за кБ під час добування блоків (типово: %u)</translation> + </message> + <message> + <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source> + <translation>Утримувати повний індекс транзакцій (використовується RPC-викликом getrawtransaction) (типово: %u)</translation> + </message> + <message> + <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source> + <translation>Час в секундах, протягом якого відключені учасники з поганою поведінкою не зможуть підключитися (типово: %u)</translation> + </message> + <message> + <source>Output debugging information (default: %u, supplying <category> is optional)</source> + <translation>Виводити налагоджувальну інформацію (типово: %u, вказання <category> необов'язкове)</translation> + </message> + <message> + <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source> + <translation>Використовувати окремий SOCKS5-проксі для з'єднання з учасниками через приховані сервіси Tor (типово: %s)</translation> + </message> + <message> + <source>(default: %s)</source> + <translation>(типово: %s)</translation> + </message> + <message> + <source>Acceptable ciphers (default: %s)</source> + <translation>Допустимі шифри (типово: %s)</translation> + </message> + <message> + <source>Always query for peer addresses via DNS lookup (default: %u)</source> + <translation>Завжди дізнаватися адреси учасників через DNS (типово: %u)</translation> + </message> + <message> + <source>Disable safemode, override a real safe mode event (default: %u)</source> + <translation>Вимкнути безпечний режим та ігнорувати події, що здатні ввімкнути його (типово: %u)</translation> + </message> + <message> <source>Error loading wallet.dat</source> <translation>Помилка при завантаженні wallet.dat</translation> </message> <message> + <source>Force safe mode (default: %u)</source> + <translation>Ввімкнути безпечний режим (типово: %u)</translation> + </message> + <message> + <source>Generate coins (default: %u)</source> + <translation>Генерація монет (типово: %u)</translation> + </message> + <message> + <source>How many blocks to check at startup (default: %u, 0 = all)</source> + <translation>Скільки блоків перевіряти під час запуску (типово: %u, 0 = всі)</translation> + </message> + <message> + <source>Include IP addresses in debug output (default: %u)</source> + <translation>Включити IP-адреси до налагоджувального виводу (типово: %u)</translation> + </message> + <message> <source>Invalid -proxy address: '%s'</source> <translation>Помилка в адресі проксі-сервера: «%s»</translation> </message> <message> + <source>Limit size of signature cache to <n> entries (default: %u)</source> + <translation>Обмежити розмір кешу підписів до <n> записів (типово: %u)</translation> + </message> + <message> + <source>Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)</source> + <translation>Прослуховувати <port> для JSON-RPC з'єднань (типово: %u, для тестової мережі: %u)</translation> + </message> + <message> + <source>Listen for connections on <port> (default: %u or testnet: %u)</source> + <translation>Чекати на з'єднання на <port> (типово: %u, для тестової мережі: %u)</translation> + </message> + <message> + <source>Maintain at most <n> connections to peers (default: %u)</source> + <translation>Підтримувати щонайбільше <n> з'єднань з учасниками (типово: %u)</translation> + </message> + <message> + <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)</source> + <translation>Максимальний розмір вхідного буферу на одне з'єднання, <n>*1000 байтів (типово: %u)</translation> + </message> + <message> + <source>Maximum per-connection send buffer, <n>*1000 bytes (default: %u)</source> + <translation>Максимальний розмір вихідного буферу на одне з'єднання, <n>*1000 байтів (типово: %u)</translation> + </message> + <message> + <source>Only accept block chain matching built-in checkpoints (default: %u)</source> + <translation>Приймати тільки той ланцюжок блоків, що не суперечить вбудованим контрольним точкам (типово: %u)</translation> + </message> + <message> + <source>Prepend debug output with timestamp (default: %u)</source> + <translation>Доповнювати налагоджувальний вивід відміткою часу (типово: %u)</translation> + </message> + <message> + <source>Print block tree on startup (default: %u)</source> + <translation>Роздрукувати дерево блоків під час запуску (типово: %u)</translation> + </message> + <message> + <source>Relay and mine data carrier transactions (default: %u)</source> + <translation>Ретранслювати та створювати транзакції носіїв даних (типово: %u)</translation> + </message> + <message> + <source>Relay non-P2SH multisig (default: %u)</source> + <translation>Ретранслювати не-P2SH транзакції з мультипідписом (типово: %u)</translation> + </message> + <message> + <source>Run a thread to flush wallet periodically (default: %u)</source> + <translation>Запустити потік для періодичного збереження даних гаманця (типово: %u)</translation> + </message> + <message> + <source>Server certificate file (default: %s)</source> + <translation>Файл сертифіката сервера (типово: %s)</translation> + </message> + <message> + <source>Server private key (default: %s)</source> + <translation>Закритий ключ сервера (типово: %s)</translation> + </message> + <message> + <source>Set key pool size to <n> (default: %u)</source> + <translation>Встановити розмір пулу ключів <n> (типово: %u)</translation> + </message> + <message> + <source>Set minimum block size in bytes (default: %u)</source> + <translation>Встановити мінімальний розмір блоку в байтах (типово: %u)</translation> + </message> + <message> + <source>Set the number of threads to service RPC calls (default: %d)</source> + <translation>Встановити число потоків для обслуговування викликів RPC (типово: %d)</translation> + </message> + <message> + <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source> + <translation>Встановити прапорець DB_PRIVATE в середовищі бази даних гаманця (типово: %u)</translation> + </message> + <message> + <source>Specify configuration file (default: %s)</source> + <translation>Вказати файл конфігурації (типово: %s)</translation> + </message> + <message> + <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source> + <translation>Вказати тайм-аут підключення в мілісекундах (щонайменше: 1, типово: %d)</translation> + </message> + <message> + <source>Specify pid file (default: %s)</source> + <translation>Вказати pid-файл (типово: %s)</translation> + </message> + <message> + <source>Spend unconfirmed change when sending transactions (default: %u)</source> + <translation>Витрачати непідтверджену решту при відправленні транзакцій (типово: %u)</translation> + </message> + <message> + <source>Stop running after importing blocks from disk (default: %u)</source> + <translation>Вимкнутися після імпорту блоків з диску (типово: %u)</translation> + </message> + <message> + <source>Threshold for disconnecting misbehaving peers (default: %u)</source> + <translation>Поріг відключення учасників з поганою поведінкою (типово: %u)</translation> + </message> + <message> <source>Unknown network specified in -onlynet: '%s'</source> <translation>Невідома мережа вказана в -onlynet: «%s»</translation> </message> <message> + <source>Cannot resolve -bind address: '%s'</source> + <translation>Не вдалося розпізнати адресу для -bind: «%s»</translation> + </message> + <message> + <source>Cannot resolve -externalip address: '%s'</source> + <translation>Не вдалося розпізнати адресу для -externalip: «%s»</translation> + </message> + <message> <source>Invalid amount for -paytxfee=<amount>: '%s'</source> <translation>Помилка у величині комісії -paytxfee=<amount>: «%s»</translation> </message> diff --git a/src/qt/locale/bitcoin_ur_PK.ts b/src/qt/locale/bitcoin_ur_PK.ts index ab9106ca03..86f3226269 100644 --- a/src/qt/locale/bitcoin_ur_PK.ts +++ b/src/qt/locale/bitcoin_ur_PK.ts @@ -1,4 +1,4 @@ -<TS language="ur_PK" version="2.1"> +<TS language="ur_PK" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -9,6 +9,34 @@ <source>Create a new address</source> <translation>نیا ایڈریس بنائیں</translation> </message> + <message> + <source>&New</source> + <translation>نیا</translation> + </message> + <message> + <source>&Copy</source> + <translation>نقل</translation> + </message> + <message> + <source>C&lose</source> + <translation>بند</translation> + </message> + <message> + <source>&Copy Address</source> + <translation>کاپی پتہ</translation> + </message> + <message> + <source>&Export</source> + <translation>برآمد</translation> + </message> + <message> + <source>&Delete</source> + <translation>مٹا</translation> + </message> + <message> + <source>C&hoose</source> + <translation>چننا</translation> + </message> </context> <context> <name>AddressTableModel</name> @@ -73,10 +101,6 @@ <translation>رقم</translation> </message> <message> - <source>Address</source> - <translation> پتہ</translation> - </message> - <message> <source>Date</source> <translation>تاریخ</translation> </message> @@ -291,6 +315,10 @@ </context> <context> <name>WalletView</name> + <message> + <source>&Export</source> + <translation>برآمد</translation> + </message> </context> <context> <name>bitcoin-core</name> diff --git a/src/qt/locale/bitcoin_uz@Cyrl.ts b/src/qt/locale/bitcoin_uz@Cyrl.ts index 1a4d9f8108..54e649aede 100644 --- a/src/qt/locale/bitcoin_uz@Cyrl.ts +++ b/src/qt/locale/bitcoin_uz@Cyrl.ts @@ -1,4 +1,4 @@ -<TS language="uz@Cyrl" version="2.1"> +<TS language="uz@Cyrl" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -93,7 +93,11 @@ <source>Exporting Failed</source> <translation>Экспорт қилиб бўлмади</translation> </message> - </context> + <message> + <source>There was an error trying to save the address list to %1. Please try again.</source> + <translation>Манзил рўйхатини %1.га сақлашда хатолик юз берди. Яна уриниб кўринг.</translation> + </message> +</context> <context> <name>AddressTableModel</name> <message> @@ -168,6 +172,10 @@ <translation>Ҳамёнингизни кодлашни ростдан хоҳлайсизми?</translation> </message> <message> + <source>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.</source> + <translation>МУҲИМ: Сиз қилган олдинги ҳамён файли заҳиралари янги яратилган, кодланган ҳамён файли билан алмаштирилиши керак. Хавфсизлик сабабларига кўра олдинги кодланган ҳамён файли заҳираси янги кодланган ҳамёндан фойдаланишингиз билан яроқсиз ҳолга келади.</translation> + </message> + <message> <source>Warning: The Caps Lock key is on!</source> <translation>Диққат: Caps Lock тугмаси ёқилган!</translation> </message> @@ -207,10 +215,18 @@ <source>Wallet decryption failed</source> <translation>Ҳамённи коддан чиқариш амалга ошмади</translation> </message> - </context> + <message> + <source>Wallet passphrase was successfully changed.</source> + <translation>Ҳамён пароли муваффақиятли алмаштирилди.</translation> + </message> +</context> <context> <name>BitcoinGUI</name> <message> + <source>Sign &message...</source> + <translation>&Хабар ёзиш...</translation> + </message> + <message> <source>Synchronizing with network...</source> <translation>Тармоқ билан синхронланмоқда...</translation> </message> @@ -219,6 +235,10 @@ <translation>&Кўриб чиқиш</translation> </message> <message> + <source>Node</source> + <translation>Улам</translation> + </message> + <message> <source>Show general overview of wallet</source> <translation>Ҳамённинг умумий кўринишини кўрсатиш</translation> </message> @@ -239,10 +259,30 @@ <translation>Иловадан чиқиш</translation> </message> <message> + <source>About &Qt</source> + <translation>&Qt ҳақида</translation> + </message> + <message> + <source>Show information about Qt</source> + <translation>Qt ҳақидаги маълумотларни кўрсатиш</translation> + </message> + <message> <source>&Options...</source> <translation>&Мосламалар...</translation> </message> <message> + <source>&Encrypt Wallet...</source> + <translation>Ҳамённи &кодлаш...</translation> + </message> + <message> + <source>&Backup Wallet...</source> + <translation>Ҳамённи &заҳиралаш...</translation> + </message> + <message> + <source>&Change Passphrase...</source> + <translation>Махфий сўзни &ўзгартириш...</translation> + </message> + <message> <source>&Sending addresses...</source> <translation>&Жўнатилувчи манзиллар...</translation> </message> @@ -255,12 +295,88 @@ <translation>Интернет манзилни очиш</translation> </message> <message> + <source>Bitcoin Core client</source> + <translation>Bitcoin асос мижози</translation> + </message> + <message> + <source>Importing blocks from disk...</source> + <translation>Дискдан блоклар импорт қилинмоқда...</translation> + </message> + <message> + <source>Reindexing blocks on disk...</source> + <translation>Дискдаги блоклар қайта индексланмоқда...</translation> + </message> + <message> + <source>Send coins to a Bitcoin address</source> + <translation>Тангаларни Bitcoin манзилига жўнатиш</translation> + </message> + <message> + <source>Modify configuration options for Bitcoin</source> + <translation>Bitcoin учун мослаш танловларини ўзгартириш</translation> + </message> + <message> + <source>Backup wallet to another location</source> + <translation>Ҳамённи бошқа манзилга заҳиралаш</translation> + </message> + <message> <source>Change the passphrase used for wallet encryption</source> <translation>Паролни ўзгартириш ҳамённи кодлашда фойдаланилади</translation> </message> <message> + <source>&Debug window</source> + <translation>&Носозликни ҳал қилиш ойнаси</translation> + </message> + <message> + <source>Open debugging and diagnostic console</source> + <translation>Носозликни ҳал қилиш ва ташхис терминали</translation> + </message> + <message> + <source>&Verify message...</source> + <translation>Хабарни &тасдиқлаш...</translation> + </message> + <message> + <source>Bitcoin</source> + <translation>Bitcoin</translation> + </message> + <message> + <source>Wallet</source> + <translation>Ҳамён</translation> + </message> + <message> + <source>&Send</source> + <translation>&Жўнатиш</translation> + </message> + <message> + <source>&Receive</source> + <translation>&Қабул қилиш</translation> + </message> + <message> + <source>Show information about Bitcoin Core</source> + <translation>Bitcoin Core ҳақидаги маълумотларни кўрсатиш</translation> + </message> + <message> + <source>&Show / Hide</source> + <translation>&Кўрсатиш / Яшириш</translation> + </message> + <message> + <source>Show or hide the main Window</source> + <translation>Асосий ойнани кўрсатиш ёки яшириш</translation> + </message> + <message> + <source>Encrypt the private keys that belong to your wallet</source> + <translation>Ҳамёнингизга тегишли махфий калитларни кодлаш</translation> + </message> + <message> + <source>Sign messages with your Bitcoin addresses to prove you own them</source> + <translation>Bitcoin манзилидан унинг эгаси эканлигингизни исботлаш учун хабарлар ёзинг</translation> + </message> + <message> + <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source> + <translation>Хабарларни махсус Bitcoin манзилларингиз билан ёзилганлигига ишонч ҳосил қилиш учун уларни тасдиқланг</translation> + </message> + <message> <source>&File</source> - <translation>& файл</translation> + <translation>&Файл</translation> </message> <message> <source>&Settings</source> @@ -275,16 +391,44 @@ <translation>Ички ойналар асбоблар панели</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>Request payments (generates QR codes and bitcoin: URIs)</source> + <translation>Тўловлар (QR кодлари ва bitcoin ёрдамида яратишлар: URI’лар) сўраш</translation> + </message> + <message> + <source>&About Bitcoin Core</source> + <translation>Bitcoin Core &ҳақида</translation> + </message> + <message> + <source>Show the list of used sending addresses and labels</source> + <translation>Фойдаланилган жўнатилган манзиллар ва ёрлиқлар рўйхатини кўрсатиш</translation> + </message> + <message> + <source>Show the list of used receiving addresses and labels</source> + <translation>Фойдаланилган қабул қилинган манзиллар ва ёрлиқлар рўйхатини кўрсатиш</translation> + </message> + <message> + <source>Open a bitcoin: URI or payment request</source> + <translation>Bitcoin’ни очиш: URI ёки тўлов сўрови</translation> + </message> + <message> + <source>&Command-line options</source> + <translation>&Буйруқлар сатри мосламалари</translation> + </message> + <message> + <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source> + <translation>Мавжуд Bitcoin буйруқлар матни мосламалари билан Bitcoin Core ёрдам хабарларини олиш рўйхатини кўрсатиш</translation> </message> <message numerus="yes"> <source>%n active connection(s) to Bitcoin network</source> <translation><numerusform>%n та Bitcoin тармоғига фаол уланиш мавжуд</numerusform></translation> </message> <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>Ўтказма тарихи блоклари %1 та амалга оширилган. </translation> + <source>No block source available...</source> + <translation>Блок манбалари мавжуд эмас...</translation> </message> <message numerus="yes"> <source>%n hour(s)</source> @@ -307,10 +451,38 @@ <translation><numerusform>%n йил</numerusform></translation> </message> <message> + <source>%1 behind</source> + <translation>%1 орқада</translation> + </message> + <message> + <source>Last received block was generated %1 ago.</source> + <translation>Сўнги қабул қилинган блок %1 олдин яратилган.</translation> + </message> + <message> + <source>Transactions after this will not yet be visible.</source> + <translation>Бундан кейинги пул ўтказмалари кўринмайдиган бўлади.</translation> + </message> + <message> + <source>Error</source> + <translation>Хатолик</translation> + </message> + <message> + <source>Warning</source> + <translation>Диққат</translation> + </message> + <message> + <source>Information</source> + <translation>Маълумот</translation> + </message> + <message> <source>Up to date</source> <translation>Янгиланган</translation> </message> <message> + <source>Catching up...</source> + <translation>Банд қилинмоқда...</translation> + </message> + <message> <source>Sent transaction</source> <translation>Жўнатилган операция</translation> </message> @@ -319,6 +491,18 @@ <translation>Кирувчи операция</translation> </message> <message> + <source>Date: %1 +Amount: %2 +Type: %3 +Address: %4 +</source> + <translation>Санаси: %1 +Миқдори: %2 +Тури: %3 +Манзили: %4 +</translation> + </message> + <message> <source>Wallet is <b>encrypted</b> and currently <b>unlocked</b></source> <translation>Ҳамён <b>кодланган</b> ва вақтинча <b>қулфдан чиқарилган</b></translation> </message> @@ -329,30 +513,78 @@ </context> <context> <name>ClientModel</name> - </context> + <message> + <source>Network Alert</source> + <translation>Тармоқ огоҳлантиргичи</translation> + </message> +</context> <context> <name>CoinControlDialog</name> <message> + <source>Quantity:</source> + <translation>Сони:</translation> + </message> + <message> <source>Bytes:</source> <translation>Байт:</translation> </message> <message> - <source>Amount</source> - <translation>Миқдори</translation> + <source>Amount:</source> + <translation>Миқдори:</translation> </message> <message> - <source>Address</source> - <translation>Манзил</translation> + <source>Priority:</source> + <translation>Муҳимлиги:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Солиқ:</translation> + </message> + <message> + <source>Dust:</source> + <translation>Ахлат қутиси:</translation> + </message> + <message> + <source>After Fee:</source> + <translation>Солиқдан сўнг:</translation> + </message> + <message> + <source>Change:</source> + <translation>Ўзгартириш:</translation> + </message> + <message> + <source>(un)select all</source> + <translation>барчасини танаш (бекор қилиш)</translation> + </message> + <message> + <source>Tree mode</source> + <translation>Дарахт усулида</translation> + </message> + <message> + <source>List mode</source> + <translation>Рўйхат усулида</translation> + </message> + <message> + <source>Amount</source> + <translation>Миқдори</translation> </message> <message> <source>Date</source> <translation>Сана</translation> </message> <message> + <source>Confirmations</source> + <translation>Тасдиқлашлар</translation> + </message> + <message> <source>Confirmed</source> <translation>Тасдиқланди</translation> </message> <message> + <source>Priority</source> + <translation>Муҳимлиги</translation> + </message> + <message> <source>Copy address</source> <translation>Манзилни нусхалаш</translation> </message> @@ -365,14 +597,138 @@ <translation>Кийматни нусхала</translation> </message> <message> + <source>Copy transaction ID</source> + <translation>Ўтказам рақамидан нусха олиш</translation> + </message> + <message> + <source>Lock unspent</source> + <translation>Сарфланмаганларни қулфлаш</translation> + </message> + <message> + <source>Unlock unspent</source> + <translation>Сарфланмаганларни қулфдан чиқариш</translation> + </message> + <message> + <source>Copy quantity</source> + <translation>Нусха сони</translation> + </message> + <message> + <source>Copy fee</source> + <translation>Нусха солиғи</translation> + </message> + <message> + <source>Copy after fee</source> + <translation>Нусха солиқдан сўнг</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Нусха байти</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Нусха муҳимлиги</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Нусха чангги</translation> + </message> + <message> + <source>Copy change</source> + <translation>Нусха қайтими</translation> + </message> + <message> + <source>highest</source> + <translation>энг юқори</translation> + </message> + <message> + <source>higher</source> + <translation>юқорирок</translation> + </message> + <message> + <source>high</source> + <translation>юқори</translation> + </message> + <message> + <source>medium-high</source> + <translation>ўртача-юқори</translation> + </message> + <message> <source>medium</source> <translation>ўрта</translation> </message> <message> + <source>low-medium</source> + <translation>паст-юқори</translation> + </message> + <message> + <source>low</source> + <translation>паст</translation> + </message> + <message> + <source>lower</source> + <translation>пастроқ</translation> + </message> + <message> + <source>lowest</source> + <translation>энг паст</translation> + </message> + <message> + <source>(%1 locked)</source> + <translation>(%1 қулфланган)</translation> + </message> + <message> + <source>none</source> + <translation>йўқ</translation> + </message> + <message> + <source>Can vary +/- %1 satoshi(s) per input.</source> + <translation>Ҳар бир кирим +/- %1 сатоши(лар) билан ўзгариши мумкин.</translation> + </message> + <message> + <source>yes</source> + <translation>ҳа</translation> + </message> + <message> + <source>no</source> + <translation>йўқ</translation> + </message> + <message> + <source>This label turns red, if the transaction size is greater than 1000 bytes.</source> + <translation>Агар ўтказманинг ҳажми 1000 байтдан ошса, ёрлиқ қизаради.</translation> + </message> + <message> + <source>This means a fee of at least %1 per kB is required.</source> + <translation>Бу дегани солиқ ҳар кб учун камида %1 талаб қилинади.</translation> + </message> + <message> + <source>Can vary +/- 1 byte per input.</source> + <translation>Ҳар бир кирим +/- 1 байт билан ўзгариши мумкин.</translation> + </message> + <message> + <source>Transactions with higher priority are more likely to get included into a block.</source> + <translation>Юқори муҳимликка эга бўлган ўтказмалар тезда блокнинг ичига қўшимча олади.</translation> + </message> + <message> + <source>This label turns red, if the priority is smaller than "medium".</source> + <translation>Агар муҳимлиги "ўртача"дан паст бўлса, ушбу ёрлиқ қизил бўлиб ёнади.</translation> + </message> + <message> + <source>This label turns red, if any recipient receives an amount smaller than %1.</source> + <translation>Агар қабул қилувчи %1дан кичик миқдорни қабул қилса, ушбу ёрлиқ қизил бўлиб ёнади.</translation> + </message> + <message> <source>(no label)</source> <translation>(Ёрлик мавжуд эмас)</translation> </message> - </context> + <message> + <source>change from %1 (%2)</source> + <translation>%1 (%2)дан ўзгартириш</translation> + </message> + <message> + <source>(change)</source> + <translation>(ўзгартириш)</translation> + </message> +</context> <context> <name>EditAddressDialog</name> <message> @@ -384,6 +740,14 @@ <translation>&Ёрлик</translation> </message> <message> + <source>The label associated with this address list entry</source> + <translation>Ёрлиқ ушбу манзилар рўйхати ёзуви билан боғланган</translation> + </message> + <message> + <source>The address associated with this address list entry. This can only be modified for sending addresses.</source> + <translation>Манзил ушбу манзиллар рўйхати ёзуви билан боғланган. Уни фақат жўнатиладиган манзиллар учун ўзгартирса бўлади.</translation> + </message> + <message> <source>&Address</source> <translation>&Манзил</translation> </message> @@ -408,6 +772,10 @@ <translation>Киритилган "%1" манзили аллақачон манзил китобида.</translation> </message> <message> + <source>The entered address "%1" is not a valid Bitcoin address.</source> + <translation>Киритилган "%1" манзили тўғри Bitcoin манзили эмас.</translation> + </message> + <message> <source>Could not unlock wallet.</source> <translation>Ҳамён қулфдан чиқмади.</translation> </message> @@ -418,10 +786,38 @@ </context> <context> <name>FreespaceChecker</name> - </context> + <message> + <source>A new data directory will be created.</source> + <translation>Янги маълумотлар директорияси яратилади.</translation> + </message> + <message> + <source>name</source> + <translation>номи</translation> + </message> + <message> + <source>Directory already exists. Add %1 if you intend to create a new directory here.</source> + <translation>Директория аллақачон мавжуд. Агар бу ерда янги директория яратмоқчи бўлсангиз, %1 қўшинг.</translation> + </message> + <message> + <source>Path already exists, and is not a directory.</source> + <translation>Йўл аллақачон мавжуд. У директория эмас.</translation> + </message> + <message> + <source>Cannot create data directory here.</source> + <translation>Маълумотлар директориясини бу ерда яратиб бўлмайди..</translation> + </message> +</context> <context> <name>HelpMessageDialog</name> <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>version</source> + <translation>версияси</translation> + </message> + <message> <source>(%1-bit)</source> <translation>(%1-bit)</translation> </message> @@ -433,20 +829,216 @@ <source>Usage:</source> <translation>Фойдаланиш:</translation> </message> - </context> + <message> + <source>command-line options</source> + <translation>буйруқлар қатори орқали мослаш</translation> + </message> + <message> + <source>UI options</source> + <translation>UI мосламалари</translation> + </message> + <message> + <source>Start minimized</source> + <translation>Йиғилганларни бошлаш</translation> + </message> + <message> + <source>Set SSL root certificates for payment request (default: -system-)</source> + <translation>Тўлов сўровлари учун SSL асос сертификатларини ўрнатиш (стандарт: -system-)</translation> + </message> + <message> + <source>Choose data directory on startup (default: 0)</source> + <translation>Ишга тушиш вақтида маълумотлар директориясини танлаш (стандарт: 0)</translation> + </message> +</context> <context> <name>Intro</name> + <message> + <source>Welcome</source> + <translation>Хуш келибсиз</translation> + </message> + <message> + <source>Welcome to Bitcoin Core.</source> + <translation>"Bitcoin Core"га хуш келибсиз.</translation> + </message> + <message> + <source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source> + <translation>Биринчи марта дастур ишга тушгани каби сиз Bitcoin Core маълумотларини жойлаштирадиган жойни танлашингиз мумкин.</translation> + </message> + <message> + <source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source> + <translation>Bitcoin Core юклаб олинади ва Bitcoin блок занжири нусхаси жойлаштирилади. Камида %1GB маълумот ушбу директорияга жойлаштирилади ва вақт давомида ўсиб боради. Ҳамён ҳам ушбу директорияда жойлашади.</translation> + </message> + <message> + <source>Use the default data directory</source> + <translation>Стандарт маълумотлар директориясидан фойдаланиш</translation> + </message> + <message> + <source>Use a custom data directory:</source> + <translation>Бошқа маълумотлар директориясида фойдаланинг:</translation> + </message> + <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> + <source>Error: Specified data directory "%1" cannot be created.</source> + <translation>Хато: кўрсатилган "%1" маълумотлар директориясини яратиб бўлмайди.</translation> + </message> + <message> + <source>Error</source> + <translation>Хатолик</translation> + </message> </context> <context> <name>OpenURIDialog</name> - </context> + <message> + <source>Open URI</source> + <translation>URI ни очиш</translation> + </message> + <message> + <source>Open payment request from URI or file</source> + <translation>URL файлдан тўлов сўровларини очиш</translation> + </message> + <message> + <source>URI:</source> + <translation>URI:</translation> + </message> + <message> + <source>Select payment request file</source> + <translation>Тўлов сўрови файлини танлаш</translation> + </message> + <message> + <source>Select payment request file to open</source> + <translation>Очиш учун тўлов сўрови файлини танлаш</translation> + </message> +</context> <context> <name>OptionsDialog</name> <message> <source>Options</source> <translation>Танламалар</translation> </message> - </context> + <message> + <source>&Main</source> + <translation>&Асосий</translation> + </message> + <message> + <source>Automatically start Bitcoin after logging in to the system.</source> + <translation>Тизимга киргандан сўнг Bitcoin дастури автоматик ишга туширилсин.</translation> + </message> + <message> + <source>&Start Bitcoin on system login</source> + <translation>Тизимга кирганда Bitcoin &ишга туширилсин</translation> + </message> + <message> + <source>Size of &database cache</source> + <translation>&Маълумотлар базаси кеши</translation> + </message> + <message> + <source>MB</source> + <translation>МБ</translation> + </message> + <message> + <source>Number of script &verification threads</source> + <translation>Мавзуларни &тўғрилаш скрипти миқдори</translation> + </message> + <message> + <source>Accept connections from outside</source> + <translation>Ташқаридан уланишларга рози бўлиш</translation> + </message> + <message> + <source>Allow incoming connections</source> + <translation>Кирувчи уланишларга рухсат бериш</translation> + </message> + <message> + <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> + <translation>Прокси IP манзили (масалан: IPv4: 127.0.0.1 / IPv6: ::1)</translation> + </message> + <message> + <source>Third party transaction URLs</source> + <translation>Бегона тараф ўтказмалари URL манзиллари</translation> + </message> + <message> + <source>Proxy &IP:</source> + <translation>Прокси &IP рақами:</translation> + </message> + <message> + <source>&Port:</source> + <translation>&Порт:</translation> + </message> + <message> + <source>Port of the proxy (e.g. 9050)</source> + <translation>Прокси порти (e.g. 9050)</translation> + </message> + <message> + <source>&Window</source> + <translation>&Ойна</translation> + </message> + <message> + <source>Show only a tray icon after minimizing the window.</source> + <translation>Ойна йиғилгандан сўнг фақат трэй нишончаси кўрсатилсин.</translation> + </message> + <message> + <source>&Minimize to the tray instead of the taskbar</source> + <translation>Манзиллар панели ўрнига трэйни &йиғиш</translation> + </message> + <message> + <source>M&inimize on close</source> + <translation>Ёпишда й&иғиш</translation> + </message> + <message> + <source>&Display</source> + <translation>&Кўрсатиш</translation> + </message> + <message> + <source>User Interface &language:</source> + <translation>Фойдаланувчи интерфейси &тили:</translation> + </message> + <message> + <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source> + <translation>Фойдаланувчи тили интерфесини шу ерда ўрнатиш мумкин. TУшбу созлама Bitcoin қайта ишга туширилганда кучга киради.</translation> + </message> + <message> + <source>&Unit to show amounts in:</source> + <translation>Миқдорларни кўрсатиш учун &қисм:</translation> + </message> + <message> + <source>&OK</source> + <translation>&OK</translation> + </message> + <message> + <source>&Cancel</source> + <translation>&Бекор қилиш</translation> + </message> + <message> + <source>default</source> + <translation>стандарт</translation> + </message> + <message> + <source>none</source> + <translation>йўқ</translation> + </message> + <message> + <source>Confirm options reset</source> + <translation>Тасдиқлаш танловларини рад қилиш</translation> + </message> + <message> + <source>Client restart required to activate changes.</source> + <translation>Ўзгаришлар амалга ошиши учун мижозни қайта ишга тушириш талаб қилинади.</translation> + </message> + <message> + <source>Client will be shutdown, do you want to proceed?</source> + <translation>Мижоз ўчирилади. Давом эттиришни хоҳлайсизми?</translation> + </message> + <message> + <source>This change would require a client restart.</source> + <translation>Ушбу ўзгариш мижозни қайтадан ишга туширишни талаб қилади.</translation> + </message> + <message> + <source>The supplied proxy address is invalid.</source> + <translation>Келтирилган прокси манзили ишламайди.</translation> + </message> +</context> <context> <name>OverviewPage</name> <message> @@ -454,8 +1046,60 @@ <translation>Шакл</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>Жорий утказмалар</b></translation> + <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source> + <translation>Кўрсатилган маълумот эскирган бўлиши мумкин. Ҳамёнингиз алоқа ўрнатилгандан сўнг Bitcoin тармоқ билан автоматик тарзда синхронланади, аммо жараён ҳалигача тугалланмади.</translation> + </message> + <message> + <source>Watch-only:</source> + <translation>Фақат кўришга</translation> + </message> + <message> + <source>Available:</source> + <translation>Мавжуд:</translation> + </message> + <message> + <source>Your current spendable balance</source> + <translation>Жорий сарфланадиган балансингиз</translation> + </message> + <message> + <source>Pending:</source> + <translation>Кутилмоқда:</translation> + </message> + <message> + <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source> + <translation>Жами ўтказмалар ҳозиргача тасдиқланган ва сафланадиган баланс томонга ҳали ҳам ҳисобланмади</translation> + </message> + <message> + <source>Immature:</source> + <translation>Тайёр эмас:</translation> + </message> + <message> + <source>Mined balance that has not yet matured</source> + <translation>Миналаштирилган баланс ҳалигача тайёр эмас</translation> + </message> + <message> + <source>Balances</source> + <translation>Баланслар</translation> + </message> + <message> + <source>Total:</source> + <translation>Жами:</translation> + </message> + <message> + <source>Your current total balance</source> + <translation>Жорий умумий балансингиз</translation> + </message> + <message> + <source>Your current balance in watch-only addresses</source> + <translation>Жорий балансингиз фақат кўринадиган манзилларда</translation> + </message> + <message> + <source>Spendable:</source> + <translation>Сарфланадиган:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>Сўнгги пул ўтказмалари</translation> </message> </context> <context> @@ -463,35 +1107,291 @@ </context> <context> <name>PeerTableModel</name> - </context> + <message> + <source>Ping Time</source> + <translation>Ping вақти</translation> + </message> +</context> <context> <name>QObject</name> <message> <source>Amount</source> <translation>Миқдори</translation> </message> - </context> + <message> + <source>%1 m</source> + <translation>%1 д</translation> + </message> + <message> + <source>%1 s</source> + <translation>%1 с</translation> + </message> + <message> + <source>NETWORK</source> + <translation>ТАРМОҚ</translation> + </message> + <message> + <source>UNKNOWN</source> + <translation>НОМАЪЛУМ</translation> + </message> + <message> + <source>None</source> + <translation>Йўқ</translation> + </message> + <message> + <source>N/A</source> + <translation>Тўғри келмайди</translation> + </message> + <message> + <source>%1 ms</source> + <translation>%1 мс</translation> + </message> +</context> <context> <name>QRImageWidget</name> - </context> + <message> + <source>&Save Image...</source> + <translation>Расмни &сақлаш</translation> + </message> + <message> + <source>&Copy Image</source> + <translation>Расмдан &нусха олиш</translation> + </message> + <message> + <source>Save QR Code</source> + <translation>QR кодни сақлаш</translation> + </message> + <message> + <source>PNG Image (*.png)</source> + <translation>PNG расм (*.png)</translation> + </message> +</context> <context> <name>RPCConsole</name> <message> + <source>Client name</source> + <translation>Мижоз номи</translation> + </message> + <message> + <source>N/A</source> + <translation>Тўғри келмайди</translation> + </message> + <message> + <source>Client version</source> + <translation>Мижоз номи</translation> + </message> + <message> + <source>&Information</source> + <translation>&Маълумот</translation> + </message> + <message> + <source>Debug window</source> + <translation>Тузатиш ойнаси</translation> + </message> + <message> <source>General</source> <translation>Асосий</translation> </message> <message> + <source>Using OpenSSL version</source> + <translation>Фойдаланилаётган OpenSSL версияси</translation> + </message> + <message> + <source>Using BerkeleyDB version</source> + <translation>Фойдаланилаётган BerkeleyDB версияси</translation> + </message> + <message> + <source>Startup time</source> + <translation>Бошланиш вақти</translation> + </message> + <message> + <source>Network</source> + <translation>Тармоқ</translation> + </message> + <message> <source>Name</source> <translation>Ном</translation> </message> - </context> + <message> + <source>&Peers</source> + <translation>&Уламлар</translation> + </message> + <message> + <source>Select a peer to view detailed information.</source> + <translation>Батафсил маълумотларни кўриш учун уламни танланг.</translation> + </message> + <message> + <source>Starting Height</source> + <translation>Узунликнинг бошланиши</translation> + </message> + <message> + <source>Sync Height</source> + <translation>Узунликни синхронлаш</translation> + </message> + <message> + <source>Ban Score</source> + <translation>Тезликни бан қилиш</translation> + </message> + <message> + <source>Connection Time</source> + <translation>Уланиш вақти</translation> + </message> + <message> + <source>Last Send</source> + <translation>Сўнгги жўнатилган</translation> + </message> + <message> + <source>Last Receive</source> + <translation>Сўнгги қабул қилинган</translation> + </message> + <message> + <source>Bytes Sent</source> + <translation>Жўнатилган байтлар</translation> + </message> + <message> + <source>Bytes Received</source> + <translation>Қабул қилинган байтлар</translation> + </message> + <message> + <source>Ping Time</source> + <translation>Ping вақти</translation> + </message> + <message> + <source>Last block time</source> + <translation>Сўнгги блок вақти</translation> + </message> + <message> + <source>&Open</source> + <translation>&Очиш</translation> + </message> + <message> + <source>&Console</source> + <translation>&Терминал</translation> + </message> + <message> + <source>&Network Traffic</source> + <translation>&Тармоқ трафиги</translation> + </message> + <message> + <source>&Clear</source> + <translation>&Тозалаш</translation> + </message> + <message> + <source>Totals</source> + <translation>Жами</translation> + </message> + <message> + <source>In:</source> + <translation>Ичига:</translation> + </message> + <message> + <source>Out:</source> + <translation>Ташқарига:</translation> + </message> + <message> + <source>Build date</source> + <translation>Тузилган санаси</translation> + </message> + <message> + <source>Debug log file</source> + <translation>Тузатиш журнали файли</translation> + </message> + <message> + <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source> + <translation>Жорий махлумотлар директориясидан Bitcoin тузатиш журнали файлини очинг. Бу катта журнал файллари учун бир неча сонияни олиши мумкин.</translation> + </message> + <message> + <source>Clear console</source> + <translation>Терминални тозалаш</translation> + </message> + <message> + <source>Welcome to the Bitcoin RPC console.</source> + <translation>Bitcoin RPC терминлга хуш келибсиз.</translation> + </message> + <message> + <source>Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen.</source> + <translation>Тарихни кўриш учун тепага ва пастга кўрсаткичларидан фойдаланинг, экранни тозалаш учун <b>Ctrl-L</b> тугмалар бирикмасидан фойдаланинг.</translation> + </message> + <message> + <source>Type <b>help</b> for an overview of available commands.</source> + <translation>Мавжуд буйруқларни кўриш учун <b>help</b> деб ёзинг.</translation> + </message> + <message> + <source>%1 B</source> + <translation>%1 Б</translation> + </message> + <message> + <source>%1 KB</source> + <translation>%1 КБ</translation> + </message> + <message> + <source>%1 MB</source> + <translation>%1 МБ</translation> + </message> + <message> + <source>%1 GB</source> + <translation>%1 ГБ</translation> + </message> + <message> + <source>via %1</source> + <translation>%1 орқали</translation> + </message> + <message> + <source>never</source> + <translation>ҳеч қачон</translation> + </message> + <message> + <source>Unknown</source> + <translation>Номаълум</translation> + </message> + <message> + <source>Fetching...</source> + <translation>Олинмоқда...</translation> + </message> +</context> <context> <name>ReceiveCoinsDialog</name> <message> + <source>&Amount:</source> + <translation>&Миқдор:</translation> + </message> + <message> <source>&Label:</source> <translation>&Ёрлиқ:</translation> </message> <message> + <source>&Message:</source> + <translation>&Хабар:</translation> + </message> + <message> + <source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source> + <translation>Олдинги фойдаланилган қабул қилинган манзиллардан биридан қайта фойдаланилсин. Хавсизлик ва махфийлик муаммолар мавжуд манзиллардан қайта фойдаланилмоқда. Бундан тўлов сўров қайта яратилмагунича фойдаланманг.</translation> + </message> + <message> + <source>An optional label to associate with the new receiving address.</source> + <translation>Янги қабул қилинаётган манзил билан боғланган танланадиган ёрлиқ.</translation> + </message> + <message> + <source>Use this form to request payments. All fields are <b>optional</b>.</source> + <translation>Ушбу сўровдан тўловларни сўраш учун фойдаланинг. Барча майдонлар <b>мажбурий эмас</b>.</translation> + </message> + <message> + <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source> + <translation>Хоҳланган миқдор сўрови. Кўрсатилган миқдорни сўраш учун буни бўш ёки ноль қолдиринг.</translation> + </message> + <message> + <source>Clear all fields of the form.</source> + <translation>Шаклнинг барча майдончаларини тозалаш</translation> + </message> + <message> + <source>Clear</source> + <translation>Тозалаш</translation> + </message> + <message> + <source>Requested payments history</source> + <translation>Сўралган тўлов тарихи</translation> + </message> + <message> <source>Copy label</source> <translation>Ёрликни нусхала</translation> </message> @@ -507,6 +1407,10 @@ <context> <name>ReceiveRequestDialog</name> <message> + <source>&Save Image...</source> + <translation>Расмни &сақлаш</translation> + </message> + <message> <source>Address</source> <translation>Манзил</translation> </message> @@ -545,14 +1449,54 @@ <translation>Тангаларни жунат</translation> </message> <message> + <source>Quantity:</source> + <translation>Сони:</translation> + </message> + <message> <source>Bytes:</source> <translation>Байт:</translation> </message> <message> + <source>Amount:</source> + <translation>Миқдори:</translation> + </message> + <message> + <source>Priority:</source> + <translation>Муҳимлиги:</translation> + </message> + <message> + <source>Fee:</source> + <translation>Солиқ:</translation> + </message> + <message> + <source>After Fee:</source> + <translation>Солиқдан сўнг:</translation> + </message> + <message> + <source>Change:</source> + <translation>Ўзгартириш:</translation> + </message> + <message> + <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source> + <translation>Агар бу фаоллаштирилса, аммо ўзгартирилган манзил бўл ёки нотўғри бўлса, ўзгариш янги яратилган манзилга жўнатилади.</translation> + </message> + <message> + <source>Custom change address</source> + <translation>Бошқа ўзгартирилган манзил</translation> + </message> + <message> <source>Send to multiple recipients at once</source> <translation>Бирданига бир нечта қабул қилувчиларга жўнатиш</translation> </message> <message> + <source>Clear all fields of the form.</source> + <translation>Шаклнинг барча майдончаларини тозалаш</translation> + </message> + <message> + <source>Dust:</source> + <translation>Ахлат қутиси:</translation> + </message> + <message> <source>Balance:</source> <translation>Баланс</translation> </message> @@ -565,18 +1509,62 @@ <translation>Тангалар жўнаишни тасдиқлаш</translation> </message> <message> + <source>Copy quantity</source> + <translation>Нусха сони</translation> + </message> + <message> <source>Copy amount</source> <translation>Кийматни нусхала</translation> </message> <message> + <source>Copy fee</source> + <translation>Нусха солиғи</translation> + </message> + <message> + <source>Copy after fee</source> + <translation>Нусха солиқдан сўнг</translation> + </message> + <message> + <source>Copy bytes</source> + <translation>Нусха байти</translation> + </message> + <message> + <source>Copy priority</source> + <translation>Нусха муҳимлиги</translation> + </message> + <message> + <source>Copy change</source> + <translation>Нусха қайтими</translation> + </message> + <message> <source>The amount to pay must be larger than 0.</source> <translation>Тўлов миқдори 0. дан катта бўлиши керак. </translation> </message> <message> + <source>Warning: Invalid Bitcoin address</source> + <translation>Диққат: Нотўғр Bitcoin манзили</translation> + </message> + <message> <source>(no label)</source> <translation>(Ёрлик мавжуд эмас)</translation> </message> - </context> + <message> + <source>Warning: Unknown change address</source> + <translation>Диққат: Номаълум ўзгариш манзили</translation> + </message> + <message> + <source>Copy dust</source> + <translation>Нусха чангги</translation> + </message> + <message> + <source>Are you sure you want to send?</source> + <translation>Жўнатишни хоҳлашингизга ишончингиз комилми?</translation> + </message> + <message> + <source>added as transaction fee</source> + <translation>ўтказма солиғи қўшилди</translation> + </message> +</context> <context> <name>SendCoinsEntry</name> <message> @@ -625,10 +1613,18 @@ <source>Alt+P</source> <translation>Alt+P</translation> </message> + <message> + <source>Signature</source> + <translation>Имзо</translation> + </message> </context> <context> <name>SplashScreen</name> <message> + <source>Bitcoin Core</source> + <translation>Bitcoin Core</translation> + </message> + <message> <source>The Bitcoin Core developers</source> <translation>Bitcoin Core дастурчилари</translation> </message> @@ -828,6 +1824,10 @@ <translation>Кийматни нусхала</translation> </message> <message> + <source>Copy transaction ID</source> + <translation>Ўтказам рақамидан нусха олиш</translation> + </message> + <message> <source>Edit label</source> <translation>Ёрликни тахрирлаш</translation> </message> @@ -903,14 +1903,6 @@ <translation>Танламалар:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>Мослаш файлини кўрсатинг (default: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>pid файлини кўрсатинг (default: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>Маълумотлар директориясини кўрсатинг</translation> </message> @@ -927,10 +1919,18 @@ <translation>Синов тармоғидан фойдаланинг</translation> </message> <message> + <source>Information</source> + <translation>Маълумот</translation> + </message> + <message> <source>Username for JSON-RPC connections</source> <translation>JSON-RPC уланишлари учун фойдаланувчи номи</translation> </message> <message> + <source>Warning</source> + <translation>Диққат</translation> + </message> + <message> <source>Password for JSON-RPC connections</source> <translation>JSON-RPC уланишлари учун парол</translation> </message> @@ -939,14 +1939,6 @@ <translation>JSON-RPC уланишлари учун OpenSSL (https)дан фойдаланиш</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>Сервер сертификат файли (default: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>Сервер махфий калити (бирламчи: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>Бу ёрдам хабари</translation> </message> @@ -970,5 +1962,9 @@ <source>Done loading</source> <translation>Юклаш тайёр</translation> </message> - </context> + <message> + <source>Error</source> + <translation>Хатолик</translation> + </message> +</context> </TS>
\ No newline at end of file diff --git a/src/qt/locale/bitcoin_vi.ts b/src/qt/locale/bitcoin_vi.ts index e03349b383..3ca5605883 100644 --- a/src/qt/locale/bitcoin_vi.ts +++ b/src/qt/locale/bitcoin_vi.ts @@ -1,4 +1,4 @@ -<TS language="vi" version="2.1"> +<TS language="vi" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -53,10 +53,6 @@ <translation>Số lượng</translation> </message> <message> - <source>Address</source> - <translation>Địa chỉ</translation> - </message> - <message> <source>(no label)</source> <translation>(chưa có nhãn)</translation> </message> diff --git a/src/qt/locale/bitcoin_vi_VN.ts b/src/qt/locale/bitcoin_vi_VN.ts index 20ebd7b594..bf76c8638a 100644 --- a/src/qt/locale/bitcoin_vi_VN.ts +++ b/src/qt/locale/bitcoin_vi_VN.ts @@ -1,4 +1,4 @@ -<TS language="vi_VN" version="2.1"> +<TS language="vi_VN" version="2.0"> <context> <name>AddressBookPage</name> <message> diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts index cd0caf53a1..94d0675bfd 100644 --- a/src/qt/locale/bitcoin_zh_CN.ts +++ b/src/qt/locale/bitcoin_zh_CN.ts @@ -1,4 +1,4 @@ -<TS language="zh_CN" version="2.1"> +<TS language="zh_CN" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -387,10 +387,6 @@ <translation>分页工具栏</translation> </message> <message> - <source>[testnet]</source> - <translation>[测试网络]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>比特币核心</translation> </message> @@ -430,10 +426,6 @@ <source>No block source available...</source> <translation>沒有可用的区块来源...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>已处理 %1 个交易历史数据块。</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n 小时</numerusform></translation> @@ -525,10 +517,6 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>选择交易源地址</translation> - </message> - <message> <source>Quantity:</source> <translation>总量:</translation> </message> @@ -577,10 +565,6 @@ Address: %4 <translation>金额</translation> </message> <message> - <source>Address</source> - <translation>地址</translation> - </message> - <message> <source>Date</source> <translation>日期</translation> </message> @@ -905,15 +889,7 @@ Address: %4 <source>Error</source> <translation>错误</translation> </message> - <message> - <source>GB of free space available</source> - <translation>可用空间(GB)</translation> - </message> - <message> - <source>(of %1GB needed)</source> - <translation>(需要 %1GB)</translation> - </message> -</context> + </context> <context> <name>OpenURIDialog</name> <message> @@ -948,14 +924,6 @@ Address: %4 <translation>主要(&M)</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>可选的每 kB 交易费,这有助于您的交易被更快的处理。大多数交易都是 1 kB。</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>支付交易费用(&F)</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>登录系统后自动开启比特币客户端</translation> </message> @@ -984,14 +952,6 @@ Address: %4 <translation>允许流入连接</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>通过 SOCKS 代理连接到比特币网络。</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>通过 SO&CKS 代理连接 (默认代理):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>代理的 IP 地址 (例如 IPv4: 127.0.0.1 / IPv6: ::1)</translation> </message> @@ -1155,10 +1115,6 @@ Address: %4 <translation>现在显示的消息可能是过期的. 在连接上比特币网络节点后,您的钱包将自动与网络同步,但是这个过程还没有完成。</translation> </message> <message> - <source>Wallet</source> - <translation>钱包</translation> - </message> - <message> <source>Watch-only:</source> <translation>查看-只有:</translation> </message> @@ -1195,10 +1151,6 @@ Address: %4 <translation>您当前的总余额</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>最近交易记录</b></translation> - </message> - <message> <source>out of sync</source> <translation>数据同步中</translation> </message> @@ -1438,10 +1390,6 @@ Address: %4 <translation>服务</translation> </message> <message> - <source>Sync Node</source> - <translation>同步节点</translation> - </message> - <message> <source>Starting Height</source> <translation>开始高度</translation> </message> @@ -1570,14 +1518,6 @@ Address: %4 <translation>传出</translation> </message> <message> - <source>Yes</source> - <translation>是</translation> - </message> - <message> - <source>No</source> - <translation>否</translation> - </message> - <message> <source>Unknown</source> <translation>未知</translation> </message> @@ -2609,29 +2549,11 @@ Address: %4 </translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>指定配置文件 (默认为 bitcoin.conf) -</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>指定 pid 文件 (默认为 bitcoind.pid) -</translation> - </message> - <message> <source>Specify data directory</source> <translation>指定数据目录 </translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>监听端口连接 <port>(缺省: 8333 或测试网络: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>最大连接数 <n> (缺省: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>连接一个节点并获取对端地址,然后断开连接</translation> </message> @@ -2640,18 +2562,6 @@ Address: %4 <translation>指定您的公共地址</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>断开行为不端对端阀值(缺省: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>重新连接异常节点的秒数(缺省: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>JSON-RPC连接监听端口<port> (缺省:8332 testnet:18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>接受命令行和 JSON-RPC 命令 </translation> @@ -2696,18 +2606,10 @@ rpcpassword=%s </translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>可接受的密码(默认:TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>绑定指定的IP地址开始监听。IPv6地址请使用[host]:port 格式</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>自由交易不断的速率限制为<n>*1000 字节每分钟(默认值:15)</translation> - </message> - <message> <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source> <translation>进入回归测试模式,它采用一种特殊的可立即解决的区块链模拟情况。</translation> </message> @@ -2724,14 +2626,6 @@ rpcpassword=%s <translation>当最佳区块变化时执行命令 (命令行中的 %s 会被替换成区块哈希值)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>从缓冲池清理磁盘数据库活动日志每<n>兆字节 (默认值: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>如何有效的验证checkblocks区块(0-4, 默认值: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>在-genproclimit这种模式下控制产出多少区块</translation> </message> @@ -2740,10 +2634,6 @@ rpcpassword=%s <translation>设置脚本验证的程序 (%u 到 %d, 0 = 自动, <0 = 保留自由的核心, 默认值: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>设置处理器生成的限制 (-1 = 无限, 默认值: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>这是测试用的预发布版本 - 请谨慎使用 - 不要用来挖矿,或者在正式商用环境下使用</translation> </message> @@ -2752,10 +2642,6 @@ rpcpassword=%s <translation>无法 %s的绑定到电脑上,比特币核心钱包可能已经在运行。</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>连接至 Tor隐藏服务器时 使用不同的SOCKS5代理 (缺省: -proxy) </translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>警告:-paytxfee 交易费设置得太高了!每笔交易都将支付交易费。</translation> </message> @@ -2780,10 +2666,6 @@ rpcpassword=%s <translation>(默认值: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(默认: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> 可能是:</translation> </message> @@ -2812,10 +2694,6 @@ rpcpassword=%s <translation>调试/测试选项:</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>禁止使用安全模式,重新写入一个真正的安全模式日志(默认值: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>发现自己的IP地址(缺省:不带 -externalip 参数监听时设置为1)</translation> </message> @@ -2852,66 +2730,10 @@ rpcpassword=%s <translation>错误:钱包被锁定,无法创建交易!</translation> </message> <message> - <source>Error: system error: </source> - <translation>错误:系统出错。</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>监听端口失败。请使用 -listen=0 参数。</translation> </message> <message> - <source>Failed to read block info</source> - <translation>无法读取数据块信息</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>读取数据块失败</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>无法同步数据块索引</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>无法写入数据块索引</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>无法写入数据块信息</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>无法写数据块</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>无法写入文件信息</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>无法写入coin数据库</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>无法写入交易索引</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>无法写入回滚信息</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>强制安全模式(默认值: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>生成比特币(默认为 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>启动时检测多少个数据块(缺省:288,0=所有)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>如果<category>未提供,将输出所有调试信息。</translation> </message> @@ -2932,10 +2754,6 @@ rpcpassword=%s <translation>没有足够的文件描述符可用。</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>调试信息输出时,前面加上时间戳 (缺省: 1)</translation> - </message> - <message> <source>Rebuild block chain index from current blk000??.dat files</source> <translation>重新为当前的blk000??.dat文件建立索引</translation> </message> @@ -2948,18 +2766,10 @@ rpcpassword=%s <translation>设置最大区块大小 (默认: %d,单位字节)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>设置使用调用服务 RPC 的线程数量(默认:4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>指定钱包文件(数据目录内)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>付款时允许使用未确认的零钱 (缺省: 1)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>这是用于回归测试和应用开发目的。</translation> </message> @@ -2996,10 +2806,6 @@ rpcpassword=%s <translation>当收到相关提醒或者我们看到一个长分叉时执行命令(%s 将替换为消息)</translation> </message> <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>输出调试信息(默认为0,提供 <category> 是可选的)</translation> - </message> - <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> <translation>通过DNS查询每个地址,如果短地址 (默认值: 1 除非 -连接)</translation> </message> @@ -3008,10 +2814,6 @@ rpcpassword=%s <translation>设置 高优先级/低交易费 交易的最大字节 (缺省: %d)</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>始终通过 DNS 查询对等端地址 (默认: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>无法解析 -whitebind 地址: '%s'</translation> </message> @@ -3036,10 +2838,6 @@ rpcpassword=%s <translation>错误:发现了不支持的参数 -tor,请使用 -onion。</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>在调试输出中包含IP地址 (默认: 0)</translation> - </message> - <message> <source>Information</source> <translation>信息</translation> </message> @@ -3064,26 +2862,6 @@ rpcpassword=%s <translation>-whitelist: '%s' 指定的网络掩码无效</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>签名缓冲大小限制每<n> 条目 (默认值: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>开采区块时,日志优先级和手续费每KB (默认值: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>维护一份完整的交易索引(缺省:0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>每个连接的最大接收缓存,<n>*1000 字节(缺省:5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>每个连接的最大发送缓存,<n>*1000 字节(缺省:1000)</translation> - </message> - <message> <source>Need to specify a port with -whitebind: '%s'</source> <translation>-whitebind: '%s' 需要指定一个端口</translation> </message> @@ -3092,22 +2870,10 @@ rpcpassword=%s <translation>节点中继选项:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>仅接受符合客户端检查点设置的数据块文件</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>仅连接至指定网络的节点<net>(IPv4, IPv6 或者 Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>如果在搜索区块中找到,请启动打印区块</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>启动时打印区块树 (默认值: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL选项:(见有关比特币设置用于SSL说明的维基百科)</translation> </message> @@ -3124,26 +2890,10 @@ rpcpassword=%s <translation>随机每1个模拟测试<n>网络信息</translation> </message> <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>中转non-P2SH multisig (默认值: 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>运行一个程序,定时清理钱包 (默认值:1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>跟踪/调试信息输出到控制台,不输出到 debug.log 文件</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>设置最小数据块大小(缺省:0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>设置DB_PRIVATE钱包标志DB环境 (默认值: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>显示所有调试选项 (用法: --帮助 -帮助调试)</translation> </message> @@ -3156,14 +2906,6 @@ rpcpassword=%s <translation>签署交易失败</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>设置连接超时时间(缺省:5000毫秒)</translation> - </message> - <message> - <source>System error: </source> - <translation>系统错误:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>这是实验性的软件。</translation> </message> @@ -3184,10 +2926,6 @@ rpcpassword=%s <translation>无法在此计算机上绑定 %s (绑定返回错误 %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>使用UPnP映射监听端口 (缺省: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>使用UPnp映射监听端口(缺省: 监听状态设为1)</translation> </message> @@ -3241,11 +2979,6 @@ rpcpassword=%s <translation>将钱包升级到最新的格式</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>设置密钥池大小为 <n> (缺省: 100) -</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>重新扫描区块链以查找遗漏的钱包交易</translation> </message> @@ -3254,16 +2987,6 @@ rpcpassword=%s <translation>为 JSON-RPC 连接使用 OpenSSL (https) 连接</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>服务器证书 (默认为 server.cert) -</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>服务器私钥 (默认为 server.pem) -</translation> - </message> - <message> <source>This help message</source> <translation>本帮助信息 </translation> diff --git a/src/qt/locale/bitcoin_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts index dfdbb7d1da..7062377f45 100644 --- a/src/qt/locale/bitcoin_zh_HK.ts +++ b/src/qt/locale/bitcoin_zh_HK.ts @@ -1,4 +1,4 @@ -<TS language="zh_HK" version="2.1"> +<TS language="zh_HK" version="2.0"> <context> <name>AddressBookPage</name> </context> diff --git a/src/qt/locale/bitcoin_zh_TW.ts b/src/qt/locale/bitcoin_zh_TW.ts index 51c0780ab0..b70596d83a 100644 --- a/src/qt/locale/bitcoin_zh_TW.ts +++ b/src/qt/locale/bitcoin_zh_TW.ts @@ -1,4 +1,4 @@ -<TS language="zh_TW" version="2.1"> +<TS language="zh_TW" version="2.0"> <context> <name>AddressBookPage</name> <message> @@ -7,7 +7,7 @@ </message> <message> <source>Create a new address</source> - <translation>製造新的位址</translation> + <translation>新增新的位址</translation> </message> <message> <source>&New</source> @@ -391,10 +391,6 @@ <translation>分頁工具列</translation> </message> <message> - <source>[testnet]</source> - <translation>[testnet]</translation> - </message> - <message> <source>Bitcoin Core</source> <translation>位元幣核心</translation> </message> @@ -434,10 +430,6 @@ <source>No block source available...</source> <translation>沒有可用的區塊來源...</translation> </message> - <message> - <source>Processed %1 blocks of transaction history.</source> - <translation>已處理了 %1 個區塊的交易紀錄。</translation> - </message> <message numerus="yes"> <source>%n hour(s)</source> <translation><numerusform>%n 個小時</numerusform></translation> @@ -529,10 +521,6 @@ Address: %4 <context> <name>CoinControlDialog</name> <message> - <source>Coin Control Address Selection</source> - <translation>錢幣控制的位址選擇</translation> - </message> - <message> <source>Quantity:</source> <translation>數目:</translation> </message> @@ -581,10 +569,6 @@ Address: %4 <translation>金額</translation> </message> <message> - <source>Address</source> - <translation>位址</translation> - </message> - <message> <source>Date</source> <translation>日期</translation> </message> @@ -916,13 +900,13 @@ Address: %4 <source>Error</source> <translation>錯誤</translation> </message> - <message> - <source>GB of free space available</source> - <translation>GB 可用空間</translation> + <message numerus="yes"> + <source>%n GB of free space available</source> + <translation><numerusform>可用空間尚存 %n GB</numerusform></translation> </message> - <message> - <source>(of %1GB needed)</source> - <translation>(需要 %1GB)</translation> + <message numerus="yes"> + <source>(of %n GB needed)</source> + <translation><numerusform>(需要 %n GB)</numerusform></translation> </message> </context> <context> @@ -959,14 +943,6 @@ Address: %4 <translation>主要</translation> </message> <message> - <source>Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB.</source> - <translation>每一千位元組(kB)要付的交易手續費,如果有付可以加速網路處理你的交易。大部份交易資料的大小是 1 kB.</translation> - </message> - <message> - <source>Pay transaction &fee</source> - <translation>付交易手續費</translation> - </message> - <message> <source>Automatically start Bitcoin after logging in to the system.</source> <translation>在登入系統後自動啓動位元幣軟體。</translation> </message> @@ -995,14 +971,6 @@ Address: %4 <translation>接受外來連線</translation> </message> <message> - <source>Connect to the Bitcoin network through a SOCKS proxy.</source> - <translation>透過 SOCKS 代理伺服器來連線到位元幣網路。</translation> - </message> - <message> - <source>&Connect through SOCKS proxy (default proxy):</source> - <translation>透過 SOCKS 代理伺服器連線(預設代理伺服器):</translation> - </message> - <message> <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source> <translation>代理伺服器的網際網路位址(像是 IPv4 的 127.0.0.1 或 IPv6 的 ::1)</translation> </message> @@ -1166,10 +1134,6 @@ Address: %4 <translation>顯示的資訊可能是過期的。跟位元幣網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation> </message> <message> - <source>Wallet</source> - <translation>錢包</translation> - </message> - <message> <source>Watch-only:</source> <translation>只能看:</translation> </message> @@ -1198,6 +1162,10 @@ Address: %4 <translation>還沒成熟的開採金額</translation> </message> <message> + <source>Balances</source> + <translation>餘額</translation> + </message> + <message> <source>Total:</source> <translation>總金額:</translation> </message> @@ -1210,6 +1178,14 @@ Address: %4 <translation>所有只能看位址的目前餘額</translation> </message> <message> + <source>Spendable:</source> + <translation>可支配:</translation> + </message> + <message> + <source>Recent transactions</source> + <translation>最近的交易</translation> + </message> + <message> <source>Unconfirmed transactions to watch-only addresses</source> <translation>所有只能看位址還沒確認的交易</translation> </message> @@ -1222,10 +1198,6 @@ Address: %4 <translation>所有只能看位址的目前全部餘額</translation> </message> <message> - <source><b>Recent transactions</b></source> - <translation><b>最近交易</b></translation> - </message> - <message> <source>out of sync</source> <translation>還沒同步</translation> </message> @@ -1485,10 +1457,6 @@ Address: %4 <translation>服務</translation> </message> <message> - <source>Sync Node</source> - <translation>同步節點</translation> - </message> - <message> <source>Starting Height</source> <translation>起始高度</translation> </message> @@ -1617,14 +1585,6 @@ Address: %4 <translation>出去</translation> </message> <message> - <source>Yes</source> - <translation>是</translation> - </message> - <message> - <source>No</source> - <translation>否</translation> - </message> - <message> <source>Unknown</source> <translation>不明</translation> </message> @@ -2473,6 +2433,10 @@ Address: %4 <translation>開採所得</translation> </message> <message> + <source>watch-only</source> + <translation>只能看</translation> + </message> + <message> <source>(n/a)</source> <translation>(不適用)</translation> </message> @@ -2489,6 +2453,10 @@ Address: %4 <translation>交易的種類。</translation> </message> <message> + <source>Whether or not a watch-only address is involved in this transaction.</source> + <translation>不論如何有一個只能觀看的地只有參與這次的交易</translation> + </message> + <message> <source>Destination address of transaction.</source> <translation>交易的目的地位址。</translation> </message> @@ -2584,6 +2552,10 @@ Address: %4 <translation>匯出交易記錄</translation> </message> <message> + <source>Watch-only</source> + <translation>只能觀看的</translation> + </message> + <message> <source>Exporting Failed</source> <translation>匯出失敗</translation> </message> @@ -2699,26 +2671,10 @@ Address: %4 <translation>選項:</translation> </message> <message> - <source>Specify configuration file (default: bitcoin.conf)</source> - <translation>指定設定檔(預設值: bitcoin.conf)</translation> - </message> - <message> - <source>Specify pid file (default: bitcoind.pid)</source> - <translation>指定行程識別碼(PID)檔(預設值: bitcoind.pid)</translation> - </message> - <message> <source>Specify data directory</source> <translation>指定資料目錄</translation> </message> <message> - <source>Listen for connections on <port> (default: 8333 or testnet: 18333)</source> - <translation>在通訊埠 <port> 聽候連線(預設值: 8333, 或若是測試網路: 18333)</translation> - </message> - <message> - <source>Maintain at most <n> connections to peers (default: 125)</source> - <translation>維持連線節點數的上限為 <n> 個(預設值: 125)</translation> - </message> - <message> <source>Connect to a node to retrieve peer addresses, and disconnect</source> <translation>連線到某個節點來取得其它節點的位址,然後斷線</translation> </message> @@ -2727,18 +2683,6 @@ Address: %4 <translation>指定自己的公開位址</translation> </message> <message> - <source>Threshold for disconnecting misbehaving peers (default: 100)</source> - <translation>把異常節點斷線的臨界值(預設值: 100)</translation> - </message> - <message> - <source>Number of seconds to keep misbehaving peers from reconnecting (default: 86400)</source> - <translation>拒絕跟異常節點連線的秒數(預設值: 86400)</translation> - </message> - <message> - <source>Listen for JSON-RPC connections on <port> (default: 8332 or testnet: 18332)</source> - <translation>在通訊埠 <port> 聽候 JSON-RPC 連線(預設值: 8332, 或若是測試網路: 18332)</translation> - </message> - <message> <source>Accept command line and JSON-RPC commands</source> <translation>接受指令列和 JSON-RPC 指令 </translation> @@ -2780,18 +2724,10 @@ rpcpassword=%s alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> </message> <message> - <source>Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</source> - <translation>可接受的加密演算法 (預設值: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)</translation> - </message> - <message> <source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source> <translation>和指定的位址繫結,並且一直在指定位址聽候連線。IPv6 請用 [主機]:通訊埠 這種格式</translation> </message> <message> - <source>Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:15)</source> - <translation>對沒付手續費的交易持續限制一分鐘內最多只能有 <n> 千位元組 (預設值: 15)</translation> - </message> - <message> <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source> <translation>清掉錢包裡的所有交易,並且在下次啟動時,使用 -rescan 來從區塊鏈中復原回來。</translation> </message> @@ -2812,14 +2748,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>當錢包有交易改變時要執行的指令(指令中的 %s 會被取代成交易識別碼)</translation> </message> <message> - <source>Flush database activity from memory pool to disk log every <n> megabytes (default: 100)</source> - <translation>每當累積到 <n> 百萬位元組(MB)時,才將資料庫的變動從記憶體暫存池中寫進磁碟紀錄檔 (預設值: 100)</translation> - </message> - <message> - <source>How thorough the block verification of -checkblocks is (0-4, default: 3)</source> - <translation>使用 -checkblocks 檢查區塊的仔細程度 (0 到 4,預設值: 3)</translation> - </message> - <message> <source>In this mode -genproclimit controls how many blocks are generated immediately.</source> <translation>在這個運作模式下,-genproclimit 選項控制立刻產生出的區塊數目。</translation> </message> @@ -2828,10 +2756,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>設定指令碼驗證的執行緒數目 (%u 到 %d,0 表示程式自動決定,小於 0 表示保留處理器核心不用的數目,預設值: %d)</translation> </message> <message> - <source>Set the processor limit for when generation is on (-1 = unlimited, default: -1)</source> - <translation>當生產位元幣打開時,設定處理器使用數目限制 (-1 表示不限制,預設值: -1)</translation> - </message> - <message> <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source> <translation>這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或商業應用</translation> </message> @@ -2840,10 +2764,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>沒辦法繫結在這台電腦上的 %s 。位元幣核心可能已經在執行了。</translation> </message> <message> - <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)</source> - <translation>使用另外的 SOCK5 代理伺服器,來透過 Tor 隱藏服務跟節點聯繫(預設值: 同 -proxy)</translation> - </message> - <message> <source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source> <translation>警告: -paytxfee 設定了很高的金額!這可是你交易付款所要付的手續費。</translation> </message> @@ -2868,10 +2788,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>(預設值: 1)</translation> </message> <message> - <source>(default: wallet.dat)</source> - <translation>(預設值: wallet.dat)</translation> - </message> - <message> <source><category> can be:</source> <translation><category> 可以是:</translation> </message> @@ -2900,10 +2816,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>除錯與測試選項</translation> </message> <message> - <source>Disable safemode, override a real safe mode event (default: 0)</source> - <translation>不進入安全模式,用在真的發生需要進入安全模式的事件時,強制不進入 (預設值: 0)</translation> - </message> - <message> <source>Discover own IP address (default: 1 when listening and no -externalip)</source> <translation>找出自己的網際網路位址(預設值: 當有聽候連線且沒有 -externalip 時為 1)</translation> </message> @@ -2932,6 +2844,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>打開區塊資料庫時發生錯誤</translation> </message> <message> + <source>Error: A fatal internal error occured, see debug.log for details</source> + <translation>錯誤:一個致命的內部錯誤,到debug.log看更多細節</translation> + </message> + <message> <source>Error: Disk space is low!</source> <translation>錯誤: 磁碟空間很少!</translation> </message> @@ -2940,66 +2856,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>錯誤: 錢包被上鎖了,沒辦法製造新的交易!</translation> </message> <message> - <source>Error: system error: </source> - <translation>錯誤: 系統錯誤:</translation> - </message> - <message> <source>Failed to listen on any port. Use -listen=0 if you want this.</source> <translation>在任意的通訊埠聽候失敗。如果你希望這樣的話,可以設定 -listen=0.</translation> </message> <message> - <source>Failed to read block info</source> - <translation>讀取區塊資訊失敗</translation> - </message> - <message> - <source>Failed to read block</source> - <translation>讀取區塊失敗</translation> - </message> - <message> - <source>Failed to sync block index</source> - <translation>同步區塊索引失敗</translation> - </message> - <message> - <source>Failed to write block index</source> - <translation>把區塊索引寫進去失敗了</translation> - </message> - <message> - <source>Failed to write block info</source> - <translation>把區塊資訊寫進去失敗了</translation> - </message> - <message> - <source>Failed to write block</source> - <translation>把區塊資料寫進去失敗了</translation> - </message> - <message> - <source>Failed to write file info</source> - <translation>把檔案資訊寫進去失敗了</translation> - </message> - <message> - <source>Failed to write to coin database</source> - <translation>寫進錢幣資料庫失敗了</translation> - </message> - <message> - <source>Failed to write transaction index</source> - <translation>把交易索引寫進去失敗了</translation> - </message> - <message> - <source>Failed to write undo data</source> - <translation>把回復資料寫進去失敗了</translation> - </message> - <message> - <source>Force safe mode (default: 0)</source> - <translation>強制進入安全模式 (預設值: 0)</translation> - </message> - <message> - <source>Generate coins (default: 0)</source> - <translation>生產位元幣(預設值: 0)</translation> - </message> - <message> - <source>How many blocks to check at startup (default: 288, 0 = all)</source> - <translation>啓動時檢查的區塊數(預設值: 288, 指定 0 表示全部)</translation> - </message> - <message> <source>If <category> is not supplied, output all debugging information.</source> <translation>如果沒有提供 <category> 就會輸出所有的除錯資訊。</translation> </message> @@ -3020,8 +2880,8 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>檔案描述元不足。</translation> </message> <message> - <source>Prepend debug output with timestamp (default: 1)</source> - <translation>在除錯輸出內容前附加時間(預設值: 1)</translation> + <source>Only connect to nodes in network <net> (ipv4, ipv6 or onion)</source> + <translation>只有連接到網絡節點 <net> (IPv4,IPv6或onion)</translation> </message> <message> <source>Rebuild block chain index from current blk000??.dat files</source> @@ -3036,22 +2896,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>設定區塊大小上限成多少位元組(預設值: %d)</translation> </message> <message> - <source>Set the number of threads to service RPC calls (default: 4)</source> - <translation>設定處理 RPC 服務請求的執行緒數目(預設值: 4)</translation> - </message> - <message> <source>Specify wallet file (within data directory)</source> <translation>指定錢包檔(會在資料目錄中)</translation> </message> <message> - <source>Spend unconfirmed change when sending transactions (default: 1)</source> - <translation>傳送交易時可以花還沒確認的零錢(預設值: 1)</translation> - </message> - <message> - <source>Stop running after importing blocks from disk (default: 0)</source> - <translation>從磁碟匯入區塊資料後停止執行(預設值: 0)</translation> - </message> - <message> <source>This is intended for regression testing tools and app development.</source> <translation>這是設計用來給回歸測試工具和應用程式開發用的。</translation> </message> @@ -3080,10 +2928,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>從其它來源的 blk000??.dat 檔匯入區塊</translation> </message> <message> - <source>(default: 1, 1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source> - <translation>(預設值: 1。1 表示保留交易描述資料,像是帳戶使用者和付款請求資訊;2 表示丟掉交易描述資料)</translation> - </message> - <message> <source>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</source> <translation>允許指定的來源建立 JSON-RPC 連線。<ip> 的有效值可以是一個單獨位址(像是 1.2.3.4),一個網段/網段罩遮值(像是 1.2.3.4/255.255.255.0),或是網段/CIDR值(像是 1.2.3.4/24)。這個選項可以設定多次。</translation> </message> @@ -3108,10 +2952,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>用系統預設權限來造出新的檔案,而不是用使用者權限罩遮(umask)值 077 (只有在關掉錢包功能時才有作用)。</translation> </message> <message> - <source>Distributed under the MIT/X11 software license, see the accompanying file COPYING or <http://www.opensource.org/licenses/mit-license.php>.</source> - <translation>這套軟體是依據 MIT/X11 軟體授權條款散布,詳情請見附帶的 COPYING 檔案,或是以下網站: <http://www.opensource.org/licenses/mit-license.php>.</translation> - </message> - <message> <source>Error: Listening for incoming connections failed (listen returned error %s)</source> <translation>錯誤: 聽候外來連線失敗(回傳錯誤 %s)</translation> </message> @@ -3120,10 +2960,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>錯誤: 找到不再支援的 -socks 參數。現在只支援 SOCKS5 協定的代理伺服器了,因為不再能夠指定 SOCKS 協定版本。</translation> </message> <message> - <source>Execute command when a network tx respends wallet tx input (%s=respend TxID, %t=wallet TxID)</source> - <translation>當發現網路上有重複花用錢包裡的交易輸入時所要執行的指令(指令中的 %s 會被取代為重複花用的交易代碼,%t 會被取代為錢包中的交易代碼)</translation> - </message> - <message> <source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source> <translation>當收到相關警示,或發現相當長的分支時,所要執行的指令(指令中的 %s 會被取代成警示訊息)</translation> </message> @@ -3136,14 +2972,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>當製造交易時,如果每千位元組(Kb)的手續費比這個值低,就視為沒付手續費 (預設值: %s)</translation> </message> <message> - <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: 1)</source> - <translation>當沒有設定 paytxfee 時,自動包含可以讓交易能在平均 n 個區塊內確認的手續費 (預設值: 1)</translation> - </message> - <message> - <source>Output debugging information (default: 0, supplying <category> is optional)</source> - <translation>輸出除錯資訊(預設值: 0, 可以不指定 <category>)</translation> - </message> - <message> <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source> <translation>是否允許在節點位址數目不足時,使用域名查詢來搜尋節點 (預設值: 當沒用 -connect 時為 1)</translation> </message> @@ -3160,18 +2988,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>警告: 請檢查電腦日期和時間是否正確!位元幣核心沒辦法在時鐘不準的情況下正常運作。</translation> </message> <message> - <source>Whitelist peers connecting from the given netmask or ip. Can be specified multiple times.</source> - <translation>把來自指定網域或位址的節點放進白名單。這個選項可以設定多次。</translation> - </message> - <message> <source>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</source> <translation>在白名單中的節點不會因為偵測到阻斷服務攻擊而被停用。來自這些節點的交易也一定會被轉發,即使說交易本來就在記憶池裡了也一樣。適用於像是閘道伺服器。</translation> </message> <message> - <source>Always query for peer addresses via DNS lookup (default: 0)</source> - <translation>是否一定要用域名查詢來搜尋節點 (預設值: 0)</translation> - </message> - <message> <source>Cannot resolve -whitebind address: '%s'</source> <translation>沒辦法解析 -whitebind 指定的位址: '%s'</translation> </message> @@ -3200,10 +3020,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>交易付款時每千位元組(kB)的交易手續費 (預設值: %s)</translation> </message> <message> - <source>Include IP addresses in debug output (default: 0)</source> - <translation>在除錯輸出內容中包含網際網路位址(預設值: 0)</translation> - </message> - <message> <source>Information</source> <translation>資訊</translation> </message> @@ -3232,24 +3048,8 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>在記憶體中保存最多 <n> 個不和其他區塊相連結的區塊(預設值 : %u)</translation> </message> <message> - <source>Limit size of signature cache to <n> entries (default: 50000)</source> - <translation>限制簽章快取大小為 <n> 筆 (預設值: 50000)</translation> - </message> - <message> - <source>Log transaction priority and fee per kB when mining blocks (default: 0)</source> - <translation>開採區塊的時候紀錄交易的優先度以及每千位元組(kB)的手續費 (預設值: 0)</translation> - </message> - <message> - <source>Maintain a full transaction index (default: 0)</source> - <translation>維護全部交易的索引(預設值: 0)</translation> - </message> - <message> - <source>Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)</source> - <translation>每個連線的接收緩衝區大小上限為 <n>*1000 個位元組(預設值: 5000)</translation> - </message> - <message> - <source>Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)</source> - <translation>每個連線的傳送緩衝區大小上限為 <n>*1000 位元組(預設值: 1000)</translation> + <source>Keep at most <n> unconnectable transactions in memory (default: %u)</source> + <translation>保持最多 <n> 無法連結的交易在記憶體 (預設: %u)</translation> </message> <message> <source>Need to specify a port with -whitebind: '%s'</source> @@ -3260,22 +3060,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>節點轉發選項:</translation> </message> <message> - <source>Only accept block chain matching built-in checkpoints (default: 1)</source> - <translation>只接受跟內建的檢查段點吻合的區塊鏈(預設值: 1)</translation> - </message> - <message> - <source>Only connect to nodes in network <net> (IPv4, IPv6 or Tor)</source> - <translation>只和 <net> 網路上的節點連線(IPv4, IPv6, 或 Tor)</translation> - </message> - <message> <source>Print block on startup, if found in block index</source> <translation>啟動時輸出指定的區塊內容,如果有在區塊索引中找到的話</translation> </message> <message> - <source>Print block tree on startup (default: 0)</source> - <translation>啟動時輸出區塊樹 (預設值: 0)</translation> - </message> - <message> <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source> <translation>RPC SSL 選項: (SSL 設定程序請見 Bitcoin Wiki)</translation> </message> @@ -3292,30 +3080,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>隨機亂動 <n> 分之一的網路訊息裡的資料</translation> </message> <message> - <source>Relay and mine data carrier transactions (default: 1)</source> - <translation>允許轉發和開採只帶資料的交易 (預設值: 1)</translation> - </message> - <message> - <source>Relay non-P2SH multisig (default: 1)</source> - <translation>允許轉發非 P2SH 的多簽章交易 (預設值: 1)</translation> - </message> - <message> - <source>Run a thread to flush wallet periodically (default: 1)</source> - <translation>啟用定期將變動寫入錢包檔的執行緒 (預設值: 1)</translation> - </message> - <message> <source>Send trace/debug info to console instead of debug.log file</source> <translation>在終端機顯示追蹤或除錯資訊,而不是寫到檔案 debug.log 中</translation> </message> <message> - <source>Set minimum block size in bytes (default: 0)</source> - <translation>設定區塊大小下限成多少位元組(預設值: 0)</translation> - </message> - <message> - <source>Sets the DB_PRIVATE flag in the wallet db environment (default: 1)</source> - <translation>在錢包資料庫環境變數設定 DB_PRIVATE 旗標 (預設值: 1)</translation> - </message> - <message> <source>Show all debugging options (usage: --help -help-debug)</source> <translation>顯示所有的除錯選項 (用法: --help --help-debug)</translation> </message> @@ -3328,14 +3096,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>簽署交易失敗</translation> </message> <message> - <source>Specify connection timeout in milliseconds (default: 5000)</source> - <translation>指定連線在幾毫秒後逾時(預設值: 5000)</translation> - </message> - <message> - <source>System error: </source> - <translation>系統錯誤:</translation> - </message> - <message> <source>This is experimental software.</source> <translation>這套軟體屬於實驗性質。</translation> </message> @@ -3356,10 +3116,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>無法和這台電腦上的 %s 繫結(回傳錯誤 %s)</translation> </message> <message> - <source>Use UPnP to map the listening port (default: 0)</source> - <translation>是否要使用「通用即插即用」協定(UPnP),來設定聽候連線的通訊埠的對應(預設值: 0)</translation> - </message> - <message> <source>Use UPnP to map the listening port (default: 1 when listening)</source> <translation>是否要使用「通用即插即用」協定(UPnP),來設定聽候連線的通訊埠的對應(預設值: 當有聽候連線時為 1)</translation> </message> @@ -3412,10 +3168,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>把錢包檔案升級成最新的格式</translation> </message> <message> - <source>Set key pool size to <n> (default: 100)</source> - <translation>設定密鑰池大小成 <n> (預設值: 100)</translation> - </message> - <message> <source>Rescan the block chain for missing wallet transactions</source> <translation>重新掃描區塊鏈,來尋找錢包可能漏掉的交易。</translation> </message> @@ -3424,14 +3176,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation> <translation>在 JSON-RPC 連線使用 OpenSSL (https)</translation> </message> <message> - <source>Server certificate file (default: server.cert)</source> - <translation>伺服器憑證檔(預設值: server.cert)</translation> - </message> - <message> - <source>Server private key (default: server.pem)</source> - <translation>伺服器私鑰檔(預設值: server.pem)</translation> - </message> - <message> <source>This help message</source> <translation>這些說明訊息</translation> </message> diff --git a/src/qt/macdockiconhandler.h b/src/qt/macdockiconhandler.h index b21a61cb07..1ffab75c9a 100644 --- a/src/qt/macdockiconhandler.h +++ b/src/qt/macdockiconhandler.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef MACDOCKICONHANDLER_H -#define MACDOCKICONHANDLER_H +#ifndef BITCOIN_QT_MACDOCKICONHANDLER_H +#define BITCOIN_QT_MACDOCKICONHANDLER_H #include <QMainWindow> #include <QObject> @@ -48,4 +48,4 @@ private: QMainWindow *mainWindow; }; -#endif // MACDOCKICONCLICKHANDLER_H +#endif // BITCOIN_QT_MACDOCKICONHANDLER_H diff --git a/src/qt/macnotificationhandler.h b/src/qt/macnotificationhandler.h index bc335edede..f7a4cb7f5b 100644 --- a/src/qt/macnotificationhandler.h +++ b/src/qt/macnotificationhandler.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef MACNOTIFICATIONHANDLER_H -#define MACNOTIFICATIONHANDLER_H +#ifndef BITCOIN_QT_MACNOTIFICATIONHANDLER_H +#define BITCOIN_QT_MACNOTIFICATIONHANDLER_H #include <QObject> @@ -27,4 +27,4 @@ public: }; -#endif // MACNOTIFICATIONHANDLER_H +#endif // BITCOIN_QT_MACNOTIFICATIONHANDLER_H diff --git a/src/qt/macnotificationhandler.mm b/src/qt/macnotificationhandler.mm index 8a4c94cc5c..aa50a0d9fb 100644 --- a/src/qt/macnotificationhandler.mm +++ b/src/qt/macnotificationhandler.mm @@ -5,8 +5,21 @@ #include "macnotificationhandler.h" #undef slots +#import <objc/runtime.h> #include <Cocoa/Cocoa.h> +// Add an obj-c category (extension) to return the expected bundle identifier +@implementation NSBundle(returnCorrectIdentifier) +- (NSString *)__bundleIdentifier +{ + if (self == [NSBundle mainBundle]) { + return @"org.bitcoinfoundation.Bitcoin-Qt"; + } else { + return [self __bundleIdentifier]; + } +} +@end + void MacNotificationHandler::showNotification(const QString &title, const QString &text) { // check if users OS has support for NSUserNotification @@ -63,7 +76,16 @@ bool MacNotificationHandler::hasUserNotificationCenterSupport(void) MacNotificationHandler *MacNotificationHandler::instance() { static MacNotificationHandler *s_instance = NULL; - if (!s_instance) + if (!s_instance) { s_instance = new MacNotificationHandler(); + + Class aPossibleClass = objc_getClass("NSBundle"); + if (aPossibleClass) { + // change NSBundle -bundleIdentifier method to return a correct bundle identifier + // a bundle identifier is required to use OSXs User Notification Center + method_exchangeImplementations(class_getInstanceMethod(aPossibleClass, @selector(bundleIdentifier)), + class_getInstanceMethod(aPossibleClass, @selector(__bundleIdentifier))); + } + } return s_instance; } diff --git a/src/qt/networkstyle.h b/src/qt/networkstyle.h index 99304d61a3..e49b86c950 100644 --- a/src/qt/networkstyle.h +++ b/src/qt/networkstyle.h @@ -2,8 +2,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_NETWORKSTYLE -#define H_NETWORKSTYLE +#ifndef BITCOIN_QT_NETWORKSTYLE_H +#define BITCOIN_QT_NETWORKSTYLE_H #include <QIcon> #include <QPixmap> @@ -30,4 +30,4 @@ private: QPixmap splashImage; }; -#endif // H_NETWORKSTYLE +#endif // BITCOIN_QT_NETWORKSTYLE_H diff --git a/src/qt/notificator.h b/src/qt/notificator.h index 3395e64350..61c27e7ff8 100644 --- a/src/qt/notificator.h +++ b/src/qt/notificator.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef NOTIFICATOR_H -#define NOTIFICATOR_H +#ifndef BITCOIN_QT_NOTIFICATOR_H +#define BITCOIN_QT_NOTIFICATOR_H #if defined(HAVE_CONFIG_H) #include "config/bitcoin-config.h" @@ -77,4 +77,4 @@ private: #endif }; -#endif // NOTIFICATOR_H +#endif // BITCOIN_QT_NOTIFICATOR_H diff --git a/src/qt/openuridialog.h b/src/qt/openuridialog.h index 67a5f167d1..f04ec71b32 100644 --- a/src/qt/openuridialog.h +++ b/src/qt/openuridialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef OPENURIDIALOG_H -#define OPENURIDIALOG_H +#ifndef BITCOIN_QT_OPENURIDIALOG_H +#define BITCOIN_QT_OPENURIDIALOG_H #include <QDialog> @@ -31,4 +31,4 @@ private: Ui::OpenURIDialog *ui; }; -#endif // OPENURIDIALOG_H +#endif // BITCOIN_QT_OPENURIDIALOG_H diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 67be174d55..069080219e 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -30,7 +30,7 @@ #include <QMessageBox> #include <QTimer> -OptionsDialog::OptionsDialog(QWidget *parent) : +OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) : QDialog(parent), ui(new Ui::OptionsDialog), model(0), @@ -66,6 +66,11 @@ OptionsDialog::OptionsDialog(QWidget *parent) : ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabWindow)); #endif + /* remove Wallet tab in case of -disablewallet */ + if (!enableWallet) { + ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabWallet)); + } + /* Display elements init */ QDir translations(":translations"); ui->lang->addItem(QString("(") + tr("default") + QString(")"), QVariant("")); @@ -100,9 +105,6 @@ OptionsDialog::OptionsDialog(QWidget *parent) : #endif ui->unit->setModel(new BitcoinUnits(this)); -#ifdef ENABLE_WALLET - ui->transactionFee->setSingleStep(CWallet::minTxFee.GetFeePerK()); -#endif /* Widget-to-option mapper */ mapper = new QDataWidgetMapper(this); @@ -134,16 +136,11 @@ void OptionsDialog::setModel(OptionsModel *model) strLabel = tr("none"); ui->overriddenByCommandLineLabel->setText(strLabel); - connect(model, SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit())); - mapper->setModel(model); setMapper(); mapper->toFirst(); } - /* update the display unit, to not use the default ("BTC") */ - updateDisplayUnit(); - /* warn when one of the following settings changes by user action (placed here so init via mapper doesn't trigger them) */ /* Main */ @@ -167,7 +164,6 @@ void OptionsDialog::setMapper() mapper->addMapping(ui->databaseCache, OptionsModel::DatabaseCache); /* Wallet */ - mapper->addMapping(ui->transactionFee, OptionsModel::Fee); mapper->addMapping(ui->spendZeroConfChange, OptionsModel::SpendZeroConfChange); mapper->addMapping(ui->coinControlFeatures, OptionsModel::CoinControlFeatures); @@ -259,15 +255,6 @@ void OptionsDialog::clearStatusLabel() ui->statusLabel->clear(); } -void OptionsDialog::updateDisplayUnit() -{ - if(model) - { - /* Update transactionFee with the current unit */ - ui->transactionFee->setDisplayUnit(model->getDisplayUnit()); - } -} - void OptionsDialog::doProxyIpChecks(QValidatedLineEdit *pUiProxyIp, int nProxyPort) { Q_UNUSED(nProxyPort); diff --git a/src/qt/optionsdialog.h b/src/qt/optionsdialog.h index 39c53f4391..511719f53c 100644 --- a/src/qt/optionsdialog.h +++ b/src/qt/optionsdialog.h @@ -2,15 +2,18 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef OPTIONSDIALOG_H -#define OPTIONSDIALOG_H +#ifndef BITCOIN_QT_OPTIONSDIALOG_H +#define BITCOIN_QT_OPTIONSDIALOG_H #include <QDialog> -class QDataWidgetMapper; class OptionsModel; class QValidatedLineEdit; +QT_BEGIN_NAMESPACE +class QDataWidgetMapper; +QT_END_NAMESPACE + namespace Ui { class OptionsDialog; } @@ -21,7 +24,7 @@ class OptionsDialog : public QDialog Q_OBJECT public: - explicit OptionsDialog(QWidget *parent); + explicit OptionsDialog(QWidget *parent, bool enableWallet); ~OptionsDialog(); void setModel(OptionsModel *model); @@ -43,7 +46,6 @@ private slots: void showRestartWarning(bool fPersistent = false); void clearStatusLabel(); - void updateDisplayUnit(); void doProxyIpChecks(QValidatedLineEdit *pUiProxyIp, int nProxyPort); signals: @@ -56,4 +58,4 @@ private: bool fProxyIpValid; }; -#endif // OPTIONSDIALOG_H +#endif // BITCOIN_QT_OPTIONSDIALOG_H diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index c941ebd4ca..7054509fe6 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -90,12 +90,6 @@ void OptionsModel::Init() // Wallet #ifdef ENABLE_WALLET - if (!settings.contains("nTransactionFee")) - settings.setValue("nTransactionFee", (qint64)DEFAULT_TRANSACTION_FEE); - payTxFee = CFeeRate(settings.value("nTransactionFee").toLongLong()); // if -paytxfee is set, this will be overridden later in init.cpp - if (mapArgs.count("-paytxfee")) - addOverriddenOption("-paytxfee"); - if (!settings.contains("bSpendZeroConfChange")) settings.setValue("bSpendZeroConfChange", true); if (!SoftSetBoolArg("-spendzeroconfchange", settings.value("bSpendZeroConfChange").toBool())) @@ -185,16 +179,6 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const } #ifdef ENABLE_WALLET - case Fee: { - // Attention: Init() is called before payTxFee is set in AppInit2()! - // To ensure we can change the fee on-the-fly update our QSetting when - // opening OptionsDialog, which queries Fee via the mapper. - if (!(payTxFee == CFeeRate(settings.value("nTransactionFee").toLongLong(), 1000))) - settings.setValue("nTransactionFee", (qint64)payTxFee.GetFeePerK()); - // Todo: Consider to revert back to use just payTxFee here, if we don't want - // -paytxfee to update our QSettings! - return settings.value("nTransactionFee"); - } case SpendZeroConfChange: return settings.value("bSpendZeroConfChange"); #endif @@ -276,14 +260,6 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in } break; #ifdef ENABLE_WALLET - case Fee: { // core option - can be changed on-the-fly - // Todo: Add is valid check and warn via message, if not - CAmount nTransactionFee(value.toLongLong()); - payTxFee = CFeeRate(nTransactionFee, 1000); - settings.setValue("nTransactionFee", qint64(nTransactionFee)); - emit transactionFeeChanged(nTransactionFee); - break; - } case SpendZeroConfChange: if (settings.value("bSpendZeroConfChange") != value) { settings.setValue("bSpendZeroConfChange", value); diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 42ea3bf8e5..84fd49a7b8 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef OPTIONSMODEL_H -#define OPTIONSMODEL_H +#ifndef BITCOIN_QT_OPTIONSMODEL_H +#define BITCOIN_QT_OPTIONSMODEL_H #include "amount.h" @@ -34,7 +34,6 @@ public: ProxyUse, // bool ProxyIP, // QString ProxyPort, // int - Fee, // qint64 DisplayUnit, // BitcoinUnits::Unit ThirdPartyTxUrls, // QString Language, // QString @@ -84,8 +83,7 @@ private: signals: void displayUnitChanged(int unit); - void transactionFeeChanged(const CAmount&); void coinControlFeaturesChanged(bool); }; -#endif // OPTIONSMODEL_H +#endif // BITCOIN_QT_OPTIONSMODEL_H diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h index 03f239008f..e889eae8be 100644 --- a/src/qt/overviewpage.h +++ b/src/qt/overviewpage.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef OVERVIEWPAGE_H -#define OVERVIEWPAGE_H +#ifndef BITCOIN_QT_OVERVIEWPAGE_H +#define BITCOIN_QT_OVERVIEWPAGE_H #include "amount.h" @@ -63,4 +63,4 @@ private slots: void updateWatchOnlyLabels(bool showWatchOnly); }; -#endif // OVERVIEWPAGE_H +#endif // BITCOIN_QT_OVERVIEWPAGE_H diff --git a/src/qt/paymentrequestplus.h b/src/qt/paymentrequestplus.h index 3d94d93269..91c704c520 100644 --- a/src/qt/paymentrequestplus.h +++ b/src/qt/paymentrequestplus.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef PAYMENTREQUESTPLUS_H -#define PAYMENTREQUESTPLUS_H +#ifndef BITCOIN_QT_PAYMENTREQUESTPLUS_H +#define BITCOIN_QT_PAYMENTREQUESTPLUS_H #include "paymentrequest.pb.h" @@ -42,5 +42,4 @@ private: payments::PaymentDetails details; }; -#endif // PAYMENTREQUESTPLUS_H - +#endif // BITCOIN_QT_PAYMENTREQUESTPLUS_H diff --git a/src/qt/paymentserver.h b/src/qt/paymentserver.h index d84d09c57d..25b08cde49 100644 --- a/src/qt/paymentserver.h +++ b/src/qt/paymentserver.h @@ -2,8 +2,9 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef PAYMENTSERVER_H -#define PAYMENTSERVER_H +#ifndef BITCOIN_QT_PAYMENTSERVER_H +#define BITCOIN_QT_PAYMENTSERVER_H + // This class handles payment requests from clicking on // bitcoin: URIs // @@ -135,4 +136,4 @@ private: OptionsModel *optionsModel; }; -#endif // PAYMENTSERVER_H +#endif // BITCOIN_QT_PAYMENTSERVER_H diff --git a/src/qt/peertablemodel.h b/src/qt/peertablemodel.h index 38f2662f89..23e71fc685 100644 --- a/src/qt/peertablemodel.h +++ b/src/qt/peertablemodel.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef PEERTABLEMODEL_H -#define PEERTABLEMODEL_H +#ifndef BITCOIN_QT_PEERTABLEMODEL_H +#define BITCOIN_QT_PEERTABLEMODEL_H #include "main.h" #include "net.h" @@ -78,4 +78,4 @@ private: QTimer *timer; }; -#endif // PEERTABLEMODEL_H +#endif // BITCOIN_QT_PEERTABLEMODEL_H diff --git a/src/qt/qvalidatedlineedit.h b/src/qt/qvalidatedlineedit.h index c2a4817e65..0996164b0f 100644 --- a/src/qt/qvalidatedlineedit.h +++ b/src/qt/qvalidatedlineedit.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef QVALIDATEDLINEEDIT_H -#define QVALIDATEDLINEEDIT_H +#ifndef BITCOIN_QT_QVALIDATEDLINEEDIT_H +#define BITCOIN_QT_QVALIDATEDLINEEDIT_H #include <QLineEdit> @@ -36,4 +36,4 @@ private slots: void checkValidity(); }; -#endif // QVALIDATEDLINEEDIT_H +#endif // BITCOIN_QT_QVALIDATEDLINEEDIT_H diff --git a/src/qt/qvaluecombobox.h b/src/qt/qvaluecombobox.h index 5f2182913c..821f41716b 100644 --- a/src/qt/qvaluecombobox.h +++ b/src/qt/qvaluecombobox.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef QVALUECOMBOBOX_H -#define QVALUECOMBOBOX_H +#ifndef BITCOIN_QT_QVALUECOMBOBOX_H +#define BITCOIN_QT_QVALUECOMBOBOX_H #include <QComboBox> #include <QVariant> @@ -34,4 +34,4 @@ private slots: void handleSelectionChanged(int idx); }; -#endif // QVALUECOMBOBOX_H +#endif // BITCOIN_QT_QVALUECOMBOBOX_H diff --git a/src/qt/receivecoinsdialog.h b/src/qt/receivecoinsdialog.h index 7a7e38e25e..220fb5c7a8 100644 --- a/src/qt/receivecoinsdialog.h +++ b/src/qt/receivecoinsdialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef RECEIVECOINSDIALOG_H -#define RECEIVECOINSDIALOG_H +#ifndef BITCOIN_QT_RECEIVECOINSDIALOG_H +#define BITCOIN_QT_RECEIVECOINSDIALOG_H #include "guiutil.h" @@ -73,4 +73,4 @@ private slots: void copyAmount(); }; -#endif // RECEIVECOINSDIALOG_H +#endif // BITCOIN_QT_RECEIVECOINSDIALOG_H diff --git a/src/qt/receiverequestdialog.h b/src/qt/receiverequestdialog.h index 9b78e495c3..6f3b9838e2 100644 --- a/src/qt/receiverequestdialog.h +++ b/src/qt/receiverequestdialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef QRCODEDIALOG_H -#define QRCODEDIALOG_H +#ifndef BITCOIN_QT_RECEIVEREQUESTDIALOG_H +#define BITCOIN_QT_RECEIVEREQUESTDIALOG_H #include "walletmodel.h" @@ -67,4 +67,4 @@ private: SendCoinsRecipient info; }; -#endif // QRCODEDIALOG_H +#endif // BITCOIN_QT_RECEIVEREQUESTDIALOG_H diff --git a/src/qt/recentrequeststablemodel.cpp b/src/qt/recentrequeststablemodel.cpp index 5deac8007c..5533adab8b 100644 --- a/src/qt/recentrequeststablemodel.cpp +++ b/src/qt/recentrequeststablemodel.cpp @@ -5,6 +5,7 @@ #include "recentrequeststablemodel.h" #include "bitcoinunits.h" +#include "clientversion.h" #include "guiutil.h" #include "optionsmodel.h" #include "streams.h" diff --git a/src/qt/recentrequeststablemodel.h b/src/qt/recentrequeststablemodel.h index 3df5971823..ec6a49070d 100644 --- a/src/qt/recentrequeststablemodel.h +++ b/src/qt/recentrequeststablemodel.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef RECENTREQUESTSTABLEMODEL_H -#define RECENTREQUESTSTABLEMODEL_H +#ifndef BITCOIN_QT_RECENTREQUESTSTABLEMODEL_H +#define BITCOIN_QT_RECENTREQUESTSTABLEMODEL_H #include "walletmodel.h" @@ -105,4 +105,4 @@ private: QString getAmountTitle(); }; -#endif +#endif // BITCOIN_QT_RECENTREQUESTSTABLEMODEL_H diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h index 1ffff92758..4bb9b62e93 100644 --- a/src/qt/rpcconsole.h +++ b/src/qt/rpcconsole.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef RPCCONSOLE_H -#define RPCCONSOLE_H +#ifndef BITCOIN_QT_RPCCONSOLE_H +#define BITCOIN_QT_RPCCONSOLE_H #include "guiutil.h" #include "peertablemodel.h" @@ -100,4 +100,4 @@ private: NodeId cachedNodeid; }; -#endif // RPCCONSOLE_H +#endif // BITCOIN_QT_RPCCONSOLE_H diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index ce94131cce..46eb58ca43 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -7,6 +7,7 @@ #include "addresstablemodel.h" #include "bitcoinunits.h" +#include "clientmodel.h" #include "coincontroldialog.h" #include "guiutil.h" #include "optionsmodel.h" @@ -16,15 +17,20 @@ #include "base58.h" #include "coincontrol.h" #include "ui_interface.h" +#include "wallet.h" #include <QMessageBox> #include <QScrollBar> +#include <QSettings> #include <QTextDocument> SendCoinsDialog::SendCoinsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SendCoinsDialog), - model(0) + clientModel(0), + model(0), + fNewRecipientAllowed(true), + fFeeMinimized(true) { ui->setupUi(this); @@ -72,7 +78,46 @@ SendCoinsDialog::SendCoinsDialog(QWidget *parent) : ui->labelCoinControlLowOutput->addAction(clipboardLowOutputAction); ui->labelCoinControlChange->addAction(clipboardChangeAction); - fNewRecipientAllowed = true; + // init transaction fee section + QSettings settings; + if (!settings.contains("fFeeSectionMinimized")) + settings.setValue("fFeeSectionMinimized", true); + if (!settings.contains("nFeeRadio") && settings.contains("nTransactionFee") && settings.value("nTransactionFee").toLongLong() > 0) // compatibility + settings.setValue("nFeeRadio", 1); // custom + if (!settings.contains("nFeeRadio")) + settings.setValue("nFeeRadio", 0); // recommended + if (!settings.contains("nCustomFeeRadio") && settings.contains("nTransactionFee") && settings.value("nTransactionFee").toLongLong() > 0) // compatibility + settings.setValue("nCustomFeeRadio", 1); // total at least + if (!settings.contains("nCustomFeeRadio")) + settings.setValue("nCustomFeeRadio", 0); // per kilobyte + if (!settings.contains("nSmartFeeSliderPosition")) + settings.setValue("nSmartFeeSliderPosition", 0); + if (!settings.contains("nTransactionFee")) + settings.setValue("nTransactionFee", (qint64)DEFAULT_TRANSACTION_FEE); + if (!settings.contains("fPayOnlyMinFee")) + settings.setValue("fPayOnlyMinFee", false); + if (!settings.contains("fSendFreeTransactions")) + settings.setValue("fSendFreeTransactions", false); + ui->groupFee->setId(ui->radioSmartFee, 0); + ui->groupFee->setId(ui->radioCustomFee, 1); + ui->groupFee->button((int)std::max(0, std::min(1, settings.value("nFeeRadio").toInt())))->setChecked(true); + ui->groupCustomFee->setId(ui->radioCustomPerKilobyte, 0); + ui->groupCustomFee->setId(ui->radioCustomAtLeast, 1); + ui->groupCustomFee->button((int)std::max(0, std::min(1, settings.value("nCustomFeeRadio").toInt())))->setChecked(true); + ui->sliderSmartFee->setValue(settings.value("nSmartFeeSliderPosition").toInt()); + ui->customFee->setValue(settings.value("nTransactionFee").toLongLong()); + ui->checkBoxMinimumFee->setChecked(settings.value("fPayOnlyMinFee").toBool()); + ui->checkBoxFreeTx->setChecked(settings.value("fSendFreeTransactions").toBool()); + minimizeFeeSection(settings.value("fFeeSectionMinimized").toBool()); +} + +void SendCoinsDialog::setClientModel(ClientModel *clientModel) +{ + this->clientModel = clientModel; + + if (clientModel) { + connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(updateSmartFeeLabel())); + } } void SendCoinsDialog::setModel(WalletModel *model) @@ -94,18 +139,50 @@ void SendCoinsDialog::setModel(WalletModel *model) model->getWatchBalance(), model->getWatchUnconfirmedBalance(), model->getWatchImmatureBalance()); connect(model, SIGNAL(balanceChanged(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)), this, SLOT(setBalance(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount))); connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit())); + updateDisplayUnit(); // Coin Control connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(coinControlUpdateLabels())); connect(model->getOptionsModel(), SIGNAL(coinControlFeaturesChanged(bool)), this, SLOT(coinControlFeatureChanged(bool))); - connect(model->getOptionsModel(), SIGNAL(transactionFeeChanged(CAmount)), this, SLOT(coinControlUpdateLabels())); ui->frameCoinControl->setVisible(model->getOptionsModel()->getCoinControlFeatures()); coinControlUpdateLabels(); + + // fee section + connect(ui->sliderSmartFee, SIGNAL(valueChanged(int)), this, SLOT(updateSmartFeeLabel())); + connect(ui->sliderSmartFee, SIGNAL(valueChanged(int)), this, SLOT(updateGlobalFeeVariables())); + connect(ui->sliderSmartFee, SIGNAL(valueChanged(int)), this, SLOT(coinControlUpdateLabels())); + connect(ui->groupFee, SIGNAL(buttonClicked(int)), this, SLOT(updateFeeSectionControls())); + connect(ui->groupFee, SIGNAL(buttonClicked(int)), this, SLOT(updateGlobalFeeVariables())); + connect(ui->groupFee, SIGNAL(buttonClicked(int)), this, SLOT(coinControlUpdateLabels())); + connect(ui->groupCustomFee, SIGNAL(buttonClicked(int)), this, SLOT(updateGlobalFeeVariables())); + connect(ui->groupCustomFee, SIGNAL(buttonClicked(int)), this, SLOT(coinControlUpdateLabels())); + connect(ui->customFee, SIGNAL(valueChanged()), this, SLOT(updateGlobalFeeVariables())); + connect(ui->customFee, SIGNAL(valueChanged()), this, SLOT(coinControlUpdateLabels())); + connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(setMinimumFee())); + connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(updateFeeSectionControls())); + connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(updateGlobalFeeVariables())); + connect(ui->checkBoxMinimumFee, SIGNAL(stateChanged(int)), this, SLOT(coinControlUpdateLabels())); + connect(ui->checkBoxFreeTx, SIGNAL(stateChanged(int)), this, SLOT(updateGlobalFeeVariables())); + connect(ui->checkBoxFreeTx, SIGNAL(stateChanged(int)), this, SLOT(coinControlUpdateLabels())); + ui->customFee->setSingleStep(CWallet::minTxFee.GetFeePerK()); + updateFeeSectionControls(); + updateMinFeeLabel(); + updateSmartFeeLabel(); + updateGlobalFeeVariables(); } } SendCoinsDialog::~SendCoinsDialog() { + QSettings settings; + settings.setValue("fFeeSectionMinimized", fFeeMinimized); + settings.setValue("nFeeRadio", ui->groupFee->checkedId()); + settings.setValue("nCustomFeeRadio", ui->groupCustomFee->checkedId()); + settings.setValue("nSmartFeeSliderPosition", ui->sliderSmartFee->value()); + settings.setValue("nTransactionFee", (qint64)ui->customFee->value()); + settings.setValue("fPayOnlyMinFee", ui->checkBoxMinimumFee->isChecked()); + settings.setValue("fSendFreeTransactions", ui->checkBoxFreeTx->isChecked()); + delete ui; } @@ -214,6 +291,9 @@ void SendCoinsDialog::on_sendButton_clicked() questionString.append(BitcoinUnits::formatHtmlWithUnit(model->getOptionsModel()->getDisplayUnit(), txFee)); questionString.append("</span> "); questionString.append(tr("added as transaction fee")); + + // append transaction size + questionString.append(" (" + QString::number((double)currentTransaction.getTransactionSize() / 1000) + " kB)"); } // add total amount in all subdivision units @@ -384,7 +464,7 @@ bool SendCoinsDialog::handlePaymentRequest(const SendCoinsRecipient &rv) return true; } -void SendCoinsDialog::setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, +void SendCoinsDialog::setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& watchBalance, const CAmount& watchUnconfirmedBalance, const CAmount& watchImmatureBalance) { Q_UNUSED(unconfirmedBalance); @@ -402,6 +482,9 @@ void SendCoinsDialog::setBalance(const CAmount& balance, const CAmount& unconfir void SendCoinsDialog::updateDisplayUnit() { setBalance(model->getBalance(), 0, 0, 0, 0, 0); + ui->customFee->setDisplayUnit(model->getOptionsModel()->getDisplayUnit()); + updateMinFeeLabel(); + updateSmartFeeLabel(); } void SendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg) @@ -438,6 +521,9 @@ void SendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn msgParams.first = tr("The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."); msgParams.second = CClientUIInterface::MSG_ERROR; break; + case WalletModel::InsaneFee: + msgParams.first = tr("A fee higher than %1 is considered an insanely high fee.").arg(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), 10000000)); + break; // included to prevent a compiler warning. case WalletModel::OK: default: @@ -447,6 +533,110 @@ void SendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn emit message(tr("Send Coins"), msgParams.first, msgParams.second); } +void SendCoinsDialog::minimizeFeeSection(bool fMinimize) +{ + ui->labelFeeMinimized->setVisible(fMinimize); + ui->buttonChooseFee ->setVisible(fMinimize); + ui->buttonMinimizeFee->setVisible(!fMinimize); + ui->frameFeeSelection->setVisible(!fMinimize); + ui->horizontalLayoutSmartFee->setContentsMargins(0, (fMinimize ? 0 : 6), 0, 0); + fFeeMinimized = fMinimize; +} + +void SendCoinsDialog::on_buttonChooseFee_clicked() +{ + minimizeFeeSection(false); +} + +void SendCoinsDialog::on_buttonMinimizeFee_clicked() +{ + updateFeeMinimizedLabel(); + minimizeFeeSection(true); +} + +void SendCoinsDialog::setMinimumFee() +{ + ui->radioCustomPerKilobyte->setChecked(true); + ui->customFee->setValue(CWallet::minTxFee.GetFeePerK()); +} + +void SendCoinsDialog::updateFeeSectionControls() +{ + ui->sliderSmartFee ->setEnabled(ui->radioSmartFee->isChecked()); + ui->labelSmartFee ->setEnabled(ui->radioSmartFee->isChecked()); + ui->labelSmartFee2 ->setEnabled(ui->radioSmartFee->isChecked()); + ui->labelSmartFee3 ->setEnabled(ui->radioSmartFee->isChecked()); + ui->labelFeeEstimation ->setEnabled(ui->radioSmartFee->isChecked()); + ui->labelSmartFeeNormal ->setEnabled(ui->radioSmartFee->isChecked()); + ui->labelSmartFeeFast ->setEnabled(ui->radioSmartFee->isChecked()); + ui->checkBoxMinimumFee ->setEnabled(ui->radioCustomFee->isChecked()); + ui->labelMinFeeWarning ->setEnabled(ui->radioCustomFee->isChecked()); + ui->radioCustomPerKilobyte ->setEnabled(ui->radioCustomFee->isChecked() && !ui->checkBoxMinimumFee->isChecked()); + ui->radioCustomAtLeast ->setEnabled(ui->radioCustomFee->isChecked() && !ui->checkBoxMinimumFee->isChecked()); + ui->customFee ->setEnabled(ui->radioCustomFee->isChecked() && !ui->checkBoxMinimumFee->isChecked()); +} + +void SendCoinsDialog::updateGlobalFeeVariables() +{ + if (ui->radioSmartFee->isChecked()) + { + nTxConfirmTarget = (int)25 - (int)std::max(0, std::min(24, ui->sliderSmartFee->value())); + payTxFee = CFeeRate(0); + } + else + { + nTxConfirmTarget = 25; + payTxFee = CFeeRate(ui->customFee->value()); + fPayAtLeastCustomFee = ui->radioCustomAtLeast->isChecked(); + } + + fSendFreeTransactions = ui->checkBoxFreeTx->isChecked(); +} + +void SendCoinsDialog::updateFeeMinimizedLabel() +{ + if(!model || !model->getOptionsModel()) + return; + + if (ui->radioSmartFee->isChecked()) + ui->labelFeeMinimized->setText(ui->labelSmartFee->text()); + else { + ui->labelFeeMinimized->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), ui->customFee->value()) + + ((ui->radioCustomPerKilobyte->isChecked()) ? "/kB" : "")); + } +} + +void SendCoinsDialog::updateMinFeeLabel() +{ + if (model && model->getOptionsModel()) + ui->checkBoxMinimumFee->setText(tr("Pay only the minimum fee of %1").arg( + BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), CWallet::minTxFee.GetFeePerK()) + "/kB") + ); +} + +void SendCoinsDialog::updateSmartFeeLabel() +{ + if(!model || !model->getOptionsModel()) + return; + + int nBlocksToConfirm = (int)25 - (int)std::max(0, std::min(24, ui->sliderSmartFee->value())); + CFeeRate feeRate = mempool.estimateFee(nBlocksToConfirm); + if (feeRate <= CFeeRate(0)) // not enough data => minfee + { + ui->labelSmartFee->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), CWallet::minTxFee.GetFeePerK()) + "/kB"); + ui->labelSmartFee2->show(); // (Smart fee not initialized yet. This usually takes a few blocks...) + ui->labelFeeEstimation->setText(""); + } + else + { + ui->labelSmartFee->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), feeRate.GetFeePerK()) + "/kB"); + ui->labelSmartFee2->hide(); + ui->labelFeeEstimation->setText(tr("Estimated to begin confirmation within %1 block(s).").arg(nBlocksToConfirm)); + } + + updateFeeMinimizedLabel(); +} + // Coin Control: copy label "Quantity" to clipboard void SendCoinsDialog::coinControlClipboardQuantity() { @@ -462,19 +652,19 @@ void SendCoinsDialog::coinControlClipboardAmount() // Coin Control: copy label "Fee" to clipboard void SendCoinsDialog::coinControlClipboardFee() { - GUIUtil::setClipboard(ui->labelCoinControlFee->text().left(ui->labelCoinControlFee->text().indexOf(" "))); + GUIUtil::setClipboard(ui->labelCoinControlFee->text().left(ui->labelCoinControlFee->text().indexOf(" ")).replace("~", "")); } // Coin Control: copy label "After fee" to clipboard void SendCoinsDialog::coinControlClipboardAfterFee() { - GUIUtil::setClipboard(ui->labelCoinControlAfterFee->text().left(ui->labelCoinControlAfterFee->text().indexOf(" "))); + GUIUtil::setClipboard(ui->labelCoinControlAfterFee->text().left(ui->labelCoinControlAfterFee->text().indexOf(" ")).replace("~", "")); } // Coin Control: copy label "Bytes" to clipboard void SendCoinsDialog::coinControlClipboardBytes() { - GUIUtil::setClipboard(ui->labelCoinControlBytes->text()); + GUIUtil::setClipboard(ui->labelCoinControlBytes->text().replace("~", "")); } // Coin Control: copy label "Priority" to clipboard @@ -492,7 +682,7 @@ void SendCoinsDialog::coinControlClipboardLowOutput() // Coin Control: copy label "Change" to clipboard void SendCoinsDialog::coinControlClipboardChange() { - GUIUtil::setClipboard(ui->labelCoinControlChange->text().left(ui->labelCoinControlChange->text().indexOf(" "))); + GUIUtil::setClipboard(ui->labelCoinControlChange->text().left(ui->labelCoinControlChange->text().indexOf(" ")).replace("~", "")); } // Coin Control: settings menu - coin control enabled/disabled by user diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h index 74cc4bde56..15d39782a1 100644 --- a/src/qt/sendcoinsdialog.h +++ b/src/qt/sendcoinsdialog.h @@ -2,14 +2,15 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef SENDCOINSDIALOG_H -#define SENDCOINSDIALOG_H +#ifndef BITCOIN_QT_SENDCOINSDIALOG_H +#define BITCOIN_QT_SENDCOINSDIALOG_H #include "walletmodel.h" #include <QDialog> #include <QString> +class ClientModel; class OptionsModel; class SendCoinsEntry; class SendCoinsRecipient; @@ -31,6 +32,7 @@ public: explicit SendCoinsDialog(QWidget *parent = 0); ~SendCoinsDialog(); + void setClientModel(ClientModel *clientModel); void setModel(WalletModel *model); /** Set up the tab chain manually, as Qt messes up the tab chain by default in some cases (issue https://bugreports.qt-project.org/browse/QTBUG-10907). @@ -52,16 +54,22 @@ public slots: private: Ui::SendCoinsDialog *ui; + ClientModel *clientModel; WalletModel *model; bool fNewRecipientAllowed; + bool fFeeMinimized; // Process WalletModel::SendCoinsReturn and generate a pair consisting // of a message and message flags for use in emit message(). // Additional parameter msgArg can be used via .arg(msgArg). void processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg = QString()); + void minimizeFeeSection(bool fMinimize); + void updateFeeMinimizedLabel(); private slots: void on_sendButton_clicked(); + void on_buttonChooseFee_clicked(); + void on_buttonMinimizeFee_clicked(); void removeEntry(SendCoinsEntry* entry); void updateDisplayUnit(); void coinControlFeatureChanged(bool); @@ -77,10 +85,15 @@ private slots: void coinControlClipboardPriority(); void coinControlClipboardLowOutput(); void coinControlClipboardChange(); + void setMinimumFee(); + void updateFeeSectionControls(); + void updateMinFeeLabel(); + void updateSmartFeeLabel(); + void updateGlobalFeeVariables(); signals: // Fired when a message should be reported to the user void message(const QString &title, const QString &message, unsigned int style); }; -#endif // SENDCOINSDIALOG_H +#endif // BITCOIN_QT_SENDCOINSDIALOG_H diff --git a/src/qt/sendcoinsentry.h b/src/qt/sendcoinsentry.h index 2b696c77fb..69ad1032df 100644 --- a/src/qt/sendcoinsentry.h +++ b/src/qt/sendcoinsentry.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef SENDCOINSENTRY_H -#define SENDCOINSENTRY_H +#ifndef BITCOIN_QT_SENDCOINSENTRY_H +#define BITCOIN_QT_SENDCOINSENTRY_H #include "walletmodel.h" @@ -67,4 +67,4 @@ private: bool updateLabel(const QString &address); }; -#endif // SENDCOINSENTRY_H +#endif // BITCOIN_QT_SENDCOINSENTRY_H diff --git a/src/qt/signverifymessagedialog.h b/src/qt/signverifymessagedialog.h index bba861649a..36550edc8d 100644 --- a/src/qt/signverifymessagedialog.h +++ b/src/qt/signverifymessagedialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef SIGNVERIFYMESSAGEDIALOG_H -#define SIGNVERIFYMESSAGEDIALOG_H +#ifndef BITCOIN_QT_SIGNVERIFYMESSAGEDIALOG_H +#define BITCOIN_QT_SIGNVERIFYMESSAGEDIALOG_H #include <QDialog> @@ -48,4 +48,4 @@ private slots: void on_clearButton_VM_clicked(); }; -#endif // SIGNVERIFYMESSAGEDIALOG_H +#endif // BITCOIN_QT_SIGNVERIFYMESSAGEDIALOG_H diff --git a/src/qt/splashscreen.h b/src/qt/splashscreen.h index 128edadbee..4d9651f022 100644 --- a/src/qt/splashscreen.h +++ b/src/qt/splashscreen.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef SPLASHSCREEN_H -#define SPLASHSCREEN_H +#ifndef BITCOIN_QT_SPLASHSCREEN_H +#define BITCOIN_QT_SPLASHSCREEN_H #include <QSplashScreen> @@ -46,4 +46,4 @@ private: int curAlignment; }; -#endif // SPLASHSCREEN_H +#endif // BITCOIN_QT_SPLASHSCREEN_H diff --git a/src/qt/test/paymentservertests.h b/src/qt/test/paymentservertests.h index 9b6400b0d5..0717111f66 100644 --- a/src/qt/test/paymentservertests.h +++ b/src/qt/test/paymentservertests.h @@ -2,8 +2,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef PAYMENTSERVERTESTS_H -#define PAYMENTSERVERTESTS_H +#ifndef BITCOIN_QT_TEST_PAYMENTSERVERTESTS_H +#define BITCOIN_QT_TEST_PAYMENTSERVERTESTS_H #include "../paymentserver.h" @@ -32,4 +32,4 @@ public: SendCoinsRecipient recipient; }; -#endif // PAYMENTSERVERTESTS_H +#endif // BITCOIN_QT_TEST_PAYMENTSERVERTESTS_H diff --git a/src/qt/test/uritests.h b/src/qt/test/uritests.h index 1ea6d9f075..ed30a9f4a7 100644 --- a/src/qt/test/uritests.h +++ b/src/qt/test/uritests.h @@ -2,8 +2,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef URITESTS_H -#define URITESTS_H +#ifndef BITCOIN_QT_TEST_URITESTS_H +#define BITCOIN_QT_TEST_URITESTS_H #include <QObject> #include <QTest> @@ -16,4 +16,4 @@ private slots: void uriTests(); }; -#endif // URITESTS_H +#endif // BITCOIN_QT_TEST_URITESTS_H diff --git a/src/qt/trafficgraphwidget.cpp b/src/qt/trafficgraphwidget.cpp index 74565bb6d0..5f14b80797 100644 --- a/src/qt/trafficgraphwidget.cpp +++ b/src/qt/trafficgraphwidget.cpp @@ -76,10 +76,12 @@ void TrafficGraphWidget::paintEvent(QPaintEvent *) int base = floor(log10(fMax)); float val = pow(10.0f, base); - const QString units = tr("KB/s"); + const QString units = tr("KB/s"); + const float yMarginText = 2.0; + // draw lines painter.setPen(axisCol); - painter.drawText(XMARGIN, YMARGIN + h - h * val / fMax, QString("%1 %2").arg(val).arg(units)); + painter.drawText(XMARGIN, YMARGIN + h - h * val / fMax-yMarginText, QString("%1 %2").arg(val).arg(units)); for(float y = val; y < fMax; y += val) { int yy = YMARGIN + h - h * y / fMax; painter.drawLine(XMARGIN, yy, width() - XMARGIN, yy); @@ -89,7 +91,7 @@ void TrafficGraphWidget::paintEvent(QPaintEvent *) axisCol = axisCol.darker(); val = pow(10.0f, base - 1); painter.setPen(axisCol); - painter.drawText(XMARGIN, YMARGIN + h - h * val / fMax, QString("%1 %2").arg(val).arg(units)); + painter.drawText(XMARGIN, YMARGIN + h - h * val / fMax-yMarginText, QString("%1 %2").arg(val).arg(units)); int count = 1; for(float y = val; y < fMax; y += val, count++) { // don't overwrite lines drawn above diff --git a/src/qt/trafficgraphwidget.h b/src/qt/trafficgraphwidget.h index efab6e7fc5..50571e0b2d 100644 --- a/src/qt/trafficgraphwidget.h +++ b/src/qt/trafficgraphwidget.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef TRAFFICGRAPHWIDGET_H -#define TRAFFICGRAPHWIDGET_H +#ifndef BITCOIN_QT_TRAFFICGRAPHWIDGET_H +#define BITCOIN_QT_TRAFFICGRAPHWIDGET_H #include <QWidget> #include <QQueue> @@ -45,4 +45,4 @@ private: ClientModel *clientModel; }; -#endif // TRAFFICGRAPHWIDGET_H +#endif // BITCOIN_QT_TRAFFICGRAPHWIDGET_H diff --git a/src/qt/transactiondesc.h b/src/qt/transactiondesc.h index 4bd4293210..fc958a097c 100644 --- a/src/qt/transactiondesc.h +++ b/src/qt/transactiondesc.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef TRANSACTIONDESC_H -#define TRANSACTIONDESC_H +#ifndef BITCOIN_QT_TRANSACTIONDESC_H +#define BITCOIN_QT_TRANSACTIONDESC_H #include <QObject> #include <QString> @@ -28,4 +28,4 @@ private: static QString FormatTxStatus(const CWalletTx& wtx); }; -#endif // TRANSACTIONDESC_H +#endif // BITCOIN_QT_TRANSACTIONDESC_H diff --git a/src/qt/transactiondescdialog.h b/src/qt/transactiondescdialog.h index d4719975b2..c12c18e824 100644 --- a/src/qt/transactiondescdialog.h +++ b/src/qt/transactiondescdialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef TRANSACTIONDESCDIALOG_H -#define TRANSACTIONDESCDIALOG_H +#ifndef BITCOIN_QT_TRANSACTIONDESCDIALOG_H +#define BITCOIN_QT_TRANSACTIONDESCDIALOG_H #include <QDialog> @@ -28,4 +28,4 @@ private: Ui::TransactionDescDialog *ui; }; -#endif // TRANSACTIONDESCDIALOG_H +#endif // BITCOIN_QT_TRANSACTIONDESCDIALOG_H diff --git a/src/qt/transactionfilterproxy.h b/src/qt/transactionfilterproxy.h index ca31ee8f87..5836b114ab 100644 --- a/src/qt/transactionfilterproxy.h +++ b/src/qt/transactionfilterproxy.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef TRANSACTIONFILTERPROXY_H -#define TRANSACTIONFILTERPROXY_H +#ifndef BITCOIN_QT_TRANSACTIONFILTERPROXY_H +#define BITCOIN_QT_TRANSACTIONFILTERPROXY_H #include "amount.h" @@ -65,4 +65,4 @@ private: bool showInactive; }; -#endif // TRANSACTIONFILTERPROXY_H +#endif // BITCOIN_QT_TRANSACTIONFILTERPROXY_H diff --git a/src/qt/transactionrecord.h b/src/qt/transactionrecord.h index 9276c9f0af..e26453cda4 100644 --- a/src/qt/transactionrecord.h +++ b/src/qt/transactionrecord.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef TRANSACTIONRECORD_H -#define TRANSACTIONRECORD_H +#ifndef BITCOIN_QT_TRANSACTIONRECORD_H +#define BITCOIN_QT_TRANSACTIONRECORD_H #include "amount.h" #include "uint256.h" @@ -140,4 +140,4 @@ public: bool statusUpdateNeeded(); }; -#endif // TRANSACTIONRECORD_H +#endif // BITCOIN_QT_TRANSACTIONRECORD_H diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index e34d776818..79cb4a6296 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -91,87 +91,80 @@ public: Call with transaction that was added, removed or changed. */ - void updateWallet(const uint256 &hash, int status) + void updateWallet(const uint256 &hash, int status, bool showTransaction) { qDebug() << "TransactionTablePriv::updateWallet : " + QString::fromStdString(hash.ToString()) + " " + QString::number(status); - { - LOCK2(cs_main, wallet->cs_wallet); - // Find transaction in wallet - std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(hash); - bool inWallet = mi != wallet->mapWallet.end(); + // Find bounds of this transaction in model + QList<TransactionRecord>::iterator lower = qLowerBound( + cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); + QList<TransactionRecord>::iterator upper = qUpperBound( + cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); + int lowerIndex = (lower - cachedWallet.begin()); + int upperIndex = (upper - cachedWallet.begin()); + bool inModel = (lower != upper); - // Find bounds of this transaction in model - QList<TransactionRecord>::iterator lower = qLowerBound( - cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); - QList<TransactionRecord>::iterator upper = qUpperBound( - cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); - int lowerIndex = (lower - cachedWallet.begin()); - int upperIndex = (upper - cachedWallet.begin()); - bool inModel = (lower != upper); + if(status == CT_UPDATED) + { + if(showTransaction && !inModel) + status = CT_NEW; /* Not in model, but want to show, treat as new */ + if(!showTransaction && inModel) + status = CT_DELETED; /* In model, but want to hide, treat as deleted */ + } - // Determine whether to show transaction or not - bool showTransaction = (inWallet && TransactionRecord::showTransaction(mi->second)); + qDebug() << " inModel=" + QString::number(inModel) + + " Index=" + QString::number(lowerIndex) + "-" + QString::number(upperIndex) + + " showTransaction=" + QString::number(showTransaction) + " derivedStatus=" + QString::number(status); - if(status == CT_UPDATED) + switch(status) + { + case CT_NEW: + if(inModel) { - if(showTransaction && !inModel) - status = CT_NEW; /* Not in model, but want to show, treat as new */ - if(!showTransaction && inModel) - status = CT_DELETED; /* In model, but want to hide, treat as deleted */ + qWarning() << "TransactionTablePriv::updateWallet : Warning: Got CT_NEW, but transaction is already in model"; + break; } - - qDebug() << " inWallet=" + QString::number(inWallet) + " inModel=" + QString::number(inModel) + - " Index=" + QString::number(lowerIndex) + "-" + QString::number(upperIndex) + - " showTransaction=" + QString::number(showTransaction) + " derivedStatus=" + QString::number(status); - - switch(status) + if(showTransaction) { - case CT_NEW: - if(inModel) - { - qWarning() << "TransactionTablePriv::updateWallet : Warning: Got CT_NEW, but transaction is already in model"; - break; - } - if(!inWallet) + LOCK2(cs_main, wallet->cs_wallet); + // Find transaction in wallet + std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(hash); + if(mi == wallet->mapWallet.end()) { qWarning() << "TransactionTablePriv::updateWallet : Warning: Got CT_NEW, but transaction is not in wallet"; break; } - if(showTransaction) + // Added -- insert at the right position + QList<TransactionRecord> toInsert = + TransactionRecord::decomposeTransaction(wallet, mi->second); + if(!toInsert.isEmpty()) /* only if something to insert */ { - // Added -- insert at the right position - QList<TransactionRecord> toInsert = - TransactionRecord::decomposeTransaction(wallet, mi->second); - if(!toInsert.isEmpty()) /* only if something to insert */ + parent->beginInsertRows(QModelIndex(), lowerIndex, lowerIndex+toInsert.size()-1); + int insert_idx = lowerIndex; + foreach(const TransactionRecord &rec, toInsert) { - parent->beginInsertRows(QModelIndex(), lowerIndex, lowerIndex+toInsert.size()-1); - int insert_idx = lowerIndex; - foreach(const TransactionRecord &rec, toInsert) - { - cachedWallet.insert(insert_idx, rec); - insert_idx += 1; - } - parent->endInsertRows(); + cachedWallet.insert(insert_idx, rec); + insert_idx += 1; } + parent->endInsertRows(); } - break; - case CT_DELETED: - if(!inModel) - { - qWarning() << "TransactionTablePriv::updateWallet : Warning: Got CT_DELETED, but transaction is not in model"; - break; - } - // Removed -- remove entire transaction from table - parent->beginRemoveRows(QModelIndex(), lowerIndex, upperIndex-1); - cachedWallet.erase(lower, upper); - parent->endRemoveRows(); - break; - case CT_UPDATED: - // Miscellaneous updates -- nothing to do, status update will take care of this, and is only computed for - // visible transactions. + } + break; + case CT_DELETED: + if(!inModel) + { + qWarning() << "TransactionTablePriv::updateWallet : Warning: Got CT_DELETED, but transaction is not in model"; break; } + // Removed -- remove entire transaction from table + parent->beginRemoveRows(QModelIndex(), lowerIndex, upperIndex-1); + cachedWallet.erase(lower, upper); + parent->endRemoveRows(); + break; + case CT_UPDATED: + // Miscellaneous updates -- nothing to do, status update will take care of this, and is only computed for + // visible transactions. + break; } } @@ -230,16 +223,20 @@ TransactionTableModel::TransactionTableModel(CWallet* wallet, WalletModel *paren QAbstractTableModel(parent), wallet(wallet), walletModel(parent), - priv(new TransactionTablePriv(wallet, this)) + priv(new TransactionTablePriv(wallet, this)), + fProcessingQueuedTransactions(false) { columns << QString() << QString() << tr("Date") << tr("Type") << tr("Address") << BitcoinUnits::getAmountColumnTitle(walletModel->getOptionsModel()->getDisplayUnit()); priv->refreshWallet(); connect(walletModel->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit())); + + subscribeToCoreSignals(); } TransactionTableModel::~TransactionTableModel() { + unsubscribeFromCoreSignals(); delete priv; } @@ -250,12 +247,12 @@ void TransactionTableModel::updateAmountColumnTitle() emit headerDataChanged(Qt::Horizontal,Amount,Amount); } -void TransactionTableModel::updateTransaction(const QString &hash, int status) +void TransactionTableModel::updateTransaction(const QString &hash, int status, bool showTransaction) { uint256 updated; updated.SetHex(hash.toStdString()); - priv->updateWallet(updated, status); + priv->updateWallet(updated, status, showTransaction); } void TransactionTableModel::updateConfirmations() @@ -649,3 +646,82 @@ void TransactionTableModel::updateDisplayUnit() updateAmountColumnTitle(); emit dataChanged(index(0, Amount), index(priv->size()-1, Amount)); } + +// queue notifications to show a non freezing progress dialog e.g. for rescan +struct TransactionNotification +{ +public: + TransactionNotification() {} + TransactionNotification(uint256 hash, ChangeType status, bool showTransaction): + hash(hash), status(status), showTransaction(showTransaction) {} + + void invoke(QObject *ttm) + { + QString strHash = QString::fromStdString(hash.GetHex()); + qDebug() << "NotifyTransactionChanged : " + strHash + " status= " + QString::number(status); + QMetaObject::invokeMethod(ttm, "updateTransaction", Qt::QueuedConnection, + Q_ARG(QString, strHash), + Q_ARG(int, status), + Q_ARG(bool, showTransaction)); + } +private: + uint256 hash; + ChangeType status; + bool showTransaction; +}; + +static bool fQueueNotifications = false; +static std::vector< TransactionNotification > vQueueNotifications; + +static void NotifyTransactionChanged(TransactionTableModel *ttm, CWallet *wallet, const uint256 &hash, ChangeType status) +{ + // Find transaction in wallet + std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(hash); + // Determine whether to show transaction or not (determine this here so that no relocking is needed in GUI thread) + bool inWallet = mi != wallet->mapWallet.end(); + bool showTransaction = (inWallet && TransactionRecord::showTransaction(mi->second)); + + TransactionNotification notification(hash, status, showTransaction); + + if (fQueueNotifications) + { + vQueueNotifications.push_back(notification); + return; + } + notification.invoke(ttm); +} + +static void ShowProgress(TransactionTableModel *ttm, const std::string &title, int nProgress) +{ + if (nProgress == 0) + fQueueNotifications = true; + + if (nProgress == 100) + { + fQueueNotifications = false; + if (vQueueNotifications.size() > 10) // prevent balloon spam, show maximum 10 balloons + QMetaObject::invokeMethod(ttm, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, true)); + for (unsigned int i = 0; i < vQueueNotifications.size(); ++i) + { + if (vQueueNotifications.size() - i <= 10) + QMetaObject::invokeMethod(ttm, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, false)); + + vQueueNotifications[i].invoke(ttm); + } + std::vector<TransactionNotification >().swap(vQueueNotifications); // clear + } +} + +void TransactionTableModel::subscribeToCoreSignals() +{ + // Connect signals to wallet + wallet->NotifyTransactionChanged.connect(boost::bind(NotifyTransactionChanged, this, _1, _2, _3)); + wallet->ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2)); +} + +void TransactionTableModel::unsubscribeFromCoreSignals() +{ + // Disconnect signals from wallet + wallet->NotifyTransactionChanged.disconnect(boost::bind(NotifyTransactionChanged, this, _1, _2, _3)); + wallet->ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2)); +} diff --git a/src/qt/transactiontablemodel.h b/src/qt/transactiontablemodel.h index 413f3f9bf1..cfefe4cf19 100644 --- a/src/qt/transactiontablemodel.h +++ b/src/qt/transactiontablemodel.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef TRANSACTIONTABLEMODEL_H -#define TRANSACTIONTABLEMODEL_H +#ifndef BITCOIN_QT_TRANSACTIONTABLEMODEL_H +#define BITCOIN_QT_TRANSACTIONTABLEMODEL_H #include "bitcoinunits.h" @@ -72,12 +72,17 @@ public: QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const; + bool processingQueuedTransactions() { return fProcessingQueuedTransactions; } private: CWallet* wallet; WalletModel *walletModel; QStringList columns; TransactionTablePriv *priv; + bool fProcessingQueuedTransactions; + + void subscribeToCoreSignals(); + void unsubscribeFromCoreSignals(); QString lookupAddress(const std::string &address, bool tooltip) const; QVariant addressColor(const TransactionRecord *wtx) const; @@ -92,13 +97,16 @@ private: QVariant txAddressDecoration(const TransactionRecord *wtx) const; public slots: - void updateTransaction(const QString &hash, int status); + /* New transaction, or transaction changed status */ + void updateTransaction(const QString &hash, int status, bool showTransaction); void updateConfirmations(); void updateDisplayUnit(); /** Updates the column title to "Amount (DisplayUnit)" and emits headerDataChanged() signal for table headers to react. */ void updateAmountColumnTitle(); + /* Needed to update fProcessingQueuedTransactions through a QueuedConnection */ + void setProcessingQueuedTransactions(bool value) { fProcessingQueuedTransactions = value; } friend class TransactionTablePriv; }; -#endif // TRANSACTIONTABLEMODEL_H +#endif // BITCOIN_QT_TRANSACTIONTABLEMODEL_H diff --git a/src/qt/transactionview.h b/src/qt/transactionview.h index b249e00411..be6989adee 100644 --- a/src/qt/transactionview.h +++ b/src/qt/transactionview.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef TRANSACTIONVIEW_H -#define TRANSACTIONVIEW_H +#ifndef BITCOIN_QT_TRANSACTIONVIEW_H +#define BITCOIN_QT_TRANSACTIONVIEW_H #include "guiutil.h" @@ -112,4 +112,4 @@ public slots: }; -#endif // TRANSACTIONVIEW_H +#endif // BITCOIN_QT_TRANSACTIONVIEW_H diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp index 84f88dff5a..58bf040624 100644 --- a/src/qt/utilitydialog.cpp +++ b/src/qt/utilitydialog.cpp @@ -10,8 +10,8 @@ #include "clientmodel.h" #include "guiutil.h" +#include "clientversion.h" #include "init.h" -#include "version.h" #include <stdio.h> diff --git a/src/qt/utilitydialog.h b/src/qt/utilitydialog.h index ae5045cca9..e10b4dc8af 100644 --- a/src/qt/utilitydialog.h +++ b/src/qt/utilitydialog.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef UTILITYDIALOG_H -#define UTILITYDIALOG_H +#ifndef BITCOIN_QT_UTILITYDIALOG_H +#define BITCOIN_QT_UTILITYDIALOG_H #include <QDialog> #include <QObject> @@ -49,4 +49,4 @@ protected: void closeEvent(QCloseEvent *event); }; -#endif // UTILITYDIALOG_H +#endif // BITCOIN_QT_UTILITYDIALOG_H diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index f1830a0d6b..ae8592840d 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef WALLETFRAME_H -#define WALLETFRAME_H +#ifndef BITCOIN_QT_WALLETFRAME_H +#define BITCOIN_QT_WALLETFRAME_H #include <QFrame> #include <QMap> @@ -77,4 +77,4 @@ public slots: void usedReceivingAddresses(); }; -#endif // WALLETFRAME_H +#endif // BITCOIN_QT_WALLETFRAME_H diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index b4733d369e..b20465794d 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -34,7 +34,6 @@ WalletModel::WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *p cachedEncryptionStatus(Unencrypted), cachedNumBlocks(0) { - fProcessingQueuedTransactions = false; fHaveWatchOnly = wallet->HaveWatchOnly(); fForceCheckBalanceChanged = false; @@ -164,11 +163,8 @@ void WalletModel::checkBalanceChanged() } } -void WalletModel::updateTransaction(const QString &hash, int status) +void WalletModel::updateTransaction() { - if(transactionTableModel) - transactionTableModel->updateTransaction(hash, status); - // Balance and number of transactions might have changed fForceCheckBalanceChanged = true; } @@ -281,6 +277,10 @@ WalletModel::SendCoinsReturn WalletModel::prepareTransaction(WalletModelTransact CClientUIInterface::MSG_ERROR); return TransactionCreationFailed; } + + // reject insane fee > 0.1 bitcoin + if (nFeeRequired > 10000000) + return InsaneFee; } return SendCoinsReturn(OK); @@ -455,45 +455,16 @@ static void NotifyAddressBookChanged(WalletModel *walletmodel, CWallet *wallet, Q_ARG(int, status)); } -// queue notifications to show a non freezing progress dialog e.g. for rescan -static bool fQueueNotifications = false; -static std::vector<std::pair<uint256, ChangeType> > vQueueNotifications; static void NotifyTransactionChanged(WalletModel *walletmodel, CWallet *wallet, const uint256 &hash, ChangeType status) { - if (fQueueNotifications) - { - vQueueNotifications.push_back(make_pair(hash, status)); - return; - } - - QString strHash = QString::fromStdString(hash.GetHex()); - - qDebug() << "NotifyTransactionChanged : " + strHash + " status= " + QString::number(status); - QMetaObject::invokeMethod(walletmodel, "updateTransaction", Qt::QueuedConnection, - Q_ARG(QString, strHash), - Q_ARG(int, status)); + Q_UNUSED(wallet); + Q_UNUSED(hash); + Q_UNUSED(status); + QMetaObject::invokeMethod(walletmodel, "updateTransaction", Qt::QueuedConnection); } static void ShowProgress(WalletModel *walletmodel, const std::string &title, int nProgress) { - if (nProgress == 0) - fQueueNotifications = true; - - if (nProgress == 100) - { - fQueueNotifications = false; - if (vQueueNotifications.size() > 10) // prevent balloon spam, show maximum 10 balloons - QMetaObject::invokeMethod(walletmodel, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, true)); - for (unsigned int i = 0; i < vQueueNotifications.size(); ++i) - { - if (vQueueNotifications.size() - i <= 10) - QMetaObject::invokeMethod(walletmodel, "setProcessingQueuedTransactions", Qt::QueuedConnection, Q_ARG(bool, false)); - - NotifyTransactionChanged(walletmodel, NULL, vQueueNotifications[i].first, vQueueNotifications[i].second); - } - std::vector<std::pair<uint256, ChangeType> >().swap(vQueueNotifications); // clear - } - // emits signal "showProgress" QMetaObject::invokeMethod(walletmodel, "showProgress", Qt::QueuedConnection, Q_ARG(QString, QString::fromStdString(title)), diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index b1d0f28f12..d7e391f8d1 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef WALLETMODEL_H -#define WALLETMODEL_H +#ifndef BITCOIN_QT_WALLETMODEL_H +#define BITCOIN_QT_WALLETMODEL_H #include "paymentrequestplus.h" #include "walletmodeltransaction.h" @@ -110,7 +110,8 @@ public: AmountWithFeeExceedsBalance, DuplicateAddress, TransactionCreationFailed, // Error returned when wallet is still locked - TransactionCommitFailed + TransactionCommitFailed, + InsaneFee }; enum EncryptionStatus @@ -133,7 +134,6 @@ public: CAmount getWatchUnconfirmedBalance() const; CAmount getWatchImmatureBalance() const; EncryptionStatus getEncryptionStatus() const; - bool processingQueuedTransactions() { return fProcessingQueuedTransactions; } // Check address for validity bool validateAddress(const QString &address); @@ -197,7 +197,6 @@ public: private: CWallet *wallet; - bool fProcessingQueuedTransactions; bool fHaveWatchOnly; bool fForceCheckBalanceChanged; @@ -254,15 +253,13 @@ public slots: /* Wallet status might have changed */ void updateStatus(); /* New transaction, or transaction changed status */ - void updateTransaction(const QString &hash, int status); + void updateTransaction(); /* New, updated or removed address book entry */ void updateAddressBook(const QString &address, const QString &label, bool isMine, const QString &purpose, int status); /* Watch-only added */ void updateWatchOnlyFlag(bool fHaveWatchonly); /* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */ void pollBalanceChanged(); - /* Needed to update fProcessingQueuedTransactions through a QueuedConnection */ - void setProcessingQueuedTransactions(bool value) { fProcessingQueuedTransactions = value; } }; -#endif // WALLETMODEL_H +#endif // BITCOIN_QT_WALLETMODEL_H diff --git a/src/qt/walletmodeltransaction.cpp b/src/qt/walletmodeltransaction.cpp index ddd2d09bb5..e9e20c7d51 100644 --- a/src/qt/walletmodeltransaction.cpp +++ b/src/qt/walletmodeltransaction.cpp @@ -31,6 +31,11 @@ CWalletTx *WalletModelTransaction::getTransaction() return walletTransaction; } +unsigned int WalletModelTransaction::getTransactionSize() +{ + return (!walletTransaction ? 0 : (::GetSerializeSize(*(CTransaction*)walletTransaction, SER_NETWORK, PROTOCOL_VERSION))); +} + CAmount WalletModelTransaction::getTransactionFee() { return fee; diff --git a/src/qt/walletmodeltransaction.h b/src/qt/walletmodeltransaction.h index 4eadfbe4d1..4272529abe 100644 --- a/src/qt/walletmodeltransaction.h +++ b/src/qt/walletmodeltransaction.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef WALLETMODELTRANSACTION_H -#define WALLETMODELTRANSACTION_H +#ifndef BITCOIN_QT_WALLETMODELTRANSACTION_H +#define BITCOIN_QT_WALLETMODELTRANSACTION_H #include "walletmodel.h" @@ -25,6 +25,7 @@ public: QList<SendCoinsRecipient> getRecipients(); CWalletTx *getTransaction(); + unsigned int getTransactionSize(); void setTransactionFee(const CAmount& newFee); CAmount getTransactionFee(); @@ -41,4 +42,4 @@ private: CAmount fee; }; -#endif // WALLETMODELTRANSACTION_H +#endif // BITCOIN_QT_WALLETMODELTRANSACTION_H diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index eff50593bd..9bab180108 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -101,6 +101,7 @@ void WalletView::setClientModel(ClientModel *clientModel) this->clientModel = clientModel; overviewPage->setClientModel(clientModel); + sendCoinsPage->setClientModel(clientModel); } void WalletView::setWalletModel(WalletModel *walletModel) @@ -137,10 +138,12 @@ void WalletView::setWalletModel(WalletModel *walletModel) void WalletView::processNewTransaction(const QModelIndex& parent, int start, int /*end*/) { // Prevent balloon-spam when initial block download is in progress - if (!walletModel || walletModel->processingQueuedTransactions() || !clientModel || clientModel->inInitialBlockDownload()) + if (!walletModel || !clientModel || clientModel->inInitialBlockDownload()) return; TransactionTableModel *ttm = walletModel->getTransactionTableModel(); + if (!ttm || ttm->processingQueuedTransactions()) + return; QString date = ttm->index(start, TransactionTableModel::Date, parent).data().toString(); qint64 amount = ttm->index(start, TransactionTableModel::Amount, parent).data(Qt::EditRole).toULongLong(); diff --git a/src/qt/walletview.h b/src/qt/walletview.h index cafba517fd..95890ccd67 100644 --- a/src/qt/walletview.h +++ b/src/qt/walletview.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef WALLETVIEW_H -#define WALLETVIEW_H +#ifndef BITCOIN_QT_WALLETVIEW_H +#define BITCOIN_QT_WALLETVIEW_H #include "amount.h" @@ -116,4 +116,4 @@ signals: void incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address); }; -#endif // WALLETVIEW_H +#endif // BITCOIN_QT_WALLETVIEW_H diff --git a/src/qt/winshutdownmonitor.h b/src/qt/winshutdownmonitor.h index 4c76d2c816..26f5d80361 100644 --- a/src/qt/winshutdownmonitor.h +++ b/src/qt/winshutdownmonitor.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef WINSHUTDOWNMONITOR_H -#define WINSHUTDOWNMONITOR_H +#ifndef BITCOIN_QT_WINSHUTDOWNMONITOR_H +#define BITCOIN_QT_WINSHUTDOWNMONITOR_H #ifdef WIN32 #include <QByteArray> @@ -26,4 +26,4 @@ public: #endif #endif -#endif // WINSHUTDOWNMONITOR_H +#endif // BITCOIN_QT_WINSHUTDOWNMONITOR_H diff --git a/src/random.cpp b/src/random.cpp index 998e7dfb08..fc9505ae73 100644 --- a/src/random.cpp +++ b/src/random.cpp @@ -82,13 +82,12 @@ void RandAddSeedPerfmon() #endif } -bool GetRandBytes(unsigned char* buf, int num) +void GetRandBytes(unsigned char* buf, int num) { if (RAND_bytes(buf, num) != 1) { LogPrintf("%s: OpenSSL RAND_bytes() failed with error: %s\n", __func__, ERR_error_string(ERR_get_error(), NULL)); - return false; + assert(false); } - return true; } uint64_t GetRand(uint64_t nMax) diff --git a/src/random.h b/src/random.h index 161ebe8986..ec73d910c4 100644 --- a/src/random.h +++ b/src/random.h @@ -19,7 +19,7 @@ void RandAddSeedPerfmon(); /** * Functions to gather random data via the OpenSSL PRNG */ -bool GetRandBytes(unsigned char* buf, int num); +void GetRandBytes(unsigned char* buf, int num); uint64_t GetRand(uint64_t nMax); int GetRandInt(int nMax); uint256 GetRandHash(); diff --git a/src/rest.cpp b/src/rest.cpp new file mode 100644 index 0000000000..4953d7e717 --- /dev/null +++ b/src/rest.cpp @@ -0,0 +1,210 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "core/block.h" +#include "core/transaction.h" +#include "main.h" +#include "rpcserver.h" +#include "streams.h" +#include "sync.h" +#include "utilstrencodings.h" +#include "version.h" + +#include <boost/algorithm/string.hpp> + +using namespace std; +using namespace json_spirit; + +enum RetFormat { + RF_BINARY, + RF_HEX, + RF_JSON, +}; + +static const struct { + enum RetFormat rf; + const char *name; +} rf_names[] = { + { RF_BINARY, "binary" }, // default, if match not found + { RF_HEX, "hex" }, + { RF_JSON, "json" }, +}; + +class RestErr { +public: + enum HTTPStatusCode status; + string message; +}; + +extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry); +extern Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex); + +static RestErr RESTERR(enum HTTPStatusCode status, string message) +{ + RestErr re; + re.status = status; + re.message = message; + return re; +} + +static enum RetFormat ParseDataFormat(const string& format) +{ + for (unsigned int i = 0; i < ARRAYLEN(rf_names); i++) + if (format == rf_names[i].name) + return rf_names[i].rf; + + return rf_names[0].rf; +} + +static bool ParseHashStr(const string& strReq, uint256& v) +{ + if (!IsHex(strReq) || (strReq.size() != 64)) + return false; + + v.SetHex(strReq); + return true; +} + +static bool rest_block(AcceptedConnection *conn, + string& strReq, + map<string, string>& mapHeaders, + bool fRun) +{ + vector<string> params; + boost::split(params, strReq, boost::is_any_of("/")); + + enum RetFormat rf = ParseDataFormat(params.size() > 1 ? params[1] : string("")); + + string hashStr = params[0]; + uint256 hash; + if (!ParseHashStr(hashStr, hash)) + throw RESTERR(HTTP_BAD_REQUEST, "Invalid hash: " + hashStr); + + CBlock block; + CBlockIndex* pblockindex = NULL; + { + LOCK(cs_main); + if (mapBlockIndex.count(hash) == 0) + throw RESTERR(HTTP_NOT_FOUND, hashStr + " not found"); + + pblockindex = mapBlockIndex[hash]; + if (!ReadBlockFromDisk(block, pblockindex)) + throw RESTERR(HTTP_NOT_FOUND, hashStr + " not found"); + } + + CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION); + ssBlock << block; + + switch (rf) { + case RF_BINARY: { + string binaryBlock = ssBlock.str(); + conn->stream() << HTTPReplyHeader(HTTP_OK, fRun, binaryBlock.size(), "application/octet-stream") << binaryBlock << std::flush; + return true; + } + + case RF_HEX: { + string strHex = HexStr(ssBlock.begin(), ssBlock.end()) + "\n";; + conn->stream() << HTTPReply(HTTP_OK, strHex, fRun, false, "text/plain") << std::flush; + return true; + } + + case RF_JSON: { + Object objBlock = blockToJSON(block, pblockindex); + string strJSON = write_string(Value(objBlock), false) + "\n"; + conn->stream() << HTTPReply(HTTP_OK, strJSON, fRun) << std::flush; + return true; + } + } + + // not reached + return true; // continue to process further HTTP reqs on this cxn +} + +static bool rest_tx(AcceptedConnection *conn, + string& strReq, + map<string, string>& mapHeaders, + bool fRun) +{ + vector<string> params; + boost::split(params, strReq, boost::is_any_of("/")); + + enum RetFormat rf = ParseDataFormat(params.size() > 1 ? params[1] : string("")); + + string hashStr = params[0]; + uint256 hash; + if (!ParseHashStr(hashStr, hash)) + throw RESTERR(HTTP_BAD_REQUEST, "Invalid hash: " + hashStr); + + CTransaction tx; + uint256 hashBlock = 0; + if (!GetTransaction(hash, tx, hashBlock, true)) + throw RESTERR(HTTP_NOT_FOUND, hashStr + " not found"); + + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << tx; + + switch (rf) { + case RF_BINARY: { + string binaryTx = ssTx.str(); + conn->stream() << HTTPReplyHeader(HTTP_OK, fRun, binaryTx.size(), "application/octet-stream") << binaryTx << std::flush; + return true; + } + + case RF_HEX: { + string strHex = HexStr(ssTx.begin(), ssTx.end()) + "\n";; + conn->stream() << HTTPReply(HTTP_OK, strHex, fRun, false, "text/plain") << std::flush; + return true; + } + + case RF_JSON: { + Object objTx; + TxToJSON(tx, hashBlock, objTx); + string strJSON = write_string(Value(objTx), false) + "\n"; + conn->stream() << HTTPReply(HTTP_OK, strJSON, fRun) << std::flush; + return true; + } + } + + // not reached + return true; // continue to process further HTTP reqs on this cxn +} + +static const struct { + const char *prefix; + bool (*handler)(AcceptedConnection *conn, + string& strURI, + map<string, string>& mapHeaders, + bool fRun); +} uri_prefixes[] = { + { "/rest/tx/", rest_tx }, + { "/rest/block/", rest_block }, +}; + +bool HTTPReq_REST(AcceptedConnection *conn, + string& strURI, + map<string, string>& mapHeaders, + bool fRun) +{ + try { + std::string statusmessage; + if(RPCIsInWarmup(&statusmessage)) + throw RESTERR(HTTP_SERVICE_UNAVAILABLE, "Service temporarily unavailable: "+statusmessage); + + for (unsigned int i = 0; i < ARRAYLEN(uri_prefixes); i++) { + unsigned int plen = strlen(uri_prefixes[i].prefix); + if (strURI.substr(0, plen) == uri_prefixes[i].prefix) { + string strReq = strURI.substr(plen); + return uri_prefixes[i].handler(conn, strReq, mapHeaders, fRun); + } + } + } + catch (RestErr& re) { + conn->stream() << HTTPReply(re.status, re.message + "\r\n", false, false, "text/plain") << std::flush; + return false; + } + + conn->stream() << HTTPError(HTTP_NOT_FOUND, false) << std::flush; + return false; +} diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 78f5569895..e8b0f62a83 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "checkpoints.h" @@ -319,7 +319,7 @@ Value gettxoutsetinfo(const Array& params, bool fHelp) Object ret; CCoinsStats stats; - pcoinsTip->Flush(); + FlushStateToDisk(); if (pcoinsTip->GetStats(stats)) { ret.push_back(Pair("height", (int64_t)stats.nHeight)); ret.push_back(Pair("bestblock", stats.hashBlock.GetHex())); @@ -468,13 +468,13 @@ Value getblockchaininfo(const Array& params, bool fHelp) return obj; } -/* Comparison function for sorting the getchaintips heads. */ +/** Comparison function for sorting the getchaintips heads. */ struct CompareBlocksByHeight { bool operator()(const CBlockIndex* a, const CBlockIndex* b) const { /* Make sure that unequal blocks with the same height do not compare - equal. Use the pointers themselves to make a distinction. */ + equal. Use the pointers themselves to make a distinction. */ if (a->nHeight != b->nHeight) return (a->nHeight > b->nHeight); diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index a9c491cede..03ce9acbbf 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "rpcclient.h" @@ -18,13 +18,14 @@ using namespace json_spirit; class CRPCConvertParam { public: - std::string methodName; // method whose params want conversion - int paramIdx; // 0-based idx of param to convert + std::string methodName; //! method whose params want conversion + int paramIdx; //! 0-based idx of param to convert }; static const CRPCConvertParam vRPCConvertParams[] = { { "stop", 0 }, + { "setmocktime", 0 }, { "getaddednodeinfo", 0 }, { "setgenerate", 0 }, { "setgenerate", 1 }, @@ -115,7 +116,7 @@ CRPCConvertTable::CRPCConvertTable() static CRPCConvertTable rpcCvtTable; -// Convert strings to command-specific RPC representation +/** Convert strings to command-specific RPC representation */ Array RPCConvertValues(const std::string &strMethod, const std::vector<std::string> &strParams) { Array params; diff --git a/src/rpcclient.h b/src/rpcclient.h index 307aa2aab8..a91c2eb033 100644 --- a/src/rpcclient.h +++ b/src/rpcclient.h @@ -1,10 +1,10 @@ // Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef _BITCOINRPC_CLIENT_H_ -#define _BITCOINRPC_CLIENT_H_ +#ifndef BITCOIN_RPCCLIENT_H +#define BITCOIN_RPCCLIENT_H #include "json/json_spirit_reader_template.h" #include "json/json_spirit_utils.h" @@ -12,4 +12,4 @@ json_spirit::Array RPCConvertValues(const std::string& strMethod, const std::vector<std::string>& strParams); -#endif // _BITCOINRPC_CLIENT_H_ +#endif // BITCOIN_RPCCLIENT_H diff --git a/src/rpcdump.cpp b/src/rpcdump.cpp index 9da0a7d091..8b95373cff 100644 --- a/src/rpcdump.cpp +++ b/src/rpcdump.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "base58.h" @@ -112,6 +112,7 @@ Value importprivkey(const Array& params, bool fHelp) if (!key.IsValid()) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Private key outside allowed range"); CPubKey pubkey = key.GetPubKey(); + assert(key.VerifyPubKey(pubkey)); CKeyID vchAddress = pubkey.GetID(); { pwalletMain->MarkDirty(); @@ -253,6 +254,7 @@ Value importwallet(const Array& params, bool fHelp) continue; CKey key = vchSecret.GetKey(); CPubKey pubkey = key.GetPubKey(); + assert(key.VerifyPubKey(pubkey)); CKeyID keyid = pubkey.GetID(); if (pwalletMain->HaveKey(keyid)) { LogPrintf("Skipping import of %s (key already present)\n", CBitcoinAddress(keyid).ToString()); diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 8af3c46348..837a7593b6 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "amount.h" @@ -28,9 +28,11 @@ using namespace json_spirit; using namespace std; -// Return average network hashes per second based on the last 'lookup' blocks, -// or from the last difficulty change if 'lookup' is nonpositive. -// If 'height' is nonnegative, compute the estimate at the time when a given block was found. +/** + * Return average network hashes per second based on the last 'lookup' blocks, + * or from the last difficulty change if 'lookup' is nonpositive. + * If 'height' is nonnegative, compute the estimate at the time when a given block was found. + */ Value GetNetworkHashPS(int lookup, int height) { CBlockIndex *pb = chainActive.Tip(); @@ -121,6 +123,8 @@ Value setgenerate(const Array& params, bool fHelp) "1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n" "2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n" " Note: in -regtest mode, genproclimit controls how many blocks are generated immediately.\n" + "\nResult\n" + "[ blockhashes ] (array, -regtest only) hashes of blocks generated\n" "\nExamples:\n" "\nSet the generation on with a limit of one processor\n" + HelpExampleCli("setgenerate", "true 1") + @@ -154,26 +158,38 @@ Value setgenerate(const Array& params, bool fHelp) int nHeightEnd = 0; int nHeight = 0; int nGenerate = (nGenProcLimit > 0 ? nGenProcLimit : 1); + CReserveKey reservekey(pwalletMain); + { // Don't keep cs_main locked LOCK(cs_main); nHeightStart = chainActive.Height(); nHeight = nHeightStart; nHeightEnd = nHeightStart+nGenerate; } - int nHeightLast = -1; + unsigned int nExtraNonce = 0; + Array blockHashes; while (nHeight < nHeightEnd) { - if (nHeightLast != nHeight) + auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlockWithKey(reservekey)); + if (!pblocktemplate.get()) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Wallet keypool empty"); + CBlock *pblock = &pblocktemplate->block; { - nHeightLast = nHeight; - GenerateBitcoins(fGenerate, pwalletMain, 1); - } - MilliSleep(1); - { // Don't keep cs_main locked LOCK(cs_main); - nHeight = chainActive.Height(); + IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce); + } + while (!CheckProofOfWork(pblock->GetHash(), pblock->nBits)) { + // Yes, there is a chance every nonce could fail to satisfy the -regtest + // target -- 1 in 2^(2^32). That ain't gonna happen. + ++pblock->nNonce; } + CValidationState state; + if (!ProcessNewBlock(state, NULL, pblock)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted"); + ++nHeight; + blockHashes.push_back(pblock->GetHash().GetHex()); } + return blockHashes; } else // Not -regtest: start generate thread, return immediately { @@ -283,6 +299,25 @@ Value prioritisetransaction(const Array& params, bool fHelp) } +// NOTE: Assumes a conclusive result; if result is inconclusive, it must be handled by caller +static Value BIP22ValidationResult(const CValidationState& state) +{ + if (state.IsValid()) + return Value::null; + + std::string strRejectReason = state.GetRejectReason(); + if (state.IsError()) + throw JSONRPCError(RPC_VERIFY_ERROR, strRejectReason); + if (state.IsInvalid()) + { + if (strRejectReason.empty()) + return "rejected"; + return strRejectReason; + } + // Should be impossible + return "valid?"; +} + Value getblocktemplate(const Array& params, bool fHelp) { if (fHelp || params.size() > 1) @@ -360,6 +395,36 @@ Value getblocktemplate(const Array& params, bool fHelp) else throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode"); lpval = find_value(oparam, "longpollid"); + + if (strMode == "proposal") + { + const Value& dataval = find_value(oparam, "data"); + if (dataval.type() != str_type) + throw JSONRPCError(RPC_TYPE_ERROR, "Missing data String key for proposal"); + + CBlock block; + if (!DecodeHexBlk(block, dataval.get_str())) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed"); + + uint256 hash = block.GetHash(); + BlockMap::iterator mi = mapBlockIndex.find(hash); + if (mi != mapBlockIndex.end()) { + CBlockIndex *pindex = mi->second; + if (pindex->IsValid(BLOCK_VALID_SCRIPTS)) + return "duplicate"; + if (pindex->nStatus & BLOCK_FAILED_MASK) + return "duplicate-invalid"; + return "duplicate-inconclusive"; + } + + CBlockIndex* const pindexPrev = chainActive.Tip(); + // TestBlockValidity only supports blocks built on the current Tip + if (block.hashPrevBlock != pindexPrev->GetBlockHash()) + return "inconclusive-not-best-prevblk"; + CValidationState state; + TestBlockValidity(state, block, pindexPrev, false, true); + return BIP22ValidationResult(state); + } } if (strMode != "template") @@ -462,6 +527,8 @@ Value getblocktemplate(const Array& params, bool fHelp) UpdateTime(pblock, pindexPrev); pblock->nNonce = 0; + static const Array aCaps = boost::assign::list_of("proposal"); + Array transactions; map<uint256, int64_t> setTxIndex; int i = 0; @@ -508,6 +575,7 @@ Value getblocktemplate(const Array& params, bool fHelp) } Object result; + result.push_back(Pair("capabilities", aCaps)); result.push_back(Pair("version", pblock->nVersion)); result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex())); result.push_back(Pair("transactions", transactions)); @@ -527,6 +595,24 @@ Value getblocktemplate(const Array& params, bool fHelp) return result; } +class submitblock_StateCatcher : public CValidationInterface +{ +public: + uint256 hash; + bool found; + CValidationState state; + + submitblock_StateCatcher(const uint256 &hashIn) : hash(hashIn), found(false), state() {}; + +protected: + virtual void BlockChecked(const CBlock& block, const CValidationState& stateIn) { + if (block.GetHash() != hash) + return; + found = true; + state = stateIn; + }; +}; + Value submitblock(const Array& params, bool fHelp) { if (fHelp || params.size() < 1 || params.size() > 2) @@ -548,22 +634,39 @@ Value submitblock(const Array& params, bool fHelp) + HelpExampleRpc("submitblock", "\"mydata\"") ); - vector<unsigned char> blockData(ParseHex(params[0].get_str())); - CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION); - CBlock pblock; - try { - ssBlock >> pblock; - } - catch (const std::exception &) { + CBlock block; + if (!DecodeHexBlk(block, params[0].get_str())) throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed"); + + uint256 hash = block.GetHash(); + BlockMap::iterator mi = mapBlockIndex.find(hash); + if (mi != mapBlockIndex.end()) { + CBlockIndex *pindex = mi->second; + if (pindex->IsValid(BLOCK_VALID_SCRIPTS)) + return "duplicate"; + if (pindex->nStatus & BLOCK_FAILED_MASK) + return "duplicate-invalid"; + // Otherwise, we might only have the header - process the block before returning } CValidationState state; - bool fAccepted = ProcessBlock(state, NULL, &pblock); - if (!fAccepted) - return "rejected"; // TODO: report validation state - - return Value::null; + submitblock_StateCatcher sc(block.GetHash()); + RegisterValidationInterface(&sc); + bool fAccepted = ProcessNewBlock(state, NULL, &block); + UnregisterValidationInterface(&sc); + if (mi != mapBlockIndex.end()) + { + if (fAccepted && !sc.found) + return "duplicate-inconclusive"; + return "duplicate"; + } + if (fAccepted) + { + if (!sc.found) + return "inconclusive"; + state = sc.state; + } + return BIP22ValidationResult(state); } Value estimatefee(const Array& params, bool fHelp) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 92ed1c3e2b..90b9c99caa 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -1,9 +1,10 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "base58.h" +#include "clientversion.h" #include "init.h" #include "main.h" #include "net.h" @@ -29,7 +30,7 @@ using namespace std; /** * @note Do not add or change anything in the information returned by this - * method. `getinfo` exists for backwards-compatibilty only. It combines + * method. `getinfo` exists for backwards-compatibility only. It combines * information from wildly different sources in the program, which is a mess, * and is thus planned to be deprecated eventually. * @@ -197,9 +198,9 @@ Value validateaddress(const Array& params, bool fHelp) return ret; } -// -// Used by addmultisigaddress / createmultisig: -// +/** + * Used by addmultisigaddress / createmultisig: + */ CScript _createmultisig_redeemScript(const Array& params) { int nRequired = params[0].get_int(); @@ -353,3 +354,23 @@ Value verifymessage(const Array& params, bool fHelp) return (pubkey.GetID() == keyID); } + +Value setmocktime(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "setmocktime timestamp\n" + "\nSet the local time to given timestamp (-regtest only)\n" + "\nArguments:\n" + "1. timestamp (integer, required) Unix seconds-since-epoch timestamp\n" + " Pass 0 to go back to using the system time." + ); + + if (!Params().MineBlocksOnDemand()) + throw runtime_error("setmocktime for regression testing (-regtest mode) only"); + + RPCTypeCheck(params, boost::assign::list_of(int_type)); + SetMockTime(params[0].get_int64()); + + return Value::null; +} diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 12dcd5b540..6ddbd62fca 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -1,9 +1,10 @@ // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "rpcserver.h" +#include "clientversion.h" #include "main.h" #include "net.h" #include "netbase.h" diff --git a/src/rpcprotocol.cpp b/src/rpcprotocol.cpp index c99d113bc3..2f7c491f3d 100644 --- a/src/rpcprotocol.cpp +++ b/src/rpcprotocol.cpp @@ -1,10 +1,11 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "rpcprotocol.h" +#include "clientversion.h" #include "tinyformat.h" #include "util.h" #include "utilstrencodings.h" @@ -29,15 +30,15 @@ using namespace boost; using namespace boost::asio; using namespace json_spirit; -// Number of bytes to allocate and read at most at once in post data +//! Number of bytes to allocate and read at most at once in post data const size_t POST_READ_SIZE = 256 * 1024; -// -// HTTP protocol -// -// This ain't Apache. We're just using HTTP header for the length field -// and to be compatible with other JSON-RPC implementations. -// +/** + * HTTP protocol + * + * This ain't Apache. We're just using HTTP header for the length field + * and to be compatible with other JSON-RPC implementations. + */ string HTTPPost(const string& strMsg, const map<string,string>& mapRequestHeaders) { @@ -245,15 +246,15 @@ int ReadHTTPMessage(std::basic_istream<char>& stream, map<string, return HTTP_OK; } -// -// JSON-RPC protocol. Bitcoin speaks version 1.0 for maximum compatibility, -// but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were -// unspecified (HTTP errors and contents of 'error'). -// -// 1.0 spec: http://json-rpc.org/wiki/specification -// 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html -// http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx -// +/** + * JSON-RPC protocol. Bitcoin speaks version 1.0 for maximum compatibility, + * but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were + * unspecified (HTTP errors and contents of 'error'). + * + * 1.0 spec: http://json-rpc.org/wiki/specification + * 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html + * http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx + */ string JSONRPCRequest(const string& strMethod, const Array& params, const Value& id) { diff --git a/src/rpcprotocol.h b/src/rpcprotocol.h index a9adb58803..f7cd50f9f6 100644 --- a/src/rpcprotocol.h +++ b/src/rpcprotocol.h @@ -1,10 +1,10 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef _BITCOINRPC_PROTOCOL_H_ -#define _BITCOINRPC_PROTOCOL_H_ +#ifndef BITCOIN_RPCPROTOCOL_H +#define BITCOIN_RPCPROTOCOL_H #include <list> #include <map> @@ -19,7 +19,7 @@ #include "json/json_spirit_utils.h" #include "json/json_spirit_writer_template.h" -// HTTP status codes +//! HTTP status codes enum HTTPStatusCode { HTTP_OK = 200, @@ -28,52 +28,59 @@ enum HTTPStatusCode HTTP_FORBIDDEN = 403, HTTP_NOT_FOUND = 404, HTTP_INTERNAL_SERVER_ERROR = 500, + HTTP_SERVICE_UNAVAILABLE = 503, }; -// Bitcoin RPC error codes +//! Bitcoin RPC error codes enum RPCErrorCode { - // Standard JSON-RPC 2.0 errors + //! Standard JSON-RPC 2.0 errors RPC_INVALID_REQUEST = -32600, RPC_METHOD_NOT_FOUND = -32601, RPC_INVALID_PARAMS = -32602, RPC_INTERNAL_ERROR = -32603, RPC_PARSE_ERROR = -32700, - // General application defined errors - RPC_MISC_ERROR = -1, // std::exception thrown in command handling - RPC_FORBIDDEN_BY_SAFE_MODE = -2, // Server is in safe mode, and command is not allowed in safe mode - RPC_TYPE_ERROR = -3, // Unexpected type was passed as parameter - RPC_INVALID_ADDRESS_OR_KEY = -5, // Invalid address or key - RPC_OUT_OF_MEMORY = -7, // Ran out of memory during operation - RPC_INVALID_PARAMETER = -8, // Invalid, missing or duplicate parameter - RPC_DATABASE_ERROR = -20, // Database error - RPC_DESERIALIZATION_ERROR = -22, // Error parsing or validating structure in raw format - RPC_TRANSACTION_ERROR = -25, // General error during transaction submission - RPC_TRANSACTION_REJECTED = -26, // Transaction was rejected by network rules - RPC_TRANSACTION_ALREADY_IN_CHAIN= -27, // Transaction already in chain + //! General application defined errors + RPC_MISC_ERROR = -1, //! std::exception thrown in command handling + RPC_FORBIDDEN_BY_SAFE_MODE = -2, //! Server is in safe mode, and command is not allowed in safe mode + RPC_TYPE_ERROR = -3, //! Unexpected type was passed as parameter + RPC_INVALID_ADDRESS_OR_KEY = -5, //! Invalid address or key + RPC_OUT_OF_MEMORY = -7, //! Ran out of memory during operation + RPC_INVALID_PARAMETER = -8, //! Invalid, missing or duplicate parameter + RPC_DATABASE_ERROR = -20, //! Database error + RPC_DESERIALIZATION_ERROR = -22, //! Error parsing or validating structure in raw format + RPC_VERIFY_ERROR = -25, //! General error during transaction or block submission + RPC_VERIFY_REJECTED = -26, //! Transaction or block was rejected by network rules + RPC_VERIFY_ALREADY_IN_CHAIN = -27, //! Transaction already in chain + RPC_IN_WARMUP = -28, //! Client still warming up - // P2P client errors - RPC_CLIENT_NOT_CONNECTED = -9, // Bitcoin is not connected - RPC_CLIENT_IN_INITIAL_DOWNLOAD = -10, // Still downloading initial blocks - RPC_CLIENT_NODE_ALREADY_ADDED = -23, // Node is already added - RPC_CLIENT_NODE_NOT_ADDED = -24, // Node has not been added before + //! Aliases for backward compatibility + RPC_TRANSACTION_ERROR = RPC_VERIFY_ERROR, + RPC_TRANSACTION_REJECTED = RPC_VERIFY_REJECTED, + RPC_TRANSACTION_ALREADY_IN_CHAIN= RPC_VERIFY_ALREADY_IN_CHAIN, - // Wallet errors - RPC_WALLET_ERROR = -4, // Unspecified problem with wallet (key not found etc.) - RPC_WALLET_INSUFFICIENT_FUNDS = -6, // Not enough funds in wallet or account - RPC_WALLET_INVALID_ACCOUNT_NAME = -11, // Invalid account name - RPC_WALLET_KEYPOOL_RAN_OUT = -12, // Keypool ran out, call keypoolrefill first - RPC_WALLET_UNLOCK_NEEDED = -13, // Enter the wallet passphrase with walletpassphrase first - RPC_WALLET_PASSPHRASE_INCORRECT = -14, // The wallet passphrase entered was incorrect - RPC_WALLET_WRONG_ENC_STATE = -15, // Command given in wrong wallet encryption state (encrypting an encrypted wallet etc.) - RPC_WALLET_ENCRYPTION_FAILED = -16, // Failed to encrypt the wallet - RPC_WALLET_ALREADY_UNLOCKED = -17, // Wallet is already unlocked + //! P2P client errors + RPC_CLIENT_NOT_CONNECTED = -9, //! Bitcoin is not connected + RPC_CLIENT_IN_INITIAL_DOWNLOAD = -10, //! Still downloading initial blocks + RPC_CLIENT_NODE_ALREADY_ADDED = -23, //! Node is already added + RPC_CLIENT_NODE_NOT_ADDED = -24, //! Node has not been added before + + //! Wallet errors + RPC_WALLET_ERROR = -4, //! Unspecified problem with wallet (key not found etc.) + RPC_WALLET_INSUFFICIENT_FUNDS = -6, //! Not enough funds in wallet or account + RPC_WALLET_INVALID_ACCOUNT_NAME = -11, //! Invalid account name + RPC_WALLET_KEYPOOL_RAN_OUT = -12, //! Keypool ran out, call keypoolrefill first + RPC_WALLET_UNLOCK_NEEDED = -13, //! Enter the wallet passphrase with walletpassphrase first + RPC_WALLET_PASSPHRASE_INCORRECT = -14, //! The wallet passphrase entered was incorrect + RPC_WALLET_WRONG_ENC_STATE = -15, //! Command given in wrong wallet encryption state (encrypting an encrypted wallet etc.) + RPC_WALLET_ENCRYPTION_FAILED = -16, //! Failed to encrypt the wallet + RPC_WALLET_ALREADY_UNLOCKED = -17, //! Wallet is already unlocked }; -// -// IOStream device that speaks SSL but can also speak non-SSL -// +/** + * IOStream device that speaks SSL but can also speak non-SSL + */ template <typename Protocol> class SSLIOStreamDevice : public boost::iostreams::device<boost::iostreams::bidirectional> { public: @@ -159,4 +166,4 @@ json_spirit::Object JSONRPCReplyObj(const json_spirit::Value& result, const json std::string JSONRPCReply(const json_spirit::Value& result, const json_spirit::Value& error, const json_spirit::Value& id); json_spirit::Object JSONRPCError(int code, const std::string& message); -#endif // _BITCOINRPC_PROTOCOL_H_ +#endif // BITCOIN_RPCPROTOCOL_H diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index d3ce3b3191..25734f4930 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "base58.h" diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 9668c78831..b03016a508 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "rpcserver.h" @@ -34,7 +34,11 @@ using namespace std; static std::string strRPCUserColonPass; static bool fRPCRunning = false; -// These are created by StartRPCThreads, destroyed in StopRPCThreads +static bool fRPCInWarmup = true; +static std::string rpcWarmupStatus("RPC server started"); +static CCriticalSection cs_rpcWarmup; + +//! These are created by StartRPCThreads, destroyed in StopRPCThreads static asio::io_service* rpc_io_service = NULL; static map<string, boost::shared_ptr<deadline_timer> > deadlineTimers; static ssl::context* rpc_ssl_context = NULL; @@ -134,9 +138,9 @@ vector<unsigned char> ParseHexO(const Object& o, string strKey) } -/// -/// Note: This interface may still be subject to change. -/// +/** + * Note: This interface may still be subject to change. + */ string CRPCTable::help(string strCommand) const { @@ -232,11 +236,9 @@ Value stop(const Array& params, bool fHelp) -// -// Call Table -// - - +/** + * Call Table + */ static const CRPCCommand vRPCCommands[] = { // category name actor (function) okSafeMode threadSafe reqWallet // --------------------- ------------------------ ----------------------- ---------- ---------- --------- @@ -244,6 +246,7 @@ static const CRPCCommand vRPCCommands[] = { "control", "getinfo", &getinfo, true, false, false }, /* uses wallet if enabled */ { "control", "help", &help, true, true, false }, { "control", "stop", &stop, true, true, false }, + { "control", "setmocktime", &setmocktime, true, false, false }, /* P2P networking */ { "network", "getnetworkinfo", &getnetworkinfo, true, false, false }, @@ -453,7 +456,7 @@ private: void ServiceConnection(AcceptedConnection *conn); -// Forward declaration required for RPCListen +//! Forward declaration required for RPCListen template <typename Protocol, typename SocketAcceptorService> static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketAcceptorService> > acceptor, ssl::context& context, @@ -562,13 +565,8 @@ void StartRPCThreads() { unsigned char rand_pwd[32]; GetRandBytes(rand_pwd, 32); - string strWhatAmI = "To use bitcoind"; - if (mapArgs.count("-server")) - strWhatAmI = strprintf(_("To use the %s option"), "\"-server\""); - else if (mapArgs.count("-daemon")) - strWhatAmI = strprintf(_("To use the %s option"), "\"-daemon\""); uiInterface.ThreadSafeMessageBox(strprintf( - _("%s, you must set a rpcpassword in the configuration file:\n" + _("To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:\n" "%s\n" "It is recommended you use the following random password:\n" "rpcuser=bitcoinrpc\n" @@ -578,7 +576,6 @@ void StartRPCThreads() "If the file does not exist, create it with owner-readable-only file permissions.\n" "It is also recommended to set alertnotify so you are notified of problems;\n" "for example: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com\n"), - strWhatAmI, GetConfigFile().string(), EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32)), "", CClientUIInterface::MSG_ERROR | CClientUIInterface::SECURE); @@ -669,7 +666,7 @@ void StartRPCThreads() fListening = true; rpc_acceptors.push_back(acceptor); - // If dual IPv6/IPv4 bind succesful, skip binding to IPv4 separately + // If dual IPv6/IPv4 bind successful, skip binding to IPv4 separately if(bBindAny && bindAddress == asio::ip::address_v6::any() && !v6_only_error) break; } @@ -746,6 +743,27 @@ bool IsRPCRunning() return fRPCRunning; } +void SetRPCWarmupStatus(const std::string& newStatus) +{ + LOCK(cs_rpcWarmup); + rpcWarmupStatus = newStatus; +} + +void SetRPCWarmupFinished() +{ + LOCK(cs_rpcWarmup); + assert(fRPCInWarmup); + fRPCInWarmup = false; +} + +bool RPCIsInWarmup(std::string *outStatus) +{ + LOCK(cs_rpcWarmup); + if (outStatus) + *outStatus = rpcWarmupStatus; + return fRPCInWarmup; +} + void RPCRunHandler(const boost::system::error_code& err, boost::function<void(void)> func) { if (!err) @@ -872,6 +890,13 @@ static bool HTTPReq_JSONRPC(AcceptedConnection *conn, if (!read_string(strRequest, valRequest)) throw JSONRPCError(RPC_PARSE_ERROR, "Parse error"); + // Return immediately if in warmup + { + LOCK(cs_rpcWarmup); + if (fRPCInWarmup) + throw JSONRPCError(RPC_IN_WARMUP, rpcWarmupStatus); + } + string strReply; // singleton request @@ -924,9 +949,16 @@ void ServiceConnection(AcceptedConnection *conn) if (mapHeaders["connection"] == "close") fRun = false; + // Process via JSON-RPC API if (strURI == "/") { if (!HTTPReq_JSONRPC(conn, strRequest, mapHeaders, fRun)) break; + + // Process via HTTP REST API + } else if (strURI.substr(0, 6) == "/rest/" && GetBoolArg("-rest", false)) { + if (!HTTPReq_REST(conn, strURI, mapHeaders, fRun)) + break; + } else { conn->stream() << HTTPError(HTTP_NOT_FOUND, false) << std::flush; break; diff --git a/src/rpcserver.h b/src/rpcserver.h index d440035f15..b0e437057b 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -1,14 +1,14 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef _BITCOINRPC_SERVER_H_ -#define _BITCOINRPC_SERVER_H_ +#ifndef BITCOIN_RPCSERVER_H +#define BITCOIN_RPCSERVER_H #include "amount.h" -#include "uint256.h" #include "rpcprotocol.h" +#include "uint256.h" #include <list> #include <map> @@ -32,35 +32,47 @@ public: virtual void close() = 0; }; -/* Start RPC threads */ +/** Start RPC threads */ void StartRPCThreads(); -/* Alternative to StartRPCThreads for the GUI, when no server is +/** + * Alternative to StartRPCThreads for the GUI, when no server is * used. The RPC thread in this case is only used to handle timeouts. * If real RPC threads have already been started this is a no-op. */ void StartDummyRPCThread(); -/* Stop RPC threads */ +/** Stop RPC threads */ void StopRPCThreads(); -/* Query whether RPC is running */ +/** Query whether RPC is running */ bool IsRPCRunning(); -/* - Type-check arguments; throws JSONRPCError if wrong type given. Does not check that - the right number of arguments are passed, just that any passed are the correct type. - Use like: RPCTypeCheck(params, boost::assign::list_of(str_type)(int_type)(obj_type)); -*/ +/** + * Set the RPC warmup status. When this is done, all RPC calls will error out + * immediately with RPC_IN_WARMUP. + */ +void SetRPCWarmupStatus(const std::string& newStatus); +/* Mark warmup as done. RPC calls will be processed from now on. */ +void SetRPCWarmupFinished(); + +/* returns the current warmup state. */ +bool RPCIsInWarmup(std::string *statusOut); + +/** + * Type-check arguments; throws JSONRPCError if wrong type given. Does not check that + * the right number of arguments are passed, just that any passed are the correct type. + * Use like: RPCTypeCheck(params, boost::assign::list_of(str_type)(int_type)(obj_type)); + */ void RPCTypeCheck(const json_spirit::Array& params, const std::list<json_spirit::Value_type>& typesExpected, bool fAllowNull=false); -/* - Check for expected keys/value types in an Object. - Use like: RPCTypeCheck(object, boost::assign::map_list_of("name", str_type)("value", int_type)); -*/ +/** + * Check for expected keys/value types in an Object. + * Use like: RPCTypeCheck(object, boost::assign::map_list_of("name", str_type)("value", int_type)); + */ void RPCTypeCheck(const json_spirit::Object& o, const std::map<std::string, json_spirit::Value_type>& typesExpected, bool fAllowNull=false); -/* - Run func nSeconds from now. Uses boost deadline timers. - Overrides previous timer <name> (if any). +/** + * Run func nSeconds from now. Uses boost deadline timers. + * Overrides previous timer <name> (if any). */ void RPCRunLater(const std::string& name, boost::function<void(void)> func, int64_t nSeconds); @@ -104,10 +116,10 @@ public: extern const CRPCTable tableRPC; -// -// Utilities: convert hex-encoded Values -// (throws error if not hex). -// +/** + * Utilities: convert hex-encoded Values + * (throws error if not hex). + */ extern uint256 ParseHashV(const json_spirit::Value& v, std::string strName); extern uint256 ParseHashO(const json_spirit::Object& o, std::string strKey); extern std::vector<unsigned char> ParseHexV(const json_spirit::Value& v, std::string strName); @@ -186,6 +198,7 @@ extern json_spirit::Value getinfo(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value getwalletinfo(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value getblockchaininfo(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value getnetworkinfo(const json_spirit::Array& params, bool fHelp); +extern json_spirit::Value setmocktime(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value getrawtransaction(const json_spirit::Array& params, bool fHelp); // in rcprawtransaction.cpp extern json_spirit::Value listunspent(const json_spirit::Array& params, bool fHelp); @@ -210,4 +223,10 @@ extern json_spirit::Value gettxout(const json_spirit::Array& params, bool fHelp) extern json_spirit::Value verifychain(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value getchaintips(const json_spirit::Array& params, bool fHelp); -#endif // _BITCOINRPC_SERVER_H_ +// in rest.cpp +extern bool HTTPReq_REST(AcceptedConnection *conn, + std::string& strURI, + std::map<std::string, std::string>& mapHeaders, + bool fRun); + +#endif // BITCOIN_RPCSERVER_H diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index 2728fb4fb3..d2d14ad9f4 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "amount.h" @@ -314,7 +314,7 @@ Value sendtoaddress(const Array& params, bool fHelp) if (fHelp || params.size() < 2 || params.size() > 4) throw runtime_error( "sendtoaddress \"bitcoinaddress\" amount ( \"comment\" \"comment-to\" )\n" - "\nSent an amount to a given address. The amount is a real and is rounded to the nearest 0.00000001\n" + "\nSend an amount to a given address. The amount is a real and is rounded to the nearest 0.00000001\n" + HelpRequiringPassphrase() + "\nArguments:\n" "1. \"bitcoinaddress\" (string, required) The bitcoin address to send to.\n" @@ -1067,7 +1067,7 @@ Value listreceivedbyaddress(const Array& params, bool fHelp) "\nList balances by receiving address.\n" "\nArguments:\n" "1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n" - "2. includeempty (numeric, optional, dafault=false) Whether to include addresses that haven't received any payments.\n" + "2. includeempty (numeric, optional, default=false) Whether to include addresses that haven't received any payments.\n" "3. includeWatchonly (bool, optional, default=false) Whether to include watchonly addresses (see 'importaddress').\n" "\nResult:\n" @@ -1335,7 +1335,7 @@ Value listaccounts(const Array& params, bool fHelp) "listaccounts ( minconf includeWatchonly)\n" "\nReturns Object that has account names as keys, account balances as values.\n" "\nArguments:\n" - "1. minconf (numeric, optional, default=1) Only onclude transactions with at least this many confirmations\n" + "1. minconf (numeric, optional, default=1) Only include transactions with at least this many confirmations\n" "2. includeWatchonly (bool, optional, default=false) Include balances in watchonly addresses (see 'importaddress')\n" "\nResult:\n" "{ (json object where keys are account names, and values are numeric balances\n" diff --git a/src/script/bitcoinconsensus.cpp b/src/script/bitcoinconsensus.cpp new file mode 100644 index 0000000000..4faa760ad7 --- /dev/null +++ b/src/script/bitcoinconsensus.cpp @@ -0,0 +1,91 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "bitcoinconsensus.h" + +#include "core/transaction.h" +#include "script/interpreter.h" +#include "version.h" + +namespace { + +/** A class that deserializes a single CTransaction one time. */ +class TxInputStream +{ +public: + TxInputStream(int nTypeIn, int nVersionIn, const unsigned char *txTo, size_t txToLen) : + m_type(nTypeIn), + m_version(nVersionIn), + m_data(txTo), + m_remaining(txToLen) + {} + + TxInputStream& read(char* pch, size_t nSize) + { + if (nSize > m_remaining) + throw std::ios_base::failure(std::string(__func__) + ": end of data"); + + if (pch == NULL) + throw std::ios_base::failure(std::string(__func__) + ": bad destination buffer"); + + if (m_data == NULL) + throw std::ios_base::failure(std::string(__func__) + ": bad source buffer"); + + memcpy(pch, m_data, nSize); + m_remaining -= nSize; + m_data += nSize; + return *this; + } + + template<typename T> + TxInputStream& operator>>(T& obj) + { + ::Unserialize(*this, obj, m_type, m_version); + return *this; + } + +private: + const int m_type; + const int m_version; + const unsigned char* m_data; + size_t m_remaining; +}; + +inline int set_error(bitcoinconsensus_error* ret, bitcoinconsensus_error serror) +{ + if (ret) + *ret = serror; + return 0; +} + +} // anon namespace + +int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, + const unsigned char *txTo , unsigned int txToLen, + unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err) +{ + try { + TxInputStream stream(SER_NETWORK, PROTOCOL_VERSION, txTo, txToLen); + CTransaction tx; + stream >> tx; + if (nIn >= tx.vin.size()) + return set_error(err, bitcoinconsensus_ERR_TX_INDEX); + if (tx.GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION) != txToLen) + return set_error(err, bitcoinconsensus_ERR_TX_SIZE_MISMATCH); + + // Regardless of the verification result, the tx did not error. + set_error(err, bitcoinconsensus_ERR_OK); + + return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, SignatureChecker(tx, nIn), NULL); + } catch (std::exception &e) { + return set_error(err, bitcoinconsensus_ERR_TX_DESERIALIZE); // Error deserializing + } +} + +unsigned int bitcoinconsensus_version() +{ + // Just use the API version for now + return BITCOINCONSENSUS_API_VER; +} diff --git a/src/script/bitcoinconsensus.h b/src/script/bitcoinconsensus.h new file mode 100644 index 0000000000..15e3337a8d --- /dev/null +++ b/src/script/bitcoinconsensus.h @@ -0,0 +1,67 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_BITCOINCONSENSUS_H +#define BITCOIN_BITCOINCONSENSUS_H + +#if defined(BUILD_BITCOIN_INTERNAL) && defined(HAVE_CONFIG_H) +#include "config/bitcoin-config.h" + #if defined(_WIN32) + #if defined(DLL_EXPORT) + #if defined(HAVE_FUNC_ATTRIBUTE_DLLEXPORT) + #define EXPORT_SYMBOL __declspec(dllexport) + #else + #define EXPORT_SYMBOL + #endif + #endif + #elif defined(HAVE_FUNC_ATTRIBUTE_VISIBILITY) + #define EXPORT_SYMBOL __attribute__ ((visibility ("default"))) + #endif +#elif defined(MSC_VER) && !defined(STATIC_LIBBITCOINCONSENSUS) + #define EXPORT_SYMBOL __declspec(dllimport) +#endif + +#ifndef EXPORT_SYMBOL + #define EXPORT_SYMBOL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define BITCOINCONSENSUS_API_VER 0 + +typedef enum bitcoinconsensus_error_t +{ + bitcoinconsensus_ERR_OK = 0, + bitcoinconsensus_ERR_TX_INDEX, + bitcoinconsensus_ERR_TX_SIZE_MISMATCH, + bitcoinconsensus_ERR_TX_DESERIALIZE, +} bitcoinconsensus_error; + +/** Script verification flags */ +enum +{ + bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0, + bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts +}; + +/// Returns 1 if the input nIn of the serialized transaction pointed to by +/// txTo correctly spends the scriptPubKey pointed to by scriptPubKey under +/// the additional constraints specified by flags. +/// If not NULL, err will contain an error/success code for the operation +EXPORT_SYMBOL int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, + const unsigned char *txTo , unsigned int txToLen, + unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err); + +EXPORT_SYMBOL unsigned int bitcoinconsensus_version(); + +#ifdef __cplusplus +} // extern "C" +#endif + +#undef EXPORT_SYMBOL + +#endif // BITCOIN_BITCOINCONSENSUS_H diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 3625972ebf..a10cefcc0b 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -9,21 +9,32 @@ #include "crypto/ripemd160.h" #include "crypto/sha1.h" #include "crypto/sha2.h" -#include "key.h" +#include "eccryptoverify.h" +#include "pubkey.h" #include "script/script.h" #include "uint256.h" -#include "util.h" using namespace std; typedef vector<unsigned char> valtype; -static const valtype vchFalse(0); -static const valtype vchZero(0); -static const valtype vchTrue(1, 1); -static const CScriptNum bnZero(0); -static const CScriptNum bnOne(1); -static const CScriptNum bnFalse(0); -static const CScriptNum bnTrue(1); + +namespace { + +inline bool set_success(ScriptError* ret) +{ + if (ret) + *ret = SCRIPT_ERR_OK; + return true; +} + +inline bool set_error(ScriptError* ret, const ScriptError serror) +{ + if (ret) + *ret = serror; + return false; +} + +} // anon namespace bool CastToBool(const valtype& vch) { @@ -40,10 +51,10 @@ bool CastToBool(const valtype& vch) return false; } -// -// Script is a stack machine (like Forth) that evaluates a predicate -// returning a bool indicating valid or not. There are no loops. -// +/** + * Script is a stack machine (like Forth) that evaluates a predicate + * returning a bool indicating valid or not. There are no loops. + */ #define stacktop(i) (stack.at(stack.size()+(i))) #define altstacktop(i) (altstack.at(altstack.size()+(i))) static inline void popstack(vector<valtype>& stack) @@ -54,67 +65,105 @@ static inline void popstack(vector<valtype>& stack) } bool static IsCompressedOrUncompressedPubKey(const valtype &vchPubKey) { - if (vchPubKey.size() < 33) - return error("Non-canonical public key: too short"); + if (vchPubKey.size() < 33) { + // Non-canonical public key: too short + return false; + } if (vchPubKey[0] == 0x04) { - if (vchPubKey.size() != 65) - return error("Non-canonical public key: invalid length for uncompressed key"); + if (vchPubKey.size() != 65) { + // Non-canonical public key: invalid length for uncompressed key + return false; + } } else if (vchPubKey[0] == 0x02 || vchPubKey[0] == 0x03) { - if (vchPubKey.size() != 33) - return error("Non-canonical public key: invalid length for compressed key"); + if (vchPubKey.size() != 33) { + // Non-canonical public key: invalid length for compressed key + return false; + } } else { - return error("Non-canonical public key: neither compressed nor uncompressed"); + // Non-canonical public key: neither compressed nor uncompressed + return false; } return true; } +/** + * A canonical signature exists of: <30> <total len> <02> <len R> <R> <02> <len S> <S> <hashtype> + * Where R and S are not negative (their first byte has its highest bit not set), and not + * excessively padded (do not start with a 0 byte, unless an otherwise negative number follows, + * in which case a single 0 byte is necessary and even required). + * + * See https://bitcointalk.org/index.php?topic=8392.msg127623#msg127623 + */ bool static IsDERSignature(const valtype &vchSig) { - // See https://bitcointalk.org/index.php?topic=8392.msg127623#msg127623 - // A canonical signature exists of: <30> <total len> <02> <len R> <R> <02> <len S> <S> <hashtype> - // Where R and S are not negative (their first byte has its highest bit not set), and not - // excessively padded (do not start with a 0 byte, unless an otherwise negative number follows, - // in which case a single 0 byte is necessary and even required). - if (vchSig.size() < 9) - return error("Non-canonical signature: too short"); - if (vchSig.size() > 73) - return error("Non-canonical signature: too long"); - if (vchSig[0] != 0x30) - return error("Non-canonical signature: wrong type"); - if (vchSig[1] != vchSig.size()-3) - return error("Non-canonical signature: wrong length marker"); + + if (vchSig.size() < 9) { + // Non-canonical signature: too short + return false; + } + if (vchSig.size() > 73) { + // Non-canonical signature: too long + return false; + } + if (vchSig[0] != 0x30) { + // Non-canonical signature: wrong type + return false; + } + if (vchSig[1] != vchSig.size()-3) { + // Non-canonical signature: wrong length marker + return false; + } unsigned int nLenR = vchSig[3]; - if (5 + nLenR >= vchSig.size()) - return error("Non-canonical signature: S length misplaced"); + if (5 + nLenR >= vchSig.size()) { + // Non-canonical signature: S length misplaced + return false; + } unsigned int nLenS = vchSig[5+nLenR]; - if ((unsigned long)(nLenR+nLenS+7) != vchSig.size()) - return error("Non-canonical signature: R+S length mismatch"); + if ((unsigned long)(nLenR+nLenS+7) != vchSig.size()) { + // Non-canonical signature: R+S length mismatch + return false; + } const unsigned char *R = &vchSig[4]; - if (R[-2] != 0x02) - return error("Non-canonical signature: R value type mismatch"); - if (nLenR == 0) - return error("Non-canonical signature: R length is zero"); - if (R[0] & 0x80) - return error("Non-canonical signature: R value negative"); - if (nLenR > 1 && (R[0] == 0x00) && !(R[1] & 0x80)) - return error("Non-canonical signature: R value excessively padded"); + if (R[-2] != 0x02) { + // Non-canonical signature: R value type mismatch + return false; + } + if (nLenR == 0) { + // Non-canonical signature: R length is zero + return false; + } + if (R[0] & 0x80) { + // Non-canonical signature: R value negative + return false; + } + if (nLenR > 1 && (R[0] == 0x00) && !(R[1] & 0x80)) { + // Non-canonical signature: R value excessively padded + return false; + } const unsigned char *S = &vchSig[6+nLenR]; - if (S[-2] != 0x02) - return error("Non-canonical signature: S value type mismatch"); - if (nLenS == 0) - return error("Non-canonical signature: S length is zero"); - if (S[0] & 0x80) - return error("Non-canonical signature: S value negative"); - if (nLenS > 1 && (S[0] == 0x00) && !(S[1] & 0x80)) - return error("Non-canonical signature: S value excessively padded"); - + if (S[-2] != 0x02) { + // Non-canonical signature: S value type mismatch + return false; + } + if (nLenS == 0) { + // Non-canonical signature: S length is zero + return false; + } + if (S[0] & 0x80) { + // Non-canonical signature: S value negative + return false; + } + if (nLenS > 1 && (S[0] == 0x00) && !(S[1] & 0x80)) { + // Non-canonical signature: S value excessively padded + return false; + } return true; } -bool static IsLowDERSignature(const valtype &vchSig) { +bool static IsLowDERSignature(const valtype &vchSig, ScriptError* serror) { if (!IsDERSignature(vchSig)) { - return false; + return set_error(serror, SCRIPT_ERR_SIG_DER); } unsigned int nLenR = vchSig[3]; unsigned int nLenS = vchSig[5+nLenR]; @@ -122,8 +171,8 @@ bool static IsLowDERSignature(const valtype &vchSig) { // If the S value is above the order of the curve divided by two, its // complement modulo the order could have been used instead, which is // one byte shorter when encoded correctly. - if (!CKey::CheckSignatureElement(S, nLenS, true)) - return error("Non-canonical signature: S value is unnecessarily high"); + if (!eccrypto::CheckSignatureElement(S, nLenS, true)) + return set_error(serror, SCRIPT_ERR_SIG_HIGH_S); return true; } @@ -134,25 +183,26 @@ bool static IsDefinedHashtypeSignature(const valtype &vchSig) { } unsigned char nHashType = vchSig[vchSig.size() - 1] & (~(SIGHASH_ANYONECANPAY)); if (nHashType < SIGHASH_ALL || nHashType > SIGHASH_SINGLE) - return error("Non-canonical signature: unknown hashtype byte"); + return false; return true; } -bool static CheckSignatureEncoding(const valtype &vchSig, unsigned int flags) { +bool static CheckSignatureEncoding(const valtype &vchSig, unsigned int flags, ScriptError* serror) { if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsDERSignature(vchSig)) { - return false; - } else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature(vchSig)) { + return set_error(serror, SCRIPT_ERR_SIG_DER); + } else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature(vchSig, serror)) { + // serror is set return false; } else if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsDefinedHashtypeSignature(vchSig)) { - return false; + return set_error(serror, SCRIPT_ERR_SIG_HASHTYPE); } return true; } -bool static CheckPubKeyEncoding(const valtype &vchSig, unsigned int flags) { +bool static CheckPubKeyEncoding(const valtype &vchSig, unsigned int flags, ScriptError* serror) { if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsCompressedOrUncompressedPubKey(vchSig)) { - return false; + return set_error(serror, SCRIPT_ERR_PUBKEYTYPE); } return true; } @@ -180,8 +230,16 @@ bool static CheckMinimalPush(const valtype& data, opcodetype opcode) { return true; } -bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker) +bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) { + static const CScriptNum bnZero(0); + static const CScriptNum bnOne(1); + static const CScriptNum bnFalse(0); + static const CScriptNum bnTrue(1); + static const valtype vchFalse(0); + static const valtype vchZero(0); + static const valtype vchTrue(1, 1); + CScript::const_iterator pc = script.begin(); CScript::const_iterator pend = script.end(); CScript::const_iterator pbegincodehash = script.begin(); @@ -189,8 +247,9 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un valtype vchPushValue; vector<bool> vfExec; vector<valtype> altstack; + set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); if (script.size() > 10000) - return false; + return set_error(serror, SCRIPT_ERR_SCRIPT_SIZE); int nOpCount = 0; bool fRequireMinimal = (flags & SCRIPT_VERIFY_MINIMALDATA) != 0; @@ -204,13 +263,13 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un // Read instruction // if (!script.GetOp(pc, opcode, vchPushValue)) - return false; + return set_error(serror, SCRIPT_ERR_BAD_OPCODE); if (vchPushValue.size() > MAX_SCRIPT_ELEMENT_SIZE) - return false; + return set_error(serror, SCRIPT_ERR_PUSH_SIZE); // Note how OP_RESERVED does not count towards the opcode limit. if (opcode > OP_16 && ++nOpCount > 201) - return false; + return set_error(serror, SCRIPT_ERR_OP_COUNT); if (opcode == OP_CAT || opcode == OP_SUBSTR || @@ -227,11 +286,11 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un opcode == OP_MOD || opcode == OP_LSHIFT || opcode == OP_RSHIFT) - return false; // Disabled opcodes. + return set_error(serror, SCRIPT_ERR_DISABLED_OPCODE); // Disabled opcodes. if (fExec && 0 <= opcode && opcode <= OP_PUSHDATA4) { if (fRequireMinimal && !CheckMinimalPush(vchPushValue, opcode)) { - return false; + return set_error(serror, SCRIPT_ERR_MINIMALDATA); } stack.push_back(vchPushValue); } else if (fExec || (OP_IF <= opcode && opcode <= OP_ENDIF)) @@ -271,8 +330,14 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un // Control // case OP_NOP: + break; + case OP_NOP1: case OP_NOP2: case OP_NOP3: case OP_NOP4: case OP_NOP5: case OP_NOP6: case OP_NOP7: case OP_NOP8: case OP_NOP9: case OP_NOP10: + { + if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS) + return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS); + } break; case OP_IF: @@ -283,7 +348,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un if (fExec) { if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL); valtype& vch = stacktop(-1); fValue = CastToBool(vch); if (opcode == OP_NOTIF) @@ -297,7 +362,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un case OP_ELSE: { if (vfExec.empty()) - return false; + return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL); vfExec.back() = !vfExec.back(); } break; @@ -305,7 +370,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un case OP_ENDIF: { if (vfExec.empty()) - return false; + return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL); vfExec.pop_back(); } break; @@ -315,18 +380,18 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un // (true -- ) or // (false -- false) and return if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); bool fValue = CastToBool(stacktop(-1)); if (fValue) popstack(stack); else - return false; + return set_error(serror, SCRIPT_ERR_VERIFY); } break; case OP_RETURN: { - return false; + return set_error(serror, SCRIPT_ERR_OP_RETURN); } break; @@ -337,7 +402,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un case OP_TOALTSTACK: { if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); altstack.push_back(stacktop(-1)); popstack(stack); } @@ -346,7 +411,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un case OP_FROMALTSTACK: { if (altstack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_ALTSTACK_OPERATION); stack.push_back(altstacktop(-1)); popstack(altstack); } @@ -356,7 +421,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 -- ) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); popstack(stack); popstack(stack); } @@ -366,7 +431,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 -- x1 x2 x1 x2) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch1 = stacktop(-2); valtype vch2 = stacktop(-1); stack.push_back(vch1); @@ -378,7 +443,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 x3 -- x1 x2 x3 x1 x2 x3) if (stack.size() < 3) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch1 = stacktop(-3); valtype vch2 = stacktop(-2); valtype vch3 = stacktop(-1); @@ -392,7 +457,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2) if (stack.size() < 4) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch1 = stacktop(-4); valtype vch2 = stacktop(-3); stack.push_back(vch1); @@ -404,7 +469,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 x3 x4 x5 x6 -- x3 x4 x5 x6 x1 x2) if (stack.size() < 6) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch1 = stacktop(-6); valtype vch2 = stacktop(-5); stack.erase(stack.end()-6, stack.end()-4); @@ -417,7 +482,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 x3 x4 -- x3 x4 x1 x2) if (stack.size() < 4) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); swap(stacktop(-4), stacktop(-2)); swap(stacktop(-3), stacktop(-1)); } @@ -427,7 +492,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x - 0 | x x) if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch = stacktop(-1); if (CastToBool(vch)) stack.push_back(vch); @@ -446,7 +511,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x -- ) if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); popstack(stack); } break; @@ -455,7 +520,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x -- x x) if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch = stacktop(-1); stack.push_back(vch); } @@ -465,7 +530,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 -- x2) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); stack.erase(stack.end() - 2); } break; @@ -474,7 +539,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 -- x1 x2 x1) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch = stacktop(-2); stack.push_back(vch); } @@ -486,11 +551,11 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un // (xn ... x2 x1 x0 n - xn ... x2 x1 x0 xn) // (xn ... x2 x1 x0 n - ... x2 x1 x0 xn) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); int n = CScriptNum(stacktop(-1), fRequireMinimal).getint(); popstack(stack); if (n < 0 || n >= (int)stack.size()) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch = stacktop(-n-1); if (opcode == OP_ROLL) stack.erase(stack.end()-n-1); @@ -504,7 +569,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un // x2 x1 x3 after first swap // x2 x3 x1 after second swap if (stack.size() < 3) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); swap(stacktop(-3), stacktop(-2)); swap(stacktop(-2), stacktop(-1)); } @@ -514,7 +579,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 -- x2 x1) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); swap(stacktop(-2), stacktop(-1)); } break; @@ -523,7 +588,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 -- x2 x1 x2) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype vch = stacktop(-1); stack.insert(stack.end()-2, vch); } @@ -534,7 +599,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (in -- in size) if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); CScriptNum bn(stacktop(-1).size()); stack.push_back(bn.getvch()); } @@ -550,7 +615,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 - bool) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype& vch1 = stacktop(-2); valtype& vch2 = stacktop(-1); bool fEqual = (vch1 == vch2); @@ -567,7 +632,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un if (fEqual) popstack(stack); else - return false; + return set_error(serror, SCRIPT_ERR_EQUALVERIFY); } } break; @@ -585,7 +650,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (in -- out) if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); CScriptNum bn(stacktop(-1), fRequireMinimal); switch (opcode) { @@ -618,7 +683,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x1 x2 -- out) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); CScriptNum bn1(stacktop(-2), fRequireMinimal); CScriptNum bn2(stacktop(-1), fRequireMinimal); CScriptNum bn(0); @@ -654,7 +719,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un if (CastToBool(stacktop(-1))) popstack(stack); else - return false; + return set_error(serror, SCRIPT_ERR_NUMEQUALVERIFY); } } break; @@ -663,7 +728,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (x min max -- out) if (stack.size() < 3) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); CScriptNum bn1(stacktop(-3), fRequireMinimal); CScriptNum bn2(stacktop(-2), fRequireMinimal); CScriptNum bn3(stacktop(-1), fRequireMinimal); @@ -687,7 +752,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (in -- hash) if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype& vch = stacktop(-1); valtype vchHash((opcode == OP_RIPEMD160 || opcode == OP_SHA1 || opcode == OP_HASH160) ? 20 : 32); if (opcode == OP_RIPEMD160) @@ -717,7 +782,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un { // (sig pubkey -- bool) if (stack.size() < 2) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); valtype& vchSig = stacktop(-2); valtype& vchPubKey = stacktop(-1); @@ -728,11 +793,11 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un // Drop the signature, since there's no way for a signature to sign itself scriptCode.FindAndDelete(CScript(vchSig)); - if (!CheckSignatureEncoding(vchSig, flags)) { + if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, serror)) { + //serror is set return false; } - - bool fSuccess = CheckPubKeyEncoding(vchPubKey, flags) && checker.CheckSig(vchSig, vchPubKey, scriptCode); + bool fSuccess = checker.CheckSig(vchSig, vchPubKey, scriptCode); popstack(stack); popstack(stack); @@ -742,7 +807,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un if (fSuccess) popstack(stack); else - return false; + return set_error(serror, SCRIPT_ERR_CHECKSIGVERIFY); } } break; @@ -754,26 +819,26 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un int i = 1; if ((int)stack.size() < i) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); int nKeysCount = CScriptNum(stacktop(-i), fRequireMinimal).getint(); if (nKeysCount < 0 || nKeysCount > 20) - return false; + return set_error(serror, SCRIPT_ERR_PUBKEY_COUNT); nOpCount += nKeysCount; if (nOpCount > 201) - return false; + return set_error(serror, SCRIPT_ERR_OP_COUNT); int ikey = ++i; i += nKeysCount; if ((int)stack.size() < i) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); int nSigsCount = CScriptNum(stacktop(-i), fRequireMinimal).getint(); if (nSigsCount < 0 || nSigsCount > nKeysCount) - return false; + return set_error(serror, SCRIPT_ERR_SIG_COUNT); int isig = ++i; i += nSigsCount; if ((int)stack.size() < i) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); // Subset of script starting at the most recent codeseparator CScript scriptCode(pbegincodehash, pend); @@ -791,12 +856,16 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un valtype& vchSig = stacktop(-isig); valtype& vchPubKey = stacktop(-ikey); - if (!CheckSignatureEncoding(vchSig, flags)) { + // Note how this makes the exact order of pubkey/signature evaluation + // distinguishable by CHECKMULTISIG NOT if the STRICTENC flag is set. + // See the script_(in)valid tests for details. + if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, serror)) { + // serror is set return false; } // Check signature - bool fOk = CheckPubKeyEncoding(vchPubKey, flags) && checker.CheckSig(vchSig, vchPubKey, scriptCode); + bool fOk = checker.CheckSig(vchSig, vchPubKey, scriptCode); if (fOk) { isig++; @@ -806,7 +875,8 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un nKeysCount--; // If there are more signatures left than keys left, - // then too many signatures have failed + // then too many signatures have failed. Exit early, + // without checking any further signatures. if (nSigsCount > nKeysCount) fSuccess = false; } @@ -822,9 +892,9 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un // so optionally verify it is exactly equal to zero prior // to removing it from the stack. if (stack.size() < 1) - return false; + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); if ((flags & SCRIPT_VERIFY_NULLDUMMY) && stacktop(-1).size()) - return error("CHECKMULTISIG dummy argument not null"); + return set_error(serror, SCRIPT_ERR_SIG_NULLDUMMY); popstack(stack); stack.push_back(fSuccess ? vchTrue : vchFalse); @@ -834,44 +904,45 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un if (fSuccess) popstack(stack); else - return false; + return set_error(serror, SCRIPT_ERR_CHECKMULTISIGVERIFY); } } break; default: - return false; + return set_error(serror, SCRIPT_ERR_BAD_OPCODE); } // Size limits if (stack.size() + altstack.size() > 1000) - return false; + return set_error(serror, SCRIPT_ERR_STACK_SIZE); } } catch (...) { - return false; + return set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); } if (!vfExec.empty()) - return false; + return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL); - return true; + return set_success(serror); } namespace { -/** Wrapper that serializes like CTransaction, but with the modifications +/** + * Wrapper that serializes like CTransaction, but with the modifications * required for the signature hash done in-place */ class CTransactionSignatureSerializer { private: - const CTransaction &txTo; // reference to the spending transaction (the one being serialized) - const CScript &scriptCode; // output script being consumed - const unsigned int nIn; // input index of txTo being signed - const bool fAnyoneCanPay; // whether the hashtype has the SIGHASH_ANYONECANPAY flag set - const bool fHashSingle; // whether the hashtype is SIGHASH_SINGLE - const bool fHashNone; // whether the hashtype is SIGHASH_NONE + const CTransaction &txTo; //! reference to the spending transaction (the one being serialized) + const CScript &scriptCode; //! output script being consumed + const unsigned int nIn; //! input index of txTo being signed + const bool fAnyoneCanPay; //! whether the hashtype has the SIGHASH_ANYONECANPAY flag set + const bool fHashSingle; //! whether the hashtype is SIGHASH_SINGLE + const bool fHashNone; //! whether the hashtype is SIGHASH_NONE public: CTransactionSignatureSerializer(const CTransaction &txToIn, const CScript &scriptCodeIn, unsigned int nInIn, int nHashTypeIn) : @@ -950,7 +1021,7 @@ public: ::WriteCompactSize(s, nOutputs); for (unsigned int nOutput = 0; nOutput < nOutputs; nOutput++) SerializeOutput(s, nOutput, nType, nVersion); - // Serialie nLockTime + // Serialize nLockTime ::Serialize(s, txTo.nLockTime, nType, nVersion); } }; @@ -960,14 +1031,14 @@ public: uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType) { if (nIn >= txTo.vin.size()) { - LogPrintf("ERROR: SignatureHash() : nIn=%d out of range\n", nIn); + // nIn out of range return 1; } // Check for invalid use of SIGHASH_SINGLE if ((nHashType & 0x1f) == SIGHASH_SINGLE) { if (nIn >= txTo.vout.size()) { - LogPrintf("ERROR: SignatureHash() : nOut=%d out of range\n", nIn); + // nOut out of range return 1; } } @@ -1007,30 +1078,35 @@ bool SignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn, const vec return true; } -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker) +bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) { + set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); + if ((flags & SCRIPT_VERIFY_SIGPUSHONLY) != 0 && !scriptSig.IsPushOnly()) { - return false; + return set_error(serror, SCRIPT_ERR_SIG_PUSHONLY); } vector<vector<unsigned char> > stack, stackCopy; - if (!EvalScript(stack, scriptSig, flags, checker)) + if (!EvalScript(stack, scriptSig, flags, checker, serror)) + // serror is set return false; if (flags & SCRIPT_VERIFY_P2SH) stackCopy = stack; - if (!EvalScript(stack, scriptPubKey, flags, checker)) + if (!EvalScript(stack, scriptPubKey, flags, checker, serror)) + // serror is set return false; if (stack.empty()) - return false; + return set_error(serror, SCRIPT_ERR_EVAL_FALSE); if (CastToBool(stack.back()) == false) - return false; + return set_error(serror, SCRIPT_ERR_EVAL_FALSE); // Additional validation for spend-to-script-hash transactions: if ((flags & SCRIPT_VERIFY_P2SH) && scriptPubKey.IsPayToScriptHash()) { - if (!scriptSig.IsPushOnly()) // scriptSig must be literals-only - return false; // or validation fails + // scriptSig must be literals-only or validation fails + if (!scriptSig.IsPushOnly()) + return set_error(serror, SCRIPT_ERR_SIG_PUSHONLY); // stackCopy cannot be empty here, because if it was the // P2SH HASH <> EQUAL scriptPubKey would be evaluated with @@ -1041,12 +1117,16 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end()); popstack(stackCopy); - if (!EvalScript(stackCopy, pubKey2, flags, checker)) + if (!EvalScript(stackCopy, pubKey2, flags, checker, serror)) + // serror is set return false; if (stackCopy.empty()) - return false; - return CastToBool(stackCopy.back()); + return set_error(serror, SCRIPT_ERR_EVAL_FALSE); + if (!CastToBool(stackCopy.back())) + return set_error(serror, SCRIPT_ERR_EVAL_FALSE); + else + return set_success(serror); } - return true; + return set_success(serror); } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 5133c80aab..35b2f6c65a 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -3,8 +3,10 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_SCRIPT_INTERPRETER -#define H_BITCOIN_SCRIPT_INTERPRETER +#ifndef BITCOIN_SCRIPT_INTERPRETER_H +#define BITCOIN_SCRIPT_INTERPRETER_H + +#include "script_error.h" #include <vector> #include <stdint.h> @@ -33,8 +35,8 @@ enum SCRIPT_VERIFY_P2SH = (1U << 0), // Passing a non-strict-DER signature or one with undefined hashtype to a checksig operation causes script failure. - // Passing a pubkey that is not (0x04 + 64 bytes) or (0x02 or 0x03 + 32 bytes) to checksig causes that pubkey to be - // skipped (not softfork safe: this flag can widen the validity of OP_CHECKSIG OP_NOT). + // Evaluating a pubkey that is not (0x04 + 64 bytes) or (0x02 or 0x03 + 32 bytes) by checksig causes script failure. + // (softfork safe, but not used or intended as a consensus rule). SCRIPT_VERIFY_STRICTENC = (1U << 1), // Passing a non-strict-DER signature to a checksig operation causes script failure (softfork safe, BIP62 rule 1) @@ -55,7 +57,18 @@ enum // any other push causes the script to fail (BIP62 rule 3). // In addition, whenever a stack element is interpreted as a number, it must be of minimal length (BIP62 rule 4). // (softfork safe) - SCRIPT_VERIFY_MINIMALDATA = (1U << 6) + SCRIPT_VERIFY_MINIMALDATA = (1U << 6), + + // Discourage use of NOPs reserved for upgrades (NOP1-10) + // + // Provided so that nodes can avoid accepting or mining transactions + // containing executed NOP's whose meaning may change after a soft-fork, + // thus rendering the script invalid; with this flag set executing + // discouraged NOPs fails the script. This verification flag will never be + // a mandatory flag applied to scripts in a block. NOPs that are not + // executed, e.g. within an unexecuted IF ENDIF block, are *not* rejected. + SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS = (1U << 7) + }; uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); @@ -85,7 +98,7 @@ public: bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode) const; }; -bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker); -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker); +bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); +bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); -#endif // H_BITCOIN_SCRIPT_INTERPRETER +#endif // BITCOIN_SCRIPT_INTERPRETER_H diff --git a/src/script/script.h b/src/script/script.h index 05f2e7e3a9..9c22cb908c 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_SCRIPT -#define H_BITCOIN_SCRIPT +#ifndef BITCOIN_SCRIPT_SCRIPT_H +#define BITCOIN_SCRIPT_SCRIPT_H #include <assert.h> #include <climits> @@ -179,12 +179,14 @@ public: class CScriptNum { -// Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers. -// The semantics are subtle, though: operands must be in the range [-2^31 +1...2^31 -1], -// but results may overflow (and are valid as long as they are not used in a subsequent -// numeric operation). CScriptNum enforces those semantics by storing results as -// an int64 and allowing out-of-range values to be returned as a vector of bytes but -// throwing an exception if arithmetic is done or the result is interpreted as an integer. +/** + * Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers. + * The semantics are subtle, though: operands must be in the range [-2^31 +1...2^31 -1], + * but results may overflow (and are valid as long as they are not used in a subsequent + * numeric operation). CScriptNum enforces those semantics by storing results as + * an int64 and allowing out-of-range values to be returned as a vector of bytes but + * throwing an exception if arithmetic is done or the result is interpreted as an integer. + */ public: explicit CScriptNum(const int64_t& n) @@ -516,7 +518,7 @@ public: return true; } - // Encode/decode small integers: + /** Encode/decode small integers: */ static int DecodeOP_N(opcodetype opcode) { if (opcode == OP_0) @@ -560,25 +562,31 @@ public: return nFound; } - // Pre-version-0.6, Bitcoin always counted CHECKMULTISIGs - // as 20 sigops. With pay-to-script-hash, that changed: - // CHECKMULTISIGs serialized in scriptSigs are - // counted more accurately, assuming they are of the form - // ... OP_N CHECKMULTISIG ... + /** + * Pre-version-0.6, Bitcoin always counted CHECKMULTISIGs + * as 20 sigops. With pay-to-script-hash, that changed: + * CHECKMULTISIGs serialized in scriptSigs are + * counted more accurately, assuming they are of the form + * ... OP_N CHECKMULTISIG ... + */ unsigned int GetSigOpCount(bool fAccurate) const; - // Accurately count sigOps, including sigOps in - // pay-to-script-hash transactions: + /** + * Accurately count sigOps, including sigOps in + * pay-to-script-hash transactions: + */ unsigned int GetSigOpCount(const CScript& scriptSig) const; bool IsPayToScriptHash() const; - // Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical). + /** Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical). */ bool IsPushOnly() const; - // Returns whether the script is guaranteed to fail at execution, - // regardless of the initial stack. This allows outputs to be pruned - // instantly when entering the UTXO set. + /** + * Returns whether the script is guaranteed to fail at execution, + * regardless of the initial stack. This allows outputs to be pruned + * instantly when entering the UTXO set. + */ bool IsUnspendable() const { return (size() > 0 && *begin() == OP_RETURN); @@ -592,4 +600,4 @@ public: } }; -#endif // H_BITCOIN_SCRIPT +#endif // BITCOIN_SCRIPT_SCRIPT_H diff --git a/src/script/script_error.cpp b/src/script/script_error.cpp new file mode 100644 index 0000000000..5d24ed98ba --- /dev/null +++ b/src/script/script_error.cpp @@ -0,0 +1,71 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "script_error.h" + +const char* ScriptErrorString(const ScriptError serror) +{ + switch (serror) + { + case SCRIPT_ERR_OK: + return "No error"; + case SCRIPT_ERR_EVAL_FALSE: + return "Script evaluated without error but finished with a false/empty top stack element"; + case SCRIPT_ERR_VERIFY: + return "Script failed an OP_VERIFY operation"; + case SCRIPT_ERR_EQUALVERIFY: + return "Script failed an OP_EQUALVERIFY operation"; + case SCRIPT_ERR_CHECKMULTISIGVERIFY: + return "Script failed an OP_CHECKMULTISIGVERIFY operation"; + case SCRIPT_ERR_CHECKSIGVERIFY: + return "Script failed an OP_CHECKSIGVERIFY operation"; + case SCRIPT_ERR_NUMEQUALVERIFY: + return "Script failed an OP_NUMEQUALVERIFY operation"; + case SCRIPT_ERR_SCRIPT_SIZE: + return "Script is too big"; + case SCRIPT_ERR_PUSH_SIZE: + return "Push value size limit exceeded"; + case SCRIPT_ERR_OP_COUNT: + return "Operation limit exceeded"; + case SCRIPT_ERR_STACK_SIZE: + return "Stack size limit exceeded"; + case SCRIPT_ERR_SIG_COUNT: + return "Signature count negative or greater than pubkey count"; + case SCRIPT_ERR_PUBKEY_COUNT: + return "Pubkey count negative or limit exceeded"; + case SCRIPT_ERR_BAD_OPCODE: + return "Opcode missing or not understood"; + case SCRIPT_ERR_DISABLED_OPCODE: + return "Attempted to use a disabled opcode"; + case SCRIPT_ERR_INVALID_STACK_OPERATION: + return "Operation not valid with the current stack size"; + case SCRIPT_ERR_INVALID_ALTSTACK_OPERATION: + return "Operation not valid with the current altstack size"; + case SCRIPT_ERR_OP_RETURN: + return "OP_RETURN was encountered"; + case SCRIPT_ERR_UNBALANCED_CONDITIONAL: + return "Invalid OP_IF construction"; + case SCRIPT_ERR_SIG_HASHTYPE: + return "Signature hash type missing or not understood"; + case SCRIPT_ERR_SIG_DER: + return "Non-canonical DER signature"; + case SCRIPT_ERR_MINIMALDATA: + return "Data push larger than necessary"; + case SCRIPT_ERR_SIG_PUSHONLY: + return "Only non-push operators allowed in signatures"; + case SCRIPT_ERR_SIG_HIGH_S: + return "Non-canonical signature: S value is unnecessarily high"; + case SCRIPT_ERR_SIG_NULLDUMMY: + return "Dummy CHECKMULTISIG argument must be zero"; + case SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS: + return "NOPx reserved for soft-fork upgrades"; + case SCRIPT_ERR_PUBKEYTYPE: + return "Public key is neither compressed or uncompressed"; + case SCRIPT_ERR_UNKNOWN_ERROR: + case SCRIPT_ERR_ERROR_COUNT: + default: break; + } + return "unknown error"; +} diff --git a/src/script/script_error.h b/src/script/script_error.h new file mode 100644 index 0000000000..ac1f2deae5 --- /dev/null +++ b/src/script/script_error.h @@ -0,0 +1,57 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_SCRIPT_ERROR_H +#define BITCOIN_SCRIPT_ERROR_H + +typedef enum ScriptError_t +{ + SCRIPT_ERR_OK = 0, + SCRIPT_ERR_UNKNOWN_ERROR, + SCRIPT_ERR_EVAL_FALSE, + SCRIPT_ERR_OP_RETURN, + + /* Max sizes */ + SCRIPT_ERR_SCRIPT_SIZE, + SCRIPT_ERR_PUSH_SIZE, + SCRIPT_ERR_OP_COUNT, + SCRIPT_ERR_STACK_SIZE, + SCRIPT_ERR_SIG_COUNT, + SCRIPT_ERR_PUBKEY_COUNT, + + /* Failed verify operations */ + SCRIPT_ERR_VERIFY, + SCRIPT_ERR_EQUALVERIFY, + SCRIPT_ERR_CHECKMULTISIGVERIFY, + SCRIPT_ERR_CHECKSIGVERIFY, + SCRIPT_ERR_NUMEQUALVERIFY, + + /* Logical/Format/Canonical errors */ + SCRIPT_ERR_BAD_OPCODE, + SCRIPT_ERR_DISABLED_OPCODE, + SCRIPT_ERR_INVALID_STACK_OPERATION, + SCRIPT_ERR_INVALID_ALTSTACK_OPERATION, + SCRIPT_ERR_UNBALANCED_CONDITIONAL, + + /* BIP62 */ + SCRIPT_ERR_SIG_HASHTYPE, + SCRIPT_ERR_SIG_DER, + SCRIPT_ERR_MINIMALDATA, + SCRIPT_ERR_SIG_PUSHONLY, + SCRIPT_ERR_SIG_HIGH_S, + SCRIPT_ERR_SIG_NULLDUMMY, + SCRIPT_ERR_PUBKEYTYPE, + + /* softfork safeness */ + SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS, + + SCRIPT_ERR_ERROR_COUNT +} ScriptError; + +#define SCRIPT_ERR_LAST SCRIPT_ERR_ERROR_COUNT + +const char* ScriptErrorString(const ScriptError error); + +#endif // BITCOIN_SCRIPT_ERROR_H diff --git a/src/script/sigcache.cpp b/src/script/sigcache.cpp index ab366898d8..5580a5933e 100644 --- a/src/script/sigcache.cpp +++ b/src/script/sigcache.cpp @@ -5,7 +5,7 @@ #include "sigcache.h" -#include "key.h" +#include "pubkey.h" #include "random.h" #include "uint256.h" #include "util.h" @@ -15,13 +15,15 @@ namespace { -// Valid signature cache, to avoid doing expensive ECDSA signature checking -// twice for every transaction (once when accepted into memory pool, and -// again when accepted into the block chain) +/** + * Valid signature cache, to avoid doing expensive ECDSA signature checking + * twice for every transaction (once when accepted into memory pool, and + * again when accepted into the block chain) + */ class CSignatureCache { private: - // sigdata_type is (signature hash, signature, public key): + //! sigdata_type is (signature hash, signature, public key): typedef boost::tuple<uint256, std::vector<unsigned char>, CPubKey> sigdata_type; std::set< sigdata_type> setValid; boost::shared_mutex cs_sigcache; diff --git a/src/script/sigcache.h b/src/script/sigcache.h index 46b8f4d335..df2a2ea13c 100644 --- a/src/script/sigcache.h +++ b/src/script/sigcache.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_SCRIPT_SIGCACHE -#define H_BITCOIN_SCRIPT_SIGCACHE +#ifndef BITCOIN_SCRIPT_SIGCACHE_H +#define BITCOIN_SCRIPT_SIGCACHE_H #include "script/interpreter.h" @@ -23,4 +23,4 @@ public: bool VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const; }; -#endif // H_BITCOIN_SCRIPT_SIGCACHE +#endif // BITCOIN_SCRIPT_SIGCACHE_H diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 0eab0626e5..7dfed751b6 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -46,12 +46,12 @@ bool SignN(const vector<valtype>& multisigdata, const CKeyStore& keystore, uint2 return nSigned==nRequired; } -// -// Sign scriptPubKey with private keys stored in keystore, given transaction hash and hash type. -// Signatures are returned in scriptSigRet (or returns false if scriptPubKey can't be signed), -// unless whichTypeRet is TX_SCRIPTHASH, in which case scriptSigRet is the redemption script. -// Returns false if scriptPubKey could not be completely satisfied. -// +/** + * Sign scriptPubKey with private keys stored in keystore, given transaction hash and hash type. + * Signatures are returned in scriptSigRet (or returns false if scriptPubKey can't be signed), + * unless whichTypeRet is TX_SCRIPTHASH, in which case scriptSigRet is the redemption script. + * Returns false if scriptPubKey could not be completely satisfied. + */ bool Solver(const CKeyStore& keystore, const CScript& scriptPubKey, uint256 hash, int nHashType, CScript& scriptSigRet, txnouttype& whichTypeRet) { @@ -144,9 +144,9 @@ static CScript PushAll(const vector<valtype>& values) return result; } -static CScript CombineMultisig(CScript scriptPubKey, const CMutableTransaction& txTo, unsigned int nIn, +static CScript CombineMultisig(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const vector<valtype>& vSolutions, - vector<valtype>& sigs1, vector<valtype>& sigs2) + const vector<valtype>& sigs1, const vector<valtype>& sigs2) { // Combine all the signatures we've got: set<valtype> allsigs; @@ -199,7 +199,7 @@ static CScript CombineMultisig(CScript scriptPubKey, const CMutableTransaction& return result; } -static CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, unsigned int nIn, +static CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const txnouttype txType, const vector<valtype>& vSolutions, vector<valtype>& sigs1, vector<valtype>& sigs2) { @@ -244,7 +244,7 @@ static CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, return CScript(); } -CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, unsigned int nIn, +CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2) { txnouttype txType; diff --git a/src/script/sign.h b/src/script/sign.h index f218a64562..45a5e0dea3 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_SCRIPT_SIGN -#define H_BITCOIN_SCRIPT_SIGN +#ifndef BITCOIN_SCRIPT_SIGN_H +#define BITCOIN_SCRIPT_SIGN_H #include "script/interpreter.h" @@ -17,8 +17,10 @@ struct CMutableTransaction; bool SignSignature(const CKeyStore& keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL); bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL); -// Given two sets of signatures for scriptPubKey, possibly with OP_0 placeholders, -// combine them intelligently and return the result. -CScript CombineSignatures(CScript scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2); +/** + * Given two sets of signatures for scriptPubKey, possibly with OP_0 placeholders, + * combine them intelligently and return the result. + */ +CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2); -#endif // H_BITCOIN_SCRIPT_SIGN +#endif // BITCOIN_SCRIPT_SIGN_H diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 05938961bc..ab6e6cde0d 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -5,6 +5,7 @@ #include "script/standard.h" +#include "pubkey.h" #include "script/script.h" #include "util.h" #include "utilstrencodings.h" @@ -15,6 +16,8 @@ using namespace std; typedef vector<unsigned char> valtype; +unsigned nMaxDatacarrierBytes = MAX_OP_RETURN_RELAY; + CScriptID::CScriptID(const CScript& in) : uint160(in.size() ? Hash160(in.begin(), in.end()) : 0) {} const char* GetTxnOutputType(txnouttype t) @@ -31,9 +34,9 @@ const char* GetTxnOutputType(txnouttype t) return NULL; } -// -// Return public keys or hashes from scriptPubKey, for 'standard' transaction types. -// +/** + * Return public keys or hashes from scriptPubKey, for 'standard' transaction types. + */ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector<vector<unsigned char> >& vSolutionsRet) { // Templates @@ -139,8 +142,8 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector<vector<unsi } else if (opcode2 == OP_SMALLDATA) { - // small pushdata, <= MAX_OP_RETURN_RELAY bytes - if (vch1.size() > MAX_OP_RETURN_RELAY) + // small pushdata, <= nMaxDatacarrierBytes + if (vch1.size() > nMaxDatacarrierBytes) break; } else if (opcode1 != opcode2 || vch1 != vch2) diff --git a/src/script/standard.h b/src/script/standard.h index 248b941a64..c4b82b4c45 100644 --- a/src/script/standard.h +++ b/src/script/standard.h @@ -3,17 +3,17 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_SCRIPT_STANDARD -#define H_BITCOIN_SCRIPT_STANDARD +#ifndef BITCOIN_SCRIPT_STANDARD_H +#define BITCOIN_SCRIPT_STANDARD_H -#include "key.h" -#include "script/script.h" #include "script/interpreter.h" +#include "uint256.h" #include <boost/variant.hpp> #include <stdint.h> +class CKeyID; class CScript; /** A reference to a CScript: the Hash160 of its serialization (see script.h) */ @@ -25,26 +25,32 @@ public: CScriptID(const uint160& in) : uint160(in) {} }; -static const unsigned int MAX_OP_RETURN_RELAY = 40; // bytes - -// Mandatory script verification flags that all new blocks must comply with for -// them to be valid. (but old blocks may not comply with) Currently just P2SH, -// but in the future other flags may be added, such as a soft-fork to enforce -// strict DER encoding. -// -// Failing one of these tests may trigger a DoS ban - see CheckInputs() for -// details. +static const unsigned int MAX_OP_RETURN_RELAY = 40; //! bytes +extern unsigned nMaxDatacarrierBytes; + +/** + * Mandatory script verification flags that all new blocks must comply with for + * them to be valid. (but old blocks may not comply with) Currently just P2SH, + * but in the future other flags may be added, such as a soft-fork to enforce + * strict DER encoding. + * + * Failing one of these tests may trigger a DoS ban - see CheckInputs() for + * details. + */ static const unsigned int MANDATORY_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH; -// Standard script verification flags that standard transactions will comply -// with. However scripts violating these flags may still be present in valid -// blocks and we must accept those blocks. +/** + * Standard script verification flags that standard transactions will comply + * with. However scripts violating these flags may still be present in valid + * blocks and we must accept those blocks. + */ static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS | SCRIPT_VERIFY_STRICTENC | SCRIPT_VERIFY_MINIMALDATA | - SCRIPT_VERIFY_NULLDUMMY; + SCRIPT_VERIFY_NULLDUMMY | + SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS; -// For convenience, standard but not mandatory verify flags. +/** For convenience, standard but not mandatory verify flags. */ static const unsigned int STANDARD_NOT_MANDATORY_VERIFY_FLAGS = STANDARD_SCRIPT_VERIFY_FLAGS & ~MANDATORY_SCRIPT_VERIFY_FLAGS; enum txnouttype @@ -64,7 +70,8 @@ public: friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; } }; -/** A txout script template with a specific destination. It is either: +/** + * A txout script template with a specific destination. It is either: * * CNoDestination: no destination set * * CKeyID: TX_PUBKEYHASH destination * * CScriptID: TX_SCRIPTHASH destination @@ -83,4 +90,4 @@ bool ExtractDestinations(const CScript& scriptPubKey, txnouttype& typeRet, std:: CScript GetScriptForDestination(const CTxDestination& dest); CScript GetScriptForMultisig(int nRequired, const std::vector<CPubKey>& keys); -#endif // H_BITCOIN_SCRIPT_STANDARD +#endif // BITCOIN_SCRIPT_STANDARD_H diff --git a/src/secp256k1/.gitignore b/src/secp256k1/.gitignore new file mode 100644 index 0000000000..f0a54077a5 --- /dev/null +++ b/src/secp256k1/.gitignore @@ -0,0 +1,35 @@ +bench_inv +bench_sign +bench_verify +tests +*.exe +*.so +*.a +!.gitignore + +Makefile +configure +.libs/ +Makefile.in +aclocal.m4 +autom4te.cache/ +config.log +config.status +*.tar.gz +*.la +libtool +.deps/ +.dirstamp +build-aux/ +*.lo +*.o +*~ +src/libsecp256k1-config.h +src/libsecp256k1-config.h.in +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 +src/stamp-h1 +libsecp256k1.pc diff --git a/src/secp256k1/.travis.yml b/src/secp256k1/.travis.yml new file mode 100644 index 0000000000..24a86b561b --- /dev/null +++ b/src/secp256k1/.travis.yml @@ -0,0 +1,25 @@ +language: cpp +compiler: gcc +install: + - sudo apt-get install -qq libssl-dev + - if [ "$BIGNUM" = "gmp" -o "$BIGNUM" = "auto" -o "$FIELD" = "gmp" ]; then sudo apt-get install -qq libgmp-dev; fi + - if [ "$FIELD" = "64bit_asm" ]; then sudo apt-get install -qq yasm; fi +env: + global: + - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no BUILD=check EXTRAFLAGS= + matrix: + - SCALAR=32bit + - SCALAR=64bit + - FIELD=gmp + - FIELD=gmp ENDOMORPHISM=yes + - FIELD=64bit_asm + - FIELD=64bit_asm ENDOMORPHISM=yes + - FIELD=64bit + - FIELD=64bit ENDOMORPHISM=yes + - FIELD=32bit + - FIELD=32bit ENDOMORPHISM=yes + - BUILD=distcheck + - EXTRAFLAGS=CFLAGS=-DDETERMINISTIC +before_script: ./autogen.sh +script: ./configure --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR $EXTRAFLAGS && make -j2 $BUILD +os: linux diff --git a/src/secp256k1/COPYING b/src/secp256k1/COPYING new file mode 100644 index 0000000000..4522a5990e --- /dev/null +++ b/src/secp256k1/COPYING @@ -0,0 +1,19 @@ +Copyright (c) 2013 Pieter Wuille + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/secp256k1/Makefile.am b/src/secp256k1/Makefile.am new file mode 100644 index 0000000000..d527da6b77 --- /dev/null +++ b/src/secp256k1/Makefile.am @@ -0,0 +1,88 @@ +ACLOCAL_AMFLAGS = -I build-aux/m4 + +lib_LTLIBRARIES = libsecp256k1.la +if USE_ASM +COMMON_LIB = libsecp256k1_common.la +else +COMMON_LIB = +endif +noinst_LTLIBRARIES = $(COMMON_LIB) +include_HEADERS = include/secp256k1.h +noinst_HEADERS = +noinst_HEADERS += src/scalar.h +noinst_HEADERS += src/scalar_4x64.h +noinst_HEADERS += src/scalar_8x32.h +noinst_HEADERS += src/scalar_impl.h +noinst_HEADERS += src/scalar_4x64_impl.h +noinst_HEADERS += src/scalar_8x32_impl.h +noinst_HEADERS += src/group.h +noinst_HEADERS += src/group_impl.h +noinst_HEADERS += src/num_gmp.h +noinst_HEADERS += src/num_gmp_impl.h +noinst_HEADERS += src/ecdsa.h +noinst_HEADERS += src/ecdsa_impl.h +noinst_HEADERS += src/eckey.h +noinst_HEADERS += src/eckey_impl.h +noinst_HEADERS += src/ecmult.h +noinst_HEADERS += src/ecmult_impl.h +noinst_HEADERS += src/ecmult_gen.h +noinst_HEADERS += src/ecmult_gen_impl.h +noinst_HEADERS += src/num.h +noinst_HEADERS += src/num_impl.h +noinst_HEADERS += src/field_10x26.h +noinst_HEADERS += src/field_10x26_impl.h +noinst_HEADERS += src/field_5x52.h +noinst_HEADERS += src/field_5x52_impl.h +noinst_HEADERS += src/field_5x52_int128_impl.h +noinst_HEADERS += src/field_5x52_asm_impl.h +noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h +noinst_HEADERS += src/util.h +noinst_HEADERS += src/testrand.h +noinst_HEADERS += src/testrand_impl.h +noinst_HEADERS += src/field_gmp.h +noinst_HEADERS += src/field_gmp_impl.h +noinst_HEADERS += src/field.h +noinst_HEADERS += src/field_impl.h + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libsecp256k1.pc + +if USE_ASM +libsecp256k1_common_la_SOURCES = src/field_5x52_asm.asm +endif + +libsecp256k1_la_SOURCES = src/secp256k1.c +libsecp256k1_la_CPPFLAGS = -I$(top_srcdir)/include $(SECP_INCLUDES) +libsecp256k1_la_LIBADD = $(COMMON_LIB) $(SECP_LIBS) + + +noinst_PROGRAMS = +if USE_BENCHMARK +noinst_PROGRAMS += bench_verify bench_sign bench_inv +bench_verify_SOURCES = src/bench_verify.c +bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) +bench_verify_LDFLAGS = -static +bench_sign_SOURCES = src/bench_sign.c +bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) +bench_sign_LDFLAGS = -static +bench_inv_SOURCES = src/bench_inv.c +bench_inv_LDADD = $(COMMON_LIB) $(SECP_LIBS) +bench_inv_LDFLAGS = -static +endif + +if USE_TESTS +noinst_PROGRAMS += tests +tests_SOURCES = src/tests.c +tests_CPPFLAGS = -DVERIFY $(SECP_TEST_INCLUDES) +tests_LDADD = $(COMMON_LIB) $(SECP_LIBS) $(SECP_TEST_LIBS) +tests_LDFLAGS = -static +TESTS = tests +endif + +EXTRA_DIST = autogen.sh nasm_lt.sh + +#x86_64 only +if USE_ASM +.asm.lo: + $(LIBTOOL) --mode=compile --tag YASM $(srcdir)/nasm_lt.sh $(YASM) -f $(YASM_BINFMT) $(YAFLAGS) -I$(srcdir) -I. $< -o $@ +endif diff --git a/src/secp256k1/README.md b/src/secp256k1/README.md new file mode 100644 index 0000000000..1e49f49416 --- /dev/null +++ b/src/secp256k1/README.md @@ -0,0 +1,55 @@ +libsecp256k1 +============ + +[![Build Status](https://travis-ci.org/bitcoin/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin/secp256k1) + +Optimized C library for EC operations on curve secp256k1. + +This library is experimental, so use at your own risk. + +Features: +* Low-level field and group operations on secp256k1. +* ECDSA signing/verification and key generation. +* Adding/multiplying private/public keys. +* Serialization/parsing of private keys, public keys, signatures. +* Very efficient implementation. + +Implementation details +---------------------- + +* General + * Avoid dynamic memory usage almost everywhere. +* Field operations + * Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1). + * Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys). + * Using 10 26-bit limbs. + * Using GMP. + * Field inverses and square roots using a sliding window over blocks of 1s (by Peter Dettman). +* Scalar operations + * Optimized implementation without data-dependent branches of arithmetic modulo the curve's order. + * Using 4 64-bit limbs (relying on __int128 support in the compiler). + * Using 8 32-bit limbs. +* Group operations + * Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7). + * Use addition between points in Jacobian and affine coordinates where possible. + * Use a unified addition/doubling formula where necessary to avoid data-dependent branches. +* Point multiplication for verification (a*P + b*G). + * Use wNAF notation for point multiplicands. + * Use a much larger window for multiples of G, using precomputed multiples. + * Use Shamir's trick to do the multiplication with the public key and the generator simultaneously. + * Optionally use secp256k1's efficiently-computable endomorphism to split the multiplicands into 4 half-sized ones first. +* Point multiplication for signing + * Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions. + * Slice the precomputed table in memory per byte, so memory access to the table becomes uniform. + * No data-dependent branches + * The precomputed tables add and eventually subtract points for which no known scalar (private key) is known, preventing even an attacker with control over the private key used to control the data internally. + +Build steps +----------- + +libsecp256k1 is built using autotools: + + $ ./autogen.sh + $ ./configure + $ make + $ sudo make install # optional diff --git a/src/secp256k1/TODO b/src/secp256k1/TODO new file mode 100644 index 0000000000..a300e1c5eb --- /dev/null +++ b/src/secp256k1/TODO @@ -0,0 +1,3 @@ +* Unit tests for fieldelem/groupelem, including ones intended to + trigger fieldelem's boundary cases. +* Complete constant-time operations for signing/keygen diff --git a/src/secp256k1/autogen.sh b/src/secp256k1/autogen.sh new file mode 100755 index 0000000000..65286b9353 --- /dev/null +++ b/src/secp256k1/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -e +autoreconf -if --warnings=all diff --git a/src/secp256k1/build-aux/m4/bitcoin_secp.m4 b/src/secp256k1/build-aux/m4/bitcoin_secp.m4 new file mode 100644 index 0000000000..e6f3470ed7 --- /dev/null +++ b/src/secp256k1/build-aux/m4/bitcoin_secp.m4 @@ -0,0 +1,90 @@ +dnl libsecp25k1 helper checks +AC_DEFUN([SECP_INT128_CHECK],[ +has_int128=$ac_cv_type___int128 +if test x"$has_int128" != x"yes" && test x"$set_field" = x"64bit"; then + AC_MSG_ERROR([$set_field field support explicitly requested but is not compatible with this host]) +fi +if test x"$has_int128" != x"yes" && test x"$set_scalar" = x"64bit"; then + AC_MSG_ERROR([$set_scalar scalar support explicitly requested but is not compatible with this host]) +fi +]) + +dnl +AC_DEFUN([SECP_64BIT_ASM_CHECK],[ +if test x"$host_cpu" == x"x86_64"; then + AC_CHECK_PROG(YASM, yasm, yasm) +else + if test x"$set_field" = x"64bit_asm"; then + AC_MSG_ERROR([$set_field field support explicitly requested but is not compatible with this host]) + fi +fi +if test x$YASM = x; then + if test x"$set_field" = x"64bit_asm"; then + AC_MSG_ERROR([$set_field field support explicitly requested but yasm was not found]) + fi + has_64bit_asm=no +else + case x"$host_os" in + xdarwin*) + YASM_BINFMT=macho64 + ;; + x*-gnux32) + YASM_BINFMT=elfx32 + ;; + *) + YASM_BINFMT=elf64 + ;; + esac + if $YASM -f help | grep -q $YASM_BINFMT; then + has_64bit_asm=yes + else + if test x"$set_field" = x"64bit_asm"; then + AC_MSG_ERROR([$set_field field support explicitly requested but yasm doesn't support $YASM_BINFMT format]) + fi + AC_MSG_WARN([yasm too old for $YASM_BINFMT format]) + has_64bit_asm=no + fi +fi +]) + +dnl +AC_DEFUN([SECP_OPENSSL_CHECK],[ +if test x"$use_pkgconfig" = x"yes"; then + : #NOP + m4_ifdef([PKG_CHECK_MODULES],[ + PKG_CHECK_MODULES([CRYPTO], [libcrypto], [has_libcrypto=yes; AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])],[has_libcrypto=no]) + : #NOP + ]) +else + AC_CHECK_HEADER(openssl/crypto.h,[AC_CHECK_LIB(crypto, main,[has_libcrypto=yes; CRYPTO_LIBS=-lcrypto; AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])] +)]) + LIBS= +fi +if test x"$has_libcrypto" == x"yes" && test x"$has_openssl_ec" = x; then + AC_MSG_CHECKING(for EC functions in libcrypto) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <openssl/ec.h> + #include <openssl/ecdsa.h> + #include <openssl/obj_mac.h>]],[[ + EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_secp256k1); + ECDSA_sign(0, NULL, 0, NULL, NULL, eckey); + ECDSA_verify(0, NULL, 0, NULL, 0, eckey); + EC_KEY_free(eckey); + ]])],[has_openssl_ec=yes],[has_openssl_ec=no]) + AC_MSG_RESULT([$has_openssl_ec]) +fi +]) + +dnl +AC_DEFUN([SECP_GMP_CHECK],[ +if test x"$has_gmp" != x"yes"; then + AC_CHECK_HEADER(gmp.h,[AC_CHECK_LIB(gmp, __gmpz_init,[has_gmp=yes; GMP_LIBS=-lgmp; AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])])]) +fi +if test x"$set_field" = x"gmp" && test x"$has_gmp" != x"yes"; then + AC_MSG_ERROR([$set_field field support explicitly requested but libgmp was not found]) +fi +if test x"$set_bignum" = x"gmp" && test x"$has_gmp" != x"yes"; then + AC_MSG_ERROR([$set_bignum field support explicitly requested but libgmp was not found]) +fi +]) + diff --git a/src/secp256k1/configure.ac b/src/secp256k1/configure.ac new file mode 100644 index 0000000000..2da5709834 --- /dev/null +++ b/src/secp256k1/configure.ac @@ -0,0 +1,259 @@ +AC_PREREQ([2.60]) +AC_INIT([libsecp256k1],[0.1]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_MACRO_DIR([build-aux/m4]) +AC_CANONICAL_HOST +AH_TOP([#ifndef LIBSECP256K1_CONFIG_H]) +AH_TOP([#define LIBSECP256K1_CONFIG_H]) +AH_BOTTOM([#endif //LIBSECP256K1_CONFIG_H]) +AM_INIT_AUTOMAKE([foreign]) +LT_INIT + +dnl make the compilation flags quiet unless V=1 is used +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +PKG_PROG_PKG_CONFIG + +AC_PATH_TOOL(AR, ar) +AC_PATH_TOOL(RANLIB, ranlib) +AC_PATH_TOOL(STRIP, strip) + +AC_PROG_CC_C99 +if test x"$ac_cv_prog_cc_c99" == x"no"; then + AC_MSG_ERROR([c99 compiler support required]) +fi + +case $host in + *mingw*) + use_pkgconfig=no + ;; + *) + use_pkgconfig=yes + ;; +esac + +case $host_os in + darwin*) + CPPFLAGS="$CPPFLAGS -I/opt/local/include" + LDFLAGS="$LDFLAGS -L/opt/local/lib" + ;; +esac + +CFLAGS="$CFLAGS -W" + +warn_CFLAGS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function" +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $warn_CFLAGS" +AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) + + +AC_ARG_ENABLE(benchmark, + AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is yes)]), + [use_benchmark=$enableval], + [use_benchmark=yes]) + +AC_ARG_ENABLE(tests, + AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), + [use_tests=$enableval], + [use_tests=yes]) + +AC_ARG_ENABLE(endomorphism, + AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), + [use_endomorphism=$enableval], + [use_endomorphism=no]) + +AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=gmp|64bit|64bit_asm|32bit|auto], +[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) + +AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|auto], +[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto]) + +AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto], +[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto]) + +AC_CHECK_TYPES([__int128]) + +AC_CHECK_DECL(__builtin_expect,AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]),,) + +if test x"$req_field" = x"auto"; then + SECP_64BIT_ASM_CHECK + if test x"$has_64bit_asm" = x"yes"; then + set_field=64bit_asm + fi + + if test x"$set_field" = x; then + SECP_INT128_CHECK + if test x"$has_int128" = x"yes"; then + set_field=64bit + fi + fi + + if test x"$set_field" = x; then + SECP_GMP_CHECK + if test x"$has_gmp" = x"yes"; then + set_field=gmp + fi + fi + + if test x"$set_field" = x; then + set_field=32bit + fi +else + set_field=$req_field + case $set_field in + 64bit_asm) + SECP_64BIT_ASM_CHECK + ;; + 64bit) + SECP_INT128_CHECK + ;; + gmp) + SECP_GMP_CHECK + ;; + 32bit) + ;; + *) + AC_MSG_ERROR([invalid field implementation selection]) + ;; + esac +fi + +if test x"$req_scalar" = x"auto"; then + if test x"$set_scalar" = x; then + SECP_INT128_CHECK + if test x"$has_int128" = x"yes"; then + set_scalar=64bit + fi + fi + if test x"$set_scalar" = x; then + set_scalar=32bit + fi +else + set_scalar=$req_scalar + case $set_scalar in + 64bit) + SECP_INT128_CHECK + ;; + 32bit) + ;; + *) + AC_MSG_ERROR([invalid scalar implementation selected]) + ;; + esac +fi + +if test x"$req_bignum" = x"auto"; then + SECP_GMP_CHECK + if test x"$has_gmp" = x"yes"; then + set_bignum=gmp + fi + + if test x"$set_bignum" = x; then + AC_MSG_ERROR([no working bignum implementation found]) + fi +else + set_bignum=$req_bignum + case $set_bignum in + gmp) + SECP_GMP_CHECK + ;; + openssl) + SECP_OPENSSL_CHECK + ;; + *) + AC_MSG_ERROR([invalid bignum implementation selection]) + ;; + esac +fi + +# select field implementation +case $set_field in +64bit_asm) + AC_DEFINE(USE_FIELD_5X52_ASM, 1, [Define this symbol to use the assembly version for the 5x52 field implementation]) + AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation]) + ;; +64bit) + AC_DEFINE(USE_FIELD_5X52_INT128, 1, [Define this symbol to use the __int128 version for the 5x52 field implementation]) + AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation]) + ;; +gmp) + AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed]) + AC_DEFINE(USE_FIELD_GMP, 1, [Define this symbol to use the FIELD_GMP implementation]) + ;; +32bit) + AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation]) + ;; +*) + AC_MSG_ERROR([invalid field implementation]) + ;; +esac + +# select bignum implementation +case $set_bignum in +gmp) + AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed]) + AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation]) + AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the USE_FIELD_INV_NUM implementation]) + ;; +*) + AC_MSG_ERROR([invalid bignum implementation]) + ;; +esac + +#select scalar implementation +case $set_scalar in +64bit) + AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation]) + ;; +32bit) + AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation]) + ;; +*) + AC_MSG_ERROR([invalid scalar implementation]) + ;; +esac + +if test x"$use_tests" = x"yes"; then + SECP_OPENSSL_CHECK + if test x"$has_openssl_ec" == x"yes"; then + AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) + SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" + SECP_TEST_LIBS="$CRYPTO_LIBS" + + case $host in + *mingw*) + SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" + ;; + esac + + fi +fi + +if test x"$set_field" = x"gmp" || test x"$set_bignum" = x"gmp"; then + SECP_LIBS="$SECP_LIBS $GMP_LIBS" +fi + +if test x"$use_endomorphism" = x"yes"; then + AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism]) +fi + +AC_MSG_NOTICE([Using field implementation: $set_field]) +AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) +AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) + +AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) +AC_CONFIG_FILES([Makefile libsecp256k1.pc]) +AC_SUBST(SECP_INCLUDES) +AC_SUBST(SECP_LIBS) +AC_SUBST(SECP_TEST_LIBS) +AC_SUBST(SECP_TEST_INCLUDES) +AC_SUBST(YASM_BINFMT) +AM_CONDITIONAL([USE_ASM], [test x"$set_field" == x"64bit_asm"]) +AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) +AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" != x"no"]) +AC_OUTPUT diff --git a/src/secp256k1/include/secp256k1.h b/src/secp256k1/include/secp256k1.h new file mode 100644 index 0000000000..932bf0279f --- /dev/null +++ b/src/secp256k1/include/secp256k1.h @@ -0,0 +1,252 @@ +#ifndef _SECP256K1_ +# define _SECP256K1_ + +# ifdef __cplusplus +extern "C" { +# endif + +# if !defined(SECP256K1_GNUC_PREREQ) +# if defined(__GNUC__)&&defined(__GNUC_MINOR__) +# define SECP256K1_GNUC_PREREQ(_maj,_min) \ + ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) +# else +# define SECP256K1_GNUC_PREREQ(_maj,_min) 0 +# endif +# endif + +# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if SECP256K1_GNUC_PREREQ(3,0) +# define SECP256K1_RESTRICT __restrict__ +# elif (defined(_MSC_VER) && _MSC_VER >= 1400) +# define SECP256K1_RESTRICT __restrict +# else +# define SECP256K1_RESTRICT +# endif +# else +# define SECP256K1_RESTRICT restrict +# endif + +# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if SECP256K1_GNUC_PREREQ(2,7) +# define SECP256K1_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define SECP256K1_INLINE __inline +# else +# define SECP256K1_INLINE +# endif +# else +# define SECP256K1_INLINE inline +# endif + +/**Warning attributes + * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out + * some paranoid null checks. */ +# if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) +# define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) +# else +# define SECP256K1_WARN_UNUSED_RESULT +# endif +# if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) +# define SECP256K1_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) +# else +# define SECP256K1_ARG_NONNULL(_x) +# endif + + +/** Flags to pass to secp256k1_start. */ +# define SECP256K1_START_VERIFY (1 << 0) +# define SECP256K1_START_SIGN (1 << 1) + +/** Initialize the library. This may take some time (10-100 ms). + * You need to call this before calling any other function. + * It cannot run in parallel with any other functions, but once + * secp256k1_start() returns, all other functions are thread-safe. + */ +void secp256k1_start(unsigned int flags); + +/** Free all memory associated with this library. After this, no + * functions can be called anymore, except secp256k1_start() + */ +void secp256k1_stop(void); + +/** Verify an ECDSA signature. + * Returns: 1: correct signature + * 0: incorrect signature + * -1: invalid public key + * -2: invalid signature + * In: msg: the message being verified (cannot be NULL) + * msglen: the length of the message (at most 32) + * sig: the signature being verified (cannot be NULL) + * siglen: the length of the signature + * pubkey: the public key to verify with (cannot be NULL) + * pubkeylen: the length of pubkey + * Requires starting using SECP256K1_START_VERIFY. + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( + const unsigned char *msg, + int msglen, + const unsigned char *sig, + int siglen, + const unsigned char *pubkey, + int pubkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); + +/** Create an ECDSA signature. + * Returns: 1: signature created + * 0: nonce invalid, try another one + * In: msg: the message being signed (cannot be NULL) + * msglen: the length of the message being signed (at most 32) + * seckey: pointer to a 32-byte secret key (cannot be NULL, assumed to be valid) + * nonce: pointer to a 32-byte nonce (cannot be NULL, generated with a cryptographic PRNG) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In/Out: siglen: pointer to an int with the length of sig, which will be updated + * to contain the actual signature length (<=72). + * Requires starting using SECP256K1_START_SIGN. + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_sign( + const unsigned char *msg, + int msglen, + unsigned char *sig, + int *siglen, + const unsigned char *seckey, + const unsigned char *nonce +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5) SECP256K1_ARG_NONNULL(6); + +/** Create a compact ECDSA signature (64 byte + recovery id). + * Returns: 1: signature created + * 0: nonce invalid, try another one + * In: msg: the message being signed (cannot be NULL) + * msglen: the length of the message being signed (at most 32) + * seckey: pointer to a 32-byte secret key (cannot be NULL, assumed to be valid) + * nonce: pointer to a 32-byte nonce (cannot be NULL, generated with a cryptographic PRNG) + * Out: sig: pointer to a 64-byte array where the signature will be placed (cannot be NULL) + * recid: pointer to an int, which will be updated to contain the recovery id (can be NULL) + * Requires starting using SECP256K1_START_SIGN. + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_sign_compact( + const unsigned char *msg, + int msglen, + unsigned char *sig64, + const unsigned char *seckey, + const unsigned char *nonce, + int *recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); + +/** Recover an ECDSA public key from a compact signature. + * Returns: 1: public key successfully recovered (which guarantees a correct signature). + * 0: otherwise. + * In: msg: the message assumed to be signed (cannot be NULL) + * msglen: the length of the message (at most 32) + * sig64: signature as 64 byte array (cannot be NULL) + * compressed: whether to recover a compressed or uncompressed pubkey + * recid: the recovery id (0-3, as returned by ecdsa_sign_compact) + * Out: pubkey: pointer to a 33 or 65 byte array to put the pubkey (cannot be NULL) + * pubkeylen: pointer to an int that will contain the pubkey length (cannot be NULL) + * Requires starting using SECP256K1_START_VERIFY. + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact( + const unsigned char *msg, + int msglen, + const unsigned char *sig64, + unsigned char *pubkey, + int *pubkeylen, + int compressed, + int recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); + +/** Verify an ECDSA secret key. + * Returns: 1: secret key is valid + * 0: secret key is invalid + * In: seckey: pointer to a 32-byte secret key (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(const unsigned char *seckey) SECP256K1_ARG_NONNULL(1); + +/** Just validate a public key. + * Returns: 1: valid public key + * 0: invalid public key + * In: pubkey: pointer to a 33-byte or 65-byte public key (cannot be NULL). + * pubkeylen: length of pubkey + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify(const unsigned char *pubkey, int pubkeylen) SECP256K1_ARG_NONNULL(1); + +/** Compute the public key for a secret key. + * In: compressed: whether the computed public key should be compressed + * seckey: pointer to a 32-byte private key (cannot be NULL) + * Out: pubkey: pointer to a 33-byte (if compressed) or 65-byte (if uncompressed) + * area to store the public key (cannot be NULL) + * pubkeylen: pointer to int that will be updated to contains the pubkey's + * length (cannot be NULL) + * Returns: 1: secret was valid, public key stores + * 0: secret was invalid, try again. + * Requires starting using SECP256K1_START_SIGN. + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( + unsigned char *pubkey, + int *pubkeylen, + const unsigned char *seckey, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Decompress a public key. + * In/Out: pubkey: pointer to a 65-byte array to put the decompressed public key. + It must contain a 33-byte or 65-byte public key already (cannot be NULL) + * pubkeylen: pointer to the size of the public key pointed to by pubkey (cannot be NULL) + It will be updated to reflect the new size. + * Returns: 0 if the passed public key was invalid, 1 otherwise. If 1 is returned, the + pubkey is replaced with its decompressed version. + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress( + unsigned char *pubkey, + int *pubkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Export a private key in DER format. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_export( + const unsigned char *seckey, + unsigned char *privkey, + int *privkeylen, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Import a private key in DER format. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import( + unsigned char *seckey, + const unsigned char *privkey, + int privkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Tweak a private key by adding tweak to it. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Tweak a public key by adding tweak times the generator to it. + * Requires starting with SECP256K1_START_VERIFY. + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( + unsigned char *pubkey, + int pubkeylen, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3); + +/** Tweak a private key by multiplying it with tweak. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Tweak a public key by multiplying it with tweak. + * Requires starting with SECP256K1_START_VERIFY. + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( + unsigned char *pubkey, + int pubkeylen, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/src/secp256k1/libsecp256k1.pc.in b/src/secp256k1/libsecp256k1.pc.in new file mode 100644 index 0000000000..1c72dd0003 --- /dev/null +++ b/src/secp256k1/libsecp256k1.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libsecp256k1 +Description: Optimized C library for EC operations on curve secp256k1 +URL: https://github.com/bitcoin/secp256k1 +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} +Libs.private: @SECP_LIBS@ +Libs: -L${libdir} -lsecp256k1 + diff --git a/src/secp256k1/nasm_lt.sh b/src/secp256k1/nasm_lt.sh new file mode 100755 index 0000000000..6cd73294c0 --- /dev/null +++ b/src/secp256k1/nasm_lt.sh @@ -0,0 +1,57 @@ +#! /bin/sh +command="" +infile="" +o_opt=no +pic=no +while [ $# -gt 0 ]; do + case "$1" in + -DPIC|-fPIC|-fpic|-Kpic|-KPIC) + if [ "$pic" != "yes" ] ; then + command="$command -DPIC" + pic=yes + fi + ;; + -f|-fbin|-faout|-faoutb|-fcoff|-felf|-felf64|-fas86| \ + -fobj|-fwin32|-fwin64|-frdf|-fieee|-fmacho|-fmacho64) + # it's a file format specifier for nasm. + command="$command $1" + ;; + -f*) + # maybe a code-generation flag for gcc. + ;; + -[Ii]*) + incdir=`echo "$1" | sed 's/^-[Ii]//'` + if [ "x$incdir" = x -a "x$2" != x ] ; then + case "$2" in + -*) ;; + *) incdir="$2"; shift;; + esac + fi + if [ "x$incdir" != x ] ; then + # In the case of NASM, the trailing slash is necessary. + incdir=`echo "$incdir" | sed 's%/*$%/%'` + command="$command -I$incdir" + fi + ;; + -o*) + o_opt=yes + command="$command $1" + ;; + *.asm) + infile=$1 + command="$command $1" + ;; + *) + command="$command $1" + ;; + esac + shift +done +if [ "$o_opt" != yes ] ; then + # By default, NASM creates an output file + # in the same directory as the input file. + outfile="-o `echo $infile | sed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.o" + command="$command $outfile" +fi +echo $command +exec $command diff --git a/src/secp256k1/.empty b/src/secp256k1/obj/.gitignore index e69de29bb2..e69de29bb2 100644 --- a/src/secp256k1/.empty +++ b/src/secp256k1/obj/.gitignore diff --git a/src/secp256k1/src/bench_inv.c b/src/secp256k1/src/bench_inv.c new file mode 100644 index 0000000000..d6f664333f --- /dev/null +++ b/src/secp256k1/src/bench_inv.c @@ -0,0 +1,41 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +#include <stdio.h> + +#include "include/secp256k1.h" + +#include "util.h" +#include "num_impl.h" +#include "field_impl.h" +#include "group_impl.h" +#include "scalar_impl.h" + +int main(void) { + static const unsigned char init[32] = { + 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13, + 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35, + 0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, + 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83 + }; + static const unsigned char fini[32] = { + 0xba, 0x28, 0x58, 0xd8, 0xaa, 0x11, 0xd6, 0xf2, + 0xfa, 0xce, 0x50, 0xb1, 0x67, 0x19, 0xb1, 0xa6, + 0xe0, 0xaa, 0x84, 0x53, 0xf6, 0x80, 0xfc, 0x23, + 0x88, 0x3c, 0xd6, 0x74, 0x9f, 0x27, 0x09, 0x03 + }; + secp256k1_ge_start(); + secp256k1_scalar_t base, x; + secp256k1_scalar_set_b32(&base, init, NULL); + secp256k1_scalar_set_b32(&x, init, NULL); + for (int i=0; i<1000000; i++) { + secp256k1_scalar_inverse(&x, &x); + secp256k1_scalar_add(&x, &x, &base); + } + unsigned char res[32]; + secp256k1_scalar_get_b32(res, &x); + CHECK(memcmp(res, fini, 32) == 0); + return 0; +} diff --git a/src/secp256k1/src/bench_sign.c b/src/secp256k1/src/bench_sign.c new file mode 100644 index 0000000000..f01f11d689 --- /dev/null +++ b/src/secp256k1/src/bench_sign.c @@ -0,0 +1,49 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +#include <stdio.h> +#include <string.h> + +#include "include/secp256k1.h" +#include "util.h" + +int main(void) { + secp256k1_start(SECP256K1_START_SIGN); + + unsigned char msg[32]; + unsigned char nonce[32]; + unsigned char key[32]; + + for (int i = 0; i < 32; i++) msg[i] = i + 1; + for (int i = 0; i < 32; i++) nonce[i] = i + 33; + for (int i = 0; i < 32; i++) key[i] = i + 65; + + unsigned char sig[64]; + + for (int i=0; i<1000000; i++) { + int recid = 0; + CHECK(secp256k1_ecdsa_sign_compact(msg, 32, sig, key, nonce, &recid)); + for (int j = 0; j < 32; j++) { + nonce[j] = key[j]; /* Move former key to nonce */ + msg[j] = sig[j]; /* Move former R to message. */ + key[j] = sig[j + 32]; /* Move former S to key. */ + } + } + + static const unsigned char fini[64] = { + 0x92, 0x03, 0xef, 0xf1, 0x58, 0x0b, 0x49, 0x8d, + 0x22, 0x3d, 0x49, 0x0e, 0xbf, 0x26, 0x50, 0x0e, + 0x2d, 0x62, 0x90, 0xd7, 0x82, 0xbd, 0x3d, 0x5c, + 0xa9, 0x10, 0xa5, 0x49, 0xb1, 0xd8, 0x8c, 0xc0, + 0x5b, 0x5e, 0x9e, 0x68, 0x51, 0x3d, 0xe8, 0xec, + 0x82, 0x30, 0x82, 0x88, 0x8c, 0xfd, 0xe7, 0x71, + 0x15, 0x92, 0xfc, 0x14, 0x59, 0x78, 0x31, 0xb3, + 0xf6, 0x07, 0x91, 0x18, 0x00, 0x8d, 0x4c, 0xb2 + }; + CHECK(memcmp(sig, fini, 64) == 0); + + secp256k1_stop(); + return 0; +} diff --git a/src/secp256k1/src/bench_verify.c b/src/secp256k1/src/bench_verify.c new file mode 100644 index 0000000000..690595516d --- /dev/null +++ b/src/secp256k1/src/bench_verify.c @@ -0,0 +1,44 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include <stdio.h> +#include <string.h> + +#include "include/secp256k1.h" +#include "util.h" + +int main(void) { + secp256k1_start(SECP256K1_START_VERIFY); + + unsigned char msg[32]; + unsigned char sig[64]; + + for (int i = 0; i < 32; i++) msg[i] = 1 + i; + for (int i = 0; i < 64; i++) sig[i] = 65 + i; + + unsigned char pubkey[33]; + for (int i=0; i<1000000; i++) { + int pubkeylen = 33; + CHECK(secp256k1_ecdsa_recover_compact(msg, 32, sig, pubkey, &pubkeylen, 1, i % 2)); + for (int j = 0; j < 32; j++) { + sig[j + 32] = msg[j]; /* Move former message to S. */ + msg[j] = sig[j]; /* Move former R to message. */ + sig[j] = pubkey[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ + } + } + + static const unsigned char fini[33] = { + 0x02, + 0x52, 0x63, 0xae, 0x9a, 0x9d, 0x47, 0x1f, 0x1a, + 0xb2, 0x36, 0x65, 0x89, 0x11, 0xe7, 0xcc, 0x86, + 0xa3, 0xab, 0x97, 0xb6, 0xf1, 0xaf, 0xfd, 0x8f, + 0x9b, 0x38, 0xb6, 0x18, 0x55, 0xe5, 0xc2, 0x43 + }; + CHECK(memcmp(fini, pubkey, 33) == 0); + + secp256k1_stop(); + return 0; +} diff --git a/src/secp256k1/src/ecdsa.h b/src/secp256k1/src/ecdsa.h new file mode 100644 index 0000000000..3b1e0484ea --- /dev/null +++ b/src/secp256k1/src/ecdsa.h @@ -0,0 +1,23 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECDSA_ +#define _SECP256K1_ECDSA_ + +#include "num.h" + +typedef struct { + secp256k1_num_t r, s; +} secp256k1_ecdsa_sig_t; + +static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size); +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a); +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_num_t *message); +static int secp256k1_ecdsa_sig_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid); +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_num_t *message, int recid); +static void secp256k1_ecdsa_sig_set_rs(secp256k1_ecdsa_sig_t *sig, const secp256k1_num_t *r, const secp256k1_num_t *s); + +#endif diff --git a/src/secp256k1/src/ecdsa_impl.h b/src/secp256k1/src/ecdsa_impl.h new file mode 100644 index 0000000000..4c05ec39f8 --- /dev/null +++ b/src/secp256k1/src/ecdsa_impl.h @@ -0,0 +1,183 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + + +#ifndef _SECP256K1_ECDSA_IMPL_H_ +#define _SECP256K1_ECDSA_IMPL_H_ + +#include "num.h" +#include "field.h" +#include "group.h" +#include "ecmult.h" +#include "ecmult_gen.h" +#include "ecdsa.h" + +static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size) { + if (sig[0] != 0x30) return 0; + int lenr = sig[3]; + if (5+lenr >= size) return 0; + int lens = sig[lenr+5]; + if (sig[1] != lenr+lens+4) return 0; + if (lenr+lens+6 > size) return 0; + if (sig[2] != 0x02) return 0; + if (lenr == 0) return 0; + if (sig[lenr+4] != 0x02) return 0; + if (lens == 0) return 0; + secp256k1_num_set_bin(&r->r, sig+4, lenr); + secp256k1_num_set_bin(&r->s, sig+6+lenr, lens); + return 1; +} + +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a) { + int lenR = (secp256k1_num_bits(&a->r) + 7)/8; + if (lenR == 0 || secp256k1_num_get_bit(&a->r, lenR*8-1)) + lenR++; + int lenS = (secp256k1_num_bits(&a->s) + 7)/8; + if (lenS == 0 || secp256k1_num_get_bit(&a->s, lenS*8-1)) + lenS++; + if (*size < 6+lenS+lenR) + return 0; + *size = 6 + lenS + lenR; + sig[0] = 0x30; + sig[1] = 4 + lenS + lenR; + sig[2] = 0x02; + sig[3] = lenR; + secp256k1_num_get_bin(sig+4, lenR, &a->r); + sig[4+lenR] = 0x02; + sig[5+lenR] = lenS; + secp256k1_num_get_bin(sig+lenR+6, lenS, &a->s); + return 1; +} + +static int secp256k1_ecdsa_sig_recompute(secp256k1_num_t *r2, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_num_t *message) { + const secp256k1_ge_consts_t *c = secp256k1_ge_consts; + + if (secp256k1_num_is_neg(&sig->r) || secp256k1_num_is_neg(&sig->s)) + return 0; + if (secp256k1_num_is_zero(&sig->r) || secp256k1_num_is_zero(&sig->s)) + return 0; + if (secp256k1_num_cmp(&sig->r, &c->order) >= 0 || secp256k1_num_cmp(&sig->s, &c->order) >= 0) + return 0; + + int ret = 0; + secp256k1_num_t sn, u1, u2; + secp256k1_num_init(&sn); + secp256k1_num_init(&u1); + secp256k1_num_init(&u2); + secp256k1_num_mod_inverse(&sn, &sig->s, &c->order); + secp256k1_num_mod_mul(&u1, &sn, message, &c->order); + secp256k1_num_mod_mul(&u2, &sn, &sig->r, &c->order); + secp256k1_gej_t pubkeyj; secp256k1_gej_set_ge(&pubkeyj, pubkey); + secp256k1_gej_t pr; secp256k1_ecmult(&pr, &pubkeyj, &u2, &u1); + if (!secp256k1_gej_is_infinity(&pr)) { + secp256k1_fe_t xr; secp256k1_gej_get_x_var(&xr, &pr); + secp256k1_fe_normalize(&xr); + unsigned char xrb[32]; secp256k1_fe_get_b32(xrb, &xr); + secp256k1_num_set_bin(r2, xrb, 32); + secp256k1_num_mod(r2, &c->order); + ret = 1; + } + secp256k1_num_free(&sn); + secp256k1_num_free(&u1); + secp256k1_num_free(&u2); + return ret; +} + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_num_t *message, int recid) { + const secp256k1_ge_consts_t *c = secp256k1_ge_consts; + + if (secp256k1_num_is_neg(&sig->r) || secp256k1_num_is_neg(&sig->s)) + return 0; + if (secp256k1_num_is_zero(&sig->r) || secp256k1_num_is_zero(&sig->s)) + return 0; + if (secp256k1_num_cmp(&sig->r, &c->order) >= 0 || secp256k1_num_cmp(&sig->s, &c->order) >= 0) + return 0; + + secp256k1_num_t rx; + secp256k1_num_init(&rx); + secp256k1_num_copy(&rx, &sig->r); + if (recid & 2) { + secp256k1_num_add(&rx, &rx, &c->order); + if (secp256k1_num_cmp(&rx, &secp256k1_fe_consts->p) >= 0) + return 0; + } + unsigned char brx[32]; + secp256k1_num_get_bin(brx, 32, &rx); + secp256k1_num_free(&rx); + secp256k1_fe_t fx; + secp256k1_fe_set_b32(&fx, brx); + secp256k1_ge_t x; + if (!secp256k1_ge_set_xo(&x, &fx, recid & 1)) + return 0; + secp256k1_gej_t xj; + secp256k1_gej_set_ge(&xj, &x); + secp256k1_num_t rn, u1, u2; + secp256k1_num_init(&rn); + secp256k1_num_init(&u1); + secp256k1_num_init(&u2); + secp256k1_num_mod_inverse(&rn, &sig->r, &c->order); + secp256k1_num_mod_mul(&u1, &rn, message, &c->order); + secp256k1_num_sub(&u1, &c->order, &u1); + secp256k1_num_mod_mul(&u2, &rn, &sig->s, &c->order); + secp256k1_gej_t qj; + secp256k1_ecmult(&qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + secp256k1_num_free(&rn); + secp256k1_num_free(&u1); + secp256k1_num_free(&u2); + return !secp256k1_gej_is_infinity(&qj); +} + +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_num_t *message) { + secp256k1_num_t r2; + secp256k1_num_init(&r2); + int ret = 0; + ret = secp256k1_ecdsa_sig_recompute(&r2, sig, pubkey, message) && secp256k1_num_cmp(&sig->r, &r2) == 0; + secp256k1_num_free(&r2); + return ret; +} + +static int secp256k1_ecdsa_sig_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid) { + secp256k1_gej_t rp; + secp256k1_ecmult_gen(&rp, nonce); + secp256k1_ge_t r; + secp256k1_ge_set_gej(&r, &rp); + unsigned char b[32]; + secp256k1_fe_normalize(&r.x); + secp256k1_fe_normalize(&r.y); + secp256k1_fe_get_b32(b, &r.x); + int overflow = 0; + secp256k1_scalar_t sigr; + secp256k1_scalar_set_b32(&sigr, b, &overflow); + if (recid) + *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); + secp256k1_scalar_t n; + secp256k1_scalar_mul(&n, &sigr, seckey); + secp256k1_scalar_add(&n, &n, message); + secp256k1_scalar_t sigs; + secp256k1_scalar_inverse(&sigs, nonce); + secp256k1_scalar_mul(&sigs, &sigs, &n); + secp256k1_scalar_clear(&n); + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + if (secp256k1_scalar_is_zero(&sigs)) + return 0; + if (secp256k1_scalar_is_high(&sigs)) { + secp256k1_scalar_negate(&sigs, &sigs); + if (recid) + *recid ^= 1; + } + secp256k1_scalar_get_num(&sig->s, &sigs); + secp256k1_scalar_get_num(&sig->r, &sigr); + return 1; +} + +static void secp256k1_ecdsa_sig_set_rs(secp256k1_ecdsa_sig_t *sig, const secp256k1_num_t *r, const secp256k1_num_t *s) { + secp256k1_num_copy(&sig->r, r); + secp256k1_num_copy(&sig->s, s); +} + +#endif diff --git a/src/secp256k1/src/eckey.h b/src/secp256k1/src/eckey.h new file mode 100644 index 0000000000..024c8b821b --- /dev/null +++ b/src/secp256k1/src/eckey.h @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECKEY_ +#define _SECP256K1_ECKEY_ + +#include "group.h" +#include "scalar.h" +#include "num.h" + +static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size); +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed); + +static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen); +static int secp256k1_eckey_privkey_serialize(unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed); + +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_pubkey_tweak_add(secp256k1_ge_t *key, const secp256k1_num_t *tweak); +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_pubkey_tweak_mul(secp256k1_ge_t *key, const secp256k1_num_t *tweak); + +#endif diff --git a/src/secp256k1/src/eckey_impl.h b/src/secp256k1/src/eckey_impl.h new file mode 100644 index 0000000000..290b1f0900 --- /dev/null +++ b/src/secp256k1/src/eckey_impl.h @@ -0,0 +1,200 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECKEY_IMPL_H_ +#define _SECP256K1_ECKEY_IMPL_H_ + +#include "eckey.h" + +#include "num.h" +#include "field.h" +#include "group.h" +#include "ecmult_gen.h" + +static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } else { + return 0; + } +} + +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed) { + if (secp256k1_ge_is_infinity(elem)) { + return 0; + } + secp256k1_fe_normalize(&elem->x); + secp256k1_fe_normalize(&elem->y); + secp256k1_fe_get_b32(&pub[1], &elem->x); + if (compressed) { + *size = 33; + pub[0] = 0x02 | (secp256k1_fe_is_odd(&elem->y) ? 0x01 : 0x00); + } else { + *size = 65; + pub[0] = 0x04; + secp256k1_fe_get_b32(&pub[33], &elem->y); + } + return 1; +} + +static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen) { + const unsigned char *end = privkey + privkeylen; + /* sequence header */ + if (end < privkey+1 || *privkey != 0x30) + return 0; + privkey++; + /* sequence length constructor */ + int lenb = 0; + if (end < privkey+1 || !(*privkey & 0x80)) + return 0; + lenb = *privkey & ~0x80; privkey++; + if (lenb < 1 || lenb > 2) + return 0; + if (end < privkey+lenb) + return 0; + /* sequence length */ + int len = 0; + len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); + privkey += lenb; + if (end < privkey+len) + return 0; + /* sequence element 0: version number (=1) */ + if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) + return 0; + privkey += 3; + /* sequence element 1: octet string, up to 32 bytes */ + if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) + return 0; + int overflow = 0; + unsigned char c[32] = {0}; + memcpy(c + 32 - privkey[1], privkey + 2, privkey[1]); + secp256k1_scalar_set_b32(key, c, &overflow); + memset(c, 0, 32); + return !overflow; +} + +static int secp256k1_eckey_privkey_serialize(unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed) { + secp256k1_gej_t rp; + secp256k1_ecmult_gen(&rp, key); + secp256k1_ge_t r; + secp256k1_ge_set_gej(&r, &rp); + if (compressed) { + static const unsigned char begin[] = { + 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + secp256k1_scalar_get_b32(ptr, key); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + int pubkeylen = 0; + if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 1)) { + return 0; + } + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } else { + static const unsigned char begin[] = { + 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, + 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, + 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + secp256k1_scalar_get_b32(ptr, key); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + int pubkeylen = 0; + if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 0)) { + return 0; + } + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } + return 1; +} + +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { + secp256k1_scalar_add(key, key, tweak); + if (secp256k1_scalar_is_zero(key)) + return 0; + return 1; +} + +static int secp256k1_eckey_pubkey_tweak_add(secp256k1_ge_t *key, const secp256k1_num_t *tweak) { + if (secp256k1_num_cmp(tweak, &secp256k1_ge_consts->order) >= 0) + return 0; + + secp256k1_gej_t pt; + secp256k1_gej_set_ge(&pt, key); + secp256k1_num_t one; + secp256k1_num_init(&one); + secp256k1_num_set_int(&one, 1); + secp256k1_ecmult(&pt, &pt, &one, tweak); + secp256k1_num_free(&one); + + if (secp256k1_gej_is_infinity(&pt)) + return 0; + secp256k1_ge_set_gej(key, &pt); + return 1; +} + +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { + if (secp256k1_scalar_is_zero(tweak)) + return 0; + + secp256k1_scalar_mul(key, key, tweak); + return 1; +} + +static int secp256k1_eckey_pubkey_tweak_mul(secp256k1_ge_t *key, const secp256k1_num_t *tweak) { + if (secp256k1_num_is_zero(tweak)) + return 0; + if (secp256k1_num_cmp(tweak, &secp256k1_ge_consts->order) >= 0) + return 0; + + secp256k1_num_t zero; + secp256k1_num_init(&zero); + secp256k1_num_set_int(&zero, 0); + secp256k1_gej_t pt; + secp256k1_gej_set_ge(&pt, key); + secp256k1_ecmult(&pt, &pt, tweak, &zero); + secp256k1_num_free(&zero); + secp256k1_ge_set_gej(key, &pt); + return 1; +} + +#endif diff --git a/src/secp256k1/src/ecmult.h b/src/secp256k1/src/ecmult.h new file mode 100644 index 0000000000..e3cf18b680 --- /dev/null +++ b/src/secp256k1/src/ecmult.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_ +#define _SECP256K1_ECMULT_ + +#include "num.h" +#include "group.h" + +static void secp256k1_ecmult_start(void); +static void secp256k1_ecmult_stop(void); + +/** Double multiply: R = na*A + ng*G */ +static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_num_t *na, const secp256k1_num_t *ng); + +#endif diff --git a/src/secp256k1/src/ecmult_gen.h b/src/secp256k1/src/ecmult_gen.h new file mode 100644 index 0000000000..42f822f9ce --- /dev/null +++ b/src/secp256k1/src/ecmult_gen.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_GEN_ +#define _SECP256K1_ECMULT_GEN_ + +#include "scalar.h" +#include "group.h" + +static void secp256k1_ecmult_gen_start(void); +static void secp256k1_ecmult_gen_stop(void); + +/** Multiply with the generator: R = a*G */ +static void secp256k1_ecmult_gen(secp256k1_gej_t *r, const secp256k1_scalar_t *a); + +#endif diff --git a/src/secp256k1/src/ecmult_gen_impl.h b/src/secp256k1/src/ecmult_gen_impl.h new file mode 100644 index 0000000000..07859ab04b --- /dev/null +++ b/src/secp256k1/src/ecmult_gen_impl.h @@ -0,0 +1,118 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_GEN_IMPL_H_ +#define _SECP256K1_ECMULT_GEN_IMPL_H_ + +#include "scalar.h" +#include "group.h" +#include "ecmult_gen.h" + +typedef struct { + /* For accelerating the computation of a*G: + * To harden against timing attacks, use the following mechanism: + * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63. + * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where: + * * U_i = U * 2^i (for i=0..62) + * * U_i = U * (1-2^63) (for i=63) + * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0. + * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is + * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63). + * None of the resulting prec group elements have a known scalar, and neither do any of + * the intermediate sums while computing a*G. + * To make memory access uniform, the bytes of prec(i, n_i) are sliced per value of n_i. */ + unsigned char prec[64][sizeof(secp256k1_ge_t)][16]; /* prec[j][k][i] = k'th byte of (16^j * i * G + U_i) */ +} secp256k1_ecmult_gen_consts_t; + +static const secp256k1_ecmult_gen_consts_t *secp256k1_ecmult_gen_consts = NULL; + +static void secp256k1_ecmult_gen_start(void) { + if (secp256k1_ecmult_gen_consts != NULL) + return; + + /* Allocate the precomputation table. */ + secp256k1_ecmult_gen_consts_t *ret = (secp256k1_ecmult_gen_consts_t*)malloc(sizeof(secp256k1_ecmult_gen_consts_t)); + + /* get the generator */ + const secp256k1_ge_t *g = &secp256k1_ge_consts->g; + secp256k1_gej_t gj; secp256k1_gej_set_ge(&gj, g); + + /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ + secp256k1_gej_t nums_gej; + { + static const unsigned char nums_b32[32] = "The scalar for this x is unknown"; + secp256k1_fe_t nums_x; + secp256k1_fe_set_b32(&nums_x, nums_b32); + secp256k1_ge_t nums_ge; + VERIFY_CHECK(secp256k1_ge_set_xo(&nums_ge, &nums_x, 0)); + secp256k1_gej_set_ge(&nums_gej, &nums_ge); + /* Add G to make the bits in x uniformly distributed. */ + secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, g); + } + + /* compute prec. */ + secp256k1_ge_t prec[1024]; + { + secp256k1_gej_t precj[1024]; /* Jacobian versions of prec. */ + secp256k1_gej_t gbase; gbase = gj; /* 16^j * G */ + secp256k1_gej_t numsbase; numsbase = nums_gej; /* 2^j * nums. */ + for (int j=0; j<64; j++) { + /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ + precj[j*16] = numsbase; + for (int i=1; i<16; i++) { + secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase); + } + /* Multiply gbase by 16. */ + for (int i=0; i<4; i++) { + secp256k1_gej_double_var(&gbase, &gbase); + } + /* Multiply numbase by 2. */ + secp256k1_gej_double_var(&numsbase, &numsbase); + if (j == 62) { + /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ + secp256k1_gej_neg(&numsbase, &numsbase); + secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej); + } + } + secp256k1_ge_set_all_gej_var(1024, prec, precj); + } + for (int j=0; j<64; j++) { + for (int i=0; i<16; i++) { + const unsigned char* raw = (const unsigned char*)(&prec[j*16 + i]); + for (size_t k=0; k<sizeof(secp256k1_ge_t); k++) + ret->prec[j][k][i] = raw[k]; + } + } + + /* Set the global pointer to the precomputation table. */ + secp256k1_ecmult_gen_consts = ret; +} + +static void secp256k1_ecmult_gen_stop(void) { + if (secp256k1_ecmult_gen_consts == NULL) + return; + + secp256k1_ecmult_gen_consts_t *c = (secp256k1_ecmult_gen_consts_t*)secp256k1_ecmult_gen_consts; + secp256k1_ecmult_gen_consts = NULL; + free(c); +} + +static void secp256k1_ecmult_gen(secp256k1_gej_t *r, const secp256k1_scalar_t *gn) { + const secp256k1_ecmult_gen_consts_t *c = secp256k1_ecmult_gen_consts; + secp256k1_gej_set_infinity(r); + secp256k1_ge_t add; + int bits; + for (int j=0; j<64; j++) { + bits = secp256k1_scalar_get_bits(gn, j * 4, 4); + for (size_t k=0; k<sizeof(secp256k1_ge_t); k++) + ((unsigned char*)(&add))[k] = c->prec[j][k][bits]; + secp256k1_gej_add_ge(r, r, &add); + } + bits = 0; + secp256k1_ge_clear(&add); +} + +#endif diff --git a/src/secp256k1/src/ecmult_impl.h b/src/secp256k1/src/ecmult_impl.h new file mode 100644 index 0000000000..508902564e --- /dev/null +++ b/src/secp256k1/src/ecmult_impl.h @@ -0,0 +1,222 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_IMPL_H_ +#define _SECP256K1_ECMULT_IMPL_H_ + +#include "num.h" +#include "group.h" +#include "ecmult.h" + +/* optimal for 128-bit and 256-bit exponents. */ +#define WINDOW_A 5 + +/** larger numbers may result in slightly better performance, at the cost of + exponentially larger precomputed tables. WINDOW_G == 14 results in 640 KiB. */ +#define WINDOW_G 14 + +/** Fill a table 'pre' with precomputed odd multiples of a. W determines the size of the table. + * pre will contains the values [1*a,3*a,5*a,...,(2^(w-1)-1)*a], so it needs place for + * 2^(w-2) entries. + * + * There are two versions of this function: + * - secp256k1_ecmult_precomp_wnaf_gej, which operates on group elements in jacobian notation, + * fast to precompute, but slower to use in later additions. + * - secp256k1_ecmult_precomp_wnaf_ge, which operates on group elements in affine notations, + * (much) slower to precompute, but a bit faster to use in later additions. + * To compute a*P + b*G, we use the jacobian version for P, and the affine version for G, as + * G is constant, so it only needs to be done once in advance. + */ +static void secp256k1_ecmult_table_precomp_gej_var(secp256k1_gej_t *pre, const secp256k1_gej_t *a, int w) { + pre[0] = *a; + secp256k1_gej_t d; secp256k1_gej_double_var(&d, &pre[0]); + for (int i=1; i<(1 << (w-2)); i++) + secp256k1_gej_add_var(&pre[i], &d, &pre[i-1]); +} + +static void secp256k1_ecmult_table_precomp_ge_var(secp256k1_ge_t *pre, const secp256k1_gej_t *a, int w) { + const int table_size = 1 << (w-2); + secp256k1_gej_t prej[table_size]; + prej[0] = *a; + secp256k1_gej_t d; secp256k1_gej_double_var(&d, a); + for (int i=1; i<table_size; i++) { + secp256k1_gej_add_var(&prej[i], &d, &prej[i-1]); + } + secp256k1_ge_set_all_gej_var(table_size, pre, prej); +} + +/** The number of entries a table with precomputed multiples needs to have. */ +#define ECMULT_TABLE_SIZE(w) (1 << ((w)-2)) + +/** The following two macro retrieves a particular odd multiple from a table + * of precomputed multiples. */ +#define ECMULT_TABLE_GET(r,pre,n,w,neg) do { \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + if ((n) > 0) \ + *(r) = (pre)[((n)-1)/2]; \ + else \ + (neg)((r), &(pre)[(-(n)-1)/2]); \ +} while(0) + +#define ECMULT_TABLE_GET_GEJ(r,pre,n,w) ECMULT_TABLE_GET((r),(pre),(n),(w),secp256k1_gej_neg) +#define ECMULT_TABLE_GET_GE(r,pre,n,w) ECMULT_TABLE_GET((r),(pre),(n),(w),secp256k1_ge_neg) + +typedef struct { + /* For accelerating the computation of a*P + b*G: */ + secp256k1_ge_t pre_g[ECMULT_TABLE_SIZE(WINDOW_G)]; /* odd multiples of the generator */ + secp256k1_ge_t pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)]; /* odd multiples of 2^128*generator */ +} secp256k1_ecmult_consts_t; + +static const secp256k1_ecmult_consts_t *secp256k1_ecmult_consts = NULL; + +static void secp256k1_ecmult_start(void) { + if (secp256k1_ecmult_consts != NULL) + return; + + /* Allocate the precomputation table. */ + secp256k1_ecmult_consts_t *ret = (secp256k1_ecmult_consts_t*)malloc(sizeof(secp256k1_ecmult_consts_t)); + + /* get the generator */ + const secp256k1_ge_t *g = &secp256k1_ge_consts->g; + secp256k1_gej_t gj; secp256k1_gej_set_ge(&gj, g); + + /* calculate 2^128*generator */ + secp256k1_gej_t g_128j = gj; + for (int i=0; i<128; i++) + secp256k1_gej_double_var(&g_128j, &g_128j); + + /* precompute the tables with odd multiples */ + secp256k1_ecmult_table_precomp_ge_var(ret->pre_g, &gj, WINDOW_G); + secp256k1_ecmult_table_precomp_ge_var(ret->pre_g_128, &g_128j, WINDOW_G); + + /* Set the global pointer to the precomputation table. */ + secp256k1_ecmult_consts = ret; +} + +static void secp256k1_ecmult_stop(void) { + if (secp256k1_ecmult_consts == NULL) + return; + + secp256k1_ecmult_consts_t *c = (secp256k1_ecmult_consts_t*)secp256k1_ecmult_consts; + secp256k1_ecmult_consts = NULL; + free(c); +} + +/** Convert a number to WNAF notation. The number becomes represented by sum(2^i * wnaf[i], i=0..bits), + * with the following guarantees: + * - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1) + * - two non-zero entries in wnaf are separated by at least w-1 zeroes. + * - the index of the highest non-zero entry in wnaf (=return value-1) is at most bits, where + * bits is the number of bits necessary to represent the absolute value of the input. + */ +static int secp256k1_ecmult_wnaf(int *wnaf, const secp256k1_num_t *a, int w) { + int ret = 0; + int zeroes = 0; + secp256k1_num_t x; + secp256k1_num_copy(&x, a); + int sign = 1; + if (secp256k1_num_is_neg(&x)) { + sign = -1; + secp256k1_num_negate(&x); + } + while (!secp256k1_num_is_zero(&x)) { + while (!secp256k1_num_is_odd(&x)) { + zeroes++; + secp256k1_num_shift(&x, 1); + } + int word = secp256k1_num_shift(&x, w); + while (zeroes) { + wnaf[ret++] = 0; + zeroes--; + } + if (word & (1 << (w-1))) { + secp256k1_num_inc(&x); + wnaf[ret++] = sign * (word - (1 << w)); + } else { + wnaf[ret++] = sign * word; + } + zeroes = w-1; + } + return ret; +} + +static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_num_t *na, const secp256k1_num_t *ng) { + const secp256k1_ecmult_consts_t *c = secp256k1_ecmult_consts; + +#ifdef USE_ENDOMORPHISM + secp256k1_num_t na_1, na_lam; + /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */ + secp256k1_gej_split_exp_var(&na_1, &na_lam, na); + + /* build wnaf representation for na_1 and na_lam. */ + int wnaf_na_1[129]; int bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, &na_1, WINDOW_A); + int wnaf_na_lam[129]; int bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, &na_lam, WINDOW_A); + int bits = bits_na_1; + if (bits_na_lam > bits) bits = bits_na_lam; +#else + /* build wnaf representation for na. */ + int wnaf_na[257]; int bits_na = secp256k1_ecmult_wnaf(wnaf_na, na, WINDOW_A); + int bits = bits_na; +#endif + + /* calculate odd multiples of a */ + secp256k1_gej_t pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ecmult_table_precomp_gej_var(pre_a, a, WINDOW_A); + +#ifdef USE_ENDOMORPHISM + secp256k1_gej_t pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; + for (int i=0; i<ECMULT_TABLE_SIZE(WINDOW_A); i++) + secp256k1_gej_mul_lambda(&pre_a_lam[i], &pre_a[i]); +#endif + + /* Splitted G factors. */ + secp256k1_num_t ng_1, ng_128; + + /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */ + secp256k1_num_split(&ng_1, &ng_128, ng, 128); + + /* Build wnaf representation for ng_1 and ng_128 */ + int wnaf_ng_1[129]; int bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, &ng_1, WINDOW_G); + int wnaf_ng_128[129]; int bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, &ng_128, WINDOW_G); + if (bits_ng_1 > bits) bits = bits_ng_1; + if (bits_ng_128 > bits) bits = bits_ng_128; + + secp256k1_gej_set_infinity(r); + secp256k1_gej_t tmpj; + secp256k1_ge_t tmpa; + + for (int i=bits-1; i>=0; i--) { + secp256k1_gej_double_var(r, r); + int n; +#ifdef USE_ENDOMORPHISM + if (i < bits_na_1 && (n = wnaf_na_1[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } + if (i < bits_na_lam && (n = wnaf_na_lam[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a_lam, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } +#else + if (i < bits_na && (n = wnaf_na[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } +#endif + if (i < bits_ng_1 && (n = wnaf_ng_1[i])) { + ECMULT_TABLE_GET_GE(&tmpa, c->pre_g, n, WINDOW_G); + secp256k1_gej_add_ge_var(r, r, &tmpa); + } + if (i < bits_ng_128 && (n = wnaf_ng_128[i])) { + ECMULT_TABLE_GET_GE(&tmpa, c->pre_g_128, n, WINDOW_G); + secp256k1_gej_add_ge_var(r, r, &tmpa); + } + } +} + +#endif diff --git a/src/secp256k1/src/field.h b/src/secp256k1/src/field.h new file mode 100644 index 0000000000..c7feead900 --- /dev/null +++ b/src/secp256k1/src/field.h @@ -0,0 +1,114 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_ +#define _SECP256K1_FIELD_ + +/** Field element module. + * + * Field elements can be represented in several ways, but code accessing + * it (and implementations) need to take certain properaties into account: + * - Each field element can be normalized or not. + * - Each field element has a magnitude, which represents how far away + * its representation is away from normalization. Normalized elements + * always have a magnitude of 1, but a magnitude of 1 doesn't imply + * normality. + */ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_FIELD_GMP) +#include "field_gmp.h" +#elif defined(USE_FIELD_10X26) +#include "field_10x26.h" +#elif defined(USE_FIELD_5X52) +#include "field_5x52.h" +#else +#error "Please select field implementation" +#endif + +typedef struct { + secp256k1_num_t p; +} secp256k1_fe_consts_t; + +static const secp256k1_fe_consts_t *secp256k1_fe_consts = NULL; + +/** Initialize field element precomputation data. */ +static void secp256k1_fe_start(void); + +/** Unload field element precomputation data. */ +static void secp256k1_fe_stop(void); + +/** Normalize a field element. */ +static void secp256k1_fe_normalize(secp256k1_fe_t *r); + +/** Set a field element equal to a small integer. Resulting field element is normalized. */ +static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a); + +/** Verify whether a field element is zero. Requires the input to be normalized. */ +static int secp256k1_fe_is_zero(const secp256k1_fe_t *a); + +/** Check the "oddness" of a field element. Requires the input to be normalized. */ +static int secp256k1_fe_is_odd(const secp256k1_fe_t *a); + +/** Compare two field elements. Requires both inputs to be normalized */ +static int secp256k1_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b); + +/** Set a field element equal to 32-byte big endian value. Resulting field element is normalized. */ +static void secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a); + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a); + +/** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input + * as an argument. The magnitude of the output is one higher. */ +static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m); + +/** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that + * small integer. */ +static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a); + +/** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */ +static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8. + * The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t *b); + +/** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8. + * The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the (modular) square root (if any exist) of another. Requires the + * input's magnitude to be at most 8. The output magnitude is 1 (but not guaranteed to be + * normalized). Return value indicates whether a square root was found. */ +static int secp256k1_fe_sqrt(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be + * at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */ +static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be + * at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and + * outputs must not overlap in memory. */ +static void secp256k1_fe_inv_all(size_t len, secp256k1_fe_t r[len], const secp256k1_fe_t a[len]); + +/** Potentially faster version of secp256k1_fe_inv_all, without constant-time guarantee. */ +static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t r[len], const secp256k1_fe_t a[len]); + + +/** Convert a field element to a hexadecimal string. */ +static void secp256k1_fe_get_hex(char *r, int *rlen, const secp256k1_fe_t *a); + +/** Convert a hexadecimal string to a field element. */ +static void secp256k1_fe_set_hex(secp256k1_fe_t *r, const char *a, int alen); + +#endif diff --git a/src/secp256k1/src/field_10x26.h b/src/secp256k1/src/field_10x26.h new file mode 100644 index 0000000000..66fb3f2563 --- /dev/null +++ b/src/secp256k1/src/field_10x26.h @@ -0,0 +1,21 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_ +#define _SECP256K1_FIELD_REPR_ + +#include <stdint.h> + +typedef struct { + /* X = sum(i=0..9, elem[i]*2^26) mod n */ + uint32_t n[10]; +#ifdef VERIFY + int magnitude; + int normalized; +#endif +} secp256k1_fe_t; + +#endif diff --git a/src/secp256k1/src/field_10x26_impl.h b/src/secp256k1/src/field_10x26_impl.h new file mode 100644 index 0000000000..c0f1be0b2d --- /dev/null +++ b/src/secp256k1/src/field_10x26_impl.h @@ -0,0 +1,884 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ +#define _SECP256K1_FIELD_REPR_IMPL_H_ + +#include <stdio.h> +#include <string.h> +#include "util.h" +#include "num.h" +#include "field.h" + +static void secp256k1_fe_inner_start(void) {} +static void secp256k1_fe_inner_stop(void) {} + +#ifdef VERIFY +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + const uint32_t *d = a->n; + int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; + r &= (d[0] <= 0x3FFFFFFUL * m); + r &= (d[1] <= 0x3FFFFFFUL * m); + r &= (d[2] <= 0x3FFFFFFUL * m); + r &= (d[3] <= 0x3FFFFFFUL * m); + r &= (d[4] <= 0x3FFFFFFUL * m); + r &= (d[5] <= 0x3FFFFFFUL * m); + r &= (d[6] <= 0x3FFFFFFUL * m); + r &= (d[7] <= 0x3FFFFFFUL * m); + r &= (d[8] <= 0x3FFFFFFUL * m); + r &= (d[9] <= 0x03FFFFFUL * m); + r &= (a->magnitude >= 0); + if (a->normalized) { + r &= (a->magnitude <= 1); + if (r && (d[9] == 0x03FFFFFUL)) { + uint32_t mid = d[8] & d[7] & d[6] & d[5] & d[4] & d[3] & d[2]; + if (mid == 0x3FFFFFFUL) { + r &= ((d[1] + 0x40UL + ((d[0] + 0x3D1UL) >> 26)) <= 0x3FFFFFFUL); + } + } + } + VERIFY_CHECK(r == 1); +} +#else +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + (void)a; +} +#endif + +static void secp256k1_fe_normalize(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + uint32_t m; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) + & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); + + /* Apply the final reduction (for constant-time behaviour, we do it always) */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ + VERIFY_CHECK(t9 >> 22 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t9 &= 0x03FFFFFUL; + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { + r->n[0] = a; + r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + const uint32_t *t = a->n; + return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return a->n[0] & 1; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { +#ifdef VERIFY + a->magnitude = 0; + a->normalized = 1; +#endif + for (int i=0; i<10; i++) { + a->n[i] = 0; + } +} + +SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + VERIFY_CHECK(b->normalized); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + const uint32_t *t = a->n, *u = b->n; + return ((t[0]^u[0]) | (t[1]^u[1]) | (t[2]^u[2]) | (t[3]^u[3]) | (t[4]^u[4]) + | (t[5]^u[5]) | (t[6]^u[6]) | (t[7]^u[7]) | (t[8]^u[8]) | (t[9]^u[9])) == 0; +} + +static void secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { + r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; + r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; + for (int i=0; i<32; i++) { + for (int j=0; j<4; j++) { + int limb = (8*i+2*j)/26; + int shift = (8*i+2*j)%26; + r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift; + } + } +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + for (int i=0; i<32; i++) { + int c = 0; + for (int j=0; j<4; j++) { + int limb = (8*i+2*j)/26; + int shift = (8*i+2*j)%26; + c |= ((a->n[limb] >> shift) & 0x3) << (2 * j); + } + r[31-i] = c; + } +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= m); + secp256k1_fe_verify(a); +#endif + r->n[0] = 0x3FFFC2FUL * 2 * (m + 1) - a->n[0]; + r->n[1] = 0x3FFFFBFUL * 2 * (m + 1) - a->n[1]; + r->n[2] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[2]; + r->n[3] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[3]; + r->n[4] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[4]; + r->n[5] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[5]; + r->n[6] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[6]; + r->n[7] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[7]; + r->n[8] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[8]; + r->n[9] = 0x03FFFFFUL * 2 * (m + 1) - a->n[9]; +#ifdef VERIFY + r->magnitude = m + 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { + r->n[0] *= a; + r->n[1] *= a; + r->n[2] *= a; + r->n[3] *= a; + r->n[4] *= a; + r->n[5] *= a; + r->n[6] *= a; + r->n[7] *= a; + r->n[8] *= a; + r->n[9] *= a; +#ifdef VERIFY + r->magnitude *= a; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + secp256k1_fe_verify(a); +#endif + r->n[0] += a->n[0]; + r->n[1] += a->n[1]; + r->n[2] += a->n[2]; + r->n[3] += a->n[3]; + r->n[4] += a->n[4]; + r->n[5] += a->n[5]; + r->n[6] += a->n[6]; + r->n[7] += a->n[7]; + r->n[8] += a->n[8]; + r->n[9] += a->n[9]; +#ifdef VERIFY + r->magnitude += a->magnitude; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +#ifdef VERIFY +#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) +#else +#define VERIFY_BITS(x, n) do { } while(0) +#endif + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(const uint32_t *a, const uint32_t *b, uint32_t *r) { + VERIFY_BITS(a[0], 30); + VERIFY_BITS(a[1], 30); + VERIFY_BITS(a[2], 30); + VERIFY_BITS(a[3], 30); + VERIFY_BITS(a[4], 30); + VERIFY_BITS(a[5], 30); + VERIFY_BITS(a[6], 30); + VERIFY_BITS(a[7], 30); + VERIFY_BITS(a[8], 30); + VERIFY_BITS(a[9], 26); + VERIFY_BITS(b[0], 30); + VERIFY_BITS(b[1], 30); + VERIFY_BITS(b[2], 30); + VERIFY_BITS(b[3], 30); + VERIFY_BITS(b[4], 30); + VERIFY_BITS(b[5], 30); + VERIFY_BITS(b[6], 30); + VERIFY_BITS(b[7], 30); + VERIFY_BITS(b[8], 30); + VERIFY_BITS(b[9], 26); + + const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; + /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. + * px is a shorthand for sum(a[i]*b[x-i], i=0..x). + * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. + */ + + uint64_t c, d; + + d = (uint64_t)a[0] * b[9] + + (uint64_t)a[1] * b[8] + + (uint64_t)a[2] * b[7] + + (uint64_t)a[3] * b[6] + + (uint64_t)a[4] * b[5] + + (uint64_t)a[5] * b[4] + + (uint64_t)a[6] * b[3] + + (uint64_t)a[7] * b[2] + + (uint64_t)a[8] * b[1] + + (uint64_t)a[9] * b[0]; + /* VERIFY_BITS(d, 64); */ + /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + uint32_t t9 = d & M; d >>= 26; + VERIFY_BITS(t9, 26); + VERIFY_BITS(d, 38); + /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + + c = (uint64_t)a[0] * b[0]; + VERIFY_BITS(c, 60); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ + d += (uint64_t)a[1] * b[9] + + (uint64_t)a[2] * b[8] + + (uint64_t)a[3] * b[7] + + (uint64_t)a[4] * b[6] + + (uint64_t)a[5] * b[5] + + (uint64_t)a[6] * b[4] + + (uint64_t)a[7] * b[3] + + (uint64_t)a[8] * b[2] + + (uint64_t)a[9] * b[1]; + VERIFY_BITS(d, 63); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + uint64_t u0 = d & M; d >>= 26; c += u0 * R0; + VERIFY_BITS(u0, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 61); + /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + uint32_t t0 = c & M; c >>= 26; c += u0 * R1; + VERIFY_BITS(t0, 26); + VERIFY_BITS(c, 37); + /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + + c += (uint64_t)a[0] * b[1] + + (uint64_t)a[1] * b[0]; + VERIFY_BITS(c, 62); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ + d += (uint64_t)a[2] * b[9] + + (uint64_t)a[3] * b[8] + + (uint64_t)a[4] * b[7] + + (uint64_t)a[5] * b[6] + + (uint64_t)a[6] * b[5] + + (uint64_t)a[7] * b[4] + + (uint64_t)a[8] * b[3] + + (uint64_t)a[9] * b[2]; + VERIFY_BITS(d, 63); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + uint64_t u1 = d & M; d >>= 26; c += u1 * R0; + VERIFY_BITS(u1, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + uint32_t t1 = c & M; c >>= 26; c += u1 * R1; + VERIFY_BITS(t1, 26); + VERIFY_BITS(c, 38); + /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + + c += (uint64_t)a[0] * b[2] + + (uint64_t)a[1] * b[1] + + (uint64_t)a[2] * b[0]; + VERIFY_BITS(c, 62); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + d += (uint64_t)a[3] * b[9] + + (uint64_t)a[4] * b[8] + + (uint64_t)a[5] * b[7] + + (uint64_t)a[6] * b[6] + + (uint64_t)a[7] * b[5] + + (uint64_t)a[8] * b[4] + + (uint64_t)a[9] * b[3]; + VERIFY_BITS(d, 63); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + uint64_t u2 = d & M; d >>= 26; c += u2 * R0; + VERIFY_BITS(u2, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + uint32_t t2 = c & M; c >>= 26; c += u2 * R1; + VERIFY_BITS(t2, 26); + VERIFY_BITS(c, 38); + /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[3] + + (uint64_t)a[1] * b[2] + + (uint64_t)a[2] * b[1] + + (uint64_t)a[3] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + d += (uint64_t)a[4] * b[9] + + (uint64_t)a[5] * b[8] + + (uint64_t)a[6] * b[7] + + (uint64_t)a[7] * b[6] + + (uint64_t)a[8] * b[5] + + (uint64_t)a[9] * b[4]; + VERIFY_BITS(d, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + uint64_t u3 = d & M; d >>= 26; c += u3 * R0; + VERIFY_BITS(u3, 26); + VERIFY_BITS(d, 37); + /* VERIFY_BITS(c, 64); */ + /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + uint32_t t3 = c & M; c >>= 26; c += u3 * R1; + VERIFY_BITS(t3, 26); + VERIFY_BITS(c, 39); + /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[4] + + (uint64_t)a[1] * b[3] + + (uint64_t)a[2] * b[2] + + (uint64_t)a[3] * b[1] + + (uint64_t)a[4] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[5] * b[9] + + (uint64_t)a[6] * b[8] + + (uint64_t)a[7] * b[7] + + (uint64_t)a[8] * b[6] + + (uint64_t)a[9] * b[5]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + uint64_t u4 = d & M; d >>= 26; c += u4 * R0; + VERIFY_BITS(u4, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + uint32_t t4 = c & M; c >>= 26; c += u4 * R1; + VERIFY_BITS(t4, 26); + VERIFY_BITS(c, 39); + /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[5] + + (uint64_t)a[1] * b[4] + + (uint64_t)a[2] * b[3] + + (uint64_t)a[3] * b[2] + + (uint64_t)a[4] * b[1] + + (uint64_t)a[5] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[6] * b[9] + + (uint64_t)a[7] * b[8] + + (uint64_t)a[8] * b[7] + + (uint64_t)a[9] * b[6]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + uint64_t u5 = d & M; d >>= 26; c += u5 * R0; + VERIFY_BITS(u5, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + uint32_t t5 = c & M; c >>= 26; c += u5 * R1; + VERIFY_BITS(t5, 26); + VERIFY_BITS(c, 39); + /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[6] + + (uint64_t)a[1] * b[5] + + (uint64_t)a[2] * b[4] + + (uint64_t)a[3] * b[3] + + (uint64_t)a[4] * b[2] + + (uint64_t)a[5] * b[1] + + (uint64_t)a[6] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[7] * b[9] + + (uint64_t)a[8] * b[8] + + (uint64_t)a[9] * b[7]; + VERIFY_BITS(d, 61); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + uint64_t u6 = d & M; d >>= 26; c += u6 * R0; + VERIFY_BITS(u6, 26); + VERIFY_BITS(d, 35); + /* VERIFY_BITS(c, 64); */ + /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + uint32_t t6 = c & M; c >>= 26; c += u6 * R1; + VERIFY_BITS(t6, 26); + VERIFY_BITS(c, 39); + /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[7] + + (uint64_t)a[1] * b[6] + + (uint64_t)a[2] * b[5] + + (uint64_t)a[3] * b[4] + + (uint64_t)a[4] * b[3] + + (uint64_t)a[5] * b[2] + + (uint64_t)a[6] * b[1] + + (uint64_t)a[7] * b[0]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x8000007C00000007ULL); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[8] * b[9] + + (uint64_t)a[9] * b[8]; + VERIFY_BITS(d, 58); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + uint64_t u7 = d & M; d >>= 26; c += u7 * R0; + VERIFY_BITS(u7, 26); + VERIFY_BITS(d, 32); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); + /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + uint32_t t7 = c & M; c >>= 26; c += u7 * R1; + VERIFY_BITS(t7, 26); + VERIFY_BITS(c, 38); + /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[8] + + (uint64_t)a[1] * b[7] + + (uint64_t)a[2] * b[6] + + (uint64_t)a[3] * b[5] + + (uint64_t)a[4] * b[4] + + (uint64_t)a[5] * b[3] + + (uint64_t)a[6] * b[2] + + (uint64_t)a[7] * b[1] + + (uint64_t)a[8] * b[0]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000007B80000008ULL); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[9] * b[9]; + VERIFY_BITS(d, 57); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + uint64_t u8 = d & M; d >>= 26; c += u8 * R0; + VERIFY_BITS(u8, 26); + VERIFY_BITS(d, 31); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[3] = t3; + VERIFY_BITS(r[3], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = t4; + VERIFY_BITS(r[4], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[5] = t5; + VERIFY_BITS(r[5], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[6] = t6; + VERIFY_BITS(r[6], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[7] = t7; + VERIFY_BITS(r[7], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[8] = c & M; c >>= 26; c += u8 * R1; + VERIFY_BITS(r[8], 26); + VERIFY_BITS(c, 39); + /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R0 + t9; + VERIFY_BITS(c, 45); + /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); + VERIFY_BITS(r[9], 22); + VERIFY_BITS(c, 46); + /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + d = c * (R0 >> 4) + t0; + VERIFY_BITS(d, 56); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[0] = d & M; d >>= 26; + VERIFY_BITS(r[0], 26); + VERIFY_BITS(d, 30); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += c * (R1 >> 4) + t1; + VERIFY_BITS(d, 53); + VERIFY_CHECK(d <= 0x10000003FFFFBFULL); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = d & M; d >>= 26; + VERIFY_BITS(r[1], 26); + VERIFY_BITS(d, 27); + VERIFY_CHECK(d <= 0x4000000ULL); + /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += t2; + VERIFY_BITS(d, 27); + /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = d; + VERIFY_BITS(r[2], 27); + /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(const uint32_t *a, uint32_t *r) { + VERIFY_BITS(a[0], 30); + VERIFY_BITS(a[1], 30); + VERIFY_BITS(a[2], 30); + VERIFY_BITS(a[3], 30); + VERIFY_BITS(a[4], 30); + VERIFY_BITS(a[5], 30); + VERIFY_BITS(a[6], 30); + VERIFY_BITS(a[7], 30); + VERIFY_BITS(a[8], 30); + VERIFY_BITS(a[9], 26); + + const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; + /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. + * px is a shorthand for sum(a[i]*a[x-i], i=0..x). + * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. + */ + + uint64_t c, d; + + d = (uint64_t)(a[0]*2) * a[9] + + (uint64_t)(a[1]*2) * a[8] + + (uint64_t)(a[2]*2) * a[7] + + (uint64_t)(a[3]*2) * a[6] + + (uint64_t)(a[4]*2) * a[5]; + /* VERIFY_BITS(d, 64); */ + /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + uint32_t t9 = d & M; d >>= 26; + VERIFY_BITS(t9, 26); + VERIFY_BITS(d, 38); + /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + + c = (uint64_t)a[0] * a[0]; + VERIFY_BITS(c, 60); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ + d += (uint64_t)(a[1]*2) * a[9] + + (uint64_t)(a[2]*2) * a[8] + + (uint64_t)(a[3]*2) * a[7] + + (uint64_t)(a[4]*2) * a[6] + + (uint64_t)a[5] * a[5]; + VERIFY_BITS(d, 63); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + uint64_t u0 = d & M; d >>= 26; c += u0 * R0; + VERIFY_BITS(u0, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 61); + /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + uint32_t t0 = c & M; c >>= 26; c += u0 * R1; + VERIFY_BITS(t0, 26); + VERIFY_BITS(c, 37); + /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + + c += (uint64_t)(a[0]*2) * a[1]; + VERIFY_BITS(c, 62); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ + d += (uint64_t)(a[2]*2) * a[9] + + (uint64_t)(a[3]*2) * a[8] + + (uint64_t)(a[4]*2) * a[7] + + (uint64_t)(a[5]*2) * a[6]; + VERIFY_BITS(d, 63); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + uint64_t u1 = d & M; d >>= 26; c += u1 * R0; + VERIFY_BITS(u1, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + uint32_t t1 = c & M; c >>= 26; c += u1 * R1; + VERIFY_BITS(t1, 26); + VERIFY_BITS(c, 38); + /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[2] + + (uint64_t)a[1] * a[1]; + VERIFY_BITS(c, 62); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + d += (uint64_t)(a[3]*2) * a[9] + + (uint64_t)(a[4]*2) * a[8] + + (uint64_t)(a[5]*2) * a[7] + + (uint64_t)a[6] * a[6]; + VERIFY_BITS(d, 63); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + uint64_t u2 = d & M; d >>= 26; c += u2 * R0; + VERIFY_BITS(u2, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + uint32_t t2 = c & M; c >>= 26; c += u2 * R1; + VERIFY_BITS(t2, 26); + VERIFY_BITS(c, 38); + /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[3] + + (uint64_t)(a[1]*2) * a[2]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + d += (uint64_t)(a[4]*2) * a[9] + + (uint64_t)(a[5]*2) * a[8] + + (uint64_t)(a[6]*2) * a[7]; + VERIFY_BITS(d, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + uint64_t u3 = d & M; d >>= 26; c += u3 * R0; + VERIFY_BITS(u3, 26); + VERIFY_BITS(d, 37); + /* VERIFY_BITS(c, 64); */ + /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + uint32_t t3 = c & M; c >>= 26; c += u3 * R1; + VERIFY_BITS(t3, 26); + VERIFY_BITS(c, 39); + /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[4] + + (uint64_t)(a[1]*2) * a[3] + + (uint64_t)a[2] * a[2]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[5]*2) * a[9] + + (uint64_t)(a[6]*2) * a[8] + + (uint64_t)a[7] * a[7]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + uint64_t u4 = d & M; d >>= 26; c += u4 * R0; + VERIFY_BITS(u4, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + uint32_t t4 = c & M; c >>= 26; c += u4 * R1; + VERIFY_BITS(t4, 26); + VERIFY_BITS(c, 39); + /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[5] + + (uint64_t)(a[1]*2) * a[4] + + (uint64_t)(a[2]*2) * a[3]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[6]*2) * a[9] + + (uint64_t)(a[7]*2) * a[8]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + uint64_t u5 = d & M; d >>= 26; c += u5 * R0; + VERIFY_BITS(u5, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + uint32_t t5 = c & M; c >>= 26; c += u5 * R1; + VERIFY_BITS(t5, 26); + VERIFY_BITS(c, 39); + /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[6] + + (uint64_t)(a[1]*2) * a[5] + + (uint64_t)(a[2]*2) * a[4] + + (uint64_t)a[3] * a[3]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[7]*2) * a[9] + + (uint64_t)a[8] * a[8]; + VERIFY_BITS(d, 61); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + uint64_t u6 = d & M; d >>= 26; c += u6 * R0; + VERIFY_BITS(u6, 26); + VERIFY_BITS(d, 35); + /* VERIFY_BITS(c, 64); */ + /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + uint32_t t6 = c & M; c >>= 26; c += u6 * R1; + VERIFY_BITS(t6, 26); + VERIFY_BITS(c, 39); + /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[7] + + (uint64_t)(a[1]*2) * a[6] + + (uint64_t)(a[2]*2) * a[5] + + (uint64_t)(a[3]*2) * a[4]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x8000007C00000007ULL); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[8]*2) * a[9]; + VERIFY_BITS(d, 58); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + uint64_t u7 = d & M; d >>= 26; c += u7 * R0; + VERIFY_BITS(u7, 26); + VERIFY_BITS(d, 32); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); + /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + uint32_t t7 = c & M; c >>= 26; c += u7 * R1; + VERIFY_BITS(t7, 26); + VERIFY_BITS(c, 38); + /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[8] + + (uint64_t)(a[1]*2) * a[7] + + (uint64_t)(a[2]*2) * a[6] + + (uint64_t)(a[3]*2) * a[5] + + (uint64_t)a[4] * a[4]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000007B80000008ULL); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[9] * a[9]; + VERIFY_BITS(d, 57); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + uint64_t u8 = d & M; d >>= 26; c += u8 * R0; + VERIFY_BITS(u8, 26); + VERIFY_BITS(d, 31); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[3] = t3; + VERIFY_BITS(r[3], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = t4; + VERIFY_BITS(r[4], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[5] = t5; + VERIFY_BITS(r[5], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[6] = t6; + VERIFY_BITS(r[6], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[7] = t7; + VERIFY_BITS(r[7], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[8] = c & M; c >>= 26; c += u8 * R1; + VERIFY_BITS(r[8], 26); + VERIFY_BITS(c, 39); + /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R0 + t9; + VERIFY_BITS(c, 45); + /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); + VERIFY_BITS(r[9], 22); + VERIFY_BITS(c, 46); + /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + d = c * (R0 >> 4) + t0; + VERIFY_BITS(d, 56); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[0] = d & M; d >>= 26; + VERIFY_BITS(r[0], 26); + VERIFY_BITS(d, 30); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += c * (R1 >> 4) + t1; + VERIFY_BITS(d, 53); + VERIFY_CHECK(d <= 0x10000003FFFFBFULL); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = d & M; d >>= 26; + VERIFY_BITS(r[1], 26); + VERIFY_BITS(d, 27); + VERIFY_CHECK(d <= 0x4000000ULL); + /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += t2; + VERIFY_BITS(d, 27); + /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = d; + VERIFY_BITS(r[2], 27); + /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + + +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t *b) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + VERIFY_CHECK(b->magnitude <= 8); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + secp256k1_fe_mul_inner(a->n, b->n, r->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + secp256k1_fe_verify(a); +#endif + secp256k1_fe_sqr_inner(a->n, r->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +#endif diff --git a/src/secp256k1/src/field_5x52.h b/src/secp256k1/src/field_5x52.h new file mode 100644 index 0000000000..aeb0a6a1e8 --- /dev/null +++ b/src/secp256k1/src/field_5x52.h @@ -0,0 +1,21 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_ +#define _SECP256K1_FIELD_REPR_ + +#include <stdint.h> + +typedef struct { + /* X = sum(i=0..4, elem[i]*2^52) mod n */ + uint64_t n[5]; +#ifdef VERIFY + int magnitude; + int normalized; +#endif +} secp256k1_fe_t; + +#endif diff --git a/src/secp256k1/src/field_5x52_asm.asm b/src/secp256k1/src/field_5x52_asm.asm new file mode 100644 index 0000000000..5e785f7630 --- /dev/null +++ b/src/secp256k1/src/field_5x52_asm.asm @@ -0,0 +1,469 @@ + ;; Added by Diederik Huys, March 2013 + ;; + ;; Provided public procedures: + ;; secp256k1_fe_mul_inner + ;; secp256k1_fe_sqr_inner + ;; + ;; Needed tools: YASM (http://yasm.tortall.net) + ;; + ;; + + BITS 64 + +%ifidn __OUTPUT_FORMAT__,macho64 +%define SYM(x) _ %+ x +%else +%define SYM(x) x +%endif + + ;; Procedure ExSetMult + ;; Register Layout: + ;; INPUT: rdi = a->n + ;; rsi = b->n + ;; rdx = r->a + ;; + ;; INTERNAL: rdx:rax = multiplication accumulator + ;; r9:r8 = c + ;; r10-r13 = t0-t3 + ;; r14 = b.n[0] / t4 + ;; r15 = b.n[1] / t5 + ;; rbx = b.n[2] / t6 + ;; rcx = b.n[3] / t7 + ;; rbp = Constant 0FFFFFFFFFFFFFh / t8 + ;; rsi = b.n / b.n[4] / t9 + + GLOBAL SYM(secp256k1_fe_mul_inner) + ALIGN 32 +SYM(secp256k1_fe_mul_inner): + push rbp + push rbx + push r12 + push r13 + push r14 + push r15 + push rdx + mov r14,[rsi+8*0] ; preload b.n[0]. This will be the case until + ; b.n[0] is no longer needed, then we reassign + ; r14 to t4 + ;; c=a.n[0] * b.n[0] + mov rax,[rdi+0*8] ; load a.n[0] + mov rbp,0FFFFFFFFFFFFFh + mul r14 ; rdx:rax=a.n[0]*b.n[0] + mov r15,[rsi+1*8] + mov r10,rbp ; load modulus into target register for t0 + mov r8,rax + and r10,rax ; only need lower qword of c + shrd r8,rdx,52 + xor r9,r9 ; c < 2^64, so we ditch the HO part + + ;; c+=a.n[0] * b.n[1] + a.n[1] * b.n[0] + mov rax,[rdi+0*8] + mul r15 + add r8,rax + adc r9,rdx + + mov rax,[rdi+1*8] + mul r14 + mov r11,rbp + mov rbx,[rsi+2*8] + add r8,rax + adc r9,rdx + and r11,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=a.n[0 1 2] * b.n[2 1 0] + mov rax,[rdi+0*8] + mul rbx + add r8,rax + adc r9,rdx + + mov rax,[rdi+1*8] + mul r15 + add r8,rax + adc r9,rdx + + mov rax,[rdi+2*8] + mul r14 + mov r12,rbp + mov rcx,[rsi+3*8] + add r8,rax + adc r9,rdx + and r12,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=a.n[0 1 2 3] * b.n[3 2 1 0] + mov rax,[rdi+0*8] + mul rcx + add r8,rax + adc r9,rdx + + mov rax,[rdi+1*8] + mul rbx + add r8,rax + adc r9,rdx + + mov rax,[rdi+2*8] + mul r15 + add r8,rax + adc r9,rdx + + mov rax,[rdi+3*8] + mul r14 + mov r13,rbp + mov rsi,[rsi+4*8] ; load b.n[4] and destroy pointer + add r8,rax + adc r9,rdx + and r13,r8 + + shrd r8,r9,52 + xor r9,r9 + + + ;; c+=a.n[0 1 2 3 4] * b.n[4 3 2 1 0] + mov rax,[rdi+0*8] + mul rsi + add r8,rax + adc r9,rdx + + mov rax,[rdi+1*8] + mul rcx + add r8,rax + adc r9,rdx + + mov rax,[rdi+2*8] + mul rbx + add r8,rax + adc r9,rdx + + mov rax,[rdi+3*8] + mul r15 + add r8,rax + adc r9,rdx + + mov rax,[rdi+4*8] + mul r14 + mov r14,rbp ; load modulus into t4 and destroy a.n[0] + add r8,rax + adc r9,rdx + and r14,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=a.n[1 2 3 4] * b.n[4 3 2 1] + mov rax,[rdi+1*8] + mul rsi + add r8,rax + adc r9,rdx + + mov rax,[rdi+2*8] + mul rcx + add r8,rax + adc r9,rdx + + mov rax,[rdi+3*8] + mul rbx + add r8,rax + adc r9,rdx + + mov rax,[rdi+4*8] + mul r15 + mov r15,rbp + add r8,rax + adc r9,rdx + + and r15,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=a.n[2 3 4] * b.n[4 3 2] + mov rax,[rdi+2*8] + mul rsi + add r8,rax + adc r9,rdx + + mov rax,[rdi+3*8] + mul rcx + add r8,rax + adc r9,rdx + + mov rax,[rdi+4*8] + mul rbx + mov rbx,rbp + add r8,rax + adc r9,rdx + + and rbx,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=a.n[3 4] * b.n[4 3] + mov rax,[rdi+3*8] + mul rsi + add r8,rax + adc r9,rdx + + mov rax,[rdi+4*8] + mul rcx + mov rcx,rbp + add r8,rax + adc r9,rdx + and rcx,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=a.n[4] * b.n[4] + mov rax,[rdi+4*8] + mul rsi + ;; mov rbp,rbp ; modulus already there! + add r8,rax + adc r9,rdx + and rbp,r8 + shrd r8,r9,52 + xor r9,r9 + + mov rsi,r8 ; load c into t9 and destroy b.n[4] + + ;; ******************************************************* +common_exit_norm: + mov rdi,01000003D10h ; load constant + + mov rax,r15 ; get t5 + mul rdi + add rax,r10 ; +t0 + adc rdx,0 + mov r10,0FFFFFFFFFFFFFh ; modulus. Sadly, we ran out of registers! + mov r8,rax ; +c + and r10,rax + shrd r8,rdx,52 + xor r9,r9 + + mov rax,rbx ; get t6 + mul rdi + add rax,r11 ; +t1 + adc rdx,0 + mov r11,0FFFFFFFFFFFFFh ; modulus + add r8,rax ; +c + adc r9,rdx + and r11,r8 + shrd r8,r9,52 + xor r9,r9 + + mov rax,rcx ; get t7 + mul rdi + add rax,r12 ; +t2 + adc rdx,0 + pop rbx ; retrieve pointer to this.n + mov r12,0FFFFFFFFFFFFFh ; modulus + add r8,rax ; +c + adc r9,rdx + and r12,r8 + mov [rbx+2*8],r12 ; mov into this.n[2] + shrd r8,r9,52 + xor r9,r9 + + mov rax,rbp ; get t8 + mul rdi + add rax,r13 ; +t3 + adc rdx,0 + mov r13,0FFFFFFFFFFFFFh ; modulus + add r8,rax ; +c + adc r9,rdx + and r13,r8 + mov [rbx+3*8],r13 ; -> this.n[3] + shrd r8,r9,52 + xor r9,r9 + + mov rax,rsi ; get t9 + mul rdi + add rax,r14 ; +t4 + adc rdx,0 + mov r14,0FFFFFFFFFFFFh ; !!! + add r8,rax ; +c + adc r9,rdx + and r14,r8 + mov [rbx+4*8],r14 ; -> this.n[4] + shrd r8,r9,48 ; !!! + xor r9,r9 + + mov rax,01000003D1h + mul r8 + add rax,r10 + adc rdx,0 + mov r10,0FFFFFFFFFFFFFh ; modulus + mov r8,rax + and rax,r10 + shrd r8,rdx,52 + mov [rbx+0*8],rax ; -> this.n[0] + add r8,r11 + mov [rbx+1*8],r8 ; -> this.n[1] + + pop r15 + pop r14 + pop r13 + pop r12 + pop rbx + pop rbp + ret + + + ;; PROC ExSetSquare + ;; Register Layout: + ;; INPUT: rdi = a.n + ;; rsi = this.a + ;; INTERNAL: rdx:rax = multiplication accumulator + ;; r9:r8 = c + ;; r10-r13 = t0-t3 + ;; r14 = a.n[0] / t4 + ;; r15 = a.n[1] / t5 + ;; rbx = a.n[2] / t6 + ;; rcx = a.n[3] / t7 + ;; rbp = 0FFFFFFFFFFFFFh / t8 + ;; rsi = a.n[4] / t9 + GLOBAL SYM(secp256k1_fe_sqr_inner) + ALIGN 32 +SYM(secp256k1_fe_sqr_inner): + push rbp + push rbx + push r12 + push r13 + push r14 + push r15 + push rsi + mov rbp,0FFFFFFFFFFFFFh + + ;; c=a.n[0] * a.n[0] + mov r14,[rdi+0*8] ; r14=a.n[0] + mov r10,rbp ; modulus + mov rax,r14 + mul rax + mov r15,[rdi+1*8] ; a.n[1] + add r14,r14 ; r14=2*a.n[0] + mov r8,rax + and r10,rax ; only need lower qword + shrd r8,rdx,52 + xor r9,r9 + + ;; c+=2*a.n[0] * a.n[1] + mov rax,r14 ; r14=2*a.n[0] + mul r15 + mov rbx,[rdi+2*8] ; rbx=a.n[2] + mov r11,rbp ; modulus + add r8,rax + adc r9,rdx + and r11,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=2*a.n[0]*a.n[2]+a.n[1]*a.n[1] + mov rax,r14 + mul rbx + add r8,rax + adc r9,rdx + + mov rax,r15 + mov r12,rbp ; modulus + mul rax + mov rcx,[rdi+3*8] ; rcx=a.n[3] + add r15,r15 ; r15=a.n[1]*2 + add r8,rax + adc r9,rdx + and r12,r8 ; only need lower dword + shrd r8,r9,52 + xor r9,r9 + + ;; c+=2*a.n[0]*a.n[3]+2*a.n[1]*a.n[2] + mov rax,r14 + mul rcx + add r8,rax + adc r9,rdx + + mov rax,r15 ; rax=2*a.n[1] + mov r13,rbp ; modulus + mul rbx + mov rsi,[rdi+4*8] ; rsi=a.n[4] + add r8,rax + adc r9,rdx + and r13,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=2*a.n[0]*a.n[4]+2*a.n[1]*a.n[3]+a.n[2]*a.n[2] + mov rax,r14 ; last time we need 2*a.n[0] + mul rsi + add r8,rax + adc r9,rdx + + mov rax,r15 + mul rcx + mov r14,rbp ; modulus + add r8,rax + adc r9,rdx + + mov rax,rbx + mul rax + add rbx,rbx ; rcx=2*a.n[2] + add r8,rax + adc r9,rdx + and r14,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=2*a.n[1]*a.n[4]+2*a.n[2]*a.n[3] + mov rax,r15 ; last time we need 2*a.n[1] + mul rsi + add r8,rax + adc r9,rdx + + mov rax,rbx + mul rcx + mov r15,rbp ; modulus + add r8,rax + adc r9,rdx + and r15,r8 + shrd r8,r9,52 + xor r9,r9 + + ;; c+=2*a.n[2]*a.n[4]+a.n[3]*a.n[3] + mov rax,rbx ; last time we need 2*a.n[2] + mul rsi + add r8,rax + adc r9,rdx + + mov rax,rcx ; a.n[3] + mul rax + mov rbx,rbp ; modulus + add r8,rax + adc r9,rdx + and rbx,r8 ; only need lower dword + lea rax,[2*rcx] + shrd r8,r9,52 + xor r9,r9 + + ;; c+=2*a.n[3]*a.n[4] + mul rsi + mov rcx,rbp ; modulus + add r8,rax + adc r9,rdx + and rcx,r8 ; only need lower dword + shrd r8,r9,52 + xor r9,r9 + + ;; c+=a.n[4]*a.n[4] + mov rax,rsi + mul rax + ;; mov rbp,rbp ; modulus is already there! + add r8,rax + adc r9,rdx + and rbp,r8 + shrd r8,r9,52 + xor r9,r9 + + mov rsi,r8 + + ;; ******************************************************* + jmp common_exit_norm + end + + diff --git a/src/secp256k1/src/field_5x52_asm_impl.h b/src/secp256k1/src/field_5x52_asm_impl.h new file mode 100644 index 0000000000..f29605b11b --- /dev/null +++ b/src/secp256k1/src/field_5x52_asm_impl.h @@ -0,0 +1,13 @@ +/********************************************************************** + * Copyright (c) 2013 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ + +void __attribute__ ((sysv_abi)) secp256k1_fe_mul_inner(const uint64_t *a, const uint64_t *b, uint64_t *r); +void __attribute__ ((sysv_abi)) secp256k1_fe_sqr_inner(const uint64_t *a, uint64_t *r); + +#endif diff --git a/src/secp256k1/src/field_5x52_impl.h b/src/secp256k1/src/field_5x52_impl.h new file mode 100644 index 0000000000..d1b06d05a4 --- /dev/null +++ b/src/secp256k1/src/field_5x52_impl.h @@ -0,0 +1,260 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ +#define _SECP256K1_FIELD_REPR_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include <string.h> +#include "util.h" +#include "num.h" +#include "field.h" + +#if defined(USE_FIELD_5X52_ASM) +#include "field_5x52_asm_impl.h" +#elif defined(USE_FIELD_5X52_INT128) +#include "field_5x52_int128_impl.h" +#else +#error "Please select field_5x52 implementation" +#endif + +/** Implements arithmetic modulo FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F, + * represented as 5 uint64_t's in base 2^52. The values are allowed to contain >52 each. In particular, + * each FieldElem has a 'magnitude' associated with it. Internally, a magnitude M means each element + * is at most M*(2^53-1), except the most significant one, which is limited to M*(2^49-1). All operations + * accept any input with magnitude at most M, and have different rules for propagating magnitude to their + * output. + */ + +static void secp256k1_fe_inner_start(void) {} +static void secp256k1_fe_inner_stop(void) {} + +#ifdef VERIFY +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + const uint64_t *d = a->n; + int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; + r &= (d[0] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[1] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[2] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[3] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[4] <= 0x0FFFFFFFFFFFFULL * m); + r &= (a->magnitude >= 0); + if (a->normalized) { + r &= (a->magnitude <= 1); + if (r && (d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) { + r &= (d[0] < 0xFFFFEFFFFFC2FULL); + } + } + VERIFY_CHECK(r == 1); +} +#else +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + (void)a; +} +#endif + +static void secp256k1_fe_normalize(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + uint64_t m; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) + & (t0 >= 0xFFFFEFFFFFC2FULL)); + + /* Apply the final reduction (for constant-time behaviour, we do it always) */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ + VERIFY_CHECK(t4 >> 48 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t4 &= 0x0FFFFFFFFFFFFULL; + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { + r->n[0] = a; + r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + const uint64_t *t = a->n; + return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return a->n[0] & 1; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { +#ifdef VERIFY + a->magnitude = 0; + a->normalized = 1; +#endif + for (int i=0; i<5; i++) { + a->n[i] = 0; + } +} + +SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + VERIFY_CHECK(b->normalized); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + const uint64_t *t = a->n, *u = b->n; + return ((t[0]^u[0]) | (t[1]^u[1]) | (t[2]^u[2]) | (t[3]^u[3]) | (t[4]^u[4])) == 0; +} + +static void secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { + r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; + for (int i=0; i<32; i++) { + for (int j=0; j<2; j++) { + int limb = (8*i+4*j)/52; + int shift = (8*i+4*j)%52; + r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift; + } + } +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + for (int i=0; i<32; i++) { + int c = 0; + for (int j=0; j<2; j++) { + int limb = (8*i+4*j)/52; + int shift = (8*i+4*j)%52; + c |= ((a->n[limb] >> shift) & 0xF) << (4 * j); + } + r[31-i] = c; + } +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= m); + secp256k1_fe_verify(a); +#endif + r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->n[0]; + r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[1]; + r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[2]; + r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[3]; + r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->n[4]; +#ifdef VERIFY + r->magnitude = m + 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { + r->n[0] *= a; + r->n[1] *= a; + r->n[2] *= a; + r->n[3] *= a; + r->n[4] *= a; +#ifdef VERIFY + r->magnitude *= a; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + secp256k1_fe_verify(a); +#endif + r->n[0] += a->n[0]; + r->n[1] += a->n[1]; + r->n[2] += a->n[2]; + r->n[3] += a->n[3]; + r->n[4] += a->n[4]; +#ifdef VERIFY + r->magnitude += a->magnitude; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t *b) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + VERIFY_CHECK(b->magnitude <= 8); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + secp256k1_fe_mul_inner(a->n, b->n, r->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + secp256k1_fe_verify(a); +#endif + secp256k1_fe_sqr_inner(a->n, r->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +#endif diff --git a/src/secp256k1/src/field_5x52_int128_impl.h b/src/secp256k1/src/field_5x52_int128_impl.h new file mode 100644 index 0000000000..c476428672 --- /dev/null +++ b/src/secp256k1/src/field_5x52_int128_impl.h @@ -0,0 +1,279 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ + +#include <stdint.h> + +#ifdef VERIFY +#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) +#else +#define VERIFY_BITS(x, n) do { } while(0) +#endif + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(const uint64_t *a, const uint64_t *b, uint64_t *r) { + VERIFY_BITS(a[0], 56); + VERIFY_BITS(a[1], 56); + VERIFY_BITS(a[2], 56); + VERIFY_BITS(a[3], 56); + VERIFY_BITS(a[4], 52); + VERIFY_BITS(b[0], 56); + VERIFY_BITS(b[1], 56); + VERIFY_BITS(b[2], 56); + VERIFY_BITS(b[3], 56); + VERIFY_BITS(b[4], 52); + + const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; + /* [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. + * px is a shorthand for sum(a[i]*b[x-i], i=0..x). + * Note that [x 0 0 0 0 0] = [x*R]. + */ + + __int128 c, d; + + d = (__int128)a[0] * b[3] + + (__int128)a[1] * b[2] + + (__int128)a[2] * b[1] + + (__int128)a[3] * b[0]; + VERIFY_BITS(d, 114); + /* [d 0 0 0] = [p3 0 0 0] */ + c = (__int128)a[4] * b[4]; + VERIFY_BITS(c, 112); + /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + d += (c & M) * R; c >>= 52; + VERIFY_BITS(d, 115); + VERIFY_BITS(c, 60); + /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + uint64_t t3 = d & M; d >>= 52; + VERIFY_BITS(t3, 52); + VERIFY_BITS(d, 63); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + + d += (__int128)a[0] * b[4] + + (__int128)a[1] * b[3] + + (__int128)a[2] * b[2] + + (__int128)a[3] * b[1] + + (__int128)a[4] * b[0]; + VERIFY_BITS(d, 115); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + d += c * R; + VERIFY_BITS(d, 116); + /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + uint64_t t4 = d & M; d >>= 52; + VERIFY_BITS(t4, 52); + VERIFY_BITS(d, 64); + /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + uint64_t tx = (t4 >> 48); t4 &= (M >> 4); + VERIFY_BITS(tx, 4); + VERIFY_BITS(t4, 48); + /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + + c = (__int128)a[0] * b[0]; + VERIFY_BITS(c, 112); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ + d += (__int128)a[1] * b[4] + + (__int128)a[2] * b[3] + + (__int128)a[3] * b[2] + + (__int128)a[4] * b[1]; + VERIFY_BITS(d, 115); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + uint64_t u0 = d & M; d >>= 52; + VERIFY_BITS(u0, 52); + VERIFY_BITS(d, 63); + /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = (u0 << 4) | tx; + VERIFY_BITS(u0, 56); + /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + c += (__int128)u0 * (R >> 4); + VERIFY_BITS(c, 115); + /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + uint64_t t0 = c & M; c >>= 52; + VERIFY_BITS(t0, 52); + VERIFY_BITS(c, 61); + /* [d 0 t4 t3 0 c t0] = [p8 0 0 p5 p4 p3 0 0 p0] */ + + c += (__int128)a[0] * b[1] + + (__int128)a[1] * b[0]; + VERIFY_BITS(c, 114); + /* [d 0 t4 t3 0 c t0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ + d += (__int128)a[2] * b[4] + + (__int128)a[3] * b[3] + + (__int128)a[4] * b[2]; + VERIFY_BITS(d, 114); + /* [d 0 t4 t3 0 c t0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 t4 t3 0 c t0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + uint64_t t1 = c & M; c >>= 52; + VERIFY_BITS(t1, 52); + VERIFY_BITS(c, 63); + /* [d 0 0 t4 t3 c t1 t0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + + c += (__int128)a[0] * b[2] + + (__int128)a[1] * b[1] + + (__int128)a[2] * b[0]; + VERIFY_BITS(c, 114); + /* [d 0 0 t4 t3 c t1 t0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (__int128)a[3] * b[4] + + (__int128)a[4] * b[3]; + VERIFY_BITS(d, 114); + /* [d 0 0 t4 t3 c t1 t0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 0 t4 t3 c t1 t0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[0] = t0; + VERIFY_BITS(r[0], 52); + /* [d 0 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = t1; + VERIFY_BITS(r[1], 52); + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = c & M; c >>= 52; + VERIFY_BITS(r[2], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R + t3;; + VERIFY_BITS(c, 100); + /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[3] = c & M; c >>= 52; + VERIFY_BITS(r[3], 52); + VERIFY_BITS(c, 48); + /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += t4; + VERIFY_BITS(c, 49); + /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = c; + VERIFY_BITS(r[4], 49); + /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(const uint64_t *a, uint64_t *r) { + VERIFY_BITS(a[0], 56); + VERIFY_BITS(a[1], 56); + VERIFY_BITS(a[2], 56); + VERIFY_BITS(a[3], 56); + VERIFY_BITS(a[4], 52); + + const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; + /** [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. + * px is a shorthand for sum(a[i]*a[x-i], i=0..x). + * Note that [x 0 0 0 0 0] = [x*R]. + */ + + __int128 c, d; + + uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; + + d = (__int128)(a0*2) * a3 + + (__int128)(a1*2) * a2; + VERIFY_BITS(d, 114); + /* [d 0 0 0] = [p3 0 0 0] */ + c = (__int128)a4 * a4; + VERIFY_BITS(c, 112); + /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + d += (c & M) * R; c >>= 52; + VERIFY_BITS(d, 115); + VERIFY_BITS(c, 60); + /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + uint64_t t3 = d & M; d >>= 52; + VERIFY_BITS(t3, 52); + VERIFY_BITS(d, 63); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + + a4 *= 2; + d += (__int128)a0 * a4 + + (__int128)(a1*2) * a3 + + (__int128)a2 * a2; + VERIFY_BITS(d, 115); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + d += c * R; + VERIFY_BITS(d, 116); + /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + uint64_t t4 = d & M; d >>= 52; + VERIFY_BITS(t4, 52); + VERIFY_BITS(d, 64); + /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + uint64_t tx = (t4 >> 48); t4 &= (M >> 4); + VERIFY_BITS(tx, 4); + VERIFY_BITS(t4, 48); + /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + + c = (__int128)a0 * a0; + VERIFY_BITS(c, 112); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ + d += (__int128)a1 * a4 + + (__int128)(a2*2) * a3; + VERIFY_BITS(d, 114); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + uint64_t u0 = d & M; d >>= 52; + VERIFY_BITS(u0, 52); + VERIFY_BITS(d, 62); + /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = (u0 << 4) | tx; + VERIFY_BITS(u0, 56); + /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + c += (__int128)u0 * (R >> 4); + VERIFY_BITS(c, 113); + /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + r[0] = c & M; c >>= 52; + VERIFY_BITS(r[0], 52); + VERIFY_BITS(c, 61); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ + + a0 *= 2; + c += (__int128)a0 * a1; + VERIFY_BITS(c, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ + d += (__int128)a2 * a4 + + (__int128)a3 * a3; + VERIFY_BITS(d, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + r[1] = c & M; c >>= 52; + VERIFY_BITS(r[1], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + + c += (__int128)a0 * a2 + + (__int128)a1 * a1; + VERIFY_BITS(c, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (__int128)a3 * a4; + VERIFY_BITS(d, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = c & M; c >>= 52; + VERIFY_BITS(r[2], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += d * R + t3;; + VERIFY_BITS(c, 100); + /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[3] = c & M; c >>= 52; + VERIFY_BITS(r[3], 52); + VERIFY_BITS(c, 48); + /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += t4; + VERIFY_BITS(c, 49); + /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = c; + VERIFY_BITS(r[4], 49); + /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +#endif diff --git a/src/secp256k1/src/field_gmp.h b/src/secp256k1/src/field_gmp.h new file mode 100644 index 0000000000..b390fd9de8 --- /dev/null +++ b/src/secp256k1/src/field_gmp.h @@ -0,0 +1,18 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_ +#define _SECP256K1_FIELD_REPR_ + +#include <gmp.h> + +#define FIELD_LIMBS ((256 + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS) + +typedef struct { + mp_limb_t n[FIELD_LIMBS+1]; +} secp256k1_fe_t; + +#endif diff --git a/src/secp256k1/src/field_gmp_impl.h b/src/secp256k1/src/field_gmp_impl.h new file mode 100644 index 0000000000..af4728e5b4 --- /dev/null +++ b/src/secp256k1/src/field_gmp_impl.h @@ -0,0 +1,163 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ +#define _SECP256K1_FIELD_REPR_IMPL_H_ + +#include <stdio.h> +#include <string.h> +#include "num.h" +#include "field.h" + +static mp_limb_t secp256k1_field_p[FIELD_LIMBS]; +static mp_limb_t secp256k1_field_pc[(33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS]; + +static void secp256k1_fe_inner_start(void) { + for (int i=0; i<(33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; i++) + secp256k1_field_pc[i] = 0; + secp256k1_field_pc[0] += 0x3D1UL; + secp256k1_field_pc[32/GMP_NUMB_BITS] += (((mp_limb_t)1) << (32 % GMP_NUMB_BITS)); + for (int i=0; i<FIELD_LIMBS; i++) { + secp256k1_field_p[i] = 0; + } + mpn_sub(secp256k1_field_p, secp256k1_field_p, FIELD_LIMBS, secp256k1_field_pc, (33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS); +} + +static void secp256k1_fe_inner_stop(void) { +} + +static void secp256k1_fe_normalize(secp256k1_fe_t *r) { + if (r->n[FIELD_LIMBS] != 0) { +#if (GMP_NUMB_BITS >= 40) + mp_limb_t carry = mpn_add_1(r->n, r->n, FIELD_LIMBS, 0x1000003D1ULL * r->n[FIELD_LIMBS]); + mpn_add_1(r->n, r->n, FIELD_LIMBS, 0x1000003D1ULL * carry); +#else + mp_limb_t carry = mpn_add_1(r->n, r->n, FIELD_LIMBS, 0x3D1UL * r->n[FIELD_LIMBS]) + + mpn_add_1(r->n+(32/GMP_NUMB_BITS), r->n+(32/GMP_NUMB_BITS), FIELD_LIMBS-(32/GMP_NUMB_BITS), r->n[FIELD_LIMBS] << (32 % GMP_NUMB_BITS)); + mpn_add_1(r->n, r->n, FIELD_LIMBS, 0x3D1UL * carry); + mpn_add_1(r->n+(32/GMP_NUMB_BITS), r->n+(32/GMP_NUMB_BITS), FIELD_LIMBS-(32/GMP_NUMB_BITS), carry << (32%GMP_NUMB_BITS)); +#endif + r->n[FIELD_LIMBS] = 0; + } + if (mpn_cmp(r->n, secp256k1_field_p, FIELD_LIMBS) >= 0) + mpn_sub(r->n, r->n, FIELD_LIMBS, secp256k1_field_p, FIELD_LIMBS); +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { + r->n[0] = a; + for (int i=1; i<FIELD_LIMBS+1; i++) + r->n[i] = 0; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *r) { + for (int i=0; i<FIELD_LIMBS+1; i++) + r->n[i] = 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { + int ret = 1; + for (int i=0; i<FIELD_LIMBS+1; i++) + ret &= (a->n[i] == 0); + return ret; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { + return a->n[0] & 1; +} + +SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + int ret = 1; + for (int i=0; i<FIELD_LIMBS+1; i++) + ret &= (a->n[i] == b->n[i]); + return ret; +} + +static void secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { + for (int i=0; i<FIELD_LIMBS+1; i++) + r->n[i] = 0; + for (int i=0; i<256; i++) { + int limb = i/GMP_NUMB_BITS; + int shift = i%GMP_NUMB_BITS; + r->n[limb] |= (mp_limb_t)((a[31-i/8] >> (i%8)) & 0x1) << shift; + } +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { + for (int i=0; i<32; i++) { + int c = 0; + for (int j=0; j<8; j++) { + int limb = (8*i+j)/GMP_NUMB_BITS; + int shift = (8*i+j)%GMP_NUMB_BITS; + c |= ((a->n[limb] >> shift) & 0x1) << j; + } + r[31-i] = c; + } +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { + (void)m; + *r = *a; + secp256k1_fe_normalize(r); + for (int i=0; i<FIELD_LIMBS; i++) + r->n[i] = ~(r->n[i]); +#if (GMP_NUMB_BITS >= 33) + mpn_sub_1(r->n, r->n, FIELD_LIMBS, 0x1000003D0ULL); +#else + mpn_sub_1(r->n, r->n, FIELD_LIMBS, 0x3D0UL); + mpn_sub_1(r->n+(32/GMP_NUMB_BITS), r->n+(32/GMP_NUMB_BITS), FIELD_LIMBS-(32/GMP_NUMB_BITS), 0x1UL << (32%GMP_NUMB_BITS)); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { + mpn_mul_1(r->n, r->n, FIELD_LIMBS+1, a); +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { + mpn_add(r->n, r->n, FIELD_LIMBS+1, a->n, FIELD_LIMBS+1); +} + +static void secp256k1_fe_reduce(secp256k1_fe_t *r, mp_limb_t *tmp) { + /** <A1 A2 A3 A4> <B1 B2 B3 B4> + * B1 B2 B3 B4 + * + C * A1 A2 A3 A4 + * + A1 A2 A3 A4 + */ + +#if (GMP_NUMB_BITS >= 33) + mp_limb_t o = mpn_addmul_1(tmp, tmp+FIELD_LIMBS, FIELD_LIMBS, 0x1000003D1ULL); +#else + mp_limb_t o = mpn_addmul_1(tmp, tmp+FIELD_LIMBS, FIELD_LIMBS, 0x3D1UL) + + mpn_addmul_1(tmp+(32/GMP_NUMB_BITS), tmp+FIELD_LIMBS, FIELD_LIMBS-(32/GMP_NUMB_BITS), 0x1UL << (32%GMP_NUMB_BITS)); +#endif + mp_limb_t q[1+(33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS]; + q[(33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS] = mpn_mul_1(q, secp256k1_field_pc, (33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS, o); +#if (GMP_NUMB_BITS <= 32) + mp_limb_t o2 = tmp[2*FIELD_LIMBS-(32/GMP_NUMB_BITS)] << (32%GMP_NUMB_BITS); + q[(33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS] += mpn_addmul_1(q, secp256k1_field_pc, (33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS, o2); +#endif + r->n[FIELD_LIMBS] = mpn_add(r->n, tmp, FIELD_LIMBS, q, 1+(33+GMP_NUMB_BITS-1)/GMP_NUMB_BITS); +} + +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + secp256k1_fe_t ac = *a; + secp256k1_fe_t bc = *b; + secp256k1_fe_normalize(&ac); + secp256k1_fe_normalize(&bc); + mp_limb_t tmp[2*FIELD_LIMBS]; + mpn_mul_n(tmp, ac.n, bc.n, FIELD_LIMBS); + secp256k1_fe_reduce(r, tmp); +} + +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { + secp256k1_fe_t ac = *a; + secp256k1_fe_normalize(&ac); + mp_limb_t tmp[2*FIELD_LIMBS]; + mpn_sqr(tmp, ac.n, FIELD_LIMBS); + secp256k1_fe_reduce(r, tmp); +} + +#endif diff --git a/src/secp256k1/src/field_impl.h b/src/secp256k1/src/field_impl.h new file mode 100644 index 0000000000..3a31e1844e --- /dev/null +++ b/src/secp256k1/src/field_impl.h @@ -0,0 +1,293 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_IMPL_H_ +#define _SECP256K1_FIELD_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include "util.h" + +#if defined(USE_FIELD_GMP) +#include "field_gmp_impl.h" +#elif defined(USE_FIELD_10X26) +#include "field_10x26_impl.h" +#elif defined(USE_FIELD_5X52) +#include "field_5x52_impl.h" +#else +#error "Please select field implementation" +#endif + +static void secp256k1_fe_get_hex(char *r, int *rlen, const secp256k1_fe_t *a) { + if (*rlen < 65) { + *rlen = 65; + return; + } + *rlen = 65; + unsigned char tmp[32]; + secp256k1_fe_t b = *a; + secp256k1_fe_normalize(&b); + secp256k1_fe_get_b32(tmp, &b); + for (int i=0; i<32; i++) { + static const char *c = "0123456789ABCDEF"; + r[2*i] = c[(tmp[i] >> 4) & 0xF]; + r[2*i+1] = c[(tmp[i]) & 0xF]; + } + r[64] = 0x00; +} + +static void secp256k1_fe_set_hex(secp256k1_fe_t *r, const char *a, int alen) { + unsigned char tmp[32] = {}; + static const int cvt[256] = {0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 1, 2, 3, 4, 5, 6,7,8,9,0,0,0,0,0,0, + 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0}; + for (int i=0; i<32; i++) { + if (alen > i*2) + tmp[32 - alen/2 + i] = (cvt[(unsigned char)a[2*i]] << 4) + cvt[(unsigned char)a[2*i+1]]; + } + secp256k1_fe_set_b32(r, tmp); +} + +static int secp256k1_fe_sqrt(secp256k1_fe_t *r, const secp256k1_fe_t *a) { + + /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in + * { 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: + * 1, [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] + */ + + secp256k1_fe_t x2; + secp256k1_fe_sqr(&x2, a); + secp256k1_fe_mul(&x2, &x2, a); + + secp256k1_fe_t x3; + secp256k1_fe_sqr(&x3, &x2); + secp256k1_fe_mul(&x3, &x3, a); + + secp256k1_fe_t x6 = x3; + for (int j=0; j<3; j++) secp256k1_fe_sqr(&x6, &x6); + secp256k1_fe_mul(&x6, &x6, &x3); + + secp256k1_fe_t x9 = x6; + for (int j=0; j<3; j++) secp256k1_fe_sqr(&x9, &x9); + secp256k1_fe_mul(&x9, &x9, &x3); + + secp256k1_fe_t x11 = x9; + for (int j=0; j<2; j++) secp256k1_fe_sqr(&x11, &x11); + secp256k1_fe_mul(&x11, &x11, &x2); + + secp256k1_fe_t x22 = x11; + for (int j=0; j<11; j++) secp256k1_fe_sqr(&x22, &x22); + secp256k1_fe_mul(&x22, &x22, &x11); + + secp256k1_fe_t x44 = x22; + for (int j=0; j<22; j++) secp256k1_fe_sqr(&x44, &x44); + secp256k1_fe_mul(&x44, &x44, &x22); + + secp256k1_fe_t x88 = x44; + for (int j=0; j<44; j++) secp256k1_fe_sqr(&x88, &x88); + secp256k1_fe_mul(&x88, &x88, &x44); + + secp256k1_fe_t x176 = x88; + for (int j=0; j<88; j++) secp256k1_fe_sqr(&x176, &x176); + secp256k1_fe_mul(&x176, &x176, &x88); + + secp256k1_fe_t x220 = x176; + for (int j=0; j<44; j++) secp256k1_fe_sqr(&x220, &x220); + secp256k1_fe_mul(&x220, &x220, &x44); + + secp256k1_fe_t x223 = x220; + for (int j=0; j<3; j++) secp256k1_fe_sqr(&x223, &x223); + secp256k1_fe_mul(&x223, &x223, &x3); + + /* The final result is then assembled using a sliding window over the blocks. */ + + secp256k1_fe_t t1 = x223; + for (int j=0; j<23; j++) secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_mul(&t1, &t1, &x22); + for (int j=0; j<6; j++) secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_mul(&t1, &t1, &x2); + secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_sqr(r, &t1); + + /* Check that a square root was actually calculated */ + + secp256k1_fe_sqr(&t1, r); + secp256k1_fe_negate(&t1, &t1, 1); + secp256k1_fe_add(&t1, a); + secp256k1_fe_normalize(&t1); + return secp256k1_fe_is_zero(&t1); +} + +static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) { + + /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in + * { 1, 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: + * [1], [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] + */ + + secp256k1_fe_t x2; + secp256k1_fe_sqr(&x2, a); + secp256k1_fe_mul(&x2, &x2, a); + + secp256k1_fe_t x3; + secp256k1_fe_sqr(&x3, &x2); + secp256k1_fe_mul(&x3, &x3, a); + + secp256k1_fe_t x6 = x3; + for (int j=0; j<3; j++) secp256k1_fe_sqr(&x6, &x6); + secp256k1_fe_mul(&x6, &x6, &x3); + + secp256k1_fe_t x9 = x6; + for (int j=0; j<3; j++) secp256k1_fe_sqr(&x9, &x9); + secp256k1_fe_mul(&x9, &x9, &x3); + + secp256k1_fe_t x11 = x9; + for (int j=0; j<2; j++) secp256k1_fe_sqr(&x11, &x11); + secp256k1_fe_mul(&x11, &x11, &x2); + + secp256k1_fe_t x22 = x11; + for (int j=0; j<11; j++) secp256k1_fe_sqr(&x22, &x22); + secp256k1_fe_mul(&x22, &x22, &x11); + + secp256k1_fe_t x44 = x22; + for (int j=0; j<22; j++) secp256k1_fe_sqr(&x44, &x44); + secp256k1_fe_mul(&x44, &x44, &x22); + + secp256k1_fe_t x88 = x44; + for (int j=0; j<44; j++) secp256k1_fe_sqr(&x88, &x88); + secp256k1_fe_mul(&x88, &x88, &x44); + + secp256k1_fe_t x176 = x88; + for (int j=0; j<88; j++) secp256k1_fe_sqr(&x176, &x176); + secp256k1_fe_mul(&x176, &x176, &x88); + + secp256k1_fe_t x220 = x176; + for (int j=0; j<44; j++) secp256k1_fe_sqr(&x220, &x220); + secp256k1_fe_mul(&x220, &x220, &x44); + + secp256k1_fe_t x223 = x220; + for (int j=0; j<3; j++) secp256k1_fe_sqr(&x223, &x223); + secp256k1_fe_mul(&x223, &x223, &x3); + + /* The final result is then assembled using a sliding window over the blocks. */ + + secp256k1_fe_t t1 = x223; + for (int j=0; j<23; j++) secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_mul(&t1, &t1, &x22); + for (int j=0; j<5; j++) secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_mul(&t1, &t1, a); + for (int j=0; j<3; j++) secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_mul(&t1, &t1, &x2); + for (int j=0; j<2; j++) secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_mul(r, &t1, a); +} + +static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#if defined(USE_FIELD_INV_BUILTIN) + secp256k1_fe_inv(r, a); +#elif defined(USE_FIELD_INV_NUM) + unsigned char b[32]; + secp256k1_fe_t c = *a; + secp256k1_fe_normalize(&c); + secp256k1_fe_get_b32(b, &c); + secp256k1_num_t n; + secp256k1_num_set_bin(&n, b, 32); + secp256k1_num_mod_inverse(&n, &n, &secp256k1_fe_consts->p); + secp256k1_num_get_bin(b, 32, &n); + secp256k1_fe_set_b32(r, b); +#else +#error "Please select field inverse implementation" +#endif +} + +static void secp256k1_fe_inv_all(size_t len, secp256k1_fe_t r[len], const secp256k1_fe_t a[len]) { + if (len < 1) + return; + + VERIFY_CHECK((r + len <= a) || (a + len <= r)); + + r[0] = a[0]; + + size_t i = 0; + while (++i < len) { + secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]); + } + + secp256k1_fe_t u; secp256k1_fe_inv(&u, &r[--i]); + + while (i > 0) { + int j = i--; + secp256k1_fe_mul(&r[j], &r[i], &u); + secp256k1_fe_mul(&u, &u, &a[j]); + } + + r[0] = u; +} + +static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t r[len], const secp256k1_fe_t a[len]) { + if (len < 1) + return; + + VERIFY_CHECK((r + len <= a) || (a + len <= r)); + + r[0] = a[0]; + + size_t i = 0; + while (++i < len) { + secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]); + } + + secp256k1_fe_t u; secp256k1_fe_inv_var(&u, &r[--i]); + + while (i > 0) { + int j = i--; + secp256k1_fe_mul(&r[j], &r[i], &u); + secp256k1_fe_mul(&u, &u, &a[j]); + } + + r[0] = u; +} + +static void secp256k1_fe_start(void) { + static const unsigned char secp256k1_fe_consts_p[] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F + }; + if (secp256k1_fe_consts == NULL) { + secp256k1_fe_inner_start(); + secp256k1_fe_consts_t *ret = (secp256k1_fe_consts_t*)malloc(sizeof(secp256k1_fe_consts_t)); + secp256k1_num_set_bin(&ret->p, secp256k1_fe_consts_p, sizeof(secp256k1_fe_consts_p)); + secp256k1_fe_consts = ret; + } +} + +static void secp256k1_fe_stop(void) { + if (secp256k1_fe_consts != NULL) { + secp256k1_fe_consts_t *c = (secp256k1_fe_consts_t*)secp256k1_fe_consts; + free((void*)c); + secp256k1_fe_consts = NULL; + secp256k1_fe_inner_stop(); + } +} + +#endif diff --git a/src/secp256k1/src/group.h b/src/secp256k1/src/group.h new file mode 100644 index 0000000000..ba02549821 --- /dev/null +++ b/src/secp256k1/src/group.h @@ -0,0 +1,128 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_GROUP_ +#define _SECP256K1_GROUP_ + +#include "num.h" +#include "field.h" + +/** A group element of the secp256k1 curve, in affine coordinates. */ +typedef struct { + secp256k1_fe_t x; + secp256k1_fe_t y; + int infinity; /* whether this represents the point at infinity */ +} secp256k1_ge_t; + +/** A group element of the secp256k1 curve, in jacobian coordinates. */ +typedef struct { + secp256k1_fe_t x; /* actual X: x/z^2 */ + secp256k1_fe_t y; /* actual Y: y/z^3 */ + secp256k1_fe_t z; + int infinity; /* whether this represents the point at infinity */ +} secp256k1_gej_t; + +/** Global constants related to the group */ +typedef struct { + secp256k1_num_t order; /* the order of the curve (= order of its generator) */ + secp256k1_num_t half_order; /* half the order of the curve (= order of its generator) */ + secp256k1_ge_t g; /* the generator point */ + +#ifdef USE_ENDOMORPHISM + /* constants related to secp256k1's efficiently computable endomorphism */ + secp256k1_fe_t beta; + secp256k1_num_t lambda, a1b2, b1, a2; +#endif +} secp256k1_ge_consts_t; + +static const secp256k1_ge_consts_t *secp256k1_ge_consts = NULL; + +/** Initialize the group module. */ +static void secp256k1_ge_start(void); + +/** De-initialize the group module. */ +static void secp256k1_ge_stop(void); + +/** Set a group element equal to the point at infinity */ +static void secp256k1_ge_set_infinity(secp256k1_ge_t *r); + +/** Set a group element equal to the point with given X and Y coordinates */ +static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); + +/** Set a group element (affine) equal to the point with the given X coordinate, and given oddness + * for Y. Return value indicates whether the result is valid. */ +static int secp256k1_ge_set_xo(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd); + +/** Check whether a group element is the point at infinity. */ +static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a); + +/** Check whether a group element is valid (i.e., on the curve). */ +static int secp256k1_ge_is_valid(const secp256k1_ge_t *a); + +static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a); + +/** Get a hex representation of a point. *rlen will be overwritten with the real length. */ +static void secp256k1_ge_get_hex(char *r, int *rlen, const secp256k1_ge_t *a); + +/** Set a group element equal to another which is given in jacobian coordinates */ +static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a); + +/** Set a batch of group elements equal to the inputs given in jacobian coordinates */ +static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t r[len], const secp256k1_gej_t a[len]); + + +/** Set a group element (jacobian) equal to the point at infinity. */ +static void secp256k1_gej_set_infinity(secp256k1_gej_t *r); + +/** Set a group element (jacobian) equal to the point with given X and Y coordinates. */ +static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); + +/** Set a group element (jacobian) equal to another which is given in affine coordinates. */ +static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a); + +/** Get the X coordinate of a group element (jacobian). */ +static void secp256k1_gej_get_x_var(secp256k1_fe_t *r, const secp256k1_gej_t *a); + +/** Set r equal to the inverse of a (i.e., mirrored around the X axis) */ +static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a); + +/** Check whether a group element is the point at infinity. */ +static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a); + +/** Set r equal to the double of a. */ +static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a); + +/** Set r equal to the sum of a and b. */ +static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b); + +/** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */ +static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); + +/** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient + than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time + guarantee, and b is allowed to be infinity. */ +static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); + +/** Get a hex representation of a point. *rlen will be overwritten with the real length. */ +static void secp256k1_gej_get_hex(char *r, int *rlen, const secp256k1_gej_t *a); + +#ifdef USE_ENDOMORPHISM +/** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */ +static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a); + +/** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (given that a is + not more than 256 bits). */ +static void secp256k1_gej_split_exp_var(secp256k1_num_t *r1, secp256k1_num_t *r2, const secp256k1_num_t *a); +#endif + +/** Clear a secp256k1_gej_t to prevent leaking sensitive information. */ +static void secp256k1_gej_clear(secp256k1_gej_t *r); + +/** Clear a secp256k1_ge_t to prevent leaking sensitive information. */ +static void secp256k1_ge_clear(secp256k1_ge_t *r); + + +#endif diff --git a/src/secp256k1/src/group_impl.h b/src/secp256k1/src/group_impl.h new file mode 100644 index 0000000000..1edbc6e099 --- /dev/null +++ b/src/secp256k1/src/group_impl.h @@ -0,0 +1,519 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_GROUP_IMPL_H_ +#define _SECP256K1_GROUP_IMPL_H_ + +#include <string.h> + +#include "num.h" +#include "field.h" +#include "group.h" + +static void secp256k1_ge_set_infinity(secp256k1_ge_t *r) { + r->infinity = 1; +} + +static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { + r->infinity = 0; + r->x = *x; + r->y = *y; +} + +static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a) { + return a->infinity; +} + +static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + secp256k1_fe_normalize(&r->y); + secp256k1_fe_negate(&r->y, &r->y, 1); +} + +static void secp256k1_ge_get_hex(char *r, int *rlen, const secp256k1_ge_t *a) { + char cx[65]; int lx=65; + char cy[65]; int ly=65; + secp256k1_fe_get_hex(cx, &lx, &a->x); + secp256k1_fe_get_hex(cy, &ly, &a->y); + lx = strlen(cx); + ly = strlen(cy); + int len = lx + ly + 3 + 1; + if (*rlen < len) { + *rlen = len; + return; + } + *rlen = len; + r[0] = '('; + memcpy(r+1, cx, lx); + r[1+lx] = ','; + memcpy(r+2+lx, cy, ly); + r[2+lx+ly] = ')'; + r[3+lx+ly] = 0; +} + +static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a) { + r->infinity = a->infinity; + secp256k1_fe_inv(&a->z, &a->z); + secp256k1_fe_t z2; secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_t z3; secp256k1_fe_mul(&z3, &a->z, &z2); + secp256k1_fe_mul(&a->x, &a->x, &z2); + secp256k1_fe_mul(&a->y, &a->y, &z3); + secp256k1_fe_set_int(&a->z, 1); + r->x = a->x; + r->y = a->y; +} + +static void secp256k1_ge_set_gej_var(secp256k1_ge_t *r, secp256k1_gej_t *a) { + r->infinity = a->infinity; + if (a->infinity) { + return; + } + secp256k1_fe_inv_var(&a->z, &a->z); + secp256k1_fe_t z2; secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_t z3; secp256k1_fe_mul(&z3, &a->z, &z2); + secp256k1_fe_mul(&a->x, &a->x, &z2); + secp256k1_fe_mul(&a->y, &a->y, &z3); + secp256k1_fe_set_int(&a->z, 1); + r->x = a->x; + r->y = a->y; +} + +static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t r[len], const secp256k1_gej_t a[len]) { + size_t count = 0; + secp256k1_fe_t az[len]; + for (size_t i=0; i<len; i++) { + if (!a[i].infinity) { + az[count++] = a[i].z; + } + } + + secp256k1_fe_t azi[count]; + secp256k1_fe_inv_all_var(count, azi, az); + + count = 0; + for (size_t i=0; i<len; i++) { + r[i].infinity = a[i].infinity; + if (!a[i].infinity) { + secp256k1_fe_t *zi = &azi[count++]; + secp256k1_fe_t zi2; secp256k1_fe_sqr(&zi2, zi); + secp256k1_fe_t zi3; secp256k1_fe_mul(&zi3, &zi2, zi); + secp256k1_fe_mul(&r[i].x, &a[i].x, &zi2); + secp256k1_fe_mul(&r[i].y, &a[i].y, &zi3); + } + } +} + +static void secp256k1_gej_set_infinity(secp256k1_gej_t *r) { + r->infinity = 1; + secp256k1_fe_set_int(&r->x, 0); + secp256k1_fe_set_int(&r->y, 0); + secp256k1_fe_set_int(&r->z, 0); +} + +static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { + r->infinity = 0; + r->x = *x; + r->y = *y; + secp256k1_fe_set_int(&r->z, 1); +} + +static void secp256k1_gej_clear(secp256k1_gej_t *r) { + r->infinity = 0; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); + secp256k1_fe_clear(&r->z); +} + +static void secp256k1_ge_clear(secp256k1_ge_t *r) { + r->infinity = 0; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); +} + +static int secp256k1_ge_set_xo(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { + r->x = *x; + secp256k1_fe_t x2; secp256k1_fe_sqr(&x2, x); + secp256k1_fe_t x3; secp256k1_fe_mul(&x3, x, &x2); + r->infinity = 0; + secp256k1_fe_t c; secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&c, &x3); + if (!secp256k1_fe_sqrt(&r->y, &c)) + return 0; + secp256k1_fe_normalize(&r->y); + if (secp256k1_fe_is_odd(&r->y) != odd) + secp256k1_fe_negate(&r->y, &r->y, 1); + return 1; +} + +static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + secp256k1_fe_set_int(&r->z, 1); +} + +static void secp256k1_gej_get_x_var(secp256k1_fe_t *r, const secp256k1_gej_t *a) { + secp256k1_fe_t zi2; secp256k1_fe_inv_var(&zi2, &a->z); secp256k1_fe_sqr(&zi2, &zi2); + secp256k1_fe_mul(r, &a->x, &zi2); +} + +static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + r->z = a->z; + secp256k1_fe_normalize(&r->y); + secp256k1_fe_negate(&r->y, &r->y, 1); +} + +static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a) { + return a->infinity; +} + +static int secp256k1_gej_is_valid(const secp256k1_gej_t *a) { + if (a->infinity) + return 0; + /** y^2 = x^3 + 7 + * (Y/Z^3)^2 = (X/Z^2)^3 + 7 + * Y^2 / Z^6 = X^3 / Z^6 + 7 + * Y^2 = X^3 + 7*Z^6 + */ + secp256k1_fe_t y2; secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_t x3; secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_t z2; secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_t z6; secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2); + secp256k1_fe_mul_int(&z6, 7); + secp256k1_fe_add(&x3, &z6); + secp256k1_fe_normalize(&y2); + secp256k1_fe_normalize(&x3); + return secp256k1_fe_equal(&y2, &x3); +} + +static int secp256k1_ge_is_valid(const secp256k1_ge_t *a) { + if (a->infinity) + return 0; + /* y^2 = x^3 + 7 */ + secp256k1_fe_t y2; secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_t x3; secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_t c; secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&x3, &c); + secp256k1_fe_normalize(&y2); + secp256k1_fe_normalize(&x3); + return secp256k1_fe_equal(&y2, &x3); +} + +static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + if (a->infinity) { + r->infinity = 1; + return; + } + + secp256k1_fe_t t5 = a->y; + secp256k1_fe_normalize(&t5); + if (secp256k1_fe_is_zero(&t5)) { + r->infinity = 1; + return; + } + + secp256k1_fe_t t1,t2,t3,t4; + secp256k1_fe_mul(&r->z, &t5, &a->z); + secp256k1_fe_mul_int(&r->z, 2); /* Z' = 2*Y*Z (2) */ + secp256k1_fe_sqr(&t1, &a->x); + secp256k1_fe_mul_int(&t1, 3); /* T1 = 3*X^2 (3) */ + secp256k1_fe_sqr(&t2, &t1); /* T2 = 9*X^4 (1) */ + secp256k1_fe_sqr(&t3, &t5); + secp256k1_fe_mul_int(&t3, 2); /* T3 = 2*Y^2 (2) */ + secp256k1_fe_sqr(&t4, &t3); + secp256k1_fe_mul_int(&t4, 2); /* T4 = 8*Y^4 (2) */ + secp256k1_fe_mul(&t3, &a->x, &t3); /* T3 = 2*X*Y^2 (1) */ + r->x = t3; + secp256k1_fe_mul_int(&r->x, 4); /* X' = 8*X*Y^2 (4) */ + secp256k1_fe_negate(&r->x, &r->x, 4); /* X' = -8*X*Y^2 (5) */ + secp256k1_fe_add(&r->x, &t2); /* X' = 9*X^4 - 8*X*Y^2 (6) */ + secp256k1_fe_negate(&t2, &t2, 1); /* T2 = -9*X^4 (2) */ + secp256k1_fe_mul_int(&t3, 6); /* T3 = 12*X*Y^2 (6) */ + secp256k1_fe_add(&t3, &t2); /* T3 = 12*X*Y^2 - 9*X^4 (8) */ + secp256k1_fe_mul(&r->y, &t1, &t3); /* Y' = 36*X^3*Y^2 - 27*X^6 (1) */ + secp256k1_fe_negate(&t2, &t4, 2); /* T2 = -8*Y^4 (3) */ + secp256k1_fe_add(&r->y, &t2); /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */ + r->infinity = 0; +} + +static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b) { + if (a->infinity) { + *r = *b; + return; + } + if (b->infinity) { + *r = *a; + return; + } + r->infinity = 0; + secp256k1_fe_t z22; secp256k1_fe_sqr(&z22, &b->z); + secp256k1_fe_t z12; secp256k1_fe_sqr(&z12, &a->z); + secp256k1_fe_t u1; secp256k1_fe_mul(&u1, &a->x, &z22); + secp256k1_fe_t u2; secp256k1_fe_mul(&u2, &b->x, &z12); + secp256k1_fe_t s1; secp256k1_fe_mul(&s1, &a->y, &z22); secp256k1_fe_mul(&s1, &s1, &b->z); + secp256k1_fe_t s2; secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); + secp256k1_fe_normalize(&u1); + secp256k1_fe_normalize(&u2); + if (secp256k1_fe_equal(&u1, &u2)) { + secp256k1_fe_normalize(&s1); + secp256k1_fe_normalize(&s2); + if (secp256k1_fe_equal(&s1, &s2)) { + secp256k1_gej_double_var(r, a); + } else { + r->infinity = 1; + } + return; + } + secp256k1_fe_t h; secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_t i; secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + secp256k1_fe_t i2; secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_t h2; secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_t h3; secp256k1_fe_mul(&h3, &h, &h2); + secp256k1_fe_mul(&r->z, &a->z, &b->z); secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_t t; secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { + if (a->infinity) { + r->infinity = b->infinity; + r->x = b->x; + r->y = b->y; + secp256k1_fe_set_int(&r->z, 1); + return; + } + if (b->infinity) { + *r = *a; + return; + } + r->infinity = 0; + secp256k1_fe_t z12; secp256k1_fe_sqr(&z12, &a->z); + secp256k1_fe_t u1 = a->x; secp256k1_fe_normalize(&u1); + secp256k1_fe_t u2; secp256k1_fe_mul(&u2, &b->x, &z12); + secp256k1_fe_t s1 = a->y; secp256k1_fe_normalize(&s1); + secp256k1_fe_t s2; secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); + secp256k1_fe_normalize(&u1); + secp256k1_fe_normalize(&u2); + if (secp256k1_fe_equal(&u1, &u2)) { + secp256k1_fe_normalize(&s1); + secp256k1_fe_normalize(&s2); + if (secp256k1_fe_equal(&s1, &s2)) { + secp256k1_gej_double_var(r, a); + } else { + r->infinity = 1; + } + return; + } + secp256k1_fe_t h; secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_t i; secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + secp256k1_fe_t i2; secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_t h2; secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_t h3; secp256k1_fe_mul(&h3, &h, &h2); + r->z = a->z; secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_t t; secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { + VERIFY_CHECK(!b->infinity); + VERIFY_CHECK(a->infinity == 0 || a->infinity == 1); + + /** In: + * Eric Brier and Marc Joye, Weierstrass Elliptic Curves and Side-Channel Attacks. + * In D. Naccache and P. Paillier, Eds., Public Key Cryptography, vol. 2274 of Lecture Notes in Computer Science, pages 335-345. Springer-Verlag, 2002. + * we find as solution for a unified addition/doubling formula: + * lambda = ((x1 + x2)^2 - x1 * x2 + a) / (y1 + y2), with a = 0 for secp256k1's curve equation. + * x3 = lambda^2 - (x1 + x2) + * 2*y3 = lambda * (x1 + x2 - 2 * x3) - (y1 + y2). + * + * Substituting x_i = Xi / Zi^2 and yi = Yi / Zi^3, for i=1,2,3, gives: + * U1 = X1*Z2^2, U2 = X2*Z1^2 + * S1 = X1*Z2^3, S2 = X2*Z2^3 + * Z = Z1*Z2 + * T = U1+U2 + * M = S1+S2 + * Q = T*M^2 + * R = T^2-U1*U2 + * X3 = 4*(R^2-Q) + * Y3 = 4*(R*(3*Q-2*R^2)-M^4) + * Z3 = 2*M*Z + * (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.) + */ + + secp256k1_fe_t zz; secp256k1_fe_sqr(&zz, &a->z); /* z = Z1^2 */ + secp256k1_fe_t u1 = a->x; secp256k1_fe_normalize(&u1); /* u1 = U1 = X1*Z2^2 (1) */ + secp256k1_fe_t u2; secp256k1_fe_mul(&u2, &b->x, &zz); /* u2 = U2 = X2*Z1^2 (1) */ + secp256k1_fe_t s1 = a->y; secp256k1_fe_normalize(&s1); /* s1 = S1 = Y1*Z2^3 (1) */ + secp256k1_fe_t s2; secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z2^2 (1) */ + secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */ + secp256k1_fe_t z = a->z; /* z = Z = Z1*Z2 (8) */ + secp256k1_fe_t t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */ + secp256k1_fe_t m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */ + secp256k1_fe_t n; secp256k1_fe_sqr(&n, &m); /* n = M^2 (1) */ + secp256k1_fe_t q; secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*M^2 (1) */ + secp256k1_fe_sqr(&n, &n); /* n = M^4 (1) */ + secp256k1_fe_t rr; secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */ + secp256k1_fe_mul(&t, &u1, &u2); secp256k1_fe_negate(&t, &t, 1); /* t = -U1*U2 (2) */ + secp256k1_fe_add(&rr, &t); /* rr = R = T^2-U1*U2 (3) */ + secp256k1_fe_sqr(&t, &rr); /* t = R^2 (1) */ + secp256k1_fe_mul(&r->z, &m, &z); /* r->z = M*Z (1) */ + secp256k1_fe_normalize(&r->z); + int infinity = secp256k1_fe_is_zero(&r->z) * (1 - a->infinity); + secp256k1_fe_mul_int(&r->z, 2 * (1 - a->infinity)); /* r->z = Z3 = 2*M*Z (2) */ + r->x = t; /* r->x = R^2 (1) */ + secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ + secp256k1_fe_add(&r->x, &q); /* r->x = R^2-Q (3) */ + secp256k1_fe_normalize(&r->x); + secp256k1_fe_mul_int(&q, 3); /* q = -3*Q (6) */ + secp256k1_fe_mul_int(&t, 2); /* t = 2*R^2 (2) */ + secp256k1_fe_add(&t, &q); /* t = 2*R^2-3*Q (8) */ + secp256k1_fe_mul(&t, &t, &rr); /* t = R*(2*R^2-3*Q) (1) */ + secp256k1_fe_add(&t, &n); /* t = R*(2*R^2-3*Q)+M^4 (2) */ + secp256k1_fe_negate(&r->y, &t, 2); /* r->y = R*(3*Q-2*R^2)-M^4 (3) */ + secp256k1_fe_normalize(&r->y); + secp256k1_fe_mul_int(&r->x, 4 * (1 - a->infinity)); /* r->x = X3 = 4*(R^2-Q) */ + secp256k1_fe_mul_int(&r->y, 4 * (1 - a->infinity)); /* r->y = Y3 = 4*R*(3*Q-2*R^2)-4*M^4 (4) */ + + /** In case a->infinity == 1, the above code results in r->x, r->y, and r->z all equal to 0. + * Add b->x to x, b->y to y, and 1 to z in that case. + */ + t = b->x; secp256k1_fe_mul_int(&t, a->infinity); + secp256k1_fe_add(&r->x, &t); + t = b->y; secp256k1_fe_mul_int(&t, a->infinity); + secp256k1_fe_add(&r->y, &t); + secp256k1_fe_set_int(&t, a->infinity); + secp256k1_fe_add(&r->z, &t); + r->infinity = infinity; +} + + + +static void secp256k1_gej_get_hex(char *r, int *rlen, const secp256k1_gej_t *a) { + secp256k1_gej_t c = *a; + secp256k1_ge_t t; secp256k1_ge_set_gej(&t, &c); + secp256k1_ge_get_hex(r, rlen, &t); +} + +#ifdef USE_ENDOMORPHISM +static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + const secp256k1_fe_t *beta = &secp256k1_ge_consts->beta; + *r = *a; + secp256k1_fe_mul(&r->x, &r->x, beta); +} + +static void secp256k1_gej_split_exp_var(secp256k1_num_t *r1, secp256k1_num_t *r2, const secp256k1_num_t *a) { + const secp256k1_ge_consts_t *c = secp256k1_ge_consts; + secp256k1_num_t bnc1, bnc2, bnt1, bnt2, bnn2; + + secp256k1_num_copy(&bnn2, &c->order); + secp256k1_num_shift(&bnn2, 1); + + secp256k1_num_mul(&bnc1, a, &c->a1b2); + secp256k1_num_add(&bnc1, &bnc1, &bnn2); + secp256k1_num_div(&bnc1, &bnc1, &c->order); + + secp256k1_num_mul(&bnc2, a, &c->b1); + secp256k1_num_add(&bnc2, &bnc2, &bnn2); + secp256k1_num_div(&bnc2, &bnc2, &c->order); + + secp256k1_num_mul(&bnt1, &bnc1, &c->a1b2); + secp256k1_num_mul(&bnt2, &bnc2, &c->a2); + secp256k1_num_add(&bnt1, &bnt1, &bnt2); + secp256k1_num_sub(r1, a, &bnt1); + secp256k1_num_mul(&bnt1, &bnc1, &c->b1); + secp256k1_num_mul(&bnt2, &bnc2, &c->a1b2); + secp256k1_num_sub(r2, &bnt1, &bnt2); +} +#endif + + +static void secp256k1_ge_start(void) { + static const unsigned char secp256k1_ge_consts_order[] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 + }; + static const unsigned char secp256k1_ge_consts_g_x[] = { + 0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC, + 0x55,0xA0,0x62,0x95,0xCE,0x87,0x0B,0x07, + 0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9, + 0x59,0xF2,0x81,0x5B,0x16,0xF8,0x17,0x98 + }; + static const unsigned char secp256k1_ge_consts_g_y[] = { + 0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65, + 0x5D,0xA4,0xFB,0xFC,0x0E,0x11,0x08,0xA8, + 0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19, + 0x9C,0x47,0xD0,0x8F,0xFB,0x10,0xD4,0xB8 + }; +#ifdef USE_ENDOMORPHISM + /* properties of secp256k1's efficiently computable endomorphism */ + static const unsigned char secp256k1_ge_consts_lambda[] = { + 0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0, + 0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a, + 0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78, + 0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72 + }; + static const unsigned char secp256k1_ge_consts_beta[] = { + 0x7a,0xe9,0x6a,0x2b,0x65,0x7c,0x07,0x10, + 0x6e,0x64,0x47,0x9e,0xac,0x34,0x34,0xe9, + 0x9c,0xf0,0x49,0x75,0x12,0xf5,0x89,0x95, + 0xc1,0x39,0x6c,0x28,0x71,0x95,0x01,0xee + }; + static const unsigned char secp256k1_ge_consts_a1b2[] = { + 0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd, + 0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15 + }; + static const unsigned char secp256k1_ge_consts_b1[] = { + 0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28, + 0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3 + }; + static const unsigned char secp256k1_ge_consts_a2[] = { + 0x01, + 0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6, + 0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8 + }; +#endif + if (secp256k1_ge_consts == NULL) { + secp256k1_ge_consts_t *ret = (secp256k1_ge_consts_t*)malloc(sizeof(secp256k1_ge_consts_t)); + secp256k1_num_set_bin(&ret->order, secp256k1_ge_consts_order, sizeof(secp256k1_ge_consts_order)); + secp256k1_num_copy(&ret->half_order, &ret->order); + secp256k1_num_shift(&ret->half_order, 1); +#ifdef USE_ENDOMORPHISM + secp256k1_num_set_bin(&ret->lambda, secp256k1_ge_consts_lambda, sizeof(secp256k1_ge_consts_lambda)); + secp256k1_num_set_bin(&ret->a1b2, secp256k1_ge_consts_a1b2, sizeof(secp256k1_ge_consts_a1b2)); + secp256k1_num_set_bin(&ret->a2, secp256k1_ge_consts_a2, sizeof(secp256k1_ge_consts_a2)); + secp256k1_num_set_bin(&ret->b1, secp256k1_ge_consts_b1, sizeof(secp256k1_ge_consts_b1)); + secp256k1_fe_set_b32(&ret->beta, secp256k1_ge_consts_beta); +#endif + secp256k1_fe_t g_x, g_y; + secp256k1_fe_set_b32(&g_x, secp256k1_ge_consts_g_x); + secp256k1_fe_set_b32(&g_y, secp256k1_ge_consts_g_y); + secp256k1_ge_set_xy(&ret->g, &g_x, &g_y); + secp256k1_ge_consts = ret; + } +} + +static void secp256k1_ge_stop(void) { + if (secp256k1_ge_consts != NULL) { + secp256k1_ge_consts_t *c = (secp256k1_ge_consts_t*)secp256k1_ge_consts; + free((void*)c); + secp256k1_ge_consts = NULL; + } +} + +#endif diff --git a/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java b/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java new file mode 100644 index 0000000000..90a498eaa2 --- /dev/null +++ b/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java @@ -0,0 +1,60 @@ +package org.bitcoin; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import com.google.common.base.Preconditions; + + +/** + * This class holds native methods to handle ECDSA verification. + * You can find an example library that can be used for this at + * https://github.com/sipa/secp256k1 + */ +public class NativeSecp256k1 { + public static final boolean enabled; + static { + boolean isEnabled = true; + try { + System.loadLibrary("javasecp256k1"); + } catch (UnsatisfiedLinkError e) { + isEnabled = false; + } + enabled = isEnabled; + } + + private static ThreadLocal<ByteBuffer> nativeECDSABuffer = new ThreadLocal<ByteBuffer>(); + /** + * Verifies the given secp256k1 signature in native code. + * Calling when enabled == false is undefined (probably library not loaded) + * + * @param data The data which was signed, must be exactly 32 bytes + * @param signature The signature + * @param pub The public key which did the signing + */ + public static boolean verify(byte[] data, byte[] signature, byte[] pub) { + Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null) { + byteBuff = ByteBuffer.allocateDirect(32 + 8 + 520 + 520); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(data); + byteBuff.putInt(signature.length); + byteBuff.putInt(pub.length); + byteBuff.put(signature); + byteBuff.put(pub); + return secp256k1_ecdsa_verify(byteBuff) == 1; + } + + /** + * @param byteBuff signature format is byte[32] data, + * native-endian int signatureLength, native-endian int pubkeyLength, + * byte[signatureLength] signature, byte[pubkeyLength] pub + * @returns 1 for valid signature, anything else for invalid + */ + private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff); +} diff --git a/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c b/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c new file mode 100644 index 0000000000..bb4cd70728 --- /dev/null +++ b/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c @@ -0,0 +1,23 @@ +#include "org_bitcoin_NativeSecp256k1.h" +#include "include/secp256k1.h" + +JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject) +{ + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + int sigLen = *((int*)(data + 32)); + int pubLen = *((int*)(data + 32 + 4)); + + return secp256k1_ecdsa_verify(data, 32, data+32+8, sigLen, data+32+8+sigLen, pubLen); +} + +static void __javasecp256k1_attach(void) __attribute__((constructor)); +static void __javasecp256k1_detach(void) __attribute__((destructor)); + +static void __javasecp256k1_attach(void) { + secp256k1_start(SECP256K1_START_VERIFY); +} + +static void __javasecp256k1_detach(void) { + secp256k1_stop(); +} diff --git a/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h b/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h new file mode 100644 index 0000000000..d7fb004fa8 --- /dev/null +++ b/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_bitcoin_NativeSecp256k1 */ + +#ifndef _Included_org_bitcoin_NativeSecp256k1 +#define _Included_org_bitcoin_NativeSecp256k1 +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_verify + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/secp256k1/src/num.h b/src/secp256k1/src/num.h new file mode 100644 index 0000000000..c86f847858 --- /dev/null +++ b/src/secp256k1/src/num.h @@ -0,0 +1,100 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_ +#define _SECP256K1_NUM_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_NUM_GMP) +#include "num_gmp.h" +#else +#error "Please select num implementation" +#endif + +/** Clear a number to prevent the leak of sensitive data. */ +static void secp256k1_num_clear(secp256k1_num_t *r); + +/** Copy a number. */ +static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a); + +/** Convert a number's absolute value to a binary big-endian string. + * There must be enough place. */ +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a); + +/** Set a number to the value of a binary big-endian string. */ +static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen); + +/** Set a number equal to a (signed) integer. */ +static void secp256k1_num_set_int(secp256k1_num_t *r, int a); + +/** Compute a modular inverse. The input must be less than the modulus. */ +static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m); + +/** Multiply two numbers modulo another. */ +static void secp256k1_num_mod_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, const secp256k1_num_t *m); + +/** Compare the absolute value of two numbers. */ +static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Test whether two number are equal (including sign). */ +static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Add two (signed) numbers. */ +static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Subtract two (signed) numbers. */ +static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Multiply two (signed) numbers. */ +static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Divide two (signed) numbers. */ +static void secp256k1_num_div(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1, + even if r was negative. */ +static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m); + +/** Calculate the number of bits in (the absolute value of) a number. */ +static int secp256k1_num_bits(const secp256k1_num_t *a); + +/** Right-shift the passed number by bits bits, and return those bits. */ +static int secp256k1_num_shift(secp256k1_num_t *r, int bits); + +/** Check whether a number is zero. */ +static int secp256k1_num_is_zero(const secp256k1_num_t *a); + +/** Check whether a number is odd. */ +static int secp256k1_num_is_odd(const secp256k1_num_t *a); + +/** Check whether a number is strictly negative. */ +static int secp256k1_num_is_neg(const secp256k1_num_t *a); + +/** Check whether a particular bit is set in a number. */ +static int secp256k1_num_get_bit(const secp256k1_num_t *a, int pos); + +/** Increase a number by 1. */ +static void secp256k1_num_inc(secp256k1_num_t *r); + +/** Set a number equal to the value of a hex string (unsigned). */ +static void secp256k1_num_set_hex(secp256k1_num_t *r, const char *a, int alen); + +/** Convert (the absolute value of) a number to a hexadecimal string. */ +static void secp256k1_num_get_hex(char *r, int rlen, const secp256k1_num_t *a); + +/** Split a number into a low and high part. */ +static void secp256k1_num_split(secp256k1_num_t *rl, secp256k1_num_t *rh, const secp256k1_num_t *a, int bits); + +/** Change a number's sign. */ +static void secp256k1_num_negate(secp256k1_num_t *r); + +/** Get a bunch of bits from a number. */ +static int secp256k1_num_get_bits(const secp256k1_num_t *a, int offset, int count); + +#endif diff --git a/src/secp256k1/src/num_gmp.h b/src/secp256k1/src/num_gmp.h new file mode 100644 index 0000000000..baa1f2bf2e --- /dev/null +++ b/src/secp256k1/src/num_gmp.h @@ -0,0 +1,20 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_REPR_ +#define _SECP256K1_NUM_REPR_ + +#include <gmp.h> + +#define NUM_LIMBS ((256+GMP_NUMB_BITS-1)/GMP_NUMB_BITS) + +typedef struct { + mp_limb_t data[2*NUM_LIMBS]; + int neg; + int limbs; +} secp256k1_num_t; + +#endif diff --git a/src/secp256k1/src/num_gmp_impl.h b/src/secp256k1/src/num_gmp_impl.h new file mode 100644 index 0000000000..e45a59e0cd --- /dev/null +++ b/src/secp256k1/src/num_gmp_impl.h @@ -0,0 +1,376 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_REPR_IMPL_H_ +#define _SECP256K1_NUM_REPR_IMPL_H_ + +#include <string.h> +#include <stdlib.h> +#include <gmp.h> + +#include "util.h" +#include "num.h" + +#ifdef VERIFY +static void secp256k1_num_sanity(const secp256k1_num_t *a) { + VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0)); +} +#else +#define secp256k1_num_sanity(a) do { } while(0) +#endif + +static void secp256k1_num_init(secp256k1_num_t *r) { + r->neg = 0; + r->limbs = 1; + r->data[0] = 0; +} + +static void secp256k1_num_clear(secp256k1_num_t *r) { + memset(r, 0, sizeof(*r)); +} + +static void secp256k1_num_free(secp256k1_num_t *r) { + (void)r; +} + +static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a) { + *r = *a; +} + +static int secp256k1_num_bits(const secp256k1_num_t *a) { + int ret=(a->limbs-1)*GMP_NUMB_BITS; + mp_limb_t x=a->data[a->limbs-1]; + while (x) { + x >>= 1; + ret++; + } + return ret; +} + + +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a) { + unsigned char tmp[65]; + int len = 0; + if (a->limbs>1 || a->data[0] != 0) { + len = mpn_get_str(tmp, 256, (mp_limb_t*)a->data, a->limbs); + } + int shift = 0; + while (shift < len && tmp[shift] == 0) shift++; + VERIFY_CHECK(len-shift <= (int)rlen); + memset(r, 0, rlen - len + shift); + if (len > shift) { + memcpy(r + rlen - len + shift, tmp + shift, len - shift); + } + memset(tmp, 0, sizeof(tmp)); +} + +static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen) { + VERIFY_CHECK(alen > 0); + VERIFY_CHECK(alen <= 64); + int len = mpn_set_str(r->data, a, alen, 256); + VERIFY_CHECK(len <= NUM_LIMBS*2); + r->limbs = len; + r->neg = 0; + while (r->limbs > 1 && r->data[r->limbs-1]==0) r->limbs--; +} + +static void secp256k1_num_set_int(secp256k1_num_t *r, int a) { + r->limbs = 1; + r->neg = (a < 0); + r->data[0] = (a < 0) ? -a : a; +} + +static void secp256k1_num_add_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs); + r->limbs = a->limbs; + if (c != 0) { + VERIFY_CHECK(r->limbs < 2*NUM_LIMBS); + r->data[r->limbs++] = c; + } +} + +static void secp256k1_num_sub_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs); + VERIFY_CHECK(c == 0); + r->limbs = a->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) r->limbs--; +} + +static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) { + secp256k1_num_sanity(r); + secp256k1_num_sanity(m); + + if (r->limbs >= m->limbs) { + mp_limb_t t[2*NUM_LIMBS]; + mpn_tdiv_qr(t, r->data, 0, r->data, r->limbs, m->data, m->limbs); + memset(t, 0, sizeof(t)); + r->limbs = m->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) r->limbs--; + } + + if (r->neg && (r->limbs > 1 || r->data[0] != 0)) { + secp256k1_num_sub_abs(r, m, r); + r->neg = 0; + } +} + +static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(m); + + /** mpn_gcdext computes: (G,S) = gcdext(U,V), where + * * G = gcd(U,V) + * * G = U*S + V*T + * * U has equal or more limbs than V, and V has no padding + * If we set U to be (a padded version of) a, and V = m: + * G = a*S + m*T + * G = a*S mod m + * Assuming G=1: + * S = 1/a mod m + */ + VERIFY_CHECK(m->limbs <= NUM_LIMBS); + VERIFY_CHECK(m->data[m->limbs-1] != 0); + mp_limb_t g[NUM_LIMBS+1]; + mp_limb_t u[NUM_LIMBS+1]; + mp_limb_t v[NUM_LIMBS+1]; + for (int i=0; i < m->limbs; i++) { + u[i] = (i < a->limbs) ? a->data[i] : 0; + v[i] = m->data[i]; + } + mp_size_t sn = NUM_LIMBS+1; + mp_size_t gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs); + VERIFY_CHECK(gn == 1); + VERIFY_CHECK(g[0] == 1); + r->neg = a->neg ^ m->neg; + if (sn < 0) { + mpn_sub(r->data, m->data, m->limbs, r->data, -sn); + r->limbs = m->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) r->limbs--; + } else { + r->limbs = sn; + } + memset(g, 0, sizeof(g)); + memset(u, 0, sizeof(u)); + memset(v, 0, sizeof(v)); +} + +static int secp256k1_num_is_zero(const secp256k1_num_t *a) { + return (a->limbs == 1 && a->data[0] == 0); +} + +static int secp256k1_num_is_odd(const secp256k1_num_t *a) { + return a->data[0] & 1; +} + +static int secp256k1_num_is_neg(const secp256k1_num_t *a) { + return (a->limbs > 1 || a->data[0] != 0) && a->neg; +} + +static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) { + if (a->limbs > b->limbs) return 1; + if (a->limbs < b->limbs) return -1; + return mpn_cmp(a->data, b->data, a->limbs); +} + +static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) { + if (a->limbs > b->limbs) return 0; + if (a->limbs < b->limbs) return 0; + if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) return 0; + return mpn_cmp(a->data, b->data, a->limbs) == 0; +} + +static void secp256k1_num_subadd(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, int bneg) { + if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */ + r->neg = a->neg; + if (a->limbs >= b->limbs) { + secp256k1_num_add_abs(r, a, b); + } else { + secp256k1_num_add_abs(r, b, a); + } + } else { + if (secp256k1_num_cmp(a, b) > 0) { + r->neg = a->neg; + secp256k1_num_sub_abs(r, a, b); + } else { + r->neg = b->neg ^ bneg; + secp256k1_num_sub_abs(r, b, a); + } + } +} + +static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + secp256k1_num_subadd(r, a, b, 0); +} + +static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + secp256k1_num_subadd(r, a, b, 1); +} + +static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + + mp_limb_t tmp[2*NUM_LIMBS+1]; + VERIFY_CHECK(a->limbs + b->limbs <= 2*NUM_LIMBS+1); + if ((a->limbs==1 && a->data[0]==0) || (b->limbs==1 && b->data[0]==0)) { + r->limbs = 1; + r->neg = 0; + r->data[0] = 0; + return; + } + if (a->limbs >= b->limbs) + mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs); + else + mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs); + r->limbs = a->limbs + b->limbs; + if (r->limbs > 1 && tmp[r->limbs - 1]==0) r->limbs--; + VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS); + mpn_copyi(r->data, tmp, r->limbs); + r->neg = a->neg ^ b->neg; + memset(tmp, 0, sizeof(tmp)); +} + +static void secp256k1_num_div(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + if (b->limbs > a->limbs) { + r->limbs = 1; + r->data[0] = 0; + r->neg = 0; + return; + } + + mp_limb_t quo[2*NUM_LIMBS+1]; + mp_limb_t rem[2*NUM_LIMBS+1]; + mpn_tdiv_qr(quo, rem, 0, a->data, a->limbs, b->data, b->limbs); + mpn_copyi(r->data, quo, a->limbs - b->limbs + 1); + r->limbs = a->limbs - b->limbs + 1; + while (r->limbs > 1 && r->data[r->limbs - 1]==0) r->limbs--; + r->neg = a->neg ^ b->neg; +} + +static void secp256k1_num_mod_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, const secp256k1_num_t *m) { + secp256k1_num_mul(r, a, b); + secp256k1_num_mod(r, m); +} + + +static int secp256k1_num_shift(secp256k1_num_t *r, int bits) { + VERIFY_CHECK(bits <= GMP_NUMB_BITS); + mp_limb_t ret = mpn_rshift(r->data, r->data, r->limbs, bits); + if (r->limbs>1 && r->data[r->limbs-1]==0) r->limbs--; + ret >>= (GMP_NUMB_BITS - bits); + return ret; +} + +static int secp256k1_num_get_bit(const secp256k1_num_t *a, int pos) { + return (a->limbs*GMP_NUMB_BITS > pos) && ((a->data[pos/GMP_NUMB_BITS] >> (pos % GMP_NUMB_BITS)) & 1); +} + +static void secp256k1_num_inc(secp256k1_num_t *r) { + mp_limb_t ret = mpn_add_1(r->data, r->data, r->limbs, (mp_limb_t)1); + if (ret) { + VERIFY_CHECK(r->limbs < 2*NUM_LIMBS); + r->data[r->limbs++] = ret; + } +} + +static void secp256k1_num_set_hex(secp256k1_num_t *r, const char *a, int alen) { + static const unsigned char cvt[256] = { + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 1, 2, 3, 4, 5, 6,7,8,9,0,0,0,0,0,0, + 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0, + 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0 + }; + unsigned char num[257] = {}; + for (int i=0; i<alen; i++) { + num[i] = cvt[(unsigned char)a[i]]; + } + r->limbs = mpn_set_str(r->data, num, alen, 16); + r->neg = 0; + while (r->limbs > 1 && r->data[r->limbs-1] == 0) r->limbs--; +} + +static void secp256k1_num_get_hex(char *r, int rlen, const secp256k1_num_t *a) { + static const unsigned char cvt[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + unsigned char *tmp = malloc(257); + mp_size_t len = mpn_get_str(tmp, 16, (mp_limb_t*)a->data, a->limbs); + VERIFY_CHECK(len <= rlen); + for (int i=0; i<len; i++) { + VERIFY_CHECK(rlen-len+i >= 0); + VERIFY_CHECK(rlen-len+i < rlen); + VERIFY_CHECK(tmp[i] < 16); + r[rlen-len+i] = cvt[tmp[i]]; + } + for (int i=0; i<rlen-len; i++) { + VERIFY_CHECK(i >= 0); + VERIFY_CHECK(i < rlen); + r[i] = cvt[0]; + } + free(tmp); +} + +static void secp256k1_num_split(secp256k1_num_t *rl, secp256k1_num_t *rh, const secp256k1_num_t *a, int bits) { + VERIFY_CHECK(bits > 0); + rh->neg = a->neg; + if (bits >= a->limbs * GMP_NUMB_BITS) { + *rl = *a; + rh->limbs = 1; + rh->data[0] = 0; + return; + } + rl->limbs = 0; + rl->neg = a->neg; + int left = bits; + while (left >= GMP_NUMB_BITS) { + rl->data[rl->limbs] = a->data[rl->limbs]; + rl->limbs++; + left -= GMP_NUMB_BITS; + } + if (left == 0) { + mpn_copyi(rh->data, a->data + rl->limbs, a->limbs - rl->limbs); + rh->limbs = a->limbs - rl->limbs; + } else { + mpn_rshift(rh->data, a->data + rl->limbs, a->limbs - rl->limbs, left); + rh->limbs = a->limbs - rl->limbs; + while (rh->limbs>1 && rh->data[rh->limbs-1]==0) rh->limbs--; + } + if (left > 0) { + rl->data[rl->limbs] = a->data[rl->limbs] & ((((mp_limb_t)1) << left) - 1); + rl->limbs++; + } + while (rl->limbs>1 && rl->data[rl->limbs-1]==0) rl->limbs--; +} + +static void secp256k1_num_negate(secp256k1_num_t *r) { + r->neg ^= 1; +} + +static int secp256k1_num_get_bits(const secp256k1_num_t *a, int offset, int count) { + int ret = 0; + for (int i = 0; i < count; i++) { + ret |= ((a->data[(offset + i) / GMP_NUMB_BITS] >> ((offset + i) % GMP_NUMB_BITS)) & 1) << i; + } + return ret; +} + +#endif diff --git a/src/secp256k1/src/num_impl.h b/src/secp256k1/src/num_impl.h new file mode 100644 index 0000000000..f73d3ceea8 --- /dev/null +++ b/src/secp256k1/src/num_impl.h @@ -0,0 +1,22 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_IMPL_H_ +#define _SECP256K1_NUM_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include "num.h" + +#if defined(USE_NUM_GMP) +#include "num_gmp_impl.h" +#else +#error "Please select num implementation" +#endif + +#endif diff --git a/src/secp256k1/src/scalar.h b/src/secp256k1/src/scalar.h new file mode 100644 index 0000000000..3baacb3721 --- /dev/null +++ b/src/secp256k1/src/scalar.h @@ -0,0 +1,63 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_ +#define _SECP256K1_SCALAR_ + +#include "num.h" + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_SCALAR_4X64) +#include "scalar_4x64.h" +#elif defined(USE_SCALAR_8X32) +#include "scalar_8x32.h" +#else +#error "Please select scalar implementation" +#endif + +/** Clear a scalar to prevent the leak of sensitive data. */ +static void secp256k1_scalar_clear(secp256k1_scalar_t *r); + +/** Access bits from a scalar. */ +static int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, int offset, int count); + +/** Set a scalar from a big endian byte array. */ +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *bin, int *overflow); + +/** Convert a scalar to a byte array. */ +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a); + +/** Add two scalars together (modulo the group order). */ +static void secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); + +/** Multiply two scalars (modulo the group order). */ +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); + +/** Compute the square of a scalar (modulo the group order). */ +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Compute the inverse of a scalar (modulo the group order). */ +static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Compute the complement of a scalar (modulo the group order). */ +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Check whether a scalar equals zero. */ +static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a); + +/** Check whether a scalar equals one. */ +static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a); + +/** Check whether a scalar is higher than the group order divided by 2. */ +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a); + +/** Convert a scalar to a number. */ +static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a); + +#endif diff --git a/src/secp256k1/src/scalar_4x64.h b/src/secp256k1/src/scalar_4x64.h new file mode 100644 index 0000000000..5a751c6862 --- /dev/null +++ b/src/secp256k1/src/scalar_4x64.h @@ -0,0 +1,17 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_ +#define _SECP256K1_SCALAR_REPR_ + +#include <stdint.h> + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef struct { + uint64_t d[4]; +} secp256k1_scalar_t; + +#endif diff --git a/src/secp256k1/src/scalar_4x64_impl.h b/src/secp256k1/src/scalar_4x64_impl.h new file mode 100644 index 0000000000..f78718234f --- /dev/null +++ b/src/secp256k1/src/scalar_4x64_impl.h @@ -0,0 +1,359 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ +#define _SECP256K1_SCALAR_REPR_IMPL_H_ + +typedef unsigned __int128 uint128_t; + +/* Limbs of the secp256k1 order. */ +#define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL) +#define SECP256K1_N_1 ((uint64_t)0xBAAEDCE6AF48A03BULL) +#define SECP256K1_N_2 ((uint64_t)0xFFFFFFFFFFFFFFFEULL) +#define SECP256K1_N_3 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) + +/* Limbs of 2^256 minus the secp256k1 order. */ +#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) +#define SECP256K1_N_C_1 (~SECP256K1_N_1) +#define SECP256K1_N_C_2 (1) + +/* Limbs of half the secp256k1 order. */ +#define SECP256K1_N_H_0 ((uint64_t)0xDFE92F46681B20A0ULL) +#define SECP256K1_N_H_1 ((uint64_t)0x5D576E7357A4501DULL) +#define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) +#define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL) + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { + r->d[0] = 0; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; +} + +SECP256K1_INLINE static int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, int offset, int count) { + VERIFY_CHECK((offset + count - 1) / 64 == offset / 64); + return (a->d[offset / 64] >> (offset % 64)) & ((((uint64_t)1) << count) - 1); +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */ + no |= (a->d[2] < SECP256K1_N_2); + yes |= (a->d[2] > SECP256K1_N_2) & ~no; + no |= (a->d[1] < SECP256K1_N_1); + yes |= (a->d[1] > SECP256K1_N_1) & ~no; + yes |= (a->d[0] >= SECP256K1_N_0) & ~no; + return yes; +} + +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, unsigned int overflow) { + VERIFY_CHECK(overflow <= 1); + uint128_t t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0; + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[1] + overflow * SECP256K1_N_C_1; + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[2] + overflow * SECP256K1_N_C_2; + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint64_t)r->d[3]; + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; + return overflow; +} + +static void secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + uint128_t t = (uint128_t)a->d[0] + b->d[0]; + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[1] + b->d[1]; + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[2] + b->d[2]; + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[3] + b->d[3]; + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + secp256k1_scalar_reduce(r, t + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { + r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56; + r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56; + r->d[2] = (uint64_t)b32[15] | (uint64_t)b32[14] << 8 | (uint64_t)b32[13] << 16 | (uint64_t)b32[12] << 24 | (uint64_t)b32[11] << 32 | (uint64_t)b32[10] << 40 | (uint64_t)b32[9] << 48 | (uint64_t)b32[8] << 56; + r->d[3] = (uint64_t)b32[7] | (uint64_t)b32[6] << 8 | (uint64_t)b32[5] << 16 | (uint64_t)b32[4] << 24 | (uint64_t)b32[3] << 32 | (uint64_t)b32[2] << 40 | (uint64_t)b32[1] << 48 | (uint64_t)b32[0] << 56; + int over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); + if (overflow) { + *overflow = over; + } +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { + bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3]; + bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2]; + bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1]; + bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { + return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0); + uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1; + r->d[0] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[1]) + SECP256K1_N_1; + r->d[1] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[2]) + SECP256K1_N_2; + r->d[2] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[3]) + SECP256K1_N_3; + r->d[3] = t & nonzero; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { + return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[3] < SECP256K1_N_H_3); + yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; + no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; /* No need for a > check. */ + no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; + yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; + return yes; +} + +/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ + +/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c1 += th; /* overflow is handled on the next line */ \ + c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ +} + +/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ +#define muladd_fast(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c1 += th; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK(c1 >= th); \ +} + +/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd2(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + uint64_t th2 = th + th; /* at most 0xFFFFFFFFFFFFFFFE (in case th was 0x7FFFFFFFFFFFFFFF) */ \ + c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ + uint64_t tl2 = tl + tl; /* at most 0xFFFFFFFFFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFFFFFFFFFF) */ \ + th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c0 += tl2; /* overflow is handled on the next line */ \ + th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ + c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ + c1 += th2; /* overflow is handled on the next line */ \ + c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ +} + +/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define sumadd(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + unsigned int over = (c0 < (a)) ? 1 : 0; \ + c1 += over; /* overflow is handled on the next line */ \ + c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ +} + +/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ +#define sumadd_fast(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ + VERIFY_CHECK(c2 == 0); \ +} + +/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. */ +#define extract(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = c2; \ + c2 = 0; \ +} + +/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. c2 is required to be zero. */ +#define extract_fast(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = 0; \ + VERIFY_CHECK(c2 == 0); \ +} + +static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l) { + uint64_t n0 = l[4], n1 = l[5], n2 = l[6], n3 = l[7]; + + /* 160 bit accumulator. */ + uint64_t c0, c1; + uint32_t c2; + + /* Reduce 512 bits into 385. */ + /* m[0..6] = l[0..3] + n[0..3] * SECP256K1_N_C. */ + c0 = l[0]; c1 = 0; c2 = 0; + muladd_fast(n0, SECP256K1_N_C_0); + uint64_t m0; extract_fast(m0); + sumadd_fast(l[1]); + muladd(n1, SECP256K1_N_C_0); + muladd(n0, SECP256K1_N_C_1); + uint64_t m1; extract(m1); + sumadd(l[2]); + muladd(n2, SECP256K1_N_C_0); + muladd(n1, SECP256K1_N_C_1); + sumadd(n0); + uint64_t m2; extract(m2); + sumadd(l[3]); + muladd(n3, SECP256K1_N_C_0); + muladd(n2, SECP256K1_N_C_1); + sumadd(n1); + uint64_t m3; extract(m3); + muladd(n3, SECP256K1_N_C_1); + sumadd(n2); + uint64_t m4; extract(m4); + sumadd_fast(n3); + uint64_t m5; extract_fast(m5); + VERIFY_CHECK(c0 <= 1); + uint32_t m6 = c0; + + /* Reduce 385 bits into 258. */ + /* p[0..4] = m[0..3] + m[4..6] * SECP256K1_N_C. */ + c0 = m0; c1 = 0; c2 = 0; + muladd_fast(m4, SECP256K1_N_C_0); + uint64_t p0; extract_fast(p0); + sumadd_fast(m1); + muladd(m5, SECP256K1_N_C_0); + muladd(m4, SECP256K1_N_C_1); + uint64_t p1; extract(p1); + sumadd(m2); + muladd(m6, SECP256K1_N_C_0); + muladd(m5, SECP256K1_N_C_1); + sumadd(m4); + uint64_t p2; extract(p2); + sumadd_fast(m3); + muladd_fast(m6, SECP256K1_N_C_1); + sumadd_fast(m5); + uint64_t p3; extract_fast(p3); + uint32_t p4 = c0 + m6; + VERIFY_CHECK(p4 <= 2); + + /* Reduce 258 bits into 256. */ + /* r[0..3] = p[0..3] + p[4] * SECP256K1_N_C. */ + uint128_t c = p0 + (uint128_t)SECP256K1_N_C_0 * p4; + r->d[0] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p1 + (uint128_t)SECP256K1_N_C_1 * p4; + r->d[1] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p2 + (uint128_t)p4; + r->d[2] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p3; + r->d[3] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + + /* Final reduction of r. */ + secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + /* 160 bit accumulator. */ + uint64_t c0 = 0, c1 = 0; + uint32_t c2 = 0; + + uint64_t l[8]; + + /* l[0..7] = a[0..3] * b[0..3]. */ + muladd_fast(a->d[0], b->d[0]); + extract_fast(l[0]); + muladd(a->d[0], b->d[1]); + muladd(a->d[1], b->d[0]); + extract(l[1]); + muladd(a->d[0], b->d[2]); + muladd(a->d[1], b->d[1]); + muladd(a->d[2], b->d[0]); + extract(l[2]); + muladd(a->d[0], b->d[3]); + muladd(a->d[1], b->d[2]); + muladd(a->d[2], b->d[1]); + muladd(a->d[3], b->d[0]); + extract(l[3]); + muladd(a->d[1], b->d[3]); + muladd(a->d[2], b->d[2]); + muladd(a->d[3], b->d[1]); + extract(l[4]); + muladd(a->d[2], b->d[3]); + muladd(a->d[3], b->d[2]); + extract(l[5]); + muladd_fast(a->d[3], b->d[3]); + extract_fast(l[6]); + VERIFY_CHECK(c1 <= 0); + l[7] = c0; + + secp256k1_scalar_reduce_512(r, l); +} + +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + /* 160 bit accumulator. */ + uint64_t c0 = 0, c1 = 0; + uint32_t c2 = 0; + + uint64_t l[8]; + + /* l[0..7] = a[0..3] * b[0..3]. */ + muladd_fast(a->d[0], a->d[0]); + extract_fast(l[0]); + muladd2(a->d[0], a->d[1]); + extract(l[1]); + muladd2(a->d[0], a->d[2]); + muladd(a->d[1], a->d[1]); + extract(l[2]); + muladd2(a->d[0], a->d[3]); + muladd2(a->d[1], a->d[2]); + extract(l[3]); + muladd2(a->d[1], a->d[3]); + muladd(a->d[2], a->d[2]); + extract(l[4]); + muladd2(a->d[2], a->d[3]); + extract(l[5]); + muladd_fast(a->d[3], a->d[3]); + extract_fast(l[6]); + VERIFY_CHECK(c1 == 0); + l[7] = c0; + + secp256k1_scalar_reduce_512(r, l); +} + +#undef sumadd +#undef sumadd_fast +#undef muladd +#undef muladd_fast +#undef muladd2 +#undef extract +#undef extract_fast + +#endif diff --git a/src/secp256k1/src/scalar_8x32.h b/src/secp256k1/src/scalar_8x32.h new file mode 100644 index 0000000000..f70328cfc9 --- /dev/null +++ b/src/secp256k1/src/scalar_8x32.h @@ -0,0 +1,17 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_ +#define _SECP256K1_SCALAR_REPR_ + +#include <stdint.h> + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef struct { + uint32_t d[8]; +} secp256k1_scalar_t; + +#endif diff --git a/src/secp256k1/src/scalar_8x32_impl.h b/src/secp256k1/src/scalar_8x32_impl.h new file mode 100644 index 0000000000..e58be1365f --- /dev/null +++ b/src/secp256k1/src/scalar_8x32_impl.h @@ -0,0 +1,572 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ +#define _SECP256K1_SCALAR_REPR_IMPL_H_ + +/* Limbs of the secp256k1 order. */ +#define SECP256K1_N_0 ((uint32_t)0xD0364141UL) +#define SECP256K1_N_1 ((uint32_t)0xBFD25E8CUL) +#define SECP256K1_N_2 ((uint32_t)0xAF48A03BUL) +#define SECP256K1_N_3 ((uint32_t)0xBAAEDCE6UL) +#define SECP256K1_N_4 ((uint32_t)0xFFFFFFFEUL) +#define SECP256K1_N_5 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_6 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_7 ((uint32_t)0xFFFFFFFFUL) + +/* Limbs of 2^256 minus the secp256k1 order. */ +#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) +#define SECP256K1_N_C_1 (~SECP256K1_N_1) +#define SECP256K1_N_C_2 (~SECP256K1_N_2) +#define SECP256K1_N_C_3 (~SECP256K1_N_3) +#define SECP256K1_N_C_4 (1) + +/* Limbs of half the secp256k1 order. */ +#define SECP256K1_N_H_0 ((uint32_t)0x681B20A0UL) +#define SECP256K1_N_H_1 ((uint32_t)0xDFE92F46UL) +#define SECP256K1_N_H_2 ((uint32_t)0x57A4501DUL) +#define SECP256K1_N_H_3 ((uint32_t)0x5D576E73UL) +#define SECP256K1_N_H_4 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_5 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL) + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { + r->d[0] = 0; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; + r->d[4] = 0; + r->d[5] = 0; + r->d[6] = 0; + r->d[7] = 0; +} + +SECP256K1_INLINE static int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, int offset, int count) { + VERIFY_CHECK((offset + count - 1) / 32 == offset / 32); + return (a->d[offset / 32] >> (offset % 32)) & ((1 << count) - 1); +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */ + no |= (a->d[6] < SECP256K1_N_6); /* No need for a > check. */ + no |= (a->d[5] < SECP256K1_N_5); /* No need for a > check. */ + no |= (a->d[4] < SECP256K1_N_4); + yes |= (a->d[4] > SECP256K1_N_4) & ~no; + no |= (a->d[3] < SECP256K1_N_3) & ~yes; + yes |= (a->d[3] > SECP256K1_N_3) & ~no; + no |= (a->d[2] < SECP256K1_N_2) & ~yes; + yes |= (a->d[2] > SECP256K1_N_2) & ~no; + no |= (a->d[1] < SECP256K1_N_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_1) & ~no; + yes |= (a->d[0] >= SECP256K1_N_0) & ~no; + return yes; +} + +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, uint32_t overflow) { + VERIFY_CHECK(overflow <= 1); + uint64_t t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0; + r->d[0] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[1] + overflow * SECP256K1_N_C_1; + r->d[1] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[2] + overflow * SECP256K1_N_C_2; + r->d[2] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[3] + overflow * SECP256K1_N_C_3; + r->d[3] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[4] + overflow * SECP256K1_N_C_4; + r->d[4] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[5]; + r->d[5] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[6]; + r->d[6] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[7]; + r->d[7] = t & 0xFFFFFFFFUL; + return overflow; +} + +static void secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + uint64_t t = (uint64_t)a->d[0] + b->d[0]; + r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[1] + b->d[1]; + r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[2] + b->d[2]; + r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[3] + b->d[3]; + r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[4] + b->d[4]; + r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[5] + b->d[5]; + r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[6] + b->d[6]; + r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[7] + b->d[7]; + r->d[7] = t & 0xFFFFFFFFULL; t >>= 32; + secp256k1_scalar_reduce(r, t + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { + r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24; + r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24; + r->d[2] = (uint32_t)b32[23] | (uint32_t)b32[22] << 8 | (uint32_t)b32[21] << 16 | (uint32_t)b32[20] << 24; + r->d[3] = (uint32_t)b32[19] | (uint32_t)b32[18] << 8 | (uint32_t)b32[17] << 16 | (uint32_t)b32[16] << 24; + r->d[4] = (uint32_t)b32[15] | (uint32_t)b32[14] << 8 | (uint32_t)b32[13] << 16 | (uint32_t)b32[12] << 24; + r->d[5] = (uint32_t)b32[11] | (uint32_t)b32[10] << 8 | (uint32_t)b32[9] << 16 | (uint32_t)b32[8] << 24; + r->d[6] = (uint32_t)b32[7] | (uint32_t)b32[6] << 8 | (uint32_t)b32[5] << 16 | (uint32_t)b32[4] << 24; + r->d[7] = (uint32_t)b32[3] | (uint32_t)b32[2] << 8 | (uint32_t)b32[1] << 16 | (uint32_t)b32[0] << 24; + int over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); + if (overflow) { + *overflow = over; + } +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { + bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7]; + bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6]; + bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5]; + bin[12] = a->d[4] >> 24; bin[13] = a->d[4] >> 16; bin[14] = a->d[4] >> 8; bin[15] = a->d[4]; + bin[16] = a->d[3] >> 24; bin[17] = a->d[3] >> 16; bin[18] = a->d[3] >> 8; bin[19] = a->d[3]; + bin[20] = a->d[2] >> 24; bin[21] = a->d[2] >> 16; bin[22] = a->d[2] >> 8; bin[23] = a->d[2]; + bin[24] = a->d[1] >> 24; bin[25] = a->d[1] >> 16; bin[26] = a->d[1] >> 8; bin[27] = a->d[1]; + bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { + return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0); + uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1; + r->d[0] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[1]) + SECP256K1_N_1; + r->d[1] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[2]) + SECP256K1_N_2; + r->d[2] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[3]) + SECP256K1_N_3; + r->d[3] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[4]) + SECP256K1_N_4; + r->d[4] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[5]) + SECP256K1_N_5; + r->d[5] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[6]) + SECP256K1_N_6; + r->d[6] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[7]) + SECP256K1_N_7; + r->d[7] = t & nonzero; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { + return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[7] < SECP256K1_N_H_7); + yes |= (a->d[7] > SECP256K1_N_H_7) & ~no; + no |= (a->d[6] < SECP256K1_N_H_6) & ~yes; /* No need for a > check. */ + no |= (a->d[5] < SECP256K1_N_H_5) & ~yes; /* No need for a > check. */ + no |= (a->d[4] < SECP256K1_N_H_4) & ~yes; /* No need for a > check. */ + no |= (a->d[3] < SECP256K1_N_H_3) & ~yes; + yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; + no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; + yes |= (a->d[2] > SECP256K1_N_H_2) & ~no; + no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; + yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; + return yes; +} + +/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ + +/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c1 += th; /* overflow is handled on the next line */ \ + c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ +} + +/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ +#define muladd_fast(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c1 += th; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK(c1 >= th); \ +} + +/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd2(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + uint32_t th2 = th + th; /* at most 0xFFFFFFFE (in case th was 0x7FFFFFFF) */ \ + c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ + uint32_t tl2 = tl + tl; /* at most 0xFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFF) */ \ + th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c0 += tl2; /* overflow is handled on the next line */ \ + th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ + c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ + c1 += th2; /* overflow is handled on the next line */ \ + c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ +} + +/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define sumadd(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + unsigned int over = (c0 < (a)) ? 1 : 0; \ + c1 += over; /* overflow is handled on the next line */ \ + c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ +} + +/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ +#define sumadd_fast(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ + VERIFY_CHECK(c2 == 0); \ +} + +/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. */ +#define extract(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = c2; \ + c2 = 0; \ +} + +/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. c2 is required to be zero. */ +#define extract_fast(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = 0; \ + VERIFY_CHECK(c2 == 0); \ +} + +static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint32_t *l) { + uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15]; + + /* 96 bit accumulator. */ + uint32_t c0, c1, c2; + + /* Reduce 512 bits into 385. */ + /* m[0..12] = l[0..7] + n[0..7] * SECP256K1_N_C. */ + c0 = l[0]; c1 = 0; c2 = 0; + muladd_fast(n0, SECP256K1_N_C_0); + uint32_t m0; extract_fast(m0); + sumadd_fast(l[1]); + muladd(n1, SECP256K1_N_C_0); + muladd(n0, SECP256K1_N_C_1); + uint32_t m1; extract(m1); + sumadd(l[2]); + muladd(n2, SECP256K1_N_C_0); + muladd(n1, SECP256K1_N_C_1); + muladd(n0, SECP256K1_N_C_2); + uint32_t m2; extract(m2); + sumadd(l[3]); + muladd(n3, SECP256K1_N_C_0); + muladd(n2, SECP256K1_N_C_1); + muladd(n1, SECP256K1_N_C_2); + muladd(n0, SECP256K1_N_C_3); + uint32_t m3; extract(m3); + sumadd(l[4]); + muladd(n4, SECP256K1_N_C_0); + muladd(n3, SECP256K1_N_C_1); + muladd(n2, SECP256K1_N_C_2); + muladd(n1, SECP256K1_N_C_3); + sumadd(n0); + uint32_t m4; extract(m4); + sumadd(l[5]); + muladd(n5, SECP256K1_N_C_0); + muladd(n4, SECP256K1_N_C_1); + muladd(n3, SECP256K1_N_C_2); + muladd(n2, SECP256K1_N_C_3); + sumadd(n1); + uint32_t m5; extract(m5); + sumadd(l[6]); + muladd(n6, SECP256K1_N_C_0); + muladd(n5, SECP256K1_N_C_1); + muladd(n4, SECP256K1_N_C_2); + muladd(n3, SECP256K1_N_C_3); + sumadd(n2); + uint32_t m6; extract(m6); + sumadd(l[7]); + muladd(n7, SECP256K1_N_C_0); + muladd(n6, SECP256K1_N_C_1); + muladd(n5, SECP256K1_N_C_2); + muladd(n4, SECP256K1_N_C_3); + sumadd(n3); + uint32_t m7; extract(m7); + muladd(n7, SECP256K1_N_C_1); + muladd(n6, SECP256K1_N_C_2); + muladd(n5, SECP256K1_N_C_3); + sumadd(n4); + uint32_t m8; extract(m8); + muladd(n7, SECP256K1_N_C_2); + muladd(n6, SECP256K1_N_C_3); + sumadd(n5); + uint32_t m9; extract(m9); + muladd(n7, SECP256K1_N_C_3); + sumadd(n6); + uint32_t m10; extract(m10); + sumadd_fast(n7); + uint32_t m11; extract_fast(m11); + VERIFY_CHECK(c0 <= 1); + uint32_t m12 = c0; + + /* Reduce 385 bits into 258. */ + /* p[0..8] = m[0..7] + m[8..12] * SECP256K1_N_C. */ + c0 = m0; c1 = 0; c2 = 0; + muladd_fast(m8, SECP256K1_N_C_0); + uint32_t p0; extract_fast(p0); + sumadd_fast(m1); + muladd(m9, SECP256K1_N_C_0); + muladd(m8, SECP256K1_N_C_1); + uint32_t p1; extract(p1); + sumadd(m2); + muladd(m10, SECP256K1_N_C_0); + muladd(m9, SECP256K1_N_C_1); + muladd(m8, SECP256K1_N_C_2); + uint32_t p2; extract(p2); + sumadd(m3); + muladd(m11, SECP256K1_N_C_0); + muladd(m10, SECP256K1_N_C_1); + muladd(m9, SECP256K1_N_C_2); + muladd(m8, SECP256K1_N_C_3); + uint32_t p3; extract(p3); + sumadd(m4); + muladd(m12, SECP256K1_N_C_0); + muladd(m11, SECP256K1_N_C_1); + muladd(m10, SECP256K1_N_C_2); + muladd(m9, SECP256K1_N_C_3); + sumadd(m8); + uint32_t p4; extract(p4); + sumadd(m5); + muladd(m12, SECP256K1_N_C_1); + muladd(m11, SECP256K1_N_C_2); + muladd(m10, SECP256K1_N_C_3); + sumadd(m9); + uint32_t p5; extract(p5); + sumadd(m6); + muladd(m12, SECP256K1_N_C_2); + muladd(m11, SECP256K1_N_C_3); + sumadd(m10); + uint32_t p6; extract(p6); + sumadd_fast(m7); + muladd_fast(m12, SECP256K1_N_C_3); + sumadd_fast(m11); + uint32_t p7; extract_fast(p7); + uint32_t p8 = c0 + m12; + VERIFY_CHECK(p8 <= 2); + + /* Reduce 258 bits into 256. */ + /* r[0..7] = p[0..7] + p[8] * SECP256K1_N_C. */ + uint64_t c = p0 + (uint64_t)SECP256K1_N_C_0 * p8; + r->d[0] = c & 0xFFFFFFFFUL; c >>= 32; + c += p1 + (uint64_t)SECP256K1_N_C_1 * p8; + r->d[1] = c & 0xFFFFFFFFUL; c >>= 32; + c += p2 + (uint64_t)SECP256K1_N_C_2 * p8; + r->d[2] = c & 0xFFFFFFFFUL; c >>= 32; + c += p3 + (uint64_t)SECP256K1_N_C_3 * p8; + r->d[3] = c & 0xFFFFFFFFUL; c >>= 32; + c += p4 + (uint64_t)p8; + r->d[4] = c & 0xFFFFFFFFUL; c >>= 32; + c += p5; + r->d[5] = c & 0xFFFFFFFFUL; c >>= 32; + c += p6; + r->d[6] = c & 0xFFFFFFFFUL; c >>= 32; + c += p7; + r->d[7] = c & 0xFFFFFFFFUL; c >>= 32; + + /* Final reduction of r. */ + secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + /* 96 bit accumulator. */ + uint32_t c0 = 0, c1 = 0, c2 = 0; + + uint32_t l[16]; + + /* l[0..15] = a[0..7] * b[0..7]. */ + muladd_fast(a->d[0], b->d[0]); + extract_fast(l[0]); + muladd(a->d[0], b->d[1]); + muladd(a->d[1], b->d[0]); + extract(l[1]); + muladd(a->d[0], b->d[2]); + muladd(a->d[1], b->d[1]); + muladd(a->d[2], b->d[0]); + extract(l[2]); + muladd(a->d[0], b->d[3]); + muladd(a->d[1], b->d[2]); + muladd(a->d[2], b->d[1]); + muladd(a->d[3], b->d[0]); + extract(l[3]); + muladd(a->d[0], b->d[4]); + muladd(a->d[1], b->d[3]); + muladd(a->d[2], b->d[2]); + muladd(a->d[3], b->d[1]); + muladd(a->d[4], b->d[0]); + extract(l[4]); + muladd(a->d[0], b->d[5]); + muladd(a->d[1], b->d[4]); + muladd(a->d[2], b->d[3]); + muladd(a->d[3], b->d[2]); + muladd(a->d[4], b->d[1]); + muladd(a->d[5], b->d[0]); + extract(l[5]); + muladd(a->d[0], b->d[6]); + muladd(a->d[1], b->d[5]); + muladd(a->d[2], b->d[4]); + muladd(a->d[3], b->d[3]); + muladd(a->d[4], b->d[2]); + muladd(a->d[5], b->d[1]); + muladd(a->d[6], b->d[0]); + extract(l[6]); + muladd(a->d[0], b->d[7]); + muladd(a->d[1], b->d[6]); + muladd(a->d[2], b->d[5]); + muladd(a->d[3], b->d[4]); + muladd(a->d[4], b->d[3]); + muladd(a->d[5], b->d[2]); + muladd(a->d[6], b->d[1]); + muladd(a->d[7], b->d[0]); + extract(l[7]); + muladd(a->d[1], b->d[7]); + muladd(a->d[2], b->d[6]); + muladd(a->d[3], b->d[5]); + muladd(a->d[4], b->d[4]); + muladd(a->d[5], b->d[3]); + muladd(a->d[6], b->d[2]); + muladd(a->d[7], b->d[1]); + extract(l[8]); + muladd(a->d[2], b->d[7]); + muladd(a->d[3], b->d[6]); + muladd(a->d[4], b->d[5]); + muladd(a->d[5], b->d[4]); + muladd(a->d[6], b->d[3]); + muladd(a->d[7], b->d[2]); + extract(l[9]); + muladd(a->d[3], b->d[7]); + muladd(a->d[4], b->d[6]); + muladd(a->d[5], b->d[5]); + muladd(a->d[6], b->d[4]); + muladd(a->d[7], b->d[3]); + extract(l[10]); + muladd(a->d[4], b->d[7]); + muladd(a->d[5], b->d[6]); + muladd(a->d[6], b->d[5]); + muladd(a->d[7], b->d[4]); + extract(l[11]); + muladd(a->d[5], b->d[7]); + muladd(a->d[6], b->d[6]); + muladd(a->d[7], b->d[5]); + extract(l[12]); + muladd(a->d[6], b->d[7]); + muladd(a->d[7], b->d[6]); + extract(l[13]); + muladd_fast(a->d[7], b->d[7]); + extract_fast(l[14]); + VERIFY_CHECK(c1 == 0); + l[15] = c0; + + secp256k1_scalar_reduce_512(r, l); +} + +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + /* 96 bit accumulator. */ + uint32_t c0 = 0, c1 = 0, c2 = 0; + + uint32_t l[16]; + + /* l[0..15] = a[0..7]^2. */ + muladd_fast(a->d[0], a->d[0]); + extract_fast(l[0]); + muladd2(a->d[0], a->d[1]); + extract(l[1]); + muladd2(a->d[0], a->d[2]); + muladd(a->d[1], a->d[1]); + extract(l[2]); + muladd2(a->d[0], a->d[3]); + muladd2(a->d[1], a->d[2]); + extract(l[3]); + muladd2(a->d[0], a->d[4]); + muladd2(a->d[1], a->d[3]); + muladd(a->d[2], a->d[2]); + extract(l[4]); + muladd2(a->d[0], a->d[5]); + muladd2(a->d[1], a->d[4]); + muladd2(a->d[2], a->d[3]); + extract(l[5]); + muladd2(a->d[0], a->d[6]); + muladd2(a->d[1], a->d[5]); + muladd2(a->d[2], a->d[4]); + muladd(a->d[3], a->d[3]); + extract(l[6]); + muladd2(a->d[0], a->d[7]); + muladd2(a->d[1], a->d[6]); + muladd2(a->d[2], a->d[5]); + muladd2(a->d[3], a->d[4]); + extract(l[7]); + muladd2(a->d[1], a->d[7]); + muladd2(a->d[2], a->d[6]); + muladd2(a->d[3], a->d[5]); + muladd(a->d[4], a->d[4]); + extract(l[8]); + muladd2(a->d[2], a->d[7]); + muladd2(a->d[3], a->d[6]); + muladd2(a->d[4], a->d[5]); + extract(l[9]); + muladd2(a->d[3], a->d[7]); + muladd2(a->d[4], a->d[6]); + muladd(a->d[5], a->d[5]); + extract(l[10]); + muladd2(a->d[4], a->d[7]); + muladd2(a->d[5], a->d[6]); + extract(l[11]); + muladd2(a->d[5], a->d[7]); + muladd(a->d[6], a->d[6]); + extract(l[12]); + muladd2(a->d[6], a->d[7]); + extract(l[13]); + muladd_fast(a->d[7], a->d[7]); + extract_fast(l[14]); + VERIFY_CHECK(c1 == 0); + l[15] = c0; + + secp256k1_scalar_reduce_512(r, l); +} + +#undef sumadd +#undef sumadd_fast +#undef muladd +#undef muladd_fast +#undef muladd2 +#undef extract +#undef extract_fast + +#endif diff --git a/src/secp256k1/src/scalar_impl.h b/src/secp256k1/src/scalar_impl.h new file mode 100644 index 0000000000..ddc5061c76 --- /dev/null +++ b/src/secp256k1/src/scalar_impl.h @@ -0,0 +1,184 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_IMPL_H_ +#define _SECP256K1_SCALAR_IMPL_H_ + +#include <string.h> + +#include "scalar.h" + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_SCALAR_4X64) +#include "scalar_4x64_impl.h" +#elif defined(USE_SCALAR_8X32) +#include "scalar_8x32_impl.h" +#else +#error "Please select scalar implementation" +#endif + +static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a) { + unsigned char c[32]; + secp256k1_scalar_get_b32(c, a); + secp256k1_num_set_bin(r, c, 32); +} + + +static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { + /* First compute x ^ (2^N - 1) for some values of N. */ + secp256k1_scalar_t x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127; + + secp256k1_scalar_sqr(&x2, x); + secp256k1_scalar_mul(&x2, &x2, x); + + secp256k1_scalar_sqr(&x3, &x2); + secp256k1_scalar_mul(&x3, &x3, x); + + secp256k1_scalar_sqr(&x4, &x3); + secp256k1_scalar_mul(&x4, &x4, x); + + secp256k1_scalar_sqr(&x6, &x4); + secp256k1_scalar_sqr(&x6, &x6); + secp256k1_scalar_mul(&x6, &x6, &x2); + + secp256k1_scalar_sqr(&x7, &x6); + secp256k1_scalar_mul(&x7, &x7, x); + + secp256k1_scalar_sqr(&x8, &x7); + secp256k1_scalar_mul(&x8, &x8, x); + + secp256k1_scalar_sqr(&x15, &x8); + for (int i=0; i<6; i++) + secp256k1_scalar_sqr(&x15, &x15); + secp256k1_scalar_mul(&x15, &x15, &x7); + + secp256k1_scalar_sqr(&x30, &x15); + for (int i=0; i<14; i++) + secp256k1_scalar_sqr(&x30, &x30); + secp256k1_scalar_mul(&x30, &x30, &x15); + + secp256k1_scalar_sqr(&x60, &x30); + for (int i=0; i<29; i++) + secp256k1_scalar_sqr(&x60, &x60); + secp256k1_scalar_mul(&x60, &x60, &x30); + + secp256k1_scalar_sqr(&x120, &x60); + for (int i=0; i<59; i++) + secp256k1_scalar_sqr(&x120, &x120); + secp256k1_scalar_mul(&x120, &x120, &x60); + + secp256k1_scalar_sqr(&x127, &x120); + for (int i=0; i<6; i++) + secp256k1_scalar_sqr(&x127, &x127); + secp256k1_scalar_mul(&x127, &x127, &x7); + + /* Then accumulate the final result (t starts at x127). */ + secp256k1_scalar_t *t = &x127; + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<4; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<4; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (int i=0; i<3; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (int i=0; i<4; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (int i=0; i<5; i++) /* 00 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (int i=0; i<4; i++) /* 00 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<5; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x4); /* 1111 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<3; i++) /* 00 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<4; i++) /* 000 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<10; i++) /* 0000000 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (int i=0; i<4; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (int i=0; i<9; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x8); /* 11111111 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<3; i++) /* 00 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<3; i++) /* 00 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<5; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x4); /* 1111 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<5; i++) /* 000 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (int i=0; i<4; i++) /* 00 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (int i=0; i<2; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<8; i++) /* 000000 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (int i=0; i<3; i++) /* 0 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (int i=0; i<3; i++) /* 00 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<6; i++) /* 00000 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (int i=0; i<8; i++) /* 00 */ + secp256k1_scalar_sqr(t, t); + secp256k1_scalar_mul(r, t, &x6); /* 111111 */ +} + +#endif diff --git a/src/secp256k1/src/secp256k1.c b/src/secp256k1/src/secp256k1.c new file mode 100644 index 0000000000..1ab5b3722c --- /dev/null +++ b/src/secp256k1/src/secp256k1.c @@ -0,0 +1,305 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#define SECP256K1_BUILD (1) + +#include "include/secp256k1.h" + +#include "util.h" +#include "num_impl.h" +#include "field_impl.h" +#include "scalar_impl.h" +#include "group_impl.h" +#include "ecmult_impl.h" +#include "ecmult_gen_impl.h" +#include "ecdsa_impl.h" +#include "eckey_impl.h" + +void secp256k1_start(unsigned int flags) { + secp256k1_fe_start(); + secp256k1_ge_start(); + if (flags & SECP256K1_START_SIGN) { + secp256k1_ecmult_gen_start(); + } + if (flags & SECP256K1_START_VERIFY) { + secp256k1_ecmult_start(); + } +} + +void secp256k1_stop(void) { + secp256k1_ecmult_stop(); + secp256k1_ecmult_gen_stop(); + secp256k1_ge_stop(); + secp256k1_fe_stop(); +} + +int secp256k1_ecdsa_verify(const unsigned char *msg, int msglen, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) { + DEBUG_CHECK(secp256k1_ecmult_consts != NULL); + DEBUG_CHECK(msg != NULL); + DEBUG_CHECK(msglen <= 32); + DEBUG_CHECK(sig != NULL); + DEBUG_CHECK(pubkey != NULL); + + int ret = -3; + secp256k1_num_t m; + secp256k1_ecdsa_sig_t s; + secp256k1_ge_t q; + secp256k1_num_set_bin(&m, msg, msglen); + + if (!secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen)) { + ret = -1; + goto end; + } + if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) { + ret = -2; + goto end; + } + if (!secp256k1_ecdsa_sig_verify(&s, &q, &m)) { + ret = 0; + goto end; + } + ret = 1; +end: + return ret; +} + +int secp256k1_ecdsa_sign(const unsigned char *message, int messagelen, unsigned char *signature, int *signaturelen, const unsigned char *seckey, const unsigned char *nonce) { + DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL); + DEBUG_CHECK(message != NULL); + DEBUG_CHECK(messagelen <= 32); + DEBUG_CHECK(signature != NULL); + DEBUG_CHECK(signaturelen != NULL); + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(nonce != NULL); + + secp256k1_scalar_t sec, non, msg; + secp256k1_scalar_set_b32(&sec, seckey, NULL); + int overflow = 0; + secp256k1_scalar_set_b32(&non, nonce, &overflow); + { + unsigned char c[32] = {0}; + memcpy(c + 32 - messagelen, message, messagelen); + secp256k1_scalar_set_b32(&msg, c, NULL); + memset(c, 0, 32); + } + int ret = !secp256k1_scalar_is_zero(&non) && !overflow; + secp256k1_ecdsa_sig_t sig; + if (ret) { + ret = secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non, NULL); + } + if (ret) { + secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig); + } + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + return ret; +} + +int secp256k1_ecdsa_sign_compact(const unsigned char *message, int messagelen, unsigned char *sig64, const unsigned char *seckey, const unsigned char *nonce, int *recid) { + DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL); + DEBUG_CHECK(message != NULL); + DEBUG_CHECK(messagelen <= 32); + DEBUG_CHECK(sig64 != NULL); + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(nonce != NULL); + + secp256k1_scalar_t sec, non, msg; + secp256k1_scalar_set_b32(&sec, seckey, NULL); + int overflow = 0; + secp256k1_scalar_set_b32(&non, nonce, &overflow); + { + unsigned char c[32] = {0}; + memcpy(c + 32 - messagelen, message, messagelen); + secp256k1_scalar_set_b32(&msg, c, NULL); + memset(c, 0, 32); + } + int ret = !secp256k1_scalar_is_zero(&non) && !overflow; + secp256k1_ecdsa_sig_t sig; + if (ret) { + ret = secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non, recid); + } + if (ret) { + secp256k1_num_get_bin(sig64, 32, &sig.r); + secp256k1_num_get_bin(sig64 + 32, 32, &sig.s); + } + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + return ret; +} + +int secp256k1_ecdsa_recover_compact(const unsigned char *msg, int msglen, const unsigned char *sig64, unsigned char *pubkey, int *pubkeylen, int compressed, int recid) { + DEBUG_CHECK(secp256k1_ecmult_consts != NULL); + DEBUG_CHECK(msg != NULL); + DEBUG_CHECK(msglen <= 32); + DEBUG_CHECK(sig64 != NULL); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + DEBUG_CHECK(recid >= 0 && recid <= 3); + + int ret = 0; + secp256k1_num_t m; + secp256k1_ecdsa_sig_t sig; + secp256k1_num_set_bin(&sig.r, sig64, 32); + secp256k1_num_set_bin(&sig.s, sig64 + 32, 32); + secp256k1_num_set_bin(&m, msg, msglen); + + secp256k1_ge_t q; + if (secp256k1_ecdsa_sig_recover(&sig, &q, &m, recid)) { + ret = secp256k1_eckey_pubkey_serialize(&q, pubkey, pubkeylen, compressed); + } + return ret; +} + +int secp256k1_ec_seckey_verify(const unsigned char *seckey) { + DEBUG_CHECK(seckey != NULL); + + secp256k1_scalar_t sec; + int overflow; + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + int ret = !secp256k1_scalar_is_zero(&sec) && !overflow; + secp256k1_scalar_clear(&sec); + return ret; +} + +int secp256k1_ec_pubkey_verify(const unsigned char *pubkey, int pubkeylen) { + DEBUG_CHECK(pubkey != NULL); + + secp256k1_ge_t q; + return secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen); +} + +int secp256k1_ec_pubkey_create(unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) { + DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + DEBUG_CHECK(seckey != NULL); + + secp256k1_scalar_t sec; + secp256k1_scalar_set_b32(&sec, seckey, NULL); + secp256k1_gej_t pj; + secp256k1_ecmult_gen(&pj, &sec); + secp256k1_scalar_clear(&sec); + secp256k1_ge_t p; + secp256k1_ge_set_gej(&p, &pj); + return secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed); +} + +int secp256k1_ec_pubkey_decompress(unsigned char *pubkey, int *pubkeylen) { + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + + secp256k1_ge_t p; + if (!secp256k1_eckey_pubkey_parse(&p, pubkey, *pubkeylen)) + return 0; + return secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, 0); +} + +int secp256k1_ec_privkey_tweak_add(unsigned char *seckey, const unsigned char *tweak) { + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(tweak != NULL); + + secp256k1_scalar_t term; + int overflow = 0; + secp256k1_scalar_set_b32(&term, tweak, &overflow); + secp256k1_scalar_t sec; + secp256k1_scalar_set_b32(&sec, seckey, NULL); + + int ret = secp256k1_eckey_privkey_tweak_add(&sec, &term) && !overflow; + if (ret) { + secp256k1_scalar_get_b32(seckey, &sec); + } + + secp256k1_scalar_clear(&sec); + secp256k1_scalar_clear(&term); + return ret; +} + +int secp256k1_ec_pubkey_tweak_add(unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { + DEBUG_CHECK(secp256k1_ecmult_consts != NULL); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(tweak != NULL); + + secp256k1_num_t term; + secp256k1_num_set_bin(&term, tweak, 32); + secp256k1_ge_t p; + int ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); + if (ret) { + ret = secp256k1_eckey_pubkey_tweak_add(&p, &term); + } + if (ret) { + int oldlen = pubkeylen; + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); + VERIFY_CHECK(pubkeylen == oldlen); + } + + return ret; +} + +int secp256k1_ec_privkey_tweak_mul(unsigned char *seckey, const unsigned char *tweak) { + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(tweak != NULL); + + secp256k1_scalar_t factor; + int overflow = 0; + secp256k1_scalar_set_b32(&factor, tweak, &overflow); + secp256k1_scalar_t sec; + secp256k1_scalar_set_b32(&sec, seckey, NULL); + int ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor) && !overflow; + if (ret) { + secp256k1_scalar_get_b32(seckey, &sec); + } + + secp256k1_scalar_clear(&sec); + secp256k1_scalar_clear(&factor); + return ret; +} + +int secp256k1_ec_pubkey_tweak_mul(unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { + DEBUG_CHECK(secp256k1_ecmult_consts != NULL); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(tweak != NULL); + + secp256k1_num_t factor; + secp256k1_num_set_bin(&factor, tweak, 32); + secp256k1_ge_t p; + int ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); + if (ret) { + ret = secp256k1_eckey_pubkey_tweak_mul(&p, &factor); + } + if (ret) { + int oldlen = pubkeylen; + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); + VERIFY_CHECK(pubkeylen == oldlen); + } + + return ret; +} + +int secp256k1_ec_privkey_export(const unsigned char *seckey, unsigned char *privkey, int *privkeylen, int compressed) { + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(privkey != NULL); + DEBUG_CHECK(privkeylen != NULL); + + secp256k1_scalar_t key; + secp256k1_scalar_set_b32(&key, seckey, NULL); + int ret = secp256k1_eckey_privkey_serialize(privkey, privkeylen, &key, compressed); + secp256k1_scalar_clear(&key); + return ret; +} + +int secp256k1_ec_privkey_import(unsigned char *seckey, const unsigned char *privkey, int privkeylen) { + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(privkey != NULL); + + secp256k1_scalar_t key; + int ret = secp256k1_eckey_privkey_parse(&key, privkey, privkeylen); + if (ret) + secp256k1_scalar_get_b32(seckey, &key); + secp256k1_scalar_clear(&key); + return ret; +} diff --git a/src/secp256k1/src/testrand.h b/src/secp256k1/src/testrand.h new file mode 100644 index 0000000000..018b65cd53 --- /dev/null +++ b/src/secp256k1/src/testrand.h @@ -0,0 +1,26 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_TESTRAND_H_ +#define _SECP256K1_TESTRAND_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +/** Seed the pseudorandom number generator. */ +SECP256K1_INLINE static void secp256k1_rand_seed(uint64_t v); + +/** Generate a pseudorandom 32-bit number. */ +static uint32_t secp256k1_rand32(void); + +/** Generate a pseudorandom 32-byte array. */ +static void secp256k1_rand256(unsigned char *b32); + +/** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */ +static void secp256k1_rand256_test(unsigned char *b32); + +#endif diff --git a/src/secp256k1/src/testrand_impl.h b/src/secp256k1/src/testrand_impl.h new file mode 100644 index 0000000000..677c4b9a0e --- /dev/null +++ b/src/secp256k1/src/testrand_impl.h @@ -0,0 +1,60 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_TESTRAND_IMPL_H_ +#define _SECP256K1_TESTRAND_IMPL_H_ + +#include <stdint.h> +#include <string.h> + +#include "testrand.h" + +static uint32_t secp256k1_Rz = 11, secp256k1_Rw = 11; + +SECP256K1_INLINE static void secp256k1_rand_seed(uint64_t v) { + secp256k1_Rz = v >> 32; + secp256k1_Rw = v; + + if (secp256k1_Rz == 0 || secp256k1_Rz == 0x9068ffffU) { + secp256k1_Rz = 111; + } + if (secp256k1_Rw == 0 || secp256k1_Rw == 0x464fffffU) { + secp256k1_Rw = 111; + } +} + +SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { + secp256k1_Rz = 36969 * (secp256k1_Rz & 0xFFFF) + (secp256k1_Rz >> 16); + secp256k1_Rw = 18000 * (secp256k1_Rw & 0xFFFF) + (secp256k1_Rw >> 16); + return (secp256k1_Rw << 16) + (secp256k1_Rw >> 16) + secp256k1_Rz; +} + +static void secp256k1_rand256(unsigned char *b32) { + for (int i=0; i<8; i++) { + uint32_t r = secp256k1_rand32(); + b32[i*4 + 0] = (r >> 0) & 0xFF; + b32[i*4 + 1] = (r >> 8) & 0xFF; + b32[i*4 + 2] = (r >> 16) & 0xFF; + b32[i*4 + 3] = (r >> 24) & 0xFF; + } +} + +static void secp256k1_rand256_test(unsigned char *b32) { + int bits=0; + memset(b32, 0, 32); + while (bits < 256) { + uint32_t ent = secp256k1_rand32(); + int now = 1 + ((ent % 64)*((ent >> 6) % 32)+16)/31; + uint32_t val = 1 & (ent >> 11); + while (now > 0 && bits < 256) { + b32[bits / 8] |= val << (bits % 8); + now--; + bits++; + } + } +} + +#endif diff --git a/src/secp256k1/src/tests.c b/src/secp256k1/src/tests.c new file mode 100644 index 0000000000..5d9b8344d9 --- /dev/null +++ b/src/secp256k1/src/tests.c @@ -0,0 +1,1080 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> + +#include "secp256k1.c" +#include "testrand_impl.h" + +#ifdef ENABLE_OPENSSL_TESTS +#include "openssl/bn.h" +#include "openssl/ec.h" +#include "openssl/ecdsa.h" +#include "openssl/obj_mac.h" +#endif + +static int count = 64; + +/***** NUM TESTS *****/ + +void random_num_negate(secp256k1_num_t *num) { + if (secp256k1_rand32() & 1) + secp256k1_num_negate(num); +} + +void random_field_element_test(secp256k1_fe_t *fe) { + do { + unsigned char b32[32]; + secp256k1_rand256_test(b32); + secp256k1_num_t num; + secp256k1_num_set_bin(&num, b32, 32); + if (secp256k1_num_cmp(&num, &secp256k1_fe_consts->p) >= 0) + continue; + secp256k1_fe_set_b32(fe, b32); + break; + } while(1); +} + +void random_field_element_magnitude(secp256k1_fe_t *fe) { + secp256k1_fe_normalize(fe); + int n = secp256k1_rand32() % 4; + for (int i = 0; i < n; i++) { + secp256k1_fe_negate(fe, fe, 1 + 2*i); + secp256k1_fe_negate(fe, fe, 2 + 2*i); + } +} + +void random_group_element_test(secp256k1_ge_t *ge) { + secp256k1_fe_t fe; + do { + random_field_element_test(&fe); + if (secp256k1_ge_set_xo(ge, &fe, secp256k1_rand32() & 1)) + break; + } while(1); +} + +void random_group_element_jacobian_test(secp256k1_gej_t *gej, const secp256k1_ge_t *ge) { + do { + random_field_element_test(&gej->z); + if (!secp256k1_fe_is_zero(&gej->z)) { + break; + } + } while(1); + secp256k1_fe_t z2; secp256k1_fe_sqr(&z2, &gej->z); + secp256k1_fe_t z3; secp256k1_fe_mul(&z3, &z2, &gej->z); + secp256k1_fe_mul(&gej->x, &ge->x, &z2); + secp256k1_fe_mul(&gej->y, &ge->y, &z3); + gej->infinity = ge->infinity; +} + +void random_num_order_test(secp256k1_num_t *num) { + do { + unsigned char b32[32]; + secp256k1_rand256_test(b32); + secp256k1_num_set_bin(num, b32, 32); + if (secp256k1_num_is_zero(num)) + continue; + if (secp256k1_num_cmp(num, &secp256k1_ge_consts->order) >= 0) + continue; + break; + } while(1); +} + +void random_scalar_order_test(secp256k1_scalar_t *num) { + do { + unsigned char b32[32]; + secp256k1_rand256_test(b32); + int overflow = 0; + secp256k1_scalar_set_b32(num, b32, &overflow); + if (overflow || secp256k1_scalar_is_zero(num)) + continue; + break; + } while(1); +} + +void random_num_order(secp256k1_num_t *num) { + do { + unsigned char b32[32]; + secp256k1_rand256(b32); + secp256k1_num_set_bin(num, b32, 32); + if (secp256k1_num_is_zero(num)) + continue; + if (secp256k1_num_cmp(num, &secp256k1_ge_consts->order) >= 0) + continue; + break; + } while(1); +} + +void test_num_copy_inc_cmp(void) { + secp256k1_num_t n1,n2; + random_num_order(&n1); + secp256k1_num_copy(&n2, &n1); + CHECK(secp256k1_num_eq(&n1, &n2)); + CHECK(secp256k1_num_eq(&n2, &n1)); + secp256k1_num_inc(&n2); + CHECK(!secp256k1_num_eq(&n1, &n2)); + CHECK(!secp256k1_num_eq(&n2, &n1)); +} + + +void test_num_get_set_hex(void) { + secp256k1_num_t n1,n2; + random_num_order_test(&n1); + char c[64]; + secp256k1_num_get_hex(c, 64, &n1); + secp256k1_num_set_hex(&n2, c, 64); + CHECK(secp256k1_num_eq(&n1, &n2)); + for (int i=0; i<64; i++) { + /* check whether the lower 4 bits correspond to the last hex character */ + int low1 = secp256k1_num_shift(&n1, 4); + int lowh = c[63]; + int low2 = ((lowh>>6)*9+(lowh-'0'))&15; + CHECK(low1 == low2); + /* shift bits off the hex representation, and compare */ + memmove(c+1, c, 63); + c[0] = '0'; + secp256k1_num_set_hex(&n2, c, 64); + CHECK(secp256k1_num_eq(&n1, &n2)); + } +} + +void test_num_get_set_bin(void) { + secp256k1_num_t n1,n2; + random_num_order_test(&n1); + unsigned char c[32]; + secp256k1_num_get_bin(c, 32, &n1); + secp256k1_num_set_bin(&n2, c, 32); + CHECK(secp256k1_num_eq(&n1, &n2)); + for (int i=0; i<32; i++) { + /* check whether the lower 8 bits correspond to the last byte */ + int low1 = secp256k1_num_shift(&n1, 8); + int low2 = c[31]; + CHECK(low1 == low2); + /* shift bits off the byte representation, and compare */ + memmove(c+1, c, 31); + c[0] = 0; + secp256k1_num_set_bin(&n2, c, 32); + CHECK(secp256k1_num_eq(&n1, &n2)); + } +} + +void run_num_int(void) { + secp256k1_num_t n1; + for (int i=-255; i<256; i++) { + unsigned char c1[3] = {}; + c1[2] = abs(i); + unsigned char c2[3] = {0x11,0x22,0x33}; + secp256k1_num_set_int(&n1, i); + secp256k1_num_get_bin(c2, 3, &n1); + CHECK(memcmp(c1, c2, 3) == 0); + } +} + +void test_num_negate(void) { + secp256k1_num_t n1; + secp256k1_num_t n2; + random_num_order_test(&n1); /* n1 = R */ + random_num_negate(&n1); + secp256k1_num_copy(&n2, &n1); /* n2 = R */ + secp256k1_num_sub(&n1, &n2, &n1); /* n1 = n2-n1 = 0 */ + CHECK(secp256k1_num_is_zero(&n1)); + secp256k1_num_copy(&n1, &n2); /* n1 = R */ + secp256k1_num_negate(&n1); /* n1 = -R */ + CHECK(!secp256k1_num_is_zero(&n1)); + secp256k1_num_add(&n1, &n2, &n1); /* n1 = n2+n1 = 0 */ + CHECK(secp256k1_num_is_zero(&n1)); + secp256k1_num_copy(&n1, &n2); /* n1 = R */ + secp256k1_num_negate(&n1); /* n1 = -R */ + CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2)); + secp256k1_num_negate(&n1); /* n1 = R */ + CHECK(secp256k1_num_eq(&n1, &n2)); +} + +void test_num_add_sub(void) { + int r = secp256k1_rand32(); + secp256k1_num_t n1; + secp256k1_num_t n2; + random_num_order_test(&n1); /* n1 = R1 */ + if (r & 1) { + random_num_negate(&n1); + } + random_num_order_test(&n2); /* n2 = R2 */ + if (r & 2) { + random_num_negate(&n2); + } + secp256k1_num_t n1p2, n2p1, n1m2, n2m1; + secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */ + secp256k1_num_add(&n2p1, &n2, &n1); /* n2p1 = R2 + R1 */ + secp256k1_num_sub(&n1m2, &n1, &n2); /* n1m2 = R1 - R2 */ + secp256k1_num_sub(&n2m1, &n2, &n1); /* n2m1 = R2 - R1 */ + CHECK(secp256k1_num_eq(&n1p2, &n2p1)); + CHECK(!secp256k1_num_eq(&n1p2, &n1m2)); + secp256k1_num_negate(&n2m1); /* n2m1 = -R2 + R1 */ + CHECK(secp256k1_num_eq(&n2m1, &n1m2)); + CHECK(!secp256k1_num_eq(&n2m1, &n1)); + secp256k1_num_add(&n2m1, &n2m1, &n2); /* n2m1 = -R2 + R1 + R2 = R1 */ + CHECK(secp256k1_num_eq(&n2m1, &n1)); + CHECK(!secp256k1_num_eq(&n2p1, &n1)); + secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */ + CHECK(secp256k1_num_eq(&n2p1, &n1)); +} + +void run_num_smalltests(void) { + for (int i=0; i<100*count; i++) { + test_num_copy_inc_cmp(); + test_num_get_set_hex(); + test_num_get_set_bin(); + test_num_negate(); + test_num_add_sub(); + } + run_num_int(); +} + +/***** SCALAR TESTS *****/ + +int secp256k1_scalar_eq(const secp256k1_scalar_t *s1, const secp256k1_scalar_t *s2) { + secp256k1_scalar_t t; + secp256k1_scalar_negate(&t, s2); + secp256k1_scalar_add(&t, &t, s1); + int ret = secp256k1_scalar_is_zero(&t); + return ret; +} + +void scalar_test(void) { + unsigned char c[32]; + + /* Set 's' to a random scalar, with value 'snum'. */ + secp256k1_rand256_test(c); + secp256k1_scalar_t s; + secp256k1_scalar_set_b32(&s, c, NULL); + secp256k1_num_t snum; + secp256k1_num_set_bin(&snum, c, 32); + secp256k1_num_mod(&snum, &secp256k1_ge_consts->order); + + /* Set 's1' to a random scalar, with value 's1num'. */ + secp256k1_rand256_test(c); + secp256k1_scalar_t s1; + secp256k1_scalar_set_b32(&s1, c, NULL); + secp256k1_num_t s1num; + secp256k1_num_set_bin(&s1num, c, 32); + secp256k1_num_mod(&s1num, &secp256k1_ge_consts->order); + + /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */ + secp256k1_rand256_test(c); + secp256k1_scalar_t s2; + int overflow = 0; + secp256k1_scalar_set_b32(&s2, c, &overflow); + secp256k1_num_t s2num; + secp256k1_num_set_bin(&s2num, c, 32); + secp256k1_num_mod(&s2num, &secp256k1_ge_consts->order); + + { + /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */ + secp256k1_num_t n, t, m; + secp256k1_num_set_int(&n, 0); + secp256k1_num_set_int(&m, 16); + for (int i = 0; i < 256; i += 4) { + secp256k1_num_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4)); + secp256k1_num_mul(&n, &n, &m); + secp256k1_num_add(&n, &n, &t); + } + CHECK(secp256k1_num_eq(&n, &snum)); + } + + { + /* Test that get_b32 returns the same as get_bin on the number. */ + unsigned char r1[32]; + secp256k1_scalar_get_b32(r1, &s2); + unsigned char r2[32]; + secp256k1_num_get_bin(r2, 32, &s2num); + CHECK(memcmp(r1, r2, 32) == 0); + /* If no overflow occurred when assigning, it should also be equal to the original byte array. */ + CHECK((memcmp(r1, c, 32) == 0) == (overflow == 0)); + } + + { + /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ + secp256k1_num_t rnum; + secp256k1_num_add(&rnum, &snum, &s2num); + secp256k1_num_mod(&rnum, &secp256k1_ge_consts->order); + secp256k1_scalar_t r; + secp256k1_scalar_add(&r, &s, &s2); + secp256k1_num_t r2num; + secp256k1_scalar_get_num(&r2num, &r); + CHECK(secp256k1_num_eq(&rnum, &r2num)); + } + + { + /* Test that multipying the scalars is equal to multiplying their numbers modulo the order. */ + secp256k1_num_t rnum; + secp256k1_num_mul(&rnum, &snum, &s2num); + secp256k1_num_mod(&rnum, &secp256k1_ge_consts->order); + secp256k1_scalar_t r; + secp256k1_scalar_mul(&r, &s, &s2); + secp256k1_num_t r2num; + secp256k1_scalar_get_num(&r2num, &r); + CHECK(secp256k1_num_eq(&rnum, &r2num)); + /* The result can only be zero if at least one of the factors was zero. */ + CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2))); + /* The results can only be equal to one of the factors if that factor was zero, or the other factor was one. */ + CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2))); + CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s))); + } + + { + /* Check that comparison with zero matches comparison with zero on the number. */ + CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s)); + /* Check that comparison with the half order is equal to testing for high scalar. */ + CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &secp256k1_ge_consts->half_order) > 0)); + secp256k1_scalar_t neg; + secp256k1_scalar_negate(&neg, &s); + secp256k1_num_t negnum; + secp256k1_num_sub(&negnum, &secp256k1_ge_consts->order, &snum); + secp256k1_num_mod(&negnum, &secp256k1_ge_consts->order); + /* Check that comparison with the half order is equal to testing for high scalar after negation. */ + CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &secp256k1_ge_consts->half_order) > 0)); + /* Negating should change the high property, unless the value was already zero. */ + CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s)); + secp256k1_num_t negnum2; + secp256k1_scalar_get_num(&negnum2, &neg); + /* Negating a scalar should be equal to (order - n) mod order on the number. */ + CHECK(secp256k1_num_eq(&negnum, &negnum2)); + secp256k1_scalar_add(&neg, &neg, &s); + /* Adding a number to its negation should result in zero. */ + CHECK(secp256k1_scalar_is_zero(&neg)); + secp256k1_scalar_negate(&neg, &neg); + /* Negating zero should still result in zero. */ + CHECK(secp256k1_scalar_is_zero(&neg)); + } + + { + /* Test that scalar inverses are equal to the inverse of their number modulo the order. */ + if (!secp256k1_scalar_is_zero(&s)) { + secp256k1_scalar_t inv; + secp256k1_scalar_inverse(&inv, &s); + secp256k1_num_t invnum; + secp256k1_num_mod_inverse(&invnum, &snum, &secp256k1_ge_consts->order); + secp256k1_num_t invnum2; + secp256k1_scalar_get_num(&invnum2, &inv); + CHECK(secp256k1_num_eq(&invnum, &invnum2)); + secp256k1_scalar_mul(&inv, &inv, &s); + /* Multiplying a scalar with its inverse must result in one. */ + CHECK(secp256k1_scalar_is_one(&inv)); + secp256k1_scalar_inverse(&inv, &inv); + /* Inverting one must result in one. */ + CHECK(secp256k1_scalar_is_one(&inv)); + } + } + + { + /* Test commutativity of add. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_add(&r2, &s2, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test commutativity of mul. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_mul(&r1, &s1, &s2); + secp256k1_scalar_mul(&r2, &s2, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test associativity of add. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_add(&r1, &r1, &s); + secp256k1_scalar_add(&r2, &s2, &s); + secp256k1_scalar_add(&r2, &s1, &r2); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test associativity of mul. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_mul(&r1, &s1, &s2); + secp256k1_scalar_mul(&r1, &r1, &s); + secp256k1_scalar_mul(&r2, &s2, &s); + secp256k1_scalar_mul(&r2, &s1, &r2); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test distributitivity of mul over add. */ + secp256k1_scalar_t r1, r2, t; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_mul(&r1, &r1, &s); + secp256k1_scalar_mul(&r2, &s1, &s); + secp256k1_scalar_mul(&t, &s2, &s); + secp256k1_scalar_add(&r2, &r2, &t); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test square. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_sqr(&r1, &s1); + secp256k1_scalar_mul(&r2, &s1, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } +} + +void run_scalar_tests(void) { + for (int i = 0; i < 128 * count; i++) { + scalar_test(); + } +} + +/***** FIELD TESTS *****/ + +void random_fe(secp256k1_fe_t *x) { + unsigned char bin[32]; + secp256k1_rand256(bin); + secp256k1_fe_set_b32(x, bin); +} + +void random_fe_non_zero(secp256k1_fe_t *nz) { + int tries = 10; + while (--tries >= 0) { + random_fe(nz); + secp256k1_fe_normalize(nz); + if (!secp256k1_fe_is_zero(nz)) + break; + } + /* Infinitesimal probability of spurious failure here */ + CHECK(tries >= 0); +} + +void random_fe_non_square(secp256k1_fe_t *ns) { + random_fe_non_zero(ns); + secp256k1_fe_t r; + if (secp256k1_fe_sqrt(&r, ns)) { + secp256k1_fe_negate(ns, ns, 1); + } +} + +int check_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + secp256k1_fe_t an = *a; secp256k1_fe_normalize(&an); + secp256k1_fe_t bn = *b; secp256k1_fe_normalize(&bn); + return secp256k1_fe_equal(&an, &bn); +} + +int check_fe_inverse(const secp256k1_fe_t *a, const secp256k1_fe_t *ai) { + secp256k1_fe_t x; secp256k1_fe_mul(&x, a, ai); + secp256k1_fe_t one; secp256k1_fe_set_int(&one, 1); + return check_fe_equal(&x, &one); +} + +void run_field_inv(void) { + secp256k1_fe_t x, xi, xii; + for (int i=0; i<10*count; i++) { + random_fe_non_zero(&x); + secp256k1_fe_inv(&xi, &x); + CHECK(check_fe_inverse(&x, &xi)); + secp256k1_fe_inv(&xii, &xi); + CHECK(check_fe_equal(&x, &xii)); + } +} + +void run_field_inv_var(void) { + secp256k1_fe_t x, xi, xii; + for (int i=0; i<10*count; i++) { + random_fe_non_zero(&x); + secp256k1_fe_inv_var(&xi, &x); + CHECK(check_fe_inverse(&x, &xi)); + secp256k1_fe_inv_var(&xii, &xi); + CHECK(check_fe_equal(&x, &xii)); + } +} + +void run_field_inv_all(void) { + secp256k1_fe_t x[16], xi[16], xii[16]; + /* Check it's safe to call for 0 elements */ + secp256k1_fe_inv_all(0, xi, x); + for (int i=0; i<count; i++) { + size_t len = (secp256k1_rand32() & 15) + 1; + for (size_t j=0; j<len; j++) + random_fe_non_zero(&x[j]); + secp256k1_fe_inv_all(len, xi, x); + for (size_t j=0; j<len; j++) + CHECK(check_fe_inverse(&x[j], &xi[j])); + secp256k1_fe_inv_all(len, xii, xi); + for (size_t j=0; j<len; j++) + CHECK(check_fe_equal(&x[j], &xii[j])); + } +} + +void run_field_inv_all_var(void) { + secp256k1_fe_t x[16], xi[16], xii[16]; + /* Check it's safe to call for 0 elements */ + secp256k1_fe_inv_all_var(0, xi, x); + for (int i=0; i<count; i++) { + size_t len = (secp256k1_rand32() & 15) + 1; + for (size_t j=0; j<len; j++) + random_fe_non_zero(&x[j]); + secp256k1_fe_inv_all_var(len, xi, x); + for (size_t j=0; j<len; j++) + CHECK(check_fe_inverse(&x[j], &xi[j])); + secp256k1_fe_inv_all_var(len, xii, xi); + for (size_t j=0; j<len; j++) + CHECK(check_fe_equal(&x[j], &xii[j])); + } +} + +void run_sqr(void) { + secp256k1_fe_t x, s; + + { + secp256k1_fe_set_int(&x, 1); + secp256k1_fe_negate(&x, &x, 1); + + for (int i=1; i<=512; ++i) { + secp256k1_fe_mul_int(&x, 2); + secp256k1_fe_normalize(&x); + secp256k1_fe_sqr(&s, &x); + } + } +} + +void test_sqrt(const secp256k1_fe_t *a, const secp256k1_fe_t *k) { + secp256k1_fe_t r1, r2; + int v = secp256k1_fe_sqrt(&r1, a); + CHECK((v == 0) == (k == NULL)); + + if (k != NULL) { + /* Check that the returned root is +/- the given known answer */ + secp256k1_fe_negate(&r2, &r1, 1); + secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k); + secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2); + CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2)); + } +} + +void run_sqrt(void) { + secp256k1_fe_t ns, x, s, t; + + /* Check sqrt(0) is 0 */ + secp256k1_fe_set_int(&x, 0); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + + /* Check sqrt of small squares (and their negatives) */ + for (int i=1; i<=100; i++) { + secp256k1_fe_set_int(&x, i); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + secp256k1_fe_negate(&t, &s, 1); + test_sqrt(&t, NULL); + } + + /* Consistency checks for large random values */ + for (int i=0; i<10; i++) { + random_fe_non_square(&ns); + for (int j=0; j<count; j++) { + random_fe(&x); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + secp256k1_fe_negate(&t, &s, 1); + test_sqrt(&t, NULL); + secp256k1_fe_mul(&t, &s, &ns); + test_sqrt(&t, NULL); + } + } +} + +/***** GROUP TESTS *****/ + +int ge_equals_ge(const secp256k1_ge_t *a, const secp256k1_ge_t *b) { + if (a->infinity && b->infinity) + return 1; + return check_fe_equal(&a->x, &b->x) && check_fe_equal(&a->y, &b->y); +} + +void ge_equals_gej(const secp256k1_ge_t *a, const secp256k1_gej_t *b) { + secp256k1_ge_t bb; + secp256k1_gej_t bj = *b; + secp256k1_ge_set_gej_var(&bb, &bj); + CHECK(ge_equals_ge(a, &bb)); +} + +void gej_equals_gej(const secp256k1_gej_t *a, const secp256k1_gej_t *b) { + secp256k1_ge_t aa, bb; + secp256k1_gej_t aj = *a, bj = *b; + secp256k1_ge_set_gej_var(&aa, &aj); + secp256k1_ge_set_gej_var(&bb, &bj); + CHECK(ge_equals_ge(&aa, &bb)); +} + +void test_ge(void) { + secp256k1_ge_t a, b, i, n; + random_group_element_test(&a); + random_group_element_test(&b); + n = a; + secp256k1_fe_normalize(&a.y); + secp256k1_fe_negate(&n.y, &a.y, 1); + secp256k1_ge_set_infinity(&i); + random_field_element_magnitude(&a.x); + random_field_element_magnitude(&a.y); + random_field_element_magnitude(&b.x); + random_field_element_magnitude(&b.y); + random_field_element_magnitude(&n.x); + random_field_element_magnitude(&n.y); + + secp256k1_gej_t aj, bj, ij, nj; + random_group_element_jacobian_test(&aj, &a); + random_group_element_jacobian_test(&bj, &b); + secp256k1_gej_set_infinity(&ij); + random_group_element_jacobian_test(&nj, &n); + random_field_element_magnitude(&aj.x); + random_field_element_magnitude(&aj.y); + random_field_element_magnitude(&aj.z); + random_field_element_magnitude(&bj.x); + random_field_element_magnitude(&bj.y); + random_field_element_magnitude(&bj.z); + random_field_element_magnitude(&nj.x); + random_field_element_magnitude(&nj.y); + random_field_element_magnitude(&nj.z); + + /* gej + gej adds */ + secp256k1_gej_t aaj; secp256k1_gej_add_var(&aaj, &aj, &aj); + secp256k1_gej_t abj; secp256k1_gej_add_var(&abj, &aj, &bj); + secp256k1_gej_t aij; secp256k1_gej_add_var(&aij, &aj, &ij); + secp256k1_gej_t anj; secp256k1_gej_add_var(&anj, &aj, &nj); + secp256k1_gej_t iaj; secp256k1_gej_add_var(&iaj, &ij, &aj); + secp256k1_gej_t iij; secp256k1_gej_add_var(&iij, &ij, &ij); + + /* gej + ge adds */ + secp256k1_gej_t aa; secp256k1_gej_add_ge_var(&aa, &aj, &a); + secp256k1_gej_t ab; secp256k1_gej_add_ge_var(&ab, &aj, &b); + secp256k1_gej_t ai; secp256k1_gej_add_ge_var(&ai, &aj, &i); + secp256k1_gej_t an; secp256k1_gej_add_ge_var(&an, &aj, &n); + secp256k1_gej_t ia; secp256k1_gej_add_ge_var(&ia, &ij, &a); + secp256k1_gej_t ii; secp256k1_gej_add_ge_var(&ii, &ij, &i); + + /* const gej + ge adds */ + secp256k1_gej_t aac; secp256k1_gej_add_ge(&aac, &aj, &a); + secp256k1_gej_t abc; secp256k1_gej_add_ge(&abc, &aj, &b); + secp256k1_gej_t anc; secp256k1_gej_add_ge(&anc, &aj, &n); + secp256k1_gej_t iac; secp256k1_gej_add_ge(&iac, &ij, &a); + + CHECK(secp256k1_gej_is_infinity(&an)); + CHECK(secp256k1_gej_is_infinity(&anj)); + CHECK(secp256k1_gej_is_infinity(&anc)); + gej_equals_gej(&aa, &aaj); + gej_equals_gej(&aa, &aac); + gej_equals_gej(&ab, &abj); + gej_equals_gej(&ab, &abc); + gej_equals_gej(&an, &anj); + gej_equals_gej(&an, &anc); + gej_equals_gej(&ia, &iaj); + gej_equals_gej(&ai, &aij); + gej_equals_gej(&ii, &iij); + ge_equals_gej(&a, &ai); + ge_equals_gej(&a, &ai); + ge_equals_gej(&a, &iaj); + ge_equals_gej(&a, &iaj); + ge_equals_gej(&a, &iac); +} + +void run_ge(void) { + for (int i = 0; i < 2000*count; i++) { + test_ge(); + } +} + +/***** ECMULT TESTS *****/ + +void run_ecmult_chain(void) { + /* random starting point A (on the curve) */ + secp256k1_fe_t ax; secp256k1_fe_set_hex(&ax, "8b30bbe9ae2a990696b22f670709dff3727fd8bc04d3362c6c7bf458e2846004", 64); + secp256k1_fe_t ay; secp256k1_fe_set_hex(&ay, "a357ae915c4a65281309edf20504740f0eb3343990216b4f81063cb65f2f7e0f", 64); + secp256k1_gej_t a; secp256k1_gej_set_xy(&a, &ax, &ay); + /* two random initial factors xn and gn */ + secp256k1_num_t xn; + secp256k1_num_set_hex(&xn, "84cc5452f7fde1edb4d38a8ce9b1b84ccef31f146e569be9705d357a42985407", 64); + secp256k1_num_t gn; + secp256k1_num_set_hex(&gn, "a1e58d22553dcd42b23980625d4c57a96e9323d42b3152e5ca2c3990edc7c9de", 64); + /* two small multipliers to be applied to xn and gn in every iteration: */ + secp256k1_num_t xf; + secp256k1_num_set_hex(&xf, "1337", 4); + secp256k1_num_t gf; + secp256k1_num_set_hex(&gf, "7113", 4); + /* accumulators with the resulting coefficients to A and G */ + secp256k1_num_t ae; + secp256k1_num_set_int(&ae, 1); + secp256k1_num_t ge; + secp256k1_num_set_int(&ge, 0); + /* the point being computed */ + secp256k1_gej_t x = a; + const secp256k1_num_t *order = &secp256k1_ge_consts->order; + for (int i=0; i<200*count; i++) { + /* in each iteration, compute X = xn*X + gn*G; */ + secp256k1_ecmult(&x, &x, &xn, &gn); + /* also compute ae and ge: the actual accumulated factors for A and G */ + /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */ + secp256k1_num_mod_mul(&ae, &ae, &xn, order); + secp256k1_num_mod_mul(&ge, &ge, &xn, order); + secp256k1_num_add(&ge, &ge, &gn); + secp256k1_num_mod(&ge, order); + /* modify xn and gn */ + secp256k1_num_mod_mul(&xn, &xn, &xf, order); + secp256k1_num_mod_mul(&gn, &gn, &gf, order); + + /* verify */ + if (i == 19999) { + char res[132]; int resl = 132; + secp256k1_gej_get_hex(res, &resl, &x); + CHECK(strcmp(res, "(D6E96687F9B10D092A6F35439D86CEBEA4535D0D409F53586440BD74B933E830,B95CBCA2C77DA786539BE8FD53354D2D3B4F566AE658045407ED6015EE1B2A88)") == 0); + } + } + /* redo the computation, but directly with the resulting ae and ge coefficients: */ + secp256k1_gej_t x2; secp256k1_ecmult(&x2, &a, &ae, &ge); + char res[132]; int resl = 132; + char res2[132]; int resl2 = 132; + secp256k1_gej_get_hex(res, &resl, &x); + secp256k1_gej_get_hex(res2, &resl2, &x2); + CHECK(strcmp(res, res2) == 0); + CHECK(strlen(res) == 131); +} + +void test_point_times_order(const secp256k1_gej_t *point) { + /* multiplying a point by the order results in O */ + const secp256k1_num_t *order = &secp256k1_ge_consts->order; + secp256k1_num_t zero; + secp256k1_num_set_int(&zero, 0); + secp256k1_gej_t res; + secp256k1_ecmult(&res, point, order, order); /* calc res = order * point + order * G; */ + CHECK(secp256k1_gej_is_infinity(&res)); +} + +void run_point_times_order(void) { + secp256k1_fe_t x; secp256k1_fe_set_hex(&x, "02", 2); + for (int i=0; i<500; i++) { + secp256k1_ge_t p; + if (secp256k1_ge_set_xo(&p, &x, 1)) { + CHECK(secp256k1_ge_is_valid(&p)); + secp256k1_gej_t j; + secp256k1_gej_set_ge(&j, &p); + CHECK(secp256k1_gej_is_valid(&j)); + test_point_times_order(&j); + } + secp256k1_fe_sqr(&x, &x); + } + char c[65]; int cl=65; + secp256k1_fe_get_hex(c, &cl, &x); + CHECK(strcmp(c, "7603CB59B0EF6C63FE6084792A0C378CDB3233A80F8A9A09A877DEAD31B38C45") == 0); +} + +void test_wnaf(const secp256k1_num_t *number, int w) { + secp256k1_num_t x, two, t; + secp256k1_num_set_int(&x, 0); + secp256k1_num_set_int(&two, 2); + int wnaf[257]; + int bits = secp256k1_ecmult_wnaf(wnaf, number, w); + int zeroes = -1; + for (int i=bits-1; i>=0; i--) { + secp256k1_num_mul(&x, &x, &two); + int v = wnaf[i]; + if (v) { + CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */ + zeroes=0; + CHECK((v & 1) == 1); /* check non-zero elements are odd */ + CHECK(v <= (1 << (w-1)) - 1); /* check range below */ + CHECK(v >= -(1 << (w-1)) - 1); /* check range above */ + } else { + CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */ + zeroes++; + } + secp256k1_num_set_int(&t, v); + secp256k1_num_add(&x, &x, &t); + } + CHECK(secp256k1_num_eq(&x, number)); /* check that wnaf represents number */ +} + +void run_wnaf(void) { + secp256k1_num_t n; + for (int i=0; i<count; i++) { + random_num_order(&n); + if (i % 1) + secp256k1_num_negate(&n); + test_wnaf(&n, 4+(i%10)); + } +} + +void random_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *key, const secp256k1_scalar_t *msg, int *recid) { + secp256k1_scalar_t nonce; + do { + random_scalar_order_test(&nonce); + } while(!secp256k1_ecdsa_sig_sign(sig, key, msg, &nonce, recid)); +} + +void test_ecdsa_sign_verify(void) { + secp256k1_scalar_t msg, key; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_gej_t pubj; secp256k1_ecmult_gen(&pubj, &key); + secp256k1_ge_t pub; secp256k1_ge_set_gej(&pub, &pubj); + secp256k1_ecdsa_sig_t sig; + random_sign(&sig, &key, &msg, NULL); + secp256k1_num_t msg_num; + secp256k1_scalar_get_num(&msg_num, &msg); + CHECK(secp256k1_ecdsa_sig_verify(&sig, &pub, &msg_num)); + secp256k1_num_inc(&msg_num); + CHECK(!secp256k1_ecdsa_sig_verify(&sig, &pub, &msg_num)); +} + +void run_ecdsa_sign_verify(void) { + for (int i=0; i<10*count; i++) { + test_ecdsa_sign_verify(); + } +} + +void test_ecdsa_end_to_end(void) { + unsigned char privkey[32]; + unsigned char message[32]; + + /* Generate a random key and message. */ + { + secp256k1_num_t msg, key; + random_num_order_test(&msg); + random_num_order_test(&key); + secp256k1_num_get_bin(privkey, 32, &key); + secp256k1_num_get_bin(message, 32, &msg); + } + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(privkey) == 1); + unsigned char pubkey[65]; int pubkeylen = 65; + CHECK(secp256k1_ec_pubkey_create(pubkey, &pubkeylen, privkey, secp256k1_rand32() % 2) == 1); + CHECK(secp256k1_ec_pubkey_verify(pubkey, pubkeylen)); + + /* Verify private key import and export. */ + unsigned char seckey[300]; int seckeylen = 300; + CHECK(secp256k1_ec_privkey_export(privkey, seckey, &seckeylen, secp256k1_rand32() % 2) == 1); + unsigned char privkey2[32]; + CHECK(secp256k1_ec_privkey_import(privkey2, seckey, seckeylen) == 1); + CHECK(memcmp(privkey, privkey2, 32) == 0); + + /* Optionally tweak the keys using addition. */ + if (secp256k1_rand32() % 3 == 0) { + unsigned char rnd[32]; + secp256k1_rand256_test(rnd); + int ret1 = secp256k1_ec_privkey_tweak_add(privkey, rnd); + int ret2 = secp256k1_ec_pubkey_tweak_add(pubkey, pubkeylen, rnd); + CHECK(ret1 == ret2); + if (ret1 == 0) return; + unsigned char pubkey2[65]; int pubkeylen2 = 65; + CHECK(secp256k1_ec_pubkey_create(pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); + CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + } + + /* Optionally tweak the keys using multiplication. */ + if (secp256k1_rand32() % 3 == 0) { + unsigned char rnd[32]; + secp256k1_rand256_test(rnd); + int ret1 = secp256k1_ec_privkey_tweak_mul(privkey, rnd); + int ret2 = secp256k1_ec_pubkey_tweak_mul(pubkey, pubkeylen, rnd); + CHECK(ret1 == ret2); + if (ret1 == 0) return; + unsigned char pubkey2[65]; int pubkeylen2 = 65; + CHECK(secp256k1_ec_pubkey_create(pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); + CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + } + + /* Sign. */ + unsigned char signature[72]; int signaturelen = 72; + while(1) { + unsigned char rnd[32]; + secp256k1_rand256_test(rnd); + if (secp256k1_ecdsa_sign(message, 32, signature, &signaturelen, privkey, rnd) == 1) { + break; + } + } + /* Verify. */ + CHECK(secp256k1_ecdsa_verify(message, 32, signature, signaturelen, pubkey, pubkeylen) == 1); + /* Destroy signature and verify again. */ + signature[signaturelen - 1 - secp256k1_rand32() % 20] += 1 + (secp256k1_rand32() % 255); + CHECK(secp256k1_ecdsa_verify(message, 32, signature, signaturelen, pubkey, pubkeylen) != 1); + + /* Compact sign. */ + unsigned char csignature[64]; int recid = 0; + while(1) { + unsigned char rnd[32]; + secp256k1_rand256_test(rnd); + if (secp256k1_ecdsa_sign_compact(message, 32, csignature, privkey, rnd, &recid) == 1) { + break; + } + } + /* Recover. */ + unsigned char recpubkey[65]; int recpubkeylen = 0; + CHECK(secp256k1_ecdsa_recover_compact(message, 32, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) == 1); + CHECK(recpubkeylen == pubkeylen); + CHECK(memcmp(pubkey, recpubkey, pubkeylen) == 0); + /* Destroy signature and verify again. */ + csignature[secp256k1_rand32() % 64] += 1 + (secp256k1_rand32() % 255); + CHECK(secp256k1_ecdsa_recover_compact(message, 32, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) != 1 || + memcmp(pubkey, recpubkey, pubkeylen) != 0); + CHECK(recpubkeylen == pubkeylen); + +} + +void run_ecdsa_end_to_end(void) { + for (int i=0; i<64*count; i++) { + test_ecdsa_end_to_end(); + } +} + +void test_ecdsa_infinity(void) { + const unsigned char msg32[32] = { + 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', + 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', + 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', + 's', 's', 'a', 'g', 'e', '.', '.', '.' + }; + const unsigned char sig64[64] = { + // Generated by signing the above message with nonce 'This is the nonce we will use...' + // and secret key 0 (which is not valid), resulting in recid 0. + 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, + 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, + 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, + 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, + 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, + 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, + 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, + 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 + }; + unsigned char pubkey[65]; + int pubkeylen = 65; + CHECK(!secp256k1_ecdsa_recover_compact(msg32, 32, sig64, pubkey, &pubkeylen, 0, 0)); + CHECK(secp256k1_ecdsa_recover_compact(msg32, 32, sig64, pubkey, &pubkeylen, 0, 1)); + CHECK(!secp256k1_ecdsa_recover_compact(msg32, 32, sig64, pubkey, &pubkeylen, 0, 2)); + CHECK(!secp256k1_ecdsa_recover_compact(msg32, 32, sig64, pubkey, &pubkeylen, 0, 3)); +} + +void run_ecdsa_infinity(void) { + test_ecdsa_infinity(); +} + +#ifdef ENABLE_OPENSSL_TESTS +EC_KEY *get_openssl_key(const secp256k1_scalar_t *key) { + unsigned char privkey[300]; + int privkeylen; + int compr = secp256k1_rand32() & 1; + const unsigned char* pbegin = privkey; + EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); + CHECK(secp256k1_eckey_privkey_serialize(privkey, &privkeylen, key, compr)); + CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen)); + CHECK(EC_KEY_check_key(ec_key)); + return ec_key; +} + +void test_ecdsa_openssl(void) { + secp256k1_scalar_t key, msg; + unsigned char message[32]; + secp256k1_rand256_test(message); + secp256k1_scalar_set_b32(&msg, message, NULL); + random_scalar_order_test(&key); + secp256k1_gej_t qj; + secp256k1_ecmult_gen(&qj, &key); + secp256k1_ge_t q; + secp256k1_ge_set_gej(&q, &qj); + EC_KEY *ec_key = get_openssl_key(&key); + CHECK(ec_key); + unsigned char signature[80]; + unsigned int sigsize = 80; + CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key)); + secp256k1_ecdsa_sig_t sig; + CHECK(secp256k1_ecdsa_sig_parse(&sig, signature, sigsize)); + secp256k1_num_t msg_num; + secp256k1_scalar_get_num(&msg_num, &msg); + CHECK(secp256k1_ecdsa_sig_verify(&sig, &q, &msg_num)); + secp256k1_num_inc(&sig.r); + CHECK(!secp256k1_ecdsa_sig_verify(&sig, &q, &msg_num)); + + random_sign(&sig, &key, &msg, NULL); + int secp_sigsize = 80; + CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sig)); + CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1); + + EC_KEY_free(ec_key); +} + +void run_ecdsa_openssl(void) { + for (int i=0; i<10*count; i++) { + test_ecdsa_openssl(); + } +} +#endif + +int main(int argc, char **argv) { + /* find iteration count */ + if (argc > 1) { + count = strtol(argv[1], NULL, 0); + } + + /* find random seed */ + uint64_t seed; + if (argc > 2) { + seed = strtoull(argv[2], NULL, 0); + } else { + FILE *frand = fopen("/dev/urandom", "r"); + if (!frand || !fread(&seed, sizeof(seed), 1, frand)) { + seed = time(NULL) * 1337; + } + fclose(frand); + } + secp256k1_rand_seed(seed); + + printf("test count = %i\n", count); + printf("random seed = %llu\n", (unsigned long long)seed); + + /* initialize */ + secp256k1_start(SECP256K1_START_SIGN | SECP256K1_START_VERIFY); + + /* num tests */ + run_num_smalltests(); + + /* scalar tests */ + run_scalar_tests(); + + /* field tests */ + run_field_inv(); + run_field_inv_var(); + run_field_inv_all(); + run_field_inv_all_var(); + run_sqr(); + run_sqrt(); + + /* group tests */ + run_ge(); + + /* ecmult tests */ + run_wnaf(); + run_point_times_order(); + run_ecmult_chain(); + + /* ecdsa tests */ + run_ecdsa_sign_verify(); + run_ecdsa_end_to_end(); + run_ecdsa_infinity(); +#ifdef ENABLE_OPENSSL_TESTS + run_ecdsa_openssl(); +#endif + + printf("random run = %llu\n", (unsigned long long)secp256k1_rand32() + ((unsigned long long)secp256k1_rand32() << 32)); + + /* shutdown */ + secp256k1_stop(); + return 0; +} diff --git a/src/secp256k1/src/util.h b/src/secp256k1/src/util.h new file mode 100644 index 0000000000..96b47057c0 --- /dev/null +++ b/src/secp256k1/src/util.h @@ -0,0 +1,64 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_UTIL_H_ +#define _SECP256K1_UTIL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include <stdlib.h> +#include <stdint.h> +#include <stdio.h> + +#ifdef DETERMINISTIC +#define TEST_FAILURE(msg) do { \ + fprintf(stderr, "%s\n", msg); \ + abort(); \ +} while(0); +#else +#define TEST_FAILURE(msg) do { \ + fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ + abort(); \ +} while(0) +#endif + +#ifndef HAVE_BUILTIN_EXPECT +#define EXPECT(x,c) __builtin_expect((x),(c)) +#else +#define EXPECT(x,c) (x) +#endif + +#ifdef DETERMINISTIC +#define CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + TEST_FAILURE("test condition failed"); \ + } \ +} while(0) +#else +#define CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + TEST_FAILURE("test condition failed: " #cond); \ + } \ +} while(0) +#endif + +/* Like assert(), but safe to use on expressions with side effects. */ +#ifndef NDEBUG +#define DEBUG_CHECK CHECK +#else +#define DEBUG_CHECK(cond) do { (void)(cond); } while(0) +#endif + +/* Like DEBUG_CHECK(), but when VERIFY is defined instead of NDEBUG not defined. */ +#ifdef VERIFY +#define VERIFY_CHECK CHECK +#else +#define VERIFY_CHECK(cond) do { (void)(cond); } while(0) +#endif + +#endif diff --git a/src/serialize.h b/src/serialize.h index 877ef8640a..ad38a3fa22 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_SERIALIZE_H @@ -22,23 +22,28 @@ class CScript; static const unsigned int MAX_SIZE = 0x02000000; -// Used to bypass the rule against non-const reference to temporary -// where it makes sense with wrappers such as CFlatData or CTxDB +/** + * Used to bypass the rule against non-const reference to temporary + * where it makes sense with wrappers such as CFlatData or CTxDB + */ template<typename T> inline T& REF(const T& val) { return const_cast<T&>(val); } -// Used to acquire a non-const pointer "this" to generate bodies -// of const serialization operations from a template +/** + * Used to acquire a non-const pointer "this" to generate bodies + * of const serialization operations from a template + */ template<typename T> inline T* NCONST_PTR(const T* val) { return const_cast<T*>(val); } -/** Get begin pointer of vector (non-const version). +/** + * Get begin pointer of vector (non-const version). * @note These functions avoid the undefined case of indexing into an empty * vector, as well as that of indexing after the end of the vector. */ @@ -82,10 +87,12 @@ enum #define READWRITE(obj) (::SerReadWrite(s, (obj), nType, nVersion, ser_action)) -/* Implement three methods for serializable objects. These are actually wrappers over +/** + * Implement three methods for serializable objects. These are actually wrappers over * "SerializationOp" template, which implements the body of each class' serialization * code. Adding "ADD_SERIALIZE_METHODS" in the body of the class causes these wrappers to be - * added as members. */ + * added as members. + */ #define ADD_SERIALIZE_METHODS \ size_t GetSerializeSize(int nType, int nVersion) const { \ CSizeComputer s(nType, nVersion); \ @@ -103,9 +110,9 @@ enum -// -// Basic types -// +/* + * Basic Types + */ #define WRITEDATA(s, obj) s.write((char*)&(obj), sizeof(obj)) #define READDATA(s, obj) s.read((char*)&(obj), sizeof(obj)) @@ -160,13 +167,13 @@ template<typename Stream> inline void Unserialize(Stream& s, bool& a, int, int=0 -// -// Compact size -// size < 253 -- 1 byte -// size <= USHRT_MAX -- 3 bytes (253 + 2 bytes) -// size <= UINT_MAX -- 5 bytes (254 + 4 bytes) -// size > UINT_MAX -- 9 bytes (255 + 8 bytes) -// +/** + * Compact Size + * size < 253 -- 1 byte + * size <= USHRT_MAX -- 3 bytes (253 + 2 bytes) + * size <= UINT_MAX -- 5 bytes (254 + 4 bytes) + * size > UINT_MAX -- 9 bytes (255 + 8 bytes) + */ inline unsigned int GetSizeOfCompactSize(uint64_t nSize) { if (nSize < 253) return sizeof(unsigned char); @@ -246,27 +253,29 @@ uint64_t ReadCompactSize(Stream& is) return nSizeRet; } -// Variable-length integers: bytes are a MSB base-128 encoding of the number. -// The high bit in each byte signifies whether another digit follows. To make -// the encoding is one-to-one, one is subtracted from all but the last digit. -// Thus, the byte sequence a[] with length len, where all but the last byte -// has bit 128 set, encodes the number: -// -// (a[len-1] & 0x7F) + sum(i=1..len-1, 128^i*((a[len-i-1] & 0x7F)+1)) -// -// Properties: -// * Very small (0-127: 1 byte, 128-16511: 2 bytes, 16512-2113663: 3 bytes) -// * Every integer has exactly one encoding -// * Encoding does not depend on size of original integer type -// * No redundancy: every (infinite) byte sequence corresponds to a list -// of encoded integers. -// -// 0: [0x00] 256: [0x81 0x00] -// 1: [0x01] 16383: [0xFE 0x7F] -// 127: [0x7F] 16384: [0xFF 0x00] -// 128: [0x80 0x00] 16511: [0x80 0xFF 0x7F] -// 255: [0x80 0x7F] 65535: [0x82 0xFD 0x7F] -// 2^32: [0x8E 0xFE 0xFE 0xFF 0x00] +/** + * Variable-length integers: bytes are a MSB base-128 encoding of the number. + * The high bit in each byte signifies whether another digit follows. To make + * sure the encoding is one-to-one, one is subtracted from all but the last digit. + * Thus, the byte sequence a[] with length len, where all but the last byte + * has bit 128 set, encodes the number: + * + * (a[len-1] & 0x7F) + sum(i=1..len-1, 128^i*((a[len-i-1] & 0x7F)+1)) + * + * Properties: + * * Very small (0-127: 1 byte, 128-16511: 2 bytes, 16512-2113663: 3 bytes) + * * Every integer has exactly one encoding + * * Encoding does not depend on size of original integer type + * * No redundancy: every (infinite) byte sequence corresponds to a list + * of encoded integers. + * + * 0: [0x00] 256: [0x81 0x00] + * 1: [0x01] 16383: [0xFE 0x7F] + * 127: [0x7F] 16384: [0xFF 0x00] + * 128: [0x80 0x00] 16511: [0x80 0xFF 0x7F] + * 255: [0x80 0x7F] 65535: [0x82 0xFD 0x7F] + * 2^32: [0x8E 0xFE 0xFE 0xFF 0x00] + */ template<typename I> inline unsigned int GetSizeOfVarInt(I n) @@ -317,7 +326,8 @@ I ReadVarInt(Stream& is) #define VARINT(obj) REF(WrapVarInt(REF(obj))) #define LIMITED_STRING(obj,n) REF(LimitedString< n >(REF(obj))) -/** Wrapper for serializing arrays and POD. +/** + * Wrapper for serializing arrays and POD. */ class CFlatData { @@ -415,17 +425,21 @@ public: template<typename I> CVarInt<I> WrapVarInt(I& n) { return CVarInt<I>(n); } -// -// Forward declarations -// +/** + * Forward declarations + */ -// string +/** + * string + */ template<typename C> unsigned int GetSerializeSize(const std::basic_string<C>& str, int, int=0); template<typename Stream, typename C> void Serialize(Stream& os, const std::basic_string<C>& str, int, int=0); template<typename Stream, typename C> void Unserialize(Stream& is, std::basic_string<C>& str, int, int=0); -// vector -// vectors of unsigned char are a special case and are intended to be serialized as a single opaque blob. +/** + * vector + * vectors of unsigned char are a special case and are intended to be serialized as a single opaque blob. + */ template<typename T, typename A> unsigned int GetSerializeSize_impl(const std::vector<T, A>& v, int nType, int nVersion, const unsigned char&); template<typename T, typename A, typename V> unsigned int GetSerializeSize_impl(const std::vector<T, A>& v, int nType, int nVersion, const V&); template<typename T, typename A> inline unsigned int GetSerializeSize(const std::vector<T, A>& v, int nType, int nVersion); @@ -436,22 +450,30 @@ template<typename Stream, typename T, typename A> void Unserialize_impl(Stream& template<typename Stream, typename T, typename A, typename V> void Unserialize_impl(Stream& is, std::vector<T, A>& v, int nType, int nVersion, const V&); template<typename Stream, typename T, typename A> inline void Unserialize(Stream& is, std::vector<T, A>& v, int nType, int nVersion); -// others derived from vector +/** + * others derived from vector + */ extern inline unsigned int GetSerializeSize(const CScript& v, int nType, int nVersion); template<typename Stream> void Serialize(Stream& os, const CScript& v, int nType, int nVersion); template<typename Stream> void Unserialize(Stream& is, CScript& v, int nType, int nVersion); -// pair +/** + * pair + */ template<typename K, typename T> unsigned int GetSerializeSize(const std::pair<K, T>& item, int nType, int nVersion); template<typename Stream, typename K, typename T> void Serialize(Stream& os, const std::pair<K, T>& item, int nType, int nVersion); template<typename Stream, typename K, typename T> void Unserialize(Stream& is, std::pair<K, T>& item, int nType, int nVersion); -// map +/** + * map + */ template<typename K, typename T, typename Pred, typename A> unsigned int GetSerializeSize(const std::map<K, T, Pred, A>& m, int nType, int nVersion); template<typename Stream, typename K, typename T, typename Pred, typename A> void Serialize(Stream& os, const std::map<K, T, Pred, A>& m, int nType, int nVersion); template<typename Stream, typename K, typename T, typename Pred, typename A> void Unserialize(Stream& is, std::map<K, T, Pred, A>& m, int nType, int nVersion); -// set +/** + * set + */ template<typename K, typename Pred, typename A> unsigned int GetSerializeSize(const std::set<K, Pred, A>& m, int nType, int nVersion); template<typename Stream, typename K, typename Pred, typename A> void Serialize(Stream& os, const std::set<K, Pred, A>& m, int nType, int nVersion); template<typename Stream, typename K, typename Pred, typename A> void Unserialize(Stream& is, std::set<K, Pred, A>& m, int nType, int nVersion); @@ -460,12 +482,12 @@ template<typename Stream, typename K, typename Pred, typename A> void Unserializ -// -// If none of the specialized versions above matched, default to calling member function. -// "int nType" is changed to "long nType" to keep from getting an ambiguous overload error. -// The compiler will only cast int to long if none of the other templates matched. -// Thanks to Boost serialization for this idea. -// +/** + * If none of the specialized versions above matched, default to calling member function. + * "int nType" is changed to "long nType" to keep from getting an ambiguous overload error. + * The compiler will only cast int to long if none of the other templates matched. + * Thanks to Boost serialization for this idea. + */ template<typename T> inline unsigned int GetSerializeSize(const T& a, long nType, int nVersion) { @@ -488,9 +510,9 @@ inline void Unserialize(Stream& is, T& a, long nType, int nVersion) -// -// string -// +/** + * string + */ template<typename C> unsigned int GetSerializeSize(const std::basic_string<C>& str, int, int) { @@ -516,9 +538,9 @@ void Unserialize(Stream& is, std::basic_string<C>& str, int, int) -// -// vector -// +/** + * vector + */ template<typename T, typename A> unsigned int GetSerializeSize_impl(const std::vector<T, A>& v, int nType, int nVersion, const unsigned char&) { @@ -606,9 +628,9 @@ inline void Unserialize(Stream& is, std::vector<T, A>& v, int nType, int nVersio -// -// others derived from vector -// +/** + * others derived from vector + */ inline unsigned int GetSerializeSize(const CScript& v, int nType, int nVersion) { return GetSerializeSize((const std::vector<unsigned char>&)v, nType, nVersion); @@ -628,9 +650,9 @@ void Unserialize(Stream& is, CScript& v, int nType, int nVersion) -// -// pair -// +/** + * pair + */ template<typename K, typename T> unsigned int GetSerializeSize(const std::pair<K, T>& item, int nType, int nVersion) { @@ -653,9 +675,9 @@ void Unserialize(Stream& is, std::pair<K, T>& item, int nType, int nVersion) -// -// map -// +/** + * map + */ template<typename K, typename T, typename Pred, typename A> unsigned int GetSerializeSize(const std::map<K, T, Pred, A>& m, int nType, int nVersion) { @@ -689,9 +711,9 @@ void Unserialize(Stream& is, std::map<K, T, Pred, A>& m, int nType, int nVersion -// -// set -// +/** + * set + */ template<typename K, typename Pred, typename A> unsigned int GetSerializeSize(const std::set<K, Pred, A>& m, int nType, int nVersion) { @@ -725,9 +747,9 @@ void Unserialize(Stream& is, std::set<K, Pred, A>& m, int nType, int nVersion) -// -// Support for ADD_SERIALIZE_METHODS and READWRITE macro -// +/** + * Support for ADD_SERIALIZE_METHODS and READWRITE macro + */ struct CSerActionSerialize { bool ForRead() const { return false; } diff --git a/src/test/alert_tests.cpp b/src/test/alert_tests.cpp index 28610f0d2e..4869ba52ac 100644 --- a/src/test/alert_tests.cpp +++ b/src/test/alert_tests.cpp @@ -7,13 +7,13 @@ // #include "alert.h" +#include "clientversion.h" #include "data/alertTests.raw.h" #include "serialize.h" #include "streams.h" #include "util.h" #include "utilstrencodings.h" -#include "version.h" #include <fstream> @@ -154,9 +154,6 @@ BOOST_AUTO_TEST_CASE(AlertApplies) } -// This uses sh 'echo' to test the -alertnotify function, writing to a -// /tmp file. So skip it on Windows: -#ifndef WIN32 BOOST_AUTO_TEST_CASE(AlertNotify) { SetMockTime(11); @@ -171,15 +168,24 @@ BOOST_AUTO_TEST_CASE(AlertNotify) std::vector<std::string> r = read_lines(temp); BOOST_CHECK_EQUAL(r.size(), 4u); + +// Windows built-in echo semantics are different than posixy shells. Quotes and +// whitespace are printed literally. + +#ifndef WIN32 BOOST_CHECK_EQUAL(r[0], "Alert 1"); BOOST_CHECK_EQUAL(r[1], "Alert 2, cancels 1"); BOOST_CHECK_EQUAL(r[2], "Alert 2, cancels 1"); BOOST_CHECK_EQUAL(r[3], "Evil Alert; /bin/ls; echo "); // single-quotes should be removed - +#else + BOOST_CHECK_EQUAL(r[0], "'Alert 1' "); + BOOST_CHECK_EQUAL(r[1], "'Alert 2, cancels 1' "); + BOOST_CHECK_EQUAL(r[2], "'Alert 2, cancels 1' "); + BOOST_CHECK_EQUAL(r[3], "'Evil Alert; /bin/ls; echo ' "); +#endif boost::filesystem::remove(temp); SetMockTime(0); } -#endif BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/bignum.h b/src/test/bignum.h index 86980b2af6..f64c987202 100644 --- a/src/test/bignum.h +++ b/src/test/bignum.h @@ -3,8 +3,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_BIGNUM_H -#define BITCOIN_BIGNUM_H +#ifndef BITCOIN_TEST_BIGNUM_H +#define BITCOIN_TEST_BIGNUM_H #include <algorithm> #include <limits> @@ -177,4 +177,4 @@ inline bool operator>=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, inline bool operator<(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) < 0); } inline bool operator>(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) > 0); } -#endif +#endif // BITCOIN_TEST_BIGNUM_H diff --git a/src/test/bloom_tests.cpp b/src/test/bloom_tests.cpp index 99b21a23a0..783e284af5 100644 --- a/src/test/bloom_tests.cpp +++ b/src/test/bloom_tests.cpp @@ -5,6 +5,7 @@ #include "bloom.h" #include "base58.h" +#include "clientversion.h" #include "key.h" #include "main.h" #include "serialize.h" diff --git a/src/test/checkblock_tests.cpp b/src/test/checkblock_tests.cpp index 9151fdc0c8..fc36b43e16 100644 --- a/src/test/checkblock_tests.cpp +++ b/src/test/checkblock_tests.cpp @@ -8,6 +8,7 @@ +#include "clientversion.h" #include "main.h" #include "utiltime.h" diff --git a/src/test/data/script_invalid.json b/src/test/data/script_invalid.json index 6f451a36ee..71e757714c 100644 --- a/src/test/data/script_invalid.json +++ b/src/test/data/script_invalid.json @@ -163,6 +163,23 @@ nSequences are max. ["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 2 EQUAL", "P2SH,STRICTENC"], ["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_11' EQUAL", "P2SH,STRICTENC"], +["Ensure 100% coverage of discouraged NOPS"], +["1", "NOP1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP2", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP3", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP4", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP5", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP6", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP7", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP8", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP9", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], +["1", "NOP10", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"], + +["NOP10", "1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in scriptSig"], + +["1 0x01 0xb9", "HASH160 0x14 0x15727299b05b45fdaf9ac9ecf7565cfe27c3e567 EQUAL", + "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"], + ["0x50","1", "P2SH,STRICTENC", "opcode 0x50 is reserved"], ["1", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"], ["1", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"], @@ -576,11 +593,48 @@ nSequences are max. "P2PK NOT with hybrid pubkey but no STRICTENC" ], [ + "0x47 0x3044022078033e4227aa05ded69d8da579966578e230d8a7fb44d5f1a0620c3853c24f78022006a2e3f4d872ac8dfdc529110aa37301d65a76255a4b6cce2992adacd4d2c4e201", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "STRICTENC", + "P2PK NOT with hybrid pubkey" +], +[ + "0x47 0x304402207592427de20e315d644839754f2a5cca5b978b983a15e6da82109ede01722baa022032ceaf78590faa3f7743821e1b47b897ed1a57f6ee1c8a7519d23774d8de3c4401", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "STRICTENC", + "P2PK NOT with invalid hybrid pubkey" +], +[ + "0 0x47 0x304402206797289d3dc81692edae58430276d04641ea5d86967be557163f8494da32fd78022006fc6ab77aaed4ac11ea69cd878ab26e3e24290f47a43e9adf34075d52b7142c01", + "1 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 2 CHECKMULTISIG", + "STRICTENC", + "1-of-2 with the first 1 hybrid pubkey" +], +[ "0x47 0x304402201f82b99a813c9c48c8dee8d2c43b8f637b72353fe9bdcc084537bc17e2ab770402200c43b96a5f7e115f0114eabda32e068145965cb6c7b5ef64833bb4fcf9fc1b3b05", "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", "STRICTENC", "P2PK with undefined hashtype" ], + +[" +Order of CHECKMULTISIG evaluation tests, inverted by swapping the order of +pubkeys/signatures so they fail due to the STRICTENC rules on validly encoded +signatures and pubkeys. +"], +[ + "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501", + "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0 2 CHECKMULTISIG NOT", + "STRICTENC", + "2-of-2 CHECKMULTISIG NOT with the first pubkey invalid, and both signatures validly encoded." +], +[ + "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0", + "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT", + "STRICTENC", + "2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but first signature invalid." +], + [ "0x47 0x30440220166848cd5b82a32b5944d90de3c35249354b43773c2ece1844ee8d1103e2f6c602203b6b046da4243c77adef80ada9201b27bbfdf7f9d5428f40434b060432afd62005", "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT", diff --git a/src/test/data/script_valid.json b/src/test/data/script_valid.json index 439c82ef32..ada45a64ed 100644 --- a/src/test/data/script_valid.json +++ b/src/test/data/script_valid.json @@ -235,6 +235,11 @@ nSequences are max. ["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", "P2SH,STRICTENC"], ["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_10' EQUAL", "P2SH,STRICTENC"], +["1", "NOP", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "Discourage NOPx flag allows OP_NOP"], + +["0", "IF NOP10 ENDIF 1", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", + "Discouraged NOPs are allowed if not executed"], + ["0", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"], ["0", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"], ["0", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC"], @@ -739,23 +744,48 @@ nSequences are max. "P2PK with hybrid pubkey but no STRICTENC" ], [ - "0x47 0x3044022078033e4227aa05ded69d8da579966578e230d8a7fb44d5f1a0620c3853c24f78022006a2e3f4d872ac8dfdc529110aa37301d65a76255a4b6cce2992adacd4d2c4e201", - "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", - "STRICTENC", - "P2PK NOT with hybrid pubkey" -], -[ "0x47 0x3044022078d6c447887e88dcbe1bc5b613645280df6f4e5935648bc226e9d91da71b3216022047d6b7ef0949b228fc1b359afb8d50500268711354298217b983c26970790c7601", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", "", "P2PK NOT with invalid hybrid pubkey but no STRICTENC" ], [ - "0x47 0x304402207592427de20e315d644839754f2a5cca5b978b983a15e6da82109ede01722baa022032ceaf78590faa3f7743821e1b47b897ed1a57f6ee1c8a7519d23774d8de3c4401", - "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "0 0x47 0x304402203b269b9fbc0936877bf855b5fb41757218d9548b246370d991442a5f5bd1c3440220235268a4eaa8c67e543c6e37da81dd36d3b1be2de6b4fef04113389ca6ddc04501", + "1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG", + "", + "1-of-2 with the second 1 hybrid pubkey and no STRICTENC" +], +[ + "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501", + "1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG", "STRICTENC", - "P2PK NOT with invalid hybrid pubkey" + "1-of-2 with the second 1 hybrid pubkey" ], + +[" +CHECKMULTISIG evaluation order tests. CHECKMULTISIG evaluates signatures and +pubkeys in a specific order, and will exit early if the number of signatures +left to check is greater than the number of keys left. As STRICTENC fails the +script when it reaches an invalidly encoded signature or pubkey, we can use it +to test the exact order in which signatures and pubkeys are evaluated by +distinguishing CHECKMULTISIG returning false on the stack and the script as a +whole failing. + +See also the corresponding inverted versions of these tests in script_invalid.json +"], +[ + "0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501", + "2 0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT", + "STRICTENC", + "2-of-2 CHECKMULTISIG NOT with the second pubkey invalid, and both signatures validly encoded. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid pubkey." +], +[ + "0 0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501", + "2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT", + "STRICTENC", + "2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature." +], + [ "0x47 0x304402204649e9517ef0377a8f8270bd423053fd98ddff62d74ea553e9579558abbb75e4022044a2b2344469c12e35ed898987711272b634733dd0f5e051288eceb04bd4669e05", "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", diff --git a/src/test/key_tests.cpp b/src/test/key_tests.cpp index b32f3774fe..f9e35e0166 100644 --- a/src/test/key_tests.cpp +++ b/src/test/key_tests.cpp @@ -82,6 +82,26 @@ BOOST_AUTO_TEST_CASE(key_test1) CPubKey pubkey1C = key1C.GetPubKey(); CPubKey pubkey2C = key2C.GetPubKey(); + BOOST_CHECK(key1.VerifyPubKey(pubkey1)); + BOOST_CHECK(!key1.VerifyPubKey(pubkey1C)); + BOOST_CHECK(!key1.VerifyPubKey(pubkey2)); + BOOST_CHECK(!key1.VerifyPubKey(pubkey2C)); + + BOOST_CHECK(!key1C.VerifyPubKey(pubkey1)); + BOOST_CHECK(key1C.VerifyPubKey(pubkey1C)); + BOOST_CHECK(!key1C.VerifyPubKey(pubkey2)); + BOOST_CHECK(!key1C.VerifyPubKey(pubkey2C)); + + BOOST_CHECK(!key2.VerifyPubKey(pubkey1)); + BOOST_CHECK(!key2.VerifyPubKey(pubkey1C)); + BOOST_CHECK(key2.VerifyPubKey(pubkey2)); + BOOST_CHECK(!key2.VerifyPubKey(pubkey2C)); + + BOOST_CHECK(!key2C.VerifyPubKey(pubkey1)); + BOOST_CHECK(!key2C.VerifyPubKey(pubkey1C)); + BOOST_CHECK(!key2C.VerifyPubKey(pubkey2)); + BOOST_CHECK(key2C.VerifyPubKey(pubkey2C)); + BOOST_CHECK(addr1.Get() == CTxDestination(pubkey1.GetID())); BOOST_CHECK(addr2.Get() == CTxDestination(pubkey2.GetID())); BOOST_CHECK(addr1C.Get() == CTxDestination(pubkey1C.GetID())); diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 93b7fe189a..53c2e7b261 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -4,6 +4,7 @@ #include "main.h" #include "miner.h" +#include "pubkey.h" #include "uint256.h" #include "util.h" @@ -56,6 +57,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) uint256 hash; LOCK(cs_main); + Checkpoints::fEnabled = false; // Simple block creation, nothing special yet: BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey)); @@ -79,7 +81,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) pblock->hashMerkleRoot = pblock->BuildMerkleTree(); pblock->nNonce = blockinfo[i].nonce; CValidationState state; - BOOST_CHECK(ProcessBlock(state, NULL, pblock)); + BOOST_CHECK(ProcessNewBlock(state, NULL, pblock)); BOOST_CHECK(state.IsValid()); pblock->hashPrevBlock = pblock->GetHash(); } @@ -258,6 +260,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) BOOST_FOREACH(CTransaction *tx, txFirst) delete tx; + Checkpoints::fEnabled = true; } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp index e9fc86779a..8d06caa147 100644 --- a/src/test/multisig_tests.cpp +++ b/src/test/multisig_tests.cpp @@ -6,6 +6,7 @@ #include "keystore.h" #include "main.h" #include "script/script.h" +#include "script/script_error.h" #include "script/interpreter.h" #include "script/sign.h" #include "uint256.h" @@ -46,6 +47,7 @@ BOOST_AUTO_TEST_CASE(multisig_verify) { unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC; + ScriptError err; CKey key[4]; for (int i = 0; i < 4; i++) key[i].MakeNewKey(true); @@ -82,19 +84,22 @@ BOOST_AUTO_TEST_CASE(multisig_verify) keys.clear(); keys += key[0],key[1]; // magic operator+= from boost.assign s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK(VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0))); + BOOST_CHECK(VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); for (int i = 0; i < 4; i++) { keys.clear(); keys += key[i]; s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0)), strprintf("a&b 1: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0), &err), strprintf("a&b 1: %d", i)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err)); keys.clear(); keys += key[1],key[i]; s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0)), strprintf("a&b 2: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, SignatureChecker(txTo[0], 0), &err), strprintf("a&b 2: %d", i)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } // Test a OR b: @@ -104,16 +109,24 @@ BOOST_AUTO_TEST_CASE(multisig_verify) keys += key[i]; s = sign_multisig(a_or_b, keys, txTo[1], 0); if (i == 0 || i == 1) - BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0)), strprintf("a|b: %d", i)); + { + BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0), &err), strprintf("a|b: %d", i)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); + } else - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0)), strprintf("a|b: %d", i)); + { + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0), &err), strprintf("a|b: %d", i)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); + } } s.clear(); s << OP_0 << OP_0; - BOOST_CHECK(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0))); + BOOST_CHECK(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_SIG_DER, ScriptErrorString(err)); s.clear(); s << OP_0 << OP_1; - BOOST_CHECK(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0))); + BOOST_CHECK(!VerifyScript(s, a_or_b, flags, SignatureChecker(txTo[1], 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_SIG_DER, ScriptErrorString(err)); for (int i = 0; i < 4; i++) @@ -123,9 +136,15 @@ BOOST_AUTO_TEST_CASE(multisig_verify) keys += key[i],key[j]; s = sign_multisig(escrow, keys, txTo[2], 0); if (i < j && i < 3 && j < 3) - BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, SignatureChecker(txTo[2], 0)), strprintf("escrow 1: %d %d", i, j)); + { + BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, SignatureChecker(txTo[2], 0), &err), strprintf("escrow 1: %d %d", i, j)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); + } else - BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, SignatureChecker(txTo[2], 0)), strprintf("escrow 2: %d %d", i, j)); + { + BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, SignatureChecker(txTo[2], 0), &err), strprintf("escrow 2: %d %d", i, j)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); + } } } diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index fcab652783..a969eefa05 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -6,6 +6,7 @@ #include "keystore.h" #include "main.h" #include "script/script.h" +#include "script/script_error.h" #include "script/sign.h" #ifdef ENABLE_WALLET @@ -27,7 +28,7 @@ Serialize(const CScript& s) } static bool -Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict) +Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict, ScriptError& err) { // Create dummy to/from transactions: CMutableTransaction txFrom; @@ -42,7 +43,7 @@ Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict) txTo.vin[0].scriptSig = scriptSig; txTo.vout[0].nValue = 1; - return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, SignatureChecker(txTo, 0)); + return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, SignatureChecker(txTo, 0), &err); } @@ -124,6 +125,7 @@ BOOST_AUTO_TEST_CASE(sign) BOOST_AUTO_TEST_CASE(norecurse) { + ScriptError err; // Make sure only the outer pay-to-script-hash does the // extra-validation thing: CScript invalidAsScript; @@ -135,7 +137,8 @@ BOOST_AUTO_TEST_CASE(norecurse) scriptSig << Serialize(invalidAsScript); // Should not verify, because it will try to execute OP_INVALIDOPCODE - BOOST_CHECK(!Verify(scriptSig, p2sh, true)); + BOOST_CHECK(!Verify(scriptSig, p2sh, true, err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_BAD_OPCODE, ScriptErrorString(err)); // Try to recur, and verification should succeed because // the inner HASH160 <> EQUAL should only check the hash: @@ -143,7 +146,8 @@ BOOST_AUTO_TEST_CASE(norecurse) CScript scriptSig2; scriptSig2 << Serialize(invalidAsScript) << Serialize(p2sh); - BOOST_CHECK(Verify(scriptSig2, p2sh2, true)); + BOOST_CHECK(Verify(scriptSig2, p2sh2, true, err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } BOOST_AUTO_TEST_CASE(set) @@ -238,6 +242,7 @@ BOOST_AUTO_TEST_CASE(switchover) { // Test switch over code CScript notValid; + ScriptError err; notValid << OP_11 << OP_12 << OP_EQUALVERIFY; CScript scriptSig; scriptSig << Serialize(notValid); @@ -246,9 +251,11 @@ BOOST_AUTO_TEST_CASE(switchover) // Validation should succeed under old rules (hash is correct): - BOOST_CHECK(Verify(scriptSig, fund, false)); + BOOST_CHECK(Verify(scriptSig, fund, false, err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); // Fail under new: - BOOST_CHECK(!Verify(scriptSig, fund, true)); + BOOST_CHECK(!Verify(scriptSig, fund, true, err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EQUALVERIFY, ScriptErrorString(err)); } BOOST_AUTO_TEST_CASE(AreInputsStandard) diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index a41552fea1..6952f4c584 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -10,9 +10,14 @@ #include "keystore.h" #include "main.h" #include "script/script.h" +#include "script/script_error.h" #include "script/sign.h" #include "util.h" +#if defined(HAVE_CONSENSUS_LIB) +#include "script/bitcoinconsensus.h" +#endif + #include <fstream> #include <stdint.h> #include <string> @@ -92,7 +97,58 @@ CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CMu void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, bool expect, const std::string& message) { - BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, SignatureChecker(BuildSpendingTransaction(scriptSig, BuildCreditingTransaction(scriptPubKey)), 0)) == expect, message); + ScriptError err; + CMutableTransaction tx = BuildSpendingTransaction(scriptSig, BuildCreditingTransaction(scriptPubKey)); + CMutableTransaction tx2 = tx; + BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, SignatureChecker(tx, 0), &err) == expect, message); + BOOST_CHECK_MESSAGE(expect == (err == SCRIPT_ERR_OK), std::string(ScriptErrorString(err)) + ": " + message); +#if defined(HAVE_CONSENSUS_LIB) + CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); + stream << tx2; + BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script(begin_ptr(scriptPubKey), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), 0, flags, NULL) == expect,message); +#endif +} + +void static NegateSignatureS(std::vector<unsigned char>& vchSig) { + // Parse the signature. + std::vector<unsigned char> r, s; + r = std::vector<unsigned char>(vchSig.begin() + 4, vchSig.begin() + 4 + vchSig[3]); + s = std::vector<unsigned char>(vchSig.begin() + 6 + vchSig[3], vchSig.begin() + 6 + vchSig[3] + vchSig[5 + vchSig[3]]); + unsigned char hashtype = vchSig.back(); + + // Really ugly to implement mod-n negation here, but it would be feature creep to expose such functionality from libsecp256k1. + static const unsigned char order[33] = { + 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, + 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41 + }; + while (s.size() < 33) { + s.insert(s.begin(), 0x00); + } + int carry = 0; + for (int p = 32; p >= 1; p--) { + int n = (int)order[p] - s[p] - carry; + s[p] = (n + 256) & 0xFF; + carry = (n < 0); + } + assert(carry == 0); + if (s.size() > 1 && s[0] == 0 && s[1] < 0x80) { + s.erase(s.begin()); + } + + // Reconstruct the signature. + vchSig.clear(); + vchSig.push_back(0x30); + vchSig.push_back(4 + r.size() + s.size()); + vchSig.push_back(0x02); + vchSig.push_back(r.size()); + vchSig.insert(vchSig.end(), r.begin(), r.end()); + vchSig.push_back(0x02); + vchSig.push_back(s.size()); + vchSig.insert(vchSig.end(), s.begin(), s.end()); + vchSig.push_back(hashtype); } namespace @@ -130,7 +186,6 @@ struct KeyData } }; -const KeyData keys; class TestBuilder { @@ -194,7 +249,10 @@ public: uint256 hash = SignatureHash(scriptPubKey, spendTx, 0, nHashType); std::vector<unsigned char> vchSig, r, s; do { - key.Sign(hash, vchSig, lenS <= 32); + key.Sign(hash, vchSig); + if ((lenS == 33) != (vchSig[5 + vchSig[3]] == 33)) { + NegateSignatureS(vchSig); + } r = std::vector<unsigned char>(vchSig.begin() + 4, vchSig.begin() + 4 + vchSig[3]); s = std::vector<unsigned char>(vchSig.begin() + 6 + vchSig[3], vchSig.begin() + 6 + vchSig[3] + vchSig[5 + vchSig[3]]); } while (lenR != r.size() || lenS != s.size()); @@ -269,6 +327,8 @@ public: BOOST_AUTO_TEST_CASE(script_build) { + const KeyData keys; + std::vector<TestBuilder> good; std::vector<TestBuilder> bad; @@ -368,15 +428,24 @@ BOOST_AUTO_TEST_CASE(script_build) bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, "P2PK NOT with hybrid pubkey but no STRICTENC", 0 ).PushSig(keys.key0, SIGHASH_ALL)); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, - "P2PK NOT with hybrid pubkey", SCRIPT_VERIFY_STRICTENC - ).PushSig(keys.key0, SIGHASH_ALL)); + bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, + "P2PK NOT with hybrid pubkey", SCRIPT_VERIFY_STRICTENC + ).PushSig(keys.key0, SIGHASH_ALL)); good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, "P2PK NOT with invalid hybrid pubkey but no STRICTENC", 0 ).PushSig(keys.key0, SIGHASH_ALL).DamagePush(10)); - good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, - "P2PK NOT with invalid hybrid pubkey", SCRIPT_VERIFY_STRICTENC - ).PushSig(keys.key0, SIGHASH_ALL).DamagePush(10)); + bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, + "P2PK NOT with invalid hybrid pubkey", SCRIPT_VERIFY_STRICTENC + ).PushSig(keys.key0, SIGHASH_ALL).DamagePush(10)); + good.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG, + "1-of-2 with the second 1 hybrid pubkey and no STRICTENC", 0 + ).Num(0).PushSig(keys.key1, SIGHASH_ALL)); + good.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) << ToByteVector(keys.pubkey1C) << OP_2 << OP_CHECKMULTISIG, + "1-of-2 with the second 1 hybrid pubkey", SCRIPT_VERIFY_STRICTENC + ).Num(0).PushSig(keys.key1, SIGHASH_ALL)); + bad.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey0H) << OP_2 << OP_CHECKMULTISIG, + "1-of-2 with the first 1 hybrid pubkey", SCRIPT_VERIFY_STRICTENC + ).Num(0).PushSig(keys.key1, SIGHASH_ALL)); good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, "P2PK with undefined hashtype but no STRICTENC", 0 @@ -545,20 +614,25 @@ BOOST_AUTO_TEST_CASE(script_PushData) static const unsigned char pushdata2[] = { OP_PUSHDATA2, 1, 0, 0x5a }; static const unsigned char pushdata4[] = { OP_PUSHDATA4, 1, 0, 0, 0, 0x5a }; + ScriptError err; vector<vector<unsigned char> > directStack; - BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), true, BaseSignatureChecker())); + BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), true, BaseSignatureChecker(), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector<vector<unsigned char> > pushdata1Stack; - BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), true, BaseSignatureChecker())); + BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), true, BaseSignatureChecker(), &err)); BOOST_CHECK(pushdata1Stack == directStack); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector<vector<unsigned char> > pushdata2Stack; - BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), true, BaseSignatureChecker())); + BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), true, BaseSignatureChecker(), &err)); BOOST_CHECK(pushdata2Stack == directStack); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); vector<vector<unsigned char> > pushdata4Stack; - BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), true, BaseSignatureChecker())); + BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), true, BaseSignatureChecker(), &err)); BOOST_CHECK(pushdata4Stack == directStack); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } CScript @@ -595,6 +669,7 @@ sign_multisig(CScript scriptPubKey, const CKey &key, CTransaction transaction) BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) { + ScriptError err; CKey key1, key2, key3; key1.MakeNewKey(true); key2.MakeNewKey(false); @@ -607,19 +682,24 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), txFrom12); CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12); - BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0))); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); txTo12.vout[0].nValue = 2; - BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0))); + BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12); - BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, SignatureChecker(txTo12, 0))); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, SignatureChecker(txTo12, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12); - BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0))); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, SignatureChecker(txTo12, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) { + ScriptError err; CKey key1, key2, key3, key4; key1.MakeNewKey(true); key2.MakeNewKey(false); @@ -635,46 +715,55 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) std::vector<CKey> keys; keys.push_back(key1); keys.push_back(key2); CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key1); keys.push_back(key3); CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key3); CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key2); // Can't re-use sig CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); // Must have signatures CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, SignatureChecker(txTo23, 0))); + BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, SignatureChecker(txTo23, 0), &err)); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err)); } BOOST_AUTO_TEST_CASE(script_combineSigs) @@ -788,11 +877,13 @@ BOOST_AUTO_TEST_CASE(script_combineSigs) BOOST_AUTO_TEST_CASE(script_standard_push) { + ScriptError err; for (int i=0; i<67000; i++) { CScript script; script << i; BOOST_CHECK_MESSAGE(script.IsPushOnly(), "Number " << i << " is not pure push."); - BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker()), "Number " << i << " push is not minimal data."); + BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Number " << i << " push is not minimal data."); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } for (unsigned int i=0; i<=MAX_SCRIPT_ELEMENT_SIZE; i++) { @@ -800,7 +891,8 @@ BOOST_AUTO_TEST_CASE(script_standard_push) CScript script; script << data; BOOST_CHECK_MESSAGE(script.IsPushOnly(), "Length " << i << " is not pure push."); - BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker()), "Length " << i << " push is not minimal data."); + BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Length " << i << " push is not minimal data."); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } } diff --git a/src/test/sigopcount_tests.cpp b/src/test/sigopcount_tests.cpp index 7b27703b62..5bf0862c71 100644 --- a/src/test/sigopcount_tests.cpp +++ b/src/test/sigopcount_tests.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "pubkey.h" #include "key.h" #include "script/script.h" #include "script/standard.h" diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index c46c31e99f..e939e89972 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -5,10 +5,12 @@ #include "data/tx_invalid.json.h" #include "data/tx_valid.json.h" +#include "clientversion.h" #include "key.h" #include "keystore.h" #include "main.h" #include "script/script.h" +#include "script/script_error.h" #include "core_io.h" #include <map> @@ -35,7 +37,8 @@ static std::map<string, unsigned int> mapFlagNames = boost::assign::map_list_of (string("LOW_S"), (unsigned int)SCRIPT_VERIFY_LOW_S) (string("SIGPUSHONLY"), (unsigned int)SCRIPT_VERIFY_SIGPUSHONLY) (string("MINIMALDATA"), (unsigned int)SCRIPT_VERIFY_MINIMALDATA) - (string("NULLDUMMY"), (unsigned int)SCRIPT_VERIFY_NULLDUMMY); + (string("NULLDUMMY"), (unsigned int)SCRIPT_VERIFY_NULLDUMMY) + (string("DISCOURAGE_UPGRADABLE_NOPS"), (unsigned int)SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS); unsigned int ParseScriptFlags(string strFlags) { @@ -85,6 +88,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) // verifyFlags is a comma separated list of script verification flags to apply, or "NONE" Array tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid))); + ScriptError err; BOOST_FOREACH(Value& tv, tests) { Array test = tv.get_array(); @@ -141,8 +145,9 @@ BOOST_AUTO_TEST_CASE(tx_valid) unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, SignatureChecker(tx, i)), + verify_flags, SignatureChecker(tx, i), &err), strTest); + BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } } } @@ -159,6 +164,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) // verifyFlags is a comma separated list of script verification flags to apply, or "NONE" Array tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid))); + ScriptError err; BOOST_FOREACH(Value& tv, tests) { Array test = tv.get_array(); @@ -214,10 +220,10 @@ BOOST_AUTO_TEST_CASE(tx_invalid) unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, SignatureChecker(tx, i)); + verify_flags, SignatureChecker(tx, i), &err); } - BOOST_CHECK_MESSAGE(!fValid, strTest); + BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err)); } } } diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp index 761210feac..67d50fccf4 100644 --- a/src/test/util_tests.cpp +++ b/src/test/util_tests.cpp @@ -4,12 +4,12 @@ #include "util.h" +#include "clientversion.h" #include "core/transaction.h" #include "random.h" #include "sync.h" #include "utilstrencodings.h" #include "utilmoneystr.h" -#include "version.h" #include <stdint.h> #include <vector> diff --git a/src/timedata.cpp b/src/timedata.cpp index 40cdb33f7a..59f7778db1 100644 --- a/src/timedata.cpp +++ b/src/timedata.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "timedata.h" @@ -17,14 +17,13 @@ using namespace std; static CCriticalSection cs_nTimeOffset; static int64_t nTimeOffset = 0; -// -// "Never go to sea with two chronometers; take one or three." -// Our three time sources are: -// - System clock -// - Median of other nodes clocks -// - The user (asking the user to fix the system clock if the first two disagree) -// -// +/** + * "Never go to sea with two chronometers; take one or three." + * Our three time sources are: + * - System clock + * - Median of other nodes clocks + * - The user (asking the user to fix the system clock if the first two disagree) + */ int64_t GetTimeOffset() { LOCK(cs_nTimeOffset); diff --git a/src/timedata.h b/src/timedata.h index 2c20f4efd5..64595ffc37 100644 --- a/src/timedata.h +++ b/src/timedata.h @@ -1,5 +1,5 @@ // Copyright (c) 2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_TIMEDATA_H @@ -12,7 +12,8 @@ class CNetAddr; -/** Median filter over a stream of values. +/** + * Median filter over a stream of values. * Returns the median of the last N numbers */ template <typename T> @@ -67,7 +68,7 @@ public: } }; -/* Functions to keep track of adjusted P2P time */ +/** Functions to keep track of adjusted P2P time */ int64_t GetTimeOffset(); int64_t GetAdjustedTime(); void AddTimeData(const CNetAddr& ip, int64_t nTime); diff --git a/src/txdb.h b/src/txdb.h index 8f2bd9af4d..9a98fcc41b 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -1,10 +1,10 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_TXDB_LEVELDB_H -#define BITCOIN_TXDB_LEVELDB_H +#ifndef BITCOIN_TXDB_H +#define BITCOIN_TXDB_H #include "leveldbwrapper.h" #include "main.h" @@ -17,11 +17,11 @@ class CCoins; class uint256; -// -dbcache default (MiB) +//! -dbcache default (MiB) static const int64_t nDefaultDbCache = 100; -// max. -dbcache in (MiB) +//! max. -dbcache in (MiB) static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 4096 : 1024; -// min. -dbcache in (MiB) +//! min. -dbcache in (MiB) static const int64_t nMinDbCache = 4; /** CCoinsView backed by the LevelDB coin database (chainstate/) */ @@ -62,4 +62,4 @@ public: bool LoadBlockIndexGuts(); }; -#endif // BITCOIN_TXDB_LEVELDB_H +#endif // BITCOIN_TXDB_H diff --git a/src/txmempool.cpp b/src/txmempool.cpp index c042dd8467..e13f1cc350 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -1,10 +1,11 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "txmempool.h" +#include "clientversion.h" #include "streams.h" #include "util.h" #include "utilmoneystr.h" @@ -44,9 +45,9 @@ CTxMemPoolEntry::GetPriority(unsigned int currentHeight) const return dResult; } -// -// Keep track of fee/priority for transactions confirmed within N blocks -// +/** + * Keep track of fee/priority for transactions confirmed within N blocks + */ class CBlockAverage { private: @@ -85,8 +86,10 @@ public: return prioritySamples.size(); } - // Used as belt-and-suspenders check when reading to detect - // file corruption + /** + * Used as belt-and-suspenders check when reading to detect + * file corruption + */ bool AreSane(const std::vector<CFeeRate>& vecFee, const CFeeRate& minRelayFee) { BOOST_FOREACH(CFeeRate fee, vecFee) @@ -138,16 +141,20 @@ public: class CMinerPolicyEstimator { private: - // Records observed averages transactions that confirmed within one block, two blocks, - // three blocks etc. + /** + * Records observed averages transactions that confirmed within one block, two blocks, + * three blocks etc. + */ std::vector<CBlockAverage> history; std::vector<CFeeRate> sortedFeeSamples; std::vector<double> sortedPrioritySamples; int nBestSeenHeight; - // nBlocksAgo is 0 based, i.e. transactions that confirmed in the highest seen block are - // nBlocksAgo == 0, transactions in the block before that are nBlocksAgo == 1 etc. + /** + * nBlocksAgo is 0 based, i.e. transactions that confirmed in the highest seen block are + * nBlocksAgo == 0, transactions in the block before that are nBlocksAgo == 1 etc. + */ void seenTxConfirm(const CFeeRate& feeRate, const CFeeRate& minRelayFee, double dPriority, int nBlocksAgo) { // Last entry records "everything else". @@ -247,7 +254,9 @@ public: } } - // Can return CFeeRate(0) if we don't have any data for that many blocks back. nBlocksToConfirm is 1 based. + /** + * Can return CFeeRate(0) if we don't have any data for that many blocks back. nBlocksToConfirm is 1 based. + */ CFeeRate estimateFee(int nBlocksToConfirm) { nBlocksToConfirm--; @@ -331,7 +340,7 @@ public: size_t numEntries; filein >> numEntries; if (numEntries <= 0 || numEntries > 10000) - throw runtime_error("Corrupt estimates file. Must have between 1 and 10k entires."); + throw runtime_error("Corrupt estimates file. Must have between 1 and 10k entries."); std::vector<CBlockAverage> fileHistory; @@ -342,8 +351,8 @@ public: fileHistory.push_back(entry); } - //Now that we've processed the entire fee estimate data file and not - //thrown any errors, we can copy it to our history + // Now that we've processed the entire fee estimate data file and not + // thrown any errors, we can copy it to our history nBestSeenHeight = nFileBestSeenHeight; history = fileHistory; assert(history.size() > 0); @@ -461,7 +470,9 @@ void CTxMemPool::removeConflicts(const CTransaction &tx, std::list<CTransaction> } } -// Called when a block is connected. Removes from mempool and updates the miner fee estimator. +/** + * Called when a block is connected. Removes from mempool and updates the miner fee estimator. + */ void CTxMemPool::removeForBlock(const std::vector<CTransaction>& vtx, unsigned int nBlockHeight, std::list<CTransaction>& conflicts) { diff --git a/src/txmempool.h b/src/txmempool.h index 2ec80cb860..e68b218154 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_TXMEMPOOL_H @@ -15,29 +15,34 @@ class CAutoFile; +inline double AllowFreeThreshold() +{ + return COIN * 144 / 250; +} + inline bool AllowFree(double dPriority) { // Large (in bytes) low-priority (new, small-coin) transactions // need a fee. - return dPriority > COIN * 144 / 250; + return dPriority > AllowFreeThreshold(); } /** Fake height value used in CCoins to signify they are only in the memory pool (since 0.8) */ static const unsigned int MEMPOOL_HEIGHT = 0x7FFFFFFF; -/* +/** * CTxMemPool stores these: */ class CTxMemPoolEntry { private: CTransaction tx; - CAmount nFee; // Cached to avoid expensive parent-transaction lookups - size_t nTxSize; // ... and avoid recomputing tx size - size_t nModSize; // ... and modified size for priority - int64_t nTime; // Local time when entering the mempool - double dPriority; // Priority when entering the mempool - unsigned int nHeight; // Chain height when entering the mempool + CAmount nFee; //! Cached to avoid expensive parent-transaction lookups + size_t nTxSize; //! ... and avoid recomputing tx size + size_t nModSize; //! ... and modified size for priority + int64_t nTime; //! Local time when entering the mempool + double dPriority; //! Priority when entering the mempool + unsigned int nHeight; //! Chain height when entering the mempool public: CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee, @@ -68,7 +73,7 @@ public: bool IsNull() const { return (ptx == NULL && n == (uint32_t) -1); } }; -/* +/** * CTxMemPool stores valid-according-to-the-current-best-chain * transactions that may be included in the next block. * @@ -81,12 +86,12 @@ public: class CTxMemPool { private: - bool fSanityCheck; // Normally false, true if -checkmempool or -regtest + bool fSanityCheck; //! Normally false, true if -checkmempool or -regtest unsigned int nTransactionsUpdated; CMinerPolicyEstimator* minerPolicyEstimator; - CFeeRate minRelayFee; // Passed to constructor to avoid dependency on main - uint64_t totalTxSize; // sum of all mempool tx' byte sizes + CFeeRate minRelayFee; //! Passed to constructor to avoid dependency on main + uint64_t totalTxSize; //! sum of all mempool tx' byte sizes public: mutable CCriticalSection cs; @@ -97,7 +102,7 @@ public: CTxMemPool(const CFeeRate& _minRelayFee); ~CTxMemPool(); - /* + /** * If sanity-checking is turned on, check makes sure the pool is * consistent (does not contain two transactions that spend the same inputs, * all inputs are in the mapNextTx array). If sanity-checking is turned off, @@ -141,19 +146,21 @@ public: bool lookup(uint256 hash, CTransaction& result) const; - // Estimate fee rate needed to get into the next - // nBlocks + /** Estimate fee rate needed to get into the next nBlocks */ CFeeRate estimateFee(int nBlocks) const; - // Estimate priority needed to get into the next - // nBlocks + + /** Estimate priority needed to get into the next nBlocks */ double estimatePriority(int nBlocks) const; - // Write/Read estimates to disk + + /** Write/Read estimates to disk */ bool WriteFeeEstimates(CAutoFile& fileout) const; bool ReadFeeEstimates(CAutoFile& filein); }; -/** CCoinsView that brings transactions from a memorypool into view. - It does not check for spendings by memory pool transactions. */ +/** + * CCoinsView that brings transactions from a memorypool into view. + * It does not check for spendings by memory pool transactions. + */ class CCoinsViewMemPool : public CCoinsViewBacked { protected: diff --git a/src/uint256.h b/src/uint256.h index 28de540226..56f7f44a16 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_UINT256_H @@ -255,8 +255,10 @@ public: return sizeof(pn); } - // Returns the position of the highest bit set plus one, or zero if the - // value is zero. + /** + * Returns the position of the highest bit set plus one, or zero if the + * value is zero. + */ unsigned int bits() const; uint64_t GetLow64() const @@ -301,26 +303,27 @@ public: uint256(uint64_t b) : base_uint<256>(b) {} explicit uint256(const std::string& str) : base_uint<256>(str) {} explicit uint256(const std::vector<unsigned char>& vch) : base_uint<256>(vch) {} - - // The "compact" format is a representation of a whole - // number N using an unsigned 32bit number similar to a - // floating point format. - // The most significant 8 bits are the unsigned exponent of base 256. - // This exponent can be thought of as "number of bytes of N". - // The lower 23 bits are the mantissa. - // Bit number 24 (0x800000) represents the sign of N. - // N = (-1^sign) * mantissa * 256^(exponent-3) - // - // Satoshi's original implementation used BN_bn2mpi() and BN_mpi2bn(). - // MPI uses the most significant bit of the first byte as sign. - // Thus 0x1234560000 is compact (0x05123456) - // and 0xc0de000000 is compact (0x0600c0de) - // (0x05c0de00) would be -0x40de000000 - // - // Bitcoin only uses this "compact" format for encoding difficulty - // targets, which are unsigned 256bit quantities. Thus, all the - // complexities of the sign bit and using base 256 are probably an - // implementation accident. + + /** + * The "compact" format is a representation of a whole + * number N using an unsigned 32bit number similar to a + * floating point format. + * The most significant 8 bits are the unsigned exponent of base 256. + * This exponent can be thought of as "number of bytes of N". + * The lower 23 bits are the mantissa. + * Bit number 24 (0x800000) represents the sign of N. + * N = (-1^sign) * mantissa * 256^(exponent-3) + * + * Satoshi's original implementation used BN_bn2mpi() and BN_mpi2bn(). + * MPI uses the most significant bit of the first byte as sign. + * Thus 0x1234560000 is compact (0x05123456) + * and 0xc0de000000 is compact (0x0600c0de) + * + * Bitcoin only uses this "compact" format for encoding difficulty + * targets, which are unsigned 256bit quantities. Thus, all the + * complexities of the sign bit and using base 256 are probably an + * implementation accident. + */ uint256& SetCompact(uint32_t nCompact, bool *pfNegative = NULL, bool *pfOverflow = NULL); uint32_t GetCompact(bool fNegative = false) const; diff --git a/src/undo.h b/src/undo.h index 232c193429..4f5f4047dd 100644 --- a/src/undo.h +++ b/src/undo.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_TXUNDO -#define H_BITCOIN_TXUNDO +#ifndef BITCOIN_UNDO_H +#define BITCOIN_UNDO_H #include "compressor.h" #include "core/transaction.h" @@ -68,4 +68,4 @@ public: } }; -#endif // H_BITCOIN_TXUNDO +#endif // BITCOIN_UNDO_H diff --git a/src/univalue/gen.cpp b/src/univalue/gen.cpp index 881948f46e..f0b352eef0 100644 --- a/src/univalue/gen.cpp +++ b/src/univalue/gen.cpp @@ -35,8 +35,8 @@ static void initJsonEscape() static void outputEscape() { printf( "// Automatically generated file. Do not modify.\n" - "#ifndef __UNIVALUE_ESCAPES_H__\n" - "#define __UNIVALUE_ESCAPES_H__\n" + "#ifndef BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n" + "#define BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n" "static const char *escapes[256] = {\n"); for (unsigned int i = 0; i < 256; i++) { @@ -66,7 +66,7 @@ static void outputEscape() } printf( "};\n" - "#endif // __UNIVALUE_ESCAPES_H__\n"); + "#endif // BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n"); } int main (int argc, char *argv[]) diff --git a/src/univalue/univalue.h b/src/univalue/univalue.h index 0a7bf3cceb..5ac301d9e5 100644 --- a/src/univalue/univalue.h +++ b/src/univalue/univalue.h @@ -2,8 +2,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef __UNIVALUE_H__ -#define __UNIVALUE_H__ +#ifndef BITCOIN_UNIVALUE_UNIVALUE_H +#define BITCOIN_UNIVALUE_UNIVALUE_H #include <stdint.h> #include <string> @@ -152,4 +152,4 @@ extern enum jtokentype getJsonToken(std::string& tokenVal, unsigned int& consumed, const char *raw); extern const char *uvTypeName(UniValue::VType t); -#endif // __UNIVALUE_H__ +#endif // BITCOIN_UNIVALUE_UNIVALUE_H diff --git a/src/univalue/univalue_escapes.h b/src/univalue/univalue_escapes.h index 1d3a70a968..0514118285 100644 --- a/src/univalue/univalue_escapes.h +++ b/src/univalue/univalue_escapes.h @@ -1,6 +1,6 @@ // Automatically generated file. Do not modify. -#ifndef __UNIVALUE_ESCAPES_H__ -#define __UNIVALUE_ESCAPES_H__ +#ifndef BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H +#define BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H static const char *escapes[256] = { NULL, NULL, @@ -259,4 +259,4 @@ static const char *escapes[256] = { NULL, NULL, }; -#endif // __UNIVALUE_ESCAPES_H__ +#endif // BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H diff --git a/src/util.cpp b/src/util.cpp index 544ffc98b8..0cdf4e614d 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #if defined(HAVE_CONFIG_H) @@ -105,7 +105,7 @@ bool fLogTimestamps = false; bool fLogIPs = false; volatile bool fReopenDebugLog = false; -// Init OpenSSL library multithreading support +/** Init OpenSSL library multithreading support */ static CCriticalSection** ppmutexOpenSSL; void locking_callback(int mode, int i, const char* file, int line) { @@ -149,18 +149,22 @@ public: } instance_of_cinit; -// LogPrintf() has been broken a couple of times now -// by well-meaning people adding mutexes in the most straightforward way. -// It breaks because it may be called by global destructors during shutdown. -// Since the order of destruction of static/global objects is undefined, -// defining a mutex as a global object doesn't work (the mutex gets -// destroyed, and then some later destructor calls OutputDebugStringF, -// maybe indirectly, and you get a core dump at shutdown trying to lock -// the mutex). +/** + * LogPrintf() has been broken a couple of times now + * by well-meaning people adding mutexes in the most straightforward way. + * It breaks because it may be called by global destructors during shutdown. + * Since the order of destruction of static/global objects is undefined, + * defining a mutex as a global object doesn't work (the mutex gets + * destroyed, and then some later destructor calls OutputDebugStringF, + * maybe indirectly, and you get a core dump at shutdown trying to lock + * the mutex). + */ static boost::once_flag debugPrintInitFlag = BOOST_ONCE_INIT; -// We use boost::call_once() to make sure these are initialized in -// in a thread-safe manner the first time it is called: +/** + * We use boost::call_once() to make sure these are initialized + * in a thread-safe manner the first time called: + */ static FILE* fileout = NULL; static boost::mutex* mutexDebugLog = NULL; @@ -500,9 +504,11 @@ bool RenameOver(boost::filesystem::path src, boost::filesystem::path dest) #endif /* WIN32 */ } -// Ignores exceptions thrown by Boost's create_directory if the requested directory exists. -// Specifically handles case where path p exists, but it wasn't possible for the user to -// write to the parent directory. +/** + * Ignores exceptions thrown by Boost's create_directory if the requested directory exists. + * Specifically handles case where path p exists, but it wasn't possible for the user to + * write to the parent directory. + */ bool TryCreateDirectory(const boost::filesystem::path& p) { try @@ -542,8 +548,10 @@ bool TruncateFile(FILE *file, unsigned int length) { #endif } -// this function tries to raise the file descriptor limit to the requested number. -// It returns the actual file descriptor limit (which may be more or less than nMinFD) +/** + * this function tries to raise the file descriptor limit to the requested number. + * It returns the actual file descriptor limit (which may be more or less than nMinFD) + */ int RaiseFileDescriptorLimit(int nMinFD) { #if defined(WIN32) return 2048; @@ -563,8 +571,10 @@ int RaiseFileDescriptorLimit(int nMinFD) { #endif } -// this function tries to make a particular range of a file allocated (corresponding to disk space) -// it is advisory, and the range specified in the arguments will never contain live data +/** + * this function tries to make a particular range of a file allocated (corresponding to disk space) + * it is advisory, and the range specified in the arguments will never contain live data + */ void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length) { #if defined(WIN32) // Windows-specific version diff --git a/src/util.h b/src/util.h index 4b2415278b..a4aaf29f91 100644 --- a/src/util.h +++ b/src/util.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. /** @@ -40,25 +40,26 @@ extern volatile bool fReopenDebugLog; void SetupEnvironment(); -/* Return true if log accepts specified category */ +/** Return true if log accepts specified category */ bool LogAcceptCategory(const char* category); -/* Send a string to the log output */ +/** Send a string to the log output */ int LogPrintStr(const std::string &str); #define LogPrintf(...) LogPrint(NULL, __VA_ARGS__) -/* When we switch to C++11, this can be switched to variadic templates instead +/** + * When we switch to C++11, this can be switched to variadic templates instead * of this macro-based construction (see tinyformat.h). */ #define MAKE_ERROR_AND_LOG_FUNC(n) \ - /* Print to debug.log if -debug=category switch is given OR category is NULL. */ \ + /** Print to debug.log if -debug=category switch is given OR category is NULL. */ \ template<TINYFORMAT_ARGTYPES(n)> \ static inline int LogPrint(const char* category, const char* format, TINYFORMAT_VARARGS(n)) \ { \ if(!LogAcceptCategory(category)) return 0; \ return LogPrintStr(tfm::format(format, TINYFORMAT_PASSARGS(n))); \ } \ - /* Log error and return false */ \ + /** Log error and return false */ \ template<TINYFORMAT_ARGTYPES(n)> \ static inline bool error(const char* format, TINYFORMAT_VARARGS(n)) \ { \ @@ -68,7 +69,8 @@ int LogPrintStr(const std::string &str); TINYFORMAT_FOREACH_ARGNUM(MAKE_ERROR_AND_LOG_FUNC) -/* Zero-arg versions of logging and error, these are not covered by +/** + * Zero-arg versions of logging and error, these are not covered by * TINYFORMAT_FOREACH_ARGNUM */ static inline int LogPrint(const char* category, const char* format) @@ -162,13 +164,15 @@ bool SoftSetBoolArg(const std::string& strArg, bool fValue); void SetThreadPriority(int nPriority); void RenameThread(const char* name); -// Standard wrapper for do-something-forever thread functions. -// "Forever" really means until the thread is interrupted. -// Use it like: -// new boost::thread(boost::bind(&LoopForever<void (*)()>, "dumpaddr", &DumpAddresses, 900000)); -// or maybe: -// boost::function<void()> f = boost::bind(&FunctionWithArg, argument); -// threadGroup.create_thread(boost::bind(&LoopForever<boost::function<void()> >, "nothing", f, milliseconds)); +/** + * Standard wrapper for do-something-forever thread functions. + * "Forever" really means until the thread is interrupted. + * Use it like: + * new boost::thread(boost::bind(&LoopForever<void (*)()>, "dumpaddr", &DumpAddresses, 900000)); + * or maybe: + * boost::function<void()> f = boost::bind(&FunctionWithArg, argument); + * threadGroup.create_thread(boost::bind(&LoopForever<boost::function<void()> >, "nothing", f, milliseconds)); + */ template <typename Callable> void LoopForever(const char* name, Callable func, int64_t msecs) { std::string s = strprintf("bitcoin-%s", name); @@ -196,7 +200,10 @@ template <typename Callable> void LoopForever(const char* name, Callable func, throw; } } -// .. and a wrapper that just calls func once + +/** + * .. and a wrapper that just calls func once + */ template <typename Callable> void TraceThread(const char* name, Callable func) { std::string s = strprintf("bitcoin-%s", name); diff --git a/src/utilmoneystr.cpp b/src/utilmoneystr.cpp index 267a5b845c..085adae85e 100644 --- a/src/utilmoneystr.cpp +++ b/src/utilmoneystr.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "utilmoneystr.h" diff --git a/src/utilmoneystr.h b/src/utilmoneystr.h index 65415afd3f..6a153db5fa 100644 --- a/src/utilmoneystr.h +++ b/src/utilmoneystr.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. /** diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp index 81e156f43f..d0062d4544 100644 --- a/src/utilstrencodings.cpp +++ b/src/utilstrencodings.cpp @@ -1,24 +1,26 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "utilstrencodings.h" #include "tinyformat.h" -#include <errno.h> -#include <limits> #include <cstdlib> #include <cstring> +#include <errno.h> +#include <limits> using namespace std; -// safeChars chosen to allow simple messages/URLs/email addresses, but avoid anything -// even possibly remotely dangerous like & or > -static string safeChars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 .,;_/:?@()"); string SanitizeString(const string& str) { + /** + * safeChars chosen to allow simple messages/URLs/email addresses, but avoid anything + * even possibly remotely dangerous like & or > + */ + static string safeChars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 .,;_/:?@()"); string strResult; for (std::string::size_type i = 0; i < str.size(); i++) { diff --git a/src/utilstrencodings.h b/src/utilstrencodings.h index 0b8c1a1781..0c0171b894 100644 --- a/src/utilstrencodings.h +++ b/src/utilstrencodings.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. /** @@ -19,7 +19,7 @@ #define UEND(a) ((unsigned char*)&((&(a))[1])) #define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0])) -// This is needed because the foreach macro can't get over the comma in pair<t1, t2> +/** This is needed because the foreach macro can't get over the comma in pair<t1, t2> */ #define PAIRTYPE(t1, t2) std::pair<t1, t2> std::string SanitizeString(const std::string& str); @@ -45,7 +45,7 @@ int atoi(const std::string& str); /** * Convert string to signed 32-bit integer with strict parse error feedback. * @returns true if the entire string could be parsed as valid integer, - * false if not the entire string could be parsed or when overflow or underflow occured. + * false if not the entire string could be parsed or when overflow or underflow occurred. */ bool ParseInt32(const std::string& str, int32_t *out); @@ -74,7 +74,8 @@ inline std::string HexStr(const T& vch, bool fSpaces=false) return HexStr(vch.begin(), vch.end(), fSpaces); } -/** Format a paragraph of text to a fixed width, adding spaces for +/** + * Format a paragraph of text to a fixed width, adding spaces for * indentation to any added line. */ std::string FormatParagraph(const std::string in, size_t width=79, size_t indent=0); diff --git a/src/utiltime.cpp b/src/utiltime.cpp index 78f0342cba..9c137e8aa0 100644 --- a/src/utiltime.cpp +++ b/src/utiltime.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #if defined(HAVE_CONFIG_H) @@ -14,7 +14,7 @@ using namespace std; -static int64_t nMockTime = 0; // For unit testing +static int64_t nMockTime = 0; //! For unit testing int64_t GetTime() { @@ -42,9 +42,12 @@ int64_t GetTimeMicros() void MilliSleep(int64_t n) { -// Boost's sleep_for was uninterruptable when backed by nanosleep from 1.50 -// until fixed in 1.52. Use the deprecated sleep method for the broken case. -// See: https://svn.boost.org/trac/boost/ticket/7238 + +/** + * Boost's sleep_for was uninterruptable when backed by nanosleep from 1.50 + * until fixed in 1.52. Use the deprecated sleep method for the broken case. + * See: https://svn.boost.org/trac/boost/ticket/7238 + */ #if defined(HAVE_WORKING_BOOST_SLEEP_FOR) boost::this_thread::sleep_for(boost::chrono::milliseconds(n)); #elif defined(HAVE_WORKING_BOOST_SLEEP) diff --git a/src/utiltime.h b/src/utiltime.h index 6f82e5a836..9d7d42fe47 100644 --- a/src/utiltime.h +++ b/src/utiltime.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_UTILTIME_H diff --git a/src/version.h b/src/version.h index a1e440de24..a5a72c5467 100644 --- a/src/version.h +++ b/src/version.h @@ -1,59 +1,37 @@ -// Copyright (c) 2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_VERSION_H #define BITCOIN_VERSION_H -#include "clientversion.h" - -#include <string> -#include <vector> - -// -// client versioning -// - -static const int CLIENT_VERSION = - 1000000 * CLIENT_VERSION_MAJOR - + 10000 * CLIENT_VERSION_MINOR - + 100 * CLIENT_VERSION_REVISION - + 1 * CLIENT_VERSION_BUILD; - -extern const std::string CLIENT_NAME; -extern const std::string CLIENT_BUILD; -extern const std::string CLIENT_DATE; - -// -// network protocol versioning -// +/** + * network protocol versioning + */ static const int PROTOCOL_VERSION = 70002; -// initial proto version, to be increased after version/verack negotiation +//! initial proto version, to be increased after version/verack negotiation static const int INIT_PROTO_VERSION = 209; -// In this version, 'getheaders' was introduced. +//! In this version, 'getheaders' was introduced. static const int GETHEADERS_VERSION = 31800; -// disconnect from peers older than this proto version +//! disconnect from peers older than this proto version static const int MIN_PEER_PROTO_VERSION = GETHEADERS_VERSION; -// nTime field added to CAddress, starting with this version; -// if possible, avoid requesting addresses nodes older than this +//! nTime field added to CAddress, starting with this version; +//! if possible, avoid requesting addresses nodes older than this static const int CADDR_TIME_VERSION = 31402; -// only request blocks from nodes outside this range of versions +//! only request blocks from nodes outside this range of versions static const int NOBLKS_VERSION_START = 32000; static const int NOBLKS_VERSION_END = 32400; -// BIP 0031, pong message, is enabled for all versions AFTER this one +//! BIP 0031, pong message, is enabled for all versions AFTER this one static const int BIP0031_VERSION = 60000; -// "mempool" command, enhanced "getdata" behavior starts with this version +//! "mempool" command, enhanced "getdata" behavior starts with this version static const int MEMPOOL_GD_VERSION = 60002; -std::string FormatFullVersion(); -std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector<std::string>& comments); - #endif // BITCOIN_VERSION_H diff --git a/src/wallet.cpp b/src/wallet.cpp index 3812c22fe2..000a088b97 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "wallet.h" @@ -22,18 +22,25 @@ using namespace std; -// Settings +/** + * Settings + */ CFeeRate payTxFee(DEFAULT_TRANSACTION_FEE); unsigned int nTxConfirmTarget = 1; bool bSpendZeroConfChange = true; +bool fSendFreeTransactions = false; +bool fPayAtLeastCustomFee = true; -/** Fees smaller than this (in satoshi) are considered zero fee (for transaction creation) */ -CFeeRate CWallet::minTxFee = CFeeRate(10000); // Override with -mintxfee +/** + * Fees smaller than this (in satoshi) are considered zero fee (for transaction creation) + * Override with -mintxfee + */ +CFeeRate CWallet::minTxFee = CFeeRate(1000); -////////////////////////////////////////////////////////////////////////////// -// -// mapWallet -// +/** @defgroup mapWallet + * + * @{ + */ struct CompareValueOnly { @@ -72,6 +79,7 @@ CPubKey CWallet::GenerateNewKey() SetMinVersion(FEATURE_COMPRPUBKEY); CPubKey pubkey = secret.GetPubKey(); + assert(secret.VerifyPubKey(pubkey)); // Create new metadata int64_t nCreationTime = GetTime(); @@ -367,8 +375,10 @@ void CWallet::SyncMetaData(pair<TxSpends::iterator, TxSpends::iterator> range) } } -// Outpoint is spent if any non-conflicted transaction -// spends it: +/** + * Outpoint is spent if any non-conflicted transaction + * spends it: + */ bool CWallet::IsSpent(const uint256& hash, unsigned int n) const { const COutPoint outpoint(hash, n); @@ -415,15 +425,13 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase) RandAddSeedPerfmon(); vMasterKey.resize(WALLET_CRYPTO_KEY_SIZE); - if (!GetRandBytes(&vMasterKey[0], WALLET_CRYPTO_KEY_SIZE)) - return false; + GetRandBytes(&vMasterKey[0], WALLET_CRYPTO_KEY_SIZE); CMasterKey kMasterKey; RandAddSeedPerfmon(); kMasterKey.vchSalt.resize(WALLET_CRYPTO_SALT_SIZE); - if (!GetRandBytes(&kMasterKey.vchSalt[0], WALLET_CRYPTO_SALT_SIZE)) - return false; + GetRandBytes(&kMasterKey.vchSalt[0], WALLET_CRYPTO_SALT_SIZE); CCrypter crypter; int64_t nStartTime = GetTimeMillis(); @@ -477,7 +485,7 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase) { if (!pwalletdbEncryption->TxnCommit()) { delete pwalletdbEncryption; - // We now have keys encrypted in memory, but no on disk... + // We now have keys encrypted in memory, but not on disk... // die to avoid confusion and let the user reload their unencrypted wallet. assert(false); } @@ -667,9 +675,11 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet) return true; } -// Add a transaction to the wallet, or update it. -// pblock is optional, but should be provided if the transaction is known to be in a block. -// If fUpdate is true, existing transactions will be updated. +/** + * Add a transaction to the wallet, or update it. + * pblock is optional, but should be provided if the transaction is known to be in a block. + * If fUpdate is true, existing transactions will be updated. + */ bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate) { { @@ -911,9 +921,11 @@ bool CWalletTx::WriteToDisk() return CWalletDB(pwallet->strWalletFile).WriteTx(GetHash(), *this); } -// Scan the block chain (starting in pindexStart) for transactions -// from or to us. If fUpdate is true, found transactions that already -// exist in the wallet will be updated. +/** + * Scan the block chain (starting in pindexStart) for transactions + * from or to us. If fUpdate is true, found transactions that already + * exist in the wallet will be updated. + */ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate) { int ret = 0; @@ -1035,15 +1047,15 @@ void CWallet::ResendWalletTransactions() } } +/** @} */ // end of mapWallet - -////////////////////////////////////////////////////////////////////////////// -// -// Actions -// +/** @defgroup Actions + * + * @{ + */ CAmount CWallet::GetBalance() const @@ -1136,7 +1148,9 @@ CAmount CWallet::GetImmatureWatchOnlyBalance() const return nTotal; } -// populate vCoins with vector of available COutputs. +/** + * populate vCoins with vector of available COutputs. + */ void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const CCoinControl *coinControl) const { vCoins.clear(); @@ -1194,7 +1208,7 @@ static void ApproximateBestSubset(vector<pair<CAmount, pair<const CWalletTx*,uns //The solver here uses a randomized algorithm, //the randomness serves no real security purpose but is just //needed to prevent degenerate behavior and it is important - //that the rng fast. We do not use a constant random sequence, + //that the rng is fast. We do not use a constant random sequence, //because there may be some privacy improvement by making //the selection random. if (nPass == 0 ? insecure_rand()&1 : !vfIncluded[i]) @@ -1371,7 +1385,7 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend, { LOCK2(cs_main, cs_wallet); { - nFeeRet = payTxFee.GetFeePerK(); + nFeeRet = 0; while (true) { txNew.vin.clear(); @@ -1491,7 +1505,7 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend, break; // Done, enough fee included. // Too big to send for free? Include more fee and try again: - if (nBytes > MAX_FREE_TRANSACTION_CREATE_SIZE) + if (!fSendFreeTransactions || nBytes > MAX_FREE_TRANSACTION_CREATE_SIZE) { nFeeRet = nFeeNeeded; continue; @@ -1524,7 +1538,9 @@ bool CWallet::CreateTransaction(CScript scriptPubKey, const CAmount& nValue, return CreateTransaction(vecSend, wtxNew, reservekey, nFeeRet, strFailReason, coinControl); } -// Call after CreateTransaction unless you want to abort +/** + * Call after CreateTransaction unless you want to abort + */ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey) { { @@ -1615,6 +1631,12 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, unsigned int nConfirmTarge { // payTxFee is user-set "I want to pay this much" CAmount nFeeNeeded = payTxFee.GetFee(nTxBytes); + // prevent user from paying a non-sense fee (like 1 satoshi): 0 < fee < minRelayFee + if (nFeeNeeded > 0 && nFeeNeeded < ::minRelayTxFee.GetFee(nTxBytes)) + nFeeNeeded = ::minRelayTxFee.GetFee(nTxBytes); + // user selected total at least (default=true) + if (fPayAtLeastCustomFee && nFeeNeeded > 0 && nFeeNeeded < payTxFee.GetFeePerK()) + nFeeNeeded = payTxFee.GetFeePerK(); // User didn't set: use -txconfirmtarget to estimate... if (nFeeNeeded == 0) nFeeNeeded = pool.estimateFee(nConfirmTarget).GetFee(nTxBytes); @@ -1669,7 +1691,7 @@ DBErrors CWallet::ZapWalletTx(std::vector<CWalletTx>& vWtx) setKeyPool.clear(); // Note: can't top-up keypool here, because wallet is locked. // User will be prompted to unlock wallet the next operation - // the requires a new key. + // that requires a new key. } } @@ -1736,10 +1758,10 @@ bool CWallet::SetDefaultKey(const CPubKey &vchPubKey) return true; } -// -// Mark old keypool keys as used, -// and generate all new keys -// +/** + * Mark old keypool keys as used, + * and generate all new keys + */ bool CWallet::NewKeyPool() { { @@ -2120,6 +2142,7 @@ void CWallet::ListLockedCoins(std::vector<COutPoint>& vOutpts) } } +/** @} */ // end of Actions class CAffectedKeysVisitor : public boost::static_visitor<void> { private: diff --git a/src/wallet.h b/src/wallet.h index 768887e0cb..0244ce2368 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -1,6 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2013 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_WALLET_H @@ -26,16 +26,20 @@ #include <utility> #include <vector> -// Settings +/** + * Settings + */ extern CFeeRate payTxFee; extern unsigned int nTxConfirmTarget; extern bool bSpendZeroConfChange; +extern bool fSendFreeTransactions; +extern bool fPayAtLeastCustomFee; -// -paytxfee default +//! -paytxfee default static const CAmount DEFAULT_TRANSACTION_FEE = 0; -// -paytxfee will warn if called with a higher fee than this amount (in satoshis) per KB +//! -paytxfee will warn if called with a higher fee than this amount (in satoshis) per KB static const CAmount nHighTransactionFeeWarning = 0.01 * COIN; -// Largest (in bytes) free transaction we're willing to create +//! Largest (in bytes) free transaction we're willing to create static const unsigned int MAX_FREE_TRANSACTION_CREATE_SIZE = 1000; class CAccountingEntry; @@ -94,7 +98,8 @@ public: StringMap destdata; }; -/** A CWallet is an extension of a keystore, which also maintains a set of transactions and balances, +/** + * A CWallet is an extension of a keystore, which also maintains a set of transactions and balances, * and provides the ability to create new transactions. */ class CWallet : public CCryptoKeyStore, public CValidationInterface @@ -104,18 +109,20 @@ private: CWalletDB *pwalletdbEncryption; - // the current wallet version: clients below this version are not able to load the wallet + //! the current wallet version: clients below this version are not able to load the wallet int nWalletVersion; - // the maximum wallet format version: memory-only variable that specifies to what version this wallet may be upgraded + //! the maximum wallet format version: memory-only variable that specifies to what version this wallet may be upgraded int nWalletMaxVersion; int64_t nNextResend; int64_t nLastResend; - // Used to keep track of spent outpoints, and - // detect and report conflicts (double-spends or - // mutated transactions where the mutant gets mined). + /** + * Used to keep track of spent outpoints, and + * detect and report conflicts (double-spends or + * mutated transactions where the mutant gets mined). + */ typedef std::multimap<COutPoint, uint256> TxSpends; TxSpends mapTxSpends; void AddToSpends(const COutPoint& outpoint, const uint256& wtxid); @@ -124,11 +131,13 @@ private: void SyncMetaData(std::pair<TxSpends::iterator, TxSpends::iterator>); public: - /// Main wallet lock. - /// This lock protects all the fields added by CWallet - /// except for: - /// fFileBacked (immutable after instantiation) - /// strWalletFile (immutable after instantiation) + /* + * Main wallet lock. + * This lock protects all the fields added by CWallet + * except for: + * fFileBacked (immutable after instantiation) + * strWalletFile (immutable after instantiation) + */ mutable CCriticalSection cs_wallet; bool fFileBacked; @@ -188,7 +197,7 @@ public: const CWalletTx* GetWalletTx(const uint256& hash) const; - // check whether we are allowed to upgrade (or already support) to the named feature + //! check whether we are allowed to upgrade (or already support) to the named feature bool CanSupportFeature(enum WalletFeature wf) { AssertLockHeld(cs_wallet); return nWalletMaxVersion >= wf; } void AvailableCoins(std::vector<COutput>& vCoins, bool fOnlyConfirmed=true, const CCoinControl *coinControl = NULL) const; @@ -202,38 +211,40 @@ public: void UnlockAllCoins(); void ListLockedCoins(std::vector<COutPoint>& vOutpts); - // keystore implementation - // Generate a new key + /** + * keystore implementation + * Generate a new key + */ CPubKey GenerateNewKey(); - // Adds a key to the store, and saves it to disk. + //! Adds a key to the store, and saves it to disk. bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey); - // Adds a key to the store, without saving it to disk (used by LoadWallet) + //! Adds a key to the store, without saving it to disk (used by LoadWallet) bool LoadKey(const CKey& key, const CPubKey &pubkey) { return CCryptoKeyStore::AddKeyPubKey(key, pubkey); } - // Load metadata (used by LoadWallet) + //! Load metadata (used by LoadWallet) bool LoadKeyMetadata(const CPubKey &pubkey, const CKeyMetadata &metadata); bool LoadMinVersion(int nVersion) { AssertLockHeld(cs_wallet); nWalletVersion = nVersion; nWalletMaxVersion = std::max(nWalletMaxVersion, nVersion); return true; } - // Adds an encrypted key to the store, and saves it to disk. + //! Adds an encrypted key to the store, and saves it to disk. bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret); - // Adds an encrypted key to the store, without saving it to disk (used by LoadWallet) + //! Adds an encrypted key to the store, without saving it to disk (used by LoadWallet) bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret); bool AddCScript(const CScript& redeemScript); bool LoadCScript(const CScript& redeemScript); - /// Adds a destination data tuple to the store, and saves it to disk + //! Adds a destination data tuple to the store, and saves it to disk bool AddDestData(const CTxDestination &dest, const std::string &key, const std::string &value); - /// Erases a destination data tuple in the store and on disk + //! Erases a destination data tuple in the store and on disk bool EraseDestData(const CTxDestination &dest, const std::string &key); - /// Adds a destination data tuple to the store, without saving it to disk + //! Adds a destination data tuple to the store, without saving it to disk bool LoadDestData(const CTxDestination &dest, const std::string &key, const std::string &value); - /// Look up a destination data tuple in the store, return true if found false otherwise + //! Look up a destination data tuple in the store, return true if found false otherwise bool GetDestData(const CTxDestination &dest, const std::string &key, std::string *value) const; - // Adds a watch-only address to the store, and saves it to disk. + //! Adds a watch-only address to the store, and saves it to disk. bool AddWatchOnly(const CScript &dest); bool RemoveWatchOnly(const CScript &dest); - // Adds a watch-only address to the store, without saving it to disk (used by LoadWallet) + //! Adds a watch-only address to the store, without saving it to disk (used by LoadWallet) bool LoadWatchOnly(const CScript &dest); bool Unlock(const SecureString& strWalletPassphrase); @@ -242,17 +253,19 @@ public: void GetKeyBirthTimes(std::map<CKeyID, int64_t> &mapKeyBirth) const; - /** Increment the next transaction order id - @return next transaction order id + /** + * Increment the next transaction order id + * @return next transaction order id */ int64_t IncOrderPosNext(CWalletDB *pwalletdb = NULL); typedef std::pair<CWalletTx*, CAccountingEntry*> TxPair; typedef std::multimap<int64_t, TxPair > TxItems; - /** Get the wallet's activity log - @return multimap of ordered transactions and accounting entries - @warning Returned pointers are *only* valid within the scope of passed acentries + /** + * Get the wallet's activity log + * @return multimap of ordered transactions and accounting entries + * @warning Returned pointers are *only* valid within the scope of passed acentries */ TxItems OrderedTxItems(std::list<CAccountingEntry>& acentries, std::string strAccount = ""); @@ -320,7 +333,8 @@ public: return true; return false; } - bool IsFromMe(const CTransaction& tx) const // should probably be renamed to IsRelevantToMe + /** should probably be renamed to IsRelevantToMe */ + bool IsFromMe(const CTransaction& tx) const { return (GetDebit(tx, ISMINE_ALL) > 0); } @@ -386,19 +400,20 @@ public: bool SetDefaultKey(const CPubKey &vchPubKey); - // signify that a particular wallet feature is now used. this may change nWalletVersion and nWalletMaxVersion if those are lower + //! signify that a particular wallet feature is now used. this may change nWalletVersion and nWalletMaxVersion if those are lower bool SetMinVersion(enum WalletFeature, CWalletDB* pwalletdbIn = NULL, bool fExplicit = false); - // change which version we're allowed to upgrade to (note that this does not immediately imply upgrading to that format) + //! change which version we're allowed to upgrade to (note that this does not immediately imply upgrading to that format) bool SetMaxVersion(int nVersion); - // get the current wallet format (the oldest client version guaranteed to understand this wallet) + //! get the current wallet format (the oldest client version guaranteed to understand this wallet) int GetVersion() { LOCK(cs_wallet); return nWalletVersion; } - // Get wallet transactions that conflict with given transaction (spend same outputs) + //! Get wallet transactions that conflict with given transaction (spend same outputs) std::set<uint256> GetConflicts(const uint256& txid) const; - /** Address book entry changed. + /** + * Address book entry changed. * @note called with lock cs_wallet held. */ boost::signals2::signal<void (CWallet *wallet, const CTxDestination @@ -406,7 +421,8 @@ public: const std::string &purpose, ChangeType status)> NotifyAddressBookChanged; - /** Wallet transaction added, removed or updated. + /** + * Wallet transaction added, removed or updated. * @note called with lock cs_wallet held. */ boost::signals2::signal<void (CWallet *wallet, const uint256 &hashTx, @@ -517,10 +533,13 @@ public: int SetMerkleBranch(const CBlock& block); - // Return depth of transaction in blockchain: - // -1 : not in blockchain, and not in memory pool (conflicted transaction) - // 0 : in memory pool, waiting to be included in a block - // >=1 : this many blocks deep in the main chain + + /** + * Return depth of transaction in blockchain: + * -1 : not in blockchain, and not in memory pool (conflicted transaction) + * 0 : in memory pool, waiting to be included in a block + * >=1 : this many blocks deep in the main chain + */ int GetDepthInMainChain(const CBlockIndex* &pindexRet) const; int GetDepthInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); } bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChainINTERNAL(pindexRet) > 0; } @@ -528,7 +547,8 @@ public: bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectInsaneFee=true); }; -/** A transaction with a bunch of additional info that only the owner cares about. +/** + * A transaction with a bunch of additional info that only the owner cares about. * It includes any unrecorded transactions needed to link it back to the block chain. */ class CWalletTx : public CMerkleTx @@ -540,11 +560,11 @@ public: mapValue_t mapValue; std::vector<std::pair<std::string, std::string> > vOrderForm; unsigned int fTimeReceivedIsTxTime; - unsigned int nTimeReceived; // time received by this node + unsigned int nTimeReceived; //! time received by this node unsigned int nTimeSmart; char fFromMe; std::string strFromAccount; - int64_t nOrderPos; // position in ordered transaction list + int64_t nOrderPos; //! position in ordered transaction list // memory only mutable bool fDebitCached; @@ -636,7 +656,7 @@ public: } READWRITE(*(CMerkleTx*)this); - std::vector<CMerkleTx> vUnused; // Used to be vtxPrev + std::vector<CMerkleTx> vUnused; //! Used to be vtxPrev READWRITE(vUnused); READWRITE(mapValue); READWRITE(vOrderForm); @@ -661,7 +681,7 @@ public: mapValue.erase("timesmart"); } - // make sure balances are recalculated + //! make sure balances are recalculated void MarkDirty() { fCreditCached = false; @@ -680,7 +700,7 @@ public: MarkDirty(); } - // filter decides which addresses will count towards the debit + //! filter decides which addresses will count towards the debit CAmount GetDebit(const isminefilter& filter) const { if (vin.empty()) @@ -919,8 +939,8 @@ public: int64_t nTimeCreated; int64_t nTimeExpires; std::string strComment; - //// todo: add something to note what created it (user, getnewaddress, change) - //// maybe should have a map<string, string> property map + //! todo: add something to note what created it (user, getnewaddress, change) + //! maybe should have a map<string, string> property map CWalletKey(int64_t nExpires=0); @@ -942,7 +962,8 @@ public: -/** Account information. +/** + * Account information. * Stored in wallet with key "acc"+string account name. */ class CAccount @@ -972,7 +993,8 @@ public: -/** Internal transfers. +/** + * Internal transfers. * Database key is acentry<account><counter>. */ class CAccountingEntry @@ -984,7 +1006,7 @@ public: std::string strOtherAccount; std::string strComment; mapValue_t mapValue; - int64_t nOrderPos; // position in ordered transaction list + int64_t nOrderPos; //! position in ordered transaction list uint64_t nEntryNo; CAccountingEntry() @@ -1009,7 +1031,7 @@ public: inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { if (!(nType & SER_GETHASH)) READWRITE(nVersion); - // Note: strAccount is serialized as part of the key, not here. + //! Note: strAccount is serialized as part of the key, not here. READWRITE(nCreditDebit); READWRITE(nTime); READWRITE(LIMITED_STRING(strOtherAccount, 65536)); diff --git a/src/wallet_ismine.cpp b/src/wallet_ismine.cpp index 07149ebd0b..05dc40aaee 100644 --- a/src/wallet_ismine.cpp +++ b/src/wallet_ismine.cpp @@ -7,6 +7,7 @@ #include "key.h" #include "keystore.h" +#include "script/script.h" #include "script/standard.h" #include <boost/foreach.hpp> diff --git a/src/wallet_ismine.h b/src/wallet_ismine.h index f326b86815..5f0c0c1a01 100644 --- a/src/wallet_ismine.h +++ b/src/wallet_ismine.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef H_BITCOIN_WALLET_ISMINE -#define H_BITCOIN_WALLET_ISMINE +#ifndef BITCOIN_WALLET_ISMINE_H +#define BITCOIN_WALLET_ISMINE_H #include "key.h" #include "script/standard.h" @@ -26,4 +26,4 @@ typedef uint8_t isminefilter; isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey); isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest); -#endif // H_BITCOIN_WALLET_ISMINE +#endif // BITCOIN_WALLET_ISMINE_H |