diff --git a/.gitignore b/.gitignore index d9f334a0e..29ccd6cf9 100644 --- a/.gitignore +++ b/.gitignore @@ -115,3 +115,5 @@ share/BitcoindComparisonTool.jar libbitcoinconsensus.pc wallet-utility +/.cproject +/.project diff --git a/build-aux/m4/bitcoin_find_bdb48.m4 b/build-aux/m4/bitcoin_find_bdb48.m4 index 0bf558d25..817a475d6 100644 --- a/build-aux/m4/bitcoin_find_bdb48.m4 +++ b/build-aux/m4/bitcoin_find_bdb48.m4 @@ -1,9 +1,9 @@ -AC_DEFUN([BITCOIN_FIND_BDB48],[ +AC_DEFUN([BITCOIN_FIND_BDB53],[ AC_MSG_CHECKING([for Berkeley DB C++ headers]) BDB_CPPFLAGS= BDB_LIBS= bdbpath=X - bdb48path=X + bdb53path=X bdbdirlist= for _vn in 4.8 48 4 5 ''; do for _pfx in b lib ''; do @@ -15,8 +15,8 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <${searchpath}db_cxx.h> ]],[[ - #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) - #error "failed to find bdb 4.8+" + #if !(DB_VERSION_MAJOR == 5) + #error "failed to find bdb 5+" #endif ]])],[ if test "x$bdbpath" = "xX"; then @@ -28,32 +28,32 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <${searchpath}db_cxx.h> ]],[[ - #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) - #error "failed to find bdb 4.8" + #if !(DB_VERSION_MAJOR == 5 && DB_VERSION_MINOR == 3) + #error "failed to find bdb 5.3" #endif ]])],[ - bdb48path="${searchpath}" + bdb53path="${searchpath}" break ],[]) done if test "x$bdbpath" = "xX"; then AC_MSG_RESULT([no]) AC_MSG_ERROR([libdb_cxx headers missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) - elif test "x$bdb48path" = "xX"; then + elif test "x$bdb53path" = "xX"; then BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx) - AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[ - AC_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) + AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 5.3])],[ + AC_MSG_WARN([Found Berkeley DB other than 5.3; wallets opened by this build will not be portable!]) ],[ - AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) + AC_MSG_ERROR([Found Berkeley DB other than 5.3, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) ]) else - BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) - bdbpath="${bdb48path}" + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb53path}],db_cxx) + bdbpath="${bdb53path}" fi AC_SUBST(BDB_CPPFLAGS) # TODO: Ideally this could find the library version and make sure it matches the headers being used - for searchlib in db_cxx-4.8 db_cxx; do + for searchlib in db_cxx-5.3 db_cxx; do AC_CHECK_LIB([$searchlib],[main],[ BDB_LIBS="-l${searchlib}" break diff --git a/configure.ac b/configure.ac index 0e9e64fb3..75d8937a7 100644 --- a/configure.ac +++ b/configure.ac @@ -282,9 +282,9 @@ case $host in dnl add default macports paths CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" LIBS="$LIBS -L/opt/local/lib" - if test -d /opt/local/include/db48; then - CPPFLAGS="$CPPFLAGS -I/opt/local/include/db48" - LIBS="$LIBS -L/opt/local/lib/db48" + if test -d /opt/local/include/db53; then + CPPFLAGS="$CPPFLAGS -I/opt/local/include/db53" + LIBS="$LIBS -L/opt/local/lib/db53" fi fi @@ -297,7 +297,7 @@ case $host in dnl the user (--without-wallet or --without-gui for example). openssl_prefix=`$BREW --prefix openssl 2>/dev/null` - bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null` + bdb_prefix=`$BREW --prefix berkeley-db5 2>/dev/null` qt5_prefix=`$BREW --prefix qt5 2>/dev/null` if test x$openssl_prefix != x; then PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" @@ -533,7 +533,7 @@ AC_SUBST(LIBMEMENV) if test x$enable_wallet != xno; then dnl Check for libdb_cxx only if wallet enabled - BITCOIN_FIND_BDB48 + BITCOIN_FIND_BDB53 fi dnl Check for libminiupnpc (optional) diff --git a/contrib/debian/control b/contrib/debian/control index fce6bc011..d615b318a 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -9,7 +9,7 @@ Build-Depends: debhelper, libtool, bash-completion, libboost-system-dev (>> 1.35) | libboost-system1.35-dev, - libdb4.8++-dev, + libdb++-dev, libssl-dev, pkg-config, libminiupnpc8-dev | libminiupnpc-dev (>> 1.6), diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index b761b237f..120eb7481 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -26,7 +26,7 @@ files: [] script: | WRAP_DIR=$HOME/wrapped HOSTS="i686-pc-linux-gnu x86_64-unknown-linux-gnu" - CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests LDFLAGS=-static-libstdc++" + CONFIGFLAGS="--enable-upnp-default --enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests LDFLAGS=-static-libstdc++" FAKETIME_HOST_PROGS="" FAKETIME_PROGS="date ar ranlib nm strip" diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index ef8af2e3a..7e9da9727 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -30,7 +30,7 @@ files: script: | WRAP_DIR=$HOME/wrapped HOSTS="x86_64-apple-darwin11" - CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests GENISOIMAGE=$WRAP_DIR/genisoimage" + CONFIGFLAGS="--enable-upnp-default --enable-reduce-exports --disable-bench --disable-gui-tests GENISOIMAGE=$WRAP_DIR/genisoimage" FAKETIME_HOST_PROGS="" FAKETIME_PROGS="ar ranlib date dmg genisoimage" diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index 7c8258448..af7a80cec 100644 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -29,7 +29,7 @@ files: [] script: | WRAP_DIR=$HOME/wrapped HOSTS="x86_64-w64-mingw32 i686-w64-mingw32" - CONFIGFLAGS="--enable-reduce-exports --disable-gui-tests" + CONFIGFLAGS="--enable-upnp-default --enable-reduce-exports --disable-gui-tests" FAKETIME_HOST_PROGS="g++ ar ranlib nm windres strip" FAKETIME_PROGS="date makensis zip" diff --git a/contrib/gitian-downloader/jonasschnelli-key.pgp b/contrib/gitian-downloader/jonasschnelli-key.pgp index 3831eaea1..8a9cc58c2 100644 --- a/contrib/gitian-downloader/jonasschnelli-key.pgp +++ b/contrib/gitian-downloader/jonasschnelli-key.pgp @@ -1,110 +1,110 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -mQINBFSBrDIBEACrZEqObmtlTf7fOKttE39qqisFfMg0VeEPS37uETMGYsgTEvzv -kfMsXCGsGFLQ78XsHqUeW4uQrtpJH3nUP/Sua1Q12K3lNKTSvVQyEpKoPJwXZahp -jm6GA1ApDxZ/KlmxyobR3X0urnMYNZobl5IKJXlxoKGl4OkGNeFlh42pCXZDnR9n -1Y17ZcDdybkWcqPbDAz8ilOQcFMhDBFg3Di3IVMAaDZP1uwWFb5vx60YB5NhkOpF -nZUH09NJx/7u7QdGPSHOdzW4Xo1HUYtYNDkdOvgZtxpbYEFIaBtVBURMUGwAFagA -3a6qaGnCBWEQftyISLiqcKqKqXudOg/cLa1CAiQFkz+IBhY9BCGDRnB8Dcae6EGI -Djt2lqZTuMSiheTWeNFMGBioHfPLedcwae8KflrIBC+hNS4ay6HJdIc03WMQ4JKK -At8Y8CRLym30/RlqZ2v8CHYqg9Ddlz3+g5JkRKaJTQwFRcX46/tAX+I2NZ8Ra1ea -rF5cRHuCk/oaw5ZXYhj4zJO74rjAoSewAARlrTMSM541atJU1u6aWT7rNiF9QKIj -i8vEufUxN0YfdmvDD3OXwbO7GnfWXS4sPklFIRACp+Y4ib+QnRY0/qGE0yh3RAG4 -r/dyIQ1m3z7Pc9eyPKAhE4S7SxAwoR4yOqQ5NAfZXgFuqWzkW51gkQgGzQARAQAB -tCtKb25hcyBTY2huZWxsaSA8am9uYXMuc2NobmVsbGlAaW5jbHVkZTcuY2g+iQI+ -BBMBAgAoBQJUgawyAhsDBQkDwmcABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK -CRAicOMMUic59iKUD/93DF04C3lptLjtrhyd4wgpBMJV8yzagGyG+Wk0UR7elQw4 -F1MIvEtIFpuGrcnNfKcqeGGmnnKFTeBjkmgcYvej2fW9XlRA1HgIS0t0ttDv8uVX -vy1xVj1qISB+17EiftxJjCOl2pZFEVpLQ7sSgqnVRMsCS45ag6rioGxtq1j3ifQN -TENnJWhzOXvwzZhLgsyWLjeYvTDbzfAQLpZFowAMibOwu6ObCkn4dhaW+lI3AnPu -76pLsrOljqGvXes6o2d28vjqMrlmsz2xVEJ4bnRPUbLv3bUl6t+19XpiMj94ZCZX -/kvepzSNAs+aYvoldFn0/8haU5wIDXO/zgXSlm4KnhaDf1zutVq/Ng6TGb66mZKc -RoiGHnnuQ45e7VIXRfOmgbbUTUIg+h4YvgCTR8dMoOWpd5AL8lZ3bjYVi1yFd+p1 -dPfrrnN9Yd5ojoZBSrV2j1wLgv7jRIeXL5dWzeAs/JBzltAHWO+9O6NsYXtRTUky -eQa+oBKG1OsEXf63k8PgQf6Nw+di3gy23tKEiCz8lbA2MtekxaZ9Xu9CSEEPIH7t -Aoki6Ey6rD1NUZQPuxQ3aCUTRE2JK4b6nPuAsOEv+cZL0VxNENpbedtGPh4aAA8U -9yvBykWIjRS95k4NDVKIdzhd1geJsUJZq4BKh9Atf/kI+Gb0sqq2Lrf8a1pNX7kC -DQRUgawyARAAwLiAxqv7PsdtJg8tBO+dAnTYtAtBHn8g5GlXtorymB9Aqy0Nzpd1 -de27dYlBdlWdHZavMh27JieZ4rk++74SMAo0PACp6FDnfuu2PmJZTr/Bzvld+B9+ -lOZrMWwDIVSW1npJGUjF1rjgPjvmcGo/IreVFpJ0A33J1p/qsYZsLTXTDDoz0fq8 -3XvwTlkTOkuk6Z6LPo2feDHYydUmdG+9MrgIMpidvywRHRC8nnkix/aX0S72kZuR -qvWwSVs229gtfuWHfvmaQgbugZMqANla3ZYdzExhIIizu7qQPXSYfhsCoywWE2So -9QXZIiVJge2P/hUr2gTiRNTfmhupDeqb1E+i7x9txTrNc40gbTu3qs3/fjKIWrXw -Dy5tuZsviLQnEQtY4sEnHl7oL1crOuIHjZfgZfoZ5CK+jqb2b0B9uIm/SMl6Kt8S -m6ZtK0QTjtUSIputPEYdLycdOpWDDtAHrWkTlRzKJoLG4hsywBAgQe7n9nLf7Zmi -DhXyXRKyJuuuG5mt7UZhjW95loFFVcGXHIxNmxVqNb1YaG3kEa9PdQMoOc0hRZb9 -77yaGfpLV8Vo4CB1eAuVU0UdNRyChrZK5dKXBN/0uZq5HgpI1GiK/C3YUuQI3t9p -zeJYD3jPGYCI9xxLaqt7whoOILPmZ1KW2UfXTvcMgBUMkFpZrqhTGscAEQEAAYkC -JQQYAQIADwUCVIGsMgIbDAUJA8JnAAAKCRAicOMMUic59oqeD/9SvgUx60AhyCPl -1G64eII9M2LU4vmHj8g6wnjh3xaWXvlQU1xnz/5I0XrlbHm31ExEHK+7Zla4AQ/P -OrJhMNZh9oes3iOh+pAEn/vtixddM/oiivLBxMcIzq31PS8lZWrAjqOX/FFYa8GM -NZI0bNWu92J7cL/bRVwsIVUXh2DkUu7wXwicNERYkKDTBaK7FE06C/hIGTwmENlR -b1+H7e00nzWqoHyd0fhG7d8RaF2IF95YH5+r+aS20cHVCTI/0Z32FmlnCA6QlkZx -JZiXKssHLpegeegAOOR3t2keB5rN4J/8KSzIEWUG5sjXkshMIM7w1a6urc/iE9PW -YGgbG7Wt1AcEO5cnU72DzoENrOxRKdFLZWemLbncLPTY2GERPutJgDSYvaxmwnQy -eGsnRIOmAMgN9+8NEs9wZnzrYpkvk/Vw1FwNcCCUYb0ZPYoRVRhP2UXYm7OxdKdk -zPXfS7Uqs9oto1FiD7iomhtBs+RW8ndaO9wHGoCn2/UAD9fxNIkTQvK61amyjGX3 -gdwrOwt73I+wjgt78jmZsKfnPWYnOIUg2/12P4iB6KhWD8MIIeFLl9TFfZ8f06WV -WIUTcA4cgSYgGOScxB0En+B3LDCkmVabu/JzBedT9N8rXvgdywk2UR4vKqiyJT1O -9ArEfToN7J0gclhUoadr0im67BGyMZkCDQRVXu6kARAAwR/cg0kJja6u1YToEM+g -SOOPZK6Bn745y0cvf6+YFVefLcManUCyI+/DWZhO+D/im569MApbTz1qdaLE54Kh -z2CtOJBlWP8cjlnVZ95hBK+Z9COuk60dXI7DySRn3DVryNpYjRCe+8SBTQJSj8b0 -JEk5VVYPYUOIc3L6g7LBL2/ycxV3LVFTQ/A9LGBev7y2emgC7lqkPPoDU1vJeO1N -4G0nFsIxuml81pfgi/2aMbGF8l7LVAI8qMc0c4RAjL/yTPzVX5qq5+zAaXMcyhgy -yqOvlXlCG9aisnmPCEiShxmLvGfGdPmi+apxZNUW3384vVcOxzl1VcU6sVZT30/a -Jaa8RxZqC6S5kOr7uPO8CD1wB1rXzD8SA4Adcq9SwOkVE7QfnQi6+BIgdrsLKUfg -2vBjcgA/IsLETlnp2792m3w01OKe2/w9Uq3N45lWVTNVx2UcbWAIz6bwWoMDJ1DN -B4XQHb5Ag+VI7lIGr45Ep4ohOfIcpBCMa1WVGyTYoQFc66mPZ2MotADOHtgGpm6v -ZyJEp2qWj0at+tDepf0bFPHmGGhVj+N4HTBWMzsu3sLCAh3QWStr+gkffUl2CsdG -Y3RL6kVkCCW0o/o+V0mc8ZV8kAtFPyYGllsP9HEvjeXkHg+DAvRFZhSPI1mxGkGg -gZlEtHqZ9Lofoco9wedCJPEAEQEAAbQlSm9uYXMgU2NobmVsbGkgPGRldkBqb25h -c3NjaG5lbGxpLmNoPokCPgQTAQIAKAUCVV7upAIbAwUJCWYBgAYLCQgHAwIGFQgC -CQoLBBYCAwECHgECF4AACgkQKdS8tkFvU+ytjhAAwQqTK7pSjSSK91QZAvsV+CgN -AzC8AydcdpWAnJpsE+nw76snAexMctDfae9uPSGSVM9PAgouUg2YJxNd9RzPCv7j -vx3bevO3ArNZxvdKSXffPVzt01j53z99/Ltmev5rpIcNQk2nqL3iZaZ5O7Vxre8k -H5KxncFCUxlnX/stLz9WOmnIN1X5qVq3lSzh8xvm7DuyOmi1Z94GHCW4BHN6wxtX -nXqYeI45jPcbuJWC8P8qtNicZ0N2XLjpAoLSvQ68VTrvvLN0X2HT9Ol9y5t7re8J -PEY52TvrPCLYz4hQD0fPe3w14LkcdbWTjJwQ3Y7KWd67SOn+l8VDPj2jT0yDBDG2 -YazByLqV29SgXm9WsfYXYF4FB9NSApbrAmhTWVa4K4DFXrLvcIpaIR4Ii3JQZDag -2tO1VTgxF+10S66qrwXwawBbGfDVchWgSi9T1hNn2wgLypsLN1ZDy7ixPCD+SHHd -xgTN8yv+/WNRNZ+LtUKNCIBHQmUBesNfN+wOrvOoWPAP6XjlUIlA2RIH6zKcNbDb -a4jjx1ENiHAlapVxzPTQiTfj0TDRXBdjboiswXfkN76upHdgdMdeFz9hiH0PSbxA -TmlmA7NrsENHLp89SB/gnGT2I/lLP5/DsoN3Qv8GCoy7aUNDT7abi1AeoBVVye2c -AL3d+hDPgOzJHjf0eJGJAhwEEAECAAYFAlZFyF4ACgkQInDjDFInOfZtGg//f4xQ -PvS6gQdIosesV458LtIUnrqdPx/8PGnIbkObSzjevEoj3RQ+D7PHvF57lj6m45aB -Tr6huXC2RQzOIjRXM9dYi6SVZzQ1xnjMep72ylVYawQS3VBeuQbhU2BgYTeLa55+ -0sHBA/hX9ufH7a3UvSTgvssX44SH5mGg2h4I3O+4cNQIDf/G7xkzkJKcQmATRmIR -10JaaBKtx4JVNVzCWTOpEqW6/QA8X94LapK8Rh/mhKyd38v3CEHI7hH0ex0o2mOF -kAsPY1vvfxWzGKMolJp1b/1FPcb7Fl+nCoqlfnv0cCnZYsQvYXrOs/1Kj0anv9yR -iutEp2DyaAnhadadrFpWjXQNUeYtFlJ1aC+6HO//uw2spKFqcQ4tTvu9HgHJO1gn -GTsmDskwXqHOYNvH9QjtwlhPhOWQdHgLPrWBiUBvkT9H8uoNRGWg0VGA4J51IkRh -0ZyoLmRgejpj7SOpwLX6gemprn0Z4fgohKyj6z4/Bop2gliXSPB37qdun6M92g8m -SkxaEXF2ZyIXdeVRT6Xgp+zoGDNbMG3PlhZiFFCvH3Hk8o9zAz/65de6D+14EHYj -WBRKfu7jaL2RSwUSRwRAAYKwu6kgRy8G7+4SihuSHT2k/90il6iwpzXdyY7qQXWG -VxfrmGWZLYT0u7d+EZ1pc02UKYCFptlVCIZtaQK5Ag0EVV7upAEQAKpWFoCqFFqQ -5xH6+TFvbUFWBb1dWy89GMXCkmqAsoy8Ss2Ru8gNuy7Xt4l1dQhVpN0QWiuVGkEO -f2PmXQhnLquaSz7XLZjjdO5E3kYzcwOpIbb2TCWH4QQtHEotowRslQAXAZ53jN9u -NIEQHCPPBNocj0CLQmZl+av1MqRJrRcYzgkPIs34mBo6iVoRrD5CkSohbz01BMWJ -ZLk0E+JvalML7+ttiwu+gI90uRGiKEz5xsDMtyx0mAcAm+/EjcuQbhGrD6p7dLKv -9nuUU/T743N2LoDTBMzvX/JXjoQ/uS1nzuiJrc/vYHqy9uucgviuYWFH/Q+LhwMr -6tjJYUiN4JIQ85OLvq6g71RnpWzy3ce25HL1YWbLNuzi8ZKIB/sL4LXG2iTwwSFk -tVjfAc4zP/VWpRC5VbxG76atRkPLatgA6b2sawgQ6L/7XB5Wd5F0bJc3ndwPBKos -FFXgzOBgOkI6kYERQo8h2GzWfU8LWxl0a420ZHEfUZoYmitg/evA3v+23FrCMGg6 -2cdNzU5/mqsQ5HWktTQ5BZQZyn5UT3zpNCOVyeZc/ezzGXcWbEXOLQwDcolxjatL -ED3eNA1OMQD8S++FPPGCukIzCyYiPq49zJCTMCWd3qTt2Bwea9xOQnoetCTU9goX -/eEGj/1zQDAXCGOVgdd34VrOX4qtpmp3ABEBAAGJAiUEGAECAA8FAlVe7qQCGwwF -CQlmAYAACgkQKdS8tkFvU+xj8Q//VNzFYM/kyHSa0xio4e8vBZA2vmR8IEUmtOSR -zr487Z8W1dapGxR7OLQ52oWdRZVpG1B5rCuJtsWbjdY94Y8RpcO6FBemneGebBhu -UKc60qwEanYnZva9PEFNyBzpj3xk3Ms7K4O2dZTcXPGj+hlep9Tjo09sklqbKfgW -2fCUu2EKXWwUrnZ2LZtb/Ya8WPCrsbJFk+WbrLhWt7jIsadVl4AfblcgBGb8aN98 -GxnYOh+TGSMJtq1NSfchQwLHrpTPYm4McAwOBBYDdA+ik3//eLbwRiX9szFk658p -+4LErMBJAKLreSluBkqOG3AzT22Hdffvl8G2U4WhPPG33NzWomb+wKohjjzMVUlx -YRCO57wkURqEW9/+a4riuBWGQqqRsW1wHEMu1lYdAhLJ5f0s3vO/fVe43ktaXNjW -6k+mXDlIdKkQgQ736sBk3DAUc+YcmWmStPr1+TtT91eC23GLWP7gVDnNGEOBOscw -U+m1bEOJN2duAMJSRK7U0r2ipmRKDcwK9XmVpJcTePfB2l+T3RdHEZIOlaTELEX6 -WJfpU4Kc1KJeKdp+l9gf2JD8eOZAlwxA4r2wxyzoCVg1Bk3XiBfoI7Gl78Wysp+/ -ChQcErPJWEUglBfrESpqmjxH/qSy6yjyNmd4Az2ii7IzWILfuheZR4drjHQj6mCA -S5rowLE= -=ZVPf +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQINBFSBrDIBEACrZEqObmtlTf7fOKttE39qqisFfMg0VeEPS37uETMGYsgTEvzv +kfMsXCGsGFLQ78XsHqUeW4uQrtpJH3nUP/Sua1Q12K3lNKTSvVQyEpKoPJwXZahp +jm6GA1ApDxZ/KlmxyobR3X0urnMYNZobl5IKJXlxoKGl4OkGNeFlh42pCXZDnR9n +1Y17ZcDdybkWcqPbDAz8ilOQcFMhDBFg3Di3IVMAaDZP1uwWFb5vx60YB5NhkOpF +nZUH09NJx/7u7QdGPSHOdzW4Xo1HUYtYNDkdOvgZtxpbYEFIaBtVBURMUGwAFagA +3a6qaGnCBWEQftyISLiqcKqKqXudOg/cLa1CAiQFkz+IBhY9BCGDRnB8Dcae6EGI +Djt2lqZTuMSiheTWeNFMGBioHfPLedcwae8KflrIBC+hNS4ay6HJdIc03WMQ4JKK +At8Y8CRLym30/RlqZ2v8CHYqg9Ddlz3+g5JkRKaJTQwFRcX46/tAX+I2NZ8Ra1ea +rF5cRHuCk/oaw5ZXYhj4zJO74rjAoSewAARlrTMSM541atJU1u6aWT7rNiF9QKIj +i8vEufUxN0YfdmvDD3OXwbO7GnfWXS4sPklFIRACp+Y4ib+QnRY0/qGE0yh3RAG4 +r/dyIQ1m3z7Pc9eyPKAhE4S7SxAwoR4yOqQ5NAfZXgFuqWzkW51gkQgGzQARAQAB +tCtKb25hcyBTY2huZWxsaSA8am9uYXMuc2NobmVsbGlAaW5jbHVkZTcuY2g+iQI+ +BBMBAgAoBQJUgawyAhsDBQkDwmcABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK +CRAicOMMUic59iKUD/93DF04C3lptLjtrhyd4wgpBMJV8yzagGyG+Wk0UR7elQw4 +F1MIvEtIFpuGrcnNfKcqeGGmnnKFTeBjkmgcYvej2fW9XlRA1HgIS0t0ttDv8uVX +vy1xVj1qISB+17EiftxJjCOl2pZFEVpLQ7sSgqnVRMsCS45ag6rioGxtq1j3ifQN +TENnJWhzOXvwzZhLgsyWLjeYvTDbzfAQLpZFowAMibOwu6ObCkn4dhaW+lI3AnPu +76pLsrOljqGvXes6o2d28vjqMrlmsz2xVEJ4bnRPUbLv3bUl6t+19XpiMj94ZCZX +/kvepzSNAs+aYvoldFn0/8haU5wIDXO/zgXSlm4KnhaDf1zutVq/Ng6TGb66mZKc +RoiGHnnuQ45e7VIXRfOmgbbUTUIg+h4YvgCTR8dMoOWpd5AL8lZ3bjYVi1yFd+p1 +dPfrrnN9Yd5ojoZBSrV2j1wLgv7jRIeXL5dWzeAs/JBzltAHWO+9O6NsYXtRTUky +eQa+oBKG1OsEXf63k8PgQf6Nw+di3gy23tKEiCz8lbA2MtekxaZ9Xu9CSEEPIH7t +Aoki6Ey6rD1NUZQPuxQ3aCUTRE2JK4b6nPuAsOEv+cZL0VxNENpbedtGPh4aAA8U +9yvBykWIjRS95k4NDVKIdzhd1geJsUJZq4BKh9Atf/kI+Gb0sqq2Lrf8a1pNX7kC +DQRUgawyARAAwLiAxqv7PsdtJg8tBO+dAnTYtAtBHn8g5GlXtorymB9Aqy0Nzpd1 +de27dYlBdlWdHZavMh27JieZ4rk++74SMAo0PACp6FDnfuu2PmJZTr/Bzvld+B9+ +lOZrMWwDIVSW1npJGUjF1rjgPjvmcGo/IreVFpJ0A33J1p/qsYZsLTXTDDoz0fq8 +3XvwTlkTOkuk6Z6LPo2feDHYydUmdG+9MrgIMpidvywRHRC8nnkix/aX0S72kZuR +qvWwSVs229gtfuWHfvmaQgbugZMqANla3ZYdzExhIIizu7qQPXSYfhsCoywWE2So +9QXZIiVJge2P/hUr2gTiRNTfmhupDeqb1E+i7x9txTrNc40gbTu3qs3/fjKIWrXw +Dy5tuZsviLQnEQtY4sEnHl7oL1crOuIHjZfgZfoZ5CK+jqb2b0B9uIm/SMl6Kt8S +m6ZtK0QTjtUSIputPEYdLycdOpWDDtAHrWkTlRzKJoLG4hsywBAgQe7n9nLf7Zmi +DhXyXRKyJuuuG5mt7UZhjW95loFFVcGXHIxNmxVqNb1YaG3kEa9PdQMoOc0hRZb9 +77yaGfpLV8Vo4CB1eAuVU0UdNRyChrZK5dKXBN/0uZq5HgpI1GiK/C3YUuQI3t9p +zeJYD3jPGYCI9xxLaqt7whoOILPmZ1KW2UfXTvcMgBUMkFpZrqhTGscAEQEAAYkC +JQQYAQIADwUCVIGsMgIbDAUJA8JnAAAKCRAicOMMUic59oqeD/9SvgUx60AhyCPl +1G64eII9M2LU4vmHj8g6wnjh3xaWXvlQU1xnz/5I0XrlbHm31ExEHK+7Zla4AQ/P +OrJhMNZh9oes3iOh+pAEn/vtixddM/oiivLBxMcIzq31PS8lZWrAjqOX/FFYa8GM +NZI0bNWu92J7cL/bRVwsIVUXh2DkUu7wXwicNERYkKDTBaK7FE06C/hIGTwmENlR +b1+H7e00nzWqoHyd0fhG7d8RaF2IF95YH5+r+aS20cHVCTI/0Z32FmlnCA6QlkZx +JZiXKssHLpegeegAOOR3t2keB5rN4J/8KSzIEWUG5sjXkshMIM7w1a6urc/iE9PW +YGgbG7Wt1AcEO5cnU72DzoENrOxRKdFLZWemLbncLPTY2GERPutJgDSYvaxmwnQy +eGsnRIOmAMgN9+8NEs9wZnzrYpkvk/Vw1FwNcCCUYb0ZPYoRVRhP2UXYm7OxdKdk +zPXfS7Uqs9oto1FiD7iomhtBs+RW8ndaO9wHGoCn2/UAD9fxNIkTQvK61amyjGX3 +gdwrOwt73I+wjgt78jmZsKfnPWYnOIUg2/12P4iB6KhWD8MIIeFLl9TFfZ8f06WV +WIUTcA4cgSYgGOScxB0En+B3LDCkmVabu/JzBedT9N8rXvgdywk2UR4vKqiyJT1O +9ArEfToN7J0gclhUoadr0im67BGyMZkCDQRVXu6kARAAwR/cg0kJja6u1YToEM+g +SOOPZK6Bn745y0cvf6+YFVefLcManUCyI+/DWZhO+D/im569MApbTz1qdaLE54Kh +z2CtOJBlWP8cjlnVZ95hBK+Z9COuk60dXI7DySRn3DVryNpYjRCe+8SBTQJSj8b0 +JEk5VVYPYUOIc3L6g7LBL2/ycxV3LVFTQ/A9LGBev7y2emgC7lqkPPoDU1vJeO1N +4G0nFsIxuml81pfgi/2aMbGF8l7LVAI8qMc0c4RAjL/yTPzVX5qq5+zAaXMcyhgy +yqOvlXlCG9aisnmPCEiShxmLvGfGdPmi+apxZNUW3384vVcOxzl1VcU6sVZT30/a +Jaa8RxZqC6S5kOr7uPO8CD1wB1rXzD8SA4Adcq9SwOkVE7QfnQi6+BIgdrsLKUfg +2vBjcgA/IsLETlnp2792m3w01OKe2/w9Uq3N45lWVTNVx2UcbWAIz6bwWoMDJ1DN +B4XQHb5Ag+VI7lIGr45Ep4ohOfIcpBCMa1WVGyTYoQFc66mPZ2MotADOHtgGpm6v +ZyJEp2qWj0at+tDepf0bFPHmGGhVj+N4HTBWMzsu3sLCAh3QWStr+gkffUl2CsdG +Y3RL6kVkCCW0o/o+V0mc8ZV8kAtFPyYGllsP9HEvjeXkHg+DAvRFZhSPI1mxGkGg +gZlEtHqZ9Lofoco9wedCJPEAEQEAAbQlSm9uYXMgU2NobmVsbGkgPGRldkBqb25h +c3NjaG5lbGxpLmNoPokCPgQTAQIAKAUCVV7upAIbAwUJCWYBgAYLCQgHAwIGFQgC +CQoLBBYCAwECHgECF4AACgkQKdS8tkFvU+ytjhAAwQqTK7pSjSSK91QZAvsV+CgN +AzC8AydcdpWAnJpsE+nw76snAexMctDfae9uPSGSVM9PAgouUg2YJxNd9RzPCv7j +vx3bevO3ArNZxvdKSXffPVzt01j53z99/Ltmev5rpIcNQk2nqL3iZaZ5O7Vxre8k +H5KxncFCUxlnX/stLz9WOmnIN1X5qVq3lSzh8xvm7DuyOmi1Z94GHCW4BHN6wxtX +nXqYeI45jPcbuJWC8P8qtNicZ0N2XLjpAoLSvQ68VTrvvLN0X2HT9Ol9y5t7re8J +PEY52TvrPCLYz4hQD0fPe3w14LkcdbWTjJwQ3Y7KWd67SOn+l8VDPj2jT0yDBDG2 +YazByLqV29SgXm9WsfYXYF4FB9NSApbrAmhTWVa4K4DFXrLvcIpaIR4Ii3JQZDag +2tO1VTgxF+10S66qrwXwawBbGfDVchWgSi9T1hNn2wgLypsLN1ZDy7ixPCD+SHHd +xgTN8yv+/WNRNZ+LtUKNCIBHQmUBesNfN+wOrvOoWPAP6XjlUIlA2RIH6zKcNbDb +a4jjx1ENiHAlapVxzPTQiTfj0TDRXBdjboiswXfkN76upHdgdMdeFz9hiH0PSbxA +TmlmA7NrsENHLp89SB/gnGT2I/lLP5/DsoN3Qv8GCoy7aUNDT7abi1AeoBVVye2c +AL3d+hDPgOzJHjf0eJGJAhwEEAECAAYFAlZFyF4ACgkQInDjDFInOfZtGg//f4xQ +PvS6gQdIosesV458LtIUnrqdPx/8PGnIbkObSzjevEoj3RQ+D7PHvF57lj6m45aB +Tr6huXC2RQzOIjRXM9dYi6SVZzQ1xnjMep72ylVYawQS3VBeuQbhU2BgYTeLa55+ +0sHBA/hX9ufH7a3UvSTgvssX44SH5mGg2h4I3O+4cNQIDf/G7xkzkJKcQmATRmIR +10JaaBKtx4JVNVzCWTOpEqW6/QA8X94LapK8Rh/mhKyd38v3CEHI7hH0ex0o2mOF +kAsPY1vvfxWzGKMolJp1b/1FPcb7Fl+nCoqlfnv0cCnZYsQvYXrOs/1Kj0anv9yR +iutEp2DyaAnhadadrFpWjXQNUeYtFlJ1aC+6HO//uw2spKFqcQ4tTvu9HgHJO1gn +GTsmDskwXqHOYNvH9QjtwlhPhOWQdHgLPrWBiUBvkT9H8uoNRGWg0VGA4J51IkRh +0ZyoLmRgejpj7SOpwLX6gemprn0Z4fgohKyj6z4/Bop2gliXSPB37qdun6M92g8m +SkxaEXF2ZyIXdeVRT6Xgp+zoGDNbMG3PlhZiFFCvH3Hk8o9zAz/65de6D+14EHYj +WBRKfu7jaL2RSwUSRwRAAYKwu6kgRy8G7+4SihuSHT2k/90il6iwpzXdyY7qQXWG +VxfrmGWZLYT0u7d+EZ1pc02UKYCFptlVCIZtaQK5Ag0EVV7upAEQAKpWFoCqFFqQ +5xH6+TFvbUFWBb1dWy89GMXCkmqAsoy8Ss2Ru8gNuy7Xt4l1dQhVpN0QWiuVGkEO +f2PmXQhnLquaSz7XLZjjdO5E3kYzcwOpIbb2TCWH4QQtHEotowRslQAXAZ53jN9u +NIEQHCPPBNocj0CLQmZl+av1MqRJrRcYzgkPIs34mBo6iVoRrD5CkSohbz01BMWJ +ZLk0E+JvalML7+ttiwu+gI90uRGiKEz5xsDMtyx0mAcAm+/EjcuQbhGrD6p7dLKv +9nuUU/T743N2LoDTBMzvX/JXjoQ/uS1nzuiJrc/vYHqy9uucgviuYWFH/Q+LhwMr +6tjJYUiN4JIQ85OLvq6g71RnpWzy3ce25HL1YWbLNuzi8ZKIB/sL4LXG2iTwwSFk +tVjfAc4zP/VWpRC5VbxG76atRkPLatgA6b2sawgQ6L/7XB5Wd5F0bJc3ndwPBKos +FFXgzOBgOkI6kYERQo8h2GzWfU8LWxl0a420ZHEfUZoYmitg/evA3v+23FrCMGg6 +2cdNzU5/mqsQ5HWktTQ5BZQZyn5UT3zpNCOVyeZc/ezzGXcWbEXOLQwDcolxjatL +ED3eNA1OMQD8S++FPPGCukIzCyYiPq49zJCTMCWd3qTt2Bwea9xOQnoetCTU9goX +/eEGj/1zQDAXCGOVgdd34VrOX4qtpmp3ABEBAAGJAiUEGAECAA8FAlVe7qQCGwwF +CQlmAYAACgkQKdS8tkFvU+xj8Q//VNzFYM/kyHSa0xio4e8vBZA2vmR8IEUmtOSR +zr487Z8W1dapGxR7OLQ52oWdRZVpG1B5rCuJtsWbjdY94Y8RpcO6FBemneGebBhu +UKc60qwEanYnZva9PEFNyBzpj3xk3Ms7K4O2dZTcXPGj+hlep9Tjo09sklqbKfgW +2fCUu2EKXWwUrnZ2LZtb/Ya8WPCrsbJFk+WbrLhWt7jIsadVl4AfblcgBGb8aN98 +GxnYOh+TGSMJtq1NSfchQwLHrpTPYm4McAwOBBYDdA+ik3//eLbwRiX9szFk658p ++4LErMBJAKLreSluBkqOG3AzT22Hdffvl8G2U4WhPPG33NzWomb+wKohjjzMVUlx +YRCO57wkURqEW9/+a4riuBWGQqqRsW1wHEMu1lYdAhLJ5f0s3vO/fVe43ktaXNjW +6k+mXDlIdKkQgQ736sBk3DAUc+YcmWmStPr1+TtT91eC23GLWP7gVDnNGEOBOscw +U+m1bEOJN2duAMJSRK7U0r2ipmRKDcwK9XmVpJcTePfB2l+T3RdHEZIOlaTELEX6 +WJfpU4Kc1KJeKdp+l9gf2JD8eOZAlwxA4r2wxyzoCVg1Bk3XiBfoI7Gl78Wysp+/ +ChQcErPJWEUglBfrESpqmjxH/qSy6yjyNmd4Az2ii7IzWILfuheZR4drjHQj6mCA +S5rowLE= +=ZVPf -----END PGP PUBLIC KEY BLOCK----- \ No newline at end of file diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py index a3d035218..97772b9c1 100755 --- a/contrib/seeds/generate-seeds.py +++ b/contrib/seeds/generate-seeds.py @@ -127,10 +127,10 @@ def main(): 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) + process_nodes(g, f, 'pnSeed6_main', 15714) g.write('\n') with open(os.path.join(indir,'nodes_test.txt'),'r') as f: - process_nodes(g, f, 'pnSeed6_test', 18333) + process_nodes(g, f, 'pnSeed6_test', 25714) g.write('#endif // BITCOIN_CHAINPARAMSSEEDS_H\n') if __name__ == '__main__': diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt index f1854b27f..fc032ab51 100644 --- a/contrib/seeds/nodes_main.txt +++ b/contrib/seeds/nodes_main.txt @@ -1,937 +1,16 @@ -5.2.145.201:8333 -5.22.142.214:8333 -5.53.172.197:8333 -5.189.161.164:8333 -5.230.140.166:8333 -5.231.3.130:8333 -5.255.80.103:8333 -14.202.230.49:8333 -18.85.11.130:8333 -23.91.97.25:8333 -23.94.100.122:8333 -23.95.99.132:8333 -24.115.8.206:8333 -24.127.128.191:8333 -24.154.178.25:8333 -24.207.103.43:8333 -24.207.104.105:8333 -24.210.230.150:8333 -24.224.18.84:8333 -24.246.168.106:8333 -27.254.64.47:8333 -31.6.71.123:8333 -31.6.71.124:8333 -31.14.134.13:8333 -31.30.36.220:8333 -31.164.6.104:8333 -31.170.106.203:8333 -31.185.134.201:8333 -31.204.128.99:8333 -31.204.128.219:8333 -37.1.219.88:8333 -37.97.132.109:8333 -37.120.160.55:8333 -37.120.169.123:8333 -37.139.32.46:8333 -37.221.163.218:8333 -38.130.192.72:8333 -41.75.96.80:8333 -45.3.0.49:8333 -45.33.72.185:8333 -45.33.96.129:8333 -45.56.4.63:8333 -45.79.0.127:8333 -45.79.80.102:8333 -45.79.97.30:8333 -45.79.132.219:8333 -46.21.97.135:8333 -46.28.205.67:8333 -46.28.206.188:8333 -46.29.20.209:8333 -46.50.234.179:8333 -46.101.160.168:8333 -46.166.161.35:8333 -46.166.161.103:8333 -46.182.132.100:8333 -46.218.227.92:8333 -46.226.109.20:8333 -46.227.66.132:8333 -46.227.66.138:8333 -46.229.165.154:8333 -46.229.165.155:8333 -46.229.238.187:8333 -46.234.104.48:8333 -46.239.107.74:8333 -46.244.0.138:8333 -46.254.72.195:8333 -50.5.13.44:8333 -50.7.37.114:8333 -50.30.37.103:8333 -50.39.105.60:8333 -50.106.40.231:8333 -52.29.0.37:8333 -52.76.192.246:8333 -54.152.192.179:8333 -54.169.64.174:8333 -54.175.160.22:8333 -54.199.128.0:8333 -58.96.171.129:8333 -58.161.238.57:8333 -60.251.195.221:8333 -61.35.225.19:8333 -62.43.130.178:8333 -62.65.39.12:8333 -62.107.200.30:8333 -62.133.194.2:8333 -62.181.238.186:8333 -62.183.22.50:8333 -62.210.85.120:8333 -62.210.162.89:8333 -62.238.34.125:8333 -64.25.171.73:8333 -64.27.166.30:8333 -64.53.137.101:8333 -64.71.72.44:8333 -64.83.225.146:8333 -64.121.3.163:8333 -64.203.102.86:8333 -65.94.131.59:8333 -65.188.136.233:8333 -66.11.162.218:8333 -66.23.228.133:8333 -66.90.137.89:8333 -66.114.33.49:8333 -66.150.105.77:8333 -66.172.10.4:8333 -66.194.38.250:8333 -66.194.38.253:8333 -66.194.38.254:8333 -66.231.97.172:8333 -66.240.237.155:8333 -67.159.13.34:8333 -67.205.74.206:8333 -67.221.193.55:8333 -67.227.72.17:8333 -68.65.120.53:8333 -68.65.205.226:9000 -68.144.4.34:8333 -69.39.49.199:8333 -69.50.171.205:8333 -69.65.41.21:8333 -69.113.98.61:8333 -69.119.97.39:8333 -69.146.70.124:8333 -69.193.71.2:8333 -70.46.10.237:8333 -70.80.200.187:8333 -70.185.97.117:8333 -71.254.160.25:8333 -72.28.203.5:8333 -72.52.130.110:8333 -72.83.194.122:8333 -72.128.32.167:8333 -72.179.136.80:8333 -72.235.38.70:8333 -74.50.44.193:8333 -74.72.60.83:8333 -74.80.234.116:8333 -74.207.233.193:8333 -75.112.233.128:8333 -75.118.166.197:8333 -75.140.0.241:8333 -75.159.240.66:8333 -75.174.5.26:8333 -76.72.160.252:8333 -76.72.160.254:8333 -76.74.170.112:8333 -76.79.201.54:8333 -76.175.166.164:8333 -76.179.105.27:8333 -77.68.37.200:8333 -77.234.49.196:8333 -77.247.229.93:8333 -78.24.72.78:8333 -78.47.32.147:8333 -78.84.100.95:8333 -78.121.69.23:8333 -78.129.167.5:8333 -78.193.96.155:8333 -79.19.37.179:8333 -79.132.230.144:8333 -79.133.43.63:8333 -79.134.201.66:8333 -79.169.35.235:8333 -80.57.227.14:8333 -80.64.65.87:8333 -80.86.92.70:8333 -80.100.203.151:8333 -80.101.32.121:8333 -80.161.178.73:8333 -80.240.129.170:8333 -81.7.11.50:8333 -81.7.11.55:8333 -81.17.17.40:9333 -81.30.39.83:8333 -81.90.36.7:9444 -81.136.224.77:8333 -81.162.231.211:8333 -81.184.0.143:8333 -81.198.128.86:8333 -82.11.33.229:8333 -82.79.128.134:8333 -82.118.233.111:8333 -82.135.139.30:8333 -82.199.102.10:8333 -82.221.106.17:8333 -82.221.108.21:8333 -82.221.108.27:8333 -83.137.41.3:8333 -83.142.197.168:8333 -83.143.130.19:8333 -83.150.9.196:8333 -83.183.17.191:8333 -83.227.173.83:8333 -83.230.5.15:8333 -83.233.105.151:443 -83.246.75.8:8333 -83.250.133.158:8333 -83.255.66.118:8334 -84.24.69.59:8333 -84.42.193.6:8333 -84.45.98.87:8333 -84.54.128.11:8333 -84.212.200.24:8333 -84.215.198.109:8333 -84.230.4.177:8333 -85.95.228.83:8333 -85.95.228.123:8333 -85.114.128.134:8333 -85.214.66.168:8333 -85.214.147.162:8333 -85.243.168.4:8333 -86.1.0.18:8333 -87.79.77.106:8333 -87.91.156.110:8333 -87.236.196.222:8333 -88.85.75.152:8333 -88.87.1.230:8333 -88.87.92.102:8333 -88.89.69.202:8333 -88.97.72.229:8333 -88.164.117.99:8333 -88.198.32.131:8333 -88.202.230.87:8333 -88.214.193.154:8343 -88.214.194.226:8343 -89.10.155.88:8333 -89.46.101.44:8333 -89.163.224.212:8333 -89.174.248.20:8333 -89.202.231.198:8333 -89.212.75.6:8333 -90.149.38.172:8333 -90.169.106.139:8333 -91.64.101.150:8333 -91.65.196.179:8333 -91.121.80.17:8333 -91.126.77.77:8333 -91.145.76.156:8333 -91.152.150.35:8333 -91.192.137.17:8333 -91.196.170.110:8333 -91.197.44.133:8333 -91.207.68.144:8333 -91.210.105.28:8333 -91.211.102.101:8333 -91.211.106.34:8333 -91.214.200.205:8333 -91.220.43.146:8333 -91.222.71.89:8333 -91.224.140.242:8333 -91.229.76.14:8333 -92.27.7.209:8333 -92.51.167.88:8333 -92.247.229.163:8333 -93.84.114.106:8333 -93.113.36.172:8333 -93.188.224.253:8333 -94.75.239.69:8333 -94.190.227.112:8333 -94.214.2.74:8333 -94.224.162.65:8333 -94.236.198.253:8333 -94.242.229.158:8333 -95.84.138.99:8333 -95.95.168.87:8333 -95.110.234.93:8333 -95.130.9.200:8333 -95.165.168.168:8333 -95.170.235.254:8333 -95.211.130.154:8333 -96.46.68.104:8333 -96.127.202.148:8333 -97.76.171.35:8333 -98.160.160.67:8333 -99.126.197.187:8333 -99.198.173.1:8333 -101.100.174.138:8333 -101.164.201.208:8333 -103.224.165.48:8333 -104.128.225.223:8333 -104.128.228.252:8333 -104.131.192.94:8333 -104.155.45.201:8334 -104.194.28.195:8663 -104.211.1.27:8333 -104.221.38.177:8333 -104.236.9.79:8333 -104.236.129.178:8333 -104.236.186.249:8333 -104.236.194.15:8333 -104.238.128.214:8333 -104.238.130.182:8333 -106.38.234.84:8333 -106.185.36.204:8333 -106.185.38.67:8333 -107.6.4.145:8333 -107.150.2.6:8333 -107.150.40.234:8333 -107.170.13.184:8333 -107.181.250.216:8333 -107.191.101.111:8333 -107.191.106.115:8333 -108.59.12.163:8333 -108.161.129.247:8333 -109.193.160.140:8333 -109.197.13.54:8333 -109.230.7.248:8333 -109.234.106.191:8333 -109.236.137.80:8333 -109.251.161.121:8333 -112.65.231.226:8333 -115.70.166.57:8333 -115.159.42.80:8333 -117.18.73.34:8333 -118.67.201.40:8333 -118.100.86.246:8333 -118.110.104.152:8333 -119.224.64.141:8333 -120.55.193.136:8333 -122.106.169.178:8333 -123.203.174.15:8333 -123.255.232.94:8333 -124.148.165.165:8333 -124.232.141.31:8333 -128.30.92.69:8333 -128.39.141.182:8333 -128.84.167.20:8333 -128.111.73.10:8333 -128.127.38.195:8333 -128.140.224.162:8333 -128.199.101.104:8333 -128.233.224.35:8333 -128.253.3.193:20020 -130.180.228.138:8333 -130.185.144.213:8333 -130.255.73.207:8333 -133.218.233.11:8333 -134.249.128.23:8333 -136.159.234.234:8333 -137.116.160.176:8333 -139.162.2.145:8333 -139.162.23.117:8333 -141.134.69.253:8333 -141.255.162.215:8333 -144.122.163.187:8333 -145.131.3.54:8333 -145.255.4.94:8333 -146.0.32.101:8337 -147.83.72.91:8333 -148.103.28.68:8333 -149.5.32.102:8333 -149.210.164.195:8333 -150.101.163.241:8333 -151.236.11.189:8333 -152.3.136.56:8333 -154.20.208.25:8333 -158.181.104.149:8333 -159.253.96.226:8333 -160.36.130.180:8333 -162.209.1.233:8333 -162.209.4.125:8333 -162.209.106.123:8333 -162.210.198.184:8333 -162.248.99.164:53011 -162.248.102.117:8333 -162.251.108.53:8333 -163.44.2.48:8333 -163.158.36.17:8333 -166.230.71.67:8333 -167.160.36.62:8333 -167.160.169.92:8333 -168.93.129.220:8333 -169.55.99.84:8333 -169.228.66.43:8333 -172.9.169.242:8333 -173.32.11.194:8333 -173.230.228.136:8333 -173.246.107.34:8333 -173.254.235.34:8333 -174.0.128.222:8333 -174.25.130.148:8333 -174.50.64.101:8333 -175.140.232.141:8333 -176.36.37.62:8333 -176.46.9.96:8333 -176.124.110.27:8333 -177.39.16.102:8333 -178.17.173.2:8333 -178.62.5.248:8333 -178.62.70.16:8333 -178.62.203.185:8333 -178.79.160.118:8333 -178.169.206.244:8333 -178.193.234.62:8333 -178.199.96.108:8333 -178.254.18.96:8333 -178.254.34.161:8333 -178.255.41.123:8333 -180.210.34.58:9801 -182.92.226.212:8333 -182.171.246.142:8333 -184.23.8.9:8333 -184.58.162.35:8333 -184.154.9.170:8333 -185.8.238.165:8333 -185.24.97.11:8333 -185.31.137.139:8333 -185.38.44.64:8333 -185.53.128.180:8333 -185.53.129.244:8333 -185.77.129.119:8333 -185.77.129.156:8333 -185.82.203.92:8333 -188.20.97.18:8333 -188.126.8.14:8333 -188.138.33.239:8333 -188.155.136.70:8333 -188.166.229.112:8333 -188.182.108.129:8333 -188.226.225.174:8010 -188.242.171.8:8333 -188.243.4.139:8333 -190.10.9.234:8333 -190.10.10.147:8333 -190.81.160.184:8333 -190.85.201.37:8333 -192.34.227.230:8333 -192.77.189.200:8333 -192.124.224.7:8333 -192.146.137.1:8333 -192.203.228.71:8333 -192.206.202.20:8333 -193.0.109.3:8333 -193.41.229.130:8333 -193.41.229.156:8333 -193.49.43.219:8333 -193.147.71.120:8333 -193.179.65.233:8333 -193.183.99.46:8333 -193.192.37.135:8333 -193.234.224.195:8333 -194.58.108.213:8333 -194.187.96.2:8333 -194.255.31.59:8333 -195.36.6.101:8333 -195.58.238.243:8333 -195.197.175.190:8333 -195.239.1.66:8333 -198.48.196.230:8333 -198.50.192.160:8333 -198.57.210.27:8333 -198.84.195.179:8333 -198.167.140.8:8333 -198.204.224.106:8333 -199.127.226.245:8333 -199.201.110.8:8333 -199.233.234.90:8333 -200.116.98.185:8333 -202.60.70.18:8333 -203.151.140.14:8333 -204.112.203.52:8333 -205.200.247.149:8333 -207.226.141.253:8333 -207.255.42.202:8333 -208.53.164.19:8333 -208.66.68.127:8333 -208.66.68.130:8333 -208.71.171.232:8341 -208.76.200.200:8333 -208.82.98.189:8333 -208.85.193.31:8333 -208.111.48.41:8333 -208.111.48.45:8333 -209.34.232.72:8333 -209.81.9.223:8333 -209.90.224.2:8333 -209.90.224.4:8333 -209.126.98.174:8333 -209.136.72.69:8333 -209.195.4.74:8333 -209.197.13.62:8333 -211.72.227.8:8333 -212.51.144.42:8333 -212.71.233.127:8333 -212.126.14.122:8333 -212.159.44.50:8333 -213.5.36.58:8333 -213.57.33.10:8333 -213.66.205.194:8333 -213.136.73.125:8333 -213.155.3.216:8333 -213.155.7.24:8333 -213.167.17.6:8333 -213.223.138.13:8333 -216.15.78.182:8333 -216.38.129.164:8333 -216.48.168.8:8333 -216.169.141.169:8333 -216.245.206.181:8333 -216.249.204.161:8333 -216.250.138.230:8333 -217.11.225.189:8333 -217.12.34.158:8333 -217.12.202.33:8333 -217.20.171.43:8333 -217.23.1.126:8333 -217.23.11.138:8333 -217.111.66.79:8333 -217.155.202.191:8333 -217.158.9.102:8333 -217.172.32.18:20993 -220.245.196.37:8333 -[2001:1291:2bf:1::100]:8333 -[2001:1620:f00:282::2]:8333 -[2001:1620:f00:8282::1]:8333 -[2001:19f0:5000:8de8:5400:ff:fe12:55e4]:8333 -[2001:19f0:6c00:9103:5400:ff:fe10:a8d3]:8333 -[2001:1b60:3:172:142b:6dff:fe7a:117]:8333 -[2001:410:a000:4050:8463:90b0:fffb:4e58]:8333 -[2001:4128:6135:2010:21e:bff:fee8:a3c0]:8333 -[2001:41d0:1008:761::17c]:8333 -[2001:41d0:1:45d8::1]:8333 -[2001:41d0:1:6cd3::]:8333 -[2001:41d0:1:8b26::1]:8333 -[2001:41d0:1:afda::]:8200 -[2001:41d0:1:b26b::1]:8333 -[2001:41d0:1:c139::1]:8333 -[2001:41d0:1:c8d7::1]:8333 -[2001:41d0:1:f59f::33]:8333 -[2001:41d0:1:f7cc::1]:8333 -[2001:41d0:2:1021::1]:8333 -[2001:41d0:2:37c3::]:8200 -[2001:41d0:2:4797:2323:2323:2323:2323]:8333 -[2001:41d0:2:53df::]:8333 -[2001:41d0:2:9c94::1]:8333 -[2001:41d0:2:9d3e::1]:8333 -[2001:41d0:2:a24f::]:8333 -[2001:41d0:2:a35a::]:8333 -[2001:41d0:2:b2b8::]:8333 -[2001:41d0:2:c1d9::]:8333 -[2001:41d0:2:c6e::]:8333 -[2001:41d0:2:c9bf::]:8333 -[2001:41d0:2:f1a5::]:8333 -[2001:41d0:52:a00::105f]:8333 -[2001:41d0:52:cff::6f5]:8333 -[2001:41d0:52:d00::6e2]:8333 -[2001:41d0:8:3e75::1]:8333 -[2001:41d0:8:62ab::1]:8333 -[2001:41d0:8:6728::]:8333 -[2001:41d0:8:b30a::1]:8333 -[2001:41d0:8:bc26::1]:8333 -[2001:41d0:8:be9a::1]:8333 -[2001:41d0:8:d984::]:8333 -[2001:41d0:8:eb8b::]:8333 -[2001:41d0:a:13a2::1]:8333 -[2001:41d0:a:2b18::1]:8333 -[2001:41d0:a:2d14::]:8333 -[2001:41d0:a:4558::1df2:76d3]:8333 -[2001:41d0:a:4aaa::]:8333 -[2001:41d0:a:635b::1]:8333 -[2001:41d0:a:63d8::1]:8333 -[2001:41d0:a:6c29::1]:8333 -[2001:41d0:a:f9cd::1]:8333 -[2001:41d0:d:20a4::]:8333 -[2001:41d0:e:26b::1]:8333 -[2001:41d0:fc8c:a200:7a24:afff:fe9d:c69b]:8333 -[2001:41f0:61::7]:8333 -[2001:41f0::2]:8333 -[2001:44b8:41bd:6101:148e:4022:4950:e861]:8333 -[2001:470:1:2f9:0:1:107a:a301]:8333 -[2001:470:1f0b:ad6::2]:8333 -[2001:470:1f11:12d5::ae1:5611]:8333 -[2001:470:1f14:7d::2]:8333 -[2001:470:27:ce::2]:8333 -[2001:470:41:6::2]:8333 -[2001:470:507d:0:6ab5:99ff:fe73:ac18]:8333 -[2001:470:583e::2a]:8333 -[2001:470:5f:5f::232]:8333 -[2001:470:66:119::2]:8333 -[2001:470:6c4f::cafe]:8333 -[2001:470:6f:327:913b:7fe:8545:a4f5]:8333 -[2001:470:7dda:1::1]:8333 -[2001:470:95c1::2]:8333 -[2001:470:b1d0:ffff::1000]:8333 -[2001:470:d00d:0:3664:a9ff:fe9a:5150]:8333 -[2001:470:fab7:1::1]:8333 -[2001:4800:7819:104:be76:4eff:fe05:c828]:8333 -[2001:4800:7819:104:be76:4eff:fe05:c9a0]:8333 -[2001:4801:7819:74:b745:b9d5:ff10:a61a]:8333 -[2001:4801:7819:74:b745:b9d5:ff10:aaec]:8333 -[2001:4801:7828:104:be76:4eff:fe10:1325]:8333 -[2001:4802:7800:1:be76:4eff:fe20:f023]:8333 -[2001:4802:7800:2:30d7:1775:ff20:1858]:8333 -[2001:4802:7800:2:be76:4eff:fe20:6c26]:8333 -[2001:4802:7802:101:be76:4eff:fe20:256]:8333 -[2001:4802:7802:103:be76:4eff:fe20:2de8]:8333 -[2001:4830:1100:2e8::2]:8333 -[2001:4b98:dc2:41:216:3eff:fe56:f659]:8333 -[2001:4ba0:fffa:5d::93]:8333 -[2001:4ba0:ffff:1be:1:1005:0:1]:8333 -[2001:4dd0:ff00:867f::3]:8333 -[2001:4dd0:ff00:9a67::9]:8333 -[2001:5c0:1400:b::3cc7]:8333 -[2001:610:1b19::3]:8333 -[2001:610:600:a41::2]:8333 -[2001:67c:26b4::]:8333 -[2001:8d8:840:500::39:1ae]:8333 -[2001:8d8:965:4a00::10:9343]:8333 -[2001:980:4650:1:2e0:53ff:fe13:2449]:8333 -[2001:981:46:1:ba27:ebff:fe5b:edee]:8333 -[2001:9c8:53e9:369a:226:2dff:fe1b:7472]:8333 -[2001:9d8:cafe:3::87]:8333 -[2001:b10:11:21:3e07:54ff:fe48:7248]:8333 -[2001:ba8:1f1:f34c::2]:8333 -[2001:bc8:2310:100::1]:8333 -[2001:bc8:3427:101:7a4f:8be:2611:6e79]:8333 -[2001:bc8:3505:200::1]:8333 -[2001:cc0:a004::30:1d]:8333 -[2001:e42:102:1209:153:121:76:171]:8333 -[2002:17ea:14eb::17ea:14eb]:8333 -[2002:2f8:2bc5::2f8:2bc5]:8333 -[2002:4047:482c::4047:482c]:8333 -[2002:45c3:8cca::45c3:8cca]:8333 -[2002:46bb:8a41:0:226:b0ff:feed:5f12]:8888 -[2002:46bb:8c3c:0:8d55:8fbb:15fa:f4e0]:8765 -[2002:4c48:a0fe::4c48:a0fe]:8333 -[2002:4d44:25c8::4d44:25c8]:8333 -[2002:505f:aaa2::505f:aaa2]:8333 -[2002:5bc1:799d::5bc1:799d]:8333 -[2002:6dec:5472::6dec:5472]:8333 -[2002:8c6d:6521:9617:12bf:48ff:fed8:1724]:8333 -[2002:ac52:94e2::ac52:94e2]:8333 -[2002:af7e:3eca::af7e:3eca]:8333 -[2002:b009:20c5::b009:20c5]:8333 -[2002:c06f:39a0::c06f:39a0]:8333 -[2002:c23a:738a::c23a:738a]:8333 -[2002:c70f:7442::c70f:7442]:8333 -[2002:cec5:be4f::cec5:be4f]:8333 -[2002:d149:9e3a::d149:9e3a]:8333 -[2002:d917:ca5::d917:ca5]:8333 -[2400:8900::f03c:91ff:fe50:153f]:8333 -[2400:8900::f03c:91ff:fe6e:823e]:8333 -[2400:8900::f03c:91ff:fea8:1934]:8333 -[2400:8901::f03c:91ff:fe26:c4d6]:8333 -[2400:8901::f03c:91ff:fec8:4280]:8333 -[2400:8901::f03c:91ff:fec8:660f]:8333 -[2401:1800:7800:102:be76:4eff:fe1c:559]:8333 -[2401:1800:7800:102:be76:4eff:fe1c:a7d]:8333 -[2405:aa00:2::40]:8333 -[2600:3c00::f03c:91ff:fe18:59b2]:8333 -[2600:3c00::f03c:91ff:fe26:bfb6]:8333 -[2600:3c00::f03c:91ff:fe33:88e3]:8333 -[2600:3c00::f03c:91ff:fe6e:7297]:8333 -[2600:3c00::f03c:91ff:fe84:8a6e]:8333 -[2600:3c01::f03c:91ff:fe18:6adf]:8333 -[2600:3c01::f03c:91ff:fe26:c4b8]:8333 -[2600:3c01::f03c:91ff:fe3b:1f76]:8333 -[2600:3c01::f03c:91ff:fe50:5e06]:8333 -[2600:3c01::f03c:91ff:fe61:289b]:8333 -[2600:3c01::f03c:91ff:fe69:89e9]:8333 -[2600:3c01::f03c:91ff:fe84:ac15]:8333 -[2600:3c01::f03c:91ff:fe98:68bb]:8333 -[2600:3c02::f03c:91ff:fe26:713]:8333 -[2600:3c02::f03c:91ff:fe26:c49e]:8333 -[2600:3c02::f03c:91ff:fe84:97d8]:8333 -[2600:3c02::f03c:91ff:fec8:8feb]:8333 -[2600:3c03::f03c:91ff:fe18:da80]:8333 -[2600:3c03::f03c:91ff:fe26:c49b]:8333 -[2600:3c03::f03c:91ff:fe50:5fa7]:8333 -[2600:3c03::f03c:91ff:fe67:d2e]:8333 -[2600:3c03::f03c:91ff:fe6e:1803]:8333 -[2600:3c03::f03c:91ff:fec8:4bbe]:8333 -[2600:3c03::f03c:91ff:fee4:4e16]:8333 -[2601:18d:8300:58a6::2e4]:8333 -[2601:240:4600:40c0:250:56ff:fea4:6305]:8333 -[2601:581:c200:a719:542c:9cd5:4852:f7d9]:8333 -[2601:647:4900:85f1:ca2a:14ff:fe51:bb35]:8333 -[2601:c2:c002:b300:54a0:15b5:19f7:530d]:8333 -[2602:306:ccff:ad7f:b116:52be:64ba:db3a]:8333 -[2602:ae:1982:9400:846:f78c:fec:4d57]:8333 -[2602:ffc5:1f::1f:2d61]:8333 -[2602:ffc5:1f::1f:9211]:8333 -[2602:ffc5::75d5:c1c3]:8333 -[2602:ffc5::ffc5:b844]:8333 -[2602:ffe8:100:2::457:936b]:8333 -[2602:ffe8:100:2::9d20:2e3c]:8333 -[2602:ffea:1001:72b::578b]:8333 -[2602:ffea:a::24c4:d9fd]:8333 -[2604:0:c1:100:1ec1:deff:fe54:2235]:8333 -[2604:180:1:1af::42a9]:8333 -[2604:180:3:702::c9de]:8333 -[2604:4080:1114:0:3285:a9ff:fe93:850c]:8333 -[2604:6000:ffc0:3c:64a3:94d0:4f1d:1da8]:8333 -[2605:6000:f380:9a01:ba09:8aff:fed4:3511]:8333 -[2605:6001:e00f:7b00:c587:6d91:6eff:eeba]:8333 -[2605:f700:c0:1::25c3:2a3e]:8333 -[2606:6000:a441:9903:5054:ff:fe78:66ff]:8333 -[2607:5300:100:200::1c83]:9334 -[2607:5300:10::a1]:8333 -[2607:5300:60:1c2f::1]:8333 -[2607:5300:60:2b90::1]:8333 -[2607:5300:60:3320::1]:8333 -[2607:5300:60:385::1]:8333 -[2607:5300:60:4a85::]:8333 -[2607:5300:60:65e4::]:8333 -[2607:5300:60:6918::]:8333 -[2607:5300:60:711a:78::a7b5]:8333 -[2607:5300:60:714::1]:8333 -[2607:5300:60:870::1]:8333 -[2607:5300:60:952e:3733::1414]:8333 -[2607:f1c0:848:1000::48:943c]:8333 -[2607:f2e0:f:5df::2]:8333 -[2607:f748:1200:f8:21e:67ff:fe99:8f07]:8333 -[2607:f948:0:1::7]:8333 -[2607:ff68:100:36::131]:8333 -[2803:6900:1::117]:8333 -[2a00:1098:0:80:1000:25:0:1]:8333 -[2a00:1178:2:43:5054:ff:fe84:f86f]:8333 -[2a00:1178:2:43:5054:ff:fee7:2eb6]:8333 -[2a00:1178:2:43:8983:cc27:d72:d97a]:8333 -[2a00:1328:e100:cc42:230:48ff:fe92:55c]:8333 -[2a00:14f0:e000:80d2:cd1a::1]:8333 -[2a00:1630:2:1802:188:122:91:11]:8333 -[2a00:18e0:0:1800::1]:8333 -[2a00:18e0:0:dcc5:109:234:106:191]:8333 -[2a00:1a28:1157:87::94c7]:8333 -[2a00:1ca8:37::a5fc:40d1]:8333 -[2a00:1ca8:37::ab6d:ce2c]:8333 -[2a00:7143:100:0:216:3eff:fe2e:74a3]:8333 -[2a00:7143:100:0:216:3eff:fed3:5c21]:8333 -[2a00:7c80:0:45::123]:8333 -[2a00:dcc0:eda:98:183:193:c382:6bdb]:8333 -[2a00:dcc0:eda:98:183:193:f72e:d943]:8333 -[2a00:f820:17::4af:1]:8333 -[2a00:f940:2:1:2::101d]:8333 -[2a00:f940:2:1:2::6ac]:8333 -[2a01:1b0:7999:402::131]:8333 -[2a01:238:42dd:f900:7a6c:2bc6:4041:c43]:8333 -[2a01:238:4313:6300:2189:1c97:696b:5ea]:8333 -[2a01:488:66:1000:5c33:91f9:0:1]:8333 -[2a01:488:66:1000:b01c:178d:0:1]:8333 -[2a01:4f8:100:34ce::2]:8333 -[2a01:4f8:100:34e4::2]:8333 -[2a01:4f8:100:44e7::2]:8333 -[2a01:4f8:100:510e::2]:8333 -[2a01:4f8:100:5128::2]:8333 -[2a01:4f8:110:5105::2]:8333 -[2a01:4f8:110:516c::2]:8333 -[2a01:4f8:120:43e4::2]:8333 -[2a01:4f8:120:62e6::2]:8333 -[2a01:4f8:120:702e::2]:8333 -[2a01:4f8:120:8203::2]:8333 -[2a01:4f8:121:234d::2]:8333 -[2a01:4f8:121:261::2]:8333 -[2a01:4f8:130:11ea::2]:8333 -[2a01:4f8:130:3332::2]:8333 -[2a01:4f8:130:40ab::2]:8333 -[2a01:4f8:130:632c::2]:8333 -[2a01:4f8:130:6366::2]:8333 -[2a01:4f8:130:934f::2]:8333 -[2a01:4f8:131:33ad:fea1::666]:8333 -[2a01:4f8:140:2195::2]:8333 -[2a01:4f8:140:6333::2]:8333 -[2a01:4f8:140:930d::2]:8333 -[2a01:4f8:140:93b0::2]:8333 -[2a01:4f8:141:1167::2]:8333 -[2a01:4f8:141:186::2]:8333 -[2a01:4f8:141:53f0::2]:8333 -[2a01:4f8:150:336a::2]:8333 -[2a01:4f8:150:72ee::4202]:8333 -[2a01:4f8:150:8324::2]:9001 -[2a01:4f8:151:21ca::2]:8333 -[2a01:4f8:151:41c2:0:5404:a67e:f250]:8333 -[2a01:4f8:151:5128::2]:8333 -[2a01:4f8:151:52c6::154]:8333 -[2a01:4f8:151:6347::2]:9001 -[2a01:4f8:160:5136::2]:8333 -[2a01:4f8:160:72c5::2858:e1c5]:8333 -[2a01:4f8:160:72c5::593b:60d5]:8333 -[2a01:4f8:160:814f::2]:8333 -[2a01:4f8:161:13d0::2]:8333 -[2a01:4f8:161:228f::2]:8333 -[2a01:4f8:161:51c4::2]:8333 -[2a01:4f8:161:60a7::2]:8333 -[2a01:4f8:161:7026::2]:8333 -[2a01:4f8:161:9184::2]:8333 -[2a01:4f8:162:2108::2]:8333 -[2a01:4f8:162:218c::2]:8333 -[2a01:4f8:162:4443::2]:8333 -[2a01:4f8:162:51a3::2]:8333 -[2a01:4f8:171:b93::2]:8333 -[2a01:4f8:190:1483::1]:8333 -[2a01:4f8:190:4495::2]:8333 -[2a01:4f8:190:64c9::2]:8333 -[2a01:4f8:190:91ce::2]:8333 -[2a01:4f8:191:2194::83]:8333 -[2a01:4f8:191:40e8::2]:8333 -[2a01:4f8:191:44b4::2]:8333 -[2a01:4f8:191:8242::2]:8333 -[2a01:4f8:191:83a2::2]:8333 -[2a01:4f8:192:11b2::2]:8333 -[2a01:4f8:192:216c::2]:8333 -[2a01:4f8:192:22b3::2]:8333 -[2a01:4f8:192:440b::2]:8333 -[2a01:4f8:192:db::2]:8333 -[2a01:4f8:200:1012::2]:8333 -[2a01:4f8:200:23d1::dead:beef]:8333 -[2a01:4f8:200:506d::2]:8333 -[2a01:4f8:200:51f0::2]:8333 -[2a01:4f8:200:5389::2]:8333 -[2a01:4f8:200:53e3::2]:8333 -[2a01:4f8:200:6344::2]:8333 -[2a01:4f8:200:6396::2]:8333 -[2a01:4f8:200:63af::119]:8333 -[2a01:4f8:200:71e3:78b4:f3ff:fead:e8cf]:8333 -[2a01:4f8:201:214c::2]:8333 -[2a01:4f8:201:233:1::3]:8333 -[2a01:4f8:201:3e3::2]:8333 -[2a01:4f8:201:6011::4]:8333 -[2a01:4f8:201:60d5::2]:8333 -[2a01:4f8:202:265::2]:8333 -[2a01:4f8:202:3115::2]:8333 -[2a01:4f8:202:31e3::2]:8333 -[2a01:4f8:202:31ef::2]:8333 -[2a01:4f8:202:3392::2]:8333 -[2a01:4f8:202:53c3::2]:8333 -[2a01:4f8:202:63f4::2]:8333 -[2a01:4f8:202:7227::2]:8333 -[2a01:4f8:210:2227::2]:8333 -[2a01:4f8:210:24aa::2]:8333 -[2a01:4f8:211:14cf::2]:8333 -[2a01:4f8:211:181b::2]:8333 -[2a01:4f8:212:289e::2]:8333 -[2a01:4f8:212:33db::2]:18333 -[2a01:4f8:a0:112f::2]:8333 -[2a01:4f8:a0:3174::2]:8333 -[2a01:4f8:a0:328c::2]:8333 -[2a01:4f8:a0:5243::2]:8333 -[2a01:4f8:c17:19b9::2]:8333 -[2a01:4f8:c17:1a41::2]:8333 -[2a01:4f8:c17:1a92::2]:8333 -[2a01:4f8:c17:273::2]:8333 -[2a01:4f8:c17:435::2]:8333 -[2a01:4f8:c17:755::2]:8333 -[2a01:4f8:c17:b54::2]:8333 -[2a01:4f8:d16:9384::2]:8333 -[2a01:608:ffff:a009:8bf5:879d:e51a:f837]:8333 -[2a01:680:10:10:f2de:f1ff:fec9:dc0]:8333 -[2a01:7c8:aaac:1f6:5054:ff:fe30:e585]:8333 -[2a01:7c8:aaac:20b:5054:ff:fe24:435e]:8333 -[2a01:7c8:aaac:43d:5054:ff:fe4e:3dd4]:8333 -[2a01:7c8:aaad:256::1]:8333 -[2a01:7c8:aab6:ea:5054:ff:feff:eac3]:8333 -[2a01:7c8:aab9:5a:5054:ff:fe89:7b26]:8333 -[2a01:7c8:aabc:2c8:5054:ff:fe35:6581]:8333 -[2a01:7e00::f03c:91ff:fe18:301e]:8333 -[2a01:7e00::f03c:91ff:fe18:3942]:8333 -[2a01:7e00::f03c:91ff:fe26:8c87]:8333 -[2a01:7e00::f03c:91ff:fe50:6206]:8333 -[2a01:7e00::f03c:91ff:fe67:559d]:8333 -[2a01:7e00::f03c:91ff:fe84:434f]:8333 -[2a01:7e00::f03c:91ff:fe89:1143]:8333 -[2a01:7e00::f03c:91ff:fe98:2505]:8333 -[2a01:7e00::f03c:91ff:fedb:352e]:8333 -[2a01:7e01::f03c:91ff:fec8:d7b5]:8333 -[2a01:e34:ee33:1640:c504:f677:b28a:ba42]:8333 -[2a01:e35:2e7e:bc0:e079:f55e:cef3:b5d7]:8333 -[2a01:e35:2ee5:610:21f:d0ff:fe4e:7460]:8333 -[2a01:e35:8a3f:47c0:c617:feff:fe3c:9fbd]:8333 -[2a01:e35:8aca:6a0:211:aff:fe5e:295e]:8333 -[2a02:180:a:18:81:7:11:50]:8333 -[2a02:1810:1d87:6a00:5604:a6ff:fe60:d87d]:8333 -[2a02:2168:1144:5c01:d63d:7eff:fedd:4f8e]:8333 -[2a02:2498:6d7b:7001:b508:b39d:2cea:5b7a]:8333 -[2a02:2528:503:2::15]:8333 -[2a02:2528:fa:1a56:216:44ff:fe6a:d112]:8333 -[2a02:27f8:2012:0:e9f7:268f:c441:6129]:8333 -[2a02:348:86:3011::1]:8333 -[2a02:4780:1:1::1:8a01]:8333 -[2a02:578:5002:116::2]:8333 -[2a02:6080::1:190b:69e3]:8333 -[2a02:6080::1:e893:d9d6]:8333 -[2a02:770:4000::139]:8333 -[2a02:7aa0:1201::deb3:81a2]:8333 -[2a02:8010:b001::5860:59b5]:8333 -[2a02:810d:21c0:f00:a248:1cff:feb8:5348]:8333 -[2a02:a50::21b:24ff:fe93:4e39]:8333 -[2a02:a80:0:1200::2]:8333 -[2a02:c200:0:10:2:1:5830:1]:8333 -[2a02:c200:0:10:2:5:4692:1]:8333 -[2a02:c200:0:10:3:0:7158:1]:8333 -[2a02:c200:0:10::2244:1]:8333 -[2a02:c200:1:10:2:3:3339:1]:8333 -[2a02:c200:1:10:2:3:7844:1]:8333 -[2a02:c200:1:10:2:5:6288:1]:8333 -[2a02:c200:1:10:3:0:5912:1]:8333 -[2a03:4000:2:496::8]:8333 -[2a03:4000:6:8009::1]:8333 -[2a03:4000:6:8063::bcd0]:8333 -[2a03:4900:fffc:b::2]:8333 -[2a03:b0c0:1:d0::d:5001]:8333 -[2a03:f80:ed15:149:154:155:235:1]:8333 -[2a03:f80:ed15:149:154:155:241:1]:8333 -[2a03:f80:ed16:ca7:ea75:b12d:2af:9e2a]:8333 -[2a04:1980:3100:1aab:290:faff:fe70:a3d8]:8333 -[2a04:1980:3100:1aab:e61d:2dff:fe29:f590]:8333 -[2a04:2f80:6:200::89]:8333 -[2a04:ac00:1:4a0b:5054:ff:fe00:5af5]:8333 -[2a04:ad80:0:68::35da]:8333 -3ffk7iumtx3cegbi.onion:8333 -3nmbbakinewlgdln.onion:8333 -4j77gihpokxu2kj4.onion:8333 -546esc6botbjfbxb.onion:8333 -5at7sq5nm76xijkd.onion:8333 -77mx2jsxaoyesz2p.onion:8333 -7g7j54btiaxhtsiy.onion:8333 -a6obdgzn67l7exu3.onion:8333 -ab64h7olpl7qpxci.onion:8333 -am2a4rahltfuxz6l.onion:8333 -azuxls4ihrr2mep7.onion:8333 -bitcoin7bi4op7wb.onion:8333 -bitcoinostk4e4re.onion:8333 -bk7yp6epnmcllq72.onion:8333 -bmutjfrj5btseddb.onion:8333 -ceeji4qpfs3ms3zc.onion:8333 -clexmzqio7yhdao4.onion:8333 -gb5ypqt63du3wfhn.onion:8333 -h2vlpudzphzqxutd.onion:8333 -n42h7r6oumcfsbrs.onion:4176 -ncwk3lutemffcpc4.onion:8333 -okdzjarwekbshnof.onion:8333 -pjghcivzkoersesd.onion:8333 -rw7ocjltix26mefn.onion:8333 -uws7itep7o3yinxo.onion:8333 -vk3qjdehyy4dwcxw.onion:8333 -vqpye2k5rcqvj5mq.onion:8333 -wpi7rpvhnndl52ee.onion:8333 +# List of fixed seed nodes for main network + +# IPv4 nodes +42.115.109.121 +89.142.245.195 +195.154.102.171 +96.39.231.103 +66.222.207.172 + +# IPv6 nodes +2001:0:5ef5:79fd:86:3369:ab96:fb52 +2001:0:9d38:6abd:3c79:691:b83e:3a03 +2001:0:9d38:6ab8:c3f:1053:9fd8:1898 +2001:0:9d38:6abd:2c7d:2690:7650:6199 + +# Onion nodes diff --git a/contrib/seeds/nodes_test.txt b/contrib/seeds/nodes_test.txt index 98365ee50..c30cc4458 100644 --- a/contrib/seeds/nodes_test.txt +++ b/contrib/seeds/nodes_test.txt @@ -1,11 +1 @@ -# List of fixed seed nodes for testnet - -# Onion nodes -thfsmmn2jbitcoin.onion -it2pj4f7657g3rhi.onion -nkf5e6b7pl4jfd4a.onion -4zhkir2ofl7orfom.onion -t6xj6wilh4ytvcs7.onion -i6y6ivorwakd7nw3.onion -ubqj4rsu3nqtxmtp.onion - +# List of fixed seed nodes for testnet \ No newline at end of file diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk index 68841afdb..3f02cb66f 100644 --- a/depends/packages/bdb.mk +++ b/depends/packages/bdb.mk @@ -1,8 +1,8 @@ package=bdb -$(package)_version=4.8.30 +$(package)_version=5.3.28 $(package)_download_path=http://download.oracle.com/berkeley-db $(package)_file_name=db-$($(package)_version).NC.tar.gz -$(package)_sha256_hash=12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef +$(package)_sha256_hash=76a25560d9e52a198d37a31440fd07632b5f1f8f9f2b6d5438f4bc3e7c9013ef $(package)_build_subdir=build_unix define $(package)_set_vars @@ -12,7 +12,8 @@ $(package)_config_opts_linux=--with-pic endef define $(package)_preprocess_cmds - sed -i.old 's/__atomic_compare_exchange/__atomic_compare_exchange_db/' dbinc/atomic.h + sed -i -e "s/WinIoCtl.h/winioctl.h/g" src/dbinc/win_db.h && \ + sed -i.old 's/__atomic_compare_exchange/__atomic_compare_exchange_db/' src/dbinc/atomic.h endef define $(package)_config_cmds @@ -20,7 +21,7 @@ define $(package)_config_cmds endef define $(package)_build_cmds - $(MAKE) libdb_cxx-4.8.a libdb-4.8.a + $(MAKE) libdb_cxx-5.3.a libdb-5.3.a endef define $(package)_stage_cmds diff --git a/depends/packages/freetype.mk b/depends/packages/freetype.mk index f7d6e0f9f..cd3c23962 100644 --- a/depends/packages/freetype.mk +++ b/depends/packages/freetype.mk @@ -1,6 +1,6 @@ package=freetype $(package)_version=2.5.3 -$(package)_download_path=http://downloads.sourceforge.net/$(package) +$(package)_download_path=http://download.savannah.gnu.org/releases/$(package) $(package)_file_name=$(package)-$($(package)_version).tar.bz2 $(package)_sha256_hash=c0848b29d52ef3ca27ad92e08351f023c5e24ce8cea7d8fe69fc96358e65f75e diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index b2ed21f9d..8aa98e58e 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -1,6 +1,6 @@ PACKAGE=qt $(package)_version=5.5.0 -$(package)_download_path=http://download.qt.io/official_releases/qt/5.5/$($(package)_version)/submodules +$(package)_download_path=http://download.qt.io/archive/qt/5.5/$($(package)_version)/submodules $(package)_suffix=opensource-src-$($(package)_version).tar.gz $(package)_file_name=qtbase-$($(package)_suffix) $(package)_sha256_hash=7e82b1318f88e56a2a9376e069aa608d4fd96b48cb0e1b880ae658b0a1af0561 diff --git a/doc/README_windows.txt b/doc/README_windows.txt index ba39352e9..6501e6353 100644 --- a/doc/README_windows.txt +++ b/doc/README_windows.txt @@ -1,23 +1,23 @@ -Bitcoin Core 0.12.1 -===================== - -Intro ------ -Bitcoin is a free open source peer-to-peer electronic cash system that is -completely decentralized, without the need for a central server or trusted -parties. Users hold the crypto keys to their own money and transact directly -with each other, with the help of a P2P network to check for double-spending. - - -Setup ------ -Unpack the files into a directory and run bitcoin-qt.exe. - -Bitcoin Core is the original Bitcoin client and it builds the backbone of the network. -However, it downloads and stores the entire history of Bitcoin transactions; -depending on the speed of your computer and network connection, the synchronization -process can take anywhere from a few hours to a day or more. - -See the bitcoin wiki at: - https://en.bitcoin.it/wiki/Main_Page -for more help and information. +Bitcoin Core 0.12.1 +===================== + +Intro +----- +Bitcoin is a free open source peer-to-peer electronic cash system that is +completely decentralized, without the need for a central server or trusted +parties. Users hold the crypto keys to their own money and transact directly +with each other, with the help of a P2P network to check for double-spending. + + +Setup +----- +Unpack the files into a directory and run bitcoin-qt.exe. + +Bitcoin Core is the original Bitcoin client and it builds the backbone of the network. +However, it downloads and stores the entire history of Bitcoin transactions; +depending on the speed of your computer and network connection, the synchronization +process can take anywhere from a few hours to a day or more. + +See the bitcoin wiki at: + https://en.bitcoin.it/wiki/Main_Page +for more help and information. diff --git a/doc/build-osx.md b/doc/build-osx.md index c3cb1b789..a247186de 100644 --- a/doc/build-osx.md +++ b/doc/build-osx.md @@ -32,7 +32,7 @@ Instructions: Homebrew #### Install dependencies using Homebrew - brew install autoconf automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf qt5 libevent + brew install autoconf automake berkeley-db5 libtool boost miniupnpc openssl pkg-config protobuf qt5 libevent NOTE: Building with Qt4 is still supported, however, could result in a broken UI. As such, building with Qt5 is recommended. diff --git a/doc/build-unix.md b/doc/build-unix.md index 74863c3ec..1da84dc2f 100644 --- a/doc/build-unix.md +++ b/doc/build-unix.md @@ -42,7 +42,7 @@ Optional dependencies: Library | Purpose | Description ------------|------------------|---------------------- miniupnpc | UPnP Support | Firewall-jumping support - libdb4.8 | Berkeley DB | Wallet storage (only needed when wallet enabled) + libdb | 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) @@ -73,16 +73,16 @@ If that doesn't work, you can install all boost development packages with: sudo apt-get install libboost-all-dev -BerkeleyDB is required for the wallet. db4.8 packages are available [here](https://launchpad.net/~bitcoin/+archive/bitcoin). +BerkeleyDB is required for the wallet. db5.3 packages are available [here](https://launchpad.net/~bitcoin/+archive/bitcoin). You can add the repository and install using the following commands: sudo add-apt-repository ppa:bitcoin/bitcoin sudo apt-get update - sudo apt-get install libdb4.8-dev libdb4.8++-dev + sudo apt-get install libdb-dev libdb++-dev Ubuntu and Debian have their own libdb-dev and libdb++-dev packages, but these will install -BerkeleyDB 5.1 or later, which break binary wallet compatibility with the distributed executables which -are based on BerkeleyDB 4.8. If you do not care about wallet compatibility, +BerkeleyDB 5.3 or later, which break binary wallet compatibility with the distributed executables which +are based on BerkeleyDB 5.3. If you do not care about wallet compatibility, pass `--with-incompatible-bdb` to configure. See the section "Disable-wallet mode" to build Bitcoin Core without wallet. @@ -148,13 +148,13 @@ BDB_PREFIX="${BITCOIN_ROOT}/db4" mkdir -p $BDB_PREFIX # Fetch the source and verify that it is not tampered with -wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz' -echo '12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz' | sha256sum -c -# -> db-4.8.30.NC.tar.gz: OK -tar -xzvf db-4.8.30.NC.tar.gz +wget 'http://download.oracle.com/berkeley-db/db-5.3.28.NC.tar.gz' +echo '76a25560d9e52a198d37a31440fd07632b5f1f8f9f2b6d5438f4bc3e7c9013ef db-5.3.28.NC.tar.gz' | sha256sum -c +# -> db-5.2.28.NC.tar.gz: OK +tar -xzvf db-5.3.28.NC.tar.gz # Build the library and install to our prefix -cd db-4.8.30.NC/build_unix/ +cd db-5.3.28.NC/build_unix/ # Note: Do a static build so that it can be embedded into the executable, instead of having to find a .so at runtime ../dist/configure --enable-cxx --disable-shared --with-pic --prefix=$BDB_PREFIX make install @@ -232,7 +232,7 @@ disable-wallet mode with: ./configure --disable-wallet -In this case there is no dependency on Berkeley DB 4.8. +In this case there is no dependency on Berkeley DB 5.3. Mining is also possible in disable-wallet mode, but only using the `getblocktemplate` RPC call not `getwork`. diff --git a/src/Makefile.am b/src/Makefile.am index efe7e028d..9d9a1596c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,6 +3,7 @@ DIST_SUBDIRS = secp256k1 univalue AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) AM_CXXFLAGS = $(HARDENED_CXXFLAGS) AM_CPPFLAGS = $(HARDENED_CPPFLAGS) +EXTRA_LIBRARIES = if EMBEDDED_LEVELDB LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include @@ -20,13 +21,13 @@ $(LIBLEVELDB) $(LIBMEMENV): endif BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config -BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) +BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BDB_CPPFLAGS) $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include BITCOIN_INCLUDES += -I$(srcdir)/univalue/include LIBBITCOIN_SERVER=libbitcoin_server.a -LIBBITCOIN_WALLET=libbitcoin_wallet.a + LIBBITCOIN_COMMON=libbitcoin_common.a LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a @@ -35,6 +36,16 @@ LIBBITCOINQT=qt/libbitcoinqt.a LIBSECP256K1=secp256k1/libsecp256k1.la LIBUNIVALUE=univalue/libunivalue.la +if ENABLE_ZMQ +LIBBITCOIN_ZMQ=libbitcoin_zmq.a +endif +if BUILD_BITCOIN_LIBS +LIBBITCOINCONSENSUS=libbitcoinconsensus.la +endif +if ENABLE_WALLET +LIBBITCOIN_WALLET=libbitcoin_wallet.a +endif + $(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) @@ -43,26 +54,17 @@ $(LIBUNIVALUE): $(wildcard univalue/lib/*) $(wildcard univalue/include/*) # 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: -EXTRA_LIBRARIES = \ - crypto/libbitcoin_crypto.a \ - libbitcoin_util.a \ - libbitcoin_common.a \ - libbitcoin_server.a \ - libbitcoin_cli.a -if ENABLE_WALLET -BITCOIN_INCLUDES += $(BDB_CPPFLAGS) -EXTRA_LIBRARIES += libbitcoin_wallet.a -endif -if ENABLE_ZMQ -EXTRA_LIBRARIES += libbitcoin_zmq.a -endif +EXTRA_LIBRARIES += \ + $(LIBBITCOIN_CRYPTO) \ + $(LIBBITCOIN_UTIL) \ + $(LIBBITCOIN_COMMON) \ + $(LIBBITCOIN_CONSENSUS) \ + $(LIBBITCOIN_SERVER) \ + $(LIBBITCOIN_CLI) \ + $(LIBBITCOIN_WALLET) \ + $(LIBBITCOIN_ZMQ) -if BUILD_BITCOIN_LIBS -lib_LTLIBRARIES = libbitcoinconsensus.la -LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la -else -LIBBITCOIN_CONSENSUS= -endif +lib_LTLIBRARIES = $(LIBBITCOINCONSENSUS) bin_PROGRAMS = TESTS = @@ -128,6 +130,7 @@ BITCOIN_CORE_H = \ policy/fees.h \ policy/policy.h \ policy/rbf.h \ + pos.h \ pow.h \ prevector.h \ primitives/block.h \ @@ -206,6 +209,7 @@ libbitcoin_server_a_SOURCES = \ noui.cpp \ policy/fees.cpp \ policy/policy.cpp \ + pos.cpp \ pow.cpp \ rest.cpp \ rpcblockchain.cpp \ @@ -224,8 +228,6 @@ libbitcoin_server_a_SOURCES = \ $(BITCOIN_CORE_H) if ENABLE_ZMQ -LIBBITCOIN_ZMQ=libbitcoin_zmq.a - libbitcoin_zmq_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(ZMQ_CFLAGS) libbitcoin_zmq_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) libbitcoin_zmq_a_SOURCES = \ @@ -251,7 +253,7 @@ libbitcoin_wallet_a_SOURCES = \ $(BITCOIN_CORE_H) # crypto primitives library -crypto_libbitcoin_crypto_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_CONFIG_INCLUDES) +crypto_libbitcoin_crypto_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_CONFIG_INCLUDES) $(SSL_CFLAGS) crypto_libbitcoin_crypto_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) crypto_libbitcoin_crypto_a_SOURCES = \ crypto/common.h \ @@ -261,6 +263,8 @@ crypto_libbitcoin_crypto_a_SOURCES = \ crypto/hmac_sha512.h \ crypto/ripemd160.cpp \ crypto/ripemd160.h \ + crypto/scrypt.cpp \ + crypto/scrypt.h \ crypto/sha1.cpp \ crypto/sha1.h \ crypto/sha256.cpp \ @@ -268,6 +272,41 @@ crypto_libbitcoin_crypto_a_SOURCES = \ crypto/sha512.cpp \ crypto/sha512.h +# consensus: shared between all executables that validate any consensus rules. +libbitcoin_consensus_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) +libbitcoin_consensus_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) +libbitcoin_consensus_a_SOURCES = \ + amount.h \ + arith_uint256.cpp \ + arith_uint256.h \ + consensus/merkle.cpp \ + consensus/merkle.h \ + consensus/params.h \ + consensus/validation.h \ + hash.cpp \ + hash.h \ + prevector.h \ + primitives/block.cpp \ + primitives/block.h \ + primitives/transaction.cpp \ + primitives/transaction.h \ + pubkey.cpp \ + pubkey.h \ + script/bitcoinconsensus.cpp \ + script/interpreter.cpp \ + script/interpreter.h \ + script/script.cpp \ + script/script.h \ + script/script_error.cpp \ + script/script_error.h \ + serialize.h \ + tinyformat.h \ + uint256.cpp \ + uint256.h \ + utilstrencodings.cpp \ + utilstrencodings.h \ + version.h + # common: shared between bitcoind, and bitcoin-qt and non-server tools libbitcoin_common_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) libbitcoin_common_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) @@ -349,20 +388,14 @@ bitcoind_LDADD = \ $(LIBBITCOIN_COMMON) \ $(LIBUNIVALUE) \ $(LIBBITCOIN_UTIL) \ + $(LIBBITCOIN_WALLET) \ + $(LIBBITCOIN_ZMQ) \ $(LIBBITCOIN_CRYPTO) \ $(LIBLEVELDB) \ $(LIBMEMENV) \ $(LIBSECP256K1) - -if ENABLE_ZMQ -bitcoind_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS) -endif - -if ENABLE_WALLET -bitcoind_LDADD += libbitcoin_wallet.a -endif - -bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) + +bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) # bitcoin-cli binary # bitcoin_cli_SOURCES = bitcoin-cli.cpp @@ -417,28 +450,15 @@ bitcoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS) # bitcoinconsensus library # if BUILD_BITCOIN_LIBS include_HEADERS = script/bitcoinconsensus.h -libbitcoinconsensus_la_SOURCES = \ - crypto/hmac_sha512.cpp \ - crypto/ripemd160.cpp \ - crypto/sha1.cpp \ - crypto/sha256.cpp \ - crypto/sha512.cpp \ - hash.cpp \ - primitives/transaction.cpp \ - pubkey.cpp \ - script/bitcoinconsensus.cpp \ - script/interpreter.cpp \ - script/script.cpp \ - uint256.cpp \ - utilstrencodings.cpp +libbitcoinconsensus_la_SOURCES = $(crypto_libbitcoin_crypto_a_SOURCES) $(libbitcoin_consensus_a_SOURCES) if GLIBC_BACK_COMPAT libbitcoinconsensus_la_SOURCES += compat/glibc_compat.cpp endif libbitcoinconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS) -libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1) -libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL +libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1) $(CRYPTO_LIBS) +libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL $(SSL_CFLAGS) libbitcoinconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) endif diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 9b7085be3..d88942d23 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -256,6 +256,8 @@ RES_ICONS = \ qt/res/icons/key.png \ qt/res/icons/lock_closed.png \ qt/res/icons/lock_open.png \ + qt/res/icons/staking_off.png \ + qt/res/icons/staking_on.png \ qt/res/icons/open.png \ qt/res/icons/overview.png \ qt/res/icons/quit.png \ diff --git a/src/Makefile.test.include b/src/Makefile.test.include index f030a5b35..122149ee1 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -42,7 +42,6 @@ BITCOIN_TESTS =\ test/alert_tests.cpp \ test/allocator_tests.cpp \ test/base32_tests.cpp \ - test/base58_tests.cpp \ test/base64_tests.cpp \ test/bip32_tests.cpp \ test/bloom_tests.cpp \ @@ -73,17 +72,14 @@ BITCOIN_TESTS =\ test/scheduler_tests.cpp \ test/script_P2SH_tests.cpp \ test/script_P2PKH_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/streams_tests.cpp \ test/test_bitcoin.cpp \ test/test_bitcoin.h \ test/timedata_tests.cpp \ - test/transaction_tests.cpp \ test/txvalidationcache_tests.cpp \ test/versionbits_tests.cpp \ test/uint256_tests.cpp \ diff --git a/src/amount.h b/src/amount.h index a48b17d51..b42d57511 100644 --- a/src/amount.h +++ b/src/amount.h @@ -27,7 +27,7 @@ extern const std::string CURRENCY_UNIT; * critical; in unusual circumstances like a(nother) overflow bug that allowed * for the creation of coins out of thin air modification could lead to a fork. * */ -static const CAmount MAX_MONEY = 21000000 * COIN; +static const CAmount MAX_MONEY = std::numeric_limits::max(); inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); } /** Type-safe wrapper class for fee rates diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 2c502ead3..89537b408 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -69,6 +69,7 @@ static bool AppInitRawTx(int argc, char* argv[]) strUsage += HelpMessageOpt("delout=N", _("Delete output N from TX")); strUsage += HelpMessageOpt("in=TXID:VOUT", _("Add input to TX")); strUsage += HelpMessageOpt("locktime=N", _("Set TX lock time to N")); + strUsage += HelpMessageOpt("time=N", _("Set TX time to N")); strUsage += HelpMessageOpt("nversion=N", _("Set TX version to N")); strUsage += HelpMessageOpt("outaddr=VALUE:ADDRESS", _("Add address-based output to TX")); strUsage += HelpMessageOpt("outdata=[VALUE:]DATA", _("Add data-based output to TX")); @@ -175,6 +176,15 @@ static void MutateTxLocktime(CMutableTransaction& tx, const string& cmdVal) tx.nLockTime = (unsigned int) newLocktime; } +static void MutateTxTime(CMutableTransaction& tx, const string& cmdVal) +{ + int64_t newTime = atoi64(cmdVal); + if (newTime < 0LL || newTime > 0xffffffffLL) + throw runtime_error("Invalid TX time requested"); + + tx.nTime = (unsigned int) newTime; +} + static void MutateTxAddInput(CMutableTransaction& tx, const string& strInput) { // separate TXID:VOUT in string @@ -497,7 +507,8 @@ static void MutateTx(CMutableTransaction& tx, const string& command, MutateTxVersion(tx, commandVal); else if (command == "locktime") MutateTxLocktime(tx, commandVal); - + else if (command == "time") + MutateTxTime(tx, commandVal); else if (command == "delin") MutateTxDelInput(tx, commandVal); else if (command == "in") diff --git a/src/chain.cpp b/src/chain.cpp index 3450ed6c3..7791e2bc0 100644 --- a/src/chain.cpp +++ b/src/chain.cpp @@ -110,3 +110,10 @@ void CBlockIndex::BuildSkip() if (pprev) pskip = pprev->GetAncestor(GetSkipHeight(nHeight)); } + +const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake) +{ + while (pindex && pindex->pprev && (pindex->IsProofOfStake() != fProofOfStake)) + pindex = pindex->pprev; + return pindex; +} diff --git a/src/chain.h b/src/chain.h index ae6c4338d..f7b2e469f 100644 --- a/src/chain.h +++ b/src/chain.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto + // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2015 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -7,6 +7,7 @@ #define BITCOIN_CHAIN_H #include "arith_uint256.h" +#include "chainparams.h" #include "primitives/block.h" #include "pow.h" #include "tinyformat.h" @@ -90,6 +91,10 @@ enum BlockStatus { 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, + BLOCK_PROOF_OF_STAKE = 128, //! is proof-of-stake block + BLOCK_STAKE_ENTROPY = 256, + BLOCK_STAKE_MODIFIER = 512, + }; /** The block chain is a tree shaped structure starting with the @@ -136,6 +141,9 @@ public: //! Verification status of this block. See enum BlockStatus unsigned int nStatus; + //! hash modifier of proof-of-stake + uint256 nStakeModifier; + //! block header int nVersion; uint256 hashMerkleRoot; @@ -159,6 +167,7 @@ public: nTx = 0; nChainTx = 0; nStatus = 0; + nStakeModifier = uint256(); nSequenceId = 0; nVersion = 0; @@ -220,11 +229,17 @@ public: return *phashBlock; } + uint256 GetBlockPoWHash() const + { + return GetBlockHeader().GetPoWHash(); + } + int64_t GetBlockTime() const { return (int64_t)nTime; } +private: enum { nMedianTimeSpan=11 }; int64_t GetMedianTimePast() const @@ -241,6 +256,30 @@ public: return pbegin[(pend - pbegin)/2]; } +public: + int64_t GetPastTimeLimit() const + { + if (Params().GetConsensus().IsProtocolV2(GetBlockTime())) + return GetBlockTime(); + else + return GetMedianTimePast(); + } + + bool IsProofOfWork() const + { + return !IsProofOfStake(); + } + + bool IsProofOfStake() const + { + return (nStatus & BLOCK_PROOF_OF_STAKE); + } + + void SetProofOfStake() + { + nStatus |= BLOCK_PROOF_OF_STAKE; + } + std::string ToString() const { return strprintf("CBlockIndex(pprev=%p, nHeight=%d, merkle=%s, hashBlock=%s)", @@ -285,13 +324,15 @@ class CDiskBlockIndex : public CBlockIndex { public: uint256 hashPrev; - + uint256 nHashBlock; CDiskBlockIndex() { hashPrev = uint256(); + nHashBlock = uint256(); } explicit CDiskBlockIndex(const CBlockIndex* pindex) : CBlockIndex(*pindex) { hashPrev = (pprev ? pprev->GetBlockHash() : uint256()); + nHashBlock = *pindex->phashBlock; } ADD_SERIALIZE_METHODS; @@ -303,6 +344,8 @@ public: READWRITE(VARINT(nHeight)); READWRITE(VARINT(nStatus)); + READWRITE(nStakeModifier); + READWRITE(nHashBlock); READWRITE(VARINT(nTx)); if (nStatus & (BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO)) READWRITE(VARINT(nFile)); @@ -322,14 +365,7 @@ public: uint256 GetBlockHash() const { - CBlockHeader block; - block.nVersion = nVersion; - block.hashPrevBlock = hashPrev; - block.hashMerkleRoot = hashMerkleRoot; - block.nTime = nTime; - block.nBits = nBits; - block.nNonce = nNonce; - return block.GetHash(); + return nHashBlock; } @@ -401,4 +437,6 @@ public: const CBlockIndex *FindFork(const CBlockIndex *pindex) const; }; +const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake); + #endif // BITCOIN_CHAIN_H diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 4af6f34c6..2979a7502 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -16,24 +16,26 @@ #include "chainparamsseeds.h" +using namespace std; + static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) { - CMutableTransaction txNew; - txNew.nVersion = 1; - txNew.vin.resize(1); - txNew.vout.resize(1); - txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); - txNew.vout[0].nValue = genesisReward; - txNew.vout[0].scriptPubKey = genesisOutputScript; - CBlock genesis; - genesis.nTime = nTime; - genesis.nBits = nBits; - genesis.nNonce = nNonce; - genesis.nVersion = nVersion; - genesis.vtx.push_back(txNew); - genesis.hashPrevBlock.SetNull(); - genesis.hashMerkleRoot = BlockMerkleRoot(genesis); + CMutableTransaction txNew; + txNew.nTime = 1393221600; + txNew.vin.resize(1); + txNew.vout.resize(1); + txNew.vin[0].scriptSig = CScript() << 0 << CScriptNum(42) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + txNew.vout[0].SetEmpty(); + + CBlock genesis; + genesis.vtx.push_back(txNew); + genesis.hashPrevBlock.SetNull(); + genesis.hashMerkleRoot = uint256S("12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90"); + genesis.nVersion = 1; + genesis.nTime = 1393221600; + genesis.nBits = 0x1e0fffff; + genesis.nNonce = 164482; return genesis; } @@ -42,15 +44,15 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi * transaction cannot be spent since 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 + * CBlock(hash=000001faef25dec4fbcf906e6242621df2c183bf232f263d0ba5b101911e4563, ver=1, hashPrevBlock=0000000000000000000000000000000000000000000000000000000000000000, hashMerkleRoot=12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90, nTime=1393221600, nBits=1e0fffff, nNonce=164482, vtx=1, vchBlockSig=) + * Coinbase(hash=12630d16a9, ver=1, nTime=1393221600, vin.size=1, vout.size=1, nLockTime=0) + * CTxIn(COutPoint(0000000000, 4294967295), coinbase 00012a24323020466562203230313420426974636f696e2041544d7320636f6d6520746f20555341) + * CTxOut(empty) + * vMerkleTree: 12630d16a9 */ static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) { - const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; + const char* pszTimestamp = "20 Feb 2014 Bitcoin ATMs come to USA"; const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward); } @@ -70,57 +72,86 @@ class CMainParams : public CChainParams { public: CMainParams() { strNetworkID = "main"; - consensus.nSubsidyHalvingInterval = 210000; + consensus.nMaxReorganizationDepth = 500; consensus.nMajorityEnforceBlockUpgrade = 750; consensus.nMajorityRejectBlockOutdated = 950; consensus.nMajorityWindow = 1000; + consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + consensus.posLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + consensus.posLimitV2 = uint256S("000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff"); + consensus.nTargetTimespan = 16 * 60; // 16 mins + consensus.nTargetSpacingV1 = 60; + consensus.nTargetSpacing = 64; consensus.BIP34Height = 227931; consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"); - consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks - consensus.nPowTargetSpacing = 10 * 60; consensus.fPowAllowMinDifficultyBlocks = false; consensus.fPowNoRetargeting = false; consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016 - consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing + consensus.nMinerConfirmationWindow = 2016; // nTargetTimespan / nTargetSpacing consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28; consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008 consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008 // Deployment of BIP68, BIP112, and BIP113. - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0; - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1462060800; // May 1st, 2016 - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017 +// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0; +// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 999999999999ULL; // never +// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 0; // out of time + + consensus.nProtocolV1RetargetingFixedTime = 1395631999; + consensus.nProtocolV2Time = 1407053625; + consensus.nProtocolV3Time = 1444028400; + consensus.nLastPOWBlock = 10000; + consensus.nStakeTimestampMask = 0xf; /** * 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 32-bit integer with any alignment. */ - pchMessageStart[0] = 0xf9; - pchMessageStart[1] = 0xbe; - pchMessageStart[2] = 0xb4; - pchMessageStart[3] = 0xd9; - vAlertPubKey = ParseHex("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284"); - nDefaultPort = 8333; + pchMessageStart[0] = 0x70; + pchMessageStart[1] = 0x35; + pchMessageStart[2] = 0x22; + pchMessageStart[3] = 0x05; + vAlertPubKey = ParseHex("0486bce1bac0d543f104cbff2bd23680056a3b9ea05e1137d2ff90eeb5e08472eb500322593a2cb06fbf8297d7beb6cd30cb90f98153b5b7cce1493749e41e0284"); + nDefaultPort = 15714; nMaxTipAge = 24 * 60 * 60; nPruneAfterHeight = 100000; - genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN); + /** + * Build the genesis block. Note that the output of its generation + * transaction cannot be spent since it did not originally exist in the + * database. + * + * CBlock(hash=000001faef25dec4fbcf906e6242621df2c183bf232f263d0ba5b101911e4563, ver=1, hashPrevBlock=0000000000000000000000000000000000000000000000000000000000000000, hashMerkleRoot=12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90, nTime=1393221600, nBits=1e0fffff, nNonce=164482, vtx=1, vchBlockSig=) + * Coinbase(hash=12630d16a9, ver=1, nTime=1393221600, vin.size=1, vout.size=1, nLockTime=0) + * CTxIn(COutPoint(0000000000, 4294967295), coinbase 00012a24323020466562203230313420426974636f696e2041544d7320636f6d6520746f20555341) + * CTxOut(empty) + * vMerkleTree: 12630d16a9 + */ + const char* pszTimestamp = "20 Feb 2014 Bitcoin ATMs come to USA"; + CMutableTransaction txNew; + txNew.nTime = 1393221600; + txNew.vin.resize(1); + txNew.vout.resize(1); + txNew.vin[0].scriptSig = CScript() << 0 << CScriptNum(42) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + txNew.vout[0].SetEmpty(); + genesis.vtx.push_back(txNew); + genesis.hashPrevBlock.SetNull(); + genesis.nVersion = 1; + genesis.nTime = 1393221600; + genesis.nBits = 0x1e0fffff; + genesis.nNonce = 164482; + genesis.hashMerkleRoot = BlockMerkleRoot(genesis); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")); - assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); + assert(consensus.hashGenesisBlock == uint256S("0x000001faef25dec4fbcf906e6242621df2c183bf232f263d0ba5b101911e4563")); + assert(genesis.hashMerkleRoot == uint256S("0x12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90")); - vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be")); // Pieter Wuille - vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me")); // Matt Corallo - vSeeds.push_back(CDNSSeedData("dashjr.org", "dnsseed.bitcoin.dashjr.org")); // Luke Dashjr - vSeeds.push_back(CDNSSeedData("bitcoinstats.com", "seed.bitcoinstats.com")); // Christian Decker - vSeeds.push_back(CDNSSeedData("xf2.org", "bitseed.xf2.org")); // Jeff Garzik - vSeeds.push_back(CDNSSeedData("bitcoin.jonasschnelli.ch", "seed.bitcoin.jonasschnelli.ch")); // Jonas Schnelli + vSeeds.push_back(CDNSSeedData("vasin.nl", "dnsseed.vasin.nl")); + vSeeds.push_back(CDNSSeedData("vps.joshuajbouw.com", "dnsseed.joshuajbouw.com")); - base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,0); - base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,5); - base58Prefixes[SECRET_KEY] = std::vector(1,128); + base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,25); + base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,85); + base58Prefixes[SECRET_KEY] = std::vector(1,153); base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container >(); base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container >(); @@ -133,24 +164,17 @@ public: fTestnetToBeDeprecatedFieldRPC = false; checkpointData = (CCheckpointData) { - boost::assign::map_list_of - ( 11111, uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")) - ( 33333, uint256S("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")) - ( 74000, uint256S("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")) - (105000, uint256S("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97")) - (134444, uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")) - (168000, uint256S("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763")) - (193000, uint256S("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317")) - (210000, uint256S("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e")) - (216116, uint256S("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e")) - (225430, uint256S("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932")) - (250000, uint256S("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214")) - (279000, uint256S("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40")) - (295000, uint256S("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983")), - 1397080064, // * UNIX timestamp of last checkpoint block - 36544669, // * total number of transactions between genesis and last checkpoint - // (the tx=... number in the SetBestChain debug.log lines) - 60000.0 // * estimated number of transactions per day after checkpoint + boost::assign::map_list_of + ( 5001, uint256S("0x2fac9021be0c311e7b6dc0933a72047c70f817e2eb1e01bede011193ad1b28bc")) // hardfork + ( 10000, uint256S("0x0000000000827e4dc601f7310a91c45af8df0dfc1b6fa1dfa5b896cb00c8767c")) // last pow block + ( 38425, uint256S("0x62bf2e9701226d2f88d9fa99d650bd81f3faf2e56f305b7d71ccd1e7aa9c3075")) // hardfork + (254348, uint256S("0x9bf8d9bd757d3ef23d5906d70567e5f0da93f1e0376588c8d421a95e2421838b")) // minor network split + (319002, uint256S("0x0011494d03b2cdf1ecfc8b0818f1e0ef7ee1d9e9b3d1279c10d35456bc3899ef")) // hardfork + (872456, uint256S("0xe4fd321ced1de06213d2e246b150b4bfd8c4aa0989965dce88f2a58668c64860")), // hardfork + 1444028528, // * UNIX timestamp of last checkpoint block + 2774767, // * total number of transactions between genesis and last checkpoint + // (the tx=... number in the SetBestChain debug.log lines) + 3500.0 // * estimated number of transactions per day after checkpoint }; } }; @@ -163,41 +187,29 @@ class CTestNetParams : public CChainParams { public: CTestNetParams() { strNetworkID = "test"; - consensus.nSubsidyHalvingInterval = 210000; consensus.nMajorityEnforceBlockUpgrade = 51; consensus.nMajorityRejectBlockOutdated = 75; consensus.nMajorityWindow = 100; consensus.BIP34Height = 21111; consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"); - consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks - consensus.nPowTargetSpacing = 10 * 60; + consensus.powLimit = uint256S("0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); consensus.fPowAllowMinDifficultyBlocks = true; - consensus.fPowNoRetargeting = false; - consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains - consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing - consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28; - consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008 - consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008 - - // Deployment of BIP68, BIP112, and BIP113. - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0; - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1456790400; // March 1st, 2016 - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017 - - pchMessageStart[0] = 0x0b; - pchMessageStart[1] = 0x11; - pchMessageStart[2] = 0x09; - pchMessageStart[3] = 0x07; - vAlertPubKey = ParseHex("04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a"); - nDefaultPort = 18333; + consensus.nProtocolV1RetargetingFixedTime = 0; + consensus.nProtocolV2Time = 0; + consensus.nProtocolV3Time = 0; + consensus.nLastPOWBlock = 0x7fffffff; + pchMessageStart[0] = 0xcd; + pchMessageStart[1] = 0xf2; + pchMessageStart[2] = 0xc0; + pchMessageStart[3] = 0xef; + vAlertPubKey = ParseHex("0471dc165db490094d35cde15b1f5d755fa6ad6f2b5ed0f340e3f17f57389c3c2af113a8cbcc885bde73305a553b5640c83021128008ddf882e856336269080496"); + nDefaultPort = 25714; nMaxTipAge = 0x7fffffff; nPruneAfterHeight = 1000; - genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN); + genesis = CreateGenesisBlock(1411111111, 216178, 0x1f00ffff, 2, 50 * COIN); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943")); - assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); + vFixedSeeds.clear(); vSeeds.clear(); @@ -221,10 +233,10 @@ public: checkpointData = (CCheckpointData) { boost::assign::map_list_of - ( 546, uint256S("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")), - 1337966069, - 1488, - 300 + ( 0, uint256S("0x0000724595fb3b9609d441cbfb9577615c292abf07d996d3edabc48de843642d")), + 0, + 0, + 0 }; } @@ -238,64 +250,110 @@ class CRegTestParams : public CChainParams { public: CRegTestParams() { strNetworkID = "regtest"; - consensus.nSubsidyHalvingInterval = 150; + consensus.nMaxReorganizationDepth = 500; consensus.nMajorityEnforceBlockUpgrade = 750; consensus.nMajorityRejectBlockOutdated = 950; consensus.nMajorityWindow = 1000; + consensus.powLimit = uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + consensus.posLimit = uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + consensus.posLimitV2 = uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + consensus.nTargetTimespan = 16 * 60; // 16 mins + consensus.nTargetSpacingV1 = 60; + consensus.nTargetSpacing = 64; consensus.BIP34Height = -1; // BIP34 has not necessarily activated on regtest consensus.BIP34Hash = uint256(); - consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks - consensus.nPowTargetSpacing = 10 * 60; consensus.fPowAllowMinDifficultyBlocks = true; consensus.fPowNoRetargeting = true; - consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains - consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016) + consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016 + consensus.nMinerConfirmationWindow = 2016; // nTargetTimespan / nTargetSpacing consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28; - consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 0; - consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 999999999999ULL; - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0; - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 0; - consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 999999999999ULL; + consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008 + consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008 - pchMessageStart[0] = 0xfa; - pchMessageStart[1] = 0xbf; - pchMessageStart[2] = 0xb5; - pchMessageStart[3] = 0xda; - nMaxTipAge = 24 * 60 * 60; - nDefaultPort = 18444; - nPruneAfterHeight = 1000; + // Deployment of BIP68, BIP112, and BIP113. +// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0; +// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 999999999999ULL; // never +// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 0; // out of time - genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN); + consensus.nProtocolV1RetargetingFixedTime = 1400000000; + consensus.nProtocolV2Time = 1410000000; + consensus.nProtocolV3Time = 1420000000; + consensus.nLastPOWBlock = 10000; + consensus.nStakeTimestampMask = 0xf; + + /** + * 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 32-bit integer with any alignment. + */ + pchMessageStart[0] = 0x70; + pchMessageStart[1] = 0x35; + pchMessageStart[2] = 0x22; + pchMessageStart[3] = 0x06; + vAlertPubKey = ParseHex("042508124261e3c969d9b4988349c41a329c6979e446facffc3227e16e5420c366e7d917e8ef80e70a27b90582272c93b6d0f16b0c728b970f73478167729cbbea"); + nDefaultPort = 25714; + nMaxTipAge = 0x7fffffff; + nPruneAfterHeight = 100000; + + /** + * Build the genesis block. Note that the output of its generation + * transaction cannot be spent since it did not originally exist in the + * database. + * + * CBlock(hash=000001faef25dec4fbcf906e6242621df2c183bf232f263d0ba5b101911e4563, ver=1, hashPrevBlock=0000000000000000000000000000000000000000000000000000000000000000, hashMerkleRoot=12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90, nTime=1393221600, nBits=1e0fffff, nNonce=164482, vtx=1, vchBlockSig=) + * Coinbase(hash=12630d16a9, ver=1, nTime=1393221600, vin.size=1, vout.size=1, nLockTime=0) + * CTxIn(COutPoint(0000000000, 4294967295), coinbase 00012a24323020466562203230313420426974636f696e2041544d7320636f6d6520746f20555341) + * CTxOut(empty) + * vMerkleTree: 12630d16a9 + */ + const char* pszTimestamp = "20 Feb 2014 Bitcoin ATMs come to USA"; + CMutableTransaction txNew; + txNew.nTime = 1393221600; + txNew.vin.resize(1); + txNew.vout.resize(1); + txNew.vin[0].scriptSig = CScript() << 0 << CScriptNum(42) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + txNew.vout[0].SetEmpty(); + genesis.vtx.push_back(txNew); + genesis.hashPrevBlock.SetNull(); + genesis.nVersion = 1; + genesis.nTime = 1393221600; + genesis.nBits = 0x1e0fffff; + genesis.nNonce = 164482; + genesis.hashMerkleRoot = BlockMerkleRoot(genesis); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")); - assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); + assert(consensus.hashGenesisBlock == uint256S("0x000001faef25dec4fbcf906e6242621df2c183bf232f263d0ba5b101911e4563")); + assert(genesis.hashMerkleRoot == uint256S("0x12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90")); vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds. vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds. + base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,25); + base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,85); + base58Prefixes[SECRET_KEY] = std::vector(1,153); + base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container >(); + base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container >(); + + fMiningRequiresPeers = false; fDefaultConsistencyChecks = true; fRequireStandard = false; fMineBlocksOnDemand = true; fTestnetToBeDeprecatedFieldRPC = false; - checkpointData = (CCheckpointData){ + checkpointData = (CCheckpointData) { boost::assign::map_list_of - ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")), + ( 0, uint256S("0x000001faef25dec4fbcf906e6242621df2c183bf232f263d0ba5b101911e4563")), 0, 0, 0 }; - base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,111); - base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,196); - base58Prefixes[SECRET_KEY] = std::vector(1,239); - base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x35)(0x87)(0xCF).convert_to_container >(); - base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x35)(0x83)(0x94).convert_to_container >(); + } }; static CRegTestParams regTestParams; + + static CChainParams *pCurrentParams = 0; const CChainParams &Params() { @@ -320,3 +378,4 @@ void SelectParams(const std::string& network) SelectBaseParams(network); pCurrentParams = &Params(network); } + diff --git a/src/chainparams.h b/src/chainparams.h index fdf5c17a0..f2956ea60 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -76,6 +76,7 @@ public: const std::vector& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; } const std::vector& FixedSeeds() const { return vFixedSeeds; } const CCheckpointData& Checkpoints() const { return checkpointData; } + int LastPOWBlock() const { return consensus.nLastPOWBlock; } protected: CChainParams() {} diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index cb71a8b55..0f784e029 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -32,7 +32,7 @@ class CBaseMainParams : public CBaseChainParams public: CBaseMainParams() { - nRPCPort = 8332; + nRPCPort = 15715; } }; static CBaseMainParams mainParams; @@ -45,8 +45,8 @@ class CBaseTestNetParams : public CBaseChainParams public: CBaseTestNetParams() { - nRPCPort = 18332; - strDataDir = "testnet3"; + nRPCPort = 25715; + strDataDir = "testnet"; } }; static CBaseTestNetParams testNetParams; diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h index 1406e8680..e134cf583 100644 --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.h @@ -8,952 +8,18 @@ * 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,0x05,0x02,0x91,0xc9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x16,0x8e,0xd6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x35,0xac,0xc5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xa1,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe6,0x8c,0xa6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe7,0x03,0x82}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xff,0x50,0x67}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0xca,0xe6,0x31}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x55,0x0b,0x82}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5b,0x61,0x19}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5e,0x64,0x7a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5f,0x63,0x84}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x73,0x08,0xce}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x7f,0x80,0xbf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x9a,0xb2,0x19}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcf,0x67,0x2b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcf,0x68,0x69}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd2,0xe6,0x96}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe0,0x12,0x54}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xf6,0xa8,0x6a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0xfe,0x40,0x2f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x06,0x47,0x7b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x06,0x47,0x7c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x0e,0x86,0x0d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x1e,0x24,0xdc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xa4,0x06,0x68}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xaa,0x6a,0xcb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xb9,0x86,0xc9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xcc,0x80,0x63}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xcc,0x80,0xdb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x01,0xdb,0x58}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x61,0x84,0x6d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa0,0x37}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa9,0x7b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x8b,0x20,0x2e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xdd,0xa3,0xda}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x26,0x82,0xc0,0x48}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x29,0x4b,0x60,0x50}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x03,0x00,0x31}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x48,0xb9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x60,0x81}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x38,0x04,0x3f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x00,0x7f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x50,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x61,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x84,0xdb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x15,0x61,0x87}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcd,0x43}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xce,0xbc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1d,0x14,0xd1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x32,0xea,0xb3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xa0,0xa8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa1,0x23}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa1,0x67}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xb6,0x84,0x64}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xda,0xe3,0x5c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe2,0x6d,0x14}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe3,0x42,0x84}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe3,0x42,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xa5,0x9a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xa5,0x9b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xee,0xbb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xea,0x68,0x30}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xef,0x6b,0x4a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xf4,0x00,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xfe,0x48,0xc3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x05,0x0d,0x2c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x07,0x25,0x72}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x1e,0x25,0x67}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x27,0x69,0x3c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x6a,0x28,0xe7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1d,0x00,0x25}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4c,0xc0,0xf6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x98,0xc0,0xb3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0x40,0xae}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xaf,0xa0,0x16}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xc7,0x80,0x00}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0x60,0xab,0x81}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0xa1,0xee,0x39}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xfb,0xc3,0xdd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x23,0xe1,0x13}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x2b,0x82,0xb2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x41,0x27,0x0c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6b,0xc8,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x85,0xc2,0x02}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb5,0xee,0xba}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb7,0x16,0x32}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x55,0x78}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0xa2,0x59}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xee,0x22,0x7d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x19,0xab,0x49}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x1b,0xa6,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x35,0x89,0x65}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x47,0x48,0x2c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x53,0xe1,0x92}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x79,0x03,0xa3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0xcb,0x66,0x56}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x5e,0x83,0x3b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0xbc,0x88,0xe9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x0b,0xa2,0xda}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x17,0xe4,0x85}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x5a,0x89,0x59}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x72,0x21,0x31}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x96,0x69,0x4d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xac,0x0a,0x04}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfa}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xe7,0x61,0xac}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xf0,0xed,0x9b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x9f,0x0d,0x22}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0x4a,0xce}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xdd,0xc1,0x37}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xe3,0x48,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x41,0x78,0x35}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x41,0xcd,0xe2}, 9000}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x90,0x04,0x22}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x27,0x31,0xc7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x32,0xab,0xcd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x41,0x29,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x71,0x62,0x3d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x77,0x61,0x27}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x92,0x46,0x7c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xc1,0x47,0x02}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x2e,0x0a,0xed}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x50,0xc8,0xbb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0xb9,0x61,0x75}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xfe,0xa0,0x19}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x1c,0xcb,0x05}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x34,0x82,0x6e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x53,0xc2,0x7a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x80,0x20,0xa7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xb3,0x88,0x50}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xeb,0x26,0x46}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x32,0x2c,0xc1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x48,0x3c,0x53}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x50,0xea,0x74}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xcf,0xe9,0xc1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x70,0xe9,0x80}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x76,0xa6,0xc5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x8c,0x00,0xf1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x9f,0xf0,0x42}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xae,0x05,0x1a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x48,0xa0,0xfc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x48,0xa0,0xfe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x4a,0xaa,0x70}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x4f,0xc9,0x36}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xaf,0xa6,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xb3,0x69,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x44,0x25,0xc8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xea,0x31,0xc4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf7,0xe5,0x5d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x18,0x48,0x4e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2f,0x20,0x93}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x54,0x64,0x5f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x79,0x45,0x17}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x81,0xa7,0x05}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0xc1,0x60,0x9b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x13,0x25,0xb3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x84,0xe6,0x90}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x85,0x2b,0x3f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x86,0xc9,0x42}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xa9,0x23,0xeb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x39,0xe3,0x0e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x40,0x41,0x57}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x56,0x5c,0x46}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x64,0xcb,0x97}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x65,0x20,0x79}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xa1,0xb2,0x49}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xf0,0x81,0xaa}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x0b,0x32}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x0b,0x37}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x11,0x11,0x28}, 9333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x1e,0x27,0x53}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x5a,0x24,0x07}, 9444}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x88,0xe0,0x4d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xa2,0xe7,0xd3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb8,0x00,0x8f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xc6,0x80,0x56}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x0b,0x21,0xe5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x4f,0x80,0x86}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x76,0xe9,0x6f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x87,0x8b,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc7,0x66,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6a,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6c,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6c,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x89,0x29,0x03}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x8e,0xc5,0xa8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x8f,0x82,0x13}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x96,0x09,0xc4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xb7,0x11,0xbf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe3,0xad,0x53}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe6,0x05,0x0f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe9,0x69,0x97}, 443}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xf6,0x4b,0x08}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xfa,0x85,0x9e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xff,0x42,0x76}, 8334}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x18,0x45,0x3b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2a,0xc1,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2d,0x62,0x57}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x36,0x80,0x0b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd4,0xc8,0x18}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd7,0xc6,0x6d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xe6,0x04,0xb1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x5f,0xe4,0x53}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x5f,0xe4,0x7b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x72,0x80,0x86}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x42,0xa8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x93,0xa2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xf3,0xa8,0x04}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x01,0x00,0x12}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x4f,0x4d,0x6a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x5b,0x9c,0x6e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc4,0xde}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x55,0x4b,0x98}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x57,0x01,0xe6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x57,0x5c,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x59,0x45,0xca}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x61,0x48,0xe5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xa4,0x75,0x63}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0x20,0x83}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xca,0xe6,0x57}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd6,0xc1,0x9a}, 8343}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd6,0xc2,0xe2}, 8343}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x0a,0x9b,0x58}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x2e,0x65,0x2c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0xe0,0xd4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xae,0xf8,0x14}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xca,0xe7,0xc6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xd4,0x4b,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x95,0x26,0xac}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0xa9,0x6a,0x8b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x40,0x65,0x96}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x41,0xc4,0xb3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x79,0x50,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x7e,0x4d,0x4d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x91,0x4c,0x9c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x98,0x96,0x23}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc0,0x89,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc4,0xaa,0x6e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc5,0x2c,0x85}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xcf,0x44,0x90}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd2,0x69,0x1c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd3,0x66,0x65}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd3,0x6a,0x22}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd6,0xc8,0xcd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xdc,0x2b,0x92}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xde,0x47,0x59}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe0,0x8c,0xf2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe5,0x4c,0x0e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x1b,0x07,0xd1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x33,0xa7,0x58}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xf7,0xe5,0xa3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x54,0x72,0x6a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x71,0x24,0xac}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xbc,0xe0,0xfd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x4b,0xef,0x45}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xbe,0xe3,0x70}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xd6,0x02,0x4a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xe0,0xa2,0x41}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xec,0xc6,0xfd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xf2,0xe5,0x9e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x54,0x8a,0x63}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x5f,0xa8,0x57}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x6e,0xea,0x5d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x82,0x09,0xc8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xa5,0xa8,0xa8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xaa,0xeb,0xfe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd3,0x82,0x9a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x2e,0x44,0x68}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7f,0xca,0x94}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x4c,0xab,0x23}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xa0,0xa0,0x43}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0x7e,0xc5,0xbb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xc6,0xad,0x01}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x64,0xae,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xa4,0xc9,0xd0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xe0,0xa5,0x30}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x80,0xe1,0xdf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x80,0xe4,0xfc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x83,0xc0,0x5e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x9b,0x2d,0xc9}, 8334}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc2,0x1c,0xc3}, 8663}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xd3,0x01,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdd,0x26,0xb1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0x09,0x4f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0x81,0xb2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xba,0xf9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xc2,0x0f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x80,0xd6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x82,0xb6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x26,0xea,0x54}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0xb9,0x24,0xcc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0xb9,0x26,0x43}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x06,0x04,0x91}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x02,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x28,0xea}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xaa,0x0d,0xb8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xb5,0xfa,0xd8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbf,0x65,0x6f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbf,0x6a,0x73}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3b,0x0c,0xa3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xa1,0x81,0xf7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xc1,0xa0,0x8c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xc5,0x0d,0x36}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe6,0x07,0xf8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xea,0x6a,0xbf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xec,0x89,0x50}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xfb,0xa1,0x79}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x70,0x41,0xe7,0xe2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x46,0xa6,0x39}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x9f,0x2a,0x50}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x75,0x12,0x49,0x22}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x43,0xc9,0x28}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x64,0x56,0xf6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x6e,0x68,0x98}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0xe0,0x40,0x8d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x37,0xc1,0x88}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x6a,0xa9,0xb2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xcb,0xae,0x0f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xff,0xe8,0x5e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0x94,0xa5,0xa5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0xe8,0x8d,0x1f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x1e,0x5c,0x45}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x27,0x8d,0xb6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x54,0xa7,0x14}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x6f,0x49,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x7f,0x26,0xc3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x8c,0xe0,0xa2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x65,0x68}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xe9,0xe0,0x23}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xfd,0x03,0xc1}, 20020}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xb4,0xe4,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xb9,0x90,0xd5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xff,0x49,0xcf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x85,0xda,0xe9,0x0b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0xf9,0x80,0x17}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x9f,0xea,0xea}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x74,0xa0,0xb0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x02,0x91}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x17,0x75}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0x86,0x45,0xfd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xff,0xa2,0xd7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x7a,0xa3,0xbb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x91,0x83,0x03,0x36}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x91,0xff,0x04,0x5e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x00,0x20,0x65}, 8337}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x93,0x53,0x48,0x5b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x67,0x1c,0x44}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x05,0x20,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xd2,0xa4,0xc3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x65,0xa3,0xf1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x97,0xec,0x0b,0xbd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x98,0x03,0x88,0x38}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9a,0x14,0xd0,0x19}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0xb5,0x68,0x95}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0xfd,0x60,0xe2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa0,0x24,0x82,0xb4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x01,0xe9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x04,0x7d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x6a,0x7b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd2,0xc6,0xb8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf8,0x63,0xa4}, 53011}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf8,0x66,0x75}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xfb,0x6c,0x35}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0x2c,0x02,0x30}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0x9e,0x24,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa6,0xe6,0x47,0x43}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0xa0,0x24,0x3e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0xa0,0xa9,0x5c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa8,0x5d,0x81,0xdc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0x37,0x63,0x54}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0xe4,0x42,0x2b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x09,0xa9,0xf2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x20,0x0b,0xc2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe6,0xe4,0x88}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xf6,0x6b,0x22}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xfe,0xeb,0x22}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x00,0x80,0xde}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x19,0x82,0x94}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x32,0x40,0x65}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x8c,0xe8,0x8d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x25,0x3e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x2e,0x09,0x60}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x7c,0x6e,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb1,0x27,0x10,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x11,0xad,0x02}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x05,0xf8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x46,0x10}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0xcb,0xb9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4f,0xa0,0x76}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xa9,0xce,0xf4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xc1,0xea,0x3e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xc7,0x60,0x6c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x12,0x60}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x22,0xa1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xff,0x29,0x7b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xd2,0x22,0x3a}, 9801}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0x5c,0xe2,0xd4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0xab,0xf6,0x8e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x17,0x08,0x09}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x3a,0xa2,0x23}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x9a,0x09,0xaa}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x08,0xee,0xa5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x18,0x61,0x0b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1f,0x89,0x8b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x26,0x2c,0x40}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x80,0xb4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x81,0xf4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x4d,0x81,0x77}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x4d,0x81,0x9c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x52,0xcb,0x5c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x14,0x61,0x12}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x7e,0x08,0x0e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x8a,0x21,0xef}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x9b,0x88,0x46}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xa6,0xe5,0x70}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xb6,0x6c,0x81}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xe2,0xe1,0xae}, 8010}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xf2,0xab,0x08}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xf3,0x04,0x8b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x0a,0x09,0xea}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x0a,0x0a,0x93}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x51,0xa0,0xb8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x55,0xc9,0x25}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x22,0xe3,0xe6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x4d,0xbd,0xc8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x7c,0xe0,0x07}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x92,0x89,0x01}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xcb,0xe4,0x47}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xce,0xca,0x14}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x00,0x6d,0x03}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x29,0xe5,0x82}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x29,0xe5,0x9c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x31,0x2b,0xdb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x93,0x47,0x78}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xb3,0x41,0xe9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xb7,0x63,0x2e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xc0,0x25,0x87}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xea,0xe0,0xc3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x3a,0x6c,0xd5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xbb,0x60,0x02}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xff,0x1f,0x3b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x24,0x06,0x65}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x3a,0xee,0xf3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xc5,0xaf,0xbe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xef,0x01,0x42}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x30,0xc4,0xe6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x32,0xc0,0xa0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x39,0xd2,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x54,0xc3,0xb3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xa7,0x8c,0x08}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xcc,0xe0,0x6a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x7f,0xe2,0xf5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xc9,0x6e,0x08}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xe9,0xea,0x5a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x74,0x62,0xb9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x3c,0x46,0x12}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x97,0x8c,0x0e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x70,0xcb,0x34}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcd,0xc8,0xf7,0x95}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xe2,0x8d,0xfd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xff,0x2a,0xca}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x35,0xa4,0x13}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x42,0x44,0x7f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x42,0x44,0x82}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x47,0xab,0xe8}, 8341}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x4c,0xc8,0xc8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x52,0x62,0xbd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x55,0xc1,0x1f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6f,0x30,0x29}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6f,0x30,0x2d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x22,0xe8,0x48}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x51,0x09,0xdf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x5a,0xe0,0x02}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x5a,0xe0,0x04}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7e,0x62,0xae}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x88,0x48,0x45}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xc3,0x04,0x4a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xc5,0x0d,0x3e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x48,0xe3,0x08}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x33,0x90,0x2a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x47,0xe9,0x7f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x7e,0x0e,0x7a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x9f,0x2c,0x32}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x05,0x24,0x3a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x39,0x21,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x42,0xcd,0xc2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x49,0x7d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x9b,0x03,0xd8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x9b,0x07,0x18}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xa7,0x11,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xdf,0x8a,0x0d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x0f,0x4e,0xb6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x26,0x81,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x30,0xa8,0x08}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xa9,0x8d,0xa9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf5,0xce,0xb5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf9,0xcc,0xa1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xfa,0x8a,0xe6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0b,0xe1,0xbd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0c,0x22,0x9e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0c,0xca,0x21}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x14,0xab,0x2b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x01,0x7e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x0b,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x6f,0x42,0x4f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x9b,0xca,0xbf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x9e,0x09,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xac,0x20,0x12}, 20993}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0xf5,0xc4,0x25}, 8333}, - {{0x20,0x01,0x12,0x91,0x02,0xbf,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00}, 8333}, - {{0x20,0x01,0x16,0x20,0x0f,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x16,0x20,0x0f,0x00,0x82,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x19,0xf0,0x50,0x00,0x8d,0xe8,0x54,0x00,0x00,0xff,0xfe,0x12,0x55,0xe4}, 8333}, - {{0x20,0x01,0x19,0xf0,0x6c,0x00,0x91,0x03,0x54,0x00,0x00,0xff,0xfe,0x10,0xa8,0xd3}, 8333}, - {{0x20,0x01,0x1b,0x60,0x00,0x03,0x01,0x72,0x14,0x2b,0x6d,0xff,0xfe,0x7a,0x01,0x17}, 8333}, - {{0x20,0x01,0x04,0x10,0xa0,0x00,0x40,0x50,0x84,0x63,0x90,0xb0,0xff,0xfb,0x4e,0x58}, 8333}, - {{0x20,0x01,0x41,0x28,0x61,0x35,0x20,0x10,0x02,0x1e,0x0b,0xff,0xfe,0xe8,0xa3,0xc0}, 8333}, - {{0x20,0x01,0x41,0xd0,0x10,0x08,0x07,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7c}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0x45,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0x6c,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0x8b,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xaf,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8200}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xb2,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xc1,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xc8,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xf5,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xf7,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x10,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x37,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8200}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x47,0x97,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x53,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x9c,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x9d,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0xa2,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0xa3,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0xb2,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0xc1,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x0c,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0xc9,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0xf1,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x5f}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0c,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xf5}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xe2}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0x3e,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0x62,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0x67,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xb3,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xbc,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xbe,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xd9,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xeb,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x13,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x2b,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x2d,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x45,0x58,0x00,0x00,0x00,0x00,0x1d,0xf2,0x76,0xd3}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x4a,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x63,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x63,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x6c,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0xf9,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0d,0x20,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0e,0x02,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0xfc,0x8c,0xa2,0x00,0x7a,0x24,0xaf,0xff,0xfe,0x9d,0xc6,0x9b}, 8333}, - {{0x20,0x01,0x41,0xf0,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333}, - {{0x20,0x01,0x41,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x44,0xb8,0x41,0xbd,0x61,0x01,0x14,0x8e,0x40,0x22,0x49,0x50,0xe8,0x61}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x01,0x02,0xf9,0x00,0x00,0x00,0x01,0x10,0x7a,0xa3,0x01}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x0b,0x0a,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x11,0x12,0xd5,0x00,0x00,0x00,0x00,0x0a,0xe1,0x56,0x11}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x14,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x27,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x41,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x50,0x7d,0x00,0x00,0x6a,0xb5,0x99,0xff,0xfe,0x73,0xac,0x18}, 8333}, - {{0x20,0x01,0x04,0x70,0x58,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x5f,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x32}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x66,0x01,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x6c,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0xfe}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x6f,0x03,0x27,0x91,0x3b,0x07,0xfe,0x85,0x45,0xa4,0xf5}, 8333}, - {{0x20,0x01,0x04,0x70,0x7d,0xda,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x04,0x70,0x95,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0xb1,0xd0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00}, 8333}, - {{0x20,0x01,0x04,0x70,0xd0,0x0d,0x00,0x00,0x36,0x64,0xa9,0xff,0xfe,0x9a,0x51,0x50}, 8333}, - {{0x20,0x01,0x04,0x70,0xfa,0xb7,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x48,0x00,0x78,0x19,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x05,0xc8,0x28}, 8333}, - {{0x20,0x01,0x48,0x00,0x78,0x19,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x05,0xc9,0xa0}, 8333}, - {{0x20,0x01,0x48,0x01,0x78,0x19,0x00,0x74,0xb7,0x45,0xb9,0xd5,0xff,0x10,0xa6,0x1a}, 8333}, - {{0x20,0x01,0x48,0x01,0x78,0x19,0x00,0x74,0xb7,0x45,0xb9,0xd5,0xff,0x10,0xaa,0xec}, 8333}, - {{0x20,0x01,0x48,0x01,0x78,0x28,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x10,0x13,0x25}, 8333}, - {{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x01,0xbe,0x76,0x4e,0xff,0xfe,0x20,0xf0,0x23}, 8333}, - {{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x02,0x30,0xd7,0x17,0x75,0xff,0x20,0x18,0x58}, 8333}, - {{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x6c,0x26}, 8333}, - {{0x20,0x01,0x48,0x02,0x78,0x02,0x01,0x01,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x02,0x56}, 8333}, - {{0x20,0x01,0x48,0x02,0x78,0x02,0x01,0x03,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x2d,0xe8}, 8333}, - {{0x20,0x01,0x48,0x30,0x11,0x00,0x02,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x4b,0x98,0x0d,0xc2,0x00,0x41,0x02,0x16,0x3e,0xff,0xfe,0x56,0xf6,0x59}, 8333}, - {{0x20,0x01,0x4b,0xa0,0xff,0xfa,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93}, 8333}, - {{0x20,0x01,0x4b,0xa0,0xff,0xff,0x01,0xbe,0x00,0x01,0x10,0x05,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x4d,0xd0,0xff,0x00,0x86,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333}, - {{0x20,0x01,0x4d,0xd0,0xff,0x00,0x9a,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09}, 8333}, - {{0x20,0x01,0x05,0xc0,0x14,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xc7}, 8333}, - {{0x20,0x01,0x06,0x10,0x1b,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333}, - {{0x20,0x01,0x06,0x10,0x06,0x00,0x0a,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x06,0x7c,0x26,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x08,0xd8,0x08,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0xae}, 8333}, - {{0x20,0x01,0x08,0xd8,0x09,0x65,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x93,0x43}, 8333}, - {{0x20,0x01,0x09,0x80,0x46,0x50,0x00,0x01,0x02,0xe0,0x53,0xff,0xfe,0x13,0x24,0x49}, 8333}, - {{0x20,0x01,0x09,0x81,0x00,0x46,0x00,0x01,0xba,0x27,0xeb,0xff,0xfe,0x5b,0xed,0xee}, 8333}, - {{0x20,0x01,0x09,0xc8,0x53,0xe9,0x36,0x9a,0x02,0x26,0x2d,0xff,0xfe,0x1b,0x74,0x72}, 8333}, - {{0x20,0x01,0x09,0xd8,0xca,0xfe,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87}, 8333}, - {{0x20,0x01,0x0b,0x10,0x00,0x11,0x00,0x21,0x3e,0x07,0x54,0xff,0xfe,0x48,0x72,0x48}, 8333}, - {{0x20,0x01,0x0b,0xa8,0x01,0xf1,0xf3,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x23,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x34,0x27,0x01,0x01,0x7a,0x4f,0x08,0xbe,0x26,0x11,0x6e,0x79}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x35,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x0c,0xc0,0xa0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x1d}, 8333}, - {{0x20,0x01,0x0e,0x42,0x01,0x02,0x12,0x09,0x01,0x53,0x01,0x21,0x00,0x76,0x01,0x71}, 8333}, - {{0x20,0x02,0x17,0xea,0x14,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xea,0x14,0xeb}, 8333}, - {{0x20,0x02,0x02,0xf8,0x2b,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xf8,0x2b,0xc5}, 8333}, - {{0x20,0x02,0x40,0x47,0x48,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x47,0x48,0x2c}, 8333}, - {{0x20,0x02,0x45,0xc3,0x8c,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0xc3,0x8c,0xca}, 8333}, - {{0x20,0x02,0x46,0xbb,0x8a,0x41,0x00,0x00,0x02,0x26,0xb0,0xff,0xfe,0xed,0x5f,0x12}, 8888}, - {{0x20,0x02,0x46,0xbb,0x8c,0x3c,0x00,0x00,0x8d,0x55,0x8f,0xbb,0x15,0xfa,0xf4,0xe0}, 8765}, - {{0x20,0x02,0x4c,0x48,0xa0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x48,0xa0,0xfe}, 8333}, - {{0x20,0x02,0x4d,0x44,0x25,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x44,0x25,0xc8}, 8333}, - {{0x20,0x02,0x50,0x5f,0xaa,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x5f,0xaa,0xa2}, 8333}, - {{0x20,0x02,0x5b,0xc1,0x79,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xc1,0x79,0x9d}, 8333}, - {{0x20,0x02,0x6d,0xec,0x54,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xec,0x54,0x72}, 8333}, - {{0x20,0x02,0x8c,0x6d,0x65,0x21,0x96,0x17,0x12,0xbf,0x48,0xff,0xfe,0xd8,0x17,0x24}, 8333}, - {{0x20,0x02,0xac,0x52,0x94,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x52,0x94,0xe2}, 8333}, - {{0x20,0x02,0xaf,0x7e,0x3e,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x7e,0x3e,0xca}, 8333}, - {{0x20,0x02,0xb0,0x09,0x20,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x09,0x20,0xc5}, 8333}, - {{0x20,0x02,0xc0,0x6f,0x39,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x6f,0x39,0xa0}, 8333}, - {{0x20,0x02,0xc2,0x3a,0x73,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x3a,0x73,0x8a}, 8333}, - {{0x20,0x02,0xc7,0x0f,0x74,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0f,0x74,0x42}, 8333}, - {{0x20,0x02,0xce,0xc5,0xbe,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xc5,0xbe,0x4f}, 8333}, - {{0x20,0x02,0xd1,0x49,0x9e,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x49,0x9e,0x3a}, 8333}, - {{0x20,0x02,0xd9,0x17,0x0c,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x17,0x0c,0xa5}, 8333}, - {{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x15,0x3f}, 8333}, - {{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x82,0x3e}, 8333}, - {{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xa8,0x19,0x34}, 8333}, - {{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0xd6}, 8333}, - {{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x42,0x80}, 8333}, - {{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x66,0x0f}, 8333}, - {{0x24,0x01,0x18,0x00,0x78,0x00,0x01,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x1c,0x05,0x59}, 8333}, - {{0x24,0x01,0x18,0x00,0x78,0x00,0x01,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x1c,0x0a,0x7d}, 8333}, - {{0x24,0x05,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x59,0xb2}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xbf,0xb6}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0x88,0xe3}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x72,0x97}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x8a,0x6e}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x6a,0xdf}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0xb8}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x3b,0x1f,0x76}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x5e,0x06}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x61,0x28,0x9b}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x69,0x89,0xe9}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0xac,0x15}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x98,0x68,0xbb}, 8333}, - {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0x07,0x13}, 8333}, - {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0x9e}, 8333}, - {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x97,0xd8}, 8333}, - {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x8f,0xeb}, 8333}, - {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0xda,0x80}, 8333}, - {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0x9b}, 8333}, - {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x5f,0xa7}, 8333}, - {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x67,0x0d,0x2e}, 8333}, - {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x18,0x03}, 8333}, - {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x4b,0xbe}, 8333}, - {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xe4,0x4e,0x16}, 8333}, - {{0x26,0x01,0x01,0x8d,0x83,0x00,0x58,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xe4}, 8333}, - {{0x26,0x01,0x02,0x40,0x46,0x00,0x40,0xc0,0x02,0x50,0x56,0xff,0xfe,0xa4,0x63,0x05}, 8333}, - {{0x26,0x01,0x05,0x81,0xc2,0x00,0xa7,0x19,0x54,0x2c,0x9c,0xd5,0x48,0x52,0xf7,0xd9}, 8333}, - {{0x26,0x01,0x06,0x47,0x49,0x00,0x85,0xf1,0xca,0x2a,0x14,0xff,0xfe,0x51,0xbb,0x35}, 8333}, - {{0x26,0x01,0x00,0xc2,0xc0,0x02,0xb3,0x00,0x54,0xa0,0x15,0xb5,0x19,0xf7,0x53,0x0d}, 8333}, - {{0x26,0x02,0x03,0x06,0xcc,0xff,0xad,0x7f,0xb1,0x16,0x52,0xbe,0x64,0xba,0xdb,0x3a}, 8333}, - {{0x26,0x02,0x00,0xae,0x19,0x82,0x94,0x00,0x08,0x46,0xf7,0x8c,0x0f,0xec,0x4d,0x57}, 8333}, - {{0x26,0x02,0xff,0xc5,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x2d,0x61}, 8333}, - {{0x26,0x02,0xff,0xc5,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x92,0x11}, 8333}, - {{0x26,0x02,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0xd5,0xc1,0xc3}, 8333}, - {{0x26,0x02,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xc5,0xb8,0x44}, 8333}, - {{0x26,0x02,0xff,0xe8,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0x57,0x93,0x6b}, 8333}, - {{0x26,0x02,0xff,0xe8,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x9d,0x20,0x2e,0x3c}, 8333}, - {{0x26,0x02,0xff,0xea,0x10,0x01,0x07,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x8b}, 8333}, - {{0x26,0x02,0xff,0xea,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xc4,0xd9,0xfd}, 8333}, - {{0x26,0x04,0x00,0x00,0x00,0xc1,0x01,0x00,0x1e,0xc1,0xde,0xff,0xfe,0x54,0x22,0x35}, 8333}, - {{0x26,0x04,0x01,0x80,0x00,0x01,0x01,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0xa9}, 8333}, - {{0x26,0x04,0x01,0x80,0x00,0x03,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0xde}, 8333}, - {{0x26,0x04,0x40,0x80,0x11,0x14,0x00,0x00,0x32,0x85,0xa9,0xff,0xfe,0x93,0x85,0x0c}, 8333}, - {{0x26,0x04,0x60,0x00,0xff,0xc0,0x00,0x3c,0x64,0xa3,0x94,0xd0,0x4f,0x1d,0x1d,0xa8}, 8333}, - {{0x26,0x05,0x60,0x00,0xf3,0x80,0x9a,0x01,0xba,0x09,0x8a,0xff,0xfe,0xd4,0x35,0x11}, 8333}, - {{0x26,0x05,0x60,0x01,0xe0,0x0f,0x7b,0x00,0xc5,0x87,0x6d,0x91,0x6e,0xff,0xee,0xba}, 8333}, - {{0x26,0x05,0xf7,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x25,0xc3,0x2a,0x3e}, 8333}, - {{0x26,0x06,0x60,0x00,0xa4,0x41,0x99,0x03,0x50,0x54,0x00,0xff,0xfe,0x78,0x66,0xff}, 8333}, - {{0x26,0x07,0x53,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x83}, 9334}, - {{0x26,0x07,0x53,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x1c,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x2b,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x33,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x03,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x4a,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x65,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x69,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x71,0x1a,0x00,0x78,0x00,0x00,0x00,0x00,0xa7,0xb5}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x07,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x08,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x95,0x2e,0x37,0x33,0x00,0x00,0x00,0x00,0x14,0x14}, 8333}, - {{0x26,0x07,0xf1,0xc0,0x08,0x48,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x94,0x3c}, 8333}, - {{0x26,0x07,0xf2,0xe0,0x00,0x0f,0x05,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x26,0x07,0xf7,0x48,0x12,0x00,0x00,0xf8,0x02,0x1e,0x67,0xff,0xfe,0x99,0x8f,0x07}, 8333}, - {{0x26,0x07,0xf9,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333}, - {{0x26,0x07,0xff,0x68,0x01,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x31}, 8333}, - {{0x28,0x03,0x69,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x17}, 8333}, - {{0x2a,0x00,0x10,0x98,0x00,0x00,0x00,0x80,0x10,0x00,0x00,0x25,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x00,0x11,0x78,0x00,0x02,0x00,0x43,0x50,0x54,0x00,0xff,0xfe,0x84,0xf8,0x6f}, 8333}, - {{0x2a,0x00,0x11,0x78,0x00,0x02,0x00,0x43,0x50,0x54,0x00,0xff,0xfe,0xe7,0x2e,0xb6}, 8333}, - {{0x2a,0x00,0x11,0x78,0x00,0x02,0x00,0x43,0x89,0x83,0xcc,0x27,0x0d,0x72,0xd9,0x7a}, 8333}, - {{0x2a,0x00,0x13,0x28,0xe1,0x00,0xcc,0x42,0x02,0x30,0x48,0xff,0xfe,0x92,0x05,0x5c}, 8333}, - {{0x2a,0x00,0x14,0xf0,0xe0,0x00,0x80,0xd2,0xcd,0x1a,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x00,0x16,0x30,0x00,0x02,0x18,0x02,0x01,0x88,0x01,0x22,0x00,0x91,0x00,0x11}, 8333}, - {{0x2a,0x00,0x18,0xe0,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x00,0x18,0xe0,0x00,0x00,0xdc,0xc5,0x01,0x09,0x02,0x34,0x01,0x06,0x01,0x91}, 8333}, - {{0x2a,0x00,0x1a,0x28,0x11,0x57,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xc7}, 8333}, - {{0x2a,0x00,0x1c,0xa8,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0xfc,0x40,0xd1}, 8333}, - {{0x2a,0x00,0x1c,0xa8,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x6d,0xce,0x2c}, 8333}, - {{0x2a,0x00,0x71,0x43,0x01,0x00,0x00,0x00,0x02,0x16,0x3e,0xff,0xfe,0x2e,0x74,0xa3}, 8333}, - {{0x2a,0x00,0x71,0x43,0x01,0x00,0x00,0x00,0x02,0x16,0x3e,0xff,0xfe,0xd3,0x5c,0x21}, 8333}, - {{0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x23}, 8333}, - {{0x2a,0x00,0xdc,0xc0,0x0e,0xda,0x00,0x98,0x01,0x83,0x01,0x93,0xc3,0x82,0x6b,0xdb}, 8333}, - {{0x2a,0x00,0xdc,0xc0,0x0e,0xda,0x00,0x98,0x01,0x83,0x01,0x93,0xf7,0x2e,0xd9,0x43}, 8333}, - {{0x2a,0x00,0xf8,0x20,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xaf,0x00,0x01}, 8333}, - {{0x2a,0x00,0xf9,0x40,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x10,0x1d}, 8333}, - {{0x2a,0x00,0xf9,0x40,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x06,0xac}, 8333}, - {{0x2a,0x01,0x01,0xb0,0x79,0x99,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x31}, 8333}, - {{0x2a,0x01,0x02,0x38,0x42,0xdd,0xf9,0x00,0x7a,0x6c,0x2b,0xc6,0x40,0x41,0x0c,0x43}, 8333}, - {{0x2a,0x01,0x02,0x38,0x43,0x13,0x63,0x00,0x21,0x89,0x1c,0x97,0x69,0x6b,0x05,0xea}, 8333}, - {{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0x5c,0x33,0x91,0xf9,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0xb0,0x1c,0x17,0x8d,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x34,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x34,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x44,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x51,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x51,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x10,0x51,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x10,0x51,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x43,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x62,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x70,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x82,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x21,0x23,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x21,0x02,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x11,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x40,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x63,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x63,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x93,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x31,0x33,0xad,0xfe,0xa1,0x00,0x00,0x00,0x00,0x06,0x66}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x21,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x63,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x41,0x11,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x41,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x41,0x53,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x33,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x72,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x83,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 9001}, - {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x21,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x41,0xc2,0x00,0x00,0x54,0x04,0xa6,0x7e,0xf2,0x50}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x51,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x52,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x54}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x63,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 9001}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x51,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x72,0xc5,0x00,0x00,0x00,0x00,0x28,0x58,0xe1,0xc5}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x72,0xc5,0x00,0x00,0x00,0x00,0x59,0x3b,0x60,0xd5}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x81,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x13,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x22,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x51,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x60,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x70,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x91,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x21,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x44,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x51,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x0b,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x14,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x44,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x64,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x91,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x21,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x40,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x44,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x82,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x83,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x11,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x21,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x22,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x44,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x10,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x23,0xd1,0x00,0x00,0x00,0x00,0xde,0xad,0xbe,0xef}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x50,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x51,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x53,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x53,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x19}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x71,0xe3,0x78,0xb4,0xf3,0xff,0xfe,0xad,0xe8,0xcf}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x21,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x02,0x33,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x03}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x03,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x60,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x60,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x02,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x33,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x53,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x63,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x72,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x10,0x22,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x10,0x24,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x14,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x18,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x12,0x28,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x12,0x33,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 18333}, - {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x11,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x31,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x32,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x52,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x19,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x1a,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x1a,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x02,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x04,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x07,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x0b,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0d,0x16,0x93,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x06,0x08,0xff,0xff,0xa0,0x09,0x8b,0xf5,0x87,0x9d,0xe5,0x1a,0xf8,0x37}, 8333}, - {{0x2a,0x01,0x06,0x80,0x00,0x10,0x00,0x10,0xf2,0xde,0xf1,0xff,0xfe,0xc9,0x0d,0xc0}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x01,0xf6,0x50,0x54,0x00,0xff,0xfe,0x30,0xe5,0x85}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x02,0x0b,0x50,0x54,0x00,0xff,0xfe,0x24,0x43,0x5e}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x04,0x3d,0x50,0x54,0x00,0xff,0xfe,0x4e,0x3d,0xd4}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xaa,0xad,0x02,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xaa,0xb6,0x00,0xea,0x50,0x54,0x00,0xff,0xfe,0xff,0xea,0xc3}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xaa,0xb9,0x00,0x5a,0x50,0x54,0x00,0xff,0xfe,0x89,0x7b,0x26}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xaa,0xbc,0x02,0xc8,0x50,0x54,0x00,0xff,0xfe,0x35,0x65,0x81}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x30,0x1e}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x39,0x42}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0x8c,0x87}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x62,0x06}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x67,0x55,0x9d}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x43,0x4f}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x89,0x11,0x43}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x98,0x25,0x05}, 8333}, - {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xdb,0x35,0x2e}, 8333}, - {{0x2a,0x01,0x7e,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0xd7,0xb5}, 8333}, - {{0x2a,0x01,0x0e,0x34,0xee,0x33,0x16,0x40,0xc5,0x04,0xf6,0x77,0xb2,0x8a,0xba,0x42}, 8333}, - {{0x2a,0x01,0x0e,0x35,0x2e,0x7e,0x0b,0xc0,0xe0,0x79,0xf5,0x5e,0xce,0xf3,0xb5,0xd7}, 8333}, - {{0x2a,0x01,0x0e,0x35,0x2e,0xe5,0x06,0x10,0x02,0x1f,0xd0,0xff,0xfe,0x4e,0x74,0x60}, 8333}, - {{0x2a,0x01,0x0e,0x35,0x8a,0x3f,0x47,0xc0,0xc6,0x17,0xfe,0xff,0xfe,0x3c,0x9f,0xbd}, 8333}, - {{0x2a,0x01,0x0e,0x35,0x8a,0xca,0x06,0xa0,0x02,0x11,0x0a,0xff,0xfe,0x5e,0x29,0x5e}, 8333}, - {{0x2a,0x02,0x01,0x80,0x00,0x0a,0x00,0x18,0x00,0x81,0x00,0x07,0x00,0x11,0x00,0x50}, 8333}, - {{0x2a,0x02,0x18,0x10,0x1d,0x87,0x6a,0x00,0x56,0x04,0xa6,0xff,0xfe,0x60,0xd8,0x7d}, 8333}, - {{0x2a,0x02,0x21,0x68,0x11,0x44,0x5c,0x01,0xd6,0x3d,0x7e,0xff,0xfe,0xdd,0x4f,0x8e}, 8333}, - {{0x2a,0x02,0x24,0x98,0x6d,0x7b,0x70,0x01,0xb5,0x08,0xb3,0x9d,0x2c,0xea,0x5b,0x7a}, 8333}, - {{0x2a,0x02,0x25,0x28,0x05,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15}, 8333}, - {{0x2a,0x02,0x25,0x28,0x00,0xfa,0x1a,0x56,0x02,0x16,0x44,0xff,0xfe,0x6a,0xd1,0x12}, 8333}, - {{0x2a,0x02,0x27,0xf8,0x20,0x12,0x00,0x00,0xe9,0xf7,0x26,0x8f,0xc4,0x41,0x61,0x29}, 8333}, - {{0x2a,0x02,0x03,0x48,0x00,0x86,0x30,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x47,0x80,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x8a,0x01}, 8333}, - {{0x2a,0x02,0x05,0x78,0x50,0x02,0x01,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x02,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x19,0x0b,0x69,0xe3}, 8333}, - {{0x2a,0x02,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe8,0x93,0xd9,0xd6}, 8333}, - {{0x2a,0x02,0x07,0x70,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x39}, 8333}, - {{0x2a,0x02,0x7a,0xa0,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0xb3,0x81,0xa2}, 8333}, - {{0x2a,0x02,0x80,0x10,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x59,0xb5}, 8333}, - {{0x2a,0x02,0x81,0x0d,0x21,0xc0,0x0f,0x00,0xa2,0x48,0x1c,0xff,0xfe,0xb8,0x53,0x48}, 8333}, - {{0x2a,0x02,0x0a,0x50,0x00,0x00,0x00,0x00,0x02,0x1b,0x24,0xff,0xfe,0x93,0x4e,0x39}, 8333}, - {{0x2a,0x02,0x0a,0x80,0x00,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x01,0x58,0x30,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x05,0x46,0x92,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x03,0x00,0x00,0x71,0x58,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x22,0x44,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x03,0x33,0x39,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x03,0x78,0x44,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x05,0x62,0x88,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x03,0x00,0x00,0x59,0x12,0x00,0x01}, 8333}, - {{0x2a,0x03,0x40,0x00,0x00,0x02,0x04,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08}, 8333}, - {{0x2a,0x03,0x40,0x00,0x00,0x06,0x80,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x03,0x40,0x00,0x00,0x06,0x80,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0xd0}, 8333}, - {{0x2a,0x03,0x49,0x00,0xff,0xfc,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x0d,0x50,0x01}, 8333}, - {{0x2a,0x03,0x0f,0x80,0xed,0x15,0x01,0x49,0x01,0x54,0x01,0x55,0x02,0x35,0x00,0x01}, 8333}, - {{0x2a,0x03,0x0f,0x80,0xed,0x15,0x01,0x49,0x01,0x54,0x01,0x55,0x02,0x41,0x00,0x01}, 8333}, - {{0x2a,0x03,0x0f,0x80,0xed,0x16,0x0c,0xa7,0xea,0x75,0xb1,0x2d,0x02,0xaf,0x9e,0x2a}, 8333}, - {{0x2a,0x04,0x19,0x80,0x31,0x00,0x1a,0xab,0x02,0x90,0xfa,0xff,0xfe,0x70,0xa3,0xd8}, 8333}, - {{0x2a,0x04,0x19,0x80,0x31,0x00,0x1a,0xab,0xe6,0x1d,0x2d,0xff,0xfe,0x29,0xf5,0x90}, 8333}, - {{0x2a,0x04,0x2f,0x80,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89}, 8333}, - {{0x2a,0x04,0xac,0x00,0x00,0x01,0x4a,0x0b,0x50,0x54,0x00,0xff,0xfe,0x00,0x5a,0xf5}, 8333}, - {{0x2a,0x04,0xad,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0xda}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd9,0x4a,0xaf,0xa2,0x8c,0x9d,0xf6,0x22,0x18,0x28}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xdb,0x58,0x10,0x81,0x48,0x69,0x2c,0xb3,0x0d,0x6d}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe2,0x7f,0xf3,0x20,0xef,0x72,0xaf,0x4d,0x29,0x3c}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xef,0x3c,0x49,0x0b,0xc1,0x74,0xc2,0x92,0x86,0xe1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe8,0x27,0xf9,0x43,0xad,0x67,0xfd,0x74,0x25,0x43}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xff,0xd9,0x7d,0x26,0x57,0x03,0xb0,0x49,0x67,0x4f}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xf9,0xbe,0x9e,0xf0,0x33,0x40,0x2e,0x79,0xc9,0x18}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x07,0x9c,0x11,0x9b,0x2d,0xf7,0xd7,0xf2,0x5e,0x9b}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x00,0x7d,0xc3,0xfd,0xcb,0x7a,0xff,0x07,0xdc,0x48}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x03,0x34,0x0e,0x44,0x07,0x5c,0xcb,0x4b,0xe7,0xcb}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x06,0x69,0x75,0xcb,0x88,0x3c,0x63,0xa6,0x11,0xff}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0x26,0x27,0x21,0xbf,0x0a,0x38,0xe7,0xfe,0xc1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0x26,0x27,0x21,0xae,0x94,0xd5,0xc2,0x72,0x24}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0xbf,0x87,0xf8,0x8f,0x6b,0x04,0xb5,0xc3,0xfa}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0b,0x29,0x34,0x96,0x29,0xe8,0x67,0x22,0x0c,0x61}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x11,0x08,0x94,0x72,0x0f,0x2c,0xb6,0xc9,0x6f,0x22}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x12,0xc9,0x76,0x66,0x08,0x77,0xf0,0x71,0x81,0xdc}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x30,0x7b,0x87,0xc2,0x7e,0xd8,0xe9,0xbb,0x14,0xed}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x3e,0xaa,0xb7,0xd0,0x79,0x79,0xf3,0x0b,0xd2,0x63}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6f,0x34,0x7f,0xc7,0xce,0xa3,0x04,0x59,0x06,0x32}, 4176}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x68,0xac,0xad,0xae,0x93,0x23,0x0a,0x51,0x3c,0x5c}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x72,0x87,0x94,0x82,0x36,0x22,0x83,0x23,0xb5,0xc5}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7a,0x4c,0x71,0x22,0xb9,0x53,0x89,0x19,0x12,0x43}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8d,0xbe,0xe1,0x25,0x73,0x45,0xf5,0xe6,0x10,0xad}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa5,0xa5,0xf4,0x4c,0x8f,0xfb,0xb7,0x84,0x36,0xee}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaa,0xb7,0x04,0x8c,0x87,0xc6,0x38,0x3b,0x0a,0xf6}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xac,0x1f,0x82,0x69,0x5d,0x88,0xa1,0x54,0xf5,0x90}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb3,0xd1,0xf8,0xbe,0xa7,0x6b,0x46,0xbe,0xe8,0x84}, 8333} + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x73,0x6d,0x79}, 15714}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x8e,0xf5,0xc3}, 15714}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x9a,0x66,0xab}, 15714}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x27,0xe7,0x67}, 15714}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xde,0xcf,0xac}, 15714}, + {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfd,0x00,0x86,0x33,0x69,0xab,0x96,0xfb,0x52}, 15714}, + {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x3c,0x79,0x06,0x91,0xb8,0x3e,0x3a,0x03}, 15714}, + {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x0c,0x3f,0x10,0x53,0x9f,0xd8,0x18,0x98}, 15714}, + {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x2c,0x7d,0x26,0x90,0x76,0x50,0x61,0x99}, 15714} }; 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}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6a,0x8b,0xd2,0x78,0x3f,0x7a,0xf8,0x92,0x8f,0x80}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe6,0x4e,0xa4,0x47,0x4e,0x2a,0xfe,0xe8,0x95,0xcc}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x9f,0xae,0x9f,0x59,0x0b,0x3f,0x31,0x3a,0x8a,0x5f}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x47,0xb1,0xe4,0x55,0xd1,0xb0,0x14,0x3f,0xb6,0xdb}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa0,0x60,0x9e,0x46,0x54,0xdb,0x61,0x3b,0xb2,0x6f}, 18333} + }; #endif // BITCOIN_CHAINPARAMSSEEDS_H diff --git a/src/clientversion.h b/src/clientversion.h index ab79da9b3..652afbf6e 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -26,7 +26,7 @@ * Copyright year (2009-this) * Todo: update this when changing our copyright comments in the source */ -#define COPYRIGHT_YEAR 2016 +#define COPYRIGHT_YEAR 2017 #endif //HAVE_CONFIG_H diff --git a/src/coins.cpp b/src/coins.cpp index 4d1dbdea4..f5683774b 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -260,7 +260,7 @@ bool CCoinsViewCache::HaveInputs(const CTransaction& tx) const double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight, CAmount &inChainInputValue) const { inChainInputValue = 0; - if (tx.IsCoinBase()) + if (tx.IsCoinBase() || tx.IsCoinStake()) return 0.0; double dResult = 0.0; BOOST_FOREACH(const CTxIn& txin, tx.vin) diff --git a/src/coins.h b/src/coins.h index eab94ec1b..8c5e820f4 100644 --- a/src/coins.h +++ b/src/coins.h @@ -1,5 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2015 The Bitcoin Core developers +// Copyright (c) 2016 The BlackCoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -27,6 +28,7 @@ * - unspentness bitvector, for vout[2] and further; least significant byte first * - the non-spent CTxOuts (via CTxOutCompressor) * - VARINT(nHeight) + * - nTime * * The nCode value consists of: * - bit 0: IsCoinBase() @@ -76,6 +78,9 @@ public: //! whether transaction is a coinbase bool fCoinBase; + //! whether transaction is a coinstake + bool fCoinStake; + //! unspent transaction outputs; spent outputs are .IsNull(); spent outputs at the end of the array are dropped std::vector vout; @@ -86,11 +91,16 @@ public: //! as new tx version will probably only be introduced at certain heights int nVersion; + //! time of the CTransaction + unsigned int nTime; + void FromTx(const CTransaction &tx, int nHeightIn) { fCoinBase = tx.IsCoinBase(); + fCoinStake = tx.IsCoinStake(); vout = tx.vout; nHeight = nHeightIn; nVersion = tx.nVersion; + nTime = tx.nTime; ClearUnspendable(); } @@ -101,13 +111,15 @@ public: void Clear() { fCoinBase = false; + fCoinStake = false; std::vector().swap(vout); nHeight = 0; nVersion = 0; + nTime = 0; } //! empty constructor - CCoins() : fCoinBase(false), vout(0), nHeight(0), nVersion(0) { } + CCoins() : fCoinBase(false), fCoinStake(false), vout(0), nHeight(0), nVersion(0), nTime(0) { } //!remove spent outputs at the end of vout void Cleanup() { @@ -119,7 +131,7 @@ public: void ClearUnspendable() { BOOST_FOREACH(CTxOut &txout, vout) { - if (txout.scriptPubKey.IsUnspendable()) + if (txout.IsUnspendable()) txout.SetNull(); } Cleanup(); @@ -127,9 +139,11 @@ public: void swap(CCoins &to) { std::swap(to.fCoinBase, fCoinBase); + std::swap(to.fCoinStake, fCoinStake); to.vout.swap(vout); std::swap(to.nHeight, nHeight); std::swap(to.nVersion, nVersion); + std::swap(to.nTime, nTime); } //! equality test @@ -138,8 +152,10 @@ public: if (a.IsPruned() && b.IsPruned()) return true; return a.fCoinBase == b.fCoinBase && + a.fCoinStake == b.fCoinStake && a.nHeight == b.nHeight && a.nVersion == b.nVersion && + a.nTime == b.nTime && a.vout == b.vout; } friend bool operator!=(const CCoins &a, const CCoins &b) { @@ -152,6 +168,10 @@ public: return fCoinBase; } + bool IsCoinStake() const { + return fCoinStake; + } + unsigned int GetSerializeSize(int nType, int nVersion) const { unsigned int nSize = 0; unsigned int nMaskSize = 0, nMaskCode = 0; @@ -159,7 +179,7 @@ public: bool fFirst = vout.size() > 0 && !vout[0].IsNull(); bool fSecond = vout.size() > 1 && !vout[1].IsNull(); assert(fFirst || fSecond || nMaskCode); - unsigned int nCode = 8*(nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0); + unsigned int nCode = 16*(nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0) + (fCoinStake ? 8 : 0); // version nSize += ::GetSerializeSize(VARINT(this->nVersion), nType, nVersion); // size of header code @@ -172,6 +192,8 @@ public: nSize += ::GetSerializeSize(CTxOutCompressor(REF(vout[i])), nType, nVersion); // height nSize += ::GetSerializeSize(VARINT(nHeight), nType, nVersion); + // time + nSize += ::GetSerializeSize(nTime, nType, nVersion); return nSize; } @@ -182,7 +204,7 @@ public: bool fFirst = vout.size() > 0 && !vout[0].IsNull(); bool fSecond = vout.size() > 1 && !vout[1].IsNull(); assert(fFirst || fSecond || nMaskCode); - unsigned int nCode = 8*(nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0); + unsigned int nCode = 16*(nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0) + (fCoinStake ? 8 : 0); // version ::Serialize(s, VARINT(this->nVersion), nType, nVersion); // header code @@ -202,6 +224,8 @@ public: } // coinbase height ::Serialize(s, VARINT(nHeight), nType, nVersion); + // time + ::Serialize(s, nTime, nType, nVersion); } template @@ -212,10 +236,11 @@ public: // header code ::Unserialize(s, VARINT(nCode), nType, nVersion); fCoinBase = nCode & 1; + fCoinStake = nCode & 8; std::vector vAvail(2, false); vAvail[0] = (nCode & 2) != 0; vAvail[1] = (nCode & 4) != 0; - unsigned int nMaskCode = (nCode / 8) + ((nCode & 6) != 0 ? 0 : 1); + unsigned int nMaskCode = (nCode / 16) + ((nCode & 6) != 0 ? 0 : 1); // spentness bitmask while (nMaskCode > 0) { unsigned char chAvail = 0; @@ -235,6 +260,8 @@ public: } // coinbase height ::Unserialize(s, VARINT(nHeight), nType, nVersion); + // time + ::Unserialize(s, nTime, nType, nVersion); Cleanup(); } diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h index ad9cc2617..b828d134d 100644 --- a/src/consensus/consensus.h +++ b/src/consensus/consensus.h @@ -11,15 +11,14 @@ static const unsigned int MAX_BLOCK_SIZE = 1000000; /** The maximum allowed number of signature check operations in a block (network rule) */ static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50; /** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */ -static const int COINBASE_MATURITY = 100; +static const int COINBASE_MATURITY = 500; + +/** Kernel input must have this number of confirmations (network rule) */ +static const int STAKE_MIN_CONFIRMATIONS = 500; /** Flags for nSequence and nLockTime locks */ enum { - /* Interpret sequence numbers as relative lock-time constraints. */ - LOCKTIME_VERIFY_SEQUENCE = (1 << 0), - /* Use GetMedianTimePast() instead of nTime for end point timestamp. */ - LOCKTIME_MEDIAN_TIME_PAST = (1 << 1), }; #endif // BITCOIN_CONSENSUS_CONSENSUS_H diff --git a/src/consensus/params.h b/src/consensus/params.h index 4f3480b89..b9813a2ab 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -36,7 +36,7 @@ struct BIP9Deployment { */ struct Params { uint256 hashGenesisBlock; - int nSubsidyHalvingInterval; + int nMaxReorganizationDepth; /** Used to check majorities for block version upgrade */ int nMajorityEnforceBlockUpgrade; int nMajorityRejectBlockOutdated; @@ -46,7 +46,7 @@ struct Params { uint256 BIP34Hash; /** * Minimum blocks including miner confirmation of the total of 2016 blocks in a retargetting period, - * (nPowTargetTimespan / nPowTargetSpacing) which is also used for BIP9 deployments. + * (nTargetTimespan / nTargetSpacing) which is also used for BIP9 deployments. * Examples: 1916 for 95%, 1512 for testchains. */ uint32_t nRuleChangeActivationThreshold; @@ -54,11 +54,22 @@ struct Params { BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS]; /** Proof of work parameters */ uint256 powLimit; + uint256 posLimit; + uint256 posLimitV2; bool fPowAllowMinDifficultyBlocks; + int64_t nTargetSpacingV1; bool fPowNoRetargeting; - int64_t nPowTargetSpacing; - int64_t nPowTargetTimespan; - int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespan / nPowTargetSpacing; } + int64_t nTargetSpacing; + int64_t nTargetTimespan; + int64_t DifficultyAdjustmentInterval() const { return nTargetTimespan / nTargetSpacing; } + int64_t nProtocolV1RetargetingFixedTime; + int64_t nProtocolV2Time; + int64_t nProtocolV3Time; + bool IsProtocolV2(int64_t nTime) const { return nTime > nProtocolV2Time && nTime != 1407053678; } + bool IsProtocolV3(int64_t nTime) const { return nTime > nProtocolV3Time && nTime != 1444028400; } + unsigned int GetTargetSpacing(int nHeight) { return IsProtocolV2(nHeight) ? 64 : 60; } + int nLastPOWBlock; + int nStakeTimestampMask; }; } // namespace Consensus diff --git a/src/crypto/scrypt-sse2.cpp b/src/crypto/scrypt-sse2.cpp new file mode 100644 index 000000000..d9e7ffccc --- /dev/null +++ b/src/crypto/scrypt-sse2.cpp @@ -0,0 +1,136 @@ +/* + * Copyright 2009 Colin Percival, 2011 ArtForz, 2012-2013 pooler + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file was originally written by Colin Percival as part of the Tarsnap + * online backup system. + */ + +#include "crypto/scrypt.h" +#include +#include +#include +#include + +#include + +static inline void xor_salsa8_sse2(__m128i B[4], const __m128i Bx[4]) +{ + __m128i X0, X1, X2, X3; + __m128i T; + int i; + + X0 = B[0] = _mm_xor_si128(B[0], Bx[0]); + X1 = B[1] = _mm_xor_si128(B[1], Bx[1]); + X2 = B[2] = _mm_xor_si128(B[2], Bx[2]); + X3 = B[3] = _mm_xor_si128(B[3], Bx[3]); + + for (i = 0; i < 8; i += 2) { + /* Operate on "columns". */ + T = _mm_add_epi32(X0, X3); + X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 7)); + X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 25)); + T = _mm_add_epi32(X1, X0); + X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9)); + X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23)); + T = _mm_add_epi32(X2, X1); + X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 13)); + X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 19)); + T = _mm_add_epi32(X3, X2); + X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18)); + X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14)); + + /* Rearrange data. */ + X1 = _mm_shuffle_epi32(X1, 0x93); + X2 = _mm_shuffle_epi32(X2, 0x4E); + X3 = _mm_shuffle_epi32(X3, 0x39); + + /* Operate on "rows". */ + T = _mm_add_epi32(X0, X1); + X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 7)); + X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 25)); + T = _mm_add_epi32(X3, X0); + X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9)); + X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23)); + T = _mm_add_epi32(X2, X3); + X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 13)); + X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 19)); + T = _mm_add_epi32(X1, X2); + X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18)); + X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14)); + + /* Rearrange data. */ + X1 = _mm_shuffle_epi32(X1, 0x39); + X2 = _mm_shuffle_epi32(X2, 0x4E); + X3 = _mm_shuffle_epi32(X3, 0x93); + } + + B[0] = _mm_add_epi32(B[0], X0); + B[1] = _mm_add_epi32(B[1], X1); + B[2] = _mm_add_epi32(B[2], X2); + B[3] = _mm_add_epi32(B[3], X3); +} + +void scrypt_1024_1_1_256_sp_sse2(const char *input, char *output, char *scratchpad) +{ + uint8_t B[128]; + union { + __m128i i128[8]; + uint32_t u32[32]; + } X; + __m128i *V; + uint32_t i, j, k; + + V = (__m128i *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); + + PBKDF2_SHA256((const uint8_t *)input, 80, (const uint8_t *)input, 80, 1, B, 128); + + for (k = 0; k < 2; k++) { + for (i = 0; i < 16; i++) { + X.u32[k * 16 + i] = le32dec(&B[(k * 16 + (i * 5 % 16)) * 4]); + } + } + + for (i = 0; i < 1024; i++) { + for (k = 0; k < 8; k++) + V[i * 8 + k] = X.i128[k]; + xor_salsa8_sse2(&X.i128[0], &X.i128[4]); + xor_salsa8_sse2(&X.i128[4], &X.i128[0]); + } + for (i = 0; i < 1024; i++) { + j = 8 * (X.u32[16] & 1023); + for (k = 0; k < 8; k++) + X.i128[k] = _mm_xor_si128(X.i128[k], V[j + k]); + xor_salsa8_sse2(&X.i128[0], &X.i128[4]); + xor_salsa8_sse2(&X.i128[4], &X.i128[0]); + } + + for (k = 0; k < 2; k++) { + for (i = 0; i < 16; i++) { + le32enc(&B[(k * 16 + (i * 5 % 16)) * 4], X.u32[k * 16 + i]); + } + } + + PBKDF2_SHA256((const uint8_t *)input, 80, B, 128, 1, (uint8_t *)output, 32); +} diff --git a/src/crypto/scrypt.cpp b/src/crypto/scrypt.cpp new file mode 100644 index 000000000..887f58770 --- /dev/null +++ b/src/crypto/scrypt.cpp @@ -0,0 +1,329 @@ +/* + * Copyright 2009 Colin Percival, 2011 ArtForz, 2012-2013 pooler + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file was originally written by Colin Percival as part of the Tarsnap + * online backup system. + */ + +#include "crypto/scrypt.h" +//#include "util.h" +#include +#include +#include +#include + +#if defined(USE_SSE2) && !defined(USE_SSE2_ALWAYS) +#ifdef _MSC_VER +// MSVC 64bit is unable to use inline asm +#include +#else +// GCC Linux or i686-w64-mingw32 +#include +#endif +#endif + +static inline uint32_t be32dec(const void *pp) +{ + const uint8_t *p = (uint8_t const *)pp; + return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) + + ((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24)); +} + +static inline void be32enc(void *pp, uint32_t x) +{ + uint8_t *p = (uint8_t *)pp; + p[3] = x & 0xff; + p[2] = (x >> 8) & 0xff; + p[1] = (x >> 16) & 0xff; + p[0] = (x >> 24) & 0xff; +} + +typedef struct HMAC_SHA256Context { + SHA256_CTX ictx; + SHA256_CTX octx; +} HMAC_SHA256_CTX; + +/* Initialize an HMAC-SHA256 operation with the given key. */ +static void +HMAC_SHA256_Init(HMAC_SHA256_CTX *ctx, const void *_K, size_t Klen) +{ + unsigned char pad[64]; + unsigned char khash[32]; + const unsigned char *K = (const unsigned char *)_K; + size_t i; + + /* If Klen > 64, the key is really SHA256(K). */ + if (Klen > 64) { + SHA256_Init(&ctx->ictx); + SHA256_Update(&ctx->ictx, K, Klen); + SHA256_Final(khash, &ctx->ictx); + K = khash; + Klen = 32; + } + + /* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */ + SHA256_Init(&ctx->ictx); + memset(pad, 0x36, 64); + for (i = 0; i < Klen; i++) + pad[i] ^= K[i]; + SHA256_Update(&ctx->ictx, pad, 64); + + /* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */ + SHA256_Init(&ctx->octx); + memset(pad, 0x5c, 64); + for (i = 0; i < Klen; i++) + pad[i] ^= K[i]; + SHA256_Update(&ctx->octx, pad, 64); + + /* Clean the stack. */ + memset(khash, 0, 32); +} + +/* Add bytes to the HMAC-SHA256 operation. */ +static void +HMAC_SHA256_Update(HMAC_SHA256_CTX *ctx, const void *in, size_t len) +{ + /* Feed data to the inner SHA256 operation. */ + SHA256_Update(&ctx->ictx, in, len); +} + +/* Finish an HMAC-SHA256 operation. */ +static void +HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX *ctx) +{ + unsigned char ihash[32]; + + /* Finish the inner SHA256 operation. */ + SHA256_Final(ihash, &ctx->ictx); + + /* Feed the inner hash to the outer SHA256 operation. */ + SHA256_Update(&ctx->octx, ihash, 32); + + /* Finish the outer SHA256 operation. */ + SHA256_Final(digest, &ctx->octx); + + /* Clean the stack. */ + memset(ihash, 0, 32); +} + +/** + * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen): + * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and + * write the output to buf. The value dkLen must be at most 32 * (2^32 - 1). + */ +void +PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, + size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen) +{ + HMAC_SHA256_CTX PShctx, hctx; + size_t i; + uint8_t ivec[4]; + uint8_t U[32]; + uint8_t T[32]; + uint64_t j; + int k; + size_t clen; + + /* Compute HMAC state after processing P and S. */ + HMAC_SHA256_Init(&PShctx, passwd, passwdlen); + HMAC_SHA256_Update(&PShctx, salt, saltlen); + + /* Iterate through the blocks. */ + for (i = 0; i * 32 < dkLen; i++) { + /* Generate INT(i + 1). */ + be32enc(ivec, (uint32_t)(i + 1)); + + /* Compute U_1 = PRF(P, S || INT(i)). */ + memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX)); + HMAC_SHA256_Update(&hctx, ivec, 4); + HMAC_SHA256_Final(U, &hctx); + + /* T_i = U_1 ... */ + memcpy(T, U, 32); + + for (j = 2; j <= c; j++) { + /* Compute U_j. */ + HMAC_SHA256_Init(&hctx, passwd, passwdlen); + HMAC_SHA256_Update(&hctx, U, 32); + HMAC_SHA256_Final(U, &hctx); + + /* ... xor U_j ... */ + for (k = 0; k < 32; k++) + T[k] ^= U[k]; + } + + /* Copy as many bytes as necessary into buf. */ + clen = dkLen - i * 32; + if (clen > 32) + clen = 32; + memcpy(&buf[i * 32], T, clen); + } + + /* Clean PShctx, since we never called _Final on it. */ + memset(&PShctx, 0, sizeof(HMAC_SHA256_CTX)); +} + +#define ROTL(a, b) (((a) << (b)) | ((a) >> (32 - (b)))) + +static inline void xor_salsa8(uint32_t B[16], const uint32_t Bx[16]) +{ + uint32_t x00,x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15; + int i; + + x00 = (B[ 0] ^= Bx[ 0]); + x01 = (B[ 1] ^= Bx[ 1]); + x02 = (B[ 2] ^= Bx[ 2]); + x03 = (B[ 3] ^= Bx[ 3]); + x04 = (B[ 4] ^= Bx[ 4]); + x05 = (B[ 5] ^= Bx[ 5]); + x06 = (B[ 6] ^= Bx[ 6]); + x07 = (B[ 7] ^= Bx[ 7]); + x08 = (B[ 8] ^= Bx[ 8]); + x09 = (B[ 9] ^= Bx[ 9]); + x10 = (B[10] ^= Bx[10]); + x11 = (B[11] ^= Bx[11]); + x12 = (B[12] ^= Bx[12]); + x13 = (B[13] ^= Bx[13]); + x14 = (B[14] ^= Bx[14]); + x15 = (B[15] ^= Bx[15]); + for (i = 0; i < 8; i += 2) { + /* Operate on columns. */ + x04 ^= ROTL(x00 + x12, 7); x09 ^= ROTL(x05 + x01, 7); + x14 ^= ROTL(x10 + x06, 7); x03 ^= ROTL(x15 + x11, 7); + + x08 ^= ROTL(x04 + x00, 9); x13 ^= ROTL(x09 + x05, 9); + x02 ^= ROTL(x14 + x10, 9); x07 ^= ROTL(x03 + x15, 9); + + x12 ^= ROTL(x08 + x04, 13); x01 ^= ROTL(x13 + x09, 13); + x06 ^= ROTL(x02 + x14, 13); x11 ^= ROTL(x07 + x03, 13); + + x00 ^= ROTL(x12 + x08, 18); x05 ^= ROTL(x01 + x13, 18); + x10 ^= ROTL(x06 + x02, 18); x15 ^= ROTL(x11 + x07, 18); + + /* Operate on rows. */ + x01 ^= ROTL(x00 + x03, 7); x06 ^= ROTL(x05 + x04, 7); + x11 ^= ROTL(x10 + x09, 7); x12 ^= ROTL(x15 + x14, 7); + + x02 ^= ROTL(x01 + x00, 9); x07 ^= ROTL(x06 + x05, 9); + x08 ^= ROTL(x11 + x10, 9); x13 ^= ROTL(x12 + x15, 9); + + x03 ^= ROTL(x02 + x01, 13); x04 ^= ROTL(x07 + x06, 13); + x09 ^= ROTL(x08 + x11, 13); x14 ^= ROTL(x13 + x12, 13); + + x00 ^= ROTL(x03 + x02, 18); x05 ^= ROTL(x04 + x07, 18); + x10 ^= ROTL(x09 + x08, 18); x15 ^= ROTL(x14 + x13, 18); + } + B[ 0] += x00; + B[ 1] += x01; + B[ 2] += x02; + B[ 3] += x03; + B[ 4] += x04; + B[ 5] += x05; + B[ 6] += x06; + B[ 7] += x07; + B[ 8] += x08; + B[ 9] += x09; + B[10] += x10; + B[11] += x11; + B[12] += x12; + B[13] += x13; + B[14] += x14; + B[15] += x15; +} + +void scrypt_1024_1_1_256_sp_generic(const char *input, char *output, char *scratchpad) +{ + uint8_t B[128]; + uint32_t X[32]; + uint32_t *V; + uint32_t i, j, k; + + V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); + + PBKDF2_SHA256((const uint8_t *)input, 80, (const uint8_t *)input, 80, 1, B, 128); + + for (k = 0; k < 32; k++) + X[k] = le32dec(&B[4 * k]); + + for (i = 0; i < 1024; i++) { + memcpy(&V[i * 32], X, 128); + xor_salsa8(&X[0], &X[16]); + xor_salsa8(&X[16], &X[0]); + } + for (i = 0; i < 1024; i++) { + j = 32 * (X[16] & 1023); + for (k = 0; k < 32; k++) + X[k] ^= V[j + k]; + xor_salsa8(&X[0], &X[16]); + xor_salsa8(&X[16], &X[0]); + } + + for (k = 0; k < 32; k++) + le32enc(&B[4 * k], X[k]); + + PBKDF2_SHA256((const uint8_t *)input, 80, B, 128, 1, (uint8_t *)output, 32); +} + +#if defined(USE_SSE2) +// By default, set to generic scrypt function. This will prevent crash in case when scrypt_detect_sse2() wasn't called +void (*scrypt_1024_1_1_256_sp_detected)(const char *input, char *output, char *scratchpad) = &scrypt_1024_1_1_256_sp_generic; + +void scrypt_detect_sse2() +{ +#if defined(USE_SSE2_ALWAYS) + printf("scrypt: using scrypt-sse2 as built.\n"); +#else // USE_SSE2_ALWAYS + // 32bit x86 Linux or Windows, detect cpuid features + unsigned int cpuid_edx=0; +#if defined(_MSC_VER) + // MSVC + int x86cpuid[4]; + __cpuid(x86cpuid, 1); + cpuid_edx = (unsigned int)buffer[3]; +#else // _MSC_VER + // Linux or i686-w64-mingw32 (gcc-4.6.3) + unsigned int eax, ebx, ecx; + __get_cpuid(1, &eax, &ebx, &ecx, &cpuid_edx); +#endif // _MSC_VER + + if (cpuid_edx & 1<<26) + { + scrypt_1024_1_1_256_sp_detected = &scrypt_1024_1_1_256_sp_sse2; + printf("scrypt: using scrypt-sse2 as detected.\n"); + } + else + { + scrypt_1024_1_1_256_sp_detected = &scrypt_1024_1_1_256_sp_generic; + printf("scrypt: using scrypt-generic, SSE2 unavailable.\n"); + } +#endif // USE_SSE2_ALWAYS +} +#endif + +void scrypt_1024_1_1_256(const char *input, char *output) +{ + char scratchpad[SCRYPT_SCRATCHPAD_SIZE]; + scrypt_1024_1_1_256_sp(input, output, scratchpad); +} diff --git a/src/crypto/scrypt.h b/src/crypto/scrypt.h new file mode 100644 index 000000000..5431fb67c --- /dev/null +++ b/src/crypto/scrypt.h @@ -0,0 +1,45 @@ +#ifndef SCRYPT_H +#define SCRYPT_H +#include +#include + +static const int SCRYPT_SCRATCHPAD_SIZE = 131072 + 63; + +void scrypt_1024_1_1_256(const char *input, char *output); +void scrypt_1024_1_1_256_sp_generic(const char *input, char *output, char *scratchpad); + +#if defined(USE_SSE2) +#if defined(_M_X64) || defined(__x86_64__) || defined(_M_AMD64) || (defined(MAC_OSX) && defined(__i386__)) +#define USE_SSE2_ALWAYS 1 +#define scrypt_1024_1_1_256_sp(input, output, scratchpad) scrypt_1024_1_1_256_sp_sse2((input), (output), (scratchpad)) +#else +#define scrypt_1024_1_1_256_sp(input, output, scratchpad) scrypt_1024_1_1_256_sp_detected((input), (output), (scratchpad)) +#endif + +void scrypt_detect_sse2(); +void scrypt_1024_1_1_256_sp_sse2(const char *input, char *output, char *scratchpad); +extern void (*scrypt_1024_1_1_256_sp_detected)(const char *input, char *output, char *scratchpad); +#else +#define scrypt_1024_1_1_256_sp(input, output, scratchpad) scrypt_1024_1_1_256_sp_generic((input), (output), (scratchpad)) +#endif + +void +PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, + size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen); + +static inline uint32_t le32dec(const void *pp) +{ + const uint8_t *p = (uint8_t const *)pp; + return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + + ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); +} + +static inline void le32enc(void *pp, uint32_t x) +{ + uint8_t *p = (uint8_t *)pp; + p[0] = x & 0xff; + p[1] = (x >> 8) & 0xff; + p[2] = (x >> 16) & 0xff; + p[3] = (x >> 24) & 0xff; +} +#endif diff --git a/src/init.cpp b/src/init.cpp index 4d952ada0..bcbc85bf2 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -191,10 +191,7 @@ void Shutdown() StopREST(); StopRPC(); StopHTTPServer(); -#ifdef ENABLE_WALLET - if (pwalletMain) - pwalletMain->Flush(false); -#endif + GenerateBitcoins(false, 0, Params()); StopNode(); StopTorControl(); @@ -393,6 +390,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-whitebind=", _("Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6")); strUsage += HelpMessageOpt("-whitelist=", _("Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.") + " " + _("Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway")); + strUsage += HelpMessageOpt("-synctime", strprintf(_("Sync time with other nodes (default: %u)"), 0)); strUsage += HelpMessageOpt("-whitelistrelay", strprintf(_("Accept relayed transactions received from whitelisted peers even when not relaying transactions (default: %d)"), DEFAULT_WHITELISTRELAY)); strUsage += HelpMessageOpt("-whitelistforcerelay", strprintf(_("Force relay of transactions from whitelisted peers even they violate local relay policy (default: %d)"), DEFAULT_WHITELISTFORCERELAY)); strUsage += HelpMessageOpt("-maxuploadtarget=", strprintf(_("Tries to keep outbound traffic under the given target (in MiB per 24h), 0 = no limit (default: %d)"), DEFAULT_MAX_UPLOAD_TARGET)); @@ -436,7 +434,6 @@ std::string HelpMessage(HelpMessageMode mode) { strUsage += HelpMessageOpt("-checkblockindex", strprintf("Do a full consistency check for mapBlockIndex, setBlockIndexCandidates, chainActive and mapBlocksUnlinked occasionally. Also sets -checkmempool (default: %u)", Params(CBaseChainParams::MAIN).DefaultConsistencyChecks())); strUsage += HelpMessageOpt("-checkmempool=", strprintf("Run checks every transactions (default: %u)", Params(CBaseChainParams::MAIN).DefaultConsistencyChecks())); - strUsage += HelpMessageOpt("-checkpoints", strprintf("Disable expensive verification for known chain history (default: %u)", DEFAULT_CHECKPOINTS_ENABLED)); #ifdef ENABLE_WALLET strUsage += HelpMessageOpt("-dblogsize=", strprintf("Flush wallet database activity from memory to disk log every megabytes (default: %u)", DEFAULT_WALLET_DBLOGSIZE)); #endif @@ -744,6 +741,19 @@ void InitParameterInteraction() LogPrintf("%s: parameter interaction: -externalip set -> setting -discover=0\n", __func__); } +#ifdef ENABLE_WALLET + if (mapArgs.count("-reservebalance")) // ppcoin: reserve balance amount + { + + if (SoftSetBoolArg("-reservebalance", false)) + { + LogPrintf("Invalid amount for -reservebalance="); + + } + ParseMoney(mapArgs["-reservebalance"], nReserveBalance); + } +#endif + if (GetBoolArg("-salvagewallet", false)) { // Rewrite just private keys: rescan to find transactions if (SoftSetBoolArg("-rescan", true)) @@ -906,7 +916,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) mempool.setSanityCheck(1.0 / ratio); } fCheckBlockIndex = GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks()); - fCheckpointsEnabled = GetBoolArg("-checkpoints", DEFAULT_CHECKPOINTS_ENABLED); + if (GetBoolArg("-checkpoints", false)) + return InitError(_("Error: Unsupported argument -checkpoints found. We rely on it to verify pre protocol v3 era.")); + fCheckpointsEnabled = true; // mempool limits int64_t nMempoolSizeMax = GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000; @@ -1025,6 +1037,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) nMaxDatacarrierBytes = GetArg("-datacarriersize", nMaxDatacarrierBytes); fAlerts = GetBoolArg("-alerts", DEFAULT_ALERTS); + fBIP37 = GetArg("-bip37", false); // Option to startup with mocktime set (used for regression testing): SetMockTime(GetArg("-mocktime", 0)); // SetMockTime(0) is a no-op @@ -1114,6 +1127,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) int64_t nStart; +#if defined(USE_SSE2) + scrypt_detect_sse2(); +#endif + // ********************************************************* Step 5: verify wallet database integrity #ifdef ENABLE_WALLET if (!fDisableWallet) { @@ -1670,17 +1687,22 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) // this was discussed in the IRC meeting on 2016-03-31. // // --- disabled --- - //int64_t nPowTargetSpacing = Params().GetConsensus().nPowTargetSpacing; + //int64_t nTargetSpacing = Params().GetConsensus().nTargetSpacing; //CScheduler::Function f = boost::bind(&PartitionCheck, &IsInitialBlockDownload, - // boost::ref(cs_main), boost::cref(pindexBestHeader), nPowTargetSpacing); - //scheduler.scheduleEvery(f, nPowTargetSpacing); + // boost::ref(cs_main), boost::cref(pindexBestHeader), nTargetSpacing); + //scheduler.scheduleEvery(f, nTargetSpacing); // --- end disabled --- // Generate coins in the background GenerateBitcoins(GetBoolArg("-gen", DEFAULT_GENERATE), GetArg("-genproclimit", DEFAULT_GENERATE_THREADS), chainparams); +#ifdef ENABLE_WALLET + // Mine proof-of-stake blocks in the background + if (!GetBoolArg("-staking", true)) + LogPrintf("Staking disabled\n"); + else if (pwalletMain) + threadGroup.create_thread(boost::bind(&ThreadStakeMiner, pwalletMain, chainparams)); - // ********************************************************* Step 12: finished - +#endif SetRPCWarmupFinished(); uiInterface.InitMessage(_("Done loading")); diff --git a/src/main.cpp b/src/main.cpp index 88905b2d5..8f1c08a83 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,10 +16,13 @@ #include "consensus/validation.h" #include "hash.h" #include "init.h" +#include "key.h" #include "merkleblock.h" #include "net.h" #include "policy/policy.h" +#include "pos.h" #include "pow.h" +#include "pubkey.h" #include "primitives/block.h" #include "primitives/transaction.h" #include "script/script.h" @@ -35,6 +38,8 @@ #include "utilstrencodings.h" #include "validationinterface.h" #include "versionbits.h" +#include "key.h" +#include "wallet/wallet.h" #include @@ -72,6 +77,7 @@ bool fSpentIndex = false; bool fHavePruned = false; bool fPruneMode = false; bool fIsBareMultisigStd = DEFAULT_PERMIT_BAREMULTISIG; +bool fBIP37 = false; bool fRequireStandard = true; unsigned int nBytesPerSigOp = DEFAULT_BYTES_PER_SIGOP; bool fCheckBlockIndex = false; @@ -104,7 +110,7 @@ static void CheckBlockIndex(const Consensus::Params& consensusParams); /** Constant stuff for coinbase transactions we create: */ CScript COINBASE_FLAGS; -const string strMessageMagic = "Bitcoin Signed Message:\n"; +const string strMessageMagic = "BlackCoin Signed Message:\n"; // Internal stuff namespace { @@ -409,6 +415,8 @@ void ProcessBlockAvailability(NodeId nodeid) { } } + + /** Update tracking information about which blocks a peer is assumed to have. */ void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) { CNodeState *state = State(nodeid); @@ -430,7 +438,7 @@ void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) { // Requires cs_main bool CanDirectFetch(const Consensus::Params &consensusParams) { - return chainActive.Tip()->GetBlockTime() > GetAdjustedTime() - consensusParams.nPowTargetSpacing * 20; + return chainActive.Tip()->GetBlockTime() > GetAdjustedTime() - consensusParams.nTargetSpacing * 20; } // Requires cs_main @@ -722,9 +730,7 @@ bool CheckFinalTx(const CTransaction &tx, int flags) // When the next block is created its previous block will be the current // chain tip, so we use that to calculate the median time passed to // IsFinalTx() if LOCKTIME_MEDIAN_TIME_PAST is set. - const int64_t nBlockTime = (flags & LOCKTIME_MEDIAN_TIME_PAST) - ? chainActive.Tip()->GetMedianTimePast() - : GetAdjustedTime(); + const int64_t nBlockTime = GetAdjustedTime(); return IsFinalTx(tx, nBlockHeight, nBlockTime); } @@ -750,8 +756,7 @@ static std::pair CalculateSequenceLocks(const CTransaction &tx, in // tx.nVersion is signed integer so requires cast to unsigned otherwise // we would be doing a signed comparison and half the range of nVersion // wouldn't support BIP 68. - bool fEnforceBIP68 = static_cast(tx.nVersion) >= 2 - && flags & LOCKTIME_VERIFY_SEQUENCE; + bool fEnforceBIP68 = false; // Do not enforce sequence numbers as a relative lock time // unless we have been instructed to @@ -774,7 +779,7 @@ static std::pair CalculateSequenceLocks(const CTransaction &tx, in int nCoinHeight = (*prevHeights)[txinIndex]; if (txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG) { - int64_t nCoinTime = block.GetAncestor(std::max(nCoinHeight-1, 0))->GetMedianTimePast(); + int64_t nCoinTime = block.GetAncestor(std::max(nCoinHeight-1, 0))->GetPastTimeLimit(); // NOTE: Subtract 1 to maintain nLockTime semantics // BIP 68 relative lock times have the semantics of calculating // the first block or time at which the transaction would be @@ -800,7 +805,7 @@ static std::pair CalculateSequenceLocks(const CTransaction &tx, in static bool EvaluateSequenceLocks(const CBlockIndex& block, std::pair lockPair) { assert(block.pprev); - int64_t nBlockTime = block.pprev->GetMedianTimePast(); + int64_t nBlockTime = block.pprev->GetPastTimeLimit(); if (lockPair.first >= block.nHeight || lockPair.second >= nBlockTime) return false; @@ -952,6 +957,8 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state) CAmount nValueOut = 0; BOOST_FOREACH(const CTxOut& txout, tx.vout) { + if (txout.IsEmpty() && !tx.IsCoinBase() && !tx.IsCoinStake()) + return state.DoS(100, error("CheckTransaction(): txout empty for user transaction")); if (txout.nValue < 0) return state.DoS(100, false, REJECT_INVALID, "bad-txns-vout-negative"); if (txout.nValue > MAX_MONEY) @@ -1020,6 +1027,11 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C if (tx.IsCoinBase()) return state.DoS(100, false, REJECT_INVALID, "coinbase"); + // Coinstake is also only valid in a block, not as a loose transaction + if (tx.IsCoinStake()) + return state.DoS(100, error("AcceptToMemoryPool: coinstake as individual tx"), + REJECT_INVALID, "coinstake"); + // Rather not work on nonstandard transactions (unless -testnet/-regtest) string reason; if (fRequireStandard && !IsStandardTx(tx, reason)) @@ -1028,8 +1040,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C // Don't relay version 2 transactions until CSV is active, and we can be // sure that such transactions will be mined (unless we're on // -testnet/-regtest). - const CChainParams& chainparams = Params(); - if (fRequireStandard && tx.nVersion >= 2 && VersionBitsTipState(chainparams.GetConsensus(), Consensus::DEPLOYMENT_CSV) != THRESHOLD_ACTIVE) { + if (fRequireStandard && tx.nVersion >= 2) { return state.DoS(0, false, REJECT_NONSTANDARD, "premature-version2-tx"); } @@ -1039,6 +1050,11 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C if (!CheckFinalTx(tx, STANDARD_LOCKTIME_VERIFY_FLAGS)) return state.DoS(0, false, REJECT_NONSTANDARD, "non-final"); + // For the same reasons as in the case with non-final transactions + if (tx.nTime > FutureDrift(GetAdjustedTime())) { + return state.DoS(0, false, REJECT_NONSTANDARD, "time-too-new"); + } + // is it already in the memory pool? uint256 hash = tx.GetHash(); if (pool.exists(hash)) @@ -1068,7 +1084,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C // unconfirmed ancestors anyway; doing otherwise is hopelessly // insecure. bool fReplacementOptOut = true; - if (fEnableReplacement) + if (0) { BOOST_FOREACH(const CTxIn &txin, ptxConflicting->vin) { @@ -1177,7 +1193,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState &state, const C // itself can contain sigops MAX_STANDARD_TX_SIGOPS is less than // MAX_BLOCK_SIGOPS; we still consider this an invalid rather than // merely non-standard transaction. - if ((nSigOps > MAX_STANDARD_TX_SIGOPS) || (nBytesPerSigOp && nSigOps > nSize / nBytesPerSigOp)) + if ((nSigOps > MAX_STANDARD_TX_SIGOPS)) return state.DoS(0, false, REJECT_NONSTANDARD, "bad-txns-too-many-sigops", false, strprintf("%d", nSigOps)); @@ -1610,8 +1626,8 @@ bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus: } // Check the header - if (!CheckProofOfWork(block.GetHash(), block.nBits, consensusParams)) - return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString()); +// if (!CheckProofOfWork(block.GetPoWHash(), block.nBits, consensusParams)) +// return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString()); return true; } @@ -1626,17 +1642,49 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus return true; } -CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) +bool ReadFromDisk(CTransaction& tx, CDiskTxPos& txindex, CBlockTreeDB& txdb, COutPoint prevout) { - int halvings = nHeight / consensusParams.nSubsidyHalvingInterval; - // Force block reward to zero when right shift is undefined. - if (halvings >= 64) - return 0; + if (!txdb.ReadTxIndex(prevout.hash, txindex)){ + LogPrintf("no tx index %s \n", prevout.hash.ToString()); + return false; + } + if (!ReadFromDisk(tx, txindex)) + return false; + if (prevout.n >= tx.vout.size()) + { + return false; + } + return true; +} - CAmount nSubsidy = 50 * COIN; - // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years. - nSubsidy >>= halvings; - return nSubsidy; +bool ReadFromDisk(CTransaction& tx, CDiskTxPos& txindex) +{ + CAutoFile filein(OpenBlockFile(txindex, true), SER_DISK, CLIENT_VERSION); + if (filein.IsNull()) + return error("CTransaction::ReadFromDisk() : OpenBlockFile failed"); + + // Read transaction + CBlockHeader header; + try { + filein >> header; + fseek(filein.Get(), txindex.nTxOffset, SEEK_CUR); + filein >> tx; + } + catch (const std::exception& e) { + return error("%s: Deserialize or I/O error - %s", __func__, e.what()); + } + + return true; +} + +CAmount GetProofOfWorkSubsidy() +{ + return 10000 * COIN; +} + +CAmount GetProofOfStakeSubsidy() +{ + return COIN * 3 / 2; } bool IsInitialBlockDownload() @@ -1810,7 +1858,9 @@ void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCach CTxInUndo& undo = txundo.vprevout.back(); undo.nHeight = coins->nHeight; undo.fCoinBase = coins->fCoinBase; + undo.fCoinStake = coins->fCoinStake; undo.nVersion = coins->nVersion; + undo.nTime = coins->nTime; } } // add outputs @@ -1863,14 +1913,20 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins const CCoins *coins = inputs.AccessCoins(prevout.hash); assert(coins); - // If prev is coinbase, check that it's matured - if (coins->IsCoinBase()) { - if (nSpendHeight - coins->nHeight < COINBASE_MATURITY) - return state.Invalid(false, - REJECT_INVALID, "bad-txns-premature-spend-of-coinbase", - strprintf("tried to spend coinbase at depth %d", nSpendHeight - coins->nHeight)); + // If prev is coinbase or coinstake, check that it's matured + if (coins->IsCoinBase() || coins->IsCoinStake()) { + if (nSpendHeight - coins->nHeight < COINBASE_MATURITY) + return state.Invalid( + error("CheckInputs(): tried to spend %s at depth %d", coins->IsCoinBase() ? "coinbase" : "coinstake", nSpendHeight - coins->nHeight), + REJECT_INVALID, "bad-txns-premature-spend-of-coinbase"); } + + // Check transaction timestamp + if (coins->nTime > tx.nTime) + return state.DoS(100, error("CheckInputs() : transaction timestamp earlier than input transaction"), + REJECT_INVALID, "bad-txns-time-earlier-than-input"); + // Check for negative or overflow input values nValueIn += coins->vout[prevout.n].nValue; if (!MoneyRange(coins->vout[prevout.n].nValue) || !MoneyRange(nValueIn)) @@ -1878,17 +1934,23 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins } - if (nValueIn < tx.GetValueOut()) - return state.DoS(100, false, REJECT_INVALID, "bad-txns-in-belowout", false, - strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(tx.GetValueOut()))); + if (!tx.IsCoinStake()) + { + if (nValueIn < tx.GetValueOut()) + return state.DoS(100, error("CheckInputs(): %s value in (%s) < value out (%s)", + tx.GetHash().ToString(), FormatMoney(nValueIn), FormatMoney(tx.GetValueOut())), + REJECT_INVALID, "bad-txns-in-belowout"); - // Tally transaction fees - CAmount nTxFee = nValueIn - tx.GetValueOut(); - if (nTxFee < 0) - return state.DoS(100, false, REJECT_INVALID, "bad-txns-fee-negative"); - nFees += nTxFee; - if (!MoneyRange(nFees)) - return state.DoS(100, false, REJECT_INVALID, "bad-txns-fee-outofrange"); + // Tally transaction fees + CAmount nTxFee = nValueIn - tx.GetValueOut(); + if (nTxFee < 0) + return state.DoS(100, error("CheckInputs(): %s nTxFee < 0", tx.GetHash().ToString()), + REJECT_INVALID, "bad-txns-fee-negative"); + nFees += nTxFee; + if (!MoneyRange(nFees)) + return state.DoS(100, error("CheckInputs(): nFees out of range"), + REJECT_INVALID, "bad-txns-fee-outofrange"); + } return true; } }// namespace Consensus @@ -2046,6 +2108,7 @@ static bool ApplyTxInUndo(const CTxInUndo& undo, CCoinsViewCache& view, const CO coins->fCoinBase = undo.fCoinBase; coins->nHeight = undo.nHeight; coins->nVersion = undo.nVersion; + coins->nTime = undo.nTime; } else { if (coins->IsPruned()) fClean = fClean && error("%s: undo data adding output to missing transaction", __func__); @@ -2110,6 +2173,15 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI // undo unspent index addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uint160(hashBytes), hash, k), CAddressUnspentValue())); + } else if(out.scriptPubKey.IsPayToPublicKey()){ + uint160 uhashBytes = Hash160(out.scriptPubKey.begin()+1, out.scriptPubKey.begin()+34); + + // record receiving activity + addressIndex.push_back(make_pair(CAddressIndexKey(1, uhashBytes, pindex->nHeight, i, hash, k, false), out.nValue)); + + // record unspent output + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uhashBytes, hash, k), CAddressUnspentValue())); + } else { continue; } @@ -2164,7 +2236,7 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI addressIndex.push_back(make_pair(CAddressIndexKey(2, uint160(hashBytes), pindex->nHeight, i, hash, j, true), prevout.nValue * -1)); // restore unspent index - addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(2, uint160(hashBytes), input.prevout.hash, input.prevout.n), CAddressUnspentValue(prevout.nValue, prevout.scriptPubKey, undo.nHeight))); + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(2, uint160(hashBytes), input.prevout.hash, input.prevout.n), CAddressUnspentValue(prevout.nValue, prevout.scriptPubKey, undo.nHeight, tx.nTime))); } else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) { @@ -2174,7 +2246,16 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI addressIndex.push_back(make_pair(CAddressIndexKey(1, uint160(hashBytes), pindex->nHeight, i, hash, j, true), prevout.nValue * -1)); // restore unspent index - addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uint160(hashBytes), input.prevout.hash, input.prevout.n), CAddressUnspentValue(prevout.nValue, prevout.scriptPubKey, undo.nHeight))); + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uint160(hashBytes), input.prevout.hash, input.prevout.n), CAddressUnspentValue(prevout.nValue, prevout.scriptPubKey, undo.nHeight, tx.nTime))); + + } else if(prevout.scriptPubKey.IsPayToPublicKey()){ + uint160 uhashBytes = Hash160(prevout.scriptPubKey.begin()+1, prevout.scriptPubKey.begin()+34); + + // record receiving activity + addressIndex.push_back(make_pair(CAddressIndexKey(1, uhashBytes, pindex->nHeight, i, hash, j, true), prevout.nValue * -1)); + + // record unspent output + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uhashBytes, input.prevout.hash, input.prevout.n), CAddressUnspentValue(prevout.nValue, prevout.scriptPubKey, undo.nHeight, tx.nTime))); } else { continue; @@ -2185,7 +2266,6 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI } } - // move best block pointer to prevout block view.SetBestBlock(pindex->pprev->GetBlockHash()); @@ -2206,6 +2286,8 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI return fClean; } + + void static FlushBlockFile(bool fFinalize = false) { LOCK(cs_LastBlockFile); @@ -2244,7 +2326,7 @@ void ThreadScriptCheck() { // too slowly or too quickly). // void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const CBlockIndex *const &bestHeader, - int64_t nPowTargetSpacing) + int64_t nTargetSpacing) { if (bestHeader == NULL || initialDownloadCheck()) return; @@ -2254,7 +2336,7 @@ void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const const int SPAN_HOURS=4; const int SPAN_SECONDS=SPAN_HOURS*60*60; - int BLOCKS_EXPECTED = SPAN_SECONDS / nPowTargetSpacing; + int BLOCKS_EXPECTED = SPAN_SECONDS / nTargetSpacing; boost::math::poisson_distribution poisson(BLOCKS_EXPECTED); @@ -2356,12 +2438,13 @@ static int64_t nTimeTotal = 0; bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck) { const CChainParams& chainparams = Params(); + const uint256& hash = pindex->GetBlockHash(); AssertLockHeld(cs_main); int64_t nTimeStart = GetTimeMicros(); // Check it again in case a previous version let a bad block in - if (!CheckBlock(block, state, !fJustCheck, !fJustCheck)) + if (!CheckBlock(block, state, hash, !fJustCheck, !fJustCheck, !fJustCheck)) return false; // verify that the view's current state corresponds to the previous block @@ -2370,10 +2453,37 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin // Special case for the genesis block, skipping connection of its transactions // (its coinbase is unspendable) - if (block.GetHash() == chainparams.GetConsensus().hashGenesisBlock) { - if (!fJustCheck) - view.SetBestBlock(pindex->GetBlockHash()); - return true; + if (hash == chainparams.GetConsensus().hashGenesisBlock) { + if (!fJustCheck) + view.SetBestBlock(pindex->GetBlockHash()); + return true; + } + + + // Check difficulty + if (block.nBits != GetNextTargetRequired(pindex->pprev, &block, block.IsProofOfStake(), chainparams.GetConsensus())) + return state.DoS(100, error("%s: incorrect difficulty", __func__), + REJECT_INVALID, "bad-diffbits"); + + pindex->nStakeModifier = ComputeStakeModifier(pindex->pprev, block.IsProofOfStake() ? block.vtx[1].vin[0].prevout.hash : pindex->GetBlockHash()); + + // Check proof-of-stake + if (block.IsProofOfStake() && block.GetBlockTime() > chainparams.GetConsensus().nProtocolV3Time) { + const COutPoint &prevout = block.vtx[1].vin[0].prevout; + const CCoins *coins = view.AccessCoins(prevout.hash); + if (!coins) + return state.DoS(100, error("%s: kernel input unavailable", __func__), + REJECT_INVALID, "bad-cs-kernel"); + + // Check proof-of-stake min confirmations + if (pindex->nHeight - coins->nHeight < STAKE_MIN_CONFIRMATIONS) + return state.DoS(100, + error("%s: tried to stake at depth %d", __func__, pindex->nHeight - coins->nHeight), + REJECT_INVALID, "bad-cs-premature"); + + if (!CheckStakeKernelHash(pindex->pprev, block.nBits, coins, prevout, block.vtx[1].nTime)) + return state.DoS(100, error("%s: proof-of-stake hash doesn't match nBits", __func__), + REJECT_INVALID, "bad-cs-proofhash"); } bool fScriptChecks = true; @@ -2400,9 +2510,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin // Now that the whole chain is irreversibly beyond that time it is applied to all blocks except the // two in the chain that violate it. This prevents exploiting the issue against nodes during their // initial block download. - bool fEnforceBIP30 = (!pindex->phashBlock) || // Enforce on CreateNewBlock invocations which don't have a hash. - !((pindex->nHeight==91842 && pindex->GetBlockHash() == uint256S("0x00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec")) || - (pindex->nHeight==91880 && pindex->GetBlockHash() == uint256S("0x00000000000743f190a18c5577a3c2d2a1f610ae9601ac046a38084ccb7cd721"))); + bool fEnforceBIP30 = true; // Once BIP34 activated it was not possible to create new duplicate coinbases and thus other than starting // with the 2 existing duplicate coinbase pairs, not possible to create overwriting txs. But by the @@ -2423,30 +2531,30 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin } } - // BIP16 didn't become active until Apr 1 2012 - int64_t nBIP16SwitchTime = 1333238400; - bool fStrictPayToScriptHash = (pindex->GetBlockTime() >= nBIP16SwitchTime); + // BIP16 is always active + bool fStrictPayToScriptHash = true; unsigned int flags = fStrictPayToScriptHash ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE; - // Start enforcing the DERSIG (BIP66) rules, for block.nVersion=3 blocks, - // when 75% of the network has upgraded: - if (block.nVersion >= 3 && IsSuperMajority(3, pindex->pprev, chainparams.GetConsensus().nMajorityEnforceBlockUpgrade, chainparams.GetConsensus())) { - flags |= SCRIPT_VERIFY_DERSIG; - } + // BIP66 is always active + flags |= SCRIPT_VERIFY_DERSIG; + // BlackCoin also requires DER encoding of pubkeys + flags |= SCRIPT_VERIFY_DERKEY; + // BlackCoin also requires low S in sigs + flags |= SCRIPT_VERIFY_LOW_S; - // Start enforcing CHECKLOCKTIMEVERIFY, (BIP65) for block.nVersion=4 - // blocks, when 75% of the network has upgraded: - if (block.nVersion >= 4 && IsSuperMajority(4, pindex->pprev, chainparams.GetConsensus().nMajorityEnforceBlockUpgrade, chainparams.GetConsensus())) { + // Start enforcing CHECKLOCKTIMEVERIFY, (BIP65) since protocol v3 + + if (block.GetBlockTime() > chainparams.GetConsensus().nProtocolV3Time) { flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; + flags |= SCRIPT_VERIFY_NULLDUMMY; } // Start enforcing BIP68 (sequence locks) and BIP112 (CHECKSEQUENCEVERIFY) using versionbits logic. - int nLockTimeFlags = 0; - if (VersionBitsState(pindex->pprev, chainparams.GetConsensus(), Consensus::DEPLOYMENT_CSV, versionbitscache) == THRESHOLD_ACTIVE) { - flags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY; - nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE; - } +// int nLockTimeFlags = 0; +// if (VersionBitsState(pindex->pprev, chainparams.GetConsensus(), Consensus::DEPLOYMENT_CSV, versionbitscache) == THRESHOLD_ACTIVE) { +// flags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY; +// } int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1; LogPrint("bench", " - Fork checks: %.2fms [%.2fs]\n", 0.001 * (nTime2 - nTime1), nTimeForks * 0.000001); @@ -2457,6 +2565,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin std::vector prevheights; CAmount nFees = 0; + CAmount nActualStakeReward = 0; int nInputs = 0; unsigned int nSigOps = 0; CDiskTxPos pos(pindex->GetBlockPos(), GetSizeOfCompactSize(block.vtx.size())); @@ -2484,54 +2593,47 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin return state.DoS(100, error("ConnectBlock(): inputs missing/spent"), REJECT_INVALID, "bad-txns-inputs-missingorspent"); - // Check that transaction is BIP68 final - // BIP68 lock checks (as opposed to nLockTime checks) must - // be in ConnectBlock because they require the UTXO set - prevheights.resize(tx.vin.size()); - for (size_t j = 0; j < tx.vin.size(); j++) { - prevheights[j] = view.AccessCoins(tx.vin[j].prevout.hash)->nHeight; - } - - if (!SequenceLocks(tx, nLockTimeFlags, &prevheights, *pindex)) { - return state.DoS(100, error("%s: contains a non-BIP68-final transaction", __func__), - REJECT_INVALID, "bad-txns-nonfinal"); - } - if (fAddressIndex || fSpentIndex) { - for (size_t j = 0; j < tx.vin.size(); j++) { + + for (size_t j = 0; j < tx.vin.size(); j++) { - const CTxIn input = tx.vin[j]; - const CTxOut &prevout = view.GetOutputFor(tx.vin[j]); - uint160 hashBytes; - int addressType; + const CTxIn input = tx.vin[j]; + const CTxOut &prevout = view.GetOutputFor(tx.vin[j]); + uint160 hashBytes; + int addressType; - if (prevout.scriptPubKey.IsPayToScriptHash()) { - hashBytes = uint160(vector (prevout.scriptPubKey.begin()+2, prevout.scriptPubKey.begin()+22)); - addressType = 2; - } else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) { - hashBytes = uint160(vector (prevout.scriptPubKey.begin()+3, prevout.scriptPubKey.begin()+23)); - addressType = 1; - } else { - hashBytes.SetNull(); - addressType = 0; - } + if (prevout.scriptPubKey.IsPayToScriptHash()) { + hashBytes = uint160(vector (prevout.scriptPubKey.begin()+2, prevout.scriptPubKey.begin()+22)); + addressType = 2; + } else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) { + hashBytes = uint160(vector (prevout.scriptPubKey.begin()+3, prevout.scriptPubKey.begin()+23)); + addressType = 1; + } else if (prevout.scriptPubKey.IsPayToPublicKey()) { + hashBytes = Hash160(prevout.scriptPubKey.begin()+1, prevout.scriptPubKey.begin()+34); + addressType = 1; + } + else { + hashBytes.SetNull(); + addressType = 0; + } - if (fAddressIndex && addressType > 0) { - // record spending activity - addressIndex.push_back(make_pair(CAddressIndexKey(addressType, hashBytes, pindex->nHeight, i, txhash, j, true), prevout.nValue * -1)); + if (fAddressIndex && addressType > 0) { - // remove address from unspent index - addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(addressType, hashBytes, input.prevout.hash, input.prevout.n), CAddressUnspentValue())); - } + // record spending activity + addressIndex.push_back(make_pair(CAddressIndexKey(addressType, hashBytes, pindex->nHeight, i, txhash, j, true), prevout.nValue * -1)); - if (fSpentIndex) { - // add the spent index to determine the txid and input that spent an output - // and to find the amount and address from an input - spentIndex.push_back(make_pair(CSpentIndexKey(input.prevout.hash, input.prevout.n), CSpentIndexValue(txhash, j, pindex->nHeight, prevout.nValue, addressType, hashBytes))); - } - } + // remove address from unspent index + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(addressType, hashBytes, input.prevout.hash, input.prevout.n), CAddressUnspentValue())); + } + if (fSpentIndex) { + // add the spent index to determine the txid and input that spent an output + // and to find the amount and address from an input + spentIndex.push_back(make_pair(CSpentIndexKey(input.prevout.hash, input.prevout.n), CSpentIndexValue(txhash, j, pindex->nHeight, prevout.nValue, addressType, hashBytes))); + } + } + } if (fStrictPayToScriptHash) @@ -2545,7 +2647,10 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin REJECT_INVALID, "bad-blk-sigops"); } - nFees += view.GetValueIn(tx)-tx.GetValueOut(); + if (tx.IsCoinStake()) + nActualStakeReward = tx.GetValueOut()-view.GetValueIn(tx); + else + nFees += view.GetValueIn(tx)-tx.GetValueOut(); std::vector vChecks; bool fCacheResults = fJustCheck; /* Don't cache results if we're actually connecting blocks (still consult the cache, though) */ @@ -2566,7 +2671,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin addressIndex.push_back(make_pair(CAddressIndexKey(2, uint160(hashBytes), pindex->nHeight, i, txhash, k, false), out.nValue)); // record unspent output - addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(2, uint160(hashBytes), txhash, k), CAddressUnspentValue(out.nValue, out.scriptPubKey, pindex->nHeight))); + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(2, uint160(hashBytes), txhash, k), CAddressUnspentValue(out.nValue, out.scriptPubKey, pindex->nHeight, tx.nTime))); } else if (out.scriptPubKey.IsPayToPublicKeyHash()) { vector hashBytes(out.scriptPubKey.begin()+3, out.scriptPubKey.begin()+23); @@ -2575,10 +2680,21 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin addressIndex.push_back(make_pair(CAddressIndexKey(1, uint160(hashBytes), pindex->nHeight, i, txhash, k, false), out.nValue)); // record unspent output - addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uint160(hashBytes), txhash, k), CAddressUnspentValue(out.nValue, out.scriptPubKey, pindex->nHeight))); + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uint160(hashBytes), txhash, k), CAddressUnspentValue(out.nValue, out.scriptPubKey, pindex->nHeight, tx.nTime))); + + } else if(out.scriptPubKey.IsPayToPublicKey()){ + uint160 uhashBytes = Hash160(out.scriptPubKey.begin()+1, out.scriptPubKey.begin()+34); + + // record receiving activity + addressIndex.push_back(make_pair(CAddressIndexKey(1, uhashBytes, pindex->nHeight, i, txhash, k, false), out.nValue)); + + // record unspent output + addressUnspentIndex.push_back(make_pair(CAddressUnspentKey(1, uhashBytes, txhash, k), CAddressUnspentValue(out.nValue, out.scriptPubKey, pindex->nHeight, tx.nTime))); + + }else{ + + continue; - } else { - continue; } } @@ -2596,12 +2712,23 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin int64_t nTime3 = GetTimeMicros(); nTimeConnect += nTime3 - nTime2; LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime3 - nTime2), 0.001 * (nTime3 - nTime2) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime3 - nTime2) / (nInputs-1), nTimeConnect * 0.000001); - CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus()); - if (block.vtx[0].GetValueOut() > blockReward) - return state.DoS(100, - error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", - block.vtx[0].GetValueOut(), blockReward), - REJECT_INVALID, "bad-cb-amount"); + if (block.IsProofOfWork()) { + CAmount blockReward = nFees + GetProofOfWorkSubsidy(); + if (block.vtx[0].GetValueOut() > blockReward) + return state.DoS(100, + error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)", + block.vtx[0].GetValueOut(), blockReward), + REJECT_INVALID, "bad-cb-amount"); + } + + if (block.IsProofOfStake() && block.GetBlockTime() > chainparams.GetConsensus().nProtocolV3Time) { + CAmount blockReward = nFees + GetProofOfStakeSubsidy(); + if (nActualStakeReward > blockReward) + return state.DoS(100, + error("ConnectBlock(): coinstake pays too much (actual=%d vs limit=%d)", + nActualStakeReward, blockReward), + REJECT_INVALID, "bad-cs-amount"); + } if (!control.Wait()) return state.DoS(100, false); @@ -2892,7 +3019,7 @@ bool static DisconnectTip(CValidationState& state, const Consensus::Params& cons // ignore validation errors in resurrected transactions list removed; CValidationState stateDummy; - if (tx.IsCoinBase() || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, true)) { + if (tx.IsCoinBase() || tx.IsCoinStake() || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, true)) { mempool.remove(tx, removed, true); } else if (mempool.exists(tx.GetHash())) { vHashUpdate.push_back(tx.GetHash()); @@ -3133,7 +3260,7 @@ static bool ActivateBestChainStep(CValidationState& state, const CChainParams& c * or an activated best chain. pblock is either NULL or a pointer to a block * that is already loaded (to avoid loading it again from disk). */ -bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, const CBlock *pblock) { +bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, const CBlock *pblock, const uint256 *phash) { CBlockIndex *pindexMostWork = NULL; do { boost::this_thread::interruption_point(); @@ -3152,10 +3279,10 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, if (pindexMostWork == NULL || pindexMostWork == chainActive.Tip()) return true; - if (!ActivateBestChainStep(state, chainparams, pindexMostWork, pblock && pblock->GetHash() == pindexMostWork->GetBlockHash() ? pblock : NULL)) - return false; + if (!ActivateBestChainStep(state, chainparams, pindexMostWork, pblock && (*phash) == pindexMostWork->GetBlockHash() ? pblock : NULL)) + return false; - pindexNewTip = chainActive.Tip(); + pindexNewTip = chainActive.Tip(); pindexFork = chainActive.FindFork(pindexOldTip); fInitialDownload = IsInitialBlockDownload(); } @@ -3282,10 +3409,66 @@ bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex) { return true; } -CBlockIndex* AddToBlockIndex(const CBlockHeader& block) +// ppcoin: total coin age spent in transaction, in the unit of coin-days. +// Only those coins meeting minimum age requirement counts. As those +// transactions not in main chain are not currently indexed so we +// might not find out about their coin age. Older transactions are +// guaranteed to be in main chain by sync-checkpoint. This rule is +// introduced to help nodes establish a consistent view of the coin +// age (trust score) of competing branches. +bool GetCoinAge(const CTransaction& tx, CBlockTreeDB& txdb, const CBlockIndex* pindexPrev, uint64_t& nCoinAge) +{ + arith_uint256 bnCentSecond = 0; // coin age in the unit of cent-seconds + nCoinAge = 0; + + if (tx.IsCoinBase()) + return true; + + BOOST_FOREACH(const CTxIn& txin, tx.vin) + { + // First try finding the previous transaction in database + CTransaction txPrev; + CDiskTxPos txindex; + if (!ReadFromDisk(txPrev, txindex, *pblocktree, txin.prevout)) + continue; // previous transaction not in main chain + if (tx.nTime < txPrev.nTime) + return false; // Transaction timestamp violation + + if (Params().GetConsensus().IsProtocolV3(tx.nTime)) + { + int nSpendDepth; + if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, nStakeMinConfirmations - 1, nSpendDepth)) + { + LogPrint("coinage", "coin age skip nSpendDepth=%d\n", nSpendDepth + 1); + continue; // only count coins meeting min confirmations requirement + } + } + else + { + // Read block header + CBlock block; + const CDiskBlockPos& pos = CDiskBlockPos(txindex.nFile, txindex.nPos); + if (!ReadBlockFromDisk(block, pos, Params().GetConsensus())) + return false; // unable to read block of previous transaction + if (block.GetBlockTime() + nStakeMinAge > tx.nTime) + continue; // only count coins meeting min age requirement + } + + int64_t nValueIn = txPrev.vout[txin.prevout.n].nValue; + bnCentSecond += arith_uint256(nValueIn) * (tx.nTime-txPrev.nTime) / CENT; + + LogPrint("coinage", "coin age nValueIn=%d nTimeDiff=%d bnCentSecond=%s\n", nValueIn, tx.nTime - txPrev.nTime, bnCentSecond.ToString()); + } + + arith_uint256 bnCoinDay = bnCentSecond * CENT / COIN / (24 * 60 * 60); + LogPrint("coinage", "coin age bnCoinDay=%s\n", bnCoinDay.ToString()); + nCoinAge = bnCoinDay.GetLow64(); + return true; +} + +static CBlockIndex* AddToBlockIndex(const CBlockHeader& block, const uint256& hash) { // Check for duplicate - uint256 hash = block.GetHash(); BlockMap::iterator it = mapBlockIndex.find(hash); if (it != mapBlockIndex.end()) return it->second; @@ -3319,6 +3502,8 @@ CBlockIndex* AddToBlockIndex(const CBlockHeader& block) /** Mark a block as having its data received and checked (up to BLOCK_VALID_TRANSACTIONS). */ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBlockIndex *pindexNew, const CDiskBlockPos& pos) { + if (block.IsProofOfStake()) + pindexNew->SetProofOfStake(); pindexNew->nTx = block.vtx.size(); pindexNew->nChainTx = 0; pindexNew->nFile = pos.nFile; @@ -3450,22 +3635,71 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne return true; } +static bool CheckBlockSignature(const CBlock& block, const uint256& hash) +{ + if (block.IsProofOfWork()) + return block.vchBlockSig.empty(); + + if (block.vchBlockSig.empty()) + return false; + + vector > vSolutions; + txnouttype whichType; + + const CTxOut& txout = block.vtx[1].vout[1]; + + if (!Solver(txout.scriptPubKey, whichType, vSolutions)) + return false; + + if (whichType == TX_PUBKEY) + { + vector& vchPubKey = vSolutions[0]; + return CPubKey(vchPubKey).Verify(hash, block.vchBlockSig); + } + else + { + // Block signing key also can be encoded in the nonspendable output + // This allows to not pollute UTXO set with useless outputs e.g. in case of multisig staking + + const CScript& script = txout.scriptPubKey; + CScript::const_iterator pc = script.begin(); + opcodetype opcode; + vector vchPushValue; + + if (!script.GetOp(pc, opcode, vchPushValue)) + return false; + if (opcode != OP_RETURN) + return false; + if (!script.GetOp(pc, opcode, vchPushValue)) + return false; + if (!IsCompressedOrUncompressedPubKey(vchPushValue)) + return false; + return CPubKey(vchPushValue).Verify(hash, block.vchBlockSig); + } + + return false; +} + bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW) { + if (block.nVersion < 7 && Params().GetConsensus().IsProtocolV2(block.GetBlockTime())) + return state.Invalid(error("%s: rejected nVersion=%d block", __func__, block.nVersion), + REJECT_OBSOLETE, "bad-version"); + // Check proof of work matches claimed amount - if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, Params().GetConsensus())) + if (fCheckPOW && !CheckProofOfWork(block.GetPoWHash(), block.nBits, Params().GetConsensus())) return state.DoS(50, error("CheckBlockHeader(): proof of work failed"), REJECT_INVALID, "high-hash"); // Check timestamp - if (block.GetBlockTime() > GetAdjustedTime() + 2 * 60 * 60) + if (block.GetBlockTime() > FutureDrift(GetAdjustedTime())) return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"), REJECT_INVALID, "time-too-new"); return true; } -bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bool fCheckMerkleRoot) +bool CheckBlock(const CBlock& block, CValidationState& state, const uint256& hash, bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) { // These are checks that are independent of context. @@ -3474,7 +3708,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo // Check that the header is valid (particularly PoW). This is mostly // redundant with the call in AcceptBlockHeader. - if (!CheckBlockHeader(block, state, fCheckPOW)) + if (!CheckBlockHeader(block, state, block.IsProofOfWork())) return false; // Check the merkle root. @@ -3510,13 +3744,48 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo if (block.vtx[i].IsCoinBase()) return state.DoS(100, error("CheckBlock(): more than one coinbase"), REJECT_INVALID, "bad-cb-multiple"); + // Check coinbase timestamp + if (block.GetBlockTime() > FutureDrift(block.vtx[0].nTime)) + return state.DoS(25, error("CheckBlock(): coinbase timestamp is too early"), + REJECT_INVALID, "bad-cb-time"); + // Check coinstake timestamp + if (block.IsProofOfStake() && !CheckCoinStakeTimestamp(block.GetBlockTime(), block.vtx[1].nTime)) + return state.DoS(50, error("CheckBlock(): coinstake timestamp violation nTimeBlock=%d nTimeTx=%u", block.GetBlockTime(), block.vtx[1].nTime), + REJECT_INVALID, "bad-cs-time"); + + if (block.IsProofOfStake()) + { + // Coinbase output must be empty if proof-of-stake block + if (block.vtx[0].vout.size() != 1 || !block.vtx[0].vout[0].IsEmpty()) + return state.DoS(100, error("CheckBlock(): coinbase output not empty for proof-of-stake block"), + REJECT_INVALID, "bad-cb-not-empty"); + + // Second transaction must be coinstake, the rest must not be + if (block.vtx.size() < 2 || !block.vtx[1].IsCoinStake()) + return state.DoS(100, error("CheckBlock(): second tx is not coinstake"), + REJECT_INVALID, "bad-cs-missing"); + for (unsigned int i = 2; i < block.vtx.size(); i++) + if (block.vtx[i].IsCoinStake()) + return state.DoS(100, error("CheckBlock(): more than one coinstake"), + REJECT_INVALID, "bad-cs-multiple"); + } + + // Check proof-of-stake block signature + if (fCheckSig && !CheckBlockSignature(block, hash)) + return state.DoS(100, error("CheckBlock(): bad proof-of-stake block signature"), + REJECT_INVALID, "bad-block-signature"); // Check transactions - BOOST_FOREACH(const CTransaction& tx, block.vtx) + BOOST_FOREACH(const CTransaction& tx, block.vtx){ if (!CheckTransaction(tx, state)) return error("CheckBlock(): CheckTransaction of %s failed with %s", tx.GetHash().ToString(), FormatStateMessage(state)); + // check transaction timestamp + if (block.GetBlockTime() < (int64_t)tx.nTime) + return state.DoS(100, error("CheckBlock() : block timestamp earlier than transaction timestamp"), + REJECT_INVALID, "bad-tx-time"); + } unsigned int nSigOps = 0; BOOST_FOREACH(const CTransaction& tx, block.vtx) @@ -3547,34 +3816,36 @@ static bool CheckIndexAgainstCheckpoint(const CBlockIndex* pindexPrev, CValidati return true; } -bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex * const pindexPrev) +bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex * const pindexPrev, const uint256& hash) { - const Consensus::Params& consensusParams = Params().GetConsensus(); - // Check proof of work - if (block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams)) - return state.DoS(100, error("%s: incorrect proof of work", __func__), - REJECT_INVALID, "bad-diffbits"); + const Consensus::Params& consensusParams = Params().GetConsensus(); + if (hash == consensusParams.hashGenesisBlock) + return true; + + assert(pindexPrev); + + int nHeight = pindexPrev->nHeight+1; + + + + if (chainActive.Height() - nHeight >= consensusParams.nMaxReorganizationDepth) + return state.DoS(1, error("%s: forked chain older than max reorganization depth (height %d)", __func__, nHeight)); + + // Preliminary check difficulty in pos-only stage + if (chainActive.Height() > consensusParams.nLastPOWBlock && nHeight > consensusParams.nLastPOWBlock && block.nBits != GetNextTargetRequired(pindexPrev, &block, true, consensusParams)) + return state.DoS(100, error("%s: incorrect difficulty", __func__), + REJECT_INVALID, "bad-diffbits"); + + // Preliminary check of pos timestamp + if (nHeight > consensusParams.nLastPOWBlock && !CheckStakeBlockTimestamp(block.GetBlockTime())) + return state.DoS(100, error("%s: incorrect pos block timestamp", __func__), + REJECT_INVALID, "bad-pos-time"); // Check timestamp against prev - if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast()) + if (block.GetBlockTime() <= pindexPrev->GetPastTimeLimit()) return state.Invalid(error("%s: block's timestamp is too early", __func__), REJECT_INVALID, "time-too-old"); - // Reject block.nVersion=1 blocks when 95% (75% on testnet) of the network has upgraded: - if (block.nVersion < 2 && IsSuperMajority(2, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams)) - return state.Invalid(error("%s: rejected nVersion=1 block", __func__), - REJECT_OBSOLETE, "bad-version"); - - // Reject block.nVersion=2 blocks when 95% (75% on testnet) of the network has upgraded: - if (block.nVersion < 3 && IsSuperMajority(3, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams)) - return state.Invalid(error("%s: rejected nVersion=2 block", __func__), - REJECT_OBSOLETE, "bad-version"); - - // Reject block.nVersion=3 blocks when 95% (75% on testnet) of the network has upgraded: - if (block.nVersion < 4 && IsSuperMajority(4, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams)) - return state.Invalid(error("%s : rejected nVersion=3 block", __func__), - REJECT_OBSOLETE, "bad-version"); - return true; } @@ -3583,15 +3854,13 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn const int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1; const Consensus::Params& consensusParams = Params().GetConsensus(); + if (block.IsProofOfWork() && nHeight > consensusParams.nLastPOWBlock) + return state.DoS(100, error("%s : reject proof-of-work at height %d", __func__, nHeight), REJECT_INVALID, "bad-pow-height"); + // Start enforcing BIP113 (Median Time Past) using versionbits logic. int nLockTimeFlags = 0; - if (VersionBitsState(pindexPrev, consensusParams, Consensus::DEPLOYMENT_CSV, versionbitscache) == THRESHOLD_ACTIVE) { - nLockTimeFlags |= LOCKTIME_MEDIAN_TIME_PAST; - } - int64_t nLockTimeCutoff = (nLockTimeFlags & LOCKTIME_MEDIAN_TIME_PAST) - ? pindexPrev->GetMedianTimePast() - : block.GetBlockTime(); + int64_t nLockTimeCutoff = block.GetBlockTime(); // Check that all transactions are finalized BOOST_FOREACH(const CTransaction& tx, block.vtx) { @@ -3600,9 +3869,8 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn } } - // 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 && IsSuperMajority(2, pindexPrev, consensusParams.nMajorityEnforceBlockUpgrade, consensusParams)) + // Enforce rule that the coinbase starts with serialized block height + { CScript expect = CScript() << nHeight; if (block.vtx[0].vin[0].scriptSig.size() < expect.size() || @@ -3614,11 +3882,10 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn return true; } -static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex=NULL) +static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, const uint256& hash, const CChainParams& chainparams, CBlockIndex** ppindex=NULL) { AssertLockHeld(cs_main); // Check for duplicate - uint256 hash = block.GetHash(); BlockMap::iterator miSelf = mapBlockIndex.find(hash); CBlockIndex *pindex = NULL; if (hash != chainparams.GetConsensus().hashGenesisBlock) { @@ -3649,11 +3916,14 @@ static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state if (fCheckpointsEnabled && !CheckIndexAgainstCheckpoint(pindexPrev, state, chainparams, hash)) return error("%s: CheckIndexAgainstCheckpoint(): %s", __func__, state.GetRejectReason().c_str()); - if (!ContextualCheckBlockHeader(block, state, pindexPrev)) + if (!ContextualCheckBlockHeader(block, state, pindexPrev, hash)) return false; } if (pindex == NULL) - pindex = AddToBlockIndex(block); + pindex = AddToBlockIndex(block, hash); + + if (pindex->nHeight > chainparams.GetConsensus().nLastPOWBlock) + pindex->SetProofOfStake(); if (ppindex) *ppindex = pindex; @@ -3662,13 +3932,13 @@ static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state } /** Store block on disk. If dbp is non-NULL, the file is known to already reside on disk */ -static bool AcceptBlock(const CBlock& block, CValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex, bool fRequested, CDiskBlockPos* dbp) +static bool AcceptBlock(const CBlock& block, CValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex, bool fRequested, CDiskBlockPos* dbp, const uint256& hash) { AssertLockHeld(cs_main); CBlockIndex *&pindex = *ppindex; - if (!AcceptBlockHeader(block, state, chainparams, &pindex)) + if (!AcceptBlockHeader(block, state, hash, chainparams, &pindex)) return false; // Try to process all requested blocks that we don't have, but only @@ -3692,7 +3962,7 @@ static bool AcceptBlock(const CBlock& block, CValidationState& state, const CCha if (fTooFarAhead) return true; // Block height is too high } - if ((!CheckBlock(block, state)) || !ContextualCheckBlock(block, state, pindex->pprev)) { + if ((!CheckBlock(block, state, hash)) || !ContextualCheckBlock(block, state, pindex->pprev)) { if (state.IsInvalid() && !state.CorruptionPossible()) { pindex->nStatus |= BLOCK_FAILED_VALID; setDirtyBlockIndex.insert(pindex); @@ -3737,15 +4007,29 @@ static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned return (nFound >= nRequired); } - -bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, const CNode* pfrom, const CBlock* pblock, bool fForceProcessing, CDiskBlockPos* dbp) +bool static IsCanonicalBlockSignature(const CBlock* pblock) { + if (pblock->IsProofOfWork()) { + return pblock->vchBlockSig.empty(); + } + + return IsLowDERSignature(pblock->vchBlockSig, NULL, false); +} + +bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, const CNode* pfrom, const CBlock* pblock, bool fForceProcessing, CDiskBlockPos* dbp, const uint256& hash) +{ + if (!IsCanonicalBlockSignature(pblock)) { + if (pfrom && pfrom->nVersion >= CANONICAL_BLOCK_SIG_VERSION) + return state.DoS(100, error("ProcessNewBlock(): bad block signature encoding"), + REJECT_INVALID, "bad-block-signature-encoding"); + return false; + } // Preliminary checks - bool checked = CheckBlock(*pblock, state); + bool checked = CheckBlock(*pblock, state, hash); { LOCK(cs_main); - bool fRequested = MarkBlockAsReceived(pblock->GetHash()); + bool fRequested = MarkBlockAsReceived(hash); fRequested |= fForceProcessing; if (!checked) { return error("%s: CheckBlock FAILED", __func__); @@ -3753,7 +4037,7 @@ bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, c // Store to disk CBlockIndex *pindex = NULL; - bool ret = AcceptBlock(*pblock, state, chainparams, &pindex, fRequested, dbp); + bool ret = AcceptBlock(*pblock, state, chainparams, &pindex, fRequested, dbp, hash); if (pindex && pfrom) { mapBlockSource[pindex->GetBlockHash()] = pfrom->GetId(); } @@ -3762,13 +4046,13 @@ bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, c return error("%s: AcceptBlock FAILED", __func__); } - if (!ActivateBestChain(state, chainparams, pblock)) + if (!ActivateBestChain(state, chainparams, pblock, &hash)) return error("%s: ActivateBestChain failed", __func__); return true; } -bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams, const CBlock& block, CBlockIndex* pindexPrev, bool fCheckPOW, bool fCheckMerkleRoot) +bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams, const CBlock& block, CBlockIndex* pindexPrev, bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) { AssertLockHeld(cs_main); assert(pindexPrev && pindexPrev == chainActive.Tip()); @@ -3780,10 +4064,11 @@ bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams, indexDummy.pprev = pindexPrev; indexDummy.nHeight = pindexPrev->nHeight + 1; + uint256 hash = block.GetHash(); // NOTE: CheckBlockHeader is called by CheckBlock - if (!ContextualCheckBlockHeader(block, state, pindexPrev)) + if (!ContextualCheckBlockHeader(block, state, pindexPrev, hash)) return false; - if (!CheckBlock(block, state, fCheckPOW, fCheckMerkleRoot)) + if (!CheckBlock(block, state, hash, fCheckPOW, fCheckMerkleRoot)) return false; if (!ContextualCheckBlock(block, state, pindexPrev)) return false; @@ -4127,7 +4412,8 @@ bool CVerifyDB::VerifyDB(const CChainParams& chainparams, CCoinsView *coinsview, if (!ReadBlockFromDisk(block, pindex, chainparams.GetConsensus())) return error("VerifyDB(): *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString()); // check level 1: verify block validity - if (nCheckLevel >= 1 && !CheckBlock(block, state)) + uint256 hash = block.GetHash(); + if (nCheckLevel >= 1 && !CheckBlock(block, state, hash)) return error("VerifyDB(): *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString()); // check level 2: verify undo validity if (nCheckLevel >= 2 && pindex) { @@ -4250,6 +4536,7 @@ bool InitBlockIndex(const CChainParams& chainparams) if (!fReindex) { try { CBlock &block = const_cast(chainparams.GenesisBlock()); + const uint256& hash = chainparams.GetConsensus().hashGenesisBlock; // Start new block file unsigned int nBlockSize = ::GetSerializeSize(block, SER_DISK, CLIENT_VERSION); CDiskBlockPos blockPos; @@ -4258,10 +4545,10 @@ bool InitBlockIndex(const CChainParams& chainparams) return error("LoadBlockIndex(): FindBlockPos failed"); if (!WriteBlockToDisk(block, blockPos, chainparams.MessageStart())) return error("LoadBlockIndex(): writing genesis block to disk failed"); - CBlockIndex *pindex = AddToBlockIndex(block); + CBlockIndex *pindex = AddToBlockIndex(block, hash); if (!ReceivedBlockTransactions(block, state, pindex, blockPos)) return error("LoadBlockIndex(): genesis block not accepted"); - if (!ActivateBestChain(state, chainparams, &block)) + if (!ActivateBestChain(state, chainparams, &block, &hash)) return error("LoadBlockIndex(): genesis block cannot be activated"); // Force a chainstate write so that when we VerifyDB in a moment, it doesn't check stale data return FlushStateToDisk(state, FLUSH_STATE_ALWAYS); @@ -4331,7 +4618,7 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB // process in case the block isn't known yet if (mapBlockIndex.count(hash) == 0 || (mapBlockIndex[hash]->nStatus & BLOCK_HAVE_DATA) == 0) { CValidationState state; - if (ProcessNewBlock(state, chainparams, NULL, &block, true, dbp)) + if (ProcessNewBlock(state, chainparams, NULL, &block, true, dbp, hash)) nLoaded++; if (state.IsError()) break; @@ -4350,10 +4637,11 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB std::multimap::iterator it = range.first; if (ReadBlockFromDisk(block, it->second, chainparams.GetConsensus())) { - LogPrintf("%s: Processing out of order child %s of %s\n", __func__, block.GetHash().ToString(), + uint256 hash = block.GetHash(); + LogPrintf("%s: Processing out of order child %s of %s\n", __func__, hash.ToString(), head.ToString()); CValidationState dummy; - if (ProcessNewBlock(dummy, chainparams, NULL, &block, true, &it->second)) + if (ProcessNewBlock(dummy, chainparams, NULL, &block, true, &it->second, hash)) { nLoaded++; queue.push_back(block.GetHash()); @@ -4692,13 +4980,11 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam if (chainActive.Contains(mi->second)) { send = true; } else { - static const int nOneMonth = 30 * 24 * 60 * 60; // To prevent fingerprinting attacks, only send blocks outside of the active - // chain if they are valid, and no more than a month older (both in time, and in - // best equivalent proof of work) than the best header chain we know about. + // chain if they are valid, and no more than the max reorganization depth older + // than the best chain we know about. send = mi->second->IsValid(BLOCK_VALID_SCRIPTS) && (pindexBestHeader != NULL) && - (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() < nOneMonth) && - (GetBlockProofEquivalentTime(*pindexBestHeader, *mi->second, *pindexBestHeader, consensusParams) < nOneMonth); + (chainActive.Height() - mi->second->nHeight < Params().GetConsensus().nMaxReorganizationDepth); if (!send) { LogPrintf("%s: ignoring request from peer=%i for old block that isn't in the main chain\n", __func__, pfrom->GetId()); } @@ -4954,7 +5240,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeOffset = nTime - GetTime(); pfrom->nTimeOffset = nTimeOffset; - AddTimeData(pfrom->addr, nTimeOffset); + + if (GetBoolArg("-synctime", false)) + AddTimeData(pfrom->addr, nTimeOffset); } @@ -5180,7 +5468,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } // If pruning, don't inv blocks unless we have on disk and are likely to still have // for some reasonable time window (1 hour) that block relay might require. - const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / chainparams.GetConsensus().nPowTargetSpacing; + const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / chainparams.GetConsensus().nTargetSpacing; if (fPruneMode && (!(pindex->nStatus & BLOCK_HAVE_DATA) || pindex->nHeight <= chainActive.Tip()->nHeight - nPrunedBlocksLikelyToHave)) { LogPrint("net", " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString()); @@ -5400,6 +5688,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, for (unsigned int n = 0; n < nCount; n++) { vRecv >> headers[n]; ReadCompactSize(vRecv); // ignore tx count; assume it is 0. + ReadCompactSize(vRecv); // ignore block sig; assume it is 0. } LOCK(cs_main); @@ -5416,7 +5705,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, Misbehaving(pfrom->GetId(), 20); return error("non-continuous headers sequence"); } - if (!AcceptBlockHeader(header, state, chainparams, &pindexLast)) { + uint256 hash = header.GetHash(); + if (!AcceptBlockHeader(header, state, hash, chainparams, &pindexLast)) { int nDoS; if (state.IsInvalid(nDoS)) { if (nDoS > 0) @@ -5503,7 +5793,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, // Such an unrequested block may still be processed, subject to the // conditions in AcceptBlock(). bool forceProcessing = pfrom->fWhitelisted && !IsInitialBlockDownload(); - ProcessNewBlock(state, chainparams, pfrom, &block, forceProcessing, NULL); + ProcessNewBlock(state, chainparams, pfrom, &block, forceProcessing, NULL, inv.hash); int nDoS; if (state.IsInvalid(nDoS)) { assert (state.GetRejectCode() < REJECT_INTERNAL); // Blocks are never rejected with internal reject codes @@ -5674,7 +5964,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } - else if (strCommand == NetMsgType::FILTERLOAD) + else if (strCommand == NetMsgType::FILTERLOAD && fBIP37) { CBloomFilter filter; vRecv >> filter; @@ -5693,7 +5983,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } - else if (strCommand == NetMsgType::FILTERADD) + else if (strCommand == NetMsgType::FILTERADD && fBIP37) { vector vData; vRecv >> vData; @@ -5713,7 +6003,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } - else if (strCommand == NetMsgType::FILTERCLEAR) + else if (strCommand == NetMsgType::FILTERCLEAR && fBIP37) { LOCK(pfrom->cs_filter); delete pfrom->pfilter; @@ -6167,7 +6457,7 @@ bool SendMessages(CNode* pto) if (!pto->fDisconnect && state.vBlocksInFlight.size() > 0) { QueuedBlock &queuedBlock = state.vBlocksInFlight.front(); int nOtherPeersWithValidatedDownloads = nPeersWithValidatedDownloads - (state.nBlocksInFlightValidHeaders > 0); - if (nNow > state.nDownloadingSince + consensusParams.nPowTargetSpacing * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) { + if (nNow > state.nDownloadingSince + consensusParams.nTargetSpacing * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) { LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", queuedBlock.hash.ToString(), pto->id); pto->fDisconnect = true; } diff --git a/src/main.h b/src/main.h index 712426961..49e5e6ddf 100644 --- a/src/main.h +++ b/src/main.h @@ -29,7 +29,6 @@ #include #include - class CBlockIndex; class CBlockTreeDB; class CBloomFilter; @@ -40,6 +39,9 @@ class CTxMemPool; class CValidationInterface; class CValidationState; +class CDiskTxPos; +class CWallet; + struct CNodeStateStats; struct LockPoints; @@ -50,7 +52,7 @@ static const bool DEFAULT_WHITELISTRELAY = true; /** Default for DEFAULT_WHITELISTFORCERELAY. */ static const bool DEFAULT_WHITELISTFORCERELAY = true; /** Default for -minrelaytxfee, minimum relay fee for transactions */ -static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000; +static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 10000; /** Default for -maxorphantx, maximum number of orphan transactions kept in memory */ static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100; /** Default for -limitancestorcount, max number of in-mempool ancestors */ @@ -111,7 +113,7 @@ static const bool DEFAULT_RELAYPRIORITY = true; static const bool DEFAULT_PERMIT_BAREMULTISIG = true; static const unsigned int DEFAULT_BYTES_PER_SIGOP = 20; static const bool DEFAULT_CHECKPOINTS_ENABLED = true; -static const bool DEFAULT_TXINDEX = false; +static const bool DEFAULT_TXINDEX = true; static const bool DEFAULT_ADDRESSINDEX = false; static const bool DEFAULT_TIMESTAMPINDEX = false; static const bool DEFAULT_SPENTINDEX = false; @@ -146,6 +148,7 @@ extern bool fReindex; extern int nScriptCheckThreads; extern bool fTxIndex; extern bool fIsBareMultisigStd; +extern bool fBIP37; extern bool fRequireStandard; extern unsigned int nBytesPerSigOp; extern bool fCheckBlockIndex; @@ -154,6 +157,7 @@ extern size_t nCoinCacheUsage; extern CFeeRate minRelayTxFee; extern bool fAlerts; extern bool fEnableReplacement; +extern int64_t nLastCoinStakeSearchInterval; /** Best header we've seen so far (used for getheaders queries' starting points). */ extern CBlockIndex *pindexBestHeader; @@ -169,7 +173,7 @@ extern bool fPruneMode; /** Number of MiB of block files that we're trying to stay below. */ extern uint64_t nPruneTarget; /** Block files containing a block-height within MIN_BLOCKS_TO_KEEP of chainActive.Tip() will not be pruned. */ -static const unsigned int MIN_BLOCKS_TO_KEEP = 288; +static const unsigned int MIN_BLOCKS_TO_KEEP = 500; static const signed int DEFAULT_CHECKBLOCKS = MIN_BLOCKS_TO_KEEP; static const unsigned int DEFAULT_CHECKLEVEL = 3; @@ -201,7 +205,7 @@ void UnregisterNodeSignals(CNodeSignals& nodeSignals); * @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, const CChainParams& chainparams, const CNode* pfrom, const CBlock* pblock, bool fForceProcessing, CDiskBlockPos* dbp); +bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, const CNode* pfrom, const CBlock* pblock, bool fForceProcessing, CDiskBlockPos* dbp, const uint256& hash); /** Check whether enough disk space is available for an incoming block */ bool CheckDiskSpace(uint64_t nAdditionalBytes = 0); /** Open a block file (blk?????.dat) */ @@ -229,7 +233,7 @@ bool SendMessages(CNode* pto); /** Run an instance of the script checking thread */ void ThreadScriptCheck(); /** Try to detect Partition (network isolation) attacks against us */ -void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const CBlockIndex *const &bestHeader, int64_t nPowTargetSpacing); +void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const CBlockIndex *const &bestHeader, int64_t nTargetSpacing); /** Check whether we are doing an initial block download (synchronizing from disk or network) */ bool IsInitialBlockDownload(); /** Format a string that describes several potential problems detected by the core. @@ -243,8 +247,9 @@ std::string GetWarnings(const std::string& strFor); /** Retrieve a transaction (from memory pool, or from disk, if possible) */ bool GetTransaction(const uint256 &hash, CTransaction &tx, const Consensus::Params& params, uint256 &hashBlock, bool fAllowSlow = false); /** Find the best known block, and make it the tip of the block chain */ -bool ActivateBestChain(CValidationState& state, const CChainParams& chainparams, const CBlock* pblock = NULL); -CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams); +bool ActivateBestChain(CValidationState& state, const CChainParams& chainparams, const CBlock* pblock = NULL, const uint256 *phash = NULL); +CAmount GetProofOfWorkSubsidy(); +CAmount GetProofOfStakeSubsidy(); /** * Prune block and undo files (blk???.dat and undo???.dat) so that the disk space used is less than a user-defined target. @@ -422,6 +427,7 @@ struct CAddressUnspentKey { uint256 txhash; size_t index; + size_t GetSerializeSize(int nType, int nVersion) const { return 57; } @@ -463,6 +469,7 @@ struct CAddressUnspentValue { CAmount satoshis; CScript script; int blockHeight; + uint64_t nTime; ADD_SERIALIZE_METHODS; @@ -471,12 +478,14 @@ struct CAddressUnspentValue { READWRITE(satoshis); READWRITE(*(CScriptBase*)(&script)); READWRITE(blockHeight); + READWRITE(nTime); } - CAddressUnspentValue(CAmount sats, CScript scriptPubKey, int height) { + CAddressUnspentValue(CAmount sats, CScript scriptPubKey, int height, uint64_t nTimeVal) { satoshis = sats; script = scriptPubKey; blockHeight = height; + nTime = nTimeVal; } CAddressUnspentValue() { @@ -487,6 +496,7 @@ struct CAddressUnspentValue { satoshis = -1; script.clear(); blockHeight = 0; + nTime = 0; } bool IsNull() const { @@ -770,6 +780,8 @@ bool GetAddressUnspent(uint160 addressHash, int type, bool WriteBlockToDisk(const CBlock& block, CDiskBlockPos& pos, const CMessageHeader::MessageStartChars& messageStart); bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus::Params& consensusParams); bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams); +bool ReadFromDisk(CTransaction& tx, CDiskTxPos& txindex, CBlockTreeDB& txdb, COutPoint prevout); +bool ReadFromDisk(CTransaction& tx, CDiskTxPos& txindex); /** Functions for validating blocks and updating the block tree */ @@ -783,15 +795,15 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI 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); +bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW = false); +bool CheckBlock(const CBlock& block, CValidationState& state, const uint256& hash, bool fCheckPOW = true, bool fCheckMerkleRoot = true, bool fCheckSig = true); /** Context-dependent validity checks */ -bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex *pindexPrev); +bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex *pindexPrev, const uint256& hash); 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 CChainParams& chainparams, const CBlock& block, CBlockIndex* pindexPrev, bool fCheckPOW = true, bool fCheckMerkleRoot = true); +bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams, const CBlock& block, CBlockIndex* pindexPrev, bool fCheckPOW = true, bool fCheckMerkleRoot = true, bool fCheckSig = true); class CBlockFileInfo @@ -886,6 +898,8 @@ int GetSpendHeight(const CCoinsViewCache& inputs); */ int32_t ComputeBlockVersion(const CBlockIndex* pindexPrev, const Consensus::Params& params); +bool GetCoinAge(const CTransaction& tx, CBlockTreeDB& txdb, const CBlockIndex* pindexPrev, uint64_t& nCoinAge); + /** Reject codes greater or equal to this can be returned by AcceptToMemPool * for transactions, to signal internal conditions. They cannot and should not * be sent over the P2P network. diff --git a/src/miner.cpp b/src/miner.cpp index d095d418f..48f269d81 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -12,10 +12,12 @@ #include "consensus/consensus.h" #include "consensus/merkle.h" #include "consensus/validation.h" +#include "crypto/scrypt.h" #include "hash.h" #include "main.h" #include "net.h" #include "policy/policy.h" +#include "pos.h" #include "pow.h" #include "primitives/transaction.h" #include "script/standard.h" @@ -24,6 +26,7 @@ #include "util.h" #include "utilmoneystr.h" #include "validationinterface.h" +#include "wallet/wallet.h" #include #include @@ -44,6 +47,8 @@ using namespace std; uint64_t nLastBlockTx = 0; uint64_t nLastBlockSize = 0; +int64_t nLastCoinStakeSearchInterval = 0; +unsigned int nMinerSleep = 500; class ScoreCompare { @@ -56,22 +61,39 @@ public: } }; -int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev) +int64_t UpdateTime(CBlock* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev) { int64_t nOldTime = pblock->nTime; - int64_t nNewTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + int64_t nNewTime = std::max(pindexPrev->GetPastTimeLimit()+1, GetAdjustedTime()); if (nOldTime < nNewTime) pblock->nTime = nNewTime; // Updating time can change work required on testnet: if (consensusParams.fPowAllowMinDifficultyBlocks) - pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, consensusParams); + pblock->nBits = GetNextTargetRequired(pindexPrev, pblock, pblock->IsProofOfStake(),consensusParams); + return nNewTime - nOldTime; } -CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn) +// miner's coin base reward (POW) +CAmount GetProofOfWorkReward() +{ + CAmount nSubsidy = 10000 * COIN; + + return nSubsidy; +} + +int64_t GetMaxTransactionTime(CBlock* pblock) + { + int64_t maxTransactionTime = 0; + for (std::vector::const_iterator it(pblock->vtx.begin()); it != pblock->vtx.end(); ++it) + maxTransactionTime = std::max(maxTransactionTime, (int64_t)it->nTime); + return maxTransactionTime; + } + +CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn, int64_t* pFees, bool fProofOfStake) { // Create new block auto_ptr pblocktemplate(new CBlockTemplate()); @@ -84,7 +106,16 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s txNew.vin.resize(1); txNew.vin[0].prevout.SetNull(); txNew.vout.resize(1); - txNew.vout[0].scriptPubKey = scriptPubKeyIn; + int nHeight = chainActive.Tip()->nHeight + 1; + if (!fProofOfStake) + { + txNew.vout[0].scriptPubKey = scriptPubKeyIn; + } + else + { + txNew.vin[0].scriptSig = (CScript() << nHeight) + COINBASE_FLAGS; + txNew.vout[0].SetEmpty(); + } // Add dummy coinbase tx as first transaction pblock->vtx.push_back(CTransaction()); @@ -130,17 +161,14 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s CBlockIndex* pindexPrev = chainActive.Tip(); const int nHeight = pindexPrev->nHeight + 1; pblock->nTime = GetAdjustedTime(); - const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast(); pblock->nVersion = ComputeBlockVersion(pindexPrev, chainparams.GetConsensus()); // -regtest only: allow overriding block.nVersion with // -blockversion=N to test forking scenarios if (chainparams.MineBlocksOnDemand()) - pblock->nVersion = GetArg("-blockversion", pblock->nVersion); + pblock->nVersion = GetArg("-blockversion", pblock->nVersion); - int64_t nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST) - ? nMedianTimePast - : pblock->GetBlockTime(); + int64_t nLockTimeCutoff = pblock->GetBlockTime(); bool fPriorityBlock = nBlockPrioritySize > 0; if (fPriorityBlock) { @@ -221,7 +249,7 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s continue; } - if (!IsFinalTx(tx, nHeight, nLockTimeCutoff)) + if (tx.IsCoinStake() || !IsFinalTx(tx, nHeight, nLockTimeCutoff)|| pblock->GetBlockTime() < (int64_t)tx.nTime) continue; unsigned int nTxSigOps = iter->GetSigOpCount(); @@ -274,27 +302,35 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s } nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; - LogPrintf("CreateNewBlock(): total size %u txs: %u fees: %ld sigops %d\n", nBlockSize, nBlockTx, nFees, nBlockSigOps); + // LogPrintf("CreateNewBlock(): total size %u txs: %u fees: %ld sigops %d\n", nBlockSize, nBlockTx, nFees, nBlockSigOps); // Compute final coinbase transaction. - txNew.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus()); - txNew.vin[0].scriptSig = CScript() << nHeight << OP_0; + if (!fProofOfStake) { + txNew.vout[0].nValue = nFees + GetProofOfWorkSubsidy(); + txNew.vin[0].scriptSig = CScript() << nHeight << OP_0; + pblocktemplate->vTxFees[0] = -nFees; + } + txNew.nTime = pblock->nTime; pblock->vtx[0] = txNew; - pblocktemplate->vTxFees[0] = -nFees; + + if (pFees) + *pFees = nFees; // Fill in header pblock->hashPrevBlock = pindexPrev->GetBlockHash(); - UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev); - pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus()); - pblock->nNonce = 0; + pblock->nTime = max(pindexPrev->GetPastTimeLimit()+1, GetMaxTransactionTime(pblock)); + if (!fProofOfStake) + UpdateTime(pblock, Params().GetConsensus(), pindexPrev); + pblock->nBits = GetNextTargetRequired(pindexPrev, pblock, fProofOfStake, Params().GetConsensus()); + pblock->nNonce = 0; pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]); - + CValidationState state; - if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) { + if (!fProofOfStake && !TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false, false)) { throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, FormatStateMessage(state))); } } - + return pblocktemplate.release(); } @@ -322,40 +358,8 @@ void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned // Internal miner // -// -// ScanHash scans nonces looking for a hash with at least some zero bits. -// The nonce is usually preserved between calls, but periodically or if the -// nonce is 0xffff0000 or above, the block is rebuilt and nNonce starts over at -// zero. -// -bool static ScanHash(const CBlockHeader *pblock, uint32_t& nNonce, uint256 *phash) -{ - // Write the first 76 bytes of the block header to a double-SHA256 state. - CHash256 hasher; - CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); - ss << *pblock; - assert(ss.size() == 80); - hasher.Write((unsigned char*)&ss[0], 76); - while (true) { - nNonce++; - - // Write the last 4 bytes of the block header (the nonce) to a copy of - // the double-SHA256 state, and compute the result. - CHash256(hasher).Write((unsigned char*)&nNonce, 4).Finalize((unsigned char*)phash); - - // Return the nonce if the hash has at least some zero bits, - // caller will check if it has enough to reach the target - if (((uint16_t*)phash)[15] == 0) - return true; - - // If nothing found after trying for a while, return -1 - if ((nNonce & 0xfff) == 0) - return false; - } -} - -static bool ProcessBlockFound(const CBlock* pblock, const CChainParams& chainparams) +static bool ProcessBlockFound(const CBlock* pblock, const CChainParams& chainparams, const uint256& hash) { LogPrintf("%s\n", pblock->ToString()); LogPrintf("generated %s\n", FormatMoney(pblock->vtx[0].vout[0].nValue)); @@ -372,7 +376,7 @@ static bool ProcessBlockFound(const CBlock* pblock, const CChainParams& chainpar // Process this block the same as if we had received it from another node CValidationState state; - if (!ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL)) + if (!ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL, hash)) return error("BitcoinMiner: ProcessNewBlock, block not accepted"); return true; @@ -412,13 +416,27 @@ void static BitcoinMiner(const CChainParams& chainparams) } while (true); } + //check the block height + if (chainActive.Tip()->nHeight > Params().LastPOWBlock() + nStakeMinConfirmations) + { + // The stake is confirmed, stop the PoW miner + throw boost::thread_interrupted(); + } + //check the next block height + else if (chainActive.Tip()->nHeight + 1 > Params().LastPOWBlock()) + { + // Wait for the stake to be confirmed + MilliSleep(60000); + continue; + } + // // Create new block // unsigned int nTransactionsUpdatedLast = mempool.GetTransactionsUpdated(); CBlockIndex* pindexPrev = chainActive.Tip(); - - auto_ptr pblocktemplate(CreateNewBlock(chainparams, coinbaseScript->reserveScript)); + int64_t *nFees; + auto_ptr pblocktemplate(CreateNewBlock(chainparams, coinbaseScript->reserveScript, nFees, false)); if (!pblocktemplate.get()) { LogPrintf("Error in BitcoinMiner: Keypool ran out, please call keypoolrefill before restarting the mining thread\n"); @@ -435,22 +453,22 @@ void static BitcoinMiner(const CChainParams& chainparams) // int64_t nStart = GetTime(); arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits); - uint256 hash; - uint32_t nNonce = 0; + uint256 thash; + while (true) { // Check if something found - if (ScanHash(pblock, nNonce, &hash)) - { - if (UintToArith256(hash) <= hashTarget) + unsigned int nHashesDone = 0; + char scratchpad[SCRYPT_SCRATCHPAD_SIZE]; + while(true) + { + scrypt_1024_1_1_256_sp(BEGIN(pblock->nVersion), BEGIN(thash), scratchpad); + if (UintToArith256(thash) <= hashTarget) { - // Found a solution - pblock->nNonce = nNonce; - assert(hash == pblock->GetHash()); SetThreadPriority(THREAD_PRIORITY_NORMAL); LogPrintf("BitcoinMiner:\n"); - LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", hash.GetHex(), hashTarget.GetHex()); - ProcessBlockFound(pblock, chainparams); + LogPrintf("proof-of-work found \n powhash: %s \ntarget: %s\n", thash.GetHex(), hashTarget.GetHex()); + ProcessBlockFound(pblock, chainparams, thash); SetThreadPriority(THREAD_PRIORITY_LOWEST); coinbaseScript->KeepScript(); @@ -460,6 +478,10 @@ void static BitcoinMiner(const CChainParams& chainparams) break; } + pblock->nNonce += 1; + nHashesDone += 1; + if ((pblock->nNonce & 0xFF) == 0) + break; } // Check for stop or if block needs to be rebuilt @@ -467,7 +489,7 @@ void static BitcoinMiner(const CChainParams& chainparams) // Regtest mode doesn't require peers if (vNodes.empty() && chainparams.MiningRequiresPeers()) break; - if (nNonce >= 0xffff0000) + if (pblock->nNonce >= 0xffff0000) break; if (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 60) break; @@ -475,7 +497,7 @@ void static BitcoinMiner(const CChainParams& chainparams) break; // Update nTime every few seconds - if (UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev) < 0) + if (UpdateTime(pblock, Params().GetConsensus(), pindexPrev) < 0) break; // Recreate the block if the clock has run backwards, // so that we can use the correct time. if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks) @@ -519,3 +541,183 @@ void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainpar for (int i = 0; i < nThreads; i++) minerThreads->create_thread(boost::bind(&BitcoinMiner, boost::cref(chainparams))); } + +#ifdef ENABLE_WALLET +// novacoin: attempt to generate suitable proof-of-stake +bool SignBlock(CBlock& block, CWallet& wallet, int64_t& nFees) +{ + // if we are trying to sign + // something except proof-of-stake block template + if (!block.vtx[0].vout[0].IsEmpty()){ + LogPrintf("something except proof-of-stake block\n"); + return false; + } + + + // if we are trying to sign + // a complete proof-of-stake block + if (block.IsProofOfStake()){ + LogPrintf("trying to sign a complete proof-of-stake block\n"); + return true; + } + + + static int64_t nLastCoinStakeSearchTime = GetAdjustedTime(); // startup timestamp + + CKey key; + CMutableTransaction txCoinBase(block.vtx[0]); + CMutableTransaction txCoinStake; + txCoinStake.nTime = GetAdjustedTime(); + txCoinStake.nTime &= ~STAKE_TIMESTAMP_MASK; + + int64_t nSearchTime = txCoinStake.nTime; // search to current time + + + if (nSearchTime > nLastCoinStakeSearchTime) + { + if (wallet.CreateCoinStake(wallet, block.nBits, 1, nFees, txCoinStake, key)) + { + if (txCoinStake.nTime >= pindexBestHeader->GetPastTimeLimit()+1) + { + // make sure coinstake would meet timestamp protocol + // as it would be the same as the block timestamp + txCoinBase.nTime = block.nTime = txCoinStake.nTime; + block.vtx[0] = txCoinBase; + + // we have to make sure that we have no future timestamps in + // our transactions set + for (vector::iterator it = block.vtx.begin(); it != block.vtx.end();) + if (it->nTime > block.nTime) { it = block.vtx.erase(it); } else { ++it; } + + block.vtx.insert(block.vtx.begin() + 1, txCoinStake); + + block.hashMerkleRoot = BlockMerkleRoot(block); + + // append a signature to our block + return key.Sign(block.GetHash(), block.vchBlockSig); + } + } + nLastCoinStakeSearchInterval = nSearchTime - nLastCoinStakeSearchTime; + nLastCoinStakeSearchTime = nSearchTime; + } + + return false; +} +#endif + +void ThreadStakeMiner(CWallet *pwallet, const CChainParams& chainparams) +{ + + SetThreadPriority(THREAD_PRIORITY_LOWEST); + + // Make this thread recognisable as the mining thread + RenameThread("blackcoin-miner"); + + CReserveKey reservekey(pwallet); + + bool fTryToSync = true; + + while (true) + { + while (pwallet->IsLocked()) + { + nLastCoinStakeSearchInterval = 0; + MilliSleep(1000); + } + + while (vNodes.empty() || IsInitialBlockDownload()) + { + nLastCoinStakeSearchInterval = 0; + fTryToSync = true; + MilliSleep(1000); + } + + if (fTryToSync) + { + fTryToSync = false; + if (vNodes.size() < 3 || pindexBestHeader->GetBlockTime() < GetTime() - 10 * 60) + { + MilliSleep(60000); + continue; + } + } + + // + // Create new block + // + int64_t nFees; + auto_ptr pblocktemplate(CreateNewBlock(chainparams, reservekey.reserveScript, &nFees, true)); + if (!pblocktemplate.get()) + return; + + CBlock *pblock = &pblocktemplate->block; + // Trying to sign a block + if (SignBlock(*pblock, *pwallet, nFees)) + { + SetThreadPriority(THREAD_PRIORITY_NORMAL); + CheckStake(pblock, *pwallet, chainparams); + SetThreadPriority(THREAD_PRIORITY_LOWEST); + MilliSleep(500); + } + else + MilliSleep(nMinerSleep); + } +} + +bool CheckStake(CBlock* pblock, CWallet& wallet, const CChainParams& chainparams) +{ + uint256 hashBlock = pblock->GetHash(); + + if(!pblock->IsProofOfStake()) + return error("CheckStake() : %s is not a proof-of-stake block", hashBlock.GetHex()); + + CValidationState state; + // verify hash target and signature of coinstake tx + if (!CheckProofOfStake(mapBlockIndex[pblock->hashPrevBlock], pblock->vtx[1], pblock->nBits, state)) + return error("CheckStake() : proof-of-stake checking failed"); + + //// debug print + LogPrintf("%s\n", pblock->ToString()); + LogPrintf("out %s\n", FormatMoney(pblock->vtx[1].GetValueOut())); + + // Found a solution + { + LOCK(cs_main); + if (pblock->hashPrevBlock != chainActive.Tip()->GetBlockHash()) + return error("CheckStake() : generated block is stale"); + + // Track how many getdata requests this block gets + { + LOCK(wallet.cs_wallet); + wallet.mapRequestCount[hashBlock] = 0; + } + + // Process this block the same as if we had received it from another node + if (!ProcessBlockFound(pblock, chainparams, pblock->GetHash())) + return error("CheckStake() : ProcessBlock, block not accepted"); + } + + return true; +} + +//void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams) +//{ +// static boost::thread_group* minerThreads = NULL; +// +// if (nThreads < 0) +// nThreads = GetNumCores(); +// +// if (minerThreads != NULL) +// { +// minerThreads->interrupt_all(); +// delete minerThreads; +// minerThreads = NULL; +// } +// +// if (nThreads == 0 || !fGenerate) +// return; +// +// minerThreads = new boost::thread_group(); +// for (int i = 0; i < nThreads; i++) +// minerThreads->create_thread(boost::bind(&BitcoinMiner, boost::cref(chainparams))); +//} diff --git a/src/miner.h b/src/miner.h index 512494198..cd58d95c4 100644 --- a/src/miner.h +++ b/src/miner.h @@ -15,6 +15,7 @@ class CChainParams; class CReserveKey; class CScript; class CWallet; +class CBlock; namespace Consensus { struct Params; }; static const bool DEFAULT_GENERATE = false; @@ -31,10 +32,14 @@ struct CBlockTemplate /** Run the miner threads */ void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams); +void ThreadStakeMiner(CWallet *pwallet, const CChainParams& chainparams); +/** Run the miner threads */ +bool SignBlock(CBlock& block, CWallet& wallet, int64_t& nFees); /** Generate a new block, without valid proof-of-work */ -CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn); +CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn, int64_t* nFees = 0, bool fProofOfStake = false); /** Modify the extranonce in a block */ void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned int& nExtraNonce); -int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev); - +int64_t UpdateTime(CBlock* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev); +bool CheckStake(CBlock* pblock, CWallet& wallet, const CChainParams& chainparams); +CAmount GetProofOfWorkReward(); #endif // BITCOIN_MINER_H diff --git a/src/net.cpp b/src/net.cpp index 2f60cfa1c..83dda8a82 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -59,7 +59,7 @@ using namespace std; namespace { - const int MAX_OUTBOUND_CONNECTIONS = 8; + const int MAX_OUTBOUND_CONNECTIONS = 16; struct ListenSocket { SOCKET socket; diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp index 018b3d25b..805eaedc3 100644 --- a/src/policy/policy.cpp +++ b/src/policy/policy.cpp @@ -56,6 +56,15 @@ bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType) return whichType != TX_NONSTANDARD; } +int64_t FutureDrift(int64_t nTime) +{ + // loose policy for FutureDrift in regtest mode + if (Params().GetConsensus().fPowNoRetargeting && chainActive.Height() <= Params().GetConsensus().nLastPOWBlock) { + return nTime + 24 * 60 * 60; + } + return Params().GetConsensus().IsProtocolV2(nTime) ? nTime + 15 : nTime + 10 * 60; +} + bool IsStandardTx(const CTransaction& tx, std::string& reason) { if (tx.nVersion > CTransaction::MAX_STANDARD_VERSION || tx.nVersion < 1) { @@ -111,8 +120,9 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason) } } - // only one OP_RETURN txout is permitted - if (nDataOut > 1) { + // not more than one data txout per non-data txout is permitted + // only one data txout is permitted too + if (nDataOut > 1 && nDataOut > tx.vout.size()/2) { reason = "multi-op-return"; return false; } diff --git a/src/policy/policy.h b/src/policy/policy.h index 4f9354e36..7832b027a 100644 --- a/src/policy/policy.h +++ b/src/policy/policy.h @@ -33,28 +33,26 @@ static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE = 300; * blocks and we must accept those blocks. */ static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS | - SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_STRICTENC | SCRIPT_VERIFY_MINIMALDATA | - SCRIPT_VERIFY_NULLDUMMY | SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS | SCRIPT_VERIFY_CLEANSTACK | - SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY | - SCRIPT_VERIFY_CHECKSEQUENCEVERIFY | - SCRIPT_VERIFY_LOW_S; + SCRIPT_VERIFY_CHECKSEQUENCEVERIFY; /** 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; /** Used as the flags parameter to sequence and nLocktime checks in non-consensus code. */ -static const unsigned int STANDARD_LOCKTIME_VERIFY_FLAGS = LOCKTIME_VERIFY_SEQUENCE | - LOCKTIME_MEDIAN_TIME_PAST; +static const unsigned int STANDARD_LOCKTIME_VERIFY_FLAGS = 0; bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType); /** * Check for standard transaction types * @return True if all outputs (scriptPubKeys) use only standard transaction forms */ + +int64_t FutureDrift(int64_t nTime); + bool IsStandardTx(const CTransaction& tx, std::string& reason); /** * Check for standard transaction types diff --git a/src/pos.cpp b/src/pos.cpp new file mode 100644 index 000000000..4554db3a7 --- /dev/null +++ b/src/pos.cpp @@ -0,0 +1,156 @@ +// Copyright (c) 2014-2016 The BlackCoin Core developers +// Copyright (c) 2012-2013 The PPCoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "pos.h" + +#include "chain.h" +#include "chainparams.h" +#include "clientversion.h" +#include "coins.h" +#include "hash.h" +#include "main.h" +#include "uint256.h" +#include "primitives/transaction.h" +#include +#include "util.h" + + +// Stake Modifier (hash modifier of proof-of-stake): +// The purpose of stake modifier is to prevent a txout (coin) owner from +// computing future proof-of-stake generated by this txout at the time +// of transaction confirmation. To meet kernel protocol, the txout +// must hash with a future stake modifier to generate the proof. +uint256 ComputeStakeModifier(const CBlockIndex* pindexPrev, const uint256& kernel) +{ + if (!pindexPrev) + return uint256(); // genesis block's modifier is 0 + + CHashWriter ss(SER_GETHASH, 0); + ss << kernel << pindexPrev->nStakeModifier; + return ss.GetHash(); +} + +// Check whether the coinstake timestamp meets protocol +bool CheckCoinStakeTimestamp(int64_t nTimeBlock, int64_t nTimeTx) +{ + const Consensus::Params& params = Params().GetConsensus(); + if (params.IsProtocolV2(nTimeBlock)) + return (nTimeBlock == nTimeTx) && ((nTimeTx & params.nStakeTimestampMask) == 0); + else + return (nTimeBlock == nTimeTx); +} + +// Simplified version of CheckCoinStakeTimestamp() to check header-only timestamp +bool CheckStakeBlockTimestamp(int64_t nTimeBlock) +{ + return CheckCoinStakeTimestamp(nTimeBlock, nTimeBlock); +} + +// BlackCoin kernel protocol v3 +// coinstake must meet hash target according to the protocol: +// kernel (input 0) must meet the formula +// hash(nStakeModifier + txPrev.nTime + txPrev.vout.hash + txPrev.vout.n + nTime) < bnTarget * nWeight +// this ensures that the chance of getting a coinstake is proportional to the +// amount of coins one owns. +// The reason this hash is chosen is the following: +// nStakeModifier: scrambles computation to make it very difficult to precompute +// future proof-of-stake +// txPrev.nTime: slightly scrambles computation +// txPrev.vout.hash: hash of txPrev, to reduce the chance of nodes +// generating coinstake at the same time +// txPrev.vout.n: output number of txPrev, to reduce the chance of nodes +// generating coinstake at the same time +// nTime: current timestamp +// block/tx hash should not be used here as they can be generated in vast +// quantities so as to generate blocks faster, degrading the system back into +// a proof-of-work situation. +// +bool CheckStakeKernelHash(const CBlockIndex* pindexPrev, unsigned int nBits, const CCoins* txPrev, const COutPoint& prevout, unsigned int nTimeTx) +{ + // Weight + int64_t nValueIn = txPrev->vout[prevout.n].nValue; + if (nValueIn == 0) + return false; + + // Base target + arith_uint256 bnTarget; + bnTarget.SetCompact(nBits); + + // Calculate hash + CHashWriter ss(SER_GETHASH, 0); + ss << pindexPrev->nStakeModifier << txPrev->nTime << prevout.hash << prevout.n << nTimeTx; + uint256 hashProofOfStake = ss.GetHash(); + + // Now check if proof-of-stake hash meets target protocol + if (UintToArith256(hashProofOfStake) / nValueIn > bnTarget) + return false; + + return true; +} + +bool IsConfirmedInNPrevBlocks(const CDiskTxPos& txindex, const CBlockIndex* pindexFrom, int nMaxDepth, int& nActualDepth) +{ + for (const CBlockIndex* pindex = pindexFrom; pindex && pindexFrom->nHeight - pindex->nHeight < nMaxDepth; pindex = pindex->pprev) + { + if (pindex->nDataPos == txindex.nPos && pindex->nFile == txindex.nFile) + { + nActualDepth = pindexFrom->nHeight - pindex->nHeight; + return true; + } + } + + return false; +} + +// Check kernel hash target and coinstake signature +bool CheckProofOfStake(CBlockIndex* pindexPrev, const CTransaction& tx, unsigned int nBits, CValidationState &state) +{ + if (!tx.IsCoinStake()) + return error("CheckProofOfStake() : called on non-coinstake %s", tx.GetHash().ToString()); + + // Kernel (input 0) must match the stake hash target per coin age (nBits) + const CTxIn& txin = tx.vin[0]; + + // First try finding the previous transaction in database + CTransaction txPrev; + CDiskTxPos txindex; + + if (!ReadFromDisk(txPrev, txindex, *pblocktree, txin.prevout)) + return state.DoS(1, error("CheckProofOfStake() : INFO: read txPrev failed")); // previous transaction not in main chain, may occur during initial download + + // Verify signature + if (!VerifySignature(txPrev, tx, 0, SCRIPT_VERIFY_NONE, 0)) + return state.DoS(100, error("CheckProofOfStake() : VerifySignature failed on coinstake %s", tx.GetHash().ToString())); + + // Read block header + CBlock block; + const CDiskBlockPos& pos = CDiskBlockPos(txindex.nFile, txindex.nPos); + if (!ReadBlockFromDisk(block, pos, Params().GetConsensus())) + return fDebug? error("CheckProofOfStake() : read block failed") : false; // unable to read block of previous transaction + + // Min age requirement + int nDepth; + if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, nStakeMinConfirmations - 1, nDepth)) + return state.DoS(100, error("CheckProofOfStake() : tried to stake at depth %d", nDepth + 1)); + + if (!CheckStakeKernelHash(pindexPrev, nBits, new CCoins(txPrev, pindexPrev->nHeight), txin.prevout, tx.nTime)) + return state.DoS(1, error("CheckProofOfStake() : INFO: check kernel failed on coinstake %s", tx.GetHash().ToString())); // may occur during initial download or if behind on block chain sync + + return true; +} + +bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType) +{ + assert(nIn < txTo.vin.size()); + const CTxIn& txin = txTo.vin[nIn]; + if (txin.prevout.n >= txFrom.vout.size()) + return false; + const CTxOut& txout = txFrom.vout[txin.prevout.n]; + + if (txin.prevout.hash != txFrom.GetHash()) + return false; + + return VerifyScript(txin.scriptSig, txout.scriptPubKey, flags, TransactionSignatureChecker(&txTo, nIn), NULL); +} diff --git a/src/pos.h b/src/pos.h new file mode 100644 index 000000000..eb3532b30 --- /dev/null +++ b/src/pos.h @@ -0,0 +1,37 @@ +// Copyright (c) 2015-2016 The BlackCoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BLACKCOIN_POS_H +#define BLACKCOIN_POS_H + +#include "pos.h" +#include "txdb.h" +#include "main.h" +#include "arith_uint256.h" +#include "consensus/validation.h" +#include "hash.h" +#include "timedata.h" +#include "chainparams.h" +#include "script/sign.h" +#include + +using namespace std; + +/** Compute the hash modifier for proof-of-stake */ +uint256 ComputeStakeModifier(const CBlockIndex* pindexPrev, const uint256& kernel); + +static const int nStakeMinConfirmations = 500; +static const unsigned int nStakeMinAge = 8 * 60 * 60; // 8 hours +// To decrease granularity of timestamp +// Supposed to be 2^n-1 +static const int STAKE_TIMESTAMP_MASK = 15; + +// Check whether the coinstake timestamp meets protocol +bool CheckCoinStakeTimestamp(int64_t nTimeBlock, int64_t nTimeTx); +bool CheckStakeBlockTimestamp(int64_t nTimeBlock); +bool CheckStakeKernelHash(const CBlockIndex* pindexPrev, unsigned int nBits, const CCoins* txPrev, const COutPoint& prevout, unsigned int nTimeTx); +bool IsConfirmedInNPrevBlocks(const CDiskTxPos& txindex, const CBlockIndex* pindexFrom, int nMaxDepth, int& nActualDepth); +bool CheckProofOfStake(CBlockIndex* pindexPrev, const CTransaction& tx, unsigned int nBits, CValidationState &state); +bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType); +#endif // BLACKCOIN_POS_H diff --git a/src/pow.cpp b/src/pow.cpp index 7392defe6..f6484db5b 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -1,5 +1,5 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2015 The Bitcoin Core developers +// Copyright (c) 2009-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. @@ -10,80 +10,69 @@ #include "primitives/block.h" #include "uint256.h" #include "util.h" +#include -unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params) +static arith_uint256 GetTargetLimit(int64_t nTime, bool fProofOfStake, const Consensus::Params& params) { - unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact(); + uint256 nLimit; - // Genesis block - if (pindexLast == NULL) - return nProofOfWorkLimit; - - // Only change once per difficulty adjustment interval - if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0) - { - if (params.fPowAllowMinDifficultyBlocks) - { - // Special difficulty rule for testnet: - // If the new block's timestamp is more than 2* 10 minutes - // then allow mining of a min-difficulty block. - if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2) - return nProofOfWorkLimit; - else - { - // Return the last non-special-min-difficulty-rules-block - const CBlockIndex* pindex = pindexLast; - while (pindex->pprev && pindex->nHeight % params.DifficultyAdjustmentInterval() != 0 && pindex->nBits == nProofOfWorkLimit) - pindex = pindex->pprev; - return pindex->nBits; - } - } - return pindexLast->nBits; + if (fProofOfStake) { + if (params.IsProtocolV2(nTime)) + nLimit = params.posLimitV2; + else + nLimit = params.posLimit; + } else { + nLimit = params.powLimit; } - // Go back by what we want to be 14 days worth of blocks - int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1); - assert(nHeightFirst >= 0); - const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst); - assert(pindexFirst); - - return CalculateNextWorkRequired(pindexLast, pindexFirst->GetBlockTime(), params); + return UintToArith256(nLimit); } -unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params) +unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, bool fProofOfStake, const Consensus::Params& params) { - if (params.fPowNoRetargeting) - return pindexLast->nBits; + unsigned int nTargetLimit = UintToArith256(params.powLimit).GetCompact(); + + // Genesis block + if (pindexLast == NULL) + return nTargetLimit; + + const CBlockIndex* pindexPrev = GetLastBlockIndex(pindexLast, fProofOfStake); + if (pindexPrev->pprev == NULL) + return nTargetLimit; // first block + const CBlockIndex* pindexPrevPrev = GetLastBlockIndex(pindexPrev->pprev, fProofOfStake); + if (pindexPrevPrev->pprev == NULL) + return nTargetLimit; // second block + + return CalculateNextTargetRequired(pindexPrev, pindexPrevPrev->GetBlockTime(), params); +} + +unsigned int CalculateNextTargetRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params) +{ + if (params.fPowNoRetargeting) + return pindexLast->nBits; + + int64_t nActualSpacing = pindexLast->GetBlockTime() - nFirstBlockTime; + int64_t nTargetSpacing = params.IsProtocolV2(pindexLast->GetBlockTime()) ? params.nTargetSpacing : params.nTargetSpacingV1; // Limit adjustment step - int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime; - LogPrintf(" nActualTimespan = %d before bounds\n", nActualTimespan); - if (nActualTimespan < params.nPowTargetTimespan/4) - nActualTimespan = params.nPowTargetTimespan/4; - if (nActualTimespan > params.nPowTargetTimespan*4) - nActualTimespan = params.nPowTargetTimespan*4; + if (pindexLast->GetBlockTime() > params.nProtocolV1RetargetingFixedTime && nActualSpacing < 0) + nActualSpacing = nTargetSpacing; + if (pindexLast->GetBlockTime() > params.nProtocolV3Time && nActualSpacing > nTargetSpacing*10) + nActualSpacing = nTargetSpacing*10; - // Retarget - const arith_uint256 bnPowLimit = UintToArith256(params.powLimit); + // retarget with exponential moving toward target spacing + const arith_uint256 bnTargetLimit = GetTargetLimit(pindexLast->GetBlockTime(), pindexLast->IsProofOfStake(), params); arith_uint256 bnNew; - arith_uint256 bnOld; bnNew.SetCompact(pindexLast->nBits); - bnOld = bnNew; - bnNew *= nActualTimespan; - bnNew /= params.nPowTargetTimespan; + int64_t nInterval = params.nTargetTimespan / nTargetSpacing; + bnNew *= ((nInterval - 1) * nTargetSpacing + nActualSpacing + nActualSpacing); + bnNew /= ((nInterval + 1) * nTargetSpacing); - if (bnNew > bnPowLimit) - bnNew = bnPowLimit; - - /// debug print - LogPrintf("GetNextWorkRequired RETARGET\n"); - LogPrintf("params.nPowTargetTimespan = %d nActualTimespan = %d\n", params.nPowTargetTimespan, nActualTimespan); - LogPrintf("Before: %08x %s\n", pindexLast->nBits, bnOld.ToString()); - LogPrintf("After: %08x %s\n", bnNew.GetCompact(), bnNew.ToString()); + if (bnNew <= 0 || bnNew > bnTargetLimit) + bnNew = bnTargetLimit; return bnNew.GetCompact(); } - bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params& params) { bool fNegative; @@ -94,7 +83,8 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params& // Check range if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit)) - return error("CheckProofOfWork(): nBits below minimum work"); + return error("CheckProofOfWork(): nBits below minimum work"); + // Check proof of work matches claimed amount if (UintToArith256(hash) > bnTarget) @@ -128,7 +118,7 @@ int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& fr r = from.nChainWork - to.nChainWork; sign = -1; } - r = r * arith_uint256(params.nPowTargetSpacing) / GetBlockProof(tip); + r = r * arith_uint256(params.nTargetSpacing) / GetBlockProof(tip); if (r.bits() > 63) { return sign * std::numeric_limits::max(); } diff --git a/src/pow.h b/src/pow.h index 439944092..2b55be2c5 100644 --- a/src/pow.h +++ b/src/pow.h @@ -15,8 +15,8 @@ class CBlockIndex; class uint256; class arith_uint256; -unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params&); -unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params&); +unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, bool fProofOfStake, const Consensus::Params&); +unsigned int CalculateNextTargetRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params&); /** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */ bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&); diff --git a/src/primitives/block.cpp b/src/primitives/block.cpp index 59e949d71..09560a269 100644 --- a/src/primitives/block.cpp +++ b/src/primitives/block.cpp @@ -6,25 +6,36 @@ #include "primitives/block.h" #include "hash.h" +#include "crypto/scrypt.h" #include "tinyformat.h" #include "utilstrencodings.h" #include "crypto/common.h" uint256 CBlockHeader::GetHash() const { - return SerializeHash(*this); + if (nVersion > 6) + return SerializeHash(*this); + return GetPoWHash(); +} + +uint256 CBlockHeader::GetPoWHash() const +{ + uint256 thash; + scrypt_1024_1_1_256(BEGIN(nVersion), BEGIN(thash)); + return thash; } std::string CBlock::ToString() const { std::stringstream s; - s << strprintf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%u)\n", + s << strprintf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%u, vchBlockSig=%s)\n", GetHash().ToString(), nVersion, hashPrevBlock.ToString(), hashMerkleRoot.ToString(), nTime, nBits, nNonce, - vtx.size()); + vtx.size(), + HexStr(vchBlockSig.begin(), vchBlockSig.end())); for (unsigned int i = 0; i < vtx.size(); i++) { s << " " << vtx[i].ToString() << "\n"; diff --git a/src/primitives/block.h b/src/primitives/block.h index 42276b2bc..78996f7c7 100644 --- a/src/primitives/block.h +++ b/src/primitives/block.h @@ -63,6 +63,8 @@ public: uint256 GetHash() const; + uint256 GetPoWHash() const; + int64_t GetBlockTime() const { return (int64_t)nTime; @@ -70,12 +72,16 @@ public: }; + class CBlock : public CBlockHeader { public: // network and disk std::vector vtx; + // network and disk + std::vector vchBlockSig; + // memory only mutable bool fChecked; @@ -96,15 +102,28 @@ public: inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { READWRITE(*(CBlockHeader*)this); READWRITE(vtx); + READWRITE(vchBlockSig); } void SetNull() { CBlockHeader::SetNull(); vtx.clear(); + vchBlockSig.clear(); fChecked = false; } + // two types of block: proof-of-work or proof-of-stake + bool IsProofOfStake() const + { + return (vtx.size() > 1 && vtx[1].IsCoinStake()); + } + + bool IsProofOfWork() const + { + return !IsProofOfStake(); + } + CBlockHeader GetBlockHeader() const { CBlockHeader block; @@ -117,6 +136,8 @@ public: return block; } + + std::string ToString() const; }; diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index 947f2e6a7..a75c5f452 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -56,11 +56,12 @@ uint256 CTxOut::GetHash() const std::string CTxOut::ToString() const { + if (IsEmpty()) return "CTxOut(empty)"; return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)", nValue / COIN, nValue % COIN, HexStr(scriptPubKey).substr(0, 30)); } -CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nLockTime(0) {} -CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) {} +CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nTime(0), nLockTime(0) {} +CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), nTime(tx.nTime), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) {} uint256 CMutableTransaction::GetHash() const { @@ -72,14 +73,15 @@ void CTransaction::UpdateHash() const *const_cast(&hash) = SerializeHash(*this); } -CTransaction::CTransaction() : nVersion(CTransaction::CURRENT_VERSION), vin(), vout(), nLockTime(0) { } +CTransaction::CTransaction() : nVersion(CTransaction::CURRENT_VERSION), nTime(0), vin(), vout(), nLockTime(0) { } -CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) { +CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), nTime(tx.nTime), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) { UpdateHash(); } CTransaction& CTransaction::operator=(const CTransaction &tx) { *const_cast(&nVersion) = tx.nVersion; + *const_cast(&nTime) = tx.nTime; *const_cast*>(&vin) = tx.vin; *const_cast*>(&vout) = tx.vout; *const_cast(&nLockTime) = tx.nLockTime; @@ -128,9 +130,10 @@ unsigned int CTransaction::CalculateModifiedSize(unsigned int nTxSize) const std::string CTransaction::ToString() const { std::string str; - str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n", + str += strprintf("CTransaction(hash=%s, ver=%d, nTime=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n", GetHash().ToString().substr(0,10), nVersion, + nTime, vin.size(), vout.size(), nLockTime); diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 9f7d6f394..9a71ff72e 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -155,6 +155,23 @@ public: return (nValue == -1); } + void SetEmpty() + { + nValue = 0; + scriptPubKey.clear(); + } + + bool IsEmpty() const + { + return (nValue == 0 && scriptPubKey.empty()); + } + + bool IsUnspendable() const + { + return IsEmpty() || + (scriptPubKey.size() > 0 && *scriptPubKey.begin() == OP_RETURN); + } + uint256 GetHash() const; CAmount GetDustThreshold(const CFeeRate &minRelayTxFee) const @@ -167,9 +184,8 @@ public: // need a CTxIn of at least 148 bytes to spend: // so dust is a spendable txout less than // 546*minRelayTxFee/1000 (in satoshis) - if (scriptPubKey.IsUnspendable()) - return 0; - + if (scriptPubKey.IsUnspendable()) + return 0; size_t nSize = GetSerializeSize(SER_DISK,0)+148u; return 3*minRelayTxFee.GetFee(nSize); } @@ -221,6 +237,7 @@ public: // and bypass the constness. This is safe, as they update the entire // structure, including the hash. const int32_t nVersion; + unsigned int nTime; const std::vector vin; const std::vector vout; const uint32_t nLockTime; @@ -239,6 +256,7 @@ public: inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { READWRITE(*const_cast(&this->nVersion)); nVersion = this->nVersion; + READWRITE(*const_cast(&nTime)); READWRITE(*const_cast*>(&vin)); READWRITE(*const_cast*>(&vout)); READWRITE(*const_cast(&nLockTime)); @@ -265,6 +283,12 @@ public: // Compute modified tx size for priority calculation (optionally given tx size) unsigned int CalculateModifiedSize(unsigned int nTxSize=0) const; + bool IsCoinStake() const + { + // the coin stake transaction is marked with the first output empty + return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty()); + } + bool IsCoinBase() const { return (vin.size() == 1 && vin[0].prevout.IsNull()); @@ -287,6 +311,7 @@ public: struct CMutableTransaction { int32_t nVersion; + uint32_t nTime; std::vector vin; std::vector vout; uint32_t nLockTime; @@ -300,6 +325,7 @@ struct CMutableTransaction inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { READWRITE(this->nVersion); nVersion = this->nVersion; + READWRITE(nTime); READWRITE(vin); READWRITE(vout); READWRITE(nLockTime); diff --git a/src/pubkey.cpp b/src/pubkey.cpp index db06a8928..52c442de3 100644 --- a/src/pubkey.cpp +++ b/src/pubkey.cpp @@ -280,6 +280,55 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const { return (!secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, NULL, &sig)); } +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; +} + +const unsigned char vchZero[1] = {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 +}; + +bool CPubKey::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; +} + /* static */ int ECCVerifyHandle::refcount = 0; ECCVerifyHandle::ECCVerifyHandle() diff --git a/src/pubkey.h b/src/pubkey.h index e1a17b658..2c6f4ec3d 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -171,6 +171,11 @@ public: return size() == 33; } + std::vector getvch() const + { + return std::vector(begin(), end()); + } + /** * Verify a DER signature (~72 bytes). * If this public key is not fully valid, the return value will be false. @@ -182,6 +187,8 @@ public: */ static bool CheckLowS(const std::vector& vchSig); + static bool CheckSignatureElement(const unsigned char *vch, int len, bool half); + //! Recover a public key from a compact signature. bool RecoverCompact(const uint256& hash, const std::vector& vchSig); diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp index 680751bb6..96f468228 100644 --- a/src/qt/askpassphrasedialog.cpp +++ b/src/qt/askpassphrasedialog.cpp @@ -14,6 +14,7 @@ #include #include +extern bool fWalletUnlockStakingOnly; AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : QDialog(parent), ui(new Ui::AskPassphraseDialog), @@ -36,6 +37,8 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : ui->passEdit2->installEventFilter(this); ui->passEdit3->installEventFilter(this); + ui->stakingCheckBox->setChecked(fWalletUnlockStakingOnly); + switch(mode) { case Encrypt: // Ask passphrase x2 @@ -45,6 +48,8 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : setWindowTitle(tr("Encrypt wallet")); break; case Unlock: // Ask passphrase + ui->stakingCheckBox->setChecked(false); + ui->stakingCheckBox->show(); ui->warningLabel->setText(tr("This operation needs your wallet passphrase to unlock the wallet.")); ui->passLabel2->hide(); ui->passEdit2->hide(); @@ -74,9 +79,7 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) : AskPassphraseDialog::~AskPassphraseDialog() { // Attempt to overwrite text so that they do not linger around in memory - ui->passEdit1->setText(QString(" ").repeated(ui->passEdit1->text().size())); - ui->passEdit2->setText(QString(" ").repeated(ui->passEdit2->text().size())); - ui->passEdit3->setText(QString(" ").repeated(ui->passEdit3->text().size())); + secureClearPassFields(); delete ui; } @@ -99,6 +102,8 @@ void AskPassphraseDialog::accept() newpass1.assign(ui->passEdit2->text().toStdString().c_str()); newpass2.assign(ui->passEdit3->text().toStdString().c_str()); + secureClearPassFields(); + switch(mode) { case Encrypt: { @@ -156,6 +161,7 @@ void AskPassphraseDialog::accept() } else { + fWalletUnlockStakingOnly = ui->stakingCheckBox->isChecked(); QDialog::accept(); // Success } break; @@ -256,3 +262,17 @@ bool AskPassphraseDialog::eventFilter(QObject *object, QEvent *event) } return QDialog::eventFilter(object, event); } + +static void SecureClearQLineEdit(QLineEdit* edit) +{ + // Attempt to overwrite text so that they do not linger around in memory + edit->setText(QString(" ").repeated(edit->text().size())); + edit->clear(); +} + +void AskPassphraseDialog::secureClearPassFields() +{ + SecureClearQLineEdit(ui->passEdit1); + SecureClearQLineEdit(ui->passEdit2); + SecureClearQLineEdit(ui->passEdit3); +} diff --git a/src/qt/askpassphrasedialog.h b/src/qt/askpassphrasedialog.h index 727b5a1ad..587f1c7bd 100644 --- a/src/qt/askpassphrasedialog.h +++ b/src/qt/askpassphrasedialog.h @@ -24,7 +24,7 @@ public: Encrypt, /**< Ask passphrase twice and encrypt */ Unlock, /**< Ask passphrase and unlock */ ChangePass, /**< Ask old passphrase + new passphrase twice */ - Decrypt /**< Ask passphrase and decrypt wallet */ + Decrypt, /**< Ask passphrase and decrypt wallet */ }; explicit AskPassphraseDialog(Mode mode, QWidget *parent); @@ -42,6 +42,7 @@ private: private Q_SLOTS: void textChanged(); + void secureClearPassFields(); protected: bool event(QEvent *event); diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index c899e9550..7d4ab3e53 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -46,6 +46,8 @@ res/icons/about_qt.png res/icons/verify.png res/icons/warning.png + res/icons/staking_on.png + res/icons/staking_off.png res/movies/spinner-000.png diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 701c96d06..524b79c90 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -71,6 +71,9 @@ const std::string BitcoinGUI::DEFAULT_UIPLATFORM = const QString BitcoinGUI::DEFAULT_WALLET = "~Default"; +extern int64_t nLastCoinStakeSearchInterval; +double GetPoSKernelPS(); + BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *networkStyle, QWidget *parent) : QMainWindow(parent), clientModel(0), @@ -79,6 +82,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n labelEncryptionIcon(0), labelConnectionsIcon(0), labelBlocksIcon(0), + labelStakingIcon(0), progressBarLabel(0), progressBar(0), progressDialog(0), @@ -100,6 +104,8 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n encryptWalletAction(0), backupWalletAction(0), changePassphraseAction(0), + unlockWalletAction(0), + lockWalletAction(0), aboutQtAction(0), openRPCConsoleAction(0), openAction(0), @@ -193,6 +199,15 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n labelEncryptionIcon = new QLabel(); labelConnectionsIcon = new QLabel(); labelBlocksIcon = new QLabel(); + labelStakingIcon = new QLabel(); +// if (GetBoolArg("-staking", true)) +// { + QTimer *timerStakingIcon = new QTimer(labelStakingIcon); + connect(timerStakingIcon, SIGNAL(timeout()), this, SLOT(updateStakingIcon())); + timerStakingIcon->start(30 * 1000); + updateStakingIcon(); +// } + if(enableWallet) { frameBlocksLayout->addStretch(); @@ -201,11 +216,14 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *platformStyle, const NetworkStyle *n frameBlocksLayout->addWidget(labelEncryptionIcon); } frameBlocksLayout->addStretch(); + frameBlocksLayout->addWidget(labelStakingIcon); + frameBlocksLayout->addStretch(); frameBlocksLayout->addWidget(labelConnectionsIcon); frameBlocksLayout->addStretch(); frameBlocksLayout->addWidget(labelBlocksIcon); frameBlocksLayout->addStretch(); + // Progress bar and label for blocks download progressBarLabel = new QLabel(); progressBarLabel->setVisible(false); @@ -332,6 +350,10 @@ void BitcoinGUI::createActions() backupWalletAction->setStatusTip(tr("Backup wallet to another location")); changePassphraseAction = new QAction(platformStyle->TextColorIcon(":/icons/key"), tr("&Change Passphrase..."), this); changePassphraseAction->setStatusTip(tr("Change the passphrase used for wallet encryption")); + unlockWalletAction = new QAction(platformStyle->TextColorIcon(":/icons/lock_open"), tr("&Unlock Wallet..."), this); + unlockWalletAction->setStatusTip(tr("Unlock wallet with passphrase used for wallet encryption")); + lockWalletAction = new QAction(platformStyle->TextColorIcon(":/icons/lock_closed"), tr("&Lock Wallet"), this); + lockWalletAction->setToolTip(tr("Lock wallet")); signMessageAction = new QAction(platformStyle->TextColorIcon(":/icons/edit"), tr("Sign &message..."), this); signMessageAction->setStatusTip(tr("Sign messages with your Bitcoin addresses to prove you own them")); verifyMessageAction = new QAction(platformStyle->TextColorIcon(":/icons/verify"), tr("&Verify message..."), this); @@ -368,6 +390,8 @@ void BitcoinGUI::createActions() connect(encryptWalletAction, SIGNAL(triggered(bool)), walletFrame, SLOT(encryptWallet(bool))); connect(backupWalletAction, SIGNAL(triggered()), walletFrame, SLOT(backupWallet())); connect(changePassphraseAction, SIGNAL(triggered()), walletFrame, SLOT(changePassphrase())); + connect(unlockWalletAction, SIGNAL(triggered()), walletFrame, SLOT(unlockWallet())); + connect(lockWalletAction, SIGNAL(triggered()), walletFrame, SLOT(lockWallet())); connect(signMessageAction, SIGNAL(triggered()), this, SLOT(gotoSignMessageTab())); connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(gotoVerifyMessageTab())); connect(usedSendingAddressesAction, SIGNAL(triggered()), walletFrame, SLOT(usedSendingAddresses())); @@ -410,6 +434,8 @@ void BitcoinGUI::createMenuBar() { settings->addAction(encryptWalletAction); settings->addAction(changePassphraseAction); + settings->addAction(unlockWalletAction); + settings->addAction(lockWalletAction); settings->addSeparator(); } settings->addAction(optionsAction); @@ -517,6 +543,7 @@ void BitcoinGUI::setWalletActionsEnabled(bool enabled) encryptWalletAction->setEnabled(enabled); backupWalletAction->setEnabled(enabled); changePassphraseAction->setEnabled(enabled); + unlockWalletAction->setEnabled(enabled); signMessageAction->setEnabled(enabled); verifyMessageAction->setEnabled(enabled); usedSendingAddressesAction->setEnabled(enabled); @@ -956,6 +983,8 @@ void BitcoinGUI::setEncryptionStatus(int status) encryptWalletAction->setChecked(false); changePassphraseAction->setEnabled(false); encryptWalletAction->setEnabled(true); + unlockWalletAction->setVisible(false); + lockWalletAction->setVisible(false); break; case WalletModel::Unlocked: labelEncryptionIcon->show(); @@ -964,6 +993,8 @@ void BitcoinGUI::setEncryptionStatus(int status) encryptWalletAction->setChecked(true); changePassphraseAction->setEnabled(true); encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + unlockWalletAction->setVisible(false); + lockWalletAction->setVisible(true); break; case WalletModel::Locked: labelEncryptionIcon->show(); @@ -972,6 +1003,8 @@ void BitcoinGUI::setEncryptionStatus(int status) encryptWalletAction->setChecked(true); changePassphraseAction->setEnabled(true); encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + unlockWalletAction->setVisible(true); + lockWalletAction->setVisible(false); break; } } @@ -1007,6 +1040,54 @@ void BitcoinGUI::toggleHidden() showNormalIfMinimized(true); } +void BitcoinGUI::updateStakingIcon() +{ + if (walletFrame) + nWeight = walletFrame->updateWeight(); + + if (nLastCoinStakeSearchInterval && nWeight) + { + uint64_t nWeight = this->nWeight; + uint64_t nNetworkWeight = 1.1429 * GetPoSKernelPS(); + unsigned nEstimateTime = 1.0455 * 64 * nNetworkWeight / nWeight; + + QString text; + if (nEstimateTime < 60) + { + text = tr("%n second(s)", "", nEstimateTime); + } + else if (nEstimateTime < 60*60) + { + text = tr("%n minute(s)", "", nEstimateTime/60); + } + else if (nEstimateTime < 24*60*60) + { + text = tr("%n hour(s)", "", nEstimateTime/(60*60)); + } + else + { + text = tr("%n day(s)", "", nEstimateTime/(60*60*24)); + } + + nWeight /= COIN; + nNetworkWeight /= COIN; + labelStakingIcon->setPixmap(platformStyle->SingleColorIcon(":/icons/staking_on").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + labelStakingIcon->setToolTip(tr("Staking.
Your weight is %1
Network weight is %2
Expected time to earn reward is %3").arg(nWeight).arg(nNetworkWeight).arg(text)); + } + else + { + labelStakingIcon->setPixmap(platformStyle->SingleColorIcon(":/icons/staking_off").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + if (vNodes.empty()) + labelStakingIcon->setToolTip(tr("Not staking because wallet is offline")); + else if (IsInitialBlockDownload()) + labelStakingIcon->setToolTip(tr("Not staking because wallet is syncing")); + else if (!nWeight) + labelStakingIcon->setToolTip(tr("Not staking because you don't have mature coins")); + else + labelStakingIcon->setToolTip(tr("Not staking")); + } +} + void BitcoinGUI::detectShutdown() { if (ShutdownRequested()) diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 871ca1ba3..65e7638b1 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -85,6 +85,7 @@ private: QLabel *labelConnectionsIcon; QLabel *labelBlocksIcon; QLabel *progressBarLabel; + QLabel *labelStakingIcon; QProgressBar *progressBar; QProgressDialog *progressDialog; @@ -106,6 +107,8 @@ private: QAction *encryptWalletAction; QAction *backupWalletAction; QAction *changePassphraseAction; + QAction *unlockWalletAction; + QAction *lockWalletAction; QAction *aboutQtAction; QAction *openRPCConsoleAction; QAction *openAction; @@ -121,6 +124,8 @@ private: int prevBlocks; int spinnerFrame; + uint64_t nWeight; + const PlatformStyle *platformStyle; /** Create the main UI actions. */ @@ -213,6 +218,8 @@ private Q_SLOTS: /** Simply calls showNormalIfMinimized(true) for use in SLOT() macro */ void toggleHidden(); + void updateStakingIcon(); + /** called by a timer to check if fRequestShutdown has been set **/ void detectShutdown(); diff --git a/src/qt/bitcoinunits.cpp b/src/qt/bitcoinunits.cpp index 649005789..56146e112 100644 --- a/src/qt/bitcoinunits.cpp +++ b/src/qt/bitcoinunits.cpp @@ -40,9 +40,9 @@ QString BitcoinUnits::name(int unit) { switch(unit) { - case BTC: return QString("BTC"); - case mBTC: return QString("mBTC"); - case uBTC: return QString::fromUtf8("μBTC"); + case BTC: return QString("BLK"); + case mBTC: return QString("mBLK"); + case uBTC: return QString::fromUtf8("μBLK"); default: return QString("???"); } } @@ -51,9 +51,9 @@ QString BitcoinUnits::description(int unit) { switch(unit) { - case BTC: return QString("Bitcoins"); - case mBTC: return QString("Milli-Bitcoins (1 / 1" THIN_SP_UTF8 "000)"); - case uBTC: return QString("Micro-Bitcoins (1 / 1" THIN_SP_UTF8 "000" THIN_SP_UTF8 "000)"); + case BTC: return QString("Blackcoins"); + case mBTC: return QString("Milli-Blackcoins (1 / 1" THIN_SP_UTF8 "000)"); + case uBTC: return QString("Micro-Blackcoins (1 / 1" THIN_SP_UTF8 "000" THIN_SP_UTF8 "000)"); default: return QString("???"); } } diff --git a/src/qt/forms/askpassphrasedialog.ui b/src/qt/forms/askpassphrasedialog.ui index a2105ecd0..28b00f944 100644 --- a/src/qt/forms/askpassphrasedialog.ui +++ b/src/qt/forms/askpassphrasedialog.ui @@ -108,6 +108,19 @@ + + + + Serves to disable the trivial sendmoney when OS account compromised. Provides no real security. + + + * Tick for staking only + + + false + + + diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui index 8911b41cb..94ad9db60 100644 --- a/src/qt/forms/sendcoinsdialog.ui +++ b/src/qt/forms/sendcoinsdialog.ui @@ -764,13 +764,6 @@ - - - - Choose... - - - diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index ee2744f12..d02dad676 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -115,7 +115,7 @@ void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent) #if QT_VERSION >= 0x040700 // We don't want translators to use own addresses in translations // and this is the only place, where this address is supplied. - widget->setPlaceholderText(QObject::tr("Enter a Bitcoin address (e.g. %1)").arg("1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L")); + widget->setPlaceholderText(QObject::tr("Enter a Bitcoin address (e.g. %1)").arg("B8gZqgY4r2RoEdqYk3QsAqFckyf9pRHN6i")); #endif widget->setValidator(new BitcoinAddressEntryValidator(parent)); widget->setCheckValidator(new BitcoinAddressCheckValidator(parent)); @@ -207,7 +207,7 @@ bool parseBitcoinURI(QString uri, SendCoinsRecipient *out) QString formatBitcoinURI(const SendCoinsRecipient &info) { - QString ret = QString("bitcoin:%1").arg(info.address); + QString ret = QString("blackcoin:%1").arg(info.address); int paramCount = 0; if (info.amount) diff --git a/src/qt/intro.cpp b/src/qt/intro.cpp index f324c6dc5..690061f08 100644 --- a/src/qt/intro.cpp +++ b/src/qt/intro.cpp @@ -19,7 +19,7 @@ static const uint64_t GB_BYTES = 1000000000LL; /* Minimum free space (in GB) needed for data directory */ -static const uint64_t BLOCK_CHAIN_SIZE = 80; +static const uint64_t BLOCK_CHAIN_SIZE = 4; /* Minimum free space (in GB) needed for data directory when pruned; Does not include prune target */ static const uint64_t CHAIN_STATE_SIZE = 2; /* Total required space (in GB) depending on user choice (prune, not prune) */ diff --git a/src/qt/locale/bitcoin_af.ts b/src/qt/locale/bitcoin_af.ts index 492c7bccd..031cdebdf 100644 --- a/src/qt/locale/bitcoin_af.ts +++ b/src/qt/locale/bitcoin_af.ts @@ -59,11 +59,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Hierdie is die adresse vanwaar u Bitcoin betalings stuur. U moet altyd die bedrag en die adres van die ontvanger nagaan voordat u enige munte stuur. + Hierdie is die adresse vanwaar u Blackcoin betalings stuur. U moet altyd die bedrag en die adres van die ontvanger nagaan voordat u enige munte stuur. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Hierdie is die adresse waar u Bitcoins sal ontvang. Ons beveel aan dat u 'n nuwe adres kies vir elke transaksie + Hierdie is die adresse waar u Blackcoins sal ontvang. Ons beveel aan dat u 'n nuwe adres kies vir elke transaksie &Edit @@ -153,7 +153,7 @@ Bitcoin Core 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. - Bitcoin Kern gaan nou toemaak om die kodifikasie af te handel. Onthou dat die kodifikasie van u beursie nie altyd u munte kan beskerm teen diefstal deur kwaadwillige sagteware op u rekenaar nie. + Blackcoin Kern gaan nou toemaak om die kodifikasie af te handel. Onthou dat die kodifikasie van u beursie nie altyd u munte kan beskerm teen diefstal deur kwaadwillige sagteware op u rekenaar nie. 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. @@ -259,7 +259,7 @@ Bitcoin Core client - Bitcoin Kern klient + Blackcoin Lern klient Importing blocks from disk... @@ -271,7 +271,7 @@ Send coins to a Bitcoin address - Stuur munte na 'n Bitcoin adres + Stuur munte na 'n Blackcoin adres Backup wallet to another location @@ -283,7 +283,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -299,7 +299,7 @@ Show information about Bitcoin Core - Vertoon inligting oor Bitcoin Kern + Vertoon inligting oor Blackcoin Kern Show or hide the main Window @@ -311,11 +311,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Onderteken boodskappe met u Bitcoin adresse om u eienaarskap te bewys + Onderteken boodskappe met u Blackcoin adresse om u eienaarskap te bewys Verify messages to ensure they were signed with specified Bitcoin addresses - Verifieër boodskappe om seker te maak dat dit met die gespesifiseerde Bitcoin adresse + Verifieër boodskappe om seker te maak dat dit met die gespesifiseerde Blackcoin adresse &Help @@ -323,19 +323,19 @@ Bitcoin Core - Bitcoin Kern + Blackcoin Kern Request payments (generates QR codes and bitcoin: URIs) - Versoek betalings (genereer QR-kodes en bitcoin: URI's) + Versoek betalings (genereer QR-kodes en blackcoin: URI's) &About Bitcoin Core - &Omtrent Bitcoin Kern + &Omtrent Blackcoin Kern Modify configuration options for Bitcoin Core - Verander konfigurasie-opsies vir Bitcoin Kern + Verander konfigurasie-opsies vir Blackcoin Kern Show the list of used sending addresses and labels @@ -347,7 +347,7 @@ Open a bitcoin: URI or payment request - Skep 'n bitcoin: URI of betalingsversoek + Skep 'n blackcoin: URI of betalingsversoek @@ -370,7 +370,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin Kern + Blackcoin Kern Reset all settings changes made over the GUI @@ -381,7 +381,7 @@ Intro Bitcoin Core - Bitcoin Kern + Blackcoin Kern @@ -445,7 +445,7 @@ SplashScreen Bitcoin Core - Bitcoin Kern + Blackcoin Kern diff --git a/src/qt/locale/bitcoin_af_ZA.ts b/src/qt/locale/bitcoin_af_ZA.ts index 12ac21eb8..a99a1b779 100644 --- a/src/qt/locale/bitcoin_af_ZA.ts +++ b/src/qt/locale/bitcoin_af_ZA.ts @@ -155,7 +155,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet diff --git a/src/qt/locale/bitcoin_bs.ts b/src/qt/locale/bitcoin_bs.ts index a18684220..be03782e5 100644 --- a/src/qt/locale/bitcoin_bs.ts +++ b/src/qt/locale/bitcoin_bs.ts @@ -15,11 +15,11 @@ BitcoinGUI Bitcoin - Bitcoin + Blackcoin Bitcoin Core - Bitcoin Jezrga + Blackcoin Jezrga @@ -38,14 +38,14 @@ HelpMessageDialog Bitcoin Core - Bitcoin Jezrga + Blackcoin Jezrga Intro Bitcoin Core - Bitcoin Jezrga + Blackcoin Jezrga @@ -113,7 +113,7 @@ SplashScreen Bitcoin Core - Bitcoin Jezrga + Blackcoin Jezrga diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts index 025670afb..467d3404e 100644 --- a/src/qt/locale/bitcoin_ca.ts +++ b/src/qt/locale/bitcoin_ca.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Aquestes són les vostres adreces de Bitcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes. + Aquestes són les vostres adreces de Blackcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Aquestes són les vostres adreces Bitcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció. + Aquestes són les vostres adreces Blackcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Ara es tancarà el Bitcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres bitcoins no puguin ser robades per programari maliciós que infecti l'ordinador. + Ara es tancarà el Blackcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres blackcoins no puguin ser robades per programari maliciós que infecti l'ordinador. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - Client del Bitcoin Core + Client del Blackcoin Core Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Envia monedes a una adreça Bitcoin + Envia monedes a una adreça Blackcoin Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Mostra informació del Bitcoin Core + Mostra informació del Blackcoin Core &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Signa el missatges amb la seva adreça de Bitcoin per provar que les poseeixes + Signa el missatges amb la seva adreça de Blackcoin per provar que les poseeixes Verify messages to ensure they were signed with specified Bitcoin addresses - Verifiqueu els missatges per assegurar-vos que han estat signats amb una adreça Bitcoin específica. + Verifiqueu els missatges per assegurar-vos que han estat signats amb una adreça Blackcoin específica. &File @@ -399,19 +399,19 @@ Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin Request payments (generates QR codes and bitcoin: URIs) - Sol·licita pagaments (genera codis QR i bitcoin: URI) + Sol·licita pagaments (genera codis QR i blackcoin: URI) &About Bitcoin Core - &Quant al Bitcoin Core + &Quant al Blackcoin Core Modify configuration options for Bitcoin Core - Modifica les opcions de configuració del Bitcoin Core + Modifica les opcions de configuració del Blackcoin Core Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Obre una bitcoin: sol·licitud d'URI o pagament + Obre una blackcoin: sol·licitud d'URI o pagament &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Mostra el missatge d'ajuda del Bitcoin Core per obtenir una llista amb les possibles opcions de línia d'ordres de Bitcoin + Mostra el missatge d'ajuda del Blackcoin Core per obtenir una llista amb les possibles opcions de línia d'ordres de Bitcoin %n active connection(s) to Bitcoin network - %n connexió activa a la xarxa Bitcoin%n connexions actives a la xarxa Bitcoin + %n connexió activa a la xarxa Blackcoin%n connexions actives a la xarxa Blackcoin No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - L'adreça introduïda «%1» no és una adreça de Bitcoin vàlida. + L'adreça introduïda «%1» no és una adreça de Blackcoin vàlida. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin version @@ -868,7 +868,7 @@ About Bitcoin Core - Quant al Bitcoin Core + Quant al Blackcoin Core Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Us donem la benvinguda al Bitcoin Core. + Us donem la benvinguda al Blackcoin Core. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Bitcoin Core les dades. + Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Blackcoin Core les dades. - 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. - El Bitcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Bitcoin. Com a mínim s'emmagatzemaran %1 GB de dades en aquest directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder. + Bitcoin Core will download and store a copy of the Blackcoin 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. + El Blackcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Blackcoin. Com a mínim s'emmagatzemaran %1 GB de dades en aquest directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - La interfície d'usuari pot definir-se des d'aquí. El paràmetre tindrà efecte després de reiniciar el Bitcoin Core. + La interfície d'usuari pot definir-se des d'aquí. El paràmetre tindrà efecte després de reiniciar el Blackcoin Core. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Inicia el Bitcoin Core automàticament després d'iniciar una sessió en el sistema. + Inicia el Blackcoin Core automàticament després d'iniciar una sessió en el sistema. &Start Bitcoin Core on system login - &Inicia el Bitcoin Core en inciar el sistema + &Inicia el Blackcoin Core en inciar el sistema (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Obre el port del client de Bitcoin al router de forma automàtica. Això només funciona quan el router implementa UPnP i l'opció està activada. + Obre el port del client de Blackcoin al router de forma automàtica. Això només funciona quan el router implementa UPnP i l'opció està activada. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Connecta a la xarxa Bitcoin a través d'un proxy SOCKS5. + Connecta a la xarxa Blackcoin a través d'un proxy SOCKS5. &Connect through SOCKS5 proxy (default proxy): @@ -1129,7 +1129,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - Conectar a la red de Bitcoin a través de un proxy SOCKS5 per als serveis ocults de Tor + Conectar a la red de Blackcoin a través de un proxy SOCKS5 per als serveis ocults de Tor Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1216,7 +1216,7 @@ 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. - 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. + La informació mostrada pot no estar al día. El teu moneder es sincronitza automàticament amb la xarxa Blackcoin un cop s'ha establert connexió, però aquest proces no s'ha completat encara. Watch-only: @@ -1315,7 +1315,7 @@ Cannot start bitcoin: click-to-pay handler - No es pot iniciar bitcoin: gestor clica-per-pagar + No es pot iniciar blackcoin: gestor clica-per-pagar Payment request fetch URL is invalid: %1 @@ -1323,7 +1323,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - 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. + L'URI no pot ser analitzat! Això pot ser a causa d'una adreça de Blackcoin no vàlida o per paràmetres URI amb mal format. Payment request file handling @@ -1397,7 +1397,7 @@ Enter a Bitcoin address (e.g. %1) - Introduïu una adreça de Bitcoin (p. ex. %1) + Introduïu una adreça de Blackcoin (p. ex. %1) %1 d @@ -1511,7 +1511,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Obre el fitxer de registre de depuració del Bitcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans. + Obre el fitxer de registre de depuració del Blackcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans. Received @@ -1671,7 +1671,7 @@ Welcome to the Bitcoin Core RPC console. - Us donem la benviguda a la consola RPC del Bitcoin Core. + Us donem la benviguda a la consola RPC del Blackcoin Core. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1754,7 +1754,7 @@ 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. - Un missatge opcional que s'adjuntarà a la sol·licitud de pagament, que es mostrarà quan s'obri la sol·licitud. Nota: El missatge no s'enviarà amb el pagament per la xarxa Bitcoin. + Un missatge opcional que s'adjuntarà a la sol·licitud de pagament, que es mostrarà quan s'obri la sol·licitud. Nota: El missatge no s'enviarà amb el pagament per la xarxa Blackcoin. An optional label to associate with the new receiving address. @@ -1987,7 +1987,7 @@ 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. - No hi ha cap problema en pagar només la comissió mínima sempre que hi hagi menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirmi una vegada hi hagi més demanda de transaccions de bitcoins que la xarxa pugui processar. + No hi ha cap problema en pagar només la comissió mínima sempre que hi hagi menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirmi una vegada hi hagi més demanda de transaccions de blackcoins que la xarxa pugui processar. (read the tooltip) @@ -2147,7 +2147,7 @@ Warning: Invalid Bitcoin address - Avís: adreça Bitcoin no vàlida + Avís: adreça Blackcoin no vàlida (no label) @@ -2198,7 +2198,7 @@ The Bitcoin address to send the payment to - L'adreça Bitcoin on enviar el pagament + L'adreça Blackcoin on enviar el pagament Alt+A @@ -2218,7 +2218,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - La comissió es deduirà de l'import que s'enviarà. El destinatari rebrà menys bitcoins que les que introduïu al camp d'import. Si se seleccionen múltiples destinataris, la comissió es dividirà per igual. + La comissió es deduirà de l'import que s'enviarà. El destinatari rebrà menys blackcoins que les que introduïu al camp d'import. Si se seleccionen múltiples destinataris, la comissió es dividirà per igual. S&ubtract fee from amount @@ -2242,7 +2242,7 @@ 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. - Un missatge que s'ha adjuntat al bitcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Bitcoin. + Un missatge que s'ha adjuntat al blackcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Blackcoin. Pay To: @@ -2276,7 +2276,7 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Podeu signar missatges/acords amb les vostres adreces per provar que rebeu les bitcoins que s'hi envien. Aneu amb compte no signar res que sigui vague o aleatori, perquè en alguns atacs de suplantació es pot provar que hi signeu la vostra identitat. Només signeu aquelles declaracions completament detallades en què hi esteu d'acord. + Podeu signar missatges/acords amb les vostres adreces per provar que rebeu les blackcoins que s'hi envien. Aneu amb compte no signar res que sigui vague o aleatori, perquè en alguns atacs de suplantació es pot provar que hi signeu la vostra identitat. Només signeu aquelles declaracions completament detallades en què hi esteu d'acord. The Bitcoin address to sign the message with @@ -3205,7 +3205,7 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i Els desenvolupadors del Bitcoin Core + Copyright (C) 2014-%i Els desenvolupadors del Bitcoin Core Error loading wallet.dat: Wallet requires newer version of Bitcoin Core diff --git a/src/qt/locale/bitcoin_ca@valencia.ts b/src/qt/locale/bitcoin_ca@valencia.ts index 2c41ec78d..381b7e1d0 100644 --- a/src/qt/locale/bitcoin_ca@valencia.ts +++ b/src/qt/locale/bitcoin_ca@valencia.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Estes són les vostres adreces de Bitcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes. + Estes són les vostres adreces de Blackcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Estes són les vostres adreces Bitcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció. + Estes són les vostres adreces Blackcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Ara es tancarà el Bitcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres bitcoins no puguen ser robades per programari maliciós que infecti l'ordinador. + Ara es tancarà el Blackcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres blackcoins no puguen ser robades per programari maliciós que infecti l'ordinador. 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. @@ -299,7 +299,7 @@ Bitcoin Core client - Client del Bitcoin Core + Client del Blackcoin Core Importing blocks from disk... @@ -311,7 +311,7 @@ Send coins to a Bitcoin address - Envia monedes a una adreça Bitcoin + Envia monedes a una adreça Blackcoin Backup wallet to another location @@ -335,7 +335,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -351,7 +351,7 @@ Show information about Bitcoin Core - Mostra informació del Bitcoin Core + Mostra informació del Blackcoin Core &Show / Hide @@ -367,11 +367,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Signa el missatges amb la seua adreça de Bitcoin per provar que les poseeixes + Signa el missatges amb la seua adreça de Blackcoin per provar que les poseeixes Verify messages to ensure they were signed with specified Bitcoin addresses - Verifiqueu els missatges per assegurar-vos que han estat signats amb una adreça Bitcoin específica. + Verifiqueu els missatges per assegurar-vos que han estat signats amb una adreça Blackcoin específica. &File @@ -391,19 +391,19 @@ Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin Request payments (generates QR codes and bitcoin: URIs) - Sol·licita pagaments (genera codis QR i bitcoin: URI) + Sol·licita pagaments (genera codis QR i blackcoin: URI) &About Bitcoin Core - &Quant al Bitcoin Core + &Quant al Blackcoin Core Modify configuration options for Bitcoin Core - Modifica les opcions de configuració del Bitcoin Core + Modifica les opcions de configuració del Blackcoin Core Show the list of used sending addresses and labels @@ -415,7 +415,7 @@ Open a bitcoin: URI or payment request - Obri una bitcoin: sol·licitud d'URI o pagament + Obri una blackcoin: sol·licitud d'URI o pagament &Command-line options @@ -423,11 +423,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Mostra el missatge d'ajuda del Bitcoin Core per obtindre una llista amb les possibles opcions de línia d'ordes de Bitcoin + Mostra el missatge d'ajuda del Blackcoin Core per obtindre una llista amb les possibles opcions de línia d'ordes de Blackcoin %n active connection(s) to Bitcoin network - %n connexió activa a la xarxa Bitcoin%n connexions actives a la xarxa Bitcoin + %n connexió activa a la xarxa Blackcoin%n connexions actives a la xarxa Blackcoin No block source available... @@ -810,7 +810,7 @@ The entered address "%1" is not a valid Bitcoin address. - L'adreça introduïda «%1» no és una adreça de Bitcoin vàlida. + L'adreça introduïda «%1» no és una adreça de Blackcoin vàlida. Could not unlock wallet. @@ -848,7 +848,7 @@ HelpMessageDialog Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin version @@ -860,7 +860,7 @@ About Bitcoin Core - Quant al Bitcoin Core + Quant al Blackcoin Core Command-line options @@ -883,15 +883,15 @@ Welcome to Bitcoin Core. - Vos donem la benvinguda al Bitcoin Core. + Vos donem la benvinguda al Blackcoin Core. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Bitcoin Core les dades. + Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Blackcoin Core les dades. 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. - El Bitcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Bitcoin. Com a mínim s'emmagatzemaran %1 GB de dades en este directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder. + El Blackcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Blackcoin. Com a mínim s'emmagatzemaran %1 GB de dades en este directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder. Use the default data directory @@ -903,7 +903,7 @@ Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin Error: Specified data directory "%1" cannot be created. @@ -985,7 +985,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - La interfície d'usuari pot definir-se des d'ací. El paràmetre tindrà efecte després de reiniciar el Bitcoin Core. + La interfície d'usuari pot definir-se des d'ací. El paràmetre tindrà efecte després de reiniciar el Blackcoin Core. 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 |. @@ -1013,11 +1013,11 @@ Automatically start Bitcoin Core after logging in to the system. - Inicia el Bitcoin Core automàticament després d'iniciar una sessió en el sistema. + Inicia el Blackcoin Core automàticament després d'iniciar una sessió en el sistema. &Start Bitcoin Core on system login - &Inicia el Bitcoin Core en inciar el sistema + &Inicia el Blackcoin Core en inciar el sistema (0 = auto, <0 = leave that many cores free) @@ -1045,7 +1045,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Obri el port del client de Bitcoin al router de forma automàtica. Això només funciona quan el router implementa UPnP i l'opció està activada. + Obri el port del client de Blackcoin al router de forma automàtica. Això només funciona quan el router implementa UPnP i l'opció està activada. Map port using &UPnP @@ -1053,7 +1053,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Connecta a la xarxa Bitcoin a través d'un proxy SOCKS5. + Connecta a la xarxa Blackcoin a través d'un proxy SOCKS5. &Connect through SOCKS5 proxy (default proxy): @@ -1156,7 +1156,7 @@ 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. - 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. + La informació mostrada pot no estar al día. El teu moneder es sincronitza automàticament amb la xarxa Blackcoin un cop s'ha establit connexió, però este proces no s'ha completat encara. Watch-only: @@ -1255,7 +1255,7 @@ Cannot start bitcoin: click-to-pay handler - No es pot iniciar bitcoin: gestor clica-per-pagar + No es pot iniciar blackcoin: gestor clica-per-pagar Payment request fetch URL is invalid: %1 @@ -1263,7 +1263,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - 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. + L'URI no pot ser analitzat! Això pot ser a causa d'una adreça de Blackcoin no vàlida o per paràmetres URI amb mal format. Payment request file handling @@ -1337,7 +1337,7 @@ Enter a Bitcoin address (e.g. %1) - Introduïu una adreça de Bitcoin (p. ex. %1) + Introduïu una adreça de Blackcoin (p. ex. %1) %1 d @@ -1447,7 +1447,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Obri el fitxer de registre de depuració del Bitcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans. + Obri el fitxer de registre de depuració del Blackcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans. Received @@ -1551,7 +1551,7 @@ Welcome to the Bitcoin Core RPC console. - Vos donem la benviguda a la consola RPC del Bitcoin Core. + Vos donem la benviguda a la consola RPC del Blackcoin Core. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1630,7 +1630,7 @@ 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. - Un missatge opcional que s'adjuntarà a la sol·licitud de pagament, que es mostrarà quan s'òbriga la sol·licitud. Nota: El missatge no s'enviarà amb el pagament per la xarxa Bitcoin. + Un missatge opcional que s'adjuntarà a la sol·licitud de pagament, que es mostrarà quan s'òbriga la sol·licitud. Nota: El missatge no s'enviarà amb el pagament per la xarxa Blackcoin. An optional label to associate with the new receiving address. @@ -1863,7 +1863,7 @@ 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. - No hi ha cap problema en pagar només la comissió mínima sempre que hi haja menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirme una vegada hi haja més demanda de transaccions de bitcoins que la xarxa puga processar. + No hi ha cap problema en pagar només la comissió mínima sempre que hi haja menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirme una vegada hi haja més demanda de transaccions de blackcoins que la xarxa puga processar. (read the tooltip) @@ -2015,7 +2015,7 @@ Warning: Invalid Bitcoin address - Avís: adreça Bitcoin no vàlida + Avís: adreça Blackcoin no vàlida (no label) @@ -2066,7 +2066,7 @@ The Bitcoin address to send the payment to - L'adreça Bitcoin on enviar el pagament + L'adreça Blackcoin on enviar el pagament Alt+A @@ -2086,7 +2086,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - La comissió es deduirà de l'import que s'enviarà. El destinatari rebrà menys bitcoins que les que introduïu al camp d'import. Si se seleccionen múltiples destinataris, la comissió es dividirà per igual. + La comissió es deduirà de l'import que s'enviarà. El destinatari rebrà menys blackcoins que les que introduïu al camp d'import. Si se seleccionen múltiples destinataris, la comissió es dividirà per igual. S&ubtract fee from amount @@ -2110,7 +2110,7 @@ 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. - Un missatge que s'ha adjuntat al bitcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Bitcoin. + Un missatge que s'ha adjuntat al blackcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Blackcoin. Pay To: @@ -2125,7 +2125,7 @@ ShutdownWindow Bitcoin Core is shutting down... - S'està parant el Bitcoin Core... + S'està parant el Blackcoin Core... Do not shut down the computer until this window disappears. @@ -2144,11 +2144,11 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Podeu signar missatges/acords amb les vostres adreces per provar que rebeu les bitcoins que s'hi envien. Aneu amb compte no signar res que siga vague o aleatori, perquè en alguns atacs de suplantació es pot provar que hi signeu la vostra identitat. Només signeu aquelles declaracions completament detallades en què hi esteu d'acord. + Podeu signar missatges/acords amb les vostres adreces per provar que rebeu les blackcoins que s'hi envien. Aneu amb compte no signar res que siga vague o aleatori, perquè en alguns atacs de suplantació es pot provar que hi signeu la vostra identitat. Només signeu aquelles declaracions completament detallades en què hi esteu d'acord. The Bitcoin address to sign the message with - L'adreça Bitcoin amb què signar el missatge + L'adreça Blackcoin amb què signar el missatge Choose previously used address @@ -2180,7 +2180,7 @@ Sign the message to prove you own this Bitcoin address - Signa el missatge per provar que ets propietari d'esta adreça Bitcoin + Signa el missatge per provar que ets propietari d'esta adreça Blackcoin Sign &Message @@ -2204,11 +2204,11 @@ The Bitcoin address the message was signed with - L'adreça Bitcoin amb què va ser signat el missatge + L'adreça Blackcoin amb què va ser signat el missatge Verify the message to ensure it was signed with the specified Bitcoin address - Verificar el missatge per assegurar-se que ha estat signat amb una adreça Bitcoin específica + Verificar el missatge per assegurar-se que ha estat signat amb una adreça Blackcoin específica Verify &Message @@ -2275,11 +2275,11 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Core The Bitcoin Core developers - Els desenvolupadors del Bitcoin Core + Els desenvolupadors del Blackcoin Core [testnet] @@ -2817,7 +2817,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - No es pot enllaçar %s a este ordinador. El Bitcoin Core probablement ja estiga executant-s'hi. + No es pot enllaçar %s a este ordinador. El Blackcoin Core probablement ja estiga executant-s'hi. WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected) @@ -2981,7 +2981,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - No es pot obtindre un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estiga executant. + No es pot obtindre un bloqueig del directori de dades %s. El Blackcoin Core probablement ja s'estiga executant. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3065,11 +3065,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i Els desenvolupadors del Bitcoin Core + Copyright (C) 2009-%i Els desenvolupadors del Blackcoin Core Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Error en carregar wallet.dat: el moneder requereix una versió més nova del Bitcoin core + Error en carregar wallet.dat: el moneder requereix una versió més nova del Blackcoin core Error reading from database, shutting down. @@ -3081,7 +3081,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - Ha fallat la inicialització de la comprovació de validesa. El Bitcoin Core s'està parant. + Ha fallat la inicialització de la comprovació de validesa. El Blackcoin Core s'està parant. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3181,7 +3181,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - Cal reescriure el moneder: reiniceu el Bitcoin Core per completar-ho. + Cal reescriure el moneder: reiniceu el Blackcoin Core per completar-ho. Warning diff --git a/src/qt/locale/bitcoin_ca_ES.ts b/src/qt/locale/bitcoin_ca_ES.ts index e6a932ebe..1e46c82e1 100644 --- a/src/qt/locale/bitcoin_ca_ES.ts +++ b/src/qt/locale/bitcoin_ca_ES.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Aquestes són les vostres adreces de Bitcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes. + Aquestes són les vostres adreces de Blackcoin per enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Aquestes són les vostres adreces Bitcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció. + Aquestes són les vostres adreces Blackcoin per rebre pagaments. Es recomana utilitzar una adreça nova de recepció per a cada transacció. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Ara es tancarà el Bitcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres bitcoins no puguin ser robades per programari maliciós que infecti l'ordinador. + Ara es tancarà el Blackcoin Core per finalitzar el procés d'encriptació. Tingueu present que encriptar el vostre moneder no garanteix que les vostres blackcoins no puguin ser robades per programari maliciós que infecti l'ordinador. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - Client del Bitcoin Core + Client del Blackcoin Core Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Envia monedes a una adreça Bitcoin + Envia monedes a una adreça Blackcoin Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Mostra informació del Bitcoin Core + Mostra informació del Blackcoin Core &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Signa el missatges amb la seva adreça de Bitcoin per provar que les poseeixes + Signa el missatges amb la seva adreça de Blackcoin per provar que les poseeixes Verify messages to ensure they were signed with specified Bitcoin addresses - Verifiqueu els missatges per assegurar-vos que han estat signats amb una adreça Bitcoin específica. + Verifiqueu els missatges per assegurar-vos que han estat signats amb una adreça Blackcoin específica. &File @@ -399,19 +399,19 @@ Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin Request payments (generates QR codes and bitcoin: URIs) - Sol·licita pagaments (genera codis QR i bitcoin: URI) + Sol·licita pagaments (genera codis QR i blackcoin: URI) &About Bitcoin Core - &Quant al Bitcoin Core + &Quant al Blackcoin Core Modify configuration options for Bitcoin Core - Modifica les opcions de configuració del Bitcoin Core + Modifica les opcions de configuració del Blackcoin Core Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Obre una bitcoin: sol·licitud d'URI o pagament + Obre una blackcoin: sol·licitud d'URI o pagament &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Mostra el missatge d'ajuda del Bitcoin Core per obtenir una llista amb les possibles opcions de línia d'ordres de Bitcoin + Mostra el missatge d'ajuda del Blackcoin Core per obtenir una llista amb les possibles opcions de línia d'ordres de Blackcoin %n active connection(s) to Bitcoin network - %n connexió activa a la xarxa Bitcoin%n connexions actives a la xarxa Bitcoin + %n connexió activa a la xarxa Blackcoin%n connexions actives a la xarxa Blackcoin No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - L'adreça introduïda «%1» no és una adreça de Bitcoin vàlida. + L'adreça introduïda «%1» no és una adreça de Blackcoin vàlida. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin version @@ -868,7 +868,7 @@ About Bitcoin Core - Quant al Bitcoin Core + Quant al Blackcoin Core Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Us donem la benvinguda al Bitcoin Core. + Us donem la benvinguda al Blackcoin Core. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Bitcoin Core les dades. + Atès que és la primera vegada que executeu el programa, podeu triar on emmagatzemarà el Blackcoin Core les dades. - 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. - El Bitcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Bitcoin. Com a mínim s'emmagatzemaran %1 GB de dades en aquest directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder. + Bitcoin Core will download and store a copy of the Blackcoin 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. + El Blackcoin Core descarregarà i emmagatzemarà una còpia de la cadena de blocs de Blackcoin. Com a mínim s'emmagatzemaran %1 GB de dades en aquest directori, que seguiran creixent gradualment. També s'hi emmagatzemarà el moneder. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Nucli de Bitcoin + Nucli de Blackcoin Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - La interfície d'usuari pot definir-se des d'aquí. El paràmetre tindrà efecte després de reiniciar el Bitcoin Core. + La interfície d'usuari pot definir-se des d'aquí. El paràmetre tindrà efecte després de reiniciar el Blackcoin Core. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Inicia el Bitcoin Core automàticament després d'iniciar una sessió en el sistema. + Inicia el Blackcoin Core automàticament després d'iniciar una sessió en el sistema. &Start Bitcoin Core on system login - &Inicia el Bitcoin Core en inciar el sistema + &Inicia el Blackcoin Core en inciar el sistema (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Obre el port del client de Bitcoin al router de forma automàtica. Això només funciona quan el router implementa UPnP i l'opció està activada. + Obre el port del client de Blackcoin al router de forma automàtica. Això només funciona quan el router implementa UPnP i l'opció està activada. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Connecta a la xarxa Bitcoin a través d'un proxy SOCKS5. + Connecta a la xarxa Blackcoin a través d'un proxy SOCKS5. &Connect through SOCKS5 proxy (default proxy): @@ -1200,7 +1200,7 @@ 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. - 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. + La informació mostrada pot no estar al día. El teu moneder es sincronitza automàticament amb la xarxa Blackcoin un cop s'ha establert connexió, però aquest proces no s'ha completat encara. Watch-only: @@ -1299,7 +1299,7 @@ Cannot start bitcoin: click-to-pay handler - No es pot iniciar bitcoin: gestor clica-per-pagar + No es pot iniciar blackcoin: gestor clica-per-pagar Payment request fetch URL is invalid: %1 @@ -1307,7 +1307,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - 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. + L'URI no pot ser analitzat! Això pot ser a causa d'una adreça de Blackcoin no vàlida o per paràmetres URI amb mal format. Payment request file handling @@ -1381,7 +1381,7 @@ Enter a Bitcoin address (e.g. %1) - Introduïu una adreça de Bitcoin (p. ex. %1) + Introduïu una adreça de Blackcoin (p. ex. %1) %1 d @@ -1491,7 +1491,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Obre el fitxer de registre de depuració del Bitcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans. + Obre el fitxer de registre de depuració del Blackcoin Core del directori de dades actual. Pot portar uns quants segons per a fitxers de registre grans. Received @@ -1651,7 +1651,7 @@ Welcome to the Bitcoin Core RPC console. - Us donem la benviguda a la consola RPC del Bitcoin Core. + Us donem la benviguda a la consola RPC del Blackcoin Core. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1734,7 +1734,7 @@ 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. - Un missatge opcional que s'adjuntarà a la sol·licitud de pagament, que es mostrarà quan s'obri la sol·licitud. Nota: El missatge no s'enviarà amb el pagament per la xarxa Bitcoin. + Un missatge opcional que s'adjuntarà a la sol·licitud de pagament, que es mostrarà quan s'obri la sol·licitud. Nota: El missatge no s'enviarà amb el pagament per la xarxa Blackcoin. An optional label to associate with the new receiving address. @@ -1967,7 +1967,7 @@ 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. - No hi ha cap problema en pagar només la comissió mínima sempre que hi hagi menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirmi una vegada hi hagi més demanda de transaccions de bitcoins que la xarxa pugui processar. + No hi ha cap problema en pagar només la comissió mínima sempre que hi hagi menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirmi una vegada hi hagi més demanda de transaccions de blackcoins que la xarxa pugui processar. (read the tooltip) @@ -2127,7 +2127,7 @@ Warning: Invalid Bitcoin address - Avís: adreça Bitcoin no vàlida + Avís: adreça Blackcoin no vàlida (no label) @@ -2178,7 +2178,7 @@ The Bitcoin address to send the payment to - L'adreça Bitcoin on enviar el pagament + L'adreça Blackcoin on enviar el pagament Alt+A @@ -2198,7 +2198,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - La comissió es deduirà de l'import que s'enviarà. El destinatari rebrà menys bitcoins que les que introduïu al camp d'import. Si se seleccionen múltiples destinataris, la comissió es dividirà per igual. + La comissió es deduirà de l'import que s'enviarà. El destinatari rebrà menys blackcoins que les que introduïu al camp d'import. Si se seleccionen múltiples destinataris, la comissió es dividirà per igual. S&ubtract fee from amount @@ -2222,7 +2222,7 @@ 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. - Un missatge que s'ha adjuntat al bitcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Bitcoin. + Un missatge que s'ha adjuntat al blackcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Blackcoin. Pay To: @@ -2237,7 +2237,7 @@ ShutdownWindow Bitcoin Core is shutting down... - S'està aturant el Bitcoin Core... + S'està aturant el Blackcoin Core... Do not shut down the computer until this window disappears. @@ -2256,11 +2256,11 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Podeu signar missatges/acords amb les vostres adreces per provar que rebeu les bitcoins que s'hi envien. Aneu amb compte no signar res que sigui vague o aleatori, perquè en alguns atacs de suplantació es pot provar que hi signeu la vostra identitat. Només signeu aquelles declaracions completament detallades en què hi esteu d'acord. + Podeu signar missatges/acords amb les vostres adreces per provar que rebeu les blackcoins que s'hi envien. Aneu amb compte no signar res que sigui vague o aleatori, perquè en alguns atacs de suplantació es pot provar que hi signeu la vostra identitat. Només signeu aquelles declaracions completament detallades en què hi esteu d'acord. The Bitcoin address to sign the message with - L'adreça Bitcoin amb què signar el missatge + L'adreça Blackcoin amb què signar el missatge Choose previously used address @@ -2292,7 +2292,7 @@ Sign the message to prove you own this Bitcoin address - Signa el missatge per provar que ets propietari d'aquesta adreça Bitcoin + Signa el missatge per provar que ets propietari d'aquesta adreça Blackcoin Sign &Message @@ -2316,11 +2316,11 @@ The Bitcoin address the message was signed with - L'adreça Bitcoin amb què va ser signat el missatge + L'adreça Blackcoin amb què va ser signat el missatge Verify the message to ensure it was signed with the specified Bitcoin address - Verificar el missatge per assegurar-se que ha estat signat amb una adreça Bitcoin específica + Verificar el missatge per assegurar-se que ha estat signat amb una adreça Blackcoin específica Verify &Message @@ -2387,11 +2387,11 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Core The Bitcoin Core developers - Els desenvolupadors del Bitcoin Core + Els desenvolupadors del Blackcoin Core [testnet] @@ -2937,7 +2937,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - No es pot enllaçar %s a aquest ordinador. El Bitcoin Core probablement ja estigui executant-s'hi. + No es pot enllaçar %s a aquest ordinador. El Blackcoin Core probablement ja estigui executant-s'hi. WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected) @@ -3101,7 +3101,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - No es pot obtenir un bloqueig del directori de dades %s. El Bitcoin Core probablement ja s'estigui executant. + No es pot obtenir un bloqueig del directori de dades %s. El Blackcoin Core probablement ja s'estigui executant. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3185,11 +3185,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i Els desenvolupadors del Bitcoin Core + Copyright (C) 2014-%i Els desenvolupadors del Blackcoin Core Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Error en carregar wallet.dat: el moneder requereix una versió més nova del Bitcoin core + Error en carregar wallet.dat: el moneder requereix una versió més nova del Blackcoin core Error reading from database, shutting down. @@ -3201,7 +3201,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - Ha fallat la inicialització de la comprovació de validesa. El Bitcoin Core s'està aturant. + Ha fallat la inicialització de la comprovació de validesa. El Blackcoin Core s'està aturant. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3301,7 +3301,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - Cal reescriure el moneder: reiniceu el Bitcoin Core per completar-ho. + Cal reescriure el moneder: reiniceu el Blackcoin Core per completar-ho. Warning diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts index b9069fc3c..a5bd5f959 100644 --- a/src/qt/locale/bitcoin_cs.ts +++ b/src/qt/locale/bitcoin_cs.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Tohle jsou tvé Bitcoinové adresy pro posílání plateb. Před odesláním mincí si vždy zkontroluj částku a cílovou adresu. + Tohle jsou tvé Blackcoinové adresy pro posílání plateb. Před odesláním mincí si vždy zkontroluj částku a cílovou adresu. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Tohle jsou tvé Bitcoinové adresy pro příjem plateb. Je doporučené používat pokaždé novou adresu pro každou transakci. + Tohle jsou tvé Blackcoinové adresy pro příjem plateb. Je doporučené používat pokaždé novou adresu pro každou transakci. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Bitcoin Core se teď ukončí, aby dokončil zašifrování. Pamatuj však, že pouhé zašifrování peněženky nemůže zabránit krádeži tvých bitcoinů malwarem, kterým se může počítač nakazit. + Blackcoin Core se teď ukončí, aby dokončil zašifrování. Pamatuj však, že pouhé zašifrování peněženky nemůže zabránit krádeži tvých blackcoinů malwarem, kterým se může počítač nakazit. 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. @@ -299,7 +299,7 @@ Bitcoin Core client - Bitcoin Core klient + Blackcoin Core klient Importing blocks from disk... @@ -311,7 +311,7 @@ Send coins to a Bitcoin address - Pošli mince na Bitcoinovou adresu + Pošli mince na Blackcoinovou adresu Backup wallet to another location @@ -335,7 +335,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -351,7 +351,7 @@ Show information about Bitcoin Core - Zobraz informace o Bitcoin Core + Zobraz informace o Blackcoin Core &Show / Hide @@ -367,11 +367,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Podepiš zprávy svými Bitcoinovými adresami, čímž prokážeš, že jsi jejich vlastníkem + Podepiš zprávy svými Blackcoinovými adresami, čímž prokážeš, že jsi jejich vlastníkem Verify messages to ensure they were signed with specified Bitcoin addresses - Ověř zprávy, aby ses ujistil, že byly podepsány danými Bitcoinovými adresami + Ověř zprávy, aby ses ujistil, že byly podepsány danými Blackcoinovými adresami &File @@ -391,19 +391,19 @@ Bitcoin Core - Bitcoin Core + Blackcoin Core Request payments (generates QR codes and bitcoin: URIs) - Požaduj platby (generuje QR kódy a bitcoin: URI) + Požaduj platby (generuje QR kódy a blackcoin: URI) &About Bitcoin Core - O &Bitcoin Core + O &Blackcoin Core Modify configuration options for Bitcoin Core - Uprav nastavení Bitcoin Core + Uprav nastavení Blackcoin Core Show the list of used sending addresses and labels @@ -415,7 +415,7 @@ Open a bitcoin: URI or payment request - Načti bitcoin: URI nebo platební požadavek + Načti blackcoin: URI nebo platební požadavek &Command-line options @@ -423,11 +423,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Seznam argumentů Bitcoinu pro příkazovou řádku získáš v nápovědě Bitcoinu Core + Seznam argumentů Blackcoinu pro příkazovou řádku získáš v nápovědě Blackcoinu Core %n active connection(s) to Bitcoin network - %n aktivní spojení do Bitcoinové sítě%n aktivní spojení do Bitcoinové sítě%n aktivních spojení do Bitcoinové sítě + %n aktivní spojení do Blackcoinové sítě%n aktivní spojení do Blackcoinové sítě%n aktivních spojení do Blackcoinové sítě No block source available... @@ -810,7 +810,7 @@ The entered address "%1" is not a valid Bitcoin address. - Zadaná adresa "%1" není platná Bitcoinová adresa. + Zadaná adresa "%1" není platná Blackcoinová adresa. Could not unlock wallet. @@ -848,7 +848,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin Core + Blackcoin Core version @@ -860,7 +860,7 @@ About Bitcoin Core - O Bitcoin Core + O Blackcoin Core Command-line options @@ -907,15 +907,15 @@ Welcome to Bitcoin Core. - Vítej v Bitcoin Core. + Vítej v Blackcoin Core. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Tohle je poprvé, co spouštíš Bitcoin Core, takže si můžeš zvolit, kam bude ukládat svá data. + Tohle je poprvé, co spouštíš Blackcoin Core, takže si můžeš zvolit, kam bude ukládat svá data. 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. - Bitcoin Core bude stahovat kopii řetězce bloků. Proto bude potřeba do tohoto adresáře uložit nejméně %1 GB dat – toto číslo bude navíc v průběhu času pomalu růst. Tvá peněženka bude rovněž uložena v tomto adresáři. + Blackcoin Core bude stahovat kopii řetězce bloků. Proto bude potřeba do tohoto adresáře uložit nejméně %1 GB dat – toto číslo bude navíc v průběhu času pomalu růst. Tvá peněženka bude rovněž uložena v tomto adresáři. Use the default data directory @@ -927,7 +927,7 @@ Bitcoin Core - Bitcoin Core + Blackcoin Core Error: Specified data directory "%1" cannot be created. @@ -1009,7 +1009,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - Tady lze nastavit jazyk uživatelského rozhraní. Nastavení se projeví až po restartování Bitcoin Core. + Tady lze nastavit jazyk uživatelského rozhraní. Nastavení se projeví až po restartování Blackcoin Core. 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 |. @@ -1037,11 +1037,11 @@ Automatically start Bitcoin Core after logging in to the system. - Automaticky spustí Bitcoin Core po přihlášení do systému. + Automaticky spustí Blackcoin Core po přihlášení do systému. &Start Bitcoin Core on system login - S&pustit Bitcoin Core po přihlášení do systému + S&pustit Blackcoin Core po přihlášení do systému (0 = auto, <0 = leave that many cores free) @@ -1077,7 +1077,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Připojí se do Bitcoinové sítě přes SOCKS5 proxy. + Připojí se do Blackcoinové sítě přes SOCKS5 proxy. &Connect through SOCKS5 proxy (default proxy): @@ -1117,7 +1117,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - Připojí se do Bitcoinové sítě přes SOCKS5 proxy vyhrazenou pro skryté služby v Tor síti. + Připojí se do Blackcoinové sítě přes SOCKS5 proxy vyhrazenou pro skryté služby v Tor síti. Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1204,7 +1204,7 @@ 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. - 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. + Zobrazené informace nemusí být aktuální. Tvá peněženka se automaticky sesynchronizuje s Blackcoinovou sítí, jakmile se s ní spojí. Zatím ale ještě není synchronizace dokončena. Watch-only: @@ -1303,7 +1303,7 @@ Cannot start bitcoin: click-to-pay handler - Nemůžu spustit bitcoin: obsluha click-to-pay + Nemůžu spustit blackcoin: obsluha click-to-pay Payment request fetch URL is invalid: %1 @@ -1311,7 +1311,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - Nepodařilo se analyzovat URI! Důvodem může být neplatná Bitcoinová adresa nebo poškozené parametry URI. + Nepodařilo se analyzovat URI! Důvodem může být neplatná Blackcoinová adresa nebo poškozené parametry URI. Payment request file handling @@ -1385,7 +1385,7 @@ Enter a Bitcoin address (e.g. %1) - Zadej Bitcoinovou adresu (např. %1) + Zadej Blackcoinovou adresu (např. %1) %1 d @@ -1495,7 +1495,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Otevři soubor s ladicími záznamy Bitcoin Core z aktuálního datového adresáře. U velkých logů to může pár vteřin zabrat. + Otevři soubor s ladicími záznamy Blackcoin Core z aktuálního datového adresáře. U velkých logů to může pár vteřin zabrat. Received @@ -1627,7 +1627,7 @@ Welcome to the Bitcoin Core RPC console. - Vítej v RPC konzoli Bitcoin Core. + Vítej v RPC konzoli Blackcoin Core. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1710,7 +1710,7 @@ 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. - Volitelná zpráva, která se připojí k platebnímu požadavku a která se zobrazí, když se požadavek otevře. Poznámka: Tahle zpráva se neposílá s platbou po Bitcoinové síti. + Volitelná zpráva, která se připojí k platebnímu požadavku a která se zobrazí, když se požadavek otevře. Poznámka: Tahle zpráva se neposílá s platbou po Blackcoinové síti. An optional label to associate with the new receiving address. @@ -1943,7 +1943,7 @@ 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. - Platit jen minimální poplatek je v pořádku, pokud je zrovna méně transakcí než místa v blocích. Ale počítej s tím, že to také může skončit transakcí, která nikdy nebude potvrzena, pokud je větší poptávka po bitcoinových transakcích, než síť zvládne zpracovat. + Platit jen minimální poplatek je v pořádku, pokud je zrovna méně transakcí než místa v blocích. Ale počítej s tím, že to také může skončit transakcí, která nikdy nebude potvrzena, pokud je větší poptávka po blackcoinových transakcích, než síť zvládne zpracovat. (read the tooltip) @@ -2103,7 +2103,7 @@ Warning: Invalid Bitcoin address - Upozornění: Neplatná Bitcoinová adresa + Upozornění: Neplatná Blackcoinová adresa (no label) @@ -2154,7 +2154,7 @@ The Bitcoin address to send the payment to - Bitcoinová adresa příjemce + Blackcoinová adresa příjemce Alt+A @@ -2174,7 +2174,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Poplatek se odečte od posílané částky. Příjemce tak dostane méně bitcoinů, než zadáš do pole Částka. Pokud vybereš více příjemců, tak se poplatek rovnoměrně rozloží. + Poplatek se odečte od posílané částky. Příjemce tak dostane méně blackcoinů, než zadáš do pole Částka. Pokud vybereš více příjemců, tak se poplatek rovnoměrně rozloží. S&ubtract fee from amount @@ -2198,7 +2198,7 @@ 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. - Zpráva, která byla připojena k bitcoin: URI a která se ti pro přehled uloží k transakci. Poznámka: Tahle zpráva se neposílá s platbou po Bitcoinové síti. + Zpráva, která byla připojena k blackcoin: URI a která se ti pro přehled uloží k transakci. Poznámka: Tahle zpráva se neposílá s platbou po Blackcoinové síti. Pay To: @@ -2213,7 +2213,7 @@ ShutdownWindow Bitcoin Core is shutting down... - Bitcoin Core se ukončuje... + Blackcoin Core se ukončuje... Do not shut down the computer until this window disappears. @@ -2232,11 +2232,11 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Podepsáním zprávy/smlouvy svými adresami můžeš prokázat, že jsi na ně schopen přijmout bitcoiny. Buď opatrný a nepodepisuj nic vágního nebo náhodného; například při phishingových útocích můžeš být lákán, abys něco takového podepsal. Podepisuj pouze naprosto úplná a detailní prohlášení, se kterými souhlasíš. + Podepsáním zprávy/smlouvy svými adresami můžeš prokázat, že jsi na ně schopen přijmout blackcoiny. Buď opatrný a nepodepisuj nic vágního nebo náhodného; například při phishingových útocích můžeš být lákán, abys něco takového podepsal. Podepisuj pouze naprosto úplná a detailní prohlášení, se kterými souhlasíš. The Bitcoin address to sign the message with - Bitcoinová adresa, kterou se zpráva podepíše + Blackcoinová adresa, kterou se zpráva podepíše Choose previously used address @@ -2268,7 +2268,7 @@ Sign the message to prove you own this Bitcoin address - Podepiš zprávu, čímž prokážeš, že jsi vlastníkem této Bitcoinové adresy + Podepiš zprávu, čímž prokážeš, že jsi vlastníkem této Blackcoinové adresy Sign &Message @@ -2292,11 +2292,11 @@ The Bitcoin address the message was signed with - Bitcoinová adresa, kterou je zpráva podepsána + Blackcoinová adresa, kterou je zpráva podepsána Verify the message to ensure it was signed with the specified Bitcoin address - Ověř zprávu, aby ses ujistil, že byla podepsána danou Bitcoinovou adresou + Ověř zprávu, aby ses ujistil, že byla podepsána danou Blackcoinovou adresou Verify &Message @@ -2363,11 +2363,11 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Core The Bitcoin Core developers - Vývojáři Bitcoin Core + Vývojáři Blackcoin Core [testnet] @@ -2949,7 +2949,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - Nedaří se mi připojit na %s na tomhle počítači. Bitcoin Core už pravděpodobně jednou běží. + Nedaří se mi připojit na %s na tomhle počítači. Blackcoin Core už pravděpodobně jednou běží. Use UPnP to map the listening port (default: 1 when listening and no -proxy) @@ -3141,7 +3141,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - Nedaří se mi získat zámek na datový adresář %s. Bitcoin Core pravděpodobně už jednou běží. + Nedaří se mi získat zámek na datový adresář %s. Blackcoin Core pravděpodobně už jednou běží. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3237,11 +3237,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i Vývojáři Bitcoin Core + Copyright (C) 2009-%i Vývojáři Blackcoin Core Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Chyba při načítání wallet.dat: peněženka vyžaduje novější verzi Bitcoin Core + Chyba při načítání wallet.dat: peněženka vyžaduje novější verzi Blackcoin Core Error reading from database, shutting down. @@ -3257,7 +3257,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - Selhala úvodní zevrubná prověrka. Bitcoin Core se ukončuje. + Selhala úvodní zevrubná prověrka. Blackcoin Core se ukončuje. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3377,7 +3377,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - Soubor s peněženkou potřeboval přepsat: restartuj Bitcoin Core, aby se operace dokončila + Soubor s peněženkou potřeboval přepsat: restartuj Blackcoin Core, aby se operace dokončila Warning diff --git a/src/qt/locale/bitcoin_cs_CZ.ts b/src/qt/locale/bitcoin_cs_CZ.ts index 34d7b4b4a..7aca33a99 100644 --- a/src/qt/locale/bitcoin_cs_CZ.ts +++ b/src/qt/locale/bitcoin_cs_CZ.ts @@ -159,7 +159,7 @@ Bitcoin - Bitcoin + Blackcoin &File diff --git a/src/qt/locale/bitcoin_cy.ts b/src/qt/locale/bitcoin_cy.ts index c32d236a9..9f0862c3d 100644 --- a/src/qt/locale/bitcoin_cy.ts +++ b/src/qt/locale/bitcoin_cy.ts @@ -215,7 +215,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -231,7 +231,7 @@ Show information about Bitcoin Core - Dangos gwybodaeth am Graidd Bitcoin + Dangos gwybodaeth am Graidd Blackcoin &Show / Hide @@ -255,11 +255,11 @@ Bitcoin Core - Craidd Bitcoin + Craidd Blackcoin &About Bitcoin Core - &Ynghylch Craidd Bitcoin + &Ynghylch Craidd Blackcoin %n hour(s) @@ -426,11 +426,11 @@ HelpMessageDialog Bitcoin Core - Craidd Bitcoin + Craidd Blackcoin About Bitcoin Core - Ynghylch Craidd Bitcoin + Ynghylch Craidd Blackcoin Usage: @@ -445,11 +445,11 @@ Welcome to Bitcoin Core. - Croeso i Graidd Bitcoin + Croeso i Graidd Blackcoin Bitcoin Core - Craidd Bitcoin + Craidd Blackcoin Error @@ -665,11 +665,11 @@ SplashScreen Bitcoin Core - Craidd Bitcoin + Craidd Blackcoin The Bitcoin Core developers - Datblygwyr Graidd Bitcoin + Datblygwyr Graidd Blackcoin [testnet] diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts index aa2724a1e..d209588d5 100644 --- a/src/qt/locale/bitcoin_da.ts +++ b/src/qt/locale/bitcoin_da.ts @@ -47,11 +47,11 @@ Choose the address to send coins to - Vælg adresse at sende bitcoins til + Vælg adresse at sende blackcoins til Choose the address to receive coins with - Vælg adresse at modtage bitcoins med + Vælg adresse at modtage blackcoins med C&hoose @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Disse er dine Bitcoin-adresser for at sende betalinger. Tjek altid beløb og modtageradresse, inden du sender bitcoins. + Disse er dine Blackcoin-adresser for at sende betalinger. Tjek altid beløb og modtageradresse, inden du sender blackcoins. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Dette er dine Bitcoin-adresser til at modtage betalinger med. Det anbefales are bruge en ny modtagelsesadresse for hver transaktion. + Dette er dine Blackcoin-adresser til at modtage betalinger med. Det anbefales are bruge en ny modtagelsesadresse for hver transaktion. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Bitcoin Core vil nu lukke for at færdiggøre krypteringsprocessen. Husk at kryptering af din tegnebog kan ikke beskytte dine bitcoin fuldt ud mod at blive stjålet af eventuel malware, der måtte have inficeret din computer. + Blackcoin Core vil nu lukke for at færdiggøre krypteringsprocessen. Husk at kryptering af din tegnebog kan ikke beskytte dine blackcoin fuldt ud mod at blive stjålet af eventuel malware, der måtte have inficeret din computer. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - Bitcoin Core-klient + Blackcoin Core-klient Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Send bitcoins til en Bitcoin-adresse + Send blackcoins til en Blackcoin-adresse Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Vis oplysninger om Bitcoin Core + Vis oplysninger om Blackcoin Core &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Underskriv beskeder med dine Bitcoin-adresser for at bevise, at de tilhører dig + Underskriv beskeder med dine Blackcoin-adresser for at bevise, at de tilhører dig Verify messages to ensure they were signed with specified Bitcoin addresses - Verificér beskeder for at sikre, at de er underskrevet med de angivne Bitcoin-adresser + Verificér beskeder for at sikre, at de er underskrevet med de angivne Blackcoin-adresser &File @@ -399,19 +399,19 @@ Bitcoin Core - Bitcoin Core + Blackcoin Core Request payments (generates QR codes and bitcoin: URIs) - Anmod om betalinger (genererer QR-koder og "bitcoin:"-URI'er) + Anmod om betalinger (genererer QR-koder og "blackcoin:"-URI'er) &About Bitcoin Core - &Om Bitcoin Core + &Om Blackcoin Core Modify configuration options for Bitcoin Core - Ændr opsætning af Bitcoin Core + Ændr opsætning af Blackcoin Core Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Åbn en "bitcoin:"-URI eller betalingsanmodning + Åbn en "blackcoin:"-URI eller betalingsanmodning &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Vis Bitcoin Core hjælpebesked for at få en liste over mulige tilvalg for Bitcoin kommandolinje + Vis Blackcoin Core hjælpebesked for at få en liste over mulige tilvalg for Blackcoin kommandolinje %n active connection(s) to Bitcoin network - %n aktiv forbindelse til Bitcoin-netværket%n aktive forbindelser til Bitcoin-netværket + %n aktiv forbindelse til Blackcoin-netværket%n aktive forbindelser til Bitcoin-netværket No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - Den indtastede adresse "%1" er ikke en gyldig Bitcoin-adresse. + Den indtastede adresse "%1" er ikke en gyldig Blackcoin-adresse. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin Core + Blackcoin Core version @@ -868,7 +868,7 @@ About Bitcoin Core - Om Bitcoin Core + Om Blackcoin Core Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Velkommen til Bitcoin Core. + Velkommen til Blackcoin Core. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Siden dette er første gang, programmet startes, kan du vælge, hvor Bitcoin Core skal gemme sin data. + Siden dette er første gang, programmet startes, kan du vælge, hvor Blackcoin Core skal gemme sin data. 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. - Bitcoin Core vil downloade og gemme et kopi af Bitcoin-blokkæden. Mindst %1 GB data vil blive gemt i denne mappe, og den vil vokse over tid. Tegnebogen vil også blive gemt i denne mappe. + Blackcoin Core vil downloade og gemme et kopi af Blackcoin-blokkæden. Mindst %1 GB data vil blive gemt i denne mappe, og den vil vokse over tid. Tegnebogen vil også blive gemt i denne mappe. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Bitcoin Core + Blackcoin Core Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - Sproget for brugerfladen kan vælges her. Denne indstilling vil træde i kraft efter genstart af Bitcoin Core. + Sproget for brugerfladen kan vælges her. Denne indstilling vil træde i kraft efter genstart af Blackcoin Core. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Start Bitcoin Core automatisk efter der logges ind på systemet. + Start Blackcoin Core automatisk efter der logges ind på systemet. &Start Bitcoin Core on system login - &Start Bitcoin Core ved system-login + &Start Blackcoin Core ved system-login (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Åbn automatisk Bitcoin-klientens port på routeren. Dette virker kun, når din router understøtter UPnP, og UPnP er aktiveret. + Åbn automatisk Blackcoin-klientens port på routeren. Dette virker kun, når din router understøtter UPnP, og UPnP er aktiveret. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Forbind til Bitcoin-netværket gennem en SOCKS5-proxy. + Forbind til Blackcoin-netværket gennem en SOCKS5-proxy. &Connect through SOCKS5 proxy (default proxy): @@ -1129,7 +1129,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - Forbind til Bitcoin-netværket gennem en separat SOCKS5-proxy for skjulte Tor-tjenester. + Forbind til Blackcoin-netværket gennem en separat SOCKS5-proxy for skjulte Tor-tjenester. Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1165,7 +1165,7 @@ Choose the default subdivision unit to show in the interface and when sending coins. - Vælg standard for underopdeling af enhed, som skal vises i brugergrænsefladen og ved afsendelse af bitcoins. + Vælg standard for underopdeling af enhed, som skal vises i brugergrænsefladen og ved afsendelse af blackcoins. Whether to show coin control features or not. @@ -1216,7 +1216,7 @@ 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. - 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. + Den viste information kan være forældet. Din tegnebog synkroniserer automatisk med Blackcoin-netværket, når en forbindelse etableres, men denne proces er ikke gennemført endnu. Watch-only: @@ -1315,7 +1315,7 @@ Cannot start bitcoin: click-to-pay handler - Kan ikke starte bitcoin: click-to-pay-håndtering + Kan ikke starte blackcoin: click-to-pay-håndtering Payment request fetch URL is invalid: %1 @@ -1323,7 +1323,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - URI kan ikke tolkes! Dette kan skyldes en ugyldig Bitcoin-adresse eller forkert udformede URL-parametre. + URI kan ikke tolkes! Dette kan skyldes en ugyldig Blackcoin-adresse eller forkert udformede URL-parametre. Payment request file handling @@ -1397,7 +1397,7 @@ Enter a Bitcoin address (e.g. %1) - Indtast en Bitcoin-adresse (fx %1) + Indtast en Blackcoin-adresse (fx %1) %1 d @@ -1519,7 +1519,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Åbn Bitcoin Cores fejlsøgningslogfil fra den aktuelle datamappe. Dette kan tage nogle få sekunder for store logfiler. + Åbn Blackcoin Cores fejlsøgningslogfil fra den aktuelle datamappe. Dette kan tage nogle få sekunder for store logfiler. Received @@ -1679,7 +1679,7 @@ Welcome to the Bitcoin Core RPC console. - Velkommen til Bitcoin Cores RPC-konsol. + Velkommen til Blackcoin Cores RPC-konsol. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1762,7 +1762,7 @@ 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. - En valgfri besked, der føjes til betalingsanmodningen, og som vil vises, når anmodningen åbnes. Bemærk: Beskeden vil ikke sendes sammen med betalingen over Bitcoin-netværket. + En valgfri besked, der føjes til betalingsanmodningen, og som vil vises, når anmodningen åbnes. Bemærk: Beskeden vil ikke sendes sammen med betalingen over Blackcoin-netværket. An optional label to associate with the new receiving address. @@ -1911,7 +1911,7 @@ SendCoinsDialog Send Coins - Send bitcoins + Send blackcoins Coin Control Features @@ -1995,7 +1995,7 @@ 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. - 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. + 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 blackcoin-transaktioner, end hvad netværket kan bearbejde. (read the tooltip) @@ -2067,7 +2067,7 @@ Confirm send coins - Bekræft afsendelse af bitcoins + Bekræft afsendelse af blackcoins %1 to %2 @@ -2127,7 +2127,7 @@ 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. - 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. + Transaktionen blev afvist! Dette kan ske, hvis nogle af dine blackcoins i din tegnebog allerede er brugt, som hvis du brugte en kopi af wallet.dat og dine blackcoins er blevet brugt i kopien, men ikke er markeret som brugt her. A fee higher than %1 is considered an absurdly high fee. @@ -2155,7 +2155,7 @@ Warning: Invalid Bitcoin address - Advarsel: Ugyldig Bitcoin-adresse + Advarsel: Ugyldig Blackcoin-adresse (no label) @@ -2206,7 +2206,7 @@ The Bitcoin address to send the payment to - Bitcoin-adresse, som betalingen skal sendes til + Blackcoin-adresse, som betalingen skal sendes til Alt+A @@ -2226,7 +2226,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Gebyret vil blive trukket fra det sendte beløb. Modtageren vil modtage færre bitcoin, end du indtaster i beløbfeltet. Hvis flere modtagere vælges, vil gebyret deles ligeligt. + Gebyret vil blive trukket fra det sendte beløb. Modtageren vil modtage færre blackcoin, end du indtaster i beløbfeltet. Hvis flere modtagere vælges, vil gebyret deles ligeligt. S&ubtract fee from amount @@ -2250,7 +2250,7 @@ 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. - En besked, som blev føjet til "bitcon:"-URI'en, som vil gemmes med transaktionen til din reference. Bemærk: Denne besked vil ikke blive sendt over Bitcoin-netværket. + En besked, som blev føjet til "bitcon:"-URI'en, som vil gemmes med transaktionen til din reference. Bemærk: Denne besked vil ikke blive sendt over Blackcoin-netværket. Pay To: @@ -2265,7 +2265,7 @@ ShutdownWindow Bitcoin Core is shutting down... - Bitcoin Core lukker ned… + Blackcoin Core lukker ned… Do not shut down the computer until this window disappears. @@ -2284,11 +2284,11 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Du kan signere beskeder/aftaler med dine adresser for at bevise, at du kan modtage bitcoin, der bliver sendt til adresserne. Vær forsigtig med ikke at signere noget vagt eller tilfældigt, da eventuelle phishing-angreb kan snyde dig til at overlade din identitet til dem. Signér kun fuldt ud detaljerede udsagn, som du er enig i. + Du kan signere beskeder/aftaler med dine adresser for at bevise, at du kan modtage blackcoin, der bliver sendt til adresserne. Vær forsigtig med ikke at signere noget vagt eller tilfældigt, da eventuelle phishing-angreb kan snyde dig til at overlade din identitet til dem. Signér kun fuldt ud detaljerede udsagn, som du er enig i. The Bitcoin address to sign the message with - Bitcoin-adresse, som beskeden skal signeres med + Blackcoin-adresse, som beskeden skal signeres med Choose previously used address @@ -2320,7 +2320,7 @@ Sign the message to prove you own this Bitcoin address - Underskriv denne besked for at bevise, at Bitcoin-adressen tilhører dig + Underskriv denne besked for at bevise, at Blackcoin-adressen tilhører dig Sign &Message @@ -2344,11 +2344,11 @@ The Bitcoin address the message was signed with - Bitcoin-adressen, som beskeden blev signeret med + Blackcoin-adressen, som beskeden blev signeret med Verify the message to ensure it was signed with the specified Bitcoin address - Verificér beskeden for at sikre, at den er underskrevet med den angivne Bitcoin-adresse + Verificér beskeden for at sikre, at den er underskrevet med den angivne Blackcoin-adresse Verify &Message @@ -2415,11 +2415,11 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Core The Bitcoin Core developers - Udviklerne af Bitcoin Core + Udviklerne af Blackcoin Core [testnet] @@ -2545,7 +2545,7 @@ 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. - Minede bitcoins skal modne %1 blokke, før de kan bruges. Da du genererede denne blok, blev den transmitteret til netværket for at blive føjet til blokkæden. Hvis det ikke lykkes at få den i kæden, vil dens tilstand ændres til "ikke accepteret", og den vil ikke kunne bruges. Dette kan ske nu og da, hvis en anden knude udvinder en blok inden for nogle få sekunder fra din. + Minede blackcoins skal modne %1 blokke, før de kan bruges. Da du genererede denne blok, blev den transmitteret til netværket for at blive føjet til blokkæden. Hvis det ikke lykkes at få den i kæden, vil dens tilstand ændres til "ikke accepteret", og den vil ikke kunne bruges. Dette kan ske nu og da, hvis en anden knude udvinder en blok inden for nogle få sekunder fra din. Debug information @@ -2867,7 +2867,7 @@ WalletModel Send Coins - Send bitcoins + Send blackcoins @@ -2937,7 +2937,7 @@ Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly. - Kontrollér venligst, at din computers dato og tid er korrekt! Hvis uret ikke passer, vil Bitcoin Core ikke fungere korrekt. + Kontrollér venligst, at din computers dato og tid er korrekt! Hvis uret ikke passer, vil Blackcoin Core ikke fungere korrekt. Prune configured below the minimum of %d MiB. Please use a higher number. @@ -3009,7 +3009,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - Ikke i stand til at tildele til %s på denne computer. Bitcoin Core kører sansynligvis allerede. + Ikke i stand til at tildele til %s på denne computer. Blackcoin Core kører sansynligvis allerede. Use UPnP to map the listening port (default: 1 when listening and no -proxy) @@ -3217,7 +3217,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - Kan ikke opnå en lås på datamappe %s. Bitcoin Core kører sansynligvis allerede. + Kan ikke opnå en lås på datamappe %s. Blackcoin Core kører sansynligvis allerede. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3317,11 +3317,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Ophavsret © 2009-%i Udviklerne af Bitcoin Core + Ophavsret © 2009-%i Udviklerne af Blackcoin Core Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Fejl ved indlæsning af wallet.dat: Tegnebog kræver en nyere version af Bitcoin Core + Fejl ved indlæsning af wallet.dat: Tegnebog kræver en nyere version af Blackcoin Core Error reading from database, shutting down. @@ -3337,7 +3337,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - Sundhedstjek under klargøring mislykkedes. Bitcoin Core lukker ned. + Sundhedstjek under klargøring mislykkedes. Blackcoin Core lukker ned. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3457,7 +3457,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - Det var nødvendigt at genskrive tegnebogen: genstart Bitcoin Core for at gennemføre + Det var nødvendigt at genskrive tegnebogen: genstart Blackcoin Core for at gennemføre Warning @@ -3581,7 +3581,7 @@ Generate coins (default: %u) - Generér bitcoins (standard: %u) + Generér blackcoins (standard: %u) How many blocks to check at startup (default: %u, 0 = all) diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts index d810ed12c..3d2a17678 100644 --- a/src/qt/locale/bitcoin_de.ts +++ b/src/qt/locale/bitcoin_de.ts @@ -47,11 +47,11 @@ Choose the address to send coins to - Wählen Sie die Adresse aus, an die Sie Bitcoins überweisen möchten + Wählen Sie die Adresse aus, an die Sie Blackcoins überweisen möchten Choose the address to receive coins with - Wählen Sie die Adresse aus, über die Sie Bitcoins empfangen wollen + Wählen Sie die Adresse aus, über die Sie Blackcoins empfangen wollen C&hoose @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Dies sind Ihre Bitcoin-Adressen zum Tätigen von Überweisungen. Bitte prüfen Sie den Betrag und die Empfangsadresse, bevor Sie Bitcoins überweisen. + Dies sind Ihre Blackcoin-Adressen zum Tätigen von Überweisungen. Bitte prüfen Sie den Betrag und die Empfangsadresse, bevor Sie Blackcoins überweisen. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Dies sind Ihre Bitcoin-Adressen zum Empfangen von Zahlungen. Es wird empfohlen für jede Transaktion eine neue Empfangsadresse zu verwenden. + Dies sind Ihre Blackcoin-Adressen zum Empfangen von Zahlungen. Es wird empfohlen für jede Transaktion eine neue Empfangsadresse zu verwenden. Copy &Label @@ -161,7 +161,7 @@ Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! - Warnung: Wenn Sie Ihre Wallet verschlüsseln und Ihre Passphrase verlieren, werden Sie <b>alle Ihre Bitcoins verlieren</b>! + Warnung: Wenn Sie Ihre Wallet verschlüsseln und Ihre Passphrase verlieren, werden Sie <b>alle Ihre Blackcoins verlieren</b>! Are you sure you wish to encrypt your wallet? @@ -169,7 +169,7 @@ Bitcoin Core 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. - Bitcoin Core wird jetzt beendet, um den Verschlüsselungsprozess abzuschließen. Vergessen Sie nicht, dass eine Wallet-Verschlüsselung nicht vollständig vor Diebstahl Ihrer Bitcoins durch Schadsoftware schützen kann, die Ihren Computer infiziert. + Blackcoin Lore wird jetzt beendet, um den Verschlüsselungsprozess abzuschließen. Vergessen Sie nicht, dass eine Wallet-Verschlüsselung nicht vollständig vor Diebstahl Ihrer Blackcoins durch Schadsoftware schützen kann, die Ihren Computer infiziert. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - "Bitcoin Core"-Client + "Blackcoin Lore"-Client Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Bitcoins an eine Bitcoin-Adresse überweisen + Blackcoins an eine Blackcoin-Adresse überweisen Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Informationen über Bitcoin Core anzeigen + Informationen über Blackcoin Lore anzeigen &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Nachrichten signieren, um den Besitz Ihrer Bitcoin-Adressen zu beweisen + Nachrichten signieren, um den Besitz Ihrer Blackcoin-Adressen zu beweisen Verify messages to ensure they were signed with specified Bitcoin addresses - Nachrichten verifizieren, um sicherzustellen, dass diese mit den angegebenen Bitcoin-Adressen signiert wurden + Nachrichten verifizieren, um sicherzustellen, dass diese mit den angegebenen Blackcoin-Adressen signiert wurden &File @@ -399,19 +399,19 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Request payments (generates QR codes and bitcoin: URIs) - Zahlungen anfordern (erzeugt QR-Codes und "bitcoin:"-URIs) + Zahlungen anfordern (erzeugt QR-Codes und "blackcoin:"-URIs) &About Bitcoin Core - &Über Bitcoin Core + &Über Blackcoin Lore Modify configuration options for Bitcoin Core - Konfiguration von Bitcoin Core bearbeiten + Konfiguration von Blackcoin Lore bearbeiten Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Eine "bitcoin:"-URI oder Zahlungsanforderung öffnen + Eine "blackcoin:"-URI oder Zahlungsanforderung öffnen &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Zeige den "Bitcoin Core"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten + Zeige den "Blackcoin Lore"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten %n active connection(s) to Bitcoin network - %n aktive Verbindung zum Bitcoin-Netzwerk%n aktive Verbindungen zum Bitcoin-Netzwerk + %n aktive Verbindung zum Blackcoin-Netzwerk%n aktive Verbindungen zum Blackcoin-Netzwerk No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - Die eingegebene Adresse "%1" ist keine gültige Bitcoin-Adresse. + Die eingegebene Adresse "%1" ist keine gültige Blackcoin-Adresse. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin Core + Blackcoin Lore version @@ -868,7 +868,7 @@ About Bitcoin Core - Über Bitcoin Core + Über Blackcoin Lore Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Willkommen zu Bitcoin Core. + Willkommen zu Blackcoin Lore. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Da Sie das Programm gerade zum ersten Mal starten, können Sie nun auswählen wo Bitcoin Core seine Daten ablegen soll. + Da Sie das Programm gerade zum ersten Mal starten, können Sie nun auswählen wo Blackcoin Lore seine Daten ablegen soll. 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. - Bitcoin Core wird eine Kopie der Blockkette herunterladen und speichern. Mindestens %1GB Daten werden in diesem Verzeichnis abgelegt und die Datenmenge wächst über die Zeit an. Auch die Wallet wird in diesem Verzeichnis abgelegt. + Blackcoin Lore wird eine Kopie der Blockkette herunterladen und speichern. Mindestens %1GB Daten werden in diesem Verzeichnis abgelegt und die Datenmenge wächst über die Zeit an. Auch die Wallet wird in diesem Verzeichnis abgelegt. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - Legt die Sprache der Benutzeroberfläche fest. Diese Einstellung wird erst nach einem Neustart von Bitcoin Core aktiv. + Legt die Sprache der Benutzeroberfläche fest. Diese Einstellung wird erst nach einem Neustart von Blackcoin Lore aktiv. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Bitcoin Core nach der Anmeldung am System automatisch starten. + Blackcoin Lore nach der Anmeldung am System automatisch starten. &Start Bitcoin Core on system login - &Bitcoin Core nach Systemanmeldung starten + &Blackcoin Lore nach Systemanmeldung starten (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Automatisch den Bitcoin-Clientport auf dem Router öffnen. Dies funktioniert nur, wenn Ihr Router UPnP unterstützt und dies aktiviert ist. + Automatisch den Blackcoin-Clientport auf dem Router öffnen. Dies funktioniert nur, wenn Ihr Router UPnP unterstützt und dies aktiviert ist. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Über einen SOCKS5-Proxy mit dem Bitcoin-Netzwerk verbinden. + Über einen SOCKS5-Proxy mit dem Blackcoin-Netzwerk verbinden. &Connect through SOCKS5 proxy (default proxy): @@ -1129,7 +1129,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - Über einen separaten SOCKS5 Proxy für Tor Services mit dem Bitcoint Netzwerk verbinden. + Über einen separaten SOCKS5 Proxy für Tor Services mit dem Blackcoint Netzwerk verbinden. Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1165,7 +1165,7 @@ Choose the default subdivision unit to show in the interface and when sending coins. - Wählen Sie die standardmäßige Untereinheit, die in der Benutzeroberfläche und beim Überweisen von Bitcoins angezeigt werden soll. + Wählen Sie die standardmäßige Untereinheit, die in der Benutzeroberfläche und beim Überweisen von Blackcoins angezeigt werden soll. Whether to show coin control features or not. @@ -1216,7 +1216,7 @@ 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. - 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. + Die angezeigten Informationen sind möglicherweise nicht mehr aktuell. Ihre Wallet wird automatisch synchronisiert, nachdem eine Verbindung zum Blackcoin-Netzwerk hergestellt wurde. Dieser Prozess ist jedoch derzeit noch nicht abgeschlossen. Watch-only: @@ -1315,7 +1315,7 @@ Cannot start bitcoin: click-to-pay handler - "bitcoin: Klicken-zum-Bezahlen"-Handler konnte nicht gestartet werden + "blackcoin: Klicken-zum-Bezahlen"-Handler konnte nicht gestartet werden Payment request fetch URL is invalid: %1 @@ -1323,7 +1323,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - URI kann nicht analysiert werden! Dies kann durch eine ungültige Bitcoin-Adresse oder fehlerhafte URI-Parameter verursacht werden. + URI kann nicht analysiert werden! Dies kann durch eine ungültige Blackcoin-Adresse oder fehlerhafte URI-Parameter verursacht werden. Payment request file handling @@ -1397,7 +1397,7 @@ Enter a Bitcoin address (e.g. %1) - Bitcoin-Adresse eingeben (z.B. %1) + Blackcoin-Adresse eingeben (z.B. %1) %1 d @@ -1519,7 +1519,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Öffnet die "Bitcoin Core"-Debugprotokolldatei aus dem aktuellen Datenverzeichnis. Dies kann bei großen Protokolldateien einige Sekunden dauern. + Öffnet die "Blackcoin Lore"-Debugprotokolldatei aus dem aktuellen Datenverzeichnis. Dies kann bei großen Protokolldateien einige Sekunden dauern. Received @@ -1679,7 +1679,7 @@ Welcome to the Bitcoin Core RPC console. - Willkommen in der "Bitcoin Core"-RPC-Konsole. + Willkommen in der "Blackcoin Lore"-RPC-Konsole. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1762,7 +1762,7 @@ 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. - Eine optionale Nachricht, die an die Zahlungsanforderung angehängt wird. Sie wird angezeigt, wenn die Anforderung geöffnet wird. Hinweis: Diese Nachricht wird nicht mit der Zahlung über das Bitcoin-Netzwerk gesendet. + Eine optionale Nachricht, die an die Zahlungsanforderung angehängt wird. Sie wird angezeigt, wenn die Anforderung geöffnet wird. Hinweis: Diese Nachricht wird nicht mit der Zahlung über das Blackcoin-Netzwerk gesendet. An optional label to associate with the new receiving address. @@ -1911,7 +1911,7 @@ SendCoinsDialog Send Coins - Bitcoins überweisen + Blackcoins überweisen Coin Control Features @@ -1995,7 +1995,7 @@ 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. - Nur die minimale Gebühr zu bezahlen ist so lange in Ordnung, wie weniger Transaktionsvolumen als Platz in den Blöcken vorhanden ist. Aber Vorsicht, diese Option kann dazu führen, dass Transaktionen nicht bestätigt werden, wenn mehr Bedarf an Bitcoin-Transaktionen besteht als das Netzwerk verarbeiten kann. + Nur die minimale Gebühr zu bezahlen ist so lange in Ordnung, wie weniger Transaktionsvolumen als Platz in den Blöcken vorhanden ist. Aber Vorsicht, diese Option kann dazu führen, dass Transaktionen nicht bestätigt werden, wenn mehr Bedarf an Blackcoin-Transaktionen besteht als das Netzwerk verarbeiten kann. (read the tooltip) @@ -2127,7 +2127,7 @@ 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. - 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. + Die Transaktion wurde abgelehnt! Dies kann passieren, wenn einige Blackcoins aus Ihrer Wallet bereits ausgegeben wurden. Beispielsweise weil Sie eine Kopie Ihrer wallet.dat genutzt, die Blackcoins dort ausgegeben haben und dies daher in der derzeit aktiven Wallet nicht vermerkt ist. A fee higher than %1 is considered an absurdly high fee. @@ -2155,7 +2155,7 @@ Warning: Invalid Bitcoin address - Warnung: Ungültige Bitcoin-Adresse + Warnung: Ungültige Blackcoin-Adresse (no label) @@ -2226,7 +2226,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Die Gebühr wird vom zu überweisenden Betrag abgezogen. Der Empfänger wird also weniger Bitcoins erhalten, als Sie im Betrags-Feld eingegeben haben. Falls mehrere Empfänger ausgewählt wurden, wird die Gebühr gleichmäßig verteilt. + Die Gebühr wird vom zu überweisenden Betrag abgezogen. Der Empfänger wird also weniger Blackcoins erhalten, als Sie im Betrags-Feld eingegeben haben. Falls mehrere Empfänger ausgewählt wurden, wird die Gebühr gleichmäßig verteilt. S&ubtract fee from amount @@ -2250,7 +2250,7 @@ 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. - Eine an die "bitcoin:"-URI angefügte Nachricht, die zusammen mit der Transaktion gespeichert wird. Hinweis: Diese Nachricht wird nicht über das Bitcoin-Netzwerk gesendet. + Eine an die "bitcoin:"-URI angefügte Nachricht, die zusammen mit der Transaktion gespeichert wird. Hinweis: Diese Nachricht wird nicht über das Blackcoin-Netzwerk gesendet. Pay To: @@ -2265,7 +2265,7 @@ ShutdownWindow Bitcoin Core is shutting down... - Bitcoin Core wird beendet... + Blackcoin Lore wird beendet... Do not shut down the computer until this window disappears. @@ -2284,11 +2284,11 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Sie können Nachrichten/Vereinbarungen mit Hilfe Ihrer Adressen signieren, um zu beweisen, dass Sie Bitcoins empfangen können, die an diese Adressen überwiesen werden. Seien Sie vorsichtig und signieren Sie nichts Vages oder Willkürliches, um Ihre Indentität vor Phishingangriffen zu schützen. Signieren Sie nur vollständig-detaillierte Aussagen, mit denen Sie auch einverstanden sind. + Sie können Nachrichten/Vereinbarungen mit Hilfe Ihrer Adressen signieren, um zu beweisen, dass Sie Blackcoins empfangen können, die an diese Adressen überwiesen werden. Seien Sie vorsichtig und signieren Sie nichts Vages oder Willkürliches, um Ihre Indentität vor Phishingangriffen zu schützen. Signieren Sie nur vollständig-detaillierte Aussagen, mit denen Sie auch einverstanden sind. The Bitcoin address to sign the message with - Die Bitcoin-Adresse mit der die Nachricht signiert wird + Die Blackcoin-Adresse mit der die Nachricht signiert wird Choose previously used address @@ -2320,7 +2320,7 @@ Sign the message to prove you own this Bitcoin address - Die Nachricht signieren, um den Besitz dieser Bitcoin-Adresse zu beweisen + Die Nachricht signieren, um den Besitz dieser Blackcoin-Adresse zu beweisen Sign &Message @@ -2344,11 +2344,11 @@ The Bitcoin address the message was signed with - Die Bitcoin-Adresse mit der die Nachricht signiert wurde + Die Blackcoin-Adresse mit der die Nachricht signiert wurde Verify the message to ensure it was signed with the specified Bitcoin address - Die Nachricht verifizieren, um sicherzustellen, dass diese mit der angegebenen Bitcoin-Adresse signiert wurde + Die Nachricht verifizieren, um sicherzustellen, dass diese mit der angegebenen Blackcoin-Adresse signiert wurde Verify &Message @@ -2415,11 +2415,11 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Lore The Bitcoin Core developers - Die "Bitcoin Core"-Entwickler + Die "Blackcoin Lore"-Entwickler [testnet] @@ -2545,7 +2545,7 @@ 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. - Erzeugte Bitcoins müssen %1 Blöcke lang reifen, bevor sie ausgegeben werden können. Als Sie diesen Block erzeugten, wurde er an das Netzwerk übertragen, um ihn der Blockkette hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und Sie werden keine Bitcoins gutgeschrieben bekommen. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block fast zeitgleich erzeugt. + Erzeugte Blackcoins müssen %1 Blöcke lang reifen, bevor sie ausgegeben werden können. Als Sie diesen Block erzeugten, wurde er an das Netzwerk übertragen, um ihn der Blockkette hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und Sie werden keine Blackcoins gutgeschrieben bekommen. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block fast zeitgleich erzeugt. Debug information @@ -2867,7 +2867,7 @@ WalletModel Send Coins - Bitcoins überweisen + Blackcoins überweisen @@ -2936,8 +2936,8 @@ Maximale Gesamtgebühr (in %s) in einer Börsentransaktion; wird dies zu niedrig gesetzten können große Transaktionen abgebrochen werden (Standard: %s) - Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly. - Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da Bitcoin Core ansonsten nicht ordnungsgemäß funktionieren wird. + Please check that your computer's date and time are correct! If your clock is wrong Blackcoin Core will not work properly. + Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da Blackcoin Lore ansonsten nicht ordnungsgemäß funktionieren wird. Prune configured below the minimum of %d MiB. Please use a higher number. @@ -3000,8 +3000,8 @@ Dies ist eine Vorab-Testversion - Verwendung auf eigene Gefahr - nicht für Mining- oder Handelsanwendungen nutzen! - Unable to bind to %s on this computer. Bitcoin Core is probably already running. - Kann auf diesem Computer nicht an %s binden, da Bitcoin Core wahrscheinlich bereits gestartet wurde. + Unable to bind to %s on this computer. Blackcoin Core is probably already running. + Kann auf diesem Computer nicht an %s binden, da Blackcoin Lore wahrscheinlich bereits gestartet wurde. Use UPnP to map the listening port (default: 1 when listening and no -proxy) @@ -3208,8 +3208,8 @@ 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) - Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - Datenverzeichnis %s kann nicht gesperrt werden, da Bitcoin Core wahrscheinlich bereits gestartet wurde. + Cannot obtain a lock on data directory %s. Blackcoin Core is probably already running. + Datenverzeichnis %s kann nicht gesperrt werden, da Blackcoin Lore wahrscheinlich bereits gestartet wurde. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3257,7 +3257,7 @@ Set the number of threads for coin generation if enabled (-1 = all cores, default: %d) - Maximale Anzahl an Threads zur Bitcoinerzeugung, wenn aktiviert, festlegen (-1 = alle Kerne, Standard: %d) + Maximale Anzahl an Threads zur Blackcoinerzeugung, wenn aktiviert, festlegen (-1 = alle Kerne, Standard: %d) The transaction amount is too small to send after the fee has been deducted @@ -3308,12 +3308,12 @@ Über einen SOCKS5-Proxy &verbinden - Copyright (C) 2009-%i The Bitcoin Core Developers - Urheberrecht (C) 2009-%i Die "Bitcoin Core"-Entwickler + Copyright (C) 2009-%i The Blackcoin Core Developers + Urheberrecht (C) 2014-%i Die "Blackcoin Lore"-Entwickler - Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Fehler beim Laden von wallet.dat: Wallet benötigt neuere Version von Bitcoin Core + Error loading wallet.dat: Wallet requires newer version of Blackcoin Core + Fehler beim Laden von wallet.dat: Wallet benötigt neuere Version von Blackcoin Lore Error reading from database, shutting down. @@ -3328,8 +3328,8 @@ Hinweis - Initialization sanity check failed. Bitcoin Core is shutting down. - Initialisierungsplausibilitätsprüfung fehlgeschlagen. Bitcoin Core wird beendet. + Initialization sanity check failed. Blackcoin Core is shutting down. + Initialisierungsplausibilitätsprüfung fehlgeschlagen. Blackcoin Lore wird beendet. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3448,8 +3448,8 @@ Benutzername für JSON-RPC-Verbindungen - Wallet needed to be rewritten: restart Bitcoin Core to complete - Wallet musste neu geschrieben werden: starten Sie Bitcoin Core zur Fertigstellung neu + Wallet needed to be rewritten: restart Blackcoin Core to complete + Wallet musste neu geschrieben werden: starten Sie Blackcoin Lore zur Fertigstellung neu Warning @@ -3569,7 +3569,7 @@ Generate coins (default: %u) - Bitcoins erzeugen (Standard: %u) + Blackcoins erzeugen (Standard: %u) How many blocks to check at startup (default: %u, 0 = all) diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts index c4daef4b9..0b3f88a2b 100644 --- a/src/qt/locale/bitcoin_en.ts +++ b/src/qt/locale/bitcoin_en.ts @@ -86,12 +86,12 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + These are your Blackcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - + These are your Blackcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. @@ -212,7 +212,7 @@ Bitcoin Core 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. - + Blackcoin Lore will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your blackcoins from being stolen by malware infecting your computer. @@ -391,7 +391,7 @@ Bitcoin Core client - + Blackcoin Lore client @@ -406,7 +406,7 @@ Send coins to a Bitcoin address - Send coins to a Bitcoin address + Send coins to a Blackcoin address @@ -436,7 +436,7 @@ Bitcoin - Bitcoin + Blackcoin @@ -456,7 +456,7 @@ Show information about Bitcoin Core - + Show information about Blackcoin Lore @@ -476,12 +476,12 @@ Sign messages with your Bitcoin addresses to prove you own them - Sign messages with your Bitcoin addresses to prove you own them + Sign messages with your Blackcoin addresses to prove you own them Verify messages to ensure they were signed with specified Bitcoin addresses - Verify messages to ensure they were signed with specified Bitcoin addresses + Verify messages to ensure they were signed with specified Blackcoin addresses @@ -506,22 +506,22 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Request payments (generates QR codes and bitcoin: URIs) - + Request payments (generates QR codes and blackcoin: URIs) &About Bitcoin Core - + &About Blackcoin Lore Modify configuration options for Bitcoin Core - + Modify configuration options for Blackcoin Lore @@ -536,7 +536,7 @@ Open a bitcoin: URI or payment request - + Open a blackcoin: URI or payment request @@ -546,14 +546,14 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - + Show the Blackcoin Lore help message to get a list with possible Blackcoin command-line options %n active connection(s) to Bitcoin network - %n active connection to Bitcoin network - %n active connections to Bitcoin network + %n active connection to Blackcoin network + %n active connections to Blackcoin network @@ -1042,7 +1042,7 @@ The entered address "%1" is not a valid Bitcoin address. - The entered address "%1" is not a valid Bitcoin address. + The entered address "%1" is not a valid Blackcoin address. @@ -1088,7 +1088,7 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore @@ -1104,7 +1104,7 @@ About Bitcoin Core - + About Blackcoin Lore @@ -1167,17 +1167,17 @@ Welcome to Bitcoin Core. - + Welcome to Bitcoin Lore. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - + As this is the first time the program is launched, you can choose where Blackcoin Lore will store its data. 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. - + Blackcoin Lore will download and store a copy of the Blackcoin 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. @@ -1192,7 +1192,7 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore @@ -1300,7 +1300,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - + The user interface language can be set here. This setting will take effect after restarting Blackcoin Lore. @@ -1336,12 +1336,12 @@ Automatically start Bitcoin Core after logging in to the system. - + Automatically start Blackcoin Lore after logging in to the system. &Start Bitcoin Core on system login - + &Start Blackcoin Lore on system login @@ -1376,7 +1376,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Automatically open the Blackcoin client port on the router. This only works when your router supports UPnP and it is enabled. @@ -1386,7 +1386,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - + Connect to the Blackcoin network through a SOCKS5 proxy. @@ -1441,7 +1441,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - + Connect to the Blackcoin network through a separate SOCKS5 proxy for Tor hidden services. @@ -1551,7 +1551,7 @@ 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. - 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. + The displayed information may be out of date. Your wallet automatically synchronizes with the Blackcoin network after a connection is established, but this process has not completed yet. @@ -1686,7 +1686,7 @@ Cannot start bitcoin: click-to-pay handler - + Cannot start blackcoin: click-to-pay handler @@ -1696,7 +1696,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - + URI cannot be parsed! This can be caused by an invalid Blackcoin address or malformed URI parameters. @@ -1788,7 +1788,7 @@ Enter a Bitcoin address (e.g. %1) - + Enter a Blackcoin address (e.g. %1) @@ -1963,7 +1963,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - + Open the Blackcoin Lore debug log file from the current data directory. This can take a few seconds for large log files. @@ -2171,7 +2171,7 @@ Welcome to the Bitcoin Core RPC console. - + Welcome to the Blackcoin Lore RPC console. @@ -2277,7 +2277,7 @@ 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. - + 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 Blackcoin network. @@ -2571,7 +2571,7 @@ 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. - + 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 blackcoin transactions than the network can process. @@ -2777,7 +2777,7 @@ Warning: Invalid Bitcoin address - + Warning: Invalid Blackcoin address @@ -2842,7 +2842,7 @@ The Bitcoin address to send the payment to - + The Blackcoin address to send the payment to @@ -2869,7 +2869,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - + The fee will be deducted from the amount being sent. The recipient will receive less blackcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. @@ -2899,7 +2899,7 @@ 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. - + A message that was attached to the blackcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Blackcoin network. @@ -2919,7 +2919,7 @@ Bitcoin Core is shutting down... - + Blackcoin Lore is shutting down... @@ -2942,12 +2942,12 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - + You can sign messages/agreements with your addresses to prove you can receive blackcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. The Bitcoin address to sign the message with - + The Blackcoin address to sign the message with @@ -2989,7 +2989,7 @@ Sign the message to prove you own this Bitcoin address - Sign the message to prove you own this Bitcoin address + Sign the message to prove you own this Blackcoin address @@ -3020,12 +3020,12 @@ The Bitcoin address the message was signed with - + The Blackcoin address the message was signed with Verify the message to ensure it was signed with the specified Bitcoin address - Verify the message to ensure it was signed with the specified Bitcoin address + Verify the message to ensure it was signed with the specified Blackcoin address @@ -3114,12 +3114,12 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore The Bitcoin Core developers - + The Blackcoin Lore developers @@ -3786,7 +3786,7 @@ Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly. - + Please check that your computer's date and time are correct! If your clock is wrong Blackcoin Lore will not work properly. @@ -3896,7 +3896,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - + Unable to bind to %s on this computer. Blackcoin Lore is probably already running. @@ -4191,7 +4191,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - + Cannot obtain a lock on data directory %s. Blackcoin Lore is probably already running. @@ -4311,12 +4311,12 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - + Copyright (C) 2014-%i The Blackcoin Lore Developers Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - + Error loading wallet.dat: Wallet requires newer version of Blackcoin Lore @@ -4336,7 +4336,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - + Initialization sanity check failed. Blackcoin Lore is shutting down. @@ -4486,7 +4486,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - + Wallet needed to be rewritten: restart Blackcoin Lore to complete diff --git a/src/qt/locale/bitcoin_en_GB.ts b/src/qt/locale/bitcoin_en_GB.ts index bf912d295..1602d4d43 100644 --- a/src/qt/locale/bitcoin_en_GB.ts +++ b/src/qt/locale/bitcoin_en_GB.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. + These are your Blackcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. + These are your Blackcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. Copy &Label @@ -161,7 +161,7 @@ Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! - Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! + Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BLACKCOINS</b>! Are you sure you wish to encrypt your wallet? @@ -169,7 +169,7 @@ Bitcoin Core 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. - Bitcoin Core 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. + Blackcoin Lore will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your blackcoins from being stolen by malware infecting your computer. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - Bitcoin Core client + Blackcoin Lore client Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Send coins to a Bitcoin address + Send coins to a Blackcoin address Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Show information about Bitcoin Core + Show information about Blackcoin Lore &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Sign messages with your Bitcoin addresses to prove you own them + Sign messages with your Blackcoin addresses to prove you own them Verify messages to ensure they were signed with specified Bitcoin addresses - Verify messages to ensure they were signed with specified Bitcoin addresses + Verify messages to ensure they were signed with specified Blackcoin addresses &File @@ -399,19 +399,19 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Request payments (generates QR codes and bitcoin: URIs) - Request payments (generates QR codes and bitcoin: URIs) + Request payments (generates QR codes and blackcoin: URIs) &About Bitcoin Core - &About Bitcoin Core + &About Blackcoin Lore Modify configuration options for Bitcoin Core - Modify configuration options for Bitcoin Core + Modify configuration options for Blackcoin Lore Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Open a bitcoin: URI or payment request + Open a blackcoin: URI or payment request &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options + Show the Blackcoin Lore help message to get a list with possible Blackcoin command-line options %n active connection(s) to Bitcoin network - %n active connection to Bitcoin network%n active connections to Bitcoin network + %n active connection to Blackcoin network%n active connections to Blackcoin network No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - The entered address "%1" is not a valid Bitcoin address. + The entered address "%1" is not a valid Blackcoin address. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin Core + Blackcoin Lore version @@ -868,7 +868,7 @@ About Bitcoin Core - About Bitcoin Core + About Blackcoin Lore Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Welcome to Bitcoin Core. + Welcome to Blackcoin Lore. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. + As this is the first time the program is launched, you can choose where Blackcoin Lore will store its data. 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. - 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. + Blackcoin Lore will download and store a copy of the Blackcoin 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. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. + The user interface language can be set here. This setting will take effect after restarting Blackcoin Lore. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Automatically start Bitcoin Core after logging in to the system. + Automatically start Blackcoin Lore after logging in to the system. &Start Bitcoin Core on system login - &Start Bitcoin Core on system login + &Start Blackcoin Lore on system login (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. + Automatically open the Blackcoin client port on the router. This only works when your router supports UPnP and it is enabled. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Connect to the Bitcoin network through a SOCKS5 proxy. + Connect to the Blackcoin network through a SOCKS5 proxy. &Connect through SOCKS5 proxy (default proxy): @@ -1129,7 +1129,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. + Connect to the Blackcoin network through a separate SOCKS5 proxy for Tor hidden services. Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1216,7 +1216,7 @@ 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. - The displayed information may be out of date. Your Wallet automatically synchronises with the Bitcoin Network after a connection is established, but this process has not been completed yet. + The displayed information may be out of date. Your Wallet automatically synchronises with the Blackcoin Network after a connection is established, but this process has not been completed yet. Watch-only: @@ -1315,7 +1315,7 @@ Cannot start bitcoin: click-to-pay handler - Cannot start bitcoin: click-to-pay handler + Cannot start blackcoin: click-to-pay handler Payment request fetch URL is invalid: %1 @@ -1323,7 +1323,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. + URI cannot be parsed! This can be caused by an invalid Blackcoin address or malformed URI parameters. Payment request file handling @@ -1397,7 +1397,7 @@ Enter a Bitcoin address (e.g. %1) - Enter a Bitcoin address (e.g. %1) + Enter a Blackcoin address (e.g. %1) %1 d @@ -1519,7 +1519,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. + Open the Blackcoin Lore debug log file from the current data directory. This can take a few seconds for large log files. Received @@ -1679,7 +1679,7 @@ Welcome to the Bitcoin Core RPC console. - Welcome to the Bitcoin Core RPC console. + Welcome to the Blackcoin Lore RPC console. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1762,7 +1762,7 @@ 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. - 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. + 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 Blackcoin network. An optional label to associate with the new receiving address. @@ -1995,7 +1995,7 @@ 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. - 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. + 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 blackcoin transactions than the network can process. (read the tooltip) @@ -2155,7 +2155,7 @@ Warning: Invalid Bitcoin address - Warning: Invalid Bitcoin address + Warning: Invalid Blackcoin address (no label) @@ -2206,7 +2206,7 @@ The Bitcoin address to send the payment to - The Bitcoin address to send the payment to + The Blackcoin address to send the payment to Alt+A @@ -2226,7 +2226,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. + The fee will be deducted from the amount being sent. The recipient will receive less blackcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. S&ubtract fee from amount @@ -2250,7 +2250,7 @@ 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. - 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. + A message that was attached to the blackcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Blackcoin network. Pay To: @@ -2265,7 +2265,7 @@ ShutdownWindow Bitcoin Core is shutting down... - Bitcoin Core is shutting down... + Blackcoin Lore is shutting down... Do not shut down the computer until this window disappears. @@ -2284,11 +2284,11 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + You can sign messages/agreements with your addresses to prove you can receive blackcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. The Bitcoin address to sign the message with - The Bitcoin address to sign the message with + The Blackcoin address to sign the message with Choose previously used address @@ -2320,7 +2320,7 @@ Sign the message to prove you own this Bitcoin address - Sign the message to prove you own this Bitcoin address + Sign the message to prove you own this Blackcoin address Sign &Message @@ -2344,11 +2344,11 @@ The Bitcoin address the message was signed with - The Bitcoin address the message was signed with + The Blackcoin address the message was signed with Verify the message to ensure it was signed with the specified Bitcoin address - Verify the message to ensure it was signed with the specified Bitcoin address + Verify the message to ensure it was signed with the specified Blackcoin address Verify &Message @@ -2415,11 +2415,11 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Lore The Bitcoin Core developers - The Bitcoin Core developers + The Blackcoin Lore developers [testnet] @@ -2937,7 +2937,7 @@ Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly. - Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly. + Please check that your computer's date and time are correct! If your clock is wrong Blackcoin Lore will not work properly. Prune configured below the minimum of %d MiB. Please use a higher number. @@ -3009,7 +3009,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - Unable to bind to %s on this computer. Bitcoin Core is probably already running. + Unable to bind to %s on this computer. Blackcoin Lore is probably already running. Use UPnP to map the listening port (default: 1 when listening and no -proxy) @@ -3217,7 +3217,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. + Cannot obtain a lock on data directory %s. Blackcoin Lore is probably already running. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3317,11 +3317,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i The Bitcoin Core Developers + Copyright (C) 2014-%i The Blackcoin Lore Developers Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Error loading wallet.dat: Wallet requires newer version of Bitcoin Core + Error loading wallet.dat: Wallet requires newer version of Blackcoin Lore Error reading from database, shutting down. @@ -3337,7 +3337,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - Initialisation sanity check failed. Bitcoin Core is shutting down. + Initialisation sanity check failed. Blackcoin Lore is shutting down. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3457,7 +3457,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - Wallet needed to be rewritten: restart Bitcoin Core to complete + Wallet needed to be rewritten: restart Blackcoin Lore to complete Warning diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts index 8fa15b892..e37501dd5 100644 --- a/src/qt/locale/bitcoin_fi.ts +++ b/src/qt/locale/bitcoin_fi.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Nämä ovat sinun Bitcoin osoitteita maksujen lähetykseen. Tarkista aina summa ja vastaanottajan osoite ennenkuin lähetät kolikkoja. + Nämä ovat sinun Blackcoin osoitteita maksujen lähetykseen. Tarkista aina summa ja vastaanottajan osoite ennenkuin lähetät kolikkoja. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Nämä ovat sinun Bitcoin-osoitteesi suoritusten vastaanottamiseen. Suositellaan että annat uuden osoitteen kullekin transaktiolle. + Nämä ovat sinun Blackcoin-osoitteesi suoritusten vastaanottamiseen. Suositellaan että annat uuden osoitteen kullekin transaktiolle. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Bitcoin Core sammuu nyt viimeistelläkseen kryptaamisen. Muista että lompakon kryptaaminen ei voi täysin suojata bitcoinejasi varkaudelta malwaren saastuttamalla tietokoneella. + Blackcoin Core sammuu nyt viimeistelläkseen kryptaamisen. Muista että lompakon kryptaaminen ei voi täysin suojata blackcoinejasi varkaudelta malwaren saastuttamalla tietokoneella. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - Bitcoin Core ohjelma + Blackcoin Core ohjelma Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Lähetä kolikoita Bitcoin-osoitteeseen + Lähetä kolikoita Blackcoin-osoitteeseen Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Näytä tietoja Bitcoin Core:sta + Näytä tietoja Blackcoin Core:sta &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Allekirjoita viestisi omalla Bitcoin -osoitteellasi todistaaksesi, että omistat ne + Allekirjoita viestisi omalla Blackcoin -osoitteellasi todistaaksesi, että omistat ne Verify messages to ensure they were signed with specified Bitcoin addresses - Varmista, että viestisi on allekirjoitettu määritetyllä Bitcoin -osoitteella + Varmista, että viestisi on allekirjoitettu määritetyllä Blackcoin -osoitteella &File @@ -399,19 +399,19 @@ Bitcoin Core - Bitcoin-ydin + Blackcoin-ydin Request payments (generates QR codes and bitcoin: URIs) - Pyydä maksuja (Luo QR koodit ja bitcoin: URIt) + Pyydä maksuja (Luo QR koodit ja blackcoin: URIt) &About Bitcoin Core - &Tietoja Bitcoin Core + &Tietoja Blackcoin Core Modify configuration options for Bitcoin Core - Muokkaa kokoonpanoasetuksia Bitcoin Corelle + Muokkaa kokoonpanoasetuksia Blackcoin Corelle Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Avaa bitcoin: URI tai maksupyyntö + Avaa blackcoin: URI tai maksupyyntö &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Näytä Bitcoin Core ohjeet saadaksesi listan mahdollisista Bitcoinin komentorivivalinnoista + Näytä Blackcoin Core ohjeet saadaksesi listan mahdollisista Blackcoinin komentorivivalinnoista %n active connection(s) to Bitcoin network - %n aktiivinen yhteys Bitcoin-verkkoon%n aktiivista yhteyttä Bitcoin-verkkoon + %n aktiivinen yhteys Blackcoin-verkkoon%n aktiivista yhteyttä Blackcoin-verkkoon No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - Antamasi osoite "%1" ei ole validi Bitcoin-osoite. + Antamasi osoite "%1" ei ole validi Blackcoin-osoite. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin-ydin + Blackcoin-ydin version @@ -868,7 +868,7 @@ About Bitcoin Core - Tietoja Bitcoin Core + Tietoja Blackcoin Core Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Tervetuloa Bitcoin Core + Tervetuloa Blackcoin Core As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Tämän on ensimmäinen kerta kun Bitcoin Core on käynnistetty joten voit valita data-hakemiston paikan. + Tämän on ensimmäinen kerta kun Blackcoin Core on käynnistetty joten voit valita data-hakemiston paikan. 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. - Bitcoin Core lataa ja tallentaa kopion Bitcoinin lohkoketjusta. Vähintään %1GB dataa tullaan tallentamaan tähän hakemistoon ja tarve kasvaa ajan myötä. Lomakko tullaan myös tallentamaan tähän hakemistoon. + Blackcoin Core lataa ja tallentaa kopion Blackcoinin lohkoketjusta. Vähintään %1GB dataa tullaan tallentamaan tähän hakemistoon ja tarve kasvaa ajan myötä. Lomakko tullaan myös tallentamaan tähän hakemistoon. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Bitcoin-ydin + Blackcoin-ydin Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - Käyttöliittymän kieli voidaan asettaa tässä. Tämä asetus tulee käyttöön vasta kun Bitcoin Core käynnistetään uudelleen. + Käyttöliittymän kieli voidaan asettaa tässä. Tämä asetus tulee käyttöön vasta kun Blackcoin Core käynnistetään uudelleen. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Käynnistä Bitcoin Core automaattisesti järjestelmään kirjautumisen jälkeen. + Käynnistä Blackcoin Core automaattisesti järjestelmään kirjautumisen jälkeen. &Start Bitcoin Core on system login - &Käynnistä Bitcoin Core järjestelmään kirjautuessa + &Käynnistä Blackcoin Core järjestelmään kirjautuessa (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Avaa Bitcoin-asiakasohjelman portti reitittimellä automaattisesti. Tämä toimii vain, jos reitittimesi tukee UPnP:tä ja se on käytössä. + Avaa Blackcoin-asiakasohjelman portti reitittimellä automaattisesti. Tämä toimii vain, jos reitittimesi tukee UPnP:tä ja se on käytössä. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Yhdistä Bitcoin-verkkoon SOCKS5-välityspalvelimen kautta. + Yhdistä Blackcoin-verkkoon SOCKS5-välityspalvelimen kautta. &Connect through SOCKS5 proxy (default proxy): @@ -1129,7 +1129,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - Yhdistä Bitcoin-verkkoon erillisen SOCKS5-välityspalvelimen kautta piilotettuja Tor-palveluja varten. + Yhdistä Blackcoin-verkkoon erillisen SOCKS5-välityspalvelimen kautta piilotettuja Tor-palveluja varten. Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1165,7 +1165,7 @@ Choose the default subdivision unit to show in the interface and when sending coins. - Valitse mitä yksikköä käytetään ensisijaisesti bitcoin-määrien näyttämiseen. + Valitse mitä yksikköä käytetään ensisijaisesti blackcoin-määrien näyttämiseen. Whether to show coin control features or not. @@ -1216,7 +1216,7 @@ 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. - 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. + Näytetyt tiedot eivät välttämättä ole ajantasalla. Lompakkosi synkronoituu Blackcoin-verkon kanssa automaattisesti yhteyden muodostamisen jälkeen, mutta synkronointi on vielä meneillään. Watch-only: @@ -1315,7 +1315,7 @@ Cannot start bitcoin: click-to-pay handler - Ei voida käynnistää bitcoin: klikkaa-maksu käsittelijää + Ei voida käynnistää blackcoin: klikkaa-maksu käsittelijää Payment request fetch URL is invalid: %1 @@ -1323,7 +1323,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - URIa ei voitu jäsentää! Tämä voi johtua kelvottomasta Bitcoin-osoitteesta tai virheellisistä URI parametreista. + URIa ei voitu jäsentää! Tämä voi johtua kelvottomasta Blackcoin-osoitteesta tai virheellisistä URI parametreista. Payment request file handling @@ -1397,7 +1397,7 @@ Enter a Bitcoin address (e.g. %1) - Syötä Bitcoin-osoite (esim. %1) + Syötä Blackcoin-osoite (esim. %1) %1 d @@ -1519,7 +1519,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Avaa Bitcoin Coren debug-loki tämänhetkisestä datahakemistosta. Tämä voi viedä muutaman sekunnin suurille lokitiedostoille. + Avaa Blackcoin Coren debug-loki tämänhetkisestä datahakemistosta. Tämä voi viedä muutaman sekunnin suurille lokitiedostoille. Received @@ -1679,7 +1679,7 @@ Welcome to the Bitcoin Core RPC console. - Tervetuloa Bitcoin Coren RPC-konsoliin. + Tervetuloa Blackcoin Coren RPC-konsoliin. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1762,7 +1762,7 @@ 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. - Valinnainen viesti liitetään maksupyyntöön ja näytetään avattaessa. Viestiä ei lähetetä Bitcoin-verkkoon. + Valinnainen viesti liitetään maksupyyntöön ja näytetään avattaessa. Viestiä ei lähetetä Blackcoin-verkkoon. An optional label to associate with the new receiving address. @@ -2059,7 +2059,7 @@ Confirm send coins - Hyväksy Bitcoinien lähettäminen + Hyväksy Blackcoinien lähettäminen %1 to %2 @@ -2103,7 +2103,7 @@ The amount to pay must be larger than 0. - Maksettavan summan tulee olla suurempi kuin 0 Bitcoinia. + Maksettavan summan tulee olla suurempi kuin 0 Blackcoinia. The amount exceeds your balance. @@ -2147,7 +2147,7 @@ Warning: Invalid Bitcoin address - Varoitus: Virheellinen Bitcoin osoite + Varoitus: Virheellinen Blackcoin osoite (no label) @@ -2198,7 +2198,7 @@ The Bitcoin address to send the payment to - Bitcoin-osoite johon maksu lähetetään + Blackcoin-osoite johon maksu lähetetään Alt+A @@ -2238,7 +2238,7 @@ 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. - Viesti joka liitettiin bitcoin: URI:iin tallennetaan rahansiirtoon viitteeksi. Tätä viestiä ei lähetetä Bitcoin-verkkoon. + Viesti joka liitettiin blackcoin: URI:iin tallennetaan rahansiirtoon viitteeksi. Tätä viestiä ei lähetetä Blackcoin-verkkoon. Pay To: @@ -2253,7 +2253,7 @@ ShutdownWindow Bitcoin Core is shutting down... - Bitcoin core sulkeutuu... + Blackcoin core sulkeutuu... Do not shut down the computer until this window disappears. @@ -2272,7 +2272,7 @@ The Bitcoin address to sign the message with - Bitcoin-osoite jolla viesti allekirjoitetaan + Blackcoin-osoite jolla viesti allekirjoitetaan Choose previously used address @@ -2304,7 +2304,7 @@ Sign the message to prove you own this Bitcoin address - Allekirjoita viesti todistaaksesi, että omistat tämän Bitcoin-osoitteen + Allekirjoita viesti todistaaksesi, että omistat tämän Blackcoin-osoitteen Sign &Message @@ -2324,11 +2324,11 @@ The Bitcoin address the message was signed with - Bitcoin-osoite jolla viesti on allekirjoitettu + Blackcoin-osoite jolla viesti on allekirjoitettu Verify the message to ensure it was signed with the specified Bitcoin address - Tarkista viestin allekirjoitus varmistaaksesi, että se allekirjoitettiin tietyllä Bitcoin-osoitteella + Tarkista viestin allekirjoitus varmistaaksesi, että se allekirjoitettiin tietyllä Blackcoin-osoitteella Verify &Message @@ -2395,11 +2395,11 @@ SplashScreen Bitcoin Core - Bitcoin-ydin + Blackcoin-ydin The Bitcoin Core developers - Bitcoin Core kehittäjät + Blackcoin Core kehittäjät [testnet] @@ -2945,7 +2945,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - Ei voida yhdistää %s tässä tietokoneessa. Bitcoin Core on luultavasti jo käynnissä. + Ei voida yhdistää %s tässä tietokoneessa. Blackcoin Core on luultavasti jo käynnissä. Use UPnP to map the listening port (default: 1 when listening and no -proxy) @@ -3105,7 +3105,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - Ei voida lukita data-hakemistoa %s. Bitcoin Core on luultavasti jo käynnissä. + Ei voida lukita data-hakemistoa %s. Blackcoin Core on luultavasti jo käynnissä. Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message) @@ -3145,11 +3145,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i Bitcoin kehittäjät + Copyright (C) 2014-%i Blackcoin kehittäjät Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Virhe ladattaessa wallet.dat-tiedostoa: Tarvitset uudemman version Bitcoinista + Virhe ladattaessa wallet.dat-tiedostoa: Tarvitset uudemman version Blackcoinista Error reading from database, shutting down. @@ -3249,7 +3249,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - Lompakko tarvitsee uudelleenkirjoittaa: käynnistä Bitcoin uudelleen + Lompakko tarvitsee uudelleenkirjoittaa: käynnistä Blackcoin uudelleen Warning diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts index a0b9feb9a..01ad88188 100644 --- a/src/qt/locale/bitcoin_fr.ts +++ b/src/qt/locale/bitcoin_fr.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Voici vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l'adresse du destinataire avant d'envoyer des pièces. + Voici vos adresses Blackcoin pour envoyer des paiements. Vérifiez toujours le montant et l'adresse du destinataire avant d'envoyer des pièces. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Voici vos adresses Bitcoin pour recevoir des paiements. Il est recommandé d'utiliser une nouvelle adresse de réception pour chaque transaction. + Voici vos adresses Blackcoin pour recevoir des paiements. Il est recommandé d'utiliser une nouvelle adresse de réception pour chaque transaction. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Bitcoin Core va maintenant se fermer pour terminer le processus de chiffrement. Souvenez-vous que le chiffrement de votre portefeuille ne peut pas vous protéger complètement contre le vol de vos bitcoins par des programmes malveillants infectant votre ordinateur. + Blackcoin Lore va maintenant se fermer pour terminer le processus de chiffrement. Souvenez-vous que le chiffrement de votre portefeuille ne peut pas vous protéger complètement contre le vol de vos blackcoins par des programmes malveillants infectant votre ordinateur. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - Client Bitcoin Core + Client Blackcoin Lore Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Envoyer des pièces à une adresse Bitcoin + Envoyer des pièces à une adresse Blackcoin Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Montrer des informations à propos de Bitcoin Core + Montrer des informations à propos de Blackcoin Lore &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Signer les messages avec vos adresses Bitcoin pour prouver que vous les détenez + Signer les messages avec vos adresses Blackcoin pour prouver que vous les détenez Verify messages to ensure they were signed with specified Bitcoin addresses - Vérifier les messages pour vous assurer qu'ils ont été signés avec les adresses Bitcoin spécifiées + Vérifier les messages pour vous assurer qu'ils ont été signés avec les adresses Blackcoin spécifiées &File @@ -399,19 +399,19 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Request payments (generates QR codes and bitcoin: URIs) - Demander des paiements (génère des codes QR et des URIs bitcoin:) + Demander des paiements (génère des codes QR et des URIs blackcoin:) &About Bitcoin Core - À &propos de Bitcoin Core + À &propos de Blackcoin Lore Modify configuration options for Bitcoin Core - Modifier les options de configuration de Bitcoin Core + Modifier les options de configuration de Blackcoin Lore Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Ouvrir un URI bitcoin: ou une demande de paiement + Ouvrir un URI blackcoin: ou une demande de paiement &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Afficher le message d'aide de Bitcoin Core pour obtenir une liste des options de ligne de commande Bitcoin possibles. + Afficher le message d'aide de Blackcoin Lore pour obtenir une liste des options de ligne de commande Blackcoin possibles. %n active connection(s) to Bitcoin network - %n connexion active avec le réseau Bitcoin%n connexions actives avec le réseau Bitcoin + %n connexion active avec le réseau Blackcoin%n connexions actives avec le réseau Blackcoin No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - L'adresse fournie « %1 » n'est pas une adresse Bitcoin valide. + L'adresse fournie « %1 » n'est pas une adresse Blackcoin valide. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin Core + Blackcoin Lore version @@ -868,7 +868,7 @@ About Bitcoin Core - À propos de Bitcoin Core + À propos de Blackcoin Lore Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Bienvenue à Bitcoin Core. + Bienvenue à Blackcoin Lore. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Comme c'est la première fois que le logiciel est lancé, vous pouvez choisir où Bitcoin Core stockera ses données. + Comme c'est la première fois que le logiciel est lancé, vous pouvez choisir où Blackcoin Lore stockera ses données. 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. - Bitcoin Core va télécharger et stocker une copie de la chaîne de blocs Bitcoin. Au moins %1Go de données seront stockées dans ce répertoire et cela augmentera avec le temps. Le portefeuille sera également stocké dans ce répertoire. + Blackcoin Lore va télécharger et stocker une copie de la chaîne de blocs Blackcoin. Au moins %1Go de données seront stockées dans ce répertoire et cela augmentera avec le temps. Le portefeuille sera également stocké dans ce répertoire. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - La langue de l'interface utilisateur peut être définie ici. Ce réglage sera pris en compte après redémarrage de Bitcoin. + La langue de l'interface utilisateur peut être définie ici. Ce réglage sera pris en compte après redémarrage de Blackcoin. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Démarrer Bitcoin Core automatiquement après avoir ouvert une session sur le système. + Démarrer Blackcoin Lore automatiquement après avoir ouvert une session sur le système. &Start Bitcoin Core on system login - &Démarrer Bitcoin Core lors de l'ouverture d'une session + &Démarrer Blackcoin Lore lors de l'ouverture d'une session (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Ouvrir le port du client Bitcoin automatiquement sur le routeur. Ceci ne fonctionne que si votre routeur supporte l'UPnP et si la fonctionnalité est activée. + Ouvrir le port du client Blackcoin automatiquement sur le routeur. Ceci ne fonctionne que si votre routeur supporte l'UPnP et si la fonctionnalité est activée. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Se connecter au réseau Bitcoin par un mandataire SOCKS5. + Se connecter au réseau Blackcoin par un mandataire SOCKS5. &Connect through SOCKS5 proxy (default proxy): @@ -1129,7 +1129,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - Se connecter au réseau Bitcoin au travers d'un mandataire SOCKS5 séparé pour les services cachés de Tor. + Se connecter au réseau Blackcoin au travers d'un mandataire SOCKS5 séparé pour les services cachés de Tor. Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1216,7 +1216,7 @@ 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. - 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é. + Les informations affichées peuvent être obsolètes. Votre portefeuille est automatiquement synchronisé avec le réseau Blackcoin lorsque la connexion s'établit, or ce processus n'est pas encore terminé. Watch-only: @@ -1315,7 +1315,7 @@ Cannot start bitcoin: click-to-pay handler - Impossible de démarrer le gestionnaire de cliquer-pour-payer bitcoin : + Impossible de démarrer le gestionnaire de cliquer-pour-payer blackcoin : Payment request fetch URL is invalid: %1 @@ -1323,7 +1323,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - L'URI ne peut pas être analysé ! Ceci peut être causé par une adresse Bitcoin invalide ou par des paramètres d'URI mal formés. + L'URI ne peut pas être analysé ! Ceci peut être causé par une adresse Blackcoin invalide ou par des paramètres d'URI mal formés. Payment request file handling @@ -1397,7 +1397,7 @@ Enter a Bitcoin address (e.g. %1) - Saisir une adresse Bitcoin (p. ex. %1) + Saisir une adresse Blackcoin (p. ex. %1) %1 d @@ -1679,7 +1679,7 @@ Welcome to the Bitcoin Core RPC console. - Bienvenue dans le console RPC de Bitcoin Core. + Bienvenue dans le console RPC de Blackcoin Lore. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1762,7 +1762,7 @@ 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. - Un message optionnel à joindre à la demande de paiement qui sera affiché à l'ouverture de celle-ci. Note : le message ne sera pas envoyé avec le paiement par le réseau Bitcoin. + Un message optionnel à joindre à la demande de paiement qui sera affiché à l'ouverture de celle-ci. Note : le message ne sera pas envoyé avec le paiement par le réseau Blackcoin. An optional label to associate with the new receiving address. @@ -2155,7 +2155,7 @@ Warning: Invalid Bitcoin address - Avertissement : adresse Bitcoin invalide + Avertissement : adresse Blackcoin invalide (no label) @@ -2206,7 +2206,7 @@ The Bitcoin address to send the payment to - L'adresse Bitcoin à laquelle envoyer le paiement + L'adresse Blackcoin à laquelle envoyer le paiement Alt+A @@ -2226,7 +2226,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Les frais seront déduits du montant envoyé. Le destinataire recevra moins de bitcoins que le montant saisi dans le champ de montant. Si plusieurs destinataires sont sélectionnés, les frais seront partagés également.. + Les frais seront déduits du montant envoyé. Le destinataire recevra moins de blackcoins que le montant saisi dans le champ de montant. Si plusieurs destinataires sont sélectionnés, les frais seront partagés également.. S&ubtract fee from amount @@ -2250,7 +2250,7 @@ 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. - Un message qui était joint à l'URI Bitcoin et qui sera stocké avec la transaction pour référence. Note : ce message ne sera pas envoyé par le réseau Bitcoin. + Un message qui était joint à l'URI Blackcoin et qui sera stocké avec la transaction pour référence. Note : ce message ne sera pas envoyé par le réseau Bitcoin. Pay To: @@ -2265,7 +2265,7 @@ ShutdownWindow Bitcoin Core is shutting down... - Arrêt de Bitcoin Core... + Arrêt de Blackcoin Lore... Do not shut down the computer until this window disappears. @@ -2284,11 +2284,11 @@ You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - Vous pouvez signer des messages/accords avec vos adresses pour prouver que vous pouvez recevoir des bitcoins à ces dernières. Faites attention de ne rien signer de vague ou au hasard, car des attaques d'hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l'usurper. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous êtes d'accord. + Vous pouvez signer des messages/accords avec vos adresses pour prouver que vous pouvez recevoir des blackcoins à ces dernières. Faites attention de ne rien signer de vague ou au hasard, car des attaques d'hameçonnage pourraient essayer de vous faire signer avec votre identité afin de l'usurper. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous êtes d'accord. The Bitcoin address to sign the message with - L'adresse Bitcoin avec laquelle signer le message + L'adresse Blackcoin avec laquelle signer le message Choose previously used address @@ -2344,11 +2344,11 @@ The Bitcoin address the message was signed with - L'adresse Bitcoin avec laquelle le message a été signé + L'adresse Blackcoin avec laquelle le message a été signé Verify the message to ensure it was signed with the specified Bitcoin address - Vérifier le message pour vous assurer qu'il a bien été signé par l'adresse Bitcoin spécifiée + Vérifier le message pour vous assurer qu'il a bien été signé par l'adresse Blackcoin spécifiée Verify &Message @@ -2415,11 +2415,11 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Lore The Bitcoin Core developers - Les développeurs Bitcoin Core + Les développeurs Blackcoin Lore [testnet] @@ -2937,7 +2937,7 @@ Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly. - Veuillez vérifier que l'heure et la date de votre ordinateur sont justes ! Si votre horloge n'est pas à l'heure, Bitcoin Core ne fonctionnera pas correctement. + Veuillez vérifier que l'heure et la date de votre ordinateur sont justes ! Si votre horloge n'est pas à l'heure, Blackcoin Lore ne fonctionnera pas correctement. Prune configured below the minimum of %d MiB. Please use a higher number. @@ -3009,7 +3009,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - Impossible de se lier à %s sur cet ordinateur. Bitcoin Core fonctionne probablement déjà. + Impossible de se lier à %s sur cet ordinateur. Blackcoin Lore fonctionne probablement déjà. Use UPnP to map the listening port (default: 1 when listening and no -proxy) @@ -3217,7 +3217,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - Impossible d’obtenir un verrou sur le répertoire de données %s. Bitcoin Core fonctionne probablement déjà. + Impossible d’obtenir un verrou sur le répertoire de données %s. Blackcoin Lore fonctionne probablement déjà. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3317,11 +3317,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright © 2009-%i Les développeurs de Bitcoin Core + Copyright © 2014-%i Les développeurs de Blackcoin Lore Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Erreur lors du chargement de wallet.dat : le portefeuille exige une version plus récente de Bitcoin Core + Erreur lors du chargement de wallet.dat : le portefeuille exige une version plus récente de Blackcoin Lore Error reading from database, shutting down. @@ -3337,7 +3337,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - L'initialisation du test de cohérence a échoué. Bitcoin est en cours de fermeture. + L'initialisation du test de cohérence a échoué. Blackcoin est en cours de fermeture. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3457,7 +3457,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - Le portefeuille avait besoin d'être réécrit : veuillez redémarrer Bitcoin Core pour terminer + Le portefeuille avait besoin d'être réécrit : veuillez redémarrer Blackcoin Lore pour terminer Warning diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts index 413dc2185..23016f36d 100644 --- a/src/qt/locale/bitcoin_hr.ts +++ b/src/qt/locale/bitcoin_hr.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Ovo su vaše Bitcoin adrese za slanje novca. Uvijek provjerite iznos i adresu primatelja prije slanja novca. + Ovo su vaše Blackcoin adrese za slanje novca. Uvijek provjerite iznos i adresu primatelja prije slanja novca. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Ovo su vaše Bitcoin adrese za primanje novca. Preporučamo da koristite novu adresu za primanje za svaku transakciju. + Ovo su vaše Blackcoin adrese za primanje novca. Preporučamo da koristite novu adresu za primanje za svaku transakciju. Copy &Label @@ -295,7 +295,7 @@ Bitcoin Core client - Bitcoin Core klijent + Blackcoin Lore klijent Importing blocks from disk... @@ -307,7 +307,7 @@ Send coins to a Bitcoin address - Slanje novca na bitcoin adresu + Slanje novca na blackcoin adresu Backup wallet to another location @@ -331,7 +331,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -347,7 +347,7 @@ Show information about Bitcoin Core - Prikaži informacije o programu Bitcoin Core + Prikaži informacije o programu Blackcoin Lore &Show / Hide @@ -363,11 +363,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Poruku potpišemo s bitcoin adresom, kako bi dokazali vlasništvo nad tom adresom + Poruku potpišemo s blackcoin adresom, kako bi dokazali vlasništvo nad tom adresom Verify messages to ensure they were signed with specified Bitcoin addresses - Provjeravanje poruke, kao dokaz, da je potpisana navedenom bitcoin adresom + Provjeravanje poruke, kao dokaz, da je potpisana navedenom blackcoin adresom &File @@ -387,15 +387,15 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Request payments (generates QR codes and bitcoin: URIs) - Zatraži uplatu (stvara QR kod i bitcoin: URI adresu) + Zatraži uplatu (stvara QR kod i blackcoin: URI adresu) &About Bitcoin Core - &O programu Bitcoin Core + &O programu Blackcoin Lore Modify configuration options for Bitcoin Core @@ -411,7 +411,7 @@ Open a bitcoin: URI or payment request - Otvori bitcoin: URI adresu ili zahtjev za uplatu + Otvori blackcoin: URI adresu ili zahtjev za uplatu &Command-line options @@ -423,7 +423,7 @@ %n active connection(s) to Bitcoin network - %n aktivna veza na Bitcoin mrežu%n aktivnih veza na Bitcoin mrežu%n aktivnih veza na Bitcoin mrežu + %n aktivna veza na Blackcoin mrežu%n aktivnih veza na Blackcoin mrežu%n aktivnih veza na Blackcoin mrežu Processed %n block(s) of transaction history. @@ -686,11 +686,11 @@ The label associated with this address list entry - Oznaka bitcoin adrese + Oznaka blackcoin adrese The address associated with this address list entry. This can only be modified for sending addresses. - Bitcoin adresa. Izmjene adrese su moguće samo za adrese za slanje. + Blackcoin adresa. Izmjene adrese su moguće samo za adrese za slanje. &Address @@ -718,7 +718,7 @@ The entered address "%1" is not a valid Bitcoin address. - Upisana adresa "%1" nije valjana bitcoin adresa. + Upisana adresa "%1" nije valjana blackcoin adresa. Could not unlock wallet. @@ -748,7 +748,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin Core + Blackcoin Lore version @@ -760,7 +760,7 @@ About Bitcoin Core - O programu Bitcoin Core + O programu Blackcoin Lore Command-line options @@ -783,11 +783,11 @@ Welcome to Bitcoin Core. - Dobrodošli u programu Bitcoin Core. + Dobrodošli u programu Blackcoin Lore. Bitcoin Core - Bitcoin Core + Blackcoin Lore Error @@ -881,7 +881,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Automatski otvori port Bitcoin klijenta na ruteru. To radi samo ako ruter podržava UPnP i ako je omogućen. + Automatski otvori port Blackcoin klijenta na ruteru. To radi samo ako ruter podržava UPnP i ako je omogućen. Map port using &UPnP @@ -929,7 +929,7 @@ Choose the default subdivision unit to show in the interface and when sending coins. - Izaberite željeni najmanji dio bitcoina koji će biti prikazan u sučelju i koji će se koristiti za plaćanje. + Izaberite željeni najmanji dio blackcoina koji će biti prikazan u sučelju i koji će se koristiti za plaćanje. &OK @@ -956,7 +956,7 @@ 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. - 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. + Prikazani podatci mogu biti zastarjeli. Vaš novčanik se automatski sinkronizira s Blackcoin mrežom kada je veza uspostavljena, ali taj proces još nije završen. Total: @@ -1087,7 +1087,7 @@ Welcome to the Bitcoin Core RPC console. - Dobrodošli u Bitcoin RPC konzolu. + Dobrodošli u Blackcoin RPC konzolu. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1407,7 +1407,7 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Lore [testnet] diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts index c652f07e4..6a53014eb 100644 --- a/src/qt/locale/bitcoin_hu.ts +++ b/src/qt/locale/bitcoin_hu.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Ezekről a címekről küldhetsz bitcoint. Mindig ellenőrizd a fogadó címet és a fizetendő összeget, mielőtt elküldöd. + Ezekről a címekről küldhetsz blackcoint. Mindig ellenőrizd a fogadó címet és a fizetendő összeget, mielőtt elküldöd. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Ezekkel a címekkel fogadhatsz bitcoint. Ajánlott minden tranzakcióhoz egy új fogadó címet használni. + Ezekkel a címekkel fogadhatsz blackcoint. Ajánlott minden tranzakcióhoz egy új fogadó címet használni. Copy &Label @@ -295,7 +295,7 @@ Bitcoin Core client - Bitcoin Core kliens + Blackcoin Lore kliens Importing blocks from disk... @@ -307,7 +307,7 @@ Send coins to a Bitcoin address - Bitcoin küldése megadott címre + Blackcoin küldése megadott címre Backup wallet to another location @@ -331,7 +331,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -347,7 +347,7 @@ Show information about Bitcoin Core - Bitcoin Core információ megjelenítése + Blackcoin Lore információ megjelenítése &Show / Hide @@ -363,11 +363,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Üzenetek aláírása a Bitcoin-címmeiddel, amivel bizonyítod, hogy a cím a sajátod + Üzenetek aláírása a Blackcoin-címmeiddel, amivel bizonyítod, hogy a cím a sajátod Verify messages to ensure they were signed with specified Bitcoin addresses - Üzenetek ellenőrzése, hogy valóban a megjelölt Bitcoin-címekkel vannak-e aláírva + Üzenetek ellenőrzése, hogy valóban a megjelölt Blackcoin-címekkel vannak-e aláírva &File @@ -387,19 +387,19 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Request payments (generates QR codes and bitcoin: URIs) - Fizetési kérelem (QR-kódot és "bitcoin:" URI azonosítót hoz létre) + Fizetési kérelem (QR-kódot és "blackcoin:" URI azonosítót hoz létre) &About Bitcoin Core - &A Bitcoin Core-ról + &A Blackcoin Lore-ról Modify configuration options for Bitcoin Core - Konfigurációs opciók módosítása a Bitcoin Core-hoz + Konfigurációs opciók módosítása a Blackcoin Lore-hoz Show the list of used sending addresses and labels @@ -411,7 +411,7 @@ Open a bitcoin: URI or payment request - "bitcoin:" URI azonosító vagy fizetési kérelem megnyitása + "blackcoin:" URI azonosító vagy fizetési kérelem megnyitása &Command-line options @@ -419,11 +419,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - A Bitcoin Core súgóüzenet megjelenítése a Bitcoin lehetséges parancssori kapcsolóival. + A Blackcoin Lore súgóüzenet megjelenítése a Blackcoin lehetséges parancssori kapcsolóival. %n active connection(s) to Bitcoin network - %n aktív kapcsolat a Bitcoin hálózathoz%n aktív kapcsolat a Bitcoin hálózathoz + %n aktív kapcsolat a Blackcoin hálózathoz%n aktív kapcsolat a Blackcoin hálózathoz No block source available... @@ -806,7 +806,7 @@ The entered address "%1" is not a valid Bitcoin address. - A megadott "%1" cím nem egy érvényes Bitcoin-cím. + A megadott "%1" cím nem egy érvényes Blackcoin-cím. Could not unlock wallet. @@ -840,7 +840,7 @@ HelpMessageDialog Bitcoin Core - Bitcoin Core + Blackcoin Lore version @@ -852,7 +852,7 @@ About Bitcoin Core - A Bitcoin Core-ról + A Blackcoin Lore-ról Command-line options @@ -875,11 +875,11 @@ Welcome to Bitcoin Core. - Üdvözlünk a Bitcoin Core-ban. + Üdvözlünk a Blackcoin Lore-ban. 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. - A Bitcoin Core le fogja tölteni és tárolni fogja a Bitcoin blokklánc egy másolatát. Legalább %1GB adat lesz tárolva ebben a mappában, és ez folyamatosan nőni fog. A tárca szintén itt lesz tárolva. + A Blackcoin Lore le fogja tölteni és tárolni fogja a Blackcoin blokklánc egy másolatát. Legalább %1GB adat lesz tárolva ebben a mappában, és ez folyamatosan nőni fog. A tárca szintén itt lesz tárolva. Use the default data directory @@ -891,7 +891,7 @@ Bitcoin Core - Bitcoin Core + Blackcoin Lore Error: Specified data directory "%1" cannot be created. @@ -961,7 +961,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - Itt beállíthatod a kezelőfelület nyelvét. A beállítás a Bitcoin újraindítása után lép érvénybe. + Itt beállíthatod a kezelőfelület nyelvét. A beállítás a Blackcoin újraindítása után lép érvénybe. Third party transaction URLs @@ -981,7 +981,7 @@ &Start Bitcoin Core on system login - A Bitcoin elindítása bejelentkezéskor + A Blackcoin elindítása bejelentkezéskor W&allet @@ -993,7 +993,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - A Bitcoin-kliens portjának automatikus megnyitása a routeren. Ez csak akkor működik, ha a routered támogatja az UPnP-t és az engedélyezve is van rajta. + A Blackcoin-kliens portjának automatikus megnyitása a routeren. Ez csak akkor működik, ha a routered támogatja az UPnP-t és az engedélyezve is van rajta. Map port using &UPnP @@ -1001,7 +1001,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Csatlakozás a Bitcoin hálózatához SOCKS5 proxyn keresztül + Csatlakozás a Blackcoin hálózatához SOCKS5 proxyn keresztül Proxy &IP: @@ -1096,7 +1096,7 @@ 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. - 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. + A kijelzett információ lehet, hogy elavult. A pénztárcája automatikusan szinkronizálja magát a Blackcoin hálózattal miután a kapcsolat létrejön, de ez e folyamat még nem fejeződött be. Watch-only: @@ -1155,7 +1155,7 @@ Cannot start bitcoin: click-to-pay handler - A bitcoint nem lehet elindítani: click-to-pay handler + A blackcoint nem lehet elindítani: click-to-pay handler Payment request expired. @@ -1185,7 +1185,7 @@ Enter a Bitcoin address (e.g. %1) - Ad meg egy Bitcoin címet (pl: %1) + Ad meg egy Blackcoin címet (pl: %1) %1 d @@ -1759,7 +1759,7 @@ Warning: Invalid Bitcoin address - Figyelmeztetés: Érvénytelen Bitcoin cím + Figyelmeztetés: Érvénytelen Blackcoin cím (no label) @@ -1830,7 +1830,7 @@ ShutdownWindow Bitcoin Core is shutting down... - A Bitcoin Core leáll... + A Blackcoin Lore leáll... Do not shut down the computer until this window disappears. @@ -1936,11 +1936,11 @@ SplashScreen Bitcoin Core - Bitcoin Core + Blackcoin Lore The Bitcoin Core developers - A Bitcoin Core fejlesztői + A Blackcoin Lore fejlesztői [testnet] @@ -2434,7 +2434,7 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i A Bitcoin Core Fejlesztői + Copyright (C) 2014-%i A Blackcoin Lore Fejlesztői Error reading from database, shutting down. @@ -2541,7 +2541,7 @@ Insufficient funds - Nincs elég bitcoinod. + Nincs elég blackcoinod. Loading block index... diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts index d54eff19e..aea4db633 100644 --- a/src/qt/locale/bitcoin_pl.ts +++ b/src/qt/locale/bitcoin_pl.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Tutaj znajdują się adresy Bitcoin na które wysyłasz płatności. Zawsze sprawdzaj ilość i adres odbiorcy przed wysyłką monet. + Tutaj znajdują się adresy Blackcoin na które wysyłasz płatności. Zawsze sprawdzaj ilość i adres odbiorcy przed wysyłką monet. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - To twoje adresy Bitcoin, na które otrzymujesz płatności. Zaleca się używanie nowych adresów odbiorczych dla każdej transakcji. + To twoje adresy Blackcoin, na które otrzymujesz płatności. Zaleca się używanie nowych adresów odbiorczych dla każdej transakcji. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Program Bitcoin Core zamknie się, aby dokończyć proces szyfrowania. Pamiętaj, że szyfrowanie portfela nie zabezpiecza w pełni twoich bitcoinów przed kradzieżą przez złośliwe oprogramowanie mogące zainfekować twój komputer. + Program Blackcoin Lore zamknie się, aby dokończyć proces szyfrowania. Pamiętaj, że szyfrowanie portfela nie zabezpiecza w pełni twoich blackcoinów przed kradzieżą przez złośliwe oprogramowanie mogące zainfekować twój komputer. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - Klient Rdzenia Bitcoina + Klient Rdzenia Blackcoina Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Wyślij monety na adres bitcoinowy + Wyślij monety na adres blackcoinowy Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Pokaż informacje o Rdzeniu Bitcoina + Pokaż informacje o Rdzeniu Blackcoina &Show / Hide @@ -379,7 +379,7 @@ Verify messages to ensure they were signed with specified Bitcoin addresses - Zweryfikuj wiadomość, aby upewnić się, że została podpisana podanym adresem bitcoinowym. + Zweryfikuj wiadomość, aby upewnić się, że została podpisana podanym adresem blackcoinowym. &File @@ -399,19 +399,19 @@ Bitcoin Core - Rdzeń Bitcoina + Rdzeń Blackcoina Request payments (generates QR codes and bitcoin: URIs) - Żądaj płatności (generuje kod QR oraz bitcoinowe URI) + Żądaj płatności (generuje kod QR oraz blackcoinowe URI) &About Bitcoin Core - &O Bitcoin Core + &O Blackcoin Lore Modify configuration options for Bitcoin Core - Zmień opcje konfiguracji dla Bitcoin Core + Zmień opcje konfiguracji dla Blackcoin Lore Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Otwórz URI bitcoin: lub żądanie zapłaty + Otwórz URI blackcoin: lub żądanie zapłaty &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Pokaż pomoc Rdzenia Bitcoin, aby zobaczyć listę wszystkich opcji linii poleceń + Pokaż pomoc Rdzenia Blackcoin, aby zobaczyć listę wszystkich opcji linii poleceń %n active connection(s) to Bitcoin network - %n aktywnych połączeń do sieci Bitcoin%n aktywnych połączeń do sieci Bitcoin%n aktywnych połączeń do sieci Bitcoin + %n aktywnych połączeń do sieci Blackcoin%n aktywnych połączeń do sieci Bitcoin%n aktywnych połączeń do sieci Blackcoin No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - Wprowadzony adres «%1"» nie jest poprawnym adresem bitcoinowym. + Wprowadzony adres «%1"» nie jest poprawnym adresem blackcoinowym. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Rdzeń Bitcoina + Rdzeń Blackcoina version @@ -868,7 +868,7 @@ About Bitcoin Core - O Bitcoin Core + O Blackcoin Lore Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Witaj w Bitcoin Core + Witaj w Blackcoin Lore As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Ponieważ jest to pierwsze uruchomienie programu, możesz wybrać gdzie Bitcoin Core będzie przechowywał swoje dane. + Ponieważ jest to pierwsze uruchomienie programu, możesz wybrać gdzie Blackcoin Lore będzie przechowywał swoje dane. 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. - Program pobierze i będzie przechowywał kopię łańcucha bloków bitcoinowych. W wybranym katalogu musi być przynajmniej %1 GB miejsca, a z czasem ilość danych będzie rosła. Portfel będzie przechowywany w tym samym katalogu. + Program pobierze i będzie przechowywał kopię łańcucha bloków blackcoinowych. W wybranym katalogu musi być przynajmniej %1 GB miejsca, a z czasem ilość danych będzie rosła. Portfel będzie przechowywany w tym samym katalogu. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Rdzeń Bitcoina + Rdzeń Blackcoina Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - Można tu ustawić język interfejsu uzytkownika. Żeby ustawienie przyniosło skutek trzeba uruchomić ponownie Bitcoin. + Można tu ustawić język interfejsu uzytkownika. Żeby ustawienie przyniosło skutek trzeba uruchomić ponownie Blackcoin. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Automatycznie uruchamia Bitcoin po zalogowaniu do systemu. + Automatycznie uruchamia Blackcoin po zalogowaniu do systemu. &Start Bitcoin Core on system login - Uruchamiaj Bitcoin Core wraz z zalogowaniem do &systemu + Uruchamiaj Blackcoin Lore wraz z zalogowaniem do &systemu (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Automatycznie otwiera port klienta Bitcoin na routerze. Ta opcja dzieła tylko jeśli twój router wspiera UPnP i jest ono włączone. + Automatycznie otwiera port klienta Blackcoin na routerze. Ta opcja dzieła tylko jeśli twój router wspiera UPnP i jest ono włączone. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Połącz się z siecią Bitcoin poprzez proxy SOCKS5. + Połącz się z siecią Blackcoin poprzez proxy SOCKS5. &Connect through SOCKS5 proxy (default proxy): @@ -1208,7 +1208,7 @@ 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. - 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. + Wyświetlana informacja może być nieaktualna. Twój portfel synchronizuje się automatycznie z siecią blackcoin, zaraz po tym jak uzyskano połączenie, ale proces ten nie został jeszcze ukończony. Watch-only: @@ -1307,7 +1307,7 @@ Cannot start bitcoin: click-to-pay handler - Nie można uruchomić protokołu bitcoin: kliknij-by-zapłacić + Nie można uruchomić protokołu blackcoin: kliknij-by-zapłacić Payment request fetch URL is invalid: %1 @@ -1315,7 +1315,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - URI nie może zostać przetworzony! Może to być spowodowane nieprawidłowym adresem Bitcoin lub uszkodzonymi parametrami URI. + URI nie może zostać przetworzony! Może to być spowodowane nieprawidłowym adresem Blackcoin lub uszkodzonymi parametrami URI. Payment request file handling @@ -1389,7 +1389,7 @@ Enter a Bitcoin address (e.g. %1) - Wprowadź adres bitcoinowy (np. %1) + Wprowadź adres blackcoinowy (np. %1) %1 d @@ -1507,7 +1507,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Otwórz plik logowania debugowania Bitcoin Core z obecnego katalogu z danymi. Może to potrwać kilka sekund przy większych plikach. + Otwórz plik logowania debugowania Blackcoin Lore z obecnego katalogu z danymi. Może to potrwać kilka sekund przy większych plikach. Received @@ -1659,7 +1659,7 @@ Welcome to the Bitcoin Core RPC console. - Witaj w konsoli Bitcoin Core RPC. + Witaj w konsoli Blackcoin Lore RPC. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1742,7 +1742,7 @@ 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. - Opcjonalna wiadomość do dołączenia do żądania płatności, która będzie wyświetlana, gdy żądanie zostanie otwarte. Uwaga: wiadomość ta nie zostanie wysłana wraz z płatnością w sieci Bitcoin. + Opcjonalna wiadomość do dołączenia do żądania płatności, która będzie wyświetlana, gdy żądanie zostanie otwarte. Uwaga: wiadomość ta nie zostanie wysłana wraz z płatnością w sieci Blackcoin. An optional label to associate with the new receiving address. @@ -1975,7 +1975,7 @@ 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. - Zapłacenie tylko minimalnej opłaty jest nadal wystarczające, dopóki jest mniejszy wolumen transakcji niż miejsca w blokach. Należy jednak mieć świadomość, że może skończyć się to niezatwierdzeniem nigdy transakcji, gdy jest większe zapotrzebowanie na transakcje bitcoina niż sieć może przetworzyć. + Zapłacenie tylko minimalnej opłaty jest nadal wystarczające, dopóki jest mniejszy wolumen transakcji niż miejsca w blokach. Należy jednak mieć świadomość, że może skończyć się to niezatwierdzeniem nigdy transakcji, gdy jest większe zapotrzebowanie na transakcje blackcoina niż sieć może przetworzyć. (read the tooltip) @@ -2135,7 +2135,7 @@ Warning: Invalid Bitcoin address - Ostrzeżenie: nieprawidłowy adres Bitcoin + Ostrzeżenie: nieprawidłowy adres Blackcoin (no label) @@ -2186,7 +2186,7 @@ The Bitcoin address to send the payment to - Adres Bitcoin gdzie wysłać płatność + Adres Blackcoin gdzie wysłać płatność Alt+A @@ -2206,7 +2206,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Opłata zostanie odjęta od kwoty wysyłane.Odbiorca otrzyma mniej niż bitcoins wpisz w polu kwoty. Jeśli wybrano kilku odbiorców, opłata jest podzielona równo. + Opłata zostanie odjęta od kwoty wysyłane.Odbiorca otrzyma mniej niż blackcoins wpisz w polu kwoty. Jeśli wybrano kilku odbiorców, opłata jest podzielona równo. S&ubtract fee from amount @@ -2230,7 +2230,7 @@ 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. - Wiadomość, która została dołączona do URI bitcoin:, która będzie przechowywana wraz z transakcją w celach informacyjnych. Uwaga: Ta wiadomość nie będzie rozsyłana w sieci Bitcoin. + Wiadomość, która została dołączona do URI blackcoin:, która będzie przechowywana wraz z transakcją w celach informacyjnych. Uwaga: Ta wiadomość nie będzie rozsyłana w sieci Blackcoin. Pay To: @@ -2245,7 +2245,7 @@ ShutdownWindow Bitcoin Core is shutting down... - Bitcoin Core się zamyka... + Blackcoin Lore się zamyka... Do not shut down the computer until this window disappears. @@ -2268,7 +2268,7 @@ The Bitcoin address to sign the message with - Adres Bitcoin, za pomocą którego podpisać wiadomość + Adres Blackcoin, za pomocą którego podpisać wiadomość Choose previously used address @@ -2320,11 +2320,11 @@ The Bitcoin address the message was signed with - Adres Bitcoin, którym została podpisana wiadomość + Adres Blackcoin, którym została podpisana wiadomość Verify the message to ensure it was signed with the specified Bitcoin address - Zweryfikuj wiadomość, aby upewnić się, że została podpisana odpowiednim adresem Bitcoin. + Zweryfikuj wiadomość, aby upewnić się, że została podpisana odpowiednim adresem Blackcoin. Verify &Message @@ -2391,11 +2391,11 @@ SplashScreen Bitcoin Core - Rdzeń Bitcoina + Rdzeń Blackcoina The Bitcoin Core developers - Deweloperzy Bitcoin Core + Deweloperzy Blackcoin Lore [testnet] @@ -2953,7 +2953,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - Nie można przywiązać z portem %s na tym komputerze. Bitcoin Core prawdopodobnie już działa. + Nie można przywiązać z portem %s na tym komputerze. Blackcoin Lore prawdopodobnie już działa. WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected) @@ -3125,7 +3125,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - Nie można uzyskać blokady na katalogu z danymi %s. Rdzeń Bitcoin najprawdopodobniej jest już uruchomiony. + Nie można uzyskać blokady na katalogu z danymi %s. Rdzeń Blackcoin najprawdopodobniej jest już uruchomiony. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3213,11 +3213,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i The Bitcoin Core Developers + Copyright (C) 20014-%i The Blackcoin Lore Developers Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Błąd ładowania wallet.dat: Portfel wymaga nowszej wersji Bitcoin Core + Błąd ładowania wallet.dat: Portfel wymaga nowszej wersji Blackcoin Lore Error reading from database, shutting down. @@ -3233,7 +3233,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - Wstępna kontrola poprawności nie powiodła się. Bitcoin Core wyłącza się. + Wstępna kontrola poprawności nie powiodła się. Blackcoin Lore wyłącza się. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3345,7 +3345,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - Portfel wymaga przepisania: zrestartuj Bitcoina aby ukończyć + Portfel wymaga przepisania: zrestartuj Blackcoina aby ukończyć Warning diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts index 32ac3950d..20cd19f44 100644 --- a/src/qt/locale/bitcoin_sk.ts +++ b/src/qt/locale/bitcoin_sk.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - Toto sú Vaše Bitcoin adresy pre posielanie platieb. Vždy skontrolujte množstvo a prijímaciu adresu pred poslaním coins. + Toto sú Vaše Blackcoin adresy pre posielanie platieb. Vždy skontrolujte množstvo a prijímaciu adresu pred poslaním coins. These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - Toto sú vaše Bitcoin adresy pre prijímanie platieb. Odporúča sa použiť novú prijímaciu adresu pre každú transakciu. + Toto sú vaše Blackcoin adresy pre prijímanie platieb. Odporúča sa použiť novú prijímaciu adresu pre každú transakciu. Copy &Label @@ -169,7 +169,7 @@ Bitcoin Core 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. - Jadro Bitcoin sa teraz ukončí pre dokončenie procesu šifrovania. Pamätaj, že šifrovanie peňaženky Ťa nemôže úplne ochrániť pred krádežou bitcoinov pomocou škodlivého software. + Jadro Blackcoin sa teraz ukončí pre dokončenie procesu šifrovania. Pamätaj, že šifrovanie peňaženky Ťa nemôže úplne ochrániť pred krádežou blackcoinov pomocou škodlivého software. 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. @@ -307,7 +307,7 @@ Bitcoin Core client - Bitcoin Core klient + Blackcoin Core klient Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - Poslať bitcoins na adresu + Poslať blackcoins na adresu Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - Bitcoin + Blackcoin Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - Zobraziť informácie o Bitcoin Core + Zobraziť informácie o Blackcoin Core &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - Podpísať správu s vašou adresou Bitcoin aby ste preukázali že ju vlastníte + Podpísať správu s vašou adresou Blackcoin aby ste preukázali že ju vlastníte Verify messages to ensure they were signed with specified Bitcoin addresses - Overiť či správa bola podpísaná uvedenou Bitcoin adresou + Overiť či správa bola podpísaná uvedenou Blackcoin adresou &File @@ -399,19 +399,19 @@ Bitcoin Core - Jadro Bitcoin + Jadro Blackcoin Request payments (generates QR codes and bitcoin: URIs) - Vyžiadať platby (vygeneruje QR kódy a bitcoin: URI) + Vyžiadať platby (vygeneruje QR kódy a blackcoin: URI) &About Bitcoin Core - O jadre Bitcoin + O jadre Blackcoin Modify configuration options for Bitcoin Core - Upraviť možnosti nastavenia pre Jadro Bitcoin + Upraviť možnosti nastavenia pre Jadro Blackcoin Show the list of used sending addresses and labels @@ -423,7 +423,7 @@ Open a bitcoin: URI or payment request - Otvoriť bitcoin URI alebo výzvu k platbe + Otvoriť blackcoin URI alebo výzvu k platbe &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - Zobraziť pomocnú správu od Bitcoin Jadra pre získanie zoznamu dostupných možností príkazového riadku + Zobraziť pomocnú správu od Blackcoin Jadra pre získanie zoznamu dostupných možností príkazového riadku %n active connection(s) to Bitcoin network - %n aktívne pripojenie do siete Bitcoin%n aktívne pripojenia do siete Bitcoin%n aktívnych pripojení do siete Bitcoin + %n aktívne pripojenie do siete Blackcoin%n aktívne pripojenia do siete Blackcoin%n aktívnych pripojení do siete Blackcoin No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - Vložená adresa "%1" nieje platnou adresou bitcoin. + Vložená adresa "%1" nieje platnou adresou blackcoin. Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - Jadro Bitcoin + Jadro Blackcoin version @@ -868,7 +868,7 @@ About Bitcoin Core - O jadre Bitcoin + O jadre Blackcoin Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - Vitajte v jadre Bitcoin. + Vitajte v jadre Blackcoin. As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - Keďže spúštate program prvý krát, môžte si vybrať kde bude Bitcoin Jadro ukladať svoje dáta. + Keďže spúštate program prvý krát, môžte si vybrať kde bude Blackcoin Jadro ukladať svoje dáta. 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. - Jadro Bitcoin stiahne zo siete a uloží kópiu Bitcoin blockchain. Aspoň %1GB dát bude uložených v tomto priečinku a časom porastie. Peňaženka bude tiež uložená v tomto priečinku. + Jadro Blackcoin stiahne zo siete a uloží kópiu Bitcoin blockchain. Aspoň %1GB dát bude uložených v tomto priečinku a časom porastie. Peňaženka bude tiež uložená v tomto priečinku. Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - Jadro Bitcoin + Jadro Blackcoin Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - Tu sa dá nastaviť jazyk užívateľského rozhrania. Toto nastavenie bude účinné po reštartovaní Jadra Bitcoin. + Tu sa dá nastaviť jazyk užívateľského rozhrania. Toto nastavenie bude účinné po reštartovaní Jadra Blackcoin. 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - Automaticky spustiť Jadro Bitcoin po prihlásení do systému + Automaticky spustiť Jadro Blackcoin po prihlásení do systému &Start Bitcoin Core on system login - &Spustiť Bitcoin pri spustení systému správy okien + &Spustiť Blackcoin pri spustení systému správy okien (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - Automaticky otvorit port pre Bitcoin na routeri. Toto funguje len ak router podporuje UPnP a je táto podpora aktivovaná. + Automaticky otvorit port pre Blackcoin na routeri. Toto funguje len ak router podporuje UPnP a je táto podpora aktivovaná. Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - Pripojiť do siete Bitcoin cez proxy server SOCKS5. + Pripojiť do siete Blackcoin cez proxy server SOCKS5. &Connect through SOCKS5 proxy (default proxy): @@ -1129,7 +1129,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - Pripojiť k Bitcoinovej sieti cez separované SOCKS5 proxy pre skrytú službu Tor. + Pripojiť k Blackcoinovej sieti cez separované SOCKS5 proxy pre skrytú službu Tor. Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1165,7 +1165,7 @@ Choose the default subdivision unit to show in the interface and when sending coins. - Zvoľte ako deliť bitcoin pri zobrazovaní pri platbách a užívateľskom rozhraní. + Zvoľte ako deliť blackcoin pri zobrazovaní pri platbách a užívateľskom rozhraní. Whether to show coin control features or not. @@ -1216,7 +1216,7 @@ 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. - Zobrazené informácie môžu byť neaktuálne. Vaša peňaženka sa automaticky synchronizuje so sieťou Bitcoin po nadviazaní spojenia, ale tento proces ešte nie je ukončený. + Zobrazené informácie môžu byť neaktuálne. Vaša peňaženka sa automaticky synchronizuje so sieťou Blackcoin po nadviazaní spojenia, ale tento proces ešte nie je ukončený. Watch-only: @@ -1315,7 +1315,7 @@ Cannot start bitcoin: click-to-pay handler - Nedá sa spustiť obslužný program bitcoin: click-to-pay zaplatiť kliknutím + Nedá sa spustiť obslužný program blackcoin: click-to-pay zaplatiť kliknutím Payment request fetch URL is invalid: %1 @@ -1323,7 +1323,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - URI sa nedá analyzovať! To môže byť spôsobené neplatnou Bitcoin adresou alebo zle upravenými vlastnosťami URI. + URI sa nedá analyzovať! To môže byť spôsobené neplatnou Blackcoin adresou alebo zle upravenými vlastnosťami URI. Payment request file handling @@ -1519,7 +1519,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - Otvoriť Bitcoin log súbor pre ladenie z aktuálneho dátového adresára. Toto môže trvať niekoľko sekúnd pre veľké súbory. + Otvoriť Blackcoin log súbor pre ladenie z aktuálneho dátového adresára. Toto môže trvať niekoľko sekúnd pre veľké súbory. Received @@ -1676,7 +1676,7 @@ Welcome to the Bitcoin Core RPC console. - Vitajte v RPC konzole pre Jadro Bitcoin. + Vitajte v RPC konzole pre Jadro Blackcoin. Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1759,7 +1759,7 @@ 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. - Pridať voliteľnú správu k výzve na zaplatenie, ktorá sa zobrazí keď bude výzva otvorená. Poznámka: Správa nebude poslaná s platbou cez sieť Bitcoin. + Pridať voliteľnú správu k výzve na zaplatenie, ktorá sa zobrazí keď bude výzva otvorená. Poznámka: Správa nebude poslaná s platbou cez sieť Blackcoin. An optional label to associate with the new receiving address. @@ -2064,7 +2064,7 @@ Confirm send coins - Potvrdiť odoslanie bitcoins + Potvrdiť odoslanie blackcoins %1 to %2 @@ -2148,7 +2148,7 @@ Warning: Invalid Bitcoin address - Varovanie: Nesprávna Bitcoin adresa + Varovanie: Nesprávna Blackcoin adresa (no label) @@ -2219,7 +2219,7 @@ The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - Poplatok sa odpočíta od čiastky, ktorú odosielate. Príjemca dostane menej bitcoinov ako zadáte. Ak je vybraných viacero príjemcov, poplatok je rozdelený rovným dielom. + Poplatok sa odpočíta od čiastky, ktorú odosielate. Príjemca dostane menej blackcoinov ako zadáte. Ak je vybraných viacero príjemcov, poplatok je rozdelený rovným dielom. S&ubtract fee from amount @@ -2243,7 +2243,7 @@ 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. - Správa ktorá bola pripojená k bitcoin: URI a ktorá bude uložená s transakcou pre Vaše potreby. Poznámka: Táto správa nebude poslaná cez sieť Bitcoin. + Správa ktorá bola pripojená k blackcoin: URI a ktorá bude uložená s transakcou pre Vaše potreby. Poznámka: Táto správa nebude poslaná cez sieť Blackcoin. Pay To: @@ -2277,7 +2277,7 @@ The Bitcoin address to sign the message with - Bitcoin adresa pre podpísanie správy s + Blackcoin adresa pre podpísanie správy s Choose previously used address @@ -2329,11 +2329,11 @@ The Bitcoin address the message was signed with - Adresa Bitcoin, ktorou bola podpísaná správa + Adresa Blackcoin, ktorou bola podpísaná správa Verify the message to ensure it was signed with the specified Bitcoin address - Overím správy sa uistiť že bola podpísaná označenou Bitcoin adresou + Overím správy sa uistiť že bola podpísaná označenou Blackcoin adresou Verify &Message @@ -2400,11 +2400,11 @@ SplashScreen Bitcoin Core - Jadro Bitcoin + Jadro Blackcoin The Bitcoin Core developers - Vývojári jadra Bitcoin + Vývojári jadra Blackcoin [testnet] @@ -2906,7 +2906,7 @@ Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly. - Skontrolujte správnosť nastavenia dátumu a času na vašom počítači! Ak je čas nesprávny Jadro Bitcoin nebude správne fungovať. + Skontrolujte správnosť nastavenia dátumu a času na vašom počítači! Ak je čas nesprávny Jadro Blackcoin nebude správne fungovať. Error: A fatal internal error occurred, see debug.log for details @@ -2954,11 +2954,11 @@ This is a pre-release test build - use at your own risk - do not use for mining or merchant applications - Toto je pred-testovacia verzia - použitie je na vlastné riziko - nepoužívajte na tvorbu bitcoin ani obchodovanie. + Toto je pred-testovacia verzia - použitie je na vlastné riziko - nepoužívajte na tvorbu blackcoin ani obchodovanie. Unable to bind to %s on this computer. Bitcoin Core is probably already running. - Nepodarilo sa pripojiť na %s na tomto počítači. Bitcoin Jadro je už pravdepodobne spustené. + Nepodarilo sa pripojiť na %s na tomto počítači. Blackcoin Jadro je už pravdepodobne spustené. WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected) @@ -3152,7 +3152,7 @@ The network does not appear to fully agree! Some miners appear to be experiencin Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - Neviem uzamknúť data adresár %s. Jadro Bitcoin je pravdepodobne už spustené. + Neviem uzamknúť data adresár %s. Jadro Blackcoin je pravdepodobne už spustené. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3236,11 +3236,11 @@ The network does not appear to fully agree! Some miners appear to be experiencin Copyright (C) 2009-%i The Bitcoin Core Developers - Autorské práva (C) 2009-%i Vývojári jadra Bitcoin + Autorské práva (C) 2014-%i Vývojári Lore Blackcoin Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - Chyba pri čítaní wallet.dat: Peňaženka vyžaduje vyššiu verziu Jadra Bitcoin + Chyba pri čítaní wallet.dat: Peňaženka vyžaduje vyššiu verziu Jadra Blackcoin Error reading from database, shutting down. @@ -3256,7 +3256,7 @@ The network does not appear to fully agree! Some miners appear to be experiencin Initialization sanity check failed. Bitcoin Core is shutting down. - Inicializačná kontrola zlyhala. Jadro Bitcoin sa ukončuje. + Inicializačná kontrola zlyhala. Jadro Blackcoin sa ukončuje. Invalid amount for -maxtxfee=<amount>: '%s' @@ -3360,7 +3360,7 @@ The network does not appear to fully agree! Some miners appear to be experiencin Wallet needed to be rewritten: restart Bitcoin Core to complete - Peňaženka musí byť prepísaná: pre dokončenie reštartujte Jadro Bitcoin + Peňaženka musí byť prepísaná: pre dokončenie reštartujte Jadro Blackcoin Warning diff --git a/src/qt/locale/bitcoin_sl_SI.ts b/src/qt/locale/bitcoin_sl_SI.ts index cf6c241a7..1381d2f16 100644 --- a/src/qt/locale/bitcoin_sl_SI.ts +++ b/src/qt/locale/bitcoin_sl_SI.ts @@ -3021,7 +3021,7 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - Copyright (C) 2009-%i The Bitcoin Core Developers + Copyright (C) 2014-%i The Bitcoin Lore Developers Information diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts index 0ae2c95c6..dcbea75b4 100644 --- a/src/qt/locale/bitcoin_zh_CN.ts +++ b/src/qt/locale/bitcoin_zh_CN.ts @@ -67,11 +67,11 @@ These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins. - 这是您用来付款的比特币地址。在付款前,请仔细核实付款金额和收款地址。 + 这是您用来付款的黑币地址。在付款前,请仔细核实付款金额和收款地址。 These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - 这些都是您的比特币地址,可用于收款。建议对每笔交易都使用一个新的地址。 + 这些都是您的黑币地址,可用于收款。建议对每笔交易都使用一个新的地址。 Copy &Label @@ -160,16 +160,16 @@ 确认加密钱包 - Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BITCOINS</b>! - 警告:如果您加密了您的钱包,但是忘记了密码,你将会<b>丢失所有的比特币</b>! + Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR BLACKCOINS</b>! + 警告:如果您加密了您的钱包,但是忘记了密码,你将会<b>丢失所有的黑币</b>! Are you sure you wish to encrypt your wallet? 您确定需要为钱包加密吗? - Bitcoin Core 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. - 比特币核心现在将关闭以完成加密过程。请记住,在您的计算机被恶意软件感染的情况下,加密不能完全保护您的比特币免于被盗。 + Bitcoin Core 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. + 黑币钱包现在将关闭以完成加密过程。请记住,在您的计算机被恶意软件感染的情况下,加密不能完全保护您的黑币免于被盗。 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. @@ -307,7 +307,7 @@ Bitcoin Core client - 比特币核心钱包客户端 + 黑币智慧版钱包客户端 Importing blocks from disk... @@ -319,7 +319,7 @@ Send coins to a Bitcoin address - 向一个比特币地址发送比特币 + 向一个黑币地址发送黑币 Backup wallet to another location @@ -343,7 +343,7 @@ Bitcoin - 比特币 + 黑币 Wallet @@ -359,7 +359,7 @@ Show information about Bitcoin Core - 显示有关比特币核心钱包信息 + 显示有关黑币智慧版钱包信息 &Show / Hide @@ -375,11 +375,11 @@ Sign messages with your Bitcoin addresses to prove you own them - 用比特币地址关联的私钥为消息签名,以证明您拥有这个比特币地址 + 对您的黑币地址进行签名,用以证明您它属于您 Verify messages to ensure they were signed with specified Bitcoin addresses - 校验消息,确保该消息是由指定的比特币地址所有者签名的 + 校验消息,确保该消息是由指定的黑币地址所有者签名的 &File @@ -399,19 +399,19 @@ Bitcoin Core - 比特币核心 + 黑币智慧版 - Request payments (generates QR codes and bitcoin: URIs) - 请求支付(生成二维码和 bitcoin: URI) + Request payments (generates QR codes and Bitcoin: URIs) + 请求支付(生成二维码和 Blackcoin: URI) &About Bitcoin Core - 关于比特币核心(&A) + 关于黑币智慧版(&A) Modify configuration options for Bitcoin Core - 修改比特币核心的配置选项 + 修改黑币智慧版的配置选项 Show the list of used sending addresses and labels @@ -422,8 +422,8 @@ 显示用过的接收地址和标签的列表 - Open a bitcoin: URI or payment request - 打开一个比特币:URI 或支付请求 + Open a Bitcoin: URI or payment request + 打开一个黑币:URI 或支付请求 &Command-line options @@ -431,11 +431,11 @@ Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options - 显示比特币核心 程序帮助信息,获取可用的命令行选项 + 显示黑币智慧版程序帮助信息,获取可用的命令行选项 %n active connection(s) to Bitcoin network - %n 个到比特币网络的活动连接 + %n 个到黑币网络的活动连接 No block source available... @@ -818,7 +818,7 @@ The entered address "%1" is not a valid Bitcoin address. - 您输入的“%1”不是有效的比特币地址。 + 您输入的“%1”不是有效的黑币地址。 Could not unlock wallet. @@ -856,7 +856,7 @@ HelpMessageDialog Bitcoin Core - 比特币核心 + 黑币智慧版 version @@ -868,7 +868,7 @@ About Bitcoin Core - 关于比特币核心 + 关于黑币智慧版 Command-line options @@ -919,15 +919,15 @@ Welcome to Bitcoin Core. - 欢迎使用 比特币核心 程序。 + 欢迎使用 Blackcoin币核心 程序。 As this is the first time the program is launched, you can choose where Bitcoin Core will store its data. - 由于这是第一次运行 比特币核心 程序,您可以选择数据存储目录。 + 由于这是第一次运行 黑币智慧版 程序,您可以选择数据存储目录。 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. - 比特币核心 程序会下载储存一份数据块链(blockchain)。至少需要 %1 GB的存储空间,随着时间推移会需要更多的存储空间。钱包文件也储存在该目录。 + 黑币智慧版 程序会下载储存一份数据块链(blockchain)。至少需要 %1 GB的存储空间,随着时间推移会需要更多的存储空间。钱包文件也储存在该目录。 Use the default data directory @@ -939,7 +939,7 @@ Bitcoin Core - 比特币核心 + 黑币智慧版 Error: Specified data directory "%1" cannot be created. @@ -1021,7 +1021,7 @@ The user interface language can be set here. This setting will take effect after restarting Bitcoin Core. - 可以在这里设置用户界面语言。此设置将在重新启动比特币核心后生效。 + 可以在这里设置用户界面语言。此设置将在重新启动黑币智慧版钱包后生效。 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 |. @@ -1049,11 +1049,11 @@ Automatically start Bitcoin Core after logging in to the system. - 登录到系统后自动启动比特币核心。 + 登录到系统后自动启动黑币智慧版钱包。 &Start Bitcoin Core on system login - 系统登录时启动比特币核心(&S) + 系统登录时启动黑币智慧版钱包(&S) (0 = auto, <0 = leave that many cores free) @@ -1081,7 +1081,7 @@ Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled. - 自动在路由器中打开比特币端口。只有当您的路由器开启了 UPnP 选项时此功能才有效。 + 自动在路由器中打开黑币端口。只有当您的路由器开启了 UPnP 选项时此功能才有效。 Map port using &UPnP @@ -1089,7 +1089,7 @@ Connect to the Bitcoin network through a SOCKS5 proxy. - 通过 SOCKS5 代理连接比特币网络。 + 通过 SOCKS5 代理连接黑币网络。 &Connect through SOCKS5 proxy (default proxy): @@ -1129,7 +1129,7 @@ Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor hidden services. - 在Tor匿名网络下通过不同的SOCKS5代理连接比特币网络 + 在Tor匿名网络下通过不同的SOCKS5代理连接黑币网络 Use separate SOCKS5 proxy to reach peers via Tor hidden services: @@ -1161,11 +1161,11 @@ &Unit to show amounts in: - 比特币金额单位(&U): + 黑币金额单位(&U): Choose the default subdivision unit to show in the interface and when sending coins. - 选择比特币单位。 + 选择黑币单位。 Whether to show coin control features or not. @@ -1216,7 +1216,7 @@ 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. - 现在显示的消息可能是过期的. 在连接上比特币网络节点后,您的钱包将自动与网络同步,但是这个过程还没有完成。 + 现在显示的消息可能是过期的. 在连接上黑币网络节点后,您的钱包将自动与网络同步,但是这个过程还没有完成。 Watch-only: @@ -1314,8 +1314,8 @@ 支付请求出错 - Cannot start bitcoin: click-to-pay handler - 暂时无法启动比特币:点击支付功能 + Cannot start Bitcoin: click-to-pay handler + 暂时无法启动黑币:点击支付功能 Payment request fetch URL is invalid: %1 @@ -1323,7 +1323,7 @@ URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. - URI无法解析!原因可能是比特币地址不正确,或者URI参数错误。 + URI无法解析!原因可能是黑币地址不正确,或者URI参数错误。 Payment request file handling @@ -1397,7 +1397,7 @@ Enter a Bitcoin address (e.g. %1) - 请输入一个比特币地址 (例如 %1) + 请输入一个黑币地址 (例如 %1) %1 d @@ -1519,7 +1519,7 @@ Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files. - 从当前的数据目录打开比特币核心调试日志文件。对于较大的日志文件,这可能需要几秒钟。 + 从当前的数据目录打开黑币智慧版调试日志文件。对于较大的日志文件,这可能需要几秒钟。 Received @@ -1675,7 +1675,7 @@ Welcome to the Bitcoin Core RPC console. - 欢迎使用 比特币核心 RPC 控制台。 + 欢迎使用 黑币智慧版 RPC 控制台。 Use up and down arrows to navigate history, and <b>Ctrl-L</b> to clear screen. @@ -1750,15 +1750,15 @@ 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. - 重复使用以前用过的接收地址。重用地址有安全和隐私方面的隐患。除非是为重复生成同一项支付请求,否则请不要这样做。 + 重复使用以前用过的接收地址。重复用地址有安全和隐私方面的隐患。除非是为重复生成同一项支付请求,否则请不要这样做。 R&euse an existing receiving address (not recommended) - 重用现有的接收地址(不推荐) + 重复用现有的接收地址(不推荐) 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. - 可在付款请求上备注一条信息,在打开付款请求时可以看到。注意:该消息不是通过比特币网络传送。 + 可在付款请求上备注一条信息,在打开付款请求时可以看到。注意:该消息不是通过黑币网络传送。 An optional label to associate with the new receiving address. @@ -1907,7 +1907,7 @@ SendCoinsDialog Send Coins - 发送比特币 + 发送黑币 Coin Control Features @@ -1990,7 +1990,7 @@ 最小额 - 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. + 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. 交易量小时只支付最小交易费是可以的。但是请注意,当交易量大到超出网络可处理时您的交易可能永远无法确认。 @@ -2055,7 +2055,7 @@ Confirm the send action - 确认发送货币 + 确认发送操作 S&end @@ -2063,7 +2063,7 @@ Confirm send coins - 确认发送货币 + 确认发送出币 %1 to %2 @@ -2123,7 +2123,7 @@ 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. - 错误:该交易被拒绝!发生这种错误的原因可能是:钱包中的比特币已经被用掉,有可能您复制了wallet.dat钱包文件,然后用复制的钱包文件支付了比特币,但是这个钱包文件中没有记录。 + 错误:该交易被拒绝!发生这种错误的原因可能是:钱包中的黑币已经被用掉,有可能您复制了wallet.dat钱包文件,然后用复制的钱包文件支付了黑币,但是这个钱包文件中没有记录。 A fee higher than %1 is considered an absurdly high fee. @@ -2151,7 +2151,7 @@ Warning: Invalid Bitcoin address - 警告:无效的比特币地址 + 警告:无效的黑币地址 (no label) @@ -2221,8 +2221,8 @@ 移除此项 - The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - 交易费将从发送总额中扣除。接收人将收到比您在金额框中输入的更少的比特币。如果选中了多个收件人,交易费平分。 + The fee will be deducted from the amount being sent. The recipient will receive less Bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally. + 交易费将从发送总额中扣除。接收人将收到比您在金额框中输入的更少的黑币金额。如果选中了多个收件人,交易费平分。 S&ubtract fee from amount @@ -2245,8 +2245,8 @@ 请为此地址输入一个标签以将它加入用过的地址列表 - 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. - bitcoin:URI 附带的备注信息,将会和交易一起存储,备查。 注意:该消息不会通过比特币网络传输。 + 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. + Blackcoin:URI 附带的备注信息,将会和交易一起存储,备查。 注意:该消息不会通过黑币网络传输。 Pay To: @@ -2261,7 +2261,7 @@ ShutdownWindow Bitcoin Core is shutting down... - 比特币核心正在关机... + 黑币智慧版正在关机... Do not shut down the computer until this window disappears. @@ -2279,8 +2279,8 @@ 签名消息(&S) - You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - 您可以用你的地址对消息/协议进行签名,以证明您可以接收发送到该地址的比特币。注意不要对任何模棱两可或者随机的消息进行签名,以免遭受钓鱼式攻击。请确保消息内容准确的表达了您的真实意愿。 + You can sign messages/agreements with your addresses to prove you can receive Bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. + 您可以用你的地址对消息/协议进行签名,以证明您可以接收发送到该地址的黑币。注意不要对任何模棱两可或者随机的消息进行签名,以免遭受钓鱼式攻击。请确保消息内容准确的表达了您的真实意愿。 The Bitcoin address to sign the message with @@ -2344,7 +2344,7 @@ Verify the message to ensure it was signed with the specified Bitcoin address - 验证消息,确保消息是由指定的比特币地址签名过的。 + 验证消息,确保消息是由指定的黑币地址签名过的。 Verify &Message @@ -2411,11 +2411,11 @@ SplashScreen Bitcoin Core - 比特币核心 + 黑币智慧版 The Bitcoin Core developers - Bitcoin Core 的开发者 + 黑币智慧版钱包的开发者 [testnet] @@ -2541,7 +2541,7 @@ Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - 生成的比特币在可以使用前必须有 %1 个成熟的区块。当您生成了此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,如果另一个节点比你早几秒钟成功生成一个区块。 + 生成的黑币在可以使用前必须有 %1 个成熟的区块。当您生成了此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,如果另一个节点比你早几秒钟成功生成一个区块。 Debug information @@ -2863,7 +2863,7 @@ WalletModel Send Coins - 发送比特币 + 发送黑币 @@ -2902,7 +2902,7 @@ - bitcoin-core + Bitcoin-core Options: 选项: @@ -2936,7 +2936,7 @@ Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly. - 警请检查电脑的日期时间设置是否正确!时间错误可能会导致比特币客户端运行异常。 + 警请检查电脑的日期时间设置是否正确!时间错误可能会导致黑币客户端运行异常。 Prune configured below the minimum of %d MiB. Please use a higher number. @@ -3002,7 +3002,7 @@ Unable to bind to %s on this computer. Bitcoin Core is probably already running. - 无法 %s的绑定到电脑上,比特币核心钱包可能已经在运行。 + 无法 %s的绑定到电脑上,黑币智慧版钱包可能已经在运行。 Use UPnP to map the listening port (default: 1 when listening and no -proxy) @@ -3206,7 +3206,7 @@ Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running. - 无法获取数据目录的 %s. 比特币核心钱包可能已经在运行. + 无法获取数据目录的 %s. 黑币智慧版钱包可能已经在运行. Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality) @@ -3250,7 +3250,7 @@ Set the number of threads for coin generation if enabled (-1 = all cores, default: %d) - 设置比特币生成线程数 ( -1=所有核, 默认: %d) + 设置黑币生成线程数 ( -1=所有核, 默认: %d) The transaction amount is too small to send after the fee has been deducted @@ -3290,11 +3290,11 @@ Copyright (C) 2009-%i The Bitcoin Core Developers - 版权所有 (C) 2009-%i Bitcoin Core 开发者 + 版权所有 (C) 2014-%i Blackcoin Core 开发者 Error loading wallet.dat: Wallet requires newer version of Bitcoin Core - 加载wallet.dat错误:需要新版的比特币核心钱包 + 加载wallet.dat错误:需要新版的黑币智慧版钱包 Error reading from database, shutting down. @@ -3306,7 +3306,7 @@ Initialization sanity check failed. Bitcoin Core is shutting down. - 初始化完整性检查失败。Bitcoin Core 即将关闭。 + 初始化完整性检查失败。黑币钱包即将关闭。 Invalid amount for -maxtxfee=<amount>: '%s' @@ -3414,7 +3414,7 @@ Wallet needed to be rewritten: restart Bitcoin Core to complete - 钱包需要被改写:重新启动核心钱包来完成 + 钱包需要被改写:重新启动黑币智慧版钱包来完成 Warning @@ -3504,7 +3504,7 @@ Generate coins (default: %u) - 生成比特币 (默认: %u) + 生成黑币 (默认: %u) How many blocks to check at startup (default: %u, 0 = all) @@ -3548,7 +3548,7 @@ Relay and mine data carrier transactions (default: %u) - Relay and mine data carrier transactions (default: %u) + 载体交易中继挖矿数据 (default: %u) Relay non-P2SH multisig (default: %u) @@ -3639,4 +3639,4 @@ 错误 - \ No newline at end of file + diff --git a/src/qt/res/bitcoin-qt-res.rc b/src/qt/res/bitcoin-qt-res.rc index 9f66d0af7..1a3117a67 100644 --- a/src/qt/res/bitcoin-qt-res.rc +++ b/src/qt/res/bitcoin-qt-res.rc @@ -18,14 +18,14 @@ BEGIN BEGIN BLOCK "040904E4" // U.S. English - multilingual (hex) BEGIN - VALUE "CompanyName", "Bitcoin" - VALUE "FileDescription", "Bitcoin Core (GUI node for Bitcoin)" + VALUE "CompanyName", "Blackcoin" + VALUE "FileDescription", "Blackcoin Lore (GUI node for Blackcoin)" VALUE "FileVersion", VER_FILEVERSION_STR - VALUE "InternalName", "bitcoin-qt" + VALUE "InternalName", "blackcoin-qt" VALUE "LegalCopyright", COPYRIGHT_STR VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php." - VALUE "OriginalFilename", "bitcoin-qt.exe" - VALUE "ProductName", "Bitcoin Core" + VALUE "OriginalFilename", "blackcoin-qt.exe" + VALUE "ProductName", "Blackcoin Lore" VALUE "ProductVersion", VER_PRODUCTVERSION_STR END END diff --git a/src/qt/res/icons/about.png b/src/qt/res/icons/about.png index 83eb3c07e..14e57b2e9 100644 Binary files a/src/qt/res/icons/about.png and b/src/qt/res/icons/about.png differ diff --git a/src/qt/res/icons/bitcoin.ico b/src/qt/res/icons/bitcoin.ico index 8f5045015..5d7a74b77 100755 Binary files a/src/qt/res/icons/bitcoin.ico and b/src/qt/res/icons/bitcoin.ico differ diff --git a/src/qt/res/icons/bitcoin.png b/src/qt/res/icons/bitcoin.png index 435621af2..44faf23a7 100644 Binary files a/src/qt/res/icons/bitcoin.png and b/src/qt/res/icons/bitcoin.png differ diff --git a/src/qt/res/icons/staking_off.png b/src/qt/res/icons/staking_off.png new file mode 100644 index 000000000..07471009a Binary files /dev/null and b/src/qt/res/icons/staking_off.png differ diff --git a/src/qt/res/icons/staking_on.png b/src/qt/res/icons/staking_on.png new file mode 100644 index 000000000..353eaa3c5 Binary files /dev/null and b/src/qt/res/icons/staking_on.png differ diff --git a/src/qt/res/src/bitcoin.svg b/src/qt/res/src/bitcoin.svg index 14cf0c5e1..b8c7e19db 100644 --- a/src/qt/res/src/bitcoin.svg +++ b/src/qt/res/src/bitcoin.svg @@ -1,58 +1,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/qt/res/src/clock_0.svg b/src/qt/res/src/clock_0.svg index 2a4ae0235..b9904d778 100644 --- a/src/qt/res/src/clock_0.svg +++ b/src/qt/res/src/clock_0.svg @@ -1,14 +1,14 @@ - - - - - - - - - + + + + + + + + + diff --git a/src/qt/res/src/clock_1.svg b/src/qt/res/src/clock_1.svg index 2a3d84c2d..23c1faece 100644 --- a/src/qt/res/src/clock_1.svg +++ b/src/qt/res/src/clock_1.svg @@ -1,15 +1,15 @@ - - - - - - - - - + + + + + + + + + diff --git a/src/qt/res/src/clock_2.svg b/src/qt/res/src/clock_2.svg index 2de8d467b..36a41e297 100644 --- a/src/qt/res/src/clock_2.svg +++ b/src/qt/res/src/clock_2.svg @@ -1,13 +1,13 @@ - - - - - - - - - + + + + + + + + + diff --git a/src/qt/res/src/clock_3.svg b/src/qt/res/src/clock_3.svg index b691043e3..df2fead13 100644 --- a/src/qt/res/src/clock_3.svg +++ b/src/qt/res/src/clock_3.svg @@ -1,15 +1,15 @@ - - - - - - - - - + + + + + + + + + diff --git a/src/qt/res/src/mine.svg b/src/qt/res/src/mine.svg index 4a3f78660..dd69263e5 100644 --- a/src/qt/res/src/mine.svg +++ b/src/qt/res/src/mine.svg @@ -1,12 +1,12 @@ - - - - - - - - - + + + + + + + + + diff --git a/src/qt/res/src/tx_in.svg b/src/qt/res/src/tx_in.svg index a8911f904..751f79238 100644 --- a/src/qt/res/src/tx_in.svg +++ b/src/qt/res/src/tx_in.svg @@ -1,9 +1,9 @@ - - - - - - + + + + + + diff --git a/src/qt/res/src/tx_inout.svg b/src/qt/res/src/tx_inout.svg index 5b6688978..aa3d6ef5e 100644 --- a/src/qt/res/src/tx_inout.svg +++ b/src/qt/res/src/tx_inout.svg @@ -1,11 +1,11 @@ - - - - - - + + + + + + diff --git a/src/qt/res/src/verify.svg b/src/qt/res/src/verify.svg index 1ff11b7f5..10c4c09ce 100644 --- a/src/qt/res/src/verify.svg +++ b/src/qt/res/src/verify.svg @@ -1,14 +1,14 @@ - - - - - - - + + + + + + + diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index c834c3b56..b1217d20b 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -549,7 +549,7 @@ void SendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn void SendCoinsDialog::minimizeFeeSection(bool fMinimize) { ui->labelFeeMinimized->setVisible(fMinimize); - ui->buttonChooseFee ->setVisible(fMinimize); + //ui->buttonChooseFee ->setVisible(fMinimize); ui->buttonMinimizeFee->setVisible(!fMinimize); ui->frameFeeSelection->setVisible(!fMinimize); ui->horizontalLayoutSmartFee->setContentsMargins(0, (fMinimize ? 0 : 6), 0, 0); @@ -558,13 +558,13 @@ void SendCoinsDialog::minimizeFeeSection(bool fMinimize) void SendCoinsDialog::on_buttonChooseFee_clicked() { - minimizeFeeSection(false); + //minimizeFeeSection(false); } void SendCoinsDialog::on_buttonMinimizeFee_clicked() { - updateFeeMinimizedLabel(); - minimizeFeeSection(true); +// updateFeeMinimizedLabel(); +// minimizeFeeSection(true); } void SendCoinsDialog::setMinimumFee() diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp index 9195b3b72..597df571f 100644 --- a/src/qt/splashscreen.cpp +++ b/src/qt/splashscreen.cpp @@ -40,7 +40,7 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle) // define text to place QString titleText = tr("Bitcoin Core"); QString versionText = QString("Version %1").arg(QString::fromStdString(FormatFullVersion())); - QString copyrightText = QChar(0xA9)+QString(" 2009-%1 ").arg(COPYRIGHT_YEAR) + QString(tr("The Bitcoin Core developers")); + QString copyrightText = QChar(0xA9)+QString(" 2014-%1 ").arg(COPYRIGHT_YEAR) + QString(tr("The Bitcoin Core developers")); QString titleAddText = networkStyle->getTitleAddText(); QString font = QApplication::font().toString(); @@ -65,7 +65,7 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle) pixPaint.fillRect(rGradient, gradient); // draw the bitcoin icon, expected size of PNG: 1024x1024 - QRect rectIcon(QPoint(-150,-122), QSize(430,430)); + QRect rectIcon(QPoint(-130,-102), QSize(430,430)); const QSize requiredSize(1024,1024); QPixmap icon(networkStyle->getAppIcon().pixmap(requiredSize)); diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index eb4b12202..56ac2bffe 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -38,7 +38,7 @@ QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx) return tr("conflicted"); else if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0) return tr("%1/offline").arg(nDepth); - else if (nDepth < 6) + else if (nDepth < 10) return tr("%1/unconfirmed").arg(nDepth); else return tr("%1 confirmations").arg(nDepth); diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp index 5b16b108e..40cc3737c 100644 --- a/src/qt/transactionrecord.cpp +++ b/src/qt/transactionrecord.cpp @@ -18,7 +18,7 @@ */ bool TransactionRecord::showTransaction(const CWalletTx &wtx) { - if (wtx.IsCoinBase()) + if (wtx.IsCoinBase() || wtx.IsCoinStake()) { // Ensures we show generated coins / mined transactions at depth 1 if (!wtx.IsInMainChain()) @@ -39,10 +39,10 @@ QList TransactionRecord::decomposeTransaction(const CWallet * CAmount nCredit = wtx.GetCredit(ISMINE_ALL); CAmount nDebit = wtx.GetDebit(ISMINE_ALL); CAmount nNet = nCredit - nDebit; - uint256 hash = wtx.GetHash(); + uint256 hash = wtx.GetHash(), hashPrev; std::map mapValue = wtx.mapValue; - if (nNet > 0 || wtx.IsCoinBase()) + if (nNet > 0 || wtx.IsCoinBase() || wtx.IsCoinStake()) { // // Credit @@ -69,12 +69,19 @@ QList TransactionRecord::decomposeTransaction(const CWallet * sub.type = TransactionRecord::RecvFromOther; sub.address = mapValue["from"]; } - if (wtx.IsCoinBase()) + if (wtx.IsCoinBase() || wtx.IsCoinStake()) { // Generated sub.type = TransactionRecord::Generated; } + if (wtx.IsCoinStake()) + { + if (hashPrev == hash) + continue; // last coinstake output + sub.credit = nNet > 0 ? nNet : wtx.GetValueOut() - nDebit; + hashPrev = hash; + } parts.append(sub); } } @@ -181,7 +188,7 @@ void TransactionRecord::updateStatus(const CWalletTx &wtx) // Sort order, unrecorded transactions sort to the top status.sortKey = strprintf("%010d-%01d-%010u-%03d", (pindex ? pindex->nHeight : std::numeric_limits::max()), - (wtx.IsCoinBase() ? 1 : 0), + (wtx.IsCoinBase() || wtx.IsCoinStake() ? 1 : 0), wtx.nTimeReceived, idx); status.countsForBalance = wtx.IsTrusted() && !(wtx.GetBlocksToMaturity() > 0); diff --git a/src/qt/transactionrecord.h b/src/qt/transactionrecord.h index a5bc37571..53d8de926 100644 --- a/src/qt/transactionrecord.h +++ b/src/qt/transactionrecord.h @@ -80,7 +80,7 @@ public: }; /** Number of confirmation recommended for accepting a transaction */ - static const int RecommendedNumConfirmations = 6; + static const int RecommendedNumConfirmations = 10; TransactionRecord(): hash(), time(0), type(Other), address(""), debit(0), credit(0), idx(0) diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp index 5e7345144..75235a9d6 100644 --- a/src/qt/utilitydialog.cpp +++ b/src/qt/utilitydialog.cpp @@ -66,7 +66,7 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) : } else { setWindowTitle(tr("Command-line options")); QString header = tr("Usage:") + "\n" + - " bitcoin-qt [" + tr("command-line options") + "] " + "\n"; + " blackcoin-qt [" + tr("command-line options") + "] " + "\n"; QTextCursor cursor(ui->helpMessage->document()); cursor.insertText(version); cursor.insertBlock(); diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp index e4ca5e183..0ce866549 100644 --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -176,6 +176,21 @@ void WalletFrame::unlockWallet() walletView->unlockWallet(); } +void WalletFrame::lockWallet() +{ + WalletView *walletView = currentWalletView(); + if (walletView) + walletView->lockWallet(); +} + +unsigned long long WalletFrame::updateWeight() +{ + WalletView *walletView = currentWalletView(); + if (walletView) + return walletView->updateWeight(); + return 0; +} + void WalletFrame::usedSendingAddresses() { WalletView *walletView = currentWalletView(); diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index 9a5bc273c..22ba5186c 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -74,6 +74,10 @@ public Q_SLOTS: /** Ask for passphrase to unlock wallet temporarily */ void unlockWallet(); + void lockWallet(); + + unsigned long long updateWeight(); + /** Show used sending addresses */ void usedSendingAddresses(); /** Show used receiving addresses */ diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index cf38c64eb..637858ba9 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -520,6 +520,14 @@ void WalletModel::unsubscribeFromCoreSignals() WalletModel::UnlockContext WalletModel::requestUnlock() { bool was_locked = getEncryptionStatus() == Locked; + + if ((!was_locked) && fWalletUnlockStakingOnly) + { + setWalletLocked(true); + was_locked = getEncryptionStatus() == Locked; + + } + if(was_locked) { // Request UI to unlock wallet @@ -528,7 +536,7 @@ WalletModel::UnlockContext WalletModel::requestUnlock() // If wallet is still locked, unlock was failed or cancelled, mark context as invalid bool valid = getEncryptionStatus() != Locked; - return UnlockContext(this, valid, was_locked); + return UnlockContext(this, valid, was_locked && !fWalletUnlockStakingOnly); } WalletModel::UnlockContext::UnlockContext(WalletModel *wallet, bool valid, bool relock): @@ -668,3 +676,19 @@ bool WalletModel::saveReceiveRequest(const std::string &sAddress, const int64_t else return wallet->AddDestData(dest, key, sRequest); } + +unsigned long long WalletModel::updateWeight() +{ + if (!wallet) + return 0; + + TRY_LOCK(cs_main, lockMain); + if (!lockMain) + return 0; + + TRY_LOCK(wallet->cs_wallet, lockWallet); + if (!lockWallet) + return 0; + + return wallet->GetStakeWeight(); +} diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 7a47eda86..b6ae13234 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -199,6 +199,7 @@ public: void loadReceiveRequests(std::vector& vReceiveRequests); bool saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest); + unsigned long long updateWeight(); private: CWallet *wallet; diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index 6ce98ef16..f2845fa59 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -274,6 +274,21 @@ void WalletView::unlockWallet() } } +void WalletView::lockWallet() +{ + if(!walletModel) + return; + + walletModel->setWalletLocked(true); +} + +unsigned long long WalletView::updateWeight() +{ + if(!walletModel) + return 0; + return walletModel->updateWeight(); +} + void WalletView::usedSendingAddresses() { if(!walletModel) diff --git a/src/qt/walletview.h b/src/qt/walletview.h index dbb289f42..e45aea1ca 100644 --- a/src/qt/walletview.h +++ b/src/qt/walletview.h @@ -99,6 +99,8 @@ public Q_SLOTS: /** Ask for passphrase to unlock wallet temporarily */ void unlockWallet(); + void lockWallet(); + /** Show used sending addresses */ void usedSendingAddresses(); /** Show used receiving addresses */ @@ -110,6 +112,8 @@ public Q_SLOTS: /** Show progress dialog e.g. for rescan */ void showProgress(const QString &title, int nProgress); + unsigned long long updateWeight(); + Q_SIGNALS: /** Signal that we want to show the main window */ void showNormalIfMinimized(); diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index cdb87de60..b0e7ef795 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -42,7 +42,7 @@ double GetDifficulty(const CBlockIndex* blockindex) if (chainActive.Tip() == NULL) return 1.0; else - blockindex = chainActive.Tip(); + blockindex = GetLastBlockIndex(chainActive.Tip(), false); } int nShift = (blockindex->nBits >> 24) & 0xff; @@ -77,17 +77,20 @@ UniValue blockheaderToJSON(const CBlockIndex* blockindex) result.push_back(Pair("version", blockindex->nVersion)); result.push_back(Pair("merkleroot", blockindex->hashMerkleRoot.GetHex())); result.push_back(Pair("time", (int64_t)blockindex->nTime)); - result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast())); + result.push_back(Pair("mediantime", (int64_t)blockindex->GetPastTimeLimit())); result.push_back(Pair("nonce", (uint64_t)blockindex->nNonce)); result.push_back(Pair("bits", strprintf("%08x", blockindex->nBits))); result.push_back(Pair("difficulty", GetDifficulty(blockindex))); result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex())); + result.push_back(Pair("modifier", blockindex->nStakeModifier.GetHex())); if (blockindex->pprev) result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex())); CBlockIndex *pnext = chainActive.Next(blockindex); if (pnext) result.push_back(Pair("nextblockhash", pnext->GetBlockHash().GetHex())); + + return result; } @@ -183,7 +186,7 @@ UniValue blockToDeltasJSON(const CBlock& block, const CBlockIndex* blockindex) } result.push_back(Pair("deltas", deltas)); result.push_back(Pair("time", block.GetBlockTime())); - result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast())); + result.push_back(Pair("mediantime", (int64_t)blockindex->GetPastTimeLimit())); result.push_back(Pair("nonce", (uint64_t)block.nNonce)); result.push_back(Pair("bits", strprintf("%08x", block.nBits))); result.push_back(Pair("difficulty", GetDifficulty(blockindex))); @@ -197,10 +200,45 @@ UniValue blockToDeltasJSON(const CBlock& block, const CBlockIndex* blockindex) return result; } +double GetPoSKernelPS() +{ + int nPoSInterval = 72; + double dStakeKernelsTriedAvg = 0; + int nStakesHandled = 0, nStakesTime = 0; + + CBlockIndex* pindex = chainActive.Tip();; + CBlockIndex* pindexPrevStake = NULL; + + while (pindex && nStakesHandled < nPoSInterval) + { + if (pindex->IsProofOfStake()) + { + if (pindexPrevStake) + { + dStakeKernelsTriedAvg += GetDifficulty(pindexPrevStake) * 4294967296.0; + nStakesTime += pindexPrevStake->nTime - pindex->nTime; + nStakesHandled++; + } + pindexPrevStake = pindex; + } + + pindex = pindex->pprev; + } + + double result = 0; + + if (nStakesTime) + result = dStakeKernelsTriedAvg / nStakesTime; + + result *= 16; + + return result; +} + UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false) { UniValue result(UniValue::VOBJ); - result.push_back(Pair("hash", block.GetHash().GetHex())); + result.push_back(Pair("hash", blockindex->GetBlockHash().GetHex())); int confirmations = -1; // Only report confirmations if the block is on the main chain if (chainActive.Contains(blockindex)) @@ -224,7 +262,7 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx } result.push_back(Pair("tx", txs)); result.push_back(Pair("time", block.GetBlockTime())); - result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast())); + result.push_back(Pair("mediantime", (int64_t)blockindex->GetPastTimeLimit())); result.push_back(Pair("nonce", (uint64_t)block.nNonce)); result.push_back(Pair("bits", strprintf("%08x", block.nBits))); result.push_back(Pair("difficulty", GetDifficulty(blockindex))); @@ -235,6 +273,10 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx CBlockIndex *pnext = chainActive.Next(blockindex); if (pnext) result.push_back(Pair("nextblockhash", pnext->GetBlockHash().GetHex())); + result.push_back(Pair("flags", blockindex->IsProofOfStake()? "proof-of-stake" : "proof-of-work")); + result.push_back(Pair("modifier", blockindex->nStakeModifier.GetHex())); + if (block.IsProofOfStake()) + result.push_back(Pair("signature", HexStr(block.vchBlockSig.begin(), block.vchBlockSig.end()))); return result; } @@ -274,19 +316,26 @@ UniValue getbestblockhash(const UniValue& params, bool fHelp) UniValue getdifficulty(const UniValue& params, bool fHelp) { - if (fHelp || params.size() != 0) - throw runtime_error( - "getdifficulty\n" - "\nReturns the proof-of-work difficulty as a multiple of the minimum difficulty.\n" - "\nResult:\n" - "n.nnn (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty.\n" - "\nExamples:\n" - + HelpExampleCli("getdifficulty", "") - + HelpExampleRpc("getdifficulty", "") - ); + if (fHelp || params.size() != 0) + throw runtime_error( + "getdifficulty\n" + "\nReturns the difficulty as a multiple of the minimum difficulty.\n" + "\nResult:\n" + "{ (json object)\n" + " \"proof-of-work\" : n.nnn, (numeric) the proof-of-work difficulty as a multiple of the minimum difficulty.\n" + " \"proof-of-stake\" : n.nnn (numeric) the proof-of-stake difficulty as a multiple of the minimum difficulty.\n" + "}\n" + "\nExamples:\n" + + HelpExampleCli("getdifficulty", "") + + HelpExampleRpc("getdifficulty", "") + ); LOCK(cs_main); - return GetDifficulty(); + + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("proof-of-work", GetDifficulty())); + obj.push_back(Pair("proof-of-stake", GetDifficulty(GetLastBlockIndex(chainActive.Tip(), true)))); + return obj; } UniValue mempoolToJSON(bool fVerbose = false) @@ -700,6 +749,7 @@ UniValue gettxout(const UniValue& params, bool fHelp) " },\n" " \"version\" : n, (numeric) The version\n" " \"coinbase\" : true|false (boolean) Coinbase or not\n" + " \"coinstake\" : true|false (boolean) Coinstake or not\n" "}\n" "\nExamples:\n" @@ -749,6 +799,7 @@ UniValue gettxout(const UniValue& params, bool fHelp) ret.push_back(Pair("scriptPubKey", o)); ret.push_back(Pair("version", coins.nVersion)); ret.push_back(Pair("coinbase", coins.fCoinBase)); + ret.push_back(Pair("coinstake", coins.fCoinStake)); return ret; } @@ -837,7 +888,10 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) " \"blocks\": xxxxxx, (numeric) the current number of blocks processed in the server\n" " \"headers\": xxxxxx, (numeric) the current number of headers we have validated\n" " \"bestblockhash\": \"...\", (string) the hash of the currently best block\n" - " \"difficulty\": xxxxxx, (numeric) the current difficulty\n" + " \"difficulty\": { (json object)\n" + " \"proof-of-work\": xxxxxx, (numeric) the current proof-of-work difficulty\n" + " \"proof-of-stake\": xxxxxx (numeric) the current proof-of-stake difficulty\n" + " },\n" " \"mediantime\": xxxxxx, (numeric) median time for the current best block\n" " \"verificationprogress\": xxxx, (numeric) estimate of verification progress [0..1]\n" " \"chainwork\": \"xxxx\" (string) total amount of work in active chain, in hexadecimal\n" @@ -870,13 +924,17 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) LOCK(cs_main); + UniValue diff(UniValue::VOBJ); + diff.push_back(Pair("proof-of-work", (double)GetDifficulty())); + diff.push_back(Pair("proof-of-stake", (double)GetDifficulty(GetLastBlockIndex(chainActive.Tip(), true)))); + UniValue obj(UniValue::VOBJ); obj.push_back(Pair("chain", Params().NetworkIDString())); obj.push_back(Pair("blocks", (int)chainActive.Height())); obj.push_back(Pair("headers", pindexBestHeader ? pindexBestHeader->nHeight : -1)); obj.push_back(Pair("bestblockhash", chainActive.Tip()->GetBlockHash().GetHex())); - obj.push_back(Pair("difficulty", (double)GetDifficulty())); - obj.push_back(Pair("mediantime", (int64_t)chainActive.Tip()->GetMedianTimePast())); + obj.push_back(Pair("difficulty", diff)); + obj.push_back(Pair("mediantime", (int64_t)chainActive.Tip()->GetPastTimeLimit())); obj.push_back(Pair("verificationprogress", Checkpoints::GuessVerificationProgress(Params().Checkpoints(), chainActive.Tip()))); obj.push_back(Pair("chainwork", chainActive.Tip()->nChainWork.GetHex())); obj.push_back(Pair("pruned", fPruneMode)); @@ -885,9 +943,6 @@ UniValue getblockchaininfo(const UniValue& params, bool fHelp) CBlockIndex* tip = chainActive.Tip(); UniValue softforks(UniValue::VARR); UniValue bip9_softforks(UniValue::VARR); - softforks.push_back(SoftForkDesc("bip34", 2, tip, consensusParams)); - softforks.push_back(SoftForkDesc("bip66", 3, tip, consensusParams)); - softforks.push_back(SoftForkDesc("bip65", 4, tip, consensusParams)); bip9_softforks.push_back(BIP9SoftForkDesc("csv", consensusParams, Consensus::DEPLOYMENT_CSV)); obj.push_back(Pair("softforks", softforks)); obj.push_back(Pair("bip9_softforks", bip9_softforks)); diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 1048344e0..8b540f1ee 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -14,11 +14,16 @@ #include "miner.h" #include "net.h" #include "pow.h" +#include "pos.h" #include "rpcserver.h" #include "txmempool.h" +#include "timedata.h" #include "util.h" #include "utilstrencodings.h" #include "validationinterface.h" +#ifdef ENABLE_WALLET +#include "wallet/wallet.h" +#endif #include @@ -157,7 +162,7 @@ UniValue generate(const UniValue& params, bool fHelp) UniValue blockHashes(UniValue::VARR); while (nHeight < nHeightEnd) { - auto_ptr pblocktemplate(CreateNewBlock(Params(), coinbaseScript->reserveScript)); + auto_ptr pblocktemplate(CreateNewBlock(Params(), coinbaseScript->reserveScript, 0, false)); if (!pblocktemplate.get()) throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block"); CBlock *pblock = &pblocktemplate->block; @@ -165,16 +170,17 @@ UniValue generate(const UniValue& params, bool fHelp) LOCK(cs_main); IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce); } - while (!CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) { + while (!CheckProofOfWork(pblock->GetPoWHash(), pblock->nBits, Params().GetConsensus())) { // 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, Params(), NULL, pblock, true, NULL)) + uint256 hash = pblock->GetHash(); + if (!ProcessNewBlock(state, Params(), NULL, pblock, true, NULL, hash)) throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted"); ++nHeight; - blockHashes.push_back(pblock->GetHash().GetHex()); + blockHashes.push_back(hash.GetHex()); //mark script as important because it was used at least for one coinbase output coinbaseScript->KeepScript(); @@ -426,7 +432,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) if (block.hashPrevBlock != pindexPrev->GetBlockHash()) return "inconclusive-not-best-prevblk"; CValidationState state; - TestBlockValidity(state, Params(), block, pindexPrev, false, true); + TestBlockValidity(state, Params(), block, pindexPrev, false, true, true); return BIP22ValidationResult(state); } } @@ -440,6 +446,9 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) if (IsInitialBlockDownload()) throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks..."); + if (chainActive.Tip()->nHeight > Params().GetConsensus().nLastPOWBlock) + throw JSONRPCError(RPC_MISC_ERROR, "No more PoW blocks"); + static unsigned int nTransactionsUpdatedLast; if (!lpval.isNull()) @@ -510,7 +519,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) pblocktemplate = NULL; } CScript scriptDummy = CScript() << OP_TRUE; - pblocktemplate = CreateNewBlock(Params(), scriptDummy); + pblocktemplate = CreateNewBlock(Params(), scriptDummy, 0, false); if (!pblocktemplate) throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory"); @@ -578,7 +587,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0].vout[0].nValue)); result.push_back(Pair("longpollid", chainActive.Tip()->GetBlockHash().GetHex() + i64tostr(nTransactionsUpdatedLast))); result.push_back(Pair("target", hashTarget.GetHex())); - result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1)); + result.push_back(Pair("mintime", (int64_t)pindexPrev->GetPastTimeLimit()+1)); result.push_back(Pair("mutable", aMutable)); result.push_back(Pair("noncerange", "00000000ffffffff")); result.push_back(Pair("sigoplimit", (int64_t)MAX_BLOCK_SIGOPS)); @@ -650,9 +659,9 @@ UniValue submitblock(const UniValue& params, bool fHelp) } CValidationState state; - submitblock_StateCatcher sc(block.GetHash()); + submitblock_StateCatcher sc(hash); RegisterValidationInterface(&sc); - bool fAccepted = ProcessNewBlock(state, Params(), NULL, &block, true, NULL); + bool fAccepted = ProcessNewBlock(state, Params(), NULL, &block, true, NULL, hash); UnregisterValidationInterface(&sc); if (fBlockPresent) { @@ -700,6 +709,128 @@ UniValue estimatefee(const UniValue& params, bool fHelp) return ValueFromAmount(feeRate.GetFeePerK()); } +UniValue checkkernel(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "checkkernel [{\"txid\":txid,\"vout\":n},...] [createblocktemplate=false]\n" + "Check if one of given inputs is a kernel input at the moment.\n" + ); + + RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VBOOL)); + + UniValue inputs = params[0].get_array(); + bool fCreateBlockTemplate = params.size() > 1 ? params[1].get_bool() : false; + + if (vNodes.empty()) + throw JSONRPCError(-9, "BlackCoin is not connected!"); + + if (IsInitialBlockDownload()) + throw JSONRPCError(-10, "BlackCoin is downloading blocks..."); + + COutPoint kernel; + CBlockIndex* pindexPrev = chainActive.Tip(); + CBlockHeader blockHeader = pindexPrev->GetBlockHeader(); + unsigned int nBits = GetNextTargetRequired(pindexPrev, &blockHeader, true, Params().GetConsensus()); + int64_t nTime = GetAdjustedTime(); + nTime &= ~STAKE_TIMESTAMP_MASK; + + for (unsigned int idx = 0; idx < inputs.size(); idx++) { + const UniValue& input = inputs[idx]; + const UniValue& o = input.get_obj(); + + const UniValue& txid_v = find_value(o, "txid"); + if (!txid_v.isStr()) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, missing txid key"); + string txid = txid_v.get_str(); + if (!IsHex(txid)) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected hex txid"); + + const UniValue& vout_v = find_value(o, "vout"); + if (!vout_v.isNum()) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, missing vout key"); + int nOutput = vout_v.get_int(); + if (nOutput < 0) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); + + COutPoint cInput(uint256S(txid), nOutput); + if (CheckKernel(pindexPrev, nBits, nTime, cInput)) + { + kernel = cInput; + break; + } + } + + + UniValue result(UniValue::VOBJ); + result.push_back(Pair("found", !kernel.IsNull())); + + if (kernel.IsNull()) + return result; + + UniValue oKernel(UniValue::VOBJ); + oKernel.push_back(Pair("txid", kernel.hash.GetHex())); + oKernel.push_back(Pair("vout", (int64_t)kernel.n)); + oKernel.push_back(Pair("time", nTime)); + result.push_back(Pair("kernel", oKernel)); + + if (!fCreateBlockTemplate) + return result; + + int64_t nFees; + if (!pwalletMain->IsLocked()) + pwalletMain->TopUpKeyPool(); + + CReserveKey pMiningKey(pwalletMain); + auto_ptr pblocktemplate(CreateNewBlock(Params(), pMiningKey.reserveScript, &nFees, true)); + if (!pblocktemplate.get()) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block"); + + CBlock *pblock = &pblocktemplate->block; + pblock->nTime = pblock->vtx[0].nTime = nTime; + + CDataStream ss(SER_DISK, PROTOCOL_VERSION); + ss << *pblock; + + result.push_back(Pair("blocktemplate", HexStr(ss.begin(), ss.end()))); + result.push_back(Pair("blocktemplatefees", nFees)); + + CPubKey pubkey; + if (!pMiningKey.GetReservedKey(pubkey)) + throw JSONRPCError(RPC_MISC_ERROR, "GetReservedKey failed"); + + result.push_back(Pair("blocktemplatesignkey", HexStr(pubkey))); + + return result; + if (fHelp || params.size() != 1) + throw runtime_error( + "estimatefee nblocks\n" + "\nEstimates the approximate fee per kilobyte needed for a transaction to begin\n" + "confirmation within nblocks blocks.\n" + "\nArguments:\n" + "1. nblocks (numeric)\n" + "\nResult:\n" + "n (numeric) estimated fee-per-kilobyte\n" + "\n" + "A negative value is returned if not enough transactions and blocks\n" + "have been observed to make an estimate.\n" + "\nExample:\n" + + HelpExampleCli("estimatefee", "6") + ); + + RPCTypeCheck(params, boost::assign::list_of(UniValue::VNUM)); + + int nBlocks = params[0].get_int(); + if (nBlocks < 1) + nBlocks = 1; + + CFeeRate feeRate = mempool.estimateFee(nBlocks); + if (feeRate == CFeeRate(0)) + return -1.0; + + return ValueFromAmount(feeRate.GetFeePerK()); +} + UniValue estimatepriority(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 1) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 10477824a..779587660 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -56,7 +56,10 @@ UniValue getinfo(const UniValue& params, bool fHelp) " \"timeoffset\": xxxxx, (numeric) the time offset\n" " \"connections\": xxxxx, (numeric) the number of connections\n" " \"proxy\": \"host:port\", (string, optional) the proxy used by the server\n" - " \"difficulty\": xxxxxx, (numeric) the current difficulty\n" + " \"difficulty\": { (json object)\n" + " \"proof-of-work\": xxxxxx, (numeric) the current proof-of-work difficulty\n" + " \"proof-of-stake\": xxxxxx (numeric) the current proof-of-stake difficulty\n" + " },\n" " \"testnet\": true|false, (boolean) if the server is using testnet or not\n" " \"keypoololdest\": xxxxxx, (numeric) the timestamp (seconds since GMT epoch) of the oldest pre-generated key in the key pool\n" " \"keypoolsize\": xxxx, (numeric) how many new keys are pre-generated\n" @@ -79,6 +82,10 @@ UniValue getinfo(const UniValue& params, bool fHelp) proxyType proxy; GetProxy(NET_IPV4, proxy); + UniValue diff(UniValue::VOBJ); + diff.push_back(Pair("proof-of-work", (double)GetDifficulty())); + diff.push_back(Pair("proof-of-stake", (double)GetDifficulty(GetLastBlockIndex(chainActive.Tip(), true)))); + UniValue obj(UniValue::VOBJ); obj.push_back(Pair("version", CLIENT_VERSION)); obj.push_back(Pair("protocolversion", PROTOCOL_VERSION)); @@ -92,7 +99,7 @@ UniValue getinfo(const UniValue& params, bool fHelp) obj.push_back(Pair("timeoffset", GetTimeOffset())); obj.push_back(Pair("connections", (int)vNodes.size())); obj.push_back(Pair("proxy", (proxy.IsValid() ? proxy.proxy.ToStringIPPort() : string()))); - obj.push_back(Pair("difficulty", (double)GetDifficulty())); + obj.push_back(Pair("difficulty", diff)); obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC())); #ifdef ENABLE_WALLET if (pwalletMain) { @@ -597,6 +604,7 @@ UniValue getaddressutxos(const UniValue& params, bool fHelp) output.push_back(Pair("script", HexStr(it->second.script.begin(), it->second.script.end()))); output.push_back(Pair("satoshis", it->second.satoshis)); output.push_back(Pair("height", it->second.blockHeight)); + output.push_back(Pair("txtime", it->second.nTime)); utxos.push_back(output); } diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 64050694e..1a229a21f 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -20,6 +20,7 @@ #include "script/script_error.h" #include "script/sign.h" #include "script/standard.h" +#include "timedata.h" #include "txmempool.h" #include "uint256.h" #include "utilstrencodings.h" @@ -477,6 +478,8 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp) throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, locktime out of range"); rawTx.nLockTime = nLockTime; } + + rawTx.nTime = GetAdjustedTime(); for (unsigned int idx = 0; idx < inputs.size(); idx++) { const UniValue& input = inputs[idx]; diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 149a4f015..253df86fa 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -63,7 +63,7 @@ static inline void popstack(vector& stack) stack.pop_back(); } -bool static IsCompressedOrUncompressedPubKey(const valtype &vchPubKey) { +bool IsCompressedOrUncompressedPubKey(const vector &vchPubKey) { if (vchPubKey.size() < 33) { // Non-canonical public key: too short return false; @@ -95,7 +95,7 @@ bool static IsCompressedOrUncompressedPubKey(const valtype &vchPubKey) { * * This function is consensus-critical since BIP66. */ -bool static IsValidSignatureEncoding(const std::vector &sig) { +bool static IsValidSignatureEncoding(const std::vector &sig, bool haveHashType = true) { // Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] [sighash] // * total-length: 1-byte length descriptor of everything that follows, // excluding the sighash byte. @@ -116,7 +116,7 @@ bool static IsValidSignatureEncoding(const std::vector &sig) { if (sig[0] != 0x30) return false; // Make sure the length covers the entire signature. - if (sig[1] != sig.size() - 3) return false; + if (sig[1] != sig.size() - (haveHashType ? 3 : 2)) return false; // Extract the length of the R element. unsigned int lenR = sig[3]; @@ -129,7 +129,7 @@ bool static IsValidSignatureEncoding(const std::vector &sig) { // Verify that the length of the signature matches the sum of the length // of the elements. - if ((size_t)(lenR + lenS + 7) != sig.size()) return false; + if ((size_t)(lenR + lenS + (haveHashType ? 7 : 6)) != sig.size()) return false; // Check whether the R element is an integer. if (sig[2] != 0x02) return false; @@ -160,17 +160,33 @@ bool static IsValidSignatureEncoding(const std::vector &sig) { return true; } -bool static IsLowDERSignature(const valtype &vchSig, ScriptError* serror) { - if (!IsValidSignatureEncoding(vchSig)) { +bool IsLowDERSignature(const valtype &vchSig, ScriptError* serror, bool haveHashType) { + if (!IsValidSignatureEncoding(vchSig, haveHashType)) { return set_error(serror, SCRIPT_ERR_SIG_DER); } - std::vector vchSigCopy(vchSig.begin(), vchSig.begin() + vchSig.size() - 1); - if (!CPubKey::CheckLowS(vchSigCopy)) { + unsigned int nLenR = vchSig[3]; + unsigned int nLenS = vchSig[5+nLenR]; + const unsigned char *S = &vchSig[6+nLenR]; + // 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 (!CPubKey::CheckSignatureElement(S, nLenS, true)) return set_error(serror, SCRIPT_ERR_SIG_HIGH_S); - } + return true; } +//bool IsLowDERSignature(const valtype &vchSig, ScriptError* serror) { +// if (!IsValidSignatureEncoding(vchSig)) { +// return set_error(serror, SCRIPT_ERR_SIG_DER); +// } +// std::vector vchSigCopy(vchSig.begin(), vchSig.begin() + vchSig.size() - 1); +// if (!CPubKey::CheckLowS(vchSigCopy)) { +// return set_error(serror, SCRIPT_ERR_SIG_HIGH_S); +// } +// return true; +//} + bool static IsDefinedHashtypeSignature(const valtype &vchSig) { if (vchSig.size() == 0) { return false; @@ -200,7 +216,7 @@ bool CheckSignatureEncoding(const vector &vchSig, unsigned int fl } bool static CheckPubKeyEncoding(const valtype &vchSig, unsigned int flags, ScriptError* serror) { - if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsCompressedOrUncompressedPubKey(vchSig)) { + if ((flags & (SCRIPT_VERIFY_DERKEY | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsCompressedOrUncompressedPubKey(vchSig)) { return set_error(serror, SCRIPT_ERR_PUBKEYTYPE); } return true; @@ -1089,6 +1105,8 @@ public: void Serialize(S &s, int nType, int nVersion) const { // Serialize nVersion ::Serialize(s, txTo.nVersion, nType, nVersion); + // Serialize nTime + ::Serialize(s, txTo.nTime, nType, nVersion); // Serialize vin unsigned int nInputs = fAnyoneCanPay ? 1 : txTo.vin.size(); ::WriteCompactSize(s, nInputs); diff --git a/src/script/interpreter.h b/src/script/interpreter.h index e5cb7290f..f890ccc78 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -82,6 +82,10 @@ enum // See BIP65 for details. SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), + // Evaluating a pubkey that is not (0x04 + 64 bytes) or (0x02 or 0x03 + 32 bytes) by checksig causes script failure. + // (softfork safe) + SCRIPT_VERIFY_DERKEY = (1U << 10), + // support CHECKSEQUENCEVERIFY opcode // // See BIP112 for details @@ -138,6 +142,9 @@ public: MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn) : TransactionSignatureChecker(&txTo, nInIn), txTo(*txToIn) {} }; +bool IsCompressedOrUncompressedPubKey(const std::vector &vchPubKey); +bool IsLowDERSignature(const std::vector &vchSig, ScriptError* serror, bool haveHashType = true); + bool EvalScript(std::vector >& 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); diff --git a/src/script/script.cpp b/src/script/script.cpp index 3e4b72f5d..3b622a4e9 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -221,6 +221,16 @@ bool CScript::IsPayToScriptHash() const (*this)[22] == OP_EQUAL); } + + +bool CScript::IsPayToPublicKey() const +{ + // Extra-fast test for pay-to-pubkey CScripts: + return (this->size() == 35 && + (*this)[0] == 0x21 && + (*this)[34] == OP_CHECKSIG); +} + bool CScript::IsPushOnly(const_iterator pc) const { while (pc < end()) diff --git a/src/script/script.h b/src/script/script.h index 9dd75a558..40feb906f 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -612,18 +612,15 @@ public: bool IsPayToScriptHash() const; + bool IsPayToPublicKey() const; + /** Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical). */ bool IsPushOnly(const_iterator pc) const; 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. - */ bool IsUnspendable() const { - return (size() > 0 && *begin() == OP_RETURN); + return (size() > 0 && *begin() == OP_RETURN); } void clear() diff --git a/src/script/standard.h b/src/script/standard.h index 64bf010ec..a85aec5ca 100644 --- a/src/script/standard.h +++ b/src/script/standard.h @@ -40,7 +40,12 @@ extern unsigned nMaxDatacarrierBytes; * 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; +static const unsigned int MANDATORY_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH | + SCRIPT_VERIFY_DERKEY | + SCRIPT_VERIFY_LOW_S | + SCRIPT_VERIFY_NULLDUMMY | + SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY | + SCRIPT_VERIFY_DERSIG; enum txnouttype { diff --git a/src/test/alert_tests.cpp b/src/test/alert_tests.cpp index 0895ef332..d274e9019 100644 --- a/src/test/alert_tests.cpp +++ b/src/test/alert_tests.cpp @@ -200,7 +200,7 @@ BOOST_AUTO_TEST_CASE(PartitionAlert) CCriticalSection csDummy; CBlockIndex indexDummy[100]; CChainParams& params = Params(CBaseChainParams::MAIN); - int64_t nPowTargetSpacing = params.GetConsensus().nPowTargetSpacing; + int64_t nTargetSpacing = params.GetConsensus().nTargetSpacing; // Generate fake blockchain timestamps relative to // an arbitrary time: @@ -212,22 +212,22 @@ BOOST_AUTO_TEST_CASE(PartitionAlert) if (i == 0) indexDummy[i].pprev = NULL; else indexDummy[i].pprev = &indexDummy[i-1]; indexDummy[i].nHeight = i; - indexDummy[i].nTime = now - (100-i)*nPowTargetSpacing; + indexDummy[i].nTime = now - (100-i)*nTargetSpacing; // Other members don't matter, the partition check code doesn't // use them } strMiscWarning = ""; - // Test 1: chain with blocks every nPowTargetSpacing seconds, + // Test 1: chain with blocks every nTargetSpacing seconds, // as normal, no worries: - PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing); + PartitionCheck(falseFunc, csDummy, &indexDummy[99], nTargetSpacing); BOOST_CHECK_MESSAGE(strMiscWarning.empty(), strMiscWarning); // Test 2: go 3.5 hours without a block, expect a warning: now += 3*60*60+30*60; SetMockTime(now); - PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing); + PartitionCheck(falseFunc, csDummy, &indexDummy[99], nTargetSpacing); BOOST_CHECK(!strMiscWarning.empty()); BOOST_TEST_MESSAGE(std::string("Got alert text: ")+strMiscWarning); strMiscWarning = ""; @@ -236,16 +236,16 @@ BOOST_AUTO_TEST_CASE(PartitionAlert) // code: now += 60*10; SetMockTime(now); - PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing); + PartitionCheck(falseFunc, csDummy, &indexDummy[99], nTargetSpacing); BOOST_CHECK(strMiscWarning.empty()); // Test 4: get 2.5 times as many blocks as expected: now += 60*60*24; // Pretend it is a day later SetMockTime(now); - int64_t quickSpacing = nPowTargetSpacing*2/5; + int64_t quickSpacing = nTargetSpacing*2/5; for (int i = 0; i < 100; i++) // Tweak chain timestamps: indexDummy[i].nTime = now - (100-i)*quickSpacing; - PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing); + PartitionCheck(falseFunc, csDummy, &indexDummy[99], nTargetSpacing); BOOST_CHECK(!strMiscWarning.empty()); BOOST_TEST_MESSAGE(std::string("Got alert text: ")+strMiscWarning); strMiscWarning = ""; diff --git a/src/test/checkblock_tests.cpp b/src/test/checkblock_tests.cpp index c945a95ad..20b29d736 100644 --- a/src/test/checkblock_tests.cpp +++ b/src/test/checkblock_tests.cpp @@ -57,7 +57,7 @@ BOOST_AUTO_TEST_CASE(May15) // After May 15'th, big blocks are OK: forkingBlock.nTime = tMay15; // Invalidates PoW - BOOST_CHECK(CheckBlock(forkingBlock, state, false, false)); + BOOST_CHECK(CheckBlock(forkingBlock, state, forkingBlock.GetHash(), false, false)); } SetMockTime(0); diff --git a/src/test/main_tests.cpp b/src/test/main_tests.cpp index dbfbdd934..bff5e5801 100644 --- a/src/test/main_tests.cpp +++ b/src/test/main_tests.cpp @@ -12,48 +12,9 @@ BOOST_FIXTURE_TEST_SUITE(main_tests, TestingSetup) -static void TestBlockSubsidyHalvings(const Consensus::Params& consensusParams) -{ - int maxHalvings = 64; - CAmount nInitialSubsidy = 50 * COIN; - - CAmount nPreviousSubsidy = nInitialSubsidy * 2; // for height == 0 - BOOST_CHECK_EQUAL(nPreviousSubsidy, nInitialSubsidy * 2); - for (int nHalvings = 0; nHalvings < maxHalvings; nHalvings++) { - int nHeight = nHalvings * consensusParams.nSubsidyHalvingInterval; - CAmount nSubsidy = GetBlockSubsidy(nHeight, consensusParams); - BOOST_CHECK(nSubsidy <= nInitialSubsidy); - BOOST_CHECK_EQUAL(nSubsidy, nPreviousSubsidy / 2); - nPreviousSubsidy = nSubsidy; - } - BOOST_CHECK_EQUAL(GetBlockSubsidy(maxHalvings * consensusParams.nSubsidyHalvingInterval, consensusParams), 0); -} - -static void TestBlockSubsidyHalvings(int nSubsidyHalvingInterval) -{ - Consensus::Params consensusParams; - consensusParams.nSubsidyHalvingInterval = nSubsidyHalvingInterval; - TestBlockSubsidyHalvings(consensusParams); -} - BOOST_AUTO_TEST_CASE(block_subsidy_test) { - TestBlockSubsidyHalvings(Params(CBaseChainParams::MAIN).GetConsensus()); // As in main - TestBlockSubsidyHalvings(150); // As in regtest - TestBlockSubsidyHalvings(1000); // Just another interval -} -BOOST_AUTO_TEST_CASE(subsidy_limit_test) -{ - const Consensus::Params& consensusParams = Params(CBaseChainParams::MAIN).GetConsensus(); - CAmount nSum = 0; - for (int nHeight = 0; nHeight < 14000000; nHeight += 1000) { - CAmount nSubsidy = GetBlockSubsidy(nHeight, consensusParams); - BOOST_CHECK(nSubsidy <= 50 * COIN); - nSum += nSubsidy * 1000; - BOOST_CHECK(MoneyRange(nSum)); - } - BOOST_CHECK_EQUAL(nSum, 2099999997690000ULL); } bool ReturnFalse() { return false; } diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index ab6485081..d5612bd63 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -99,7 +99,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { CBlock *pblock = &pblocktemplate->block; // pointer for convenience pblock->nVersion = 1; - pblock->nTime = chainActive.Tip()->GetMedianTimePast()+1; + pblock->nTime = chainActive.Tip()->GetPastTimeLimit()+1; CMutableTransaction txCoinbase(pblock->vtx[0]); txCoinbase.nVersion = 1; txCoinbase.vin[0].scriptSig = CScript(); @@ -114,7 +114,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) pblock->hashMerkleRoot = BlockMerkleRoot(*pblock); pblock->nNonce = blockinfo[i].nonce; CValidationState state; - BOOST_CHECK(ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL)); + BOOST_CHECK(ProcessNewBlock(state, chainparams, NULL, pblock, true, NULL, pblock->GetHash())); BOOST_CHECK(state.IsValid()); pblock->hashPrevBlock = pblock->GetHash(); } @@ -283,8 +283,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) } // non-final txs in mempool - SetMockTime(chainActive.Tip()->GetMedianTimePast()+1); - int flags = LOCKTIME_VERIFY_SEQUENCE|LOCKTIME_MEDIAN_TIME_PAST; + SetMockTime(chainActive.Tip()->GetPastTimeLimit()+1); // height map std::vector prevheights; @@ -303,23 +302,22 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.nLockTime = 0; hash = tx.GetHash(); mempool.addUnchecked(hash, entry.Fee(100000000L).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); - BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes - BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail - BOOST_CHECK(SequenceLocks(tx, flags, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 2))); // Sequence locks pass on 2nd block + BOOST_CHECK(CheckFinalTx(tx, 0)); // Locktime passes + BOOST_CHECK(!TestSequenceLocks(tx, 0)); // Sequence locks fail + BOOST_CHECK(SequenceLocks(tx, 0, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 2))); // Sequence locks pass on 2nd block // relative time locked tx.vin[0].prevout.hash = txFirst[1]->GetHash(); - tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | (((chainActive.Tip()->GetMedianTimePast()+1-chainActive[1]->GetMedianTimePast()) >> CTxIn::SEQUENCE_LOCKTIME_GRANULARITY) + 1); // txFirst[1] is the 3rd block + tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | (((chainActive.Tip()->GetPastTimeLimit()+1-chainActive[1]->GetPastTimeLimit()) >> CTxIn::SEQUENCE_LOCKTIME_GRANULARITY) + 1); // txFirst[1] is the 3rd block prevheights[0] = baseheight + 2; hash = tx.GetHash(); mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); - BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes - BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail - - for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++) + BOOST_CHECK(CheckFinalTx(tx, 0)); // Locktime passes + BOOST_CHECK(!TestSequenceLocks(tx, 0)); // Sequence locks fail + for (int i = 0; i < 11; i++) chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime += 512; //Trick the MedianTimePast - BOOST_CHECK(SequenceLocks(tx, flags, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 1))); // Sequence locks pass 512 seconds later - for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++) + BOOST_CHECK(SequenceLocks(tx, 0, &prevheights, CreateBlockIndex(chainActive.Tip()->nHeight + 1))); // Sequence locks pass 512 seconds later + for (int i = 0; i < 11; i++) chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime -= 512; //undo tricked MTP // absolute height locked @@ -329,34 +327,34 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.nLockTime = chainActive.Tip()->nHeight + 1; hash = tx.GetHash(); mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); - BOOST_CHECK(!CheckFinalTx(tx, flags)); // Locktime fails - BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass - BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetMedianTimePast())); // Locktime passes on 2nd block + BOOST_CHECK(!CheckFinalTx(tx, 0)); // Locktime fails + BOOST_CHECK(TestSequenceLocks(tx, 0)); // Sequence locks pass + BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetPastTimeLimit())); // Locktime passes on 2nd block // absolute time locked tx.vin[0].prevout.hash = txFirst[3]->GetHash(); - tx.nLockTime = chainActive.Tip()->GetMedianTimePast(); + tx.nLockTime = chainActive.Tip()->GetPastTimeLimit(); prevheights.resize(1); prevheights[0] = baseheight + 4; hash = tx.GetHash(); mempool.addUnchecked(hash, entry.Time(GetTime()).FromTx(tx)); - BOOST_CHECK(!CheckFinalTx(tx, flags)); // Locktime fails - BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass - BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetMedianTimePast() + 1)); // Locktime passes 1 second later + BOOST_CHECK(!CheckFinalTx(tx, 0)); // Locktime fails + BOOST_CHECK(TestSequenceLocks(tx, 0)); // Sequence locks pass + BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 2, chainActive.Tip()->GetPastTimeLimit() + 1)); // Locktime passes 1 second later // mempool-dependent transactions (not added) tx.vin[0].prevout.hash = hash; prevheights[0] = chainActive.Tip()->nHeight + 1; tx.nLockTime = 0; tx.vin[0].nSequence = 0; - BOOST_CHECK(CheckFinalTx(tx, flags)); // Locktime passes - BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass + BOOST_CHECK(CheckFinalTx(tx, 0)); // Locktime passes + BOOST_CHECK(TestSequenceLocks(tx, 0)); // Sequence locks pass tx.vin[0].nSequence = 1; - BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail + BOOST_CHECK(!TestSequenceLocks(tx, 0)); // Sequence locks fail tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG; - BOOST_CHECK(TestSequenceLocks(tx, flags)); // Sequence locks pass + BOOST_CHECK(TestSequenceLocks(tx, 0)); // Sequence locks pass tx.vin[0].nSequence = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | 1; - BOOST_CHECK(!TestSequenceLocks(tx, flags)); // Sequence locks fail + BOOST_CHECK(!TestSequenceLocks(tx, 0)); // Sequence locks fail BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); @@ -367,10 +365,10 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 3); delete pblocktemplate; // However if we advance height by 1 and time by 512, all of them should be mined - for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++) + for (int i = 0; i < 11; i++) chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime += 512; //Trick the MedianTimePast chainActive.Tip()->nHeight++; - SetMockTime(chainActive.Tip()->GetMedianTimePast() + 1); + SetMockTime(chainActive.Tip()->GetPastTimeLimit() + 1); BOOST_CHECK(pblocktemplate = CreateNewBlock(chainparams, scriptPubKey)); BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 5); diff --git a/src/test/pow_tests.cpp b/src/test/pow_tests.cpp index b6eb39bc3..33d570afe 100644 --- a/src/test/pow_tests.cpp +++ b/src/test/pow_tests.cpp @@ -26,7 +26,7 @@ BOOST_AUTO_TEST_CASE(get_next_work) pindexLast.nHeight = 32255; pindexLast.nTime = 1262152739; // Block #32255 pindexLast.nBits = 0x1d00ffff; - BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1d00d86a); + BOOST_CHECK_EQUAL(CalculateNextTargetRequired(&pindexLast, nLastRetargetTime, params), 0x1d00d86a); } /* Test the constraint on the upper bound for next work */ @@ -40,7 +40,7 @@ BOOST_AUTO_TEST_CASE(get_next_work_pow_limit) pindexLast.nHeight = 2015; pindexLast.nTime = 1233061996; // Block #2015 pindexLast.nBits = 0x1d00ffff; - BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1d00ffff); + BOOST_CHECK_EQUAL(CalculateNextTargetRequired(&pindexLast, nLastRetargetTime, params), 0x1d00ffff); } /* Test the constraint on the lower bound for actual time taken */ @@ -54,7 +54,7 @@ BOOST_AUTO_TEST_CASE(get_next_work_lower_limit_actual) pindexLast.nHeight = 68543; pindexLast.nTime = 1279297671; // Block #68543 pindexLast.nBits = 0x1c05a3f4; - BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1c0168fd); + BOOST_CHECK_EQUAL(CalculateNextTargetRequired(&pindexLast, nLastRetargetTime, params), 0x1c0168fd); } /* Test the constraint on the upper bound for actual time taken */ @@ -68,7 +68,7 @@ BOOST_AUTO_TEST_CASE(get_next_work_upper_limit_actual) pindexLast.nHeight = 46367; pindexLast.nTime = 1269211443; // Block #46367 pindexLast.nBits = 0x1c387f6f; - BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1d00e1fd); + BOOST_CHECK_EQUAL(CalculateNextTargetRequired(&pindexLast, nLastRetargetTime, params), 0x1d00e1fd); } BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test) @@ -80,7 +80,7 @@ BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test) for (int i = 0; i < 10000; i++) { blocks[i].pprev = i ? &blocks[i - 1] : NULL; blocks[i].nHeight = i; - blocks[i].nTime = 1269211443 + i * params.nPowTargetSpacing; + blocks[i].nTime = 1269211443 + i * params.nTargetSpacing; blocks[i].nBits = 0x207fffff; /* target 0x7fffff000... */ blocks[i].nChainWork = i ? blocks[i - 1].nChainWork + GetBlockProof(blocks[i - 1]) : arith_uint256(0); } diff --git a/src/test/scrypt_tests.cpp b/src/test/scrypt_tests.cpp new file mode 100644 index 000000000..acd7ddfe5 --- /dev/null +++ b/src/test/scrypt_tests.cpp @@ -0,0 +1,35 @@ +#include + +#include "uint256.h" +#include "util.h" +#include "crypto/scrypt.h" +#include "utilstrencodings.h" + +BOOST_AUTO_TEST_SUITE(scrypt_tests) + +BOOST_AUTO_TEST_CASE(scrypt_hashtest) +{ + // Test Scrypt hash with known inputs against expected outputs + #define HASHCOUNT 5 + const char* inputhex[HASHCOUNT] = { "020000004c1271c211717198227392b029a64a7971931d351b387bb80db027f270411e398a07046f7d4a08dd815412a8712f874a7ebf0507e3878bd24e20a3b73fd750a667d2f451eac7471b00de6659", "0200000011503ee6a855e900c00cfdd98f5f55fffeaee9b6bf55bea9b852d9de2ce35828e204eef76acfd36949ae56d1fbe81c1ac9c0209e6331ad56414f9072506a77f8c6faf551eac7471b00389d01", "02000000a72c8a177f523946f42f22c3e86b8023221b4105e8007e59e81f6beb013e29aaf635295cb9ac966213fb56e046dc71df5b3f7f67ceaeab24038e743f883aff1aaafaf551eac7471b0166249b", "010000007824bc3a8a1b4628485eee3024abd8626721f7f870f8ad4d2f33a27155167f6a4009d1285049603888fe85a84b6c803a53305a8d497965a5e896e1a00568359589faf551eac7471b0065434e", "0200000050bfd4e4a307a8cb6ef4aef69abc5c0f2d579648bd80d7733e1ccc3fbc90ed664a7f74006cb11bde87785f229ecd366c2d4e44432832580e0608c579e4cb76f383f7f551eac7471b00c36982" }; + const char* expected[HASHCOUNT] = { "00000000002bef4107f882f6115e0b01f348d21195dacd3582aa2dabd7985806" , "00000000003a0d11bdd5eb634e08b7feddcfbbf228ed35d250daf19f1c88fc94", "00000000000b40f895f288e13244728a6c2d9d59d8aff29c65f8dd5114a8ca81", "00000000003007005891cd4923031e99d8e8d72f6e8e7edc6a86181897e105fe", "000000000018f0b426a4afc7130ccb47fa02af730d345b4fe7c7724d3800ec8c" }; +#if defined(USE_SSE2) + scrypt_detect_sse2(); +#endif + uint256 scrypthash; + std::vector inputbytes; + char scratchpad[SCRYPT_SCRATCHPAD_SIZE]; + for (int i = 0; i < HASHCOUNT; i++) { + inputbytes = ParseHex(inputhex[i]); +#if defined(USE_SSE2) + // Test SSE2 scrypt + scrypt_1024_1_1_256_sp_sse2((const char*)&inputbytes[0], BEGIN(scrypthash), scratchpad); + BOOST_CHECK_EQUAL(scrypthash.ToString().c_str(), expected[i]); +#endif + // Test generic scrypt + scrypt_1024_1_1_256_sp_generic((const char*)&inputbytes[0], BEGIN(scrypthash), scratchpad); + BOOST_CHECK_EQUAL(scrypthash.ToString().c_str(), expected[i]); + } +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index f278d7e39..eb7400cf5 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -131,7 +131,7 @@ TestChain100Setup::CreateAndProcessBlock(const std::vector& while (!CheckProofOfWork(block.GetHash(), block.nBits, chainparams.GetConsensus())) ++block.nNonce; CValidationState state; - ProcessNewBlock(state, chainparams, NULL, &block, true, NULL); + ProcessNewBlock(state, chainparams, NULL, &block, true, NULL, block.GetHash()); CBlock result = block; delete pblocktemplate; diff --git a/src/txdb.cpp b/src/txdb.cpp index 08ef51ca1..85d5d1d3b 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -185,7 +185,7 @@ bool CBlockTreeDB::UpdateSpentIndex(const std::vector >&vect) { - CDBBatch batch(&GetObfuscateKey()); + CDBBatch batch(&GetObfuscateKey()); for (std::vector >::const_iterator it=vect.begin(); it!=vect.end(); it++) { if (it->second.IsNull()) { batch.Erase(make_pair(DB_ADDRESSUNSPENTINDEX, it->first)); @@ -198,7 +198,6 @@ bool CBlockTreeDB::UpdateAddressUnspentIndex(const std::vector > &unspentOutputs) { - boost::scoped_ptr pcursor(NewIterator()); pcursor->Seek(make_pair(DB_ADDRESSUNSPENTINDEX, CAddressIndexIteratorKey(type, addressHash))); @@ -367,10 +366,17 @@ bool CBlockTreeDB::LoadBlockIndexGuts() pindexNew->nBits = diskindex.nBits; pindexNew->nNonce = diskindex.nNonce; pindexNew->nStatus = diskindex.nStatus; + pindexNew->nStakeModifier = diskindex.nStakeModifier; pindexNew->nTx = diskindex.nTx; - if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, Params().GetConsensus())) - return error("LoadBlockIndex(): CheckProofOfWork failed: %s", pindexNew->ToString()); + // Litecoin: Disable PoW Sanity check while loading block index from disk. + // We use the sha256 hash for the block index for performance reasons, which is recorded for later use. + // CheckProofOfWork() uses the scrypt hash which is discarded after a block is accepted. + // While it is technically feasible to verify the PoW, doing so takes several minutes as it + // requires recomputing every PoW hash during every Litecoin startup. + // We opt instead to simply trust the data that is on your local disk. + //if (!CheckProofOfWork(pindexNew->GetBlockPoWHash(), pindexNew->nBits, Params().GetConsensus())) + // return error("LoadBlockIndex(): CheckProofOfWork failed: %s", pindexNew->ToString()); pcursor->Next(); } else { diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 2bb902f83..55356189a 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -647,7 +647,7 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list& rem void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight, int flags) { - // Remove transactions spending a coinbase which are now immature and no-longer-final transactions + // Remove transactions spending a coinbase or coinstake which are now immature and no-longer-final transactions LOCK(cs); list transactionsToRemove; for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { @@ -665,7 +665,7 @@ void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMem continue; const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); if (nCheckFrequency != 0) assert(coins); - if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { + if (!coins || (coins->IsCoinBase() || coins->IsCoinStake() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { transactionsToRemove.push_back(tx); break; } diff --git a/src/uint256.cpp b/src/uint256.cpp index c58c88bf4..75294474b 100644 --- a/src/uint256.cpp +++ b/src/uint256.cpp @@ -144,3 +144,10 @@ uint64_t uint256::GetHash(const uint256& salt) const return ((((uint64_t)b) << 32) | c); } + +uint64_t uint256::GetLow64() const +{ + assert(sizeof(data) >= 2); + const uint32_t *pn = (const uint32_t*)data; + return pn[0] | (uint64_t)pn[1] << 32; +} diff --git a/src/uint256.h b/src/uint256.h index 4495000f2..c44532f10 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -130,6 +130,7 @@ public: * @note This hash is not stable between little and big endian. */ uint64_t GetHash(const uint256& salt) const; + uint64_t GetLow64() const; }; /* uint256 from const char *. diff --git a/src/undo.h b/src/undo.h index 1c4ed95bf..55b35b67d 100644 --- a/src/undo.h +++ b/src/undo.h @@ -14,30 +14,33 @@ * * Contains the prevout's CTxOut being spent, and if this was the * last output of the affected transaction, its metadata as well - * (coinbase or not, height, transaction version) + * (coinbase or not, height, transaction version, time) */ class CTxInUndo { public: CTxOut txout; // the txout data before being spent bool fCoinBase; // if the outpoint was the last unspent: whether it belonged to a coinbase + bool fCoinStake; // if the outpoint was the last unspent: whether it belonged to a coinstake unsigned int nHeight; // if the outpoint was the last unspent: its height int nVersion; // if the outpoint was the last unspent: its version + unsigned int nTime; // if the outpoint was the last unspent: its time - CTxInUndo() : txout(), fCoinBase(false), nHeight(0), nVersion(0) {} - CTxInUndo(const CTxOut &txoutIn, bool fCoinBaseIn = false, unsigned int nHeightIn = 0, int nVersionIn = 0) : txout(txoutIn), fCoinBase(fCoinBaseIn), nHeight(nHeightIn), nVersion(nVersionIn) { } - + CTxInUndo() : txout(), fCoinBase(false), fCoinStake(false), nHeight(0), nVersion(0), nTime(0) {} + CTxInUndo(const CTxOut &txoutIn, bool fCoinBaseIn = false, bool fCoinStakeIn = false, unsigned int nHeightIn = 0, int nVersionIn = 0, unsigned int nTimeIn = 0) : txout(txoutIn), fCoinBase(fCoinBaseIn), fCoinStake(fCoinStakeIn), nHeight(nHeightIn), nVersion(nVersionIn), nTime(nTimeIn) { } unsigned int GetSerializeSize(int nType, int nVersion) const { - return ::GetSerializeSize(VARINT(nHeight*2+(fCoinBase ? 1 : 0)), nType, nVersion) + + return ::GetSerializeSize(VARINT(nHeight*4+(fCoinBase ? 1 : 0)+(fCoinStake ? 2 : 0)), nType, nVersion) + (nHeight > 0 ? ::GetSerializeSize(VARINT(this->nVersion), nType, nVersion) : 0) + + ::GetSerializeSize(this->nTime, nType, nVersion) + ::GetSerializeSize(CTxOutCompressor(REF(txout)), nType, nVersion); } template void Serialize(Stream &s, int nType, int nVersion) const { - ::Serialize(s, VARINT(nHeight*2+(fCoinBase ? 1 : 0)), nType, nVersion); + ::Serialize(s, VARINT(nHeight*4+(fCoinBase ? 1 : 0)+(fCoinStake ? 2 : 0)), nType, nVersion); if (nHeight > 0) ::Serialize(s, VARINT(this->nVersion), nType, nVersion); + ::Serialize(s, this->nTime, nType, nVersion); ::Serialize(s, CTxOutCompressor(REF(txout)), nType, nVersion); } @@ -45,10 +48,12 @@ public: void Unserialize(Stream &s, int nType, int nVersion) { unsigned int nCode = 0; ::Unserialize(s, VARINT(nCode), nType, nVersion); - nHeight = nCode / 2; + nHeight = nCode / 4; fCoinBase = nCode & 1; + fCoinStake = nCode & 2; if (nHeight > 0) ::Unserialize(s, VARINT(this->nVersion), nType, nVersion); + ::Unserialize(s, this->nTime, nType, nVersion); ::Unserialize(s, REF(CTxOutCompressor(REF(txout))), nType, nVersion); } }; diff --git a/src/util.cpp b/src/util.cpp index 019c912f5..f9e133e3a 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -99,8 +99,8 @@ namespace boost { using namespace std; -const char * const BITCOIN_CONF_FILENAME = "bitcoin.conf"; -const char * const BITCOIN_PID_FILENAME = "bitcoind.pid"; +const char * const BITCOIN_CONF_FILENAME = "blackcoin.conf"; +const char * const BITCOIN_PID_FILENAME = "blackcoin.pid"; map mapArgs; map > mapMultiArgs; @@ -435,7 +435,7 @@ static std::string FormatException(const std::exception* pex, const char* pszThr char pszModule[MAX_PATH] = ""; GetModuleFileNameA(NULL, pszModule, sizeof(pszModule)); #else - const char* pszModule = "bitcoin"; + const char* pszModule = "blackcoin"; #endif if (pex) return strprintf( @@ -461,7 +461,7 @@ boost::filesystem::path GetDefaultDataDir() // Unix: ~/.bitcoin #ifdef WIN32 // Windows - return GetSpecialFolderPath(CSIDL_APPDATA) / "Bitcoin"; + return GetSpecialFolderPath(CSIDL_APPDATA) / "Blackcoin"; #else fs::path pathRet; char* pszHome = getenv("HOME"); @@ -473,10 +473,10 @@ boost::filesystem::path GetDefaultDataDir() // Mac pathRet /= "Library/Application Support"; TryCreateDirectory(pathRet); - return pathRet / "Bitcoin"; + return pathRet / "Blackcoin"; #else // Unix - return pathRet / ".bitcoin"; + return pathRet / ".blackcoin"; #endif #endif } diff --git a/src/utilmoneystr.h b/src/utilmoneystr.h index 5839b0734..5bc254bc1 100644 --- a/src/utilmoneystr.h +++ b/src/utilmoneystr.h @@ -13,6 +13,7 @@ #include #include "amount.h" +#include "utilstrencodings.h" std::string FormatMoney(const CAmount& n); bool ParseMoney(const std::string& str, CAmount& nRet); diff --git a/src/version.h b/src/version.h index f7cf18d0b..39d1fbb80 100644 --- a/src/version.h +++ b/src/version.h @@ -17,17 +17,16 @@ static const int INIT_PROTO_VERSION = 209; //! In this version, 'getheaders' was introduced. static const int GETHEADERS_VERSION = 31800; +//! demand canonical block signatures starting from this version +static const int CANONICAL_BLOCK_SIG_VERSION = 60018; + //! disconnect from peers older than this proto version -static const int MIN_PEER_PROTO_VERSION = GETHEADERS_VERSION; +static const int MIN_PEER_PROTO_VERSION = CANONICAL_BLOCK_SIG_VERSION; //! 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 -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 static const int BIP0031_VERSION = 60000; diff --git a/src/versionbits.cpp b/src/versionbits.cpp index fbb60c0fc..fcbda5740 100644 --- a/src/versionbits.cpp +++ b/src/versionbits.cpp @@ -24,7 +24,7 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex* cache[pindexPrev] = THRESHOLD_DEFINED; break; } - if (pindexPrev->GetMedianTimePast() < nTimeStart) { + if (pindexPrev->GetPastTimeLimit() < nTimeStart) { // Optimizaton: don't recompute down further, as we know every earlier block will be before the start time cache[pindexPrev] = THRESHOLD_DEFINED; break; @@ -45,15 +45,15 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex* switch (state) { case THRESHOLD_DEFINED: { - if (pindexPrev->GetMedianTimePast() >= nTimeTimeout) { + if (pindexPrev->GetPastTimeLimit() >= nTimeTimeout) { stateNext = THRESHOLD_FAILED; - } else if (pindexPrev->GetMedianTimePast() >= nTimeStart) { + } else if (pindexPrev->GetPastTimeLimit() >= nTimeStart) { stateNext = THRESHOLD_STARTED; } break; } case THRESHOLD_STARTED: { - if (pindexPrev->GetMedianTimePast() >= nTimeTimeout) { + if (pindexPrev->GetPastTimeLimit() >= nTimeTimeout) { stateNext = THRESHOLD_FAILED; break; } diff --git a/src/versionbits.h b/src/versionbits.h index 04f473827..a2817a184 100644 --- a/src/versionbits.h +++ b/src/versionbits.h @@ -9,7 +9,7 @@ #include /** What block version to use for new blocks (pre versionbits) */ -static const int32_t VERSIONBITS_LAST_OLD_BLOCK_VERSION = 4; +static const int32_t VERSIONBITS_LAST_OLD_BLOCK_VERSION = 7; /** What bits to set in version for versionbits blocks */ static const int32_t VERSIONBITS_TOP_BITS = 0x20000000UL; /** What bitmask determines whether versionbits is in use */ diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ba43b805a..1135b128f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -30,6 +30,18 @@ using namespace std; int64_t nWalletUnlockTime; static CCriticalSection cs_nWalletUnlockTime; +static void accountingDeprecationCheck() +{ + if (!GetBoolArg("-enableaccounts", false)) + throw runtime_error( + "Accounting API is deprecated and will be removed in future.\n" + "It can easily result in negative or odd balances if misused or misunderstood, which has happened in the field.\n" + "If you still want to enable it, add to your config file iknowaccountsarebroken=1\n"); + + if (GetBoolArg("-staking", true)) + throw runtime_error("If you want to use accounting API, staking must be disabled, add to your config file staking=0\n"); +} + std::string HelpRequiringPassphrase() { return pwalletMain && pwalletMain->IsCrypted() @@ -49,10 +61,17 @@ bool EnsureWalletIsAvailable(bool avoidException) return true; } +// optional setting to unlock wallet for staking only +// serves to disable the trivial sendmoney when OS account compromised +// provides no real security +bool fWalletUnlockStakingOnly = false; + void EnsureWalletIsUnlocked() { if (pwalletMain->IsLocked()) throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Please enter the wallet passphrase with walletpassphrase first."); + if (fWalletUnlockStakingOnly) + throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Wallet is unlocked for staking only."); } void WalletTxToJSON(const CWalletTx& wtx, UniValue& entry) @@ -367,6 +386,8 @@ UniValue getaddressesbyaccount(const UniValue& params, bool fHelp) return ret; } + + static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtractFeeFromAmount, CWalletTx& wtxNew) { CAmount curBalance = pwalletMain->GetBalance(); @@ -646,6 +667,8 @@ UniValue getreceivedbyaccount(const UniValue& params, bool fHelp) + HelpExampleRpc("getreceivedbyaccount", "\"tabby\", 6") ); + accountingDeprecationCheck(); + LOCK2(cs_main, pwalletMain->cs_wallet); // Minimum confirmations @@ -778,6 +801,8 @@ UniValue getbalance(const UniValue& params, bool fHelp) return ValueFromAmount(nBalance); } + accountingDeprecationCheck(); + string strAccount = AccountFromValue(params[0]); CAmount nBalance = GetAccountBalance(strAccount, nMinDepth, filter); @@ -827,6 +852,8 @@ UniValue movecmd(const UniValue& params, bool fHelp) + HelpExampleRpc("move", "\"timotei\", \"akiko\", 0.01, 6, \"happy birthday!\"") ); + accountingDeprecationCheck(); + LOCK2(cs_main, pwalletMain->cs_wallet); string strFrom = AccountFromValue(params[0]); @@ -1305,6 +1332,8 @@ UniValue listreceivedbyaccount(const UniValue& params, bool fHelp) + HelpExampleRpc("listreceivedbyaccount", "6, true, true") ); + accountingDeprecationCheck(); + LOCK2(cs_main, pwalletMain->cs_wallet); return ListReceived(params, true); @@ -1563,6 +1592,8 @@ UniValue listaccounts(const UniValue& params, bool fHelp) + HelpExampleRpc("listaccounts", "6") ); + accountingDeprecationCheck(); + LOCK2(cs_main, pwalletMain->cs_wallet); int nMinDepth = 1; @@ -1947,6 +1978,12 @@ UniValue walletpassphrase(const UniValue& params, bool fHelp) nWalletUnlockTime = GetTime() + nSleepTime; RPCRunLater("lockwallet", boost::bind(LockWallet, pwalletMain), nSleepTime); + // ppcoin: if user OS account compromised prevent trivial sendmoney commands + if (params.size() > 2) + fWalletUnlockStakingOnly = params[2].get_bool(); + else + fWalletUnlockStakingOnly = false; + return NullUniValue; } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 71f309148..344fa2ae7 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -16,6 +16,7 @@ #include "main.h" #include "net.h" #include "policy/policy.h" +#include "pos.h" #include "primitives/block.h" #include "primitives/transaction.h" #include "script/script.h" @@ -40,6 +41,9 @@ unsigned int nTxConfirmTarget = DEFAULT_TX_CONFIRM_TARGET; bool bSpendZeroConfChange = DEFAULT_SPEND_ZEROCONF_CHANGE; bool fSendFreeTransactions = DEFAULT_SEND_FREE_TRANSACTIONS; +static int64_t GetStakeCombineThreshold() { return 500 * COIN; } +static int64_t GetStakeSplitThreshold() { return 2 * GetStakeCombineThreshold(); } + /** * Fees smaller than this (in satoshi) are considered zero fee (for transaction creation) * Override with -mintxfee @@ -53,6 +57,8 @@ CFeeRate CWallet::minTxFee = CFeeRate(DEFAULT_TRANSACTION_MINFEE); CFeeRate CWallet::fallbackFee = CFeeRate(DEFAULT_FALLBACK_FEE); const uint256 CMerkleTx::ABANDON_HASH(uint256S("0000000000000000000000000000000000000000000000000000000000000001")); +CAmount nReserveBalance = 0; +CAmount nMinimumInputValue = 0; /** @defgroup mapWallet * @@ -491,6 +497,304 @@ void CWallet::AddToSpends(const uint256& wtxid) AddToSpends(txin.prevout, wtxid); } +void CWallet::AvailableCoinsForStaking(std::vector& vCoins) const +{ + vCoins.clear(); + + { + LOCK2(cs_main, cs_wallet); + for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + { + const uint256& wtxid = it->first; + const CWalletTx* pcoin = &(*it).second; + + int nDepth = pcoin->GetDepthInMainChain(); + if (nDepth < 1) + continue; + + if (nDepth < nStakeMinConfirmations) + continue; + + if (pcoin->GetBlocksToMaturity() > 0) + continue; + + for (unsigned int i = 0; i < pcoin->vout.size(); i++) { + isminetype mine = IsMine(pcoin->vout[i]); + if (!(IsSpent(wtxid, i)) && mine != ISMINE_NO && + !IsLockedCoin((*it).first, i) && (pcoin->vout[i].nValue > 0)) + vCoins.push_back(COutput(pcoin, i, nDepth, + ((mine & ISMINE_SPENDABLE) != ISMINE_NO) || + (mine & ISMINE_WATCH_SOLVABLE) != ISMINE_NO)); + } + } + } +} + +// Select some coins without random shuffle or best subset approximation +bool CWallet::SelectCoinsForStaking(CAmount& nTargetValue, std::set >& setCoinsRet, CAmount& nValueRet) const +{ + vector vCoins; + AvailableCoinsForStaking(vCoins); + + setCoinsRet.clear(); + nValueRet = 0; + + BOOST_FOREACH(COutput output, vCoins) + { + const CWalletTx *pcoin = output.tx; + int i = output.i; + + // Stop if we've chosen enough inputs + if (nValueRet >= nTargetValue) + break; + + int64_t n = pcoin->vout[i].nValue; + + pair > coin = make_pair(n,make_pair(pcoin, i)); + + if (n >= nTargetValue) + { + // If input value is greater or equal to target then simply insert + // it into the current subset and exit + setCoinsRet.insert(coin.second); + nValueRet += coin.first; + break; + } + else if (n < nTargetValue + CENT) + { + setCoinsRet.insert(coin.second); + nValueRet += coin.first; + } + } + + return true; +} + +bool CheckKernel(CBlockIndex* pindexPrev, unsigned int nBits, int64_t nTime, const COutPoint& prevout, int64_t* pBlockTime) +{ + uint256 hashProofOfStake, targetProofOfStake; + + CTransaction txPrev; + CDiskTxPos txindex; + if (!ReadFromDisk(txPrev, txindex, *pblocktree, prevout)) + return false; + + // Read block header + CBlock block; + const CDiskBlockPos& pos = CDiskBlockPos(txindex.nFile, txindex.nPos); + if (!ReadBlockFromDisk(block, pos, Params().GetConsensus())) + return false; + + int nDepth; + if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, nStakeMinConfirmations - 1, nDepth)) + return false; + + if (pBlockTime) + *pBlockTime = block.GetBlockTime(); + + LogPrintf("looking for coinstake for real \n"); + + return CheckStakeKernelHash(pindexPrev, nBits, new CCoins(txPrev, pindexPrev->nHeight), prevout, nTime); +} + +// miner's coin stake reward +int64_t GetProofOfStakeReward(const CBlockIndex* pindexPrev, int64_t nCoinAge, int64_t nFees) +{ + int64_t nSubsidy; + if (Params().GetConsensus().IsProtocolV3(pindexPrev->nTime)) + nSubsidy = COIN * 3 / 2; + else + nSubsidy = nCoinAge * 1 * CENT * 33 / (365 * 33 + 8); + + LogPrint("creation", "GetProofOfStakeReward(): create=%s nCoinAge=%d\n", FormatMoney(nSubsidy), nCoinAge); + + return nSubsidy + nFees; +} + +bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int64_t nSearchInterval, CAmount& nFees, CMutableTransaction& tx, CKey& key) +{ + CBlockIndex* pindexPrev = pindexBestHeader; + arith_uint256 bnTargetPerCoinDay; + bnTargetPerCoinDay.SetCompact(nBits); + + struct CMutableTransaction txNew(tx); + txNew.vin.clear(); + txNew.vout.clear(); + + // Mark coin stake transaction + CScript scriptEmpty; + scriptEmpty.clear(); + txNew.vout.push_back(CTxOut(0, scriptEmpty)); + + // Choose coins to use + CAmount nBalance = GetBalance(); + + if (nBalance <= nReserveBalance) + return false; + + vector vwtxPrev; + + set > setCoins; + CAmount nValueIn = 0; + + // Select coins with suitable depth + CAmount nTargetValue = nBalance - nReserveBalance; + if (!SelectCoinsForStaking(nTargetValue, setCoins, nValueIn)) + return false; + + + if (setCoins.empty()) + return false; + + + int64_t nCredit = 0; + CScript scriptPubKeyKernel; + BOOST_FOREACH(const PAIRTYPE(const CWalletTx*, unsigned int)& pcoin, setCoins) + { + static int nMaxStakeSearchInterval = 60; + bool fKernelFound = false; + for (unsigned int n=0; nGetHash(), pcoin.second); + int64_t nBlockTime; + //LogPrintf("looking for coinstake \n"); + if (CheckKernel(pindexPrev, nBits, txNew.nTime - n, prevoutStake, &nBlockTime)) + { + // Found a kernel + LogPrint("coinstake", "CreateCoinStake : kernel found\n"); + vector > vSolutions; + txnouttype whichType; + CScript scriptPubKeyOut; + scriptPubKeyKernel = pcoin.first->vout[pcoin.second].scriptPubKey; + if (!Solver(scriptPubKeyKernel, whichType, vSolutions)) + { + LogPrint("coinstake", "CreateCoinStake : failed to parse kernel\n"); + break; + } + LogPrint("coinstake", "CreateCoinStake : parsed kernel type=%d\n", whichType); + if (whichType != TX_PUBKEY && whichType != TX_PUBKEYHASH) + { + LogPrint("coinstake", "CreateCoinStake : no support for kernel type=%d\n", whichType); + break; // only support pay to public key and pay to address + } + if (whichType == TX_PUBKEYHASH) // pay to address type + { + // convert to pay to public key type + if (!keystore.GetKey(uint160(vSolutions[0]), key)) + { + LogPrint("coinstake", "CreateCoinStake : failed to get key for kernel type=%d\n", whichType); + break; // unable to find corresponding public key + } + + scriptPubKeyOut << key.GetPubKey().getvch() << OP_CHECKSIG; + } + if (whichType == TX_PUBKEY) + { + + if (!keystore.GetKey(Hash160(vSolutions[0]), key)) + { + LogPrint("coinstake", "CreateCoinStake : failed to get key for kernel type=%d\n", whichType); + break; // unable to find corresponding public key + } + + if (key.GetPubKey() != vSolutions[0]) + { + LogPrint("coinstake", "CreateCoinStake : invalid key for kernel type=%d\n", whichType); + break; // keys mismatch + } + + scriptPubKeyOut = scriptPubKeyKernel; + } + + txNew.nTime -= n; + txNew.vin.push_back(CTxIn(pcoin.first->GetHash(), pcoin.second)); + nCredit += pcoin.first->vout[pcoin.second].nValue; + vwtxPrev.push_back(pcoin.first); + txNew.vout.push_back(CTxOut(0, scriptPubKeyOut)); + + LogPrint("coinstake", "CreateCoinStake : added kernel type=%d\n", whichType); + fKernelFound = true; + break; + } + } + + if (fKernelFound) + break; // if kernel is found stop searching + } + + if (nCredit == 0 || nCredit > nBalance - nReserveBalance) + return false; + + BOOST_FOREACH(const PAIRTYPE(const CWalletTx*, unsigned int)& pcoin, setCoins) + { + // Attempt to add more inputs + // Only add coins of the same key/address as kernel + if (txNew.vout.size() == 2 && ((pcoin.first->vout[pcoin.second].scriptPubKey == scriptPubKeyKernel || pcoin.first->vout[pcoin.second].scriptPubKey == txNew.vout[1].scriptPubKey)) + && pcoin.first->GetHash() != txNew.vin[0].prevout.hash) + { + // Stop adding more inputs if already too many inputs + if (txNew.vin.size() >= 10) + break; + // Stop adding inputs if reached reserve limit + if (nCredit + pcoin.first->vout[pcoin.second].nValue > nBalance - nReserveBalance) + break; + // Do not add additional significant input + if (pcoin.first->vout[pcoin.second].nValue >= GetStakeCombineThreshold()) + continue; + + txNew.vin.push_back(CTxIn(pcoin.first->GetHash(), pcoin.second)); + nCredit += pcoin.first->vout[pcoin.second].nValue; + vwtxPrev.push_back(pcoin.first); + } + } + + // Calculate coin age reward + { + uint64_t nCoinAge; + if (!GetCoinAge(txNew, *pblocktree, pindexPrev, nCoinAge)) + return error("CreateCoinStake : failed to calculate coin age"); + + int64_t nReward = GetProofOfStakeReward(pindexPrev, nCoinAge, nFees); + if (nReward <= 0) + return false; + + nCredit += nReward; + } + + + if (nCredit >= GetStakeSplitThreshold()) + txNew.vout.push_back(CTxOut(0, txNew.vout[1].scriptPubKey)); //split stake + + // Set output amount + if (txNew.vout.size() == 3) + { + txNew.vout[1].nValue = (nCredit / 2 / CENT) * CENT; + txNew.vout[2].nValue = nCredit - txNew.vout[1].nValue; + } + else + txNew.vout[1].nValue = nCredit; + + // Sign + int nIn = 0; + BOOST_FOREACH(const CWalletTx* pcoin, vwtxPrev) + { + if (!SignSignature(*this, *pcoin, txNew, nIn++, SIGHASH_ALL)) + return error("CreateCoinStake : failed to sign coinstake"); + } + + // Limit size + unsigned int nBytes = ::GetSerializeSize(txNew, SER_NETWORK, PROTOCOL_VERSION); + if (nBytes >= MAX_STANDARD_TX_SIZE) + return error("CreateCoinStake : exceeded coinstake size limit"); + + // Successfully generated coinstake + tx = CTransaction(txNew); + return true; +} + bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase) { if (IsCrypted()) @@ -1051,7 +1355,7 @@ int CWalletTx::GetRequestCount() const int nRequests = -1; { LOCK(pwallet->cs_wallet); - if (IsCoinBase()) + if (IsCoinBase() || IsCoinStake()) { // Generated block if (!hashUnset()) @@ -1120,7 +1424,7 @@ void CWalletTx::GetAmounts(list& listReceived, // In either case, we need to get the destination address CTxDestination address; - if (!ExtractDestination(txout.scriptPubKey, address) && !txout.scriptPubKey.IsUnspendable()) + if (!ExtractDestination(txout.scriptPubKey, address)&& !txout.IsUnspendable()) { LogPrintf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n", this->GetHash().ToString()); @@ -1244,7 +1548,7 @@ void CWallet::ReacceptWalletTransactions() int nDepth = wtx.GetDepthInMainChain(); - if (!wtx.IsCoinBase() && (nDepth == 0 && !wtx.isAbandoned())) { + if (!wtx.IsCoinBase() && !wtx.IsCoinStake() && (nDepth == 0 && !wtx.isAbandoned())) { mapSorted.insert(std::make_pair(wtx.nOrderPos, &wtx)); } } @@ -1262,7 +1566,7 @@ void CWallet::ReacceptWalletTransactions() bool CWalletTx::RelayWalletTransaction() { assert(pwallet->GetBroadcastTransactions()); - if (!IsCoinBase()) + if (!IsCoinBase() && !IsCoinStake()) { if (GetDepthInMainChain() == 0 && !isAbandoned()) { LogPrintf("Relaying wtx %s\n", GetHash().ToString()); @@ -1319,7 +1623,7 @@ CAmount CWalletTx::GetDebit(const isminefilter& filter) const CAmount CWalletTx::GetCredit(const isminefilter& filter) const { // Must wait until coinbase is safely deep enough in the chain before valuing it - if (IsCoinBase() && GetBlocksToMaturity() > 0) + if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0) return 0; int64_t credit = 0; @@ -1351,7 +1655,7 @@ CAmount CWalletTx::GetCredit(const isminefilter& filter) const CAmount CWalletTx::GetImmatureCredit(bool fUseCache) const { - if (IsCoinBase() && GetBlocksToMaturity() > 0 && IsInMainChain()) + if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0 && IsInMainChain()) { if (fUseCache && fImmatureCreditCached) return nImmatureCreditCached; @@ -1363,13 +1667,27 @@ CAmount CWalletTx::GetImmatureCredit(bool fUseCache) const return 0; } +CAmount CWalletTx::GetImmatureStakeCredit(bool fUseCache) const +{ + if (IsCoinStake() && GetBlocksToMaturity() > 0 && IsInMainChain()) + { + if (fUseCache && fImmatureStakeCreditCached) + return nImmatureStakeCreditCached; + nImmatureStakeCreditCached = pwallet->GetCredit(*this, ISMINE_SPENDABLE); + fImmatureStakeCreditCached = true; + return nImmatureStakeCreditCached; + } + + return 0; +} + CAmount CWalletTx::GetAvailableCredit(bool fUseCache) const { if (pwallet == 0) return 0; // Must wait until coinbase is safely deep enough in the chain before valuing it - if (IsCoinBase() && GetBlocksToMaturity() > 0) + if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0) return 0; if (fUseCache && fAvailableCreditCached) @@ -1395,7 +1713,7 @@ CAmount CWalletTx::GetAvailableCredit(bool fUseCache) const CAmount CWalletTx::GetImmatureWatchOnlyCredit(const bool& fUseCache) const { - if (IsCoinBase() && GetBlocksToMaturity() > 0 && IsInMainChain()) + if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0 && IsInMainChain()) { if (fUseCache && fImmatureWatchCreditCached) return nImmatureWatchCreditCached; @@ -1413,7 +1731,7 @@ CAmount CWalletTx::GetAvailableWatchOnlyCredit(const bool& fUseCache) const return 0; // Must wait until coinbase is safely deep enough in the chain before valuing it - if (IsCoinBase() && GetBlocksToMaturity() > 0) + if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0) return 0; if (fUseCache && fAvailableWatchCreditCached) @@ -1597,6 +1915,20 @@ CAmount CWallet::GetImmatureBalance() const return nTotal; } +CAmount CWallet::GetStakeBalance() const +{ + CAmount nTotal = 0; + { + LOCK2(cs_main, cs_wallet); + for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + { + const CWalletTx* pcoin = &(*it).second; + nTotal += pcoin->GetImmatureStakeCredit(); + } + } + return nTotal; +} + CAmount CWallet::GetWatchOnlyBalance() const { CAmount nTotal = 0; @@ -1659,7 +1991,7 @@ void CWallet::AvailableCoins(vector& vCoins, bool fOnlyConfirmed, const if (fOnlyConfirmed && !pcoin->IsTrusted()) continue; - if (pcoin->IsCoinBase() && pcoin->GetBlocksToMaturity() > 0) + if ((pcoin->IsCoinBase() || pcoin->IsCoinStake()) && pcoin->GetBlocksToMaturity() > 0) continue; int nDepth = pcoin->GetDepthInMainChain(); @@ -1891,7 +2223,7 @@ bool CWallet::SelectCoins(const CAmount& nTargetValue, set& vecSend, CWalletTx& wt // now we ensure code won't be written that makes assumptions about // nLockTime that preclude a fix later. txNew.nLockTime = chainActive.Height(); + + txNew.nTime = GetAdjustedTime(); // Secondly occasionally randomly pick a nLockTime even further back, so // that transactions that are delayed after signing for whatever reason, @@ -2322,6 +2656,8 @@ CAmount CWallet::GetMinimumFee(unsigned int nTxBytes, unsigned int nConfirmTarge // But always obey the maximum if (nFeeNeeded > maxTxFee) nFeeNeeded = maxTxFee; + if(nFeeNeeded < DEFAULT_TRANSACTION_FEE) + nFeeNeeded = DEFAULT_TRANSACTION_FEE; return nFeeNeeded; } @@ -2586,7 +2922,7 @@ std::map CWallet::GetAddressBalances() if (!CheckFinalTx(*pcoin) || !pcoin->IsTrusted()) continue; - if (pcoin->IsCoinBase() && pcoin->GetBlocksToMaturity() > 0) + if ((pcoin->IsCoinBase() || pcoin->IsCoinStake()) && pcoin->GetBlocksToMaturity() > 0) continue; int nDepth = pcoin->GetDepthInMainChain(); @@ -2831,6 +3167,38 @@ void CWallet::ListLockedCoins(std::vector& vOutpts) } } +uint64_t CWallet::GetStakeWeight() const +{ + // Choose coins to use + CAmount nBalance = GetBalance(); + + if (nBalance <= nReserveBalance) + return 0; + + vector vwtxPrev; + + set > setCoins; + CAmount nValueIn = 0; + + CAmount nTargetValue = nBalance - nReserveBalance; + if (!SelectCoinsForStaking(nTargetValue, setCoins, nValueIn)) + return 0; + + if (setCoins.empty()) + return 0; + + uint64_t nWeight = 0; + + LOCK2(cs_main, cs_wallet); + BOOST_FOREACH(PAIRTYPE(const CWalletTx*, unsigned int) pcoin, setCoins) + { + if (pcoin.first->GetDepthInMainChain() >= nStakeMinConfirmations) + nWeight += pcoin.first->vout[pcoin.second].nValue; + } + + return nWeight; +} + /** @} */ // end of Actions class CAffectedKeysVisitor : public boost::static_visitor { @@ -3027,7 +3395,7 @@ int CMerkleTx::GetDepthInMainChain(const CBlockIndex* &pindexRet) const int CMerkleTx::GetBlocksToMaturity() const { - if (!IsCoinBase()) + if (!(IsCoinBase() || IsCoinStake())) return 0; return max(0, (COINBASE_MATURITY+1) - GetDepthInMainChain()); } diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index f7e57e205..154c2f5a0 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -32,21 +32,24 @@ */ extern CFeeRate payTxFee; extern CAmount maxTxFee; +extern CAmount nReserveBalance; +extern CAmount nMinimumInputValue; extern unsigned int nTxConfirmTarget; extern bool bSpendZeroConfChange; extern bool fSendFreeTransactions; +extern bool fWalletUnlockStakingOnly; static const unsigned int DEFAULT_KEYPOOL_SIZE = 100; //! -paytxfee default -static const CAmount DEFAULT_TRANSACTION_FEE = 0; +static const CAmount DEFAULT_TRANSACTION_FEE = 10000; //! -paytxfee will warn if called with a higher fee than this amount (in satoshis) per KB -static const CAmount nHighTransactionFeeWarning = 0.01 * COIN; +static const CAmount nHighTransactionFeeWarning = 0.1 * COIN; //! -fallbackfee default -static const CAmount DEFAULT_FALLBACK_FEE = 20000; +static const CAmount DEFAULT_FALLBACK_FEE = 10000; //! -mintxfee default -static const CAmount DEFAULT_TRANSACTION_MINFEE = 1000; +static const CAmount DEFAULT_TRANSACTION_MINFEE = 10000; //! -maxtxfee default -static const CAmount DEFAULT_TRANSACTION_MAXFEE = 0.1 * COIN; +static const CAmount DEFAULT_TRANSACTION_MAXFEE = 1 * COIN; //! minimum change amount static const CAmount MIN_CHANGE = CENT; //! Default for -spendzeroconfchange @@ -240,6 +243,7 @@ public: mutable bool fDebitCached; mutable bool fCreditCached; mutable bool fImmatureCreditCached; + mutable bool fImmatureStakeCreditCached; mutable bool fAvailableCreditCached; mutable bool fWatchDebitCached; mutable bool fWatchCreditCached; @@ -249,6 +253,7 @@ public: mutable CAmount nDebitCached; mutable CAmount nCreditCached; mutable CAmount nImmatureCreditCached; + mutable CAmount nImmatureStakeCreditCached; mutable CAmount nAvailableCreditCached; mutable CAmount nWatchDebitCached; mutable CAmount nWatchCreditCached; @@ -289,7 +294,9 @@ public: fDebitCached = false; fCreditCached = false; fImmatureCreditCached = false; + fImmatureStakeCreditCached = false; fAvailableCreditCached = false; + fImmatureCreditCached = false; fWatchDebitCached = false; fWatchCreditCached = false; fImmatureWatchCreditCached = false; @@ -298,6 +305,7 @@ public: nDebitCached = 0; nCreditCached = 0; nImmatureCreditCached = 0; + nImmatureStakeCreditCached = 0; nAvailableCreditCached = 0; nWatchDebitCached = 0; nWatchCreditCached = 0; @@ -374,6 +382,7 @@ public: CAmount GetDebit(const isminefilter& filter) const; CAmount GetCredit(const isminefilter& filter) const; CAmount GetImmatureCredit(bool fUseCache=true) const; + CAmount GetImmatureStakeCredit(bool fUseCache=true) const; CAmount GetAvailableCredit(bool fUseCache=true) const; CAmount GetImmatureWatchOnlyCredit(const bool& fUseCache=true) const; CAmount GetAvailableWatchOnlyCredit(const bool& fUseCache=true) const; @@ -653,6 +662,7 @@ public: CAmount GetBalance() const; CAmount GetUnconfirmedBalance() const; CAmount GetImmatureBalance() const; + CAmount GetStakeBalance() const; CAmount GetWatchOnlyBalance() const; CAmount GetUnconfirmedWatchOnlyBalance() const; CAmount GetImmatureWatchOnlyBalance() const; @@ -795,6 +805,10 @@ public: /* Mark a transaction (and it in-wallet descendants) as abandoned so its inputs may be respent. */ bool AbandonTransaction(const uint256& hashTx); + bool CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int64_t nSearchInterval, CAmount& nFees, CMutableTransaction& tx, CKey& key); + bool SelectCoinsForStaking(CAmount& nTargetValue, std::set >& setCoinsRet, CAmount& nValueRet) const; + void AvailableCoinsForStaking(std::vector& vCoins) const; + uint64_t GetStakeWeight() const; }; /** A key allocated from the key pool. */ @@ -934,5 +948,5 @@ public: private: std::vector _ssExtra; }; - +bool CheckKernel(CBlockIndex* pindexPrev, unsigned int nBits, int64_t nTime, const COutPoint& prevout, int64_t* pBlockTime = NULL); #endif // BITCOIN_WALLET_WALLET_H