Merge remote-tracking branch 'zcash/master' into dPoW

This commit is contained in:
jl777
2016-10-28 13:50:21 -03:00
137 changed files with 5475 additions and 1453 deletions

5
.gitignore vendored
View File

@@ -5,7 +5,7 @@ src/bitcoin
src/zcashd
src/zcash-cli
src/zcash-gtest
src/bitcoin-tx
src/zcash-tx
src/test/test_bitcoin
src/qt/test/test_bitcoin-qt
@@ -61,7 +61,6 @@ src/qt/test/moc*.cpp
*.pyc
*.o
*.o-*
*.patch
.zcash
*.a
*.pb.cc
@@ -121,4 +120,4 @@ qa/pull-tester/test.*/*
/doc/doxygen/
libbitcoinconsensus.pc
libzcashconsensus.pc

20
COPYING
View File

@@ -18,3 +18,23 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
The MIT software license (http://www.opensource.org/licenses/mit-license.php)
above applies to the code directly included in this source distribution, with
the exception of certain files under the 'src/qt/' and 'scripts/img/' directories
which are distributed under the LGPL or GPL licenses. Dependencies downloaded
as part of the build process may be covered by other open source licenses.
For further details see 'contrib/DEBIAN/copyright'.
This product includes software developed by the OpenSSL Project for use in the
[OpenSSL Toolkit](https://www.openssl.org/). This product includes cryptographic
software written by Eric Young ([eay@cryptsoft.com](mailto:eay@cryptsoft.com)),
and UPnP software written by Thomas Bernard.
Although almost all of the Zcash code is licensed under "permissive" open source
licenses, users and distributors should note that when built using the default
build options, Zcash depends on Oracle Berkeley DB 6.2.x, which is licensed
under the GNU Affero General Public License.

View File

@@ -6,7 +6,7 @@ GZIP_ENV="-9n"
if BUILD_BITCOIN_LIBS
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libbitcoinconsensus.pc
pkgconfig_DATA = libzcashconsensus.pc
endif
BITCOIND_BIN=$(top_builddir)/src/zcashd$(EXEEXT)

View File

@@ -1,3 +1,4 @@
<<<<<<< HEAD
Zcash
=====
@@ -20,12 +21,30 @@ proving scheme which preserves confidentiality of transaction metadata.
Participation in the Zcash project is subject to a [Code of Conduct](code_of_conduct.md).
=======
Zcash 1.0.0
===========
What is Zcash?
--------------
[Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol.
Based on Bitcoin's code, it intends to offer a far higher standard of privacy
and anonymity through a sophisticated zero-knowledge proving scheme that
preserves confidentiality of transaction metadata. Technical details are
available in our [Protocol Specification](https://github.com/zcash/zips/raw/master/protocol/protocol.pdf).
This software is the Zcash client. It downloads and stores the entire history
of Zcash transactions; depending on the speed of your computer and network
connection, the synchronization process could take a day or more once the
block chain has reached a significant size.
Security Warnings
-----------------
See important security warnings in
[doc/security-warnings.md](doc/security-warnings.md).
License
-------
@@ -135,3 +154,32 @@ tail -f ~/.komodo/debug.log
./src/komodo-cli help
```
=======
**Zcash is unfinished and highly experimental.** Use at your own risk.
Where do I begin?
-----------------
We have a guide for joining the public testnet:
https://github.com/zcash/zcash/wiki/Beta-Guide
### Need Help?
* See the documentation at the [Zcash Wiki](https://github.com/zcash/zcash/wiki)
for help and more information.
* Ask for help on the [Zcash](https://forum.z.cash/) forum.
Participation in the Zcash project is subject to a
[Code of Conduct](code_of_conduct.md).
Building
--------
Build Zcash along with most dependencies from source by running
./zcutil/build.sh. Currently only Linux is supported.
License
-------
For license information see the file [COPYING](COPYING).

View File

@@ -1,11 +1,11 @@
AC_DEFUN([BITCOIN_FIND_BDB53],[
AC_DEFUN([BITCOIN_FIND_BDB62],[
AC_MSG_CHECKING([for Berkeley DB C++ headers])
BDB_CPPFLAGS=
BDB_LIBS=
bdbpath=X
bdb53path=X
bdb62path=X
bdbdirlist=
for _vn in 5.3 53 5 ''; do
for _vn in 6.2 62 6 ''; do
for _pfx in b lib ''; do
bdbdirlist="$bdbdirlist ${_pfx}db${_vn}"
done
@@ -15,8 +15,8 @@ AC_DEFUN([BITCOIN_FIND_BDB53],[
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <${searchpath}db_cxx.h>
]],[[
#if !((DB_VERSION_MAJOR == 5 && DB_VERSION_MINOR >= 3) || DB_VERSION_MAJOR > 5)
#error "failed to find bdb 5.3+"
#if !((DB_VERSION_MAJOR == 6 && DB_VERSION_MINOR >= 2) || DB_VERSION_MAJOR > 6)
#error "failed to find bdb 6.2+"
#endif
]])],[
if test "x$bdbpath" = "xX"; then
@@ -28,32 +28,32 @@ AC_DEFUN([BITCOIN_FIND_BDB53],[
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <${searchpath}db_cxx.h>
]],[[
#if !(DB_VERSION_MAJOR == 5 && DB_VERSION_MINOR == 3)
#error "failed to find bdb 5.3"
#if !(DB_VERSION_MAJOR == 6 && DB_VERSION_MINOR == 2)
#error "failed to find bdb 6.2"
#endif
]])],[
bdb53path="${searchpath}"
bdb62path="${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$bdb53path" = "xX"; then
elif test "x$bdb62path" = "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 5.3])],[
AC_MSG_WARN([Found Berkeley DB other than 5.3; 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 6.2])],[
AC_MSG_WARN([Found Berkeley DB other than 6.2; wallets opened by this build will not be portable!])
],[
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)])
AC_MSG_ERROR([Found Berkeley DB other than 6.2, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)])
])
else
BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb53path}],db_cxx)
bdbpath="${bdb53path}"
BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb62path}],db_cxx)
bdbpath="${bdb62path}"
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-5.3 db_cxx; do
for searchlib in db_cxx-6.2 db_cxx; do
AC_CHECK_LIB([$searchlib],[main],[
BDB_LIBS="-l${searchlib}"
break

View File

@@ -3,10 +3,10 @@ AC_PREREQ([2.60])
define(_CLIENT_VERSION_MAJOR, 1)
define(_CLIENT_VERSION_MINOR, 0)
define(_CLIENT_VERSION_REVISION, 0)
define(_CLIENT_VERSION_BUILD, 1)
define(_CLIENT_VERSION_BUILD, 50)
define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50)))
define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1)))
define(_CLIENT_VERSION_IS_RELEASE, false)
define(_CLIENT_VERSION_IS_RELEASE, true)
define(_COPYRIGHT_YEAR, 2016)
AC_INIT([Zcash],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_SUFFIX(_ZC_BUILD_VAL)],[https://github.com/zcash/zcash/issues],[zcash])
AC_CONFIG_SRCDIR([src/main.cpp])
@@ -179,7 +179,7 @@ CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_
AC_ARG_WITH([utils],
[AS_HELP_STRING([--with-utils],
[build bitcoin-cli bitcoin-tx (default=yes)])],
[build zcash-cli zcash-tx (default=yes)])],
[build_bitcoin_utils=$withval],
[build_bitcoin_utils=yes])
@@ -270,9 +270,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/db53; then
CPPFLAGS="$CPPFLAGS -I/opt/local/include/db53"
LIBS="$LIBS -L/opt/local/lib/db53"
if test -d /opt/local/include/db62; then
CPPFLAGS="$CPPFLAGS -I/opt/local/include/db62"
LIBS="$LIBS -L/opt/local/lib/db62"
fi
fi
@@ -522,7 +522,7 @@ AC_SUBST(LIBMEMENV)
if test x$enable_wallet != xno; then
dnl Check for libdb_cxx only if wallet enabled
BITCOIN_FIND_BDB53
BITCOIN_FIND_BDB62
fi
dnl Check for libminiupnpc (optional)
@@ -746,7 +746,7 @@ AC_MSG_CHECKING([whether to build bitcoind])
AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes])
AC_MSG_RESULT($build_bitcoind)
AC_MSG_CHECKING([whether to build utils (bitcoin-cli bitcoin-tx)])
AC_MSG_CHECKING([whether to build utils (zcash-cli zcash-tx)])
AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes])
AC_MSG_RESULT($build_bitcoin_utils)
@@ -754,7 +754,7 @@ AC_MSG_CHECKING([whether to build libraries])
AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes])
if test x$build_bitcoin_libs = xyes; then
AC_DEFINE(HAVE_CONSENSUS_LIB, 1, [Define this symbol if the consensus lib has been built])
AC_CONFIG_FILES([libbitcoinconsensus.pc:libbitcoinconsensus.pc.in])
AC_CONFIG_FILES([libzcashconsensus.pc:libzcashconsensus.pc.in])
fi
AC_MSG_RESULT($build_bitcoin_libs)

View File

@@ -1,5 +1,29 @@
zcash (1.0.0-rc1) UNRELEASED; urgency=medium
zcash (1.0.0-sprout) jessie; urgency=medium
* 1.0.0 release.
-- Zcash Company <team@z.cash> Fri, 28 Oct 2016 03:00:50 -0700
zcash (1.0.0-rc4) jessie; urgency=medium
* 1.0.0-rc4 release.
-- Zcash Company <team@z.cash> Thu, 27 Oct 2016 13:36:00 +0100
zcash (1.0.0-rc3) jessie; urgency=medium
* 1.0.0-rc3 release.
-- Zcash Company <team@z.cash> Wed, 26 Oct 2016 23:17:03 +0100
zcash (1.0.0-rc2) jessie; urgency=medium
* 1.0.0-rc2 release.
-- Zcash Company <team@z.cash> Sun, 23 Oct 2016 01:51:27 +0100
zcash (1.0.0-rc1) jessie; urgency=medium
* Initial packaging for Debian.
-- Zcash Company <team@z.cash> Thu, 13 Oct 2016 20:12:17 -0700
-- Zcash Company <team@z.cash> Mon, 17 Oct 2016 11:47:02 -0700

View File

@@ -7,12 +7,13 @@ Build-Depends: autoconf, automake, bsdmainutils, build-essential
git, g++-multilib, libc6-dev, libtool
m4, ncurses-dev, pkg-config, python
unzip, wget, zlib1g-dev
Vcs-Git: git@github.com:zcash/zcash.git
Vcs-Git: https://github.com/zcash/zcash.git
Vcs-Browser: https://github.com/zcash/zcash
Package: zcash
Version: 1.0.0-rc1
Version: 1.0.0-sprout
Architecture: amd64
Description: Zcash is an implementation of the "Zerocash" protocol.
Depends: libgomp1
Description: An implementation of the "Zerocash" protocol.
Based on Bitcoin's code, it intends to offer a far higher standard
of privacy and anonymity through a sophisticiated zero-knowledge
proving scheme which preserves confidentiality of transaction metadata.

View File

@@ -15,15 +15,6 @@ Files: src/json/*
Copyright: 2007-2009, John W. Wilkinson
License: Expat
Files: debian/*
Copyright: 2010-2011, Jonas Smedegaard <dr@jones.dk>
2011, Matt Corallo <matt@bluematt.me>
License: GPL-2+
Files: debian/manpages/*
Copyright: Micah Anderson <micah@debian.org>
License: GPL-3+
Files: src/qt/res/icons/clock*.png, src/qt/res/icons/tx*.png,
src/qt/res/src/*.svg
Copyright: Wladimir van der Laan
@@ -95,7 +86,7 @@ Copyright: 2008 Beman Dawes
License: Boost-Software-License-1.0
Files: depends/sources/db-*.tar.gz
Copyright: 1990, 2013 Oracle and/or its affiliates;
Copyright: 1990, 2016 Oracle and/or its affiliates;
1990, 1993, 1994, 1995 The Regents of the University of California;
1995, 1996 The President and Fellows of Harvard University;
2000-2005 INRIA, France Telecom
@@ -138,39 +129,676 @@ License: Boost-Software-License-1.0
License: BDB
/*
* Copyright (c) 1990, 2013 Oracle and/or its affiliates. All rights reserved.
* The Oracle Berkeley DB product is licensed
* under the GNU AFFERO GENERAL PUBLIC LICENSE:
*
* 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.
* 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the DB software and any
* accompanying software that uses the DB software. The source code
* must either be included in the distribution or be available for no
* more than the cost of distribution plus a nominal fee, and must be
* freely redistributable under reasonable conditions. For an
* executable file, complete source code means the source code for all
* modules it contains. It does not include source code for modules or
* files that typically accompany the major components of the operating
* system on which the executable file runs.
*
* THIS SOFTWARE IS PROVIDED BY ORACLE ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
* NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL ORACLE 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.
* GNU AFFERO GENERAL PUBLIC LICENSE
* Version 3, 19 November 2007
*
* Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*
* Preamble
*
* The GNU Affero General Public License is a free, copyleft license for
* software and other kinds of works, specifically designed to ensure
* cooperation with the community in the case of network server software.
*
* The licenses for most software and other practical works are designed
* to take away your freedom to share and change the works. By contrast,
* our General Public Licenses are intended to guarantee your freedom to
* share and change all versions of a program--to make sure it remains free
* software for all its users.
*
* When we speak of free software, we are referring to freedom, not
* price. Our General Public Licenses are designed to make sure that you
* have the freedom to distribute copies of free software (and charge for
* them if you wish), that you receive source code or can get it if you
* want it, that you can change the software or use pieces of it in new
* free programs, and that you know you can do these things.
*
* Developers that use our General Public Licenses protect your rights
* with two steps: (1) assert copyright on the software, and (2) offer
* you this License which gives you legal permission to copy, distribute
* and/or modify the software.
*
* A secondary benefit of defending all users' freedom is that
* improvements made in alternate versions of the program, if they
* receive widespread use, become available for other developers to
* incorporate. Many developers of free software are heartened and
* encouraged by the resulting cooperation. However, in the case of
* software used on network servers, this result may fail to come about.
* The GNU General Public License permits making a modified version and
* letting the public access it on a server without ever releasing its
* source code to the public.
*
* The GNU Affero General Public License is designed specifically to
* ensure that, in such cases, the modified source code becomes available
* to the community. It requires the operator of a network server to
* provide the source code of the modified version running there to the
* users of that server. Therefore, public use of a modified version, on
* a publicly accessible server, gives the public access to the source
* code of the modified version.
*
* An older license, called the Affero General Public License and
* published by Affero, was designed to accomplish similar goals. This is
* a different license, not a version of the Affero GPL, but Affero has
* released a new version of the Affero GPL which permits relicensing under
* this license.
*
* The precise terms and conditions for copying, distribution and
* modification follow.
*
* TERMS AND CONDITIONS
*
* 0. Definitions.
*
* "This License" refers to version 3 of the GNU Affero General Public License.
*
* "Copyright" also means copyright-like laws that apply to other kinds of
* works, such as semiconductor masks.
*
* "The Program" refers to any copyrightable work licensed under this
* License. Each licensee is addressed as "you". "Licensees" and
* "recipients" may be individuals or organizations.
*
* To "modify" a work means to copy from or adapt all or part of the work
* in a fashion requiring copyright permission, other than the making of an
* exact copy. The resulting work is called a "modified version" of the
* earlier work or a work "based on" the earlier work.
*
* A "covered work" means either the unmodified Program or a work based
* on the Program.
*
* To "propagate" a work means to do anything with it that, without
* permission, would make you directly or secondarily liable for
* infringement under applicable copyright law, except executing it on a
* computer or modifying a private copy. Propagation includes copying,
* distribution (with or without modification), making available to the
* public, and in some countries other activities as well.
*
* To "convey" a work means any kind of propagation that enables other
* parties to make or receive copies. Mere interaction with a user through
* a computer network, with no transfer of a copy, is not conveying.
*
* An interactive user interface displays "Appropriate Legal Notices"
* to the extent that it includes a convenient and prominently visible
* feature that (1) displays an appropriate copyright notice, and (2)
* tells the user that there is no warranty for the work (except to the
* extent that warranties are provided), that licensees may convey the
* work under this License, and how to view a copy of this License. If
* the interface presents a list of user commands or options, such as a
* menu, a prominent item in the list meets this criterion.
*
* 1. Source Code.
*
* The "source code" for a work means the preferred form of the work
* for making modifications to it. "Object code" means any non-source
* form of a work.
*
* A "Standard Interface" means an interface that either is an official
* standard defined by a recognized standards body, or, in the case of
* interfaces specified for a particular programming language, one that
* is widely used among developers working in that language.
*
* The "System Libraries" of an executable work include anything, other
* than the work as a whole, that (a) is included in the normal form of
* packaging a Major Component, but which is not part of that Major
* Component, and (b) serves only to enable use of the work with that
* Major Component, or to implement a Standard Interface for which an
* implementation is available to the public in source code form. A
* "Major Component", in this context, means a major essential component
* (kernel, window system, and so on) of the specific operating system
* (if any) on which the executable work runs, or a compiler used to
* produce the work, or an object code interpreter used to run it.
*
* The "Corresponding Source" for a work in object code form means all
* the source code needed to generate, install, and (for an executable
* work) run the object code and to modify the work, including scripts to
* control those activities. However, it does not include the work's
* System Libraries, or general-purpose tools or generally available free
* programs which are used unmodified in performing those activities but
* which are not part of the work. For example, Corresponding Source
* includes interface definition files associated with source files for
* the work, and the source code for shared libraries and dynamically
* linked subprograms that the work is specifically designed to require,
* such as by intimate data communication or control flow between those
* subprograms and other parts of the work.
*
* The Corresponding Source need not include anything that users
* can regenerate automatically from other parts of the Corresponding
* Source.
*
* The Corresponding Source for a work in source code form is that
* same work.
*
* 2. Basic Permissions.
*
* All rights granted under this License are granted for the term of
* copyright on the Program, and are irrevocable provided the stated
* conditions are met. This License explicitly affirms your unlimited
* permission to run the unmodified Program. The output from running a
* covered work is covered by this License only if the output, given its
* content, constitutes a covered work. This License acknowledges your
* rights of fair use or other equivalent, as provided by copyright law.
*
* You may make, run and propagate covered works that you do not
* convey, without conditions so long as your license otherwise remains
* in force. You may convey covered works to others for the sole purpose
* of having them make modifications exclusively for you, or provide you
* with facilities for running those works, provided that you comply with
* the terms of this License in conveying all material for which you do
* not control copyright. Those thus making or running the covered works
* for you must do so exclusively on your behalf, under your direction
* and control, on terms that prohibit them from making any copies of
* your copyrighted material outside their relationship with you.
*
* Conveying under any other circumstances is permitted solely under
* the conditions stated below. Sublicensing is not allowed; section 10
* makes it unnecessary.
*
* 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
*
* No covered work shall be deemed part of an effective technological
* measure under any applicable law fulfilling obligations under article
* 11 of the WIPO copyright treaty adopted on 20 December 1996, or
* similar laws prohibiting or restricting circumvention of such
* measures.
*
* When you convey a covered work, you waive any legal power to forbid
* circumvention of technological measures to the extent such circumvention
* is effected by exercising rights under this License with respect to
* the covered work, and you disclaim any intention to limit operation or
* modification of the work as a means of enforcing, against the work's
* users, your or third parties' legal rights to forbid circumvention of
* technological measures.
*
* 4. Conveying Verbatim Copies.
*
* You may convey verbatim copies of the Program's source code as you
* receive it, in any medium, provided that you conspicuously and
* appropriately publish on each copy an appropriate copyright notice;
* keep intact all notices stating that this License and any
* non-permissive terms added in accord with section 7 apply to the code;
* keep intact all notices of the absence of any warranty; and give all
* recipients a copy of this License along with the Program.
*
* You may charge any price or no price for each copy that you convey,
* and you may offer support or warranty protection for a fee.
*
* 5. Conveying Modified Source Versions.
*
* You may convey a work based on the Program, or the modifications to
* produce it from the Program, in the form of source code under the
* terms of section 4, provided that you also meet all of these conditions:
*
* a) The work must carry prominent notices stating that you modified
* it, and giving a relevant date.
*
* b) The work must carry prominent notices stating that it is
* released under this License and any conditions added under section
* 7. This requirement modifies the requirement in section 4 to
* "keep intact all notices".
*
* c) You must license the entire work, as a whole, under this
* License to anyone who comes into possession of a copy. This
* License will therefore apply, along with any applicable section 7
* additional terms, to the whole of the work, and all its parts,
* regardless of how they are packaged. This License gives no
* permission to license the work in any other way, but it does not
* invalidate such permission if you have separately received it.
*
* d) If the work has interactive user interfaces, each must display
* Appropriate Legal Notices; however, if the Program has interactive
* interfaces that do not display Appropriate Legal Notices, your
* work need not make them do so.
*
* A compilation of a covered work with other separate and independent
* works, which are not by their nature extensions of the covered work,
* and which are not combined with it such as to form a larger program,
* in or on a volume of a storage or distribution medium, is called an
* "aggregate" if the compilation and its resulting copyright are not
* used to limit the access or legal rights of the compilation's users
* beyond what the individual works permit. Inclusion of a covered work
* in an aggregate does not cause this License to apply to the other
* parts of the aggregate.
*
* 6. Conveying Non-Source Forms.
*
* You may convey a covered work in object code form under the terms
* of sections 4 and 5, provided that you also convey the
* machine-readable Corresponding Source under the terms of this License,
* in one of these ways:
*
* a) Convey the object code in, or embodied in, a physical product
* (including a physical distribution medium), accompanied by the
* Corresponding Source fixed on a durable physical medium
* customarily used for software interchange.
*
* b) Convey the object code in, or embodied in, a physical product
* (including a physical distribution medium), accompanied by a
* written offer, valid for at least three years and valid for as
* long as you offer spare parts or customer support for that product
* model, to give anyone who possesses the object code either (1) a
* copy of the Corresponding Source for all the software in the
* product that is covered by this License, on a durable physical
* medium customarily used for software interchange, for a price no
* more than your reasonable cost of physically performing this
* conveying of source, or (2) access to copy the
* Corresponding Source from a network server at no charge.
*
* c) Convey individual copies of the object code with a copy of the
* written offer to provide the Corresponding Source. This
* alternative is allowed only occasionally and noncommercially, and
* only if you received the object code with such an offer, in accord
* with subsection 6b.
*
* d) Convey the object code by offering access from a designated
* place (gratis or for a charge), and offer equivalent access to the
* Corresponding Source in the same way through the same place at no
* further charge. You need not require recipients to copy the
* Corresponding Source along with the object code. If the place to
* copy the object code is a network server, the Corresponding Source
* may be on a different server (operated by you or a third party)
* that supports equivalent copying facilities, provided you maintain
* clear directions next to the object code saying where to find the
* Corresponding Source. Regardless of what server hosts the
* Corresponding Source, you remain obligated to ensure that it is
* available for as long as needed to satisfy these requirements.
*
* e) Convey the object code using peer-to-peer transmission, provided
* you inform other peers where the object code and Corresponding
* Source of the work are being offered to the general public at no
* charge under subsection 6d.
*
* A separable portion of the object code, whose source code is excluded
* from the Corresponding Source as a System Library, need not be
* included in conveying the object code work.
*
* A "User Product" is either (1) a "consumer product", which means any
* tangible personal property which is normally used for personal, family,
* or household purposes, or (2) anything designed or sold for incorporation
* into a dwelling. In determining whether a product is a consumer product,
* doubtful cases shall be resolved in favor of coverage. For a particular
* product received by a particular user, "normally used" refers to a
* typical or common use of that class of product, regardless of the status
* of the particular user or of the way in which the particular user
* actually uses, or expects or is expected to use, the product. A product
* is a consumer product regardless of whether the product has substantial
* commercial, industrial or non-consumer uses, unless such uses represent
* the only significant mode of use of the product.
*
* "Installation Information" for a User Product means any methods,
* procedures, authorization keys, or other information required to install
* and execute modified versions of a covered work in that User Product from
* a modified version of its Corresponding Source. The information must
* suffice to ensure that the continued functioning of the modified object
* code is in no case prevented or interfered with solely because
* modification has been made.
*
* If you convey an object code work under this section in, or with, or
* specifically for use in, a User Product, and the conveying occurs as
* part of a transaction in which the right of possession and use of the
* User Product is transferred to the recipient in perpetuity or for a
* fixed term (regardless of how the transaction is characterized), the
* Corresponding Source conveyed under this section must be accompanied
* by the Installation Information. But this requirement does not apply
* if neither you nor any third party retains the ability to install
* modified object code on the User Product (for example, the work has
* been installed in ROM).
*
* The requirement to provide Installation Information does not include a
* requirement to continue to provide support service, warranty, or updates
* for a work that has been modified or installed by the recipient, or for
* the User Product in which it has been modified or installed. Access to a
* network may be denied when the modification itself materially and
* adversely affects the operation of the network or violates the rules and
* protocols for communication across the network.
*
* Corresponding Source conveyed, and Installation Information provided,
* in accord with this section must be in a format that is publicly
* documented (and with an implementation available to the public in
* source code form), and must require no special password or key for
* unpacking, reading or copying.
*
* 7. Additional Terms.
*
* "Additional permissions" are terms that supplement the terms of this
* License by making exceptions from one or more of its conditions.
* Additional permissions that are applicable to the entire Program shall
* be treated as though they were included in this License, to the extent
* that they are valid under applicable law. If additional permissions
* apply only to part of the Program, that part may be used separately
* under those permissions, but the entire Program remains governed by
* this License without regard to the additional permissions.
*
* When you convey a copy of a covered work, you may at your option
* remove any additional permissions from that copy, or from any part of
* it. (Additional permissions may be written to require their own
* removal in certain cases when you modify the work.) You may place
* additional permissions on material, added by you to a covered work,
* for which you have or can give appropriate copyright permission.
*
* Notwithstanding any other provision of this License, for material you
* add to a covered work, you may (if authorized by the copyright holders of
* that material) supplement the terms of this License with terms:
*
* a) Disclaiming warranty or limiting liability differently from the
* terms of sections 15 and 16 of this License; or
*
* b) Requiring preservation of specified reasonable legal notices or
* author attributions in that material or in the Appropriate Legal
* Notices displayed by works containing it; or
*
* c) Prohibiting misrepresentation of the origin of that material, or
* requiring that modified versions of such material be marked in
* reasonable ways as different from the original version; or
*
* d) Limiting the use for publicity purposes of names of licensors or
* authors of the material; or
*
* e) Declining to grant rights under trademark law for use of some
* trade names, trademarks, or service marks; or
*
* f) Requiring indemnification of licensors and authors of that
* material by anyone who conveys the material (or modified versions of
* it) with contractual assumptions of liability to the recipient, for
* any liability that these contractual assumptions directly impose on
* those licensors and authors.
*
* All other non-permissive additional terms are considered "further
* restrictions" within the meaning of section 10. If the Program as you
* received it, or any part of it, contains a notice stating that it is
* governed by this License along with a term that is a further
* restriction, you may remove that term. If a license document contains
* a further restriction but permits relicensing or conveying under this
* License, you may add to a covered work material governed by the terms
* of that license document, provided that the further restriction does
* not survive such relicensing or conveying.
*
* If you add terms to a covered work in accord with this section, you
* must place, in the relevant source files, a statement of the
* additional terms that apply to those files, or a notice indicating
* where to find the applicable terms.
*
* Additional terms, permissive or non-permissive, may be stated in the
* form of a separately written license, or stated as exceptions;
* the above requirements apply either way.
*
* 8. Termination.
*
* You may not propagate or modify a covered work except as expressly
* provided under this License. Any attempt otherwise to propagate or
* modify it is void, and will automatically terminate your rights under
* this License (including any patent licenses granted under the third
* paragraph of section 11).
*
* However, if you cease all violation of this License, then your
* license from a particular copyright holder is reinstated (a)
* provisionally, unless and until the copyright holder explicitly and
* finally terminates your license, and (b) permanently, if the copyright
* holder fails to notify you of the violation by some reasonable means
* prior to 60 days after the cessation.
*
* Moreover, your license from a particular copyright holder is
* reinstated permanently if the copyright holder notifies you of the
* violation by some reasonable means, this is the first time you have
* received notice of violation of this License (for any work) from that
* copyright holder, and you cure the violation prior to 30 days after
* your receipt of the notice.
*
* Termination of your rights under this section does not terminate the
* licenses of parties who have received copies or rights from you under
* this License. If your rights have been terminated and not permanently
* reinstated, you do not qualify to receive new licenses for the same
* material under section 10.
*
* 9. Acceptance Not Required for Having Copies.
*
* You are not required to accept this License in order to receive or
* run a copy of the Program. Ancillary propagation of a covered work
* occurring solely as a consequence of using peer-to-peer transmission
* to receive a copy likewise does not require acceptance. However,
* nothing other than this License grants you permission to propagate or
* modify any covered work. These actions infringe copyright if you do
* not accept this License. Therefore, by modifying or propagating a
* covered work, you indicate your acceptance of this License to do so.
*
* 10. Automatic Licensing of Downstream Recipients.
*
* Each time you convey a covered work, the recipient automatically
* receives a license from the original licensors, to run, modify and
* propagate that work, subject to this License. You are not responsible
* for enforcing compliance by third parties with this License.
*
* An "entity transaction" is a transaction transferring control of an
* organization, or substantially all assets of one, or subdividing an
* organization, or merging organizations. If propagation of a covered
* work results from an entity transaction, each party to that
* transaction who receives a copy of the work also receives whatever
* licenses to the work the party's predecessor in interest had or could
* give under the previous paragraph, plus a right to possession of the
* Corresponding Source of the work from the predecessor in interest, if
* the predecessor has it or can get it with reasonable efforts.
*
* You may not impose any further restrictions on the exercise of the
* rights granted or affirmed under this License. For example, you may
* not impose a license fee, royalty, or other charge for exercise of
* rights granted under this License, and you may not initiate litigation
* (including a cross-claim or counterclaim in a lawsuit) alleging that
* any patent claim is infringed by making, using, selling, offering for
* sale, or importing the Program or any portion of it.
*
* 11. Patents.
*
* A "contributor" is a copyright holder who authorizes use under this
* License of the Program or a work on which the Program is based. The
* work thus licensed is called the contributor's "contributor version".
*
* A contributor's "essential patent claims" are all patent claims
* owned or controlled by the contributor, whether already acquired or
* hereafter acquired, that would be infringed by some manner, permitted
* by this License, of making, using, or selling its contributor version,
* but do not include claims that would be infringed only as a
* consequence of further modification of the contributor version. For
* purposes of this definition, "control" includes the right to grant
* patent sublicenses in a manner consistent with the requirements of
* this License.
*
* Each contributor grants you a non-exclusive, worldwide, royalty-free
* patent license under the contributor's essential patent claims, to
* make, use, sell, offer for sale, import and otherwise run, modify and
* propagate the contents of its contributor version.
*
* In the following three paragraphs, a "patent license" is any express
* agreement or commitment, however denominated, not to enforce a patent
* (such as an express permission to practice a patent or covenant not to
* sue for patent infringement). To "grant" such a patent license to a
* party means to make such an agreement or commitment not to enforce a
* patent against the party.
*
* If you convey a covered work, knowingly relying on a patent license,
* and the Corresponding Source of the work is not available for anyone
* to copy, free of charge and under the terms of this License, through a
* publicly available network server or other readily accessible means,
* then you must either (1) cause the Corresponding Source to be so
* available, or (2) arrange to deprive yourself of the benefit of the
* patent license for this particular work, or (3) arrange, in a manner
* consistent with the requirements of this License, to extend the patent
* license to downstream recipients. "Knowingly relying" means you have
* actual knowledge that, but for the patent license, your conveying the
* covered work in a country, or your recipient's use of the covered work
* in a country, would infringe one or more identifiable patents in that
* country that you have reason to believe are valid.
*
* If, pursuant to or in connection with a single transaction or
* arrangement, you convey, or propagate by procuring conveyance of, a
* covered work, and grant a patent license to some of the parties
* receiving the covered work authorizing them to use, propagate, modify
* or convey a specific copy of the covered work, then the patent license
* you grant is automatically extended to all recipients of the covered
* work and works based on it.
*
* A patent license is "discriminatory" if it does not include within
* the scope of its coverage, prohibits the exercise of, or is
* conditioned on the non-exercise of one or more of the rights that are
* specifically granted under this License. You may not convey a covered
* work if you are a party to an arrangement with a third party that is
* in the business of distributing software, under which you make payment
* to the third party based on the extent of your activity of conveying
* the work, and under which the third party grants, to any of the
* parties who would receive the covered work from you, a discriminatory
* patent license (a) in connection with copies of the covered work
* conveyed by you (or copies made from those copies), or (b) primarily
* for and in connection with specific products or compilations that
* contain the covered work, unless you entered into that arrangement,
* or that patent license was granted, prior to 28 March 2007.
*
* Nothing in this License shall be construed as excluding or limiting
* any implied license or other defenses to infringement that may
* otherwise be available to you under applicable patent law.
*
* 12. No Surrender of Others' Freedom.
*
* If conditions are imposed on you (whether by court order, agreement or
* otherwise) that contradict the conditions of this License, they do not
* excuse you from the conditions of this License. If you cannot convey a
* covered work so as to satisfy simultaneously your obligations under this
* License and any other pertinent obligations, then as a consequence you may
* not convey it at all. For example, if you agree to terms that obligate you
* to collect a royalty for further conveying from those to whom you convey
* the Program, the only way you could satisfy both those terms and this
* License would be to refrain entirely from conveying the Program.
*
* 13. Remote Network Interaction; Use with the GNU General Public License.
*
* Notwithstanding any other provision of this License, if you modify the
* Program, your modified version must prominently offer all users
* interacting with it remotely through a computer network (if your version
* supports such interaction) an opportunity to receive the Corresponding
* Source of your version by providing access to the Corresponding Source
* from a network server at no charge, through some standard or customary
* means of facilitating copying of software. This Corresponding Source
* shall include the Corresponding Source for any work covered by version 3
* of the GNU General Public License that is incorporated pursuant to the
* following paragraph.
*
* Notwithstanding any other provision of this License, you have
* permission to link or combine any covered work with a work licensed
* under version 3 of the GNU General Public License into a single
* combined work, and to convey the resulting work. The terms of this
* License will continue to apply to the part which is the covered work,
* but the work with which it is combined will remain governed by version
* 3 of the GNU General Public License.
*
* 14. Revised Versions of this License.
*
* The Free Software Foundation may publish revised and/or new versions of
* the GNU Affero General Public License from time to time. Such new versions
* will be similar in spirit to the present version, but may differ in detail to
* address new problems or concerns.
*
* Each version is given a distinguishing version number. If the
* Program specifies that a certain numbered version of the GNU Affero General
* Public License "or any later version" applies to it, you have the
* option of following the terms and conditions either of that numbered
* version or of any later version published by the Free Software
* Foundation. If the Program does not specify a version number of the
* GNU Affero General Public License, you may choose any version ever published
* by the Free Software Foundation.
*
* If the Program specifies that a proxy can decide which future
* versions of the GNU Affero General Public License can be used, that proxy's
* public statement of acceptance of a version permanently authorizes you
* to choose that version for the Program.
*
* Later license versions may give you additional or different
* permissions. However, no additional obligations are imposed on any
* author or copyright holder as a result of your choosing to follow a
* later version.
*
* 15. Disclaimer of Warranty.
*
* THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
* APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
* HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
* OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
* IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
* ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
*
* 16. Limitation of Liability.
*
* IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
* WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
* THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
* GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
* USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
* DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
* PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
* EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGES.
*
* 17. Interpretation of Sections 15 and 16.
*
* If the disclaimer of warranty and limitation of liability provided
* above cannot be given local legal effect according to their terms,
* reviewing courts shall apply local law that most closely approximates
* an absolute waiver of all civil liability in connection with the
* Program, unless a warranty or assumption of liability accompanies a
* copy of the Program in return for a fee.
*
* END OF TERMS AND CONDITIONS
*
* How to Apply These Terms to Your New Programs
*
* If you develop a new program, and you want it to be of the greatest
* possible use to the public, the best way to achieve this is to make it
* free software which everyone can redistribute and change under these terms.
*
* To do so, attach the following notices to the program. It is safest
* to attach them to the start of each source file to most effectively
* state the exclusion of warranty; and each file should have at least
* the "copyright" line and a pointer to where the full notice is found.
*
* <one line to give the program's name and a brief idea of what it does.>
* Copyright (C) <year> <name of author>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Also add information on how to contact you by electronic and paper mail.
*
* If your software can interact with users remotely through a computer
* network, you should also make sure that it provides a way for users to
* get its source. For example, if your program is a web application, its
* interface could display a "Source" link that leads users to an archive
* of the code. There are many ways you could offer source, and different
* solutions will be better for different programs; see section 13 for the
* specific requirements.
*
* You should also get your employer (if you work as a programmer) or school,
* if any, to sign a "copyright disclaimer" for the program, if necessary.
* For more information on this, and how to apply and follow the GNU AGPL, see
* <http://www.gnu.org/licenses/>.
*/
.
ADDITIONAL THIRD PARTY NOTICES:
.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/*
* Copyright (c) 1990, 1993, 1994, 1995
* The Regents of the University of California. All rights reserved.

View File

@@ -0,0 +1,138 @@
##
## zcash.conf configuration file. Lines beginning with # are comments.
##
# Network-related settings:
# Run on the test network instead of the real zcash network.
#testnet=0
# Run a regression test network
#regtest=0
# Connect via a SOCKS5 proxy
#proxy=127.0.0.1:9050
# Bind to given address and always listen on it. Use [host]:port notation for IPv6
#bind=<addr>
# Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6
#whitebind=<addr>
##############################################################
## Quick Primer on addnode vs connect ##
## Let's say for instance you use addnode=4.2.2.4 ##
## addnode will connect you to and tell you about the ##
## nodes connected to 4.2.2.4. In addition it will tell ##
## the other nodes connected to it that you exist so ##
## they can connect to you. ##
## connect will not do the above when you 'connect' to it. ##
## It will *only* connect you to 4.2.2.4 and no one else.##
## ##
## So if you're behind a firewall, or have other problems ##
## finding nodes, add some using 'addnode'. ##
## ##
## If you want to stay private, use 'connect' to only ##
## connect to "trusted" nodes. ##
## ##
## If you run multiple nodes on a LAN, there's no need for ##
## all of them to open lots of connections. Instead ##
## 'connect' them all to one node that is port forwarded ##
## and has lots of connections. ##
## Thanks goes to [Noodle] on Freenode. ##
##############################################################
# Use as many addnode= settings as you like to connect to specific peers
#addnode=69.164.218.197
#addnode=10.0.0.2:8233
# Alternatively use as many connect= settings as you like to connect ONLY to specific peers
#connect=69.164.218.197
#connect=10.0.0.1:8233
# Listening mode, enabled by default except when 'connect' is being used
#listen=1
# Maximum number of inbound+outbound connections.
#maxconnections=
#
# JSON-RPC options (for controlling a running Zcash/zcashd process)
#
# server=1 tells zcashd to accept JSON-RPC commands (set as default if not specified)
#server=1
# Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6.
# This option can be specified multiple times (default: bind to all interfaces)
#rpcbind=<addr>
# You must set rpcuser and rpcpassword to secure the JSON-RPC api
#rpcuser=Ulysses
#rpcpassword=YourSuperGreatPasswordNumber_DO_NOT_USE_THIS_OR_YOU_WILL_GET_ROBBED_385593
# How many seconds zcash will wait for a complete RPC HTTP request.
# after the HTTP connection is established.
#rpctimeout=30
# By default, only RPC connections from localhost are allowed.
# Specify as many rpcallowip= settings as you like to allow connections from other hosts,
# either as a single IPv4/IPv6 or with a subnet specification.
# NOTE: opening up the RPC port to hosts outside your local trusted network is NOT RECOMMENDED,
# because the rpcpassword is transmitted over the network unencrypted and also because anyone
# that can authenticate on the RPC port can steal your keys + take over the account running zcashd
# For more information see https://github.com/zcash/zcash/issues/1497
#rpcallowip=10.1.1.34/255.255.255.0
#rpcallowip=1.2.3.4/24
#rpcallowip=2001:db8:85a3:0:0:8a2e:370:7334/96
# Listen for RPC connections on this TCP port:
#rpcport=8232
# You can use Zcash or zcashd to send commands to Zcash/zcashd
# running on another host using this option:
#rpcconnect=127.0.0.1
# Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate
# with Zcash -server or zcashd
#rpcssl=1
# OpenSSL settings used when rpcssl=1
#rpcsslciphers=TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH
#rpcsslcertificatechainfile=server.cert
#rpcsslprivatekeyfile=server.pem
# Transaction Fee
# Send transactions as zero-fee transactions if possible (default: 0)
#sendfreetransactions=0
# Create transactions that have enough fees (or priority) so they are likely to # begin confirmation within n blocks (default: 1).
# This setting is overridden by the -paytxfee option.
#txconfirmtarget=n
# Miscellaneous options
# Enable attempt to mine zcash.
#gen=0
# Set the number of threads to be used for mining zcash (-1 = all cores).
#genproclimit=1
# Specify a different Equihash solver (e.g. "tromp") to try to mine zcash
# faster when gen=1.
#equihashsolver=default
# Pre-generate this many public/private key pairs, so wallet backups will be valid for
# both prior transactions and several dozen future transactions.
#keypool=100
# Pay an optional transaction fee every time you send zcash. Transactions with fees
# are more likely than free transactions to be included in generated blocks, so may
# be validated sooner. This setting does not affect private transactions created with
# 'z_sendmany'.
#paytxfee=0.00

View File

@@ -0,0 +1,77 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3.
.TH ZCASH-CLI "1" "October 2016" "Zcash RPC client version v1.0.0-409dcb7" "User Commands"
.SH NAME
zcash-cli \- RPC client for the Zcash daemon
.SH DESCRIPTION
Zcash RPC client version v1.0.0
.SS "Usage:"
.TP
zcash\-cli [options] <command> [params]
Send command to Zcash
.TP
zcash\-cli [options] help
List commands
.TP
zcash\-cli [options] help <command>
Get help for a command
.SH OPTIONS
.HP
\-?
.IP
This help message
.HP
\fB\-conf=\fR<file>
.IP
Specify configuration file (default: zcash.conf)
.HP
\fB\-datadir=\fR<dir>
.IP
Specify data directory
.HP
\fB\-testnet\fR
.IP
Use the test network
.HP
\fB\-regtest\fR
.IP
Enter regression test mode, which uses a special chain in which blocks
can be solved instantly. This is intended for regression testing tools
and app development.
.HP
\fB\-rpcconnect=\fR<ip>
.IP
Send commands to node running on <ip> (default: 127.0.0.1)
.HP
\fB\-rpcport=\fR<port>
.IP
Connect to JSON\-RPC on <port> (default: 8232 or testnet: 18232)
.HP
\fB\-rpcwait\fR
.IP
Wait for RPC server to start
.HP
\fB\-rpcuser=\fR<user>
.IP
Username for JSON\-RPC connections
.HP
\fB\-rpcpassword=\fR<pw>
.IP
Password for JSON\-RPC connections
.PP
SSL options: (see the Bitcoin Wiki for SSL setup instructions)
.HP
\fB\-rpcssl\fR
.IP
Use OpenSSL (https) for JSON\-RPC connections
.SH "SEE ALSO"
The full documentation for
.B Zcash
is maintained as a Texinfo manual. If the
.B info
and
.B Zcash
programs are properly installed at your site, the command
.IP
.B info Zcash
.PP
should give you access to the complete manual.

View File

@@ -0,0 +1,432 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3.
.TH ZCASHD "1" "October 2016" "Zcash Daemon version v1.0.0-409dcb7" "User Commands"
.SH NAME
zcashd \- Network daemon for interacting with the Zcash blockchain
.SH DESCRIPTION
Zcash Daemon version v1.0.0
.SS "Usage:"
.TP
zcashd [options]
Start Zcash Daemon
.SH OPTIONS
.HP
\-?
.IP
This help message
.HP
\fB\-alerts\fR
.IP
Receive and display P2P network alerts (default: 1)
.HP
\fB\-alertnotify=\fR<cmd>
.IP
Execute command when a relevant alert is received or we see a really
long fork (%s in cmd is replaced by message)
.HP
\fB\-blocknotify=\fR<cmd>
.IP
Execute command when the best block changes (%s in cmd is replaced by
block hash)
.HP
\fB\-checkblocks=\fR<n>
.IP
How many blocks to check at startup (default: 288, 0 = all)
.HP
\fB\-checklevel=\fR<n>
.IP
How thorough the block verification of \fB\-checkblocks\fR is (0\-4, default: 3)
.HP
\fB\-conf=\fR<file>
.IP
Specify configuration file (default: zcash.conf)
.HP
\fB\-daemon\fR
.IP
Run in the background as a daemon and accept commands
.HP
\fB\-datadir=\fR<dir>
.IP
Specify data directory
.HP
\fB\-dbcache=\fR<n>
.IP
Set database cache size in megabytes (4 to 16384, default: 100)
.HP
\fB\-loadblock=\fR<file>
.IP
Imports blocks from external blk000??.dat file on startup
.HP
\fB\-maxorphantx=\fR<n>
.IP
Keep at most <n> unconnectable transactions in memory (default: 100)
.HP
\fB\-par=\fR<n>
.IP
Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 =
leave that many cores free, default: 0)
.HP
\fB\-pid=\fR<file>
.IP
Specify pid file (default: zcashd.pid)
.HP
\fB\-prune=\fR<n>
.IP
Reduce storage requirements by pruning (deleting) old blocks. This mode
disables wallet support and is incompatible with \fB\-txindex\fR. Warning:
Reverting this setting requires re\-downloading the entire blockchain.
(default: 0 = disable pruning blocks, >550 = target size in MiB to use
for block files)
.HP
\fB\-reindex\fR
.IP
Rebuild block chain index from current blk000??.dat files on startup
.HP
\fB\-sysperms\fR
.IP
Create new files with system default permissions, instead of umask 077
(only effective with disabled wallet functionality)
.HP
\fB\-txindex\fR
.IP
Maintain a full transaction index, used by the getrawtransaction rpc
call (default: 0)
.PP
Connection options:
.HP
\fB\-addnode=\fR<ip>
.IP
Add a node to connect to and attempt to keep the connection open
.HP
\fB\-banscore=\fR<n>
.IP
Threshold for disconnecting misbehaving peers (default: 100)
.HP
\fB\-bantime=\fR<n>
.IP
Number of seconds to keep misbehaving peers from reconnecting (default:
86400)
.HP
\fB\-bind=\fR<addr>
.IP
Bind to given address and always listen on it. Use [host]:port notation
for IPv6
.HP
\fB\-connect=\fR<ip>
.IP
Connect only to the specified node(s)
.HP
\fB\-discover\fR
.IP
Discover own IP addresses (default: 1 when listening and no \fB\-externalip\fR
or \fB\-proxy\fR)
.HP
\fB\-dns\fR
.IP
Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (default: 1)
.HP
\fB\-dnsseed\fR
.IP
Query for peer addresses via DNS lookup, if low on addresses (default: 1
unless \fB\-connect\fR)
.HP
\fB\-externalip=\fR<ip>
.IP
Specify your own public address
.HP
\fB\-forcednsseed\fR
.IP
Always query for peer addresses via DNS lookup (default: 0)
.HP
\fB\-listen\fR
.IP
Accept connections from outside (default: 1 if no \fB\-proxy\fR or \fB\-connect\fR)
.HP
\fB\-maxconnections=\fR<n>
.IP
Maintain at most <n> connections to peers (default: 125)
.HP
\fB\-maxreceivebuffer=\fR<n>
.IP
Maximum per\-connection receive buffer, <n>*1000 bytes (default: 5000)
.HP
\fB\-maxsendbuffer=\fR<n>
.IP
Maximum per\-connection send buffer, <n>*1000 bytes (default: 1000)
.HP
\fB\-onion=\fR<ip:port>
.IP
Use separate SOCKS5 proxy to reach peers via Tor hidden services
(default: \fB\-proxy\fR)
.HP
\fB\-onlynet=\fR<net>
.IP
Only connect to nodes in network <net> (ipv4, ipv6 or onion)
.HP
\fB\-permitbaremultisig\fR
.IP
Relay non\-P2SH multisig (default: 1)
.HP
\fB\-port=\fR<port>
.IP
Listen for connections on <port> (default: 8233 or testnet: 18233)
.HP
\fB\-proxy=\fR<ip:port>
.IP
Connect through SOCKS5 proxy
.HP
\fB\-proxyrandomize\fR
.IP
Randomize credentials for every proxy connection. This enables Tor
stream isolation (default: 1)
.HP
\fB\-seednode=\fR<ip>
.IP
Connect to a node to retrieve peer addresses, and disconnect
.HP
\fB\-timeout=\fR<n>
.IP
Specify connection timeout in milliseconds (minimum: 1, default: 5000)
.HP
\fB\-upnp\fR
.IP
Use UPnP to map the listening port (default: 0)
.HP
\fB\-whitebind=\fR<addr>
.IP
Bind to given address and whitelist peers connecting to it. Use
[host]:port notation for IPv6
.HP
\fB\-whitelist=\fR<netmask>
.IP
Whitelist peers connecting from the given netmask or IP address. Can be
specified multiple times. Whitelisted peers cannot be DoS banned and
their transactions are always relayed, even if they are already in the
mempool, useful e.g. for a gateway
.PP
Wallet options:
.HP
\fB\-disablewallet\fR
.IP
Do not load the wallet and disable wallet RPC calls
.HP
\fB\-keypool=\fR<n>
.IP
Set key pool size to <n> (default: 100)
.HP
\fB\-paytxfee=\fR<amt>
.IP
Fee (in BTC/kB) to add to transactions you send (default: 0.00)
.HP
\fB\-rescan\fR
.IP
Rescan the block chain for missing wallet transactions on startup
.HP
\fB\-salvagewallet\fR
.IP
Attempt to recover private keys from a corrupt wallet.dat on startup
.HP
\fB\-sendfreetransactions\fR
.IP
Send transactions as zero\-fee transactions if possible (default: 0)
.HP
\fB\-spendzeroconfchange\fR
.IP
Spend unconfirmed change when sending transactions (default: 1)
.HP
\fB\-txconfirmtarget=\fR<n>
.IP
If paytxfee is not set, include enough fee so transactions begin
confirmation on average within n blocks (default: 2)
.HP
\fB\-maxtxfee=\fR<amt>
.IP
Maximum total fees to use in a single wallet transaction; setting this
too low may abort large transactions (default: 0.10)
.HP
\fB\-upgradewallet\fR
.IP
Upgrade wallet to latest format on startup
.HP
\fB\-wallet=\fR<file>
.IP
Specify wallet file (within data directory) (default: wallet.dat)
.HP
\fB\-walletbroadcast\fR
.IP
Make the wallet broadcast transactions (default: 1)
.HP
\fB\-walletnotify=\fR<cmd>
.IP
Execute command when a wallet transaction changes (%s in cmd is replaced
by TxID)
.HP
\fB\-zapwallettxes=\fR<mode>
.IP
Delete all wallet transactions and only recover those parts of the
blockchain through \fB\-rescan\fR on startup (1 = keep tx meta data e.g.
account owner and payment request information, 2 = drop tx meta data)
.PP
Debugging/Testing options:
.HP
\fB\-debug=\fR<category>
.IP
Output debugging information (default: 0, supplying <category> is
optional). If <category> is not supplied, output all debugging
information.<category> can be: addrman, alert, bench, coindb, db, lock,
rand, rpc, selectcoins, mempool, net, proxy, prune.
.HP
\fB\-gen\fR
.IP
Generate coins (default: 0)
.HP
\fB\-genproclimit=\fR<n>
.IP
Set the number of threads for coin generation if enabled (\fB\-1\fR = all
cores, default: 1)
.HP
\fB\-equihashsolver=\fR<name>
.IP
Specify the Equihash solver to be used if enabled (default: "default")
.HP
\fB\-help\-debug\fR
.IP
Show all debugging options (usage: \fB\-\-help\fR \fB\-help\-debug\fR)
.HP
\fB\-logips\fR
.IP
Include IP addresses in debug output (default: 0)
.HP
\fB\-logtimestamps\fR
.IP
Prepend debug output with timestamp (default: 1)
.HP
\fB\-minrelaytxfee=\fR<amt>
.IP
Fees (in BTC/Kb) smaller than this are considered zero fee for relaying
(default: 0.00005)
.HP
\fB\-printtoconsole\fR
.IP
Send trace/debug info to console instead of debug.log file
.HP
\fB\-shrinkdebugfile\fR
.IP
Shrink debug.log file on client startup (default: 1 when no \fB\-debug\fR)
.HP
\fB\-testnet\fR
.IP
Use the test network
.PP
Node relay options:
.HP
\fB\-datacarrier\fR
.IP
Relay and mine data carrier transactions (default: 1)
.HP
\fB\-datacarriersize\fR
.IP
Maximum size of data in data carrier transactions we relay and mine
(default: 80)
.PP
Block creation options:
.HP
\fB\-blockminsize=\fR<n>
.IP
Set minimum block size in bytes (default: 0)
.HP
\fB\-blockmaxsize=\fR<n>
.IP
Set maximum block size in bytes (default: 750000)
.HP
\fB\-blockprioritysize=\fR<n>
.IP
Set maximum size of high\-priority/low\-fee transactions in bytes
(default: 50000)
.PP
RPC server options:
.HP
\fB\-server\fR
.IP
Accept command line and JSON\-RPC commands
.HP
\fB\-rest\fR
.IP
Accept public REST requests (default: 0)
.HP
\fB\-rpcbind=\fR<addr>
.IP
Bind to given address to listen for JSON\-RPC connections. Use
[host]:port notation for IPv6. This option can be specified multiple
times (default: bind to all interfaces)
.HP
\fB\-rpcuser=\fR<user>
.IP
Username for JSON\-RPC connections
.HP
\fB\-rpcpassword=\fR<pw>
.IP
Password for JSON\-RPC connections
.HP
\fB\-rpcport=\fR<port>
.IP
Listen for JSON\-RPC connections on <port> (default: 8232 or testnet:
18232)
.HP
\fB\-rpcallowip=\fR<ip>
.IP
Allow JSON\-RPC connections from specified source. Valid for <ip> are a
single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0)
or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified
multiple times
.HP
\fB\-rpcthreads=\fR<n>
.IP
Set the number of threads to service RPC calls (default: 4)
.HP
\fB\-rpckeepalive\fR
.IP
RPC support for HTTP persistent connections (default: 1)
.PP
RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)
.HP
\fB\-rpcssl\fR
.IP
Use OpenSSL (https) for JSON\-RPC connections
.HP
\fB\-rpcsslcertificatechainfile=\fR<file.cert>
.IP
Server certificate file (default: server.cert)
.HP
\fB\-rpcsslprivatekeyfile=\fR<file.pem>
.IP
Server private key (default: server.pem)
.HP
\fB\-rpcsslciphers=\fR<ciphers>
.IP
Acceptable ciphers (default:
TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH)
.SH COPYRIGHT
Copyright \(co 2009\-2016 The Bitcoin Core Developers
.br
Copyright \(co 2015\-2016 The Zcash Developers
.PP
This is experimental software.
.PP
Distributed under the MIT software license, see the accompanying file COPYING
or <http://www.opensource.org/licenses/mit\-license.php>.
.PP
This product includes software developed by the OpenSSL Project for use in the
OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software written
by Eric Young and UPnP software written by Thomas Bernard.
.SH "SEE ALSO"
The full documentation for
.B Zcash
is maintained as a Texinfo manual. If the
.B info
and
.B Zcash
programs are properly installed at your site, the command
.IP
.B info Zcash
.PP
should give you access to the complete manual.

View File

@@ -2,8 +2,9 @@
# postinst script for zcash
#
# see: dh_installdeb(1)
set -e
set -x
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
@@ -13,9 +14,10 @@ set -x
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# for details, see https://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
configure)
;;

View File

@@ -4,7 +4,7 @@
# see: dh_installdeb(1)
set -e
#set -x
# summary of how this script can be called:
# * <postrm> `remove'
# * <postrm> `purge'
@@ -15,18 +15,12 @@ set -e
# * <new-postrm> `abort-upgrade' <old-version>
# * <disappearer's-postrm> `disappear' <overwriter>
# <overwriter-version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# for details, see https://www.debian.org/doc/debian-policy/ or
# the debian-policy package
. /usr/share/debconf/confmodule
case "$1" in
upgrade|failed-upgrade)
;;
remove|abort-install|abort-upgrade|disappear)
;;
purge)
purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
;;
*)

View File

@@ -4,20 +4,18 @@
# see: dh_installdeb(1)
set -e
#set -x
# summary of how this script can be called:
# * <new-preinst> `install'
# * <new-preinst> `install' <old-version>
# * <new-preinst> `upgrade' <old-version>
# * <old-preinst> `abort-upgrade' <new-version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# for details, see https://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
install)
;;
upgrade)
case "$1" in
install|upgrade)
;;
abort-upgrade)

View File

@@ -13,15 +13,12 @@ set -e
# * <deconfigured's-prerm> `deconfigure' `in-favour'
# <package-being-installed> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# for details, see https://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
remove|deconfigure)
;;
upgrade)
remove|upgrade|deconfigure)
;;
failed-upgrade)

25
contrib/DEBIAN/rules Executable file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1
# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
%:
dh $@ --with autotools_dev
# dh_make generated override targets
# This is example for Cmake (See https://bugs.debian.org/641051 )
#override_dh_auto_configure:
# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)

View File

@@ -0,0 +1 @@
DEBIAN/examples/zcash.conf

View File

@@ -0,0 +1,2 @@
DEBIAN/manpages/zcash-cli.1
DEBIAN/manpages/zcashd.1

View File

@@ -1,5 +1,5 @@
---
name: "zcash-1.0.0-rc1"
name: "zcash-1.0.0"
enable_cache: true
distro: "debian"
suites:

View File

@@ -1,52 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)
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
MrD0ofsytfy1LQ==
=DE4h
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -0,0 +1,70 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.5
Comment: Hostname: pgp.mit.edu
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
eCJPlVdlz6Oj1tV2kw==
=E8LJ
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -1,63 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG/MacGPG2 v2.0.26
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
XwbdK0Zpx/oDtRHpuDMGKJBV2LWAZYkEbFsmtg==
=3o2I
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -0,0 +1,449 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
HifqTn/z+qdV2A==
=phy7
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -0,0 +1,171 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=qSqw
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -1,28 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.0
mQENBE5UtMEBCADOUz2i9l/D8xYINCmfUDnxi+DXvX5LmZ39ZdvsoE+ugO0SRRGdIHEFO2is
0xezX50wXu9aneb+tEqM0BuiLo6VxaXpxrkxHpr6c4jf37SkE/H0qsi/txEUp7337y3+4HMG
lUjiuh802I72p1qusjsKBnmnnR0rwNouTcoDmGUDh7jpKCtzFv+2TR2dRthJn7vmmjq3+bG6
PYfqoFY1yHrAGT1lrDBULZsQ/NBLI2+J4oo2LYv3GCq8GNnzrovqvTvui50VSROhLrOe58o2
shE+sjQShAy5wYkPt1R1fQnpfx+5vf+TPnkxVwRb3h5GhCp0YL8XC/BXsd5vM4KlVH2rABEB
AAG0K1dsYWRpbWlyIEouIHZhbiBkZXIgTGFhbiA8bGFhbndqQGdtYWlsLmNvbT6JATgEEwEC
ACIFAk5UtMECGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHSBCwEjRsmmy6YIAK09
buNXyYQrJBsX16sXxEhx5QPKyF3uHJDFJv66SdnpvIkNoznsaPiRJkbTANop93FZmaGa6wVn
zGDiz7jPA8Dpxx5aAYPhIT+zPJAdXWM3wJ/Gio9besRNzniai8Lwi5MZ9R/5yFGBobm6/AcN
4sUoqA3NSV2U3I29R0Vwlzo8GVtmyi9ENSi6Oo7AcXNTRt69cxW4nAHkB+amwwDJlcAb31ex
bogYXPhScwqQZixRr+JBkKxBjkTXXnQypT4KI5SegYwQVYfyiZmDP7UHKe/u6pSKKbVphLg8
xLB5spcXse8/a2+onrbNlw6y8TXiJ++Z54PE7zztWTXf2huakeG5AQ0ETlS0wQEIAMNO3OkP
xoPRKWzBLcI7JRITAW+HNaLTq3uN2+4WxA57DEjbL9EDoAv+7wTkDAL40f0T+xiu6GJcLFjw
GJZu/tYu7+mErHjrdo+K4suCQt7w5EXCBvOLjhW4tyYMzNx8hP+oqzOW9iEC+6VV91+DYeqt
EkJuyVXOI4vzBlTw8uGow8aMMsCq8XVvKUZFTPsjGl197Q5B3A+ZOFCR8xqiqdPjuz6MglVV
oFdDNu3EZn8zkGsQlovXoE9ndVeVzx/XMNmsxFaMYsReUs253RIf1FEfgExID0fg2OnyLCjS
2iFW1RgajS+/saIkKl+N1iuMzJA7wMAM0plhRueOG0MtZSsAEQEAAYkBHwQYAQIACQUCTlS0
wQIbDAAKCRB0gQsBI0bJpmsDB/4waenn2CvSHXyomykfpwf5lMte1V5LvH3z5R2LY+1NopRv
LSz3iC39x69XWiTbhywDfgafnGPW4pWBOff2/bu5/A6z1Hnan1vyrRRD/hx1uMJ7S6q+bIvZ
iVIg1p0jH6tdIIhwX3cydhdRZHo7e9oSMgOUWsr6Ar59NRo9CENwGPE4U61HXfOnxWdrFWoA
XdwZczBeLxmUy6Vo6sKqv+gE4bqrtAM0sY/MsQ9cU95x+52ox/sq44lQMwd3ZBYUP7B1qbHI
hZSZuch6MLi5scLPeau0ZvCaljiaMeivP5+x0gWPRs0kI+9sZxInbqvrsJ6oOBJM3xYGhtn1
zZ7qmZR7
=si/k
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -1,42 +0,0 @@
---
name: bitcoin
urls:
- http://bitcoin.org/bitcoin-latest-linux-gitian.zip
rss:
- url:
xpath: //item/link/text()
pattern: bitcoin-\d+.\d+.\d+-linux-gitian.zip
signers:
0A82509767C7D4A5D14DA2301AE1D35043E08E54:
name: BlueMatt
key: bluematt
BF6273FAEF7CC0BA1F562E50989F6B3048A116B5:
name: Devrandom
key: devrandom
E463A93F5F3117EEDE6C7316BD02942421F4889F:
name: Luke-Jr
key: luke-jr
D762373D24904A3E42F33B08B9A408E71DAAC974:
name: "Pieter Wuille"
key: sipa
77E72E69DA7EE0A148C06B21B34821D4944DE5F7:
name: tcatm
key: tcatm
01CDF4627A3B88AAE4A571C87588242FBE38D3A8:
name: "Gavin Andresen"
key: gavinandresen
71A3B16735405025D447E8F274810B012346C9A6:
name: "Wladimir J. van der Laan"
key: laanwj
AEC1884398647C47413C1C3FB1179EB7347DC10D:
name: "Warren Togami"
key: wtogami
9692B91BBF0E8D34DFD33B1882C5C009628ECF0C:
name: michagogo
key: michagogo
E944AE667CF960B1004BC32FCA662BE18B877A60:
name: "Andreas Schildbach"
key: aschildbach
C060A6635913D98A3587D7DB1C2491FFEB0EF770:
name: "Cory Fields"
key: "cfields"

View File

@@ -1,59 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)
mQENBFGeqJ4BCADb7SI3/+q93gIvN0AGRg9Mtz73OLIOzCHeeoyn+tp7JcYNzxkQ
9lfeXiEfn72Sh8gHkLtLIqr7HlIMo8DxSS8JPRVjlJGkNyAW4SeEwN2wNa5OV8k0
N4jBa9a1csFyCyrEkPKvkUpBkQDvNXjNxyEhHwyZqPanKxy6NXIHOJji8ObOMQXI
T9HwJrpjRth3u4uKG968JBTEyAXAmkt0Zidl1Ykgzcedk4mJSE9uZCW8DjSv2wML
XcQz8+dYsoskT3KRdkowLHxAfj1BNyNc1+rKLghliM5vSQWi+Lbhi1Bxh4sY1UwA
lKnAGqrnAGyIvCtkwTq5QI6ufF2ZY44bvVgpABEBAAG0IU1pY2hhZ29nbyA8bWlj
aGFnb2dvQHNlcnZlci5mYWtlPokBOAQTAQIAIgUCUZ6ongIbAwYLCQgHAwIGFQgC
CQoLBBYCAwECHgECF4AACgkQgsXACWKOzwzMUAgAuqUmK10xE5C3lUym2f72z0t6
a2NM5Wfjr9//Y1/okC36C5XAMEtN2UwckPzzJ5p5D5y5yzwfZq5Jd8Py29VQIMsV
7FbC1a0H3D+bCyX+JJ6FAmUbnWOQ/+mydYc74RvD8iwjePNT6kziZNv6dMGctJTl
0alwjtQYgyGkeYKnIxbcyjHX/IawLUrunb/6mSKun87T8+NM/omfFCTc3l8TakpM
0wyNYRiUkIfUBvB8sDUU3A80qKN/hqRKvlFu3+/kMiAc9ZYQrbmsB+sYWdmM+4zw
8NBw3yuYzWyPuoa4PR5ZmS9F11WLMR5vTRCdLudAqYsWu3LtV6vAIvlOUa2LMLRg
TWljaGFnb2dvIChSZWdpc3RlcmVkIG5pY2sgbWljaGFnb2dvIG9uIGZyZWVub2Rl
IGFzIG9mIE9jdG9iZXIgMTIsIDIwMTMpIDxtaWNoYWdvZ29Ac2VydmVyLmZha2U+
iQE4BBMBAgAiBQJSWarzAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCC
xcAJYo7PDA7nB/91wAiaMlU5nHLUu0anhNQbGvUdFgKK1zO90S5KzUdJcY438jcS
UJW1az8l9U9JBRIfPRYVhz/Z1TAJ+dCzD7D8BXHFeGEr0zNOh87ly9aB5du7dpN2
oSBD6wLcJpqxt4h+XjSS2CX98/2ZIJxXENE2KySaTXP39Xl3eNwvJTUBA4XlcMey
J8KMp/IERli4H0O7vRyLgu3yYpUArTqAonzG1g2lfB35PQJfeInrRSniQ336otnZ
A8qwJ63kfUtWVDRz0g1fnvtiLGPivDJaI5hyIaUeJPaXU1+sg7YNroDu60o2NGZh
F+0IjHlvRfzzA+F9Vw38rpSqR3BmCdjf6Sv3iQEcBBABAgAGBQJSWa9/AAoJEH+r
EUJn5PoE/hgH/1T2dAthVucA/hzY0nl4SMjbg+dzNlYBq00Qwx8DRKVjk5et8+kY
oPI3DGILcr+ELnxNekeMv9WQBBtJanUh1K5ohZ6ohoR7lG18LXf5HCdspflB5Me6
LMA6iMryEP6gIs9GFuoGe2YQavm58YrkqhcPu34dGN7kdurfEXLvDfVlh5ZbKCsP
Gyd7Pbz04SpqykgK1udiTsLVjc70Xhv+jAMqeaCugDX6TLEwjVmZH/xsyKk2Uh3V
Oib5FXADAtKH+vSqqhFpXrw7R/NaBzvCbas8l61DFHiUg1/bo8vsV8MtGcyZmzXJ
C5Gm0njtGOil/g7JF9siUrpxs9Yyt/h+T2W0W01pY2hhZ29nbyAoVXNlciBhY2Nv
dW50IG1pY2hhZ29nbyBvbiBHaXRodWIgYXMgb2YgT2N0b2JlciAxMiwgMjAxMykg
PG1pY2hhZ29nb0BzZXJ2ZXIuZmFrZT6JATcEEwECACIFAlJZqxkCGwMGCwkIBwMC
BhUIAgkKCwQWAgMBAh4BAheAAAoJEILFwAlijs8M+1AH+IU78ARblqTnJeSl0iWH
mEsg4IBK30Q6/exDAcqOEm1Yc171uw2WnGmIvPYOQqxrRTvj3LoQ816dU6jrj6vY
s+XX0R2hxy7ILh17D/3UKnHcddu7rmc7pNEqZeBXaMughqQaPOWkAIe52+qK5tsl
sWllzTYE4jo29uZ3dAtDcKEJjBo/pIXnu1GOslE1+V4X1H9WDlwrS/JXHzyDQAjt
maPR+3gNesDanhrRmrnT3ZXW2ZVd3vGBibhia8PWUhU1uwOH23ySWXncgsHH0Zad
UMjd4w3YliZP/mLn2ghAxHB70IO7lgAgN3HYZeFoufP3pcK440A+CezfQiRcjHl/
oIkBHAQQAQIABgUCUlmvfwAKCRB/qxFCZ+T6BOq9CACItsrUZPKGeWSTkMHknMrV
K5vxIXJVCBb+Tppc0Q/J5p4EkW/RFhTwIP2zw8NLDKMh5oO9md4LXhvfIZkqQJFo
6ZtLa3Vf+Kj7uyxezBo4QHA+G7tDsRGaMKVrEMiyLCwS1+hg9VaNzsf7zmQW7mYE
vTLMHp3cVaSU7Mh2Dl8rnAaM/DpTUZQwZ+32Qrb/Z4HSa4f278iqoFpjEbBE2KCr
vT5yEVvpCZ4lwSgA2a+uTlRTvVV6NA/kpsxU64tmhuEOjy+ToDqJ8wv4mqvWZxMv
C6OhfVaXBy3U9gG8aQV0ffXGs+TbCtv8ApHd6E1/AVk0oyZGJaBVrEl688bBIWd/
uQENBFGeqJ4BCADFmgR7oEGkFFB5qXnuNYFq1nUGDAh0dLNtAD3J6EMxUZEXdmp+
DQHJw6/eDRQaG9EbjNZheycbVUoI8K2Y/Z268HQueGuIEIJv6cZYXoXdWCbDD4fn
HMNUX2wNlpDqWxb7PNUEtfU9hI3gmHGlr5OiEh3iV06uiZg4n2rbWPbj45m5LJzv
wpCrUA+pLcl9Xjw2cajaSTjdXHk9gvXTCo6s2ZS3/3Q4l+xuzZp1MGNzPQHASMKs
wecSJKkYg6W8I5WsVlPd9a8oQCc/Nfz7BPw31MRVR/SF5FAMqaXx5uLwghVdHB2i
cLURsOtJlCfP8W06gB7yS+MH45Jq/oxBRiJBABEBAAGJAR8EGAECAAkFAlGeqJ4C
GwwACgkQgsXACWKOzwwT4wgAy6ICcnBZ9l2jSu+ldy57F6jf5kpKZgB9NV8V2mMA
NeY1wMQ4VTVpU4t3s4E2LYtGNJNkPQVHbt1Pf4dGPasvMPaHMamgwgyqgYixqs0x
D5PdKzVrfnjwTTr/ZAFdccSPmvy5/hbY0geQ/+mzdbL07+xaT58JIoG5nySDKhmC
VeOvhDZtXMVAhEWBDPEgh/H9sEuBgMgZrzfE1j3q802qiXeQs6WtadWlQ1RN9Iq1
ZzIi6u9/BifEIRI0pO/WwKOZdXLTemFUoakoe7uT3A74N96t0G9LZVihYbEoO+Pc
5IaHPBV5VLeR3TB1LnnjHVf/Fwi8cnGy50kNWjcbMyEDag==
=jyQ4
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
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
JfmuGLm2Czs=
=kUB4
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -0,0 +1,51 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
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
=0DUx
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -0,0 +1,47 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.5
Comment: Hostname: pgp.mit.edu
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
=nZf9
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -1,42 +0,0 @@
---
name: bitcoin
urls:
- http://bitcoin.org/bitcoin-latest-win32-gitian.zip
rss:
- url:
xpath: //item/link/text()
pattern: bitcoin-\d+.\d+.\d+-win32-gitian.zip
signers:
0A82509767C7D4A5D14DA2301AE1D35043E08E54:
name: BlueMatt
key: bluematt
BF6273FAEF7CC0BA1F562E50989F6B3048A116B5:
name: Devrandom
key: devrandom
E463A93F5F3117EEDE6C7316BD02942421F4889F:
name: Luke-Jr
key: luke-jr
D762373D24904A3E42F33B08B9A408E71DAAC974:
name: "Pieter Wuille"
key: sipa
77E72E69DA7EE0A148C06B21B34821D4944DE5F7:
name: tcatm
key: tcatm
01CDF4627A3B88AAE4A571C87588242FBE38D3A8:
name: "Gavin Andresen"
key: gavinandresen
71A3B16735405025D447E8F274810B012346C9A6:
name: "Wladimir J. van der Laan"
key: laanwj
AEC1884398647C47413C1C3FB1179EB7347DC10D:
name: "Warren Togami"
key: wtogami
9692B91BBF0E8D34DFD33B1882C5C009628ECF0C:
name: michagogo
key: michagogo
E944AE667CF960B1004BC32FCA662BE18B877A60:
name: "Andreas Schildbach"
key: aschildbach
C060A6635913D98A3587D7DB1C2491FFEB0EF770:
name: "Cory Fields"
key: "cfields"

View File

@@ -1,131 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.13 (GNU/Linux)
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
=icdI
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -8,7 +8,7 @@ NO_WALLET ?=
NO_UPNP ?=
FALLBACK_DOWNLOAD_PATH ?= https://z.cash/depends-sources
BUILD = $(shell ./config.guess)
BUILD ?= $(shell ./config.guess)
HOST ?= $(BUILD)
PATCHES_PATH = $(BASEDIR)/patches
BASEDIR = $(CURDIR)

View File

@@ -1,8 +1,8 @@
package=bdb
$(package)_version=5.3.28
$(package)_version=6.2.23
$(package)_download_path=http://download.oracle.com/berkeley-db
$(package)_file_name=db-$($(package)_version).tar.gz
$(package)_sha256_hash=e0a992d740709892e81f9d93f06daf305cf73fb81b545afe72478043172c3628
$(package)_sha256_hash=47612c8991aa9ac2f6be721267c8d3cdccf5ac83105df8e50809daea24e95dc7
$(package)_build_subdir=build_unix
define $(package)_set_vars
@@ -16,7 +16,7 @@ define $(package)_config_cmds
endef
define $(package)_build_cmds
$(MAKE) libdb_cxx-5.3.a libdb-5.3.a
$(MAKE) libdb_cxx-6.2.a libdb-6.2.a
endef
define $(package)_stage_cmds

View File

@@ -3,7 +3,7 @@ $(package)_version=1_62_0
$(package)_download_path=http://sourceforge.net/projects/boost/files/boost/1.62.0
$(package)_file_name=$(package)_$($(package)_version).tar.bz2
$(package)_sha256_hash=36c96b0f6155c98404091d8ceb48319a28279ca0333fba1ad8611eb90afb2ca0
$(package)_patches=deprecated_auto_ptr.patch
$(package)_patches=deprecated_auto_ptr.patch include_poll.patch
define $(package)_set_vars
$(package)_config_opts_release=variant=release
@@ -27,7 +27,8 @@ endef
define $(package)_preprocess_cmds
echo "using $(boost_toolset_$(host_os)) : : $($(package)_cxx) : <cxxflags>\"$($(package)_cxxflags) $($(package)_cppflags)\" <linkflags>\"$($(package)_ldflags)\" <archiver>\"$(boost_archiver_$(host_os))\" <striper>\"$(host_STRIP)\" <ranlib>\"$(host_RANLIB)\" <rc>\"$(host_WINDRES)\" : ;" > user-config.jam && \
patch -p1 < $($(package)_patch_dir)/deprecated_auto_ptr.patch
patch -p1 < $($(package)_patch_dir)/deprecated_auto_ptr.patch && \
patch -p1 < $($(package)_patch_dir)/include_poll.patch
endef
define $(package)_config_cmds

View File

@@ -7,7 +7,7 @@ $(package)_dependencies=
$(package)_config_opts=--enable-cxx --disable-shared
define $(package)_config_cmds
$($(package)_autoconf)
$($(package)_autoconf) --host=$(host) --build=$(build)
endef
define $(package)_build_cmds

View File

@@ -9,7 +9,7 @@ $(package)_git_commit=2e6314a9f7efcd9af1c77669d7d9a229df86a777
$(package)_dependencies=libgmp libsodium
define $(package)_build_cmds
CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT
CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT OPTFLAGS="-O2 -march=x86-64"
endef
define $(package)_stage_cmds

View File

@@ -0,0 +1,11 @@
--- boost_1_62_0-orig/boost/asio/detail/socket_types.hpp 2016-09-21 15:33:21.000000000 +0100
+++ boost_1_62_0/boost/asio/detail/socket_types.hpp 2016-10-18 03:08:41.712254217 +0100
@@ -58,7 +58,7 @@
#else
# include <sys/ioctl.h>
# if !defined(__SYMBIAN32__)
-# include <sys/poll.h>
+# include <poll.h>
# endif
# include <sys/types.h>
# include <sys/stat.h>

View File

@@ -1,20 +0,0 @@
Zcash Core 1.0.0-beta2
====================
[Zcash](https://z.cash/) is the Zcash client. It downloads and stores the entire history of Zcash transactions; depending on the speed of your computer and network connection, the synchronization process could take a day or more once the blockchain has reached a significant size.
### Need Help?
* See the documentation at the [Zcash Wiki](https://github.com/zcash/zcash/wiki) for help and more information. NOTE: Other documentation in this directory may be out of date and inaccurate.
* Ask for help on the [Zcash](https://forum.z.cash/) forums.
Building
--------
Build Zcash along with most dependencies from source by running ./zcutil/build.sh. Currently only Linux is supported.
License
---------------------
Distributed under the [MIT software license](http://www.opensource.org/licenses/mit-license.php).
This product includes software developed by the OpenSSL Project for use in the [OpenSSL Toolkit](https://www.openssl.org/). This product includes
cryptographic software written by Eric Young ([eay@cryptsoft.com](mailto:eay@cryptsoft.com)), and UPnP software written by Thomas Bernard.

View File

@@ -1,20 +0,0 @@
*** Warning: This document has not been updated for Zcash and may be inaccurate. ***
BIPs that are implemented by Bitcoin Core (up-to-date up to **v0.10.0**):
* [`BIP 11`](https://github.com/bitcoin/bips/blob/master/bip-0011.mediawiki): Multisig outputs are standard since **v0.6.0** ([PR #669](https://github.com/bitcoin/bitcoin/pull/669)).
* [`BIP 13`](https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki): The address format for P2SH addresses has been implemented since **v0.6.0** ([PR #669](https://github.com/bitcoin/bitcoin/pull/669)).
* [`BIP 14`](https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki): The subversion string is being used as User Agent since **v0.6.0** ([PR #669](https://github.com/bitcoin/bitcoin/pull/669)).
* [`BIP 16`](https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki): The pay-to-script-hash evaluation rules have been implemented since **v0.6.0**, and took effect on *April 1st 2012* ([PR #748](https://github.com/bitcoin/bitcoin/pull/748)).
* [`BIP 21`](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki): The URI format for Bitcoin payments has been implemented since **v0.6.0** ([PR #176](https://github.com/bitcoin/bitcoin/pull/176)).
* [`BIP 22`](https://github.com/bitcoin/bips/blob/master/bip-0022.mediawiki): The 'getblocktemplate' (GBT) RPC protocol for mining has been implemented since **v0.7.0** ([PR #936](https://github.com/bitcoin/bitcoin/pull/936)).
* [`BIP 23`](https://github.com/bitcoin/bips/blob/master/bip-0023.mediawiki): Some extensions to GBT have been implemented since **v0.10.0rc1**, including longpolling and block proposals ([PR #1816](https://github.com/bitcoin/bitcoin/pull/1816)).
* [`BIP 30`](https://github.com/bitcoin/bips/blob/master/bip-0030.mediawiki): The evaluation rules to forbid creating new transactions with the same txid as previous not-fully-spent transactions were implemented since **v0.6.0**, and the rule took effect on *March 15th 2012* ([PR #915](https://github.com/bitcoin/bitcoin/pull/915)).
* [`BIP 31`](https://github.com/bitcoin/bips/blob/master/bip-0031.mediawiki): The 'pong' protocol message (and the protocol version bump to 60001) has been implemented since **v0.6.1** ([PR #1081](https://github.com/bitcoin/bitcoin/pull/1081)).
* [`BIP 34`](https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki): The rule that requires blocks to contain their height (number) in the coinbase input, and the introduction of version 2 blocks has been implemented since **v0.7.0**. The rule took effect for version 2 blocks as of *block 224413* (March 5th 2013), and version 1 blocks are no longer allowed since *block 227931* (March 25th 2013) ([PR #1526](https://github.com/bitcoin/bitcoin/pull/1526)).
* [`BIP 35`](https://github.com/bitcoin/bips/blob/master/bip-0035.mediawiki): The 'mempool' protocol message (and the protocol version bump to 60002) has been implemented since **v0.7.0** ([PR #1641](https://github.com/bitcoin/bitcoin/pull/1641)).
* [`BIP 37`](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki): The bloom filtering for transaction relaying, partial merkle trees for blocks, and the protocol version bump to 70001 (enabling low-bandwidth SPV clients) has been implemented since **v0.8.0** ([PR #1795](https://github.com/bitcoin/bitcoin/pull/1795)).
* [`BIP 42`](https://github.com/bitcoin/bips/blob/master/bip-0042.mediawiki): The bug that would have caused the subsidy schedule to resume after block 13440000 was fixed in **v0.9.2** ([PR #3842](https://github.com/bitcoin/bitcoin/pull/3842)).
* [`BIP 61`](https://github.com/bitcoin/bips/blob/master/bip-0061.mediawiki): The 'reject' protocol message (and the protocol version bump to 70002) was added in **v0.9.0** ([PR #3185](https://github.com/bitcoin/bitcoin/pull/3185)).
* [`BIP 66`](https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki): The strict DER rules and associated version 3 blocks have been implemented since **v0.10.0** ([PR #5713](https://github.com/bitcoin/bitcoin/pull/5713)).
* [`BIP 70`](https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki) [`71`](https://github.com/bitcoin/bips/blob/master/bip-0071.mediawiki) [`72`](https://github.com/bitcoin/bips/blob/master/bip-0072.mediawiki): Payment Protocol support has been available in Bitcoin Core GUI since **v0.9.0** ([PR #5216](https://github.com/bitcoin/bitcoin/pull/5216)).

View File

@@ -1,5 +1,3 @@
*** Warning: This document has not been updated for Zcash and may be inaccurate. ***
Coding
====================
@@ -112,7 +110,7 @@ to see it.
**testnet and regtest modes**
Run with the -testnet option to run with "play bitcoins" on the test network, if you
Run with the -testnet option to run with "play zcash" on the test network, if you
are testing multi-machine code that needs to operate across the internet.
If you are testing something that can run on one machine, run with the -regtest option.
@@ -121,7 +119,7 @@ that run in -regtest mode.
**DEBUG_LOCKORDER**
Bitcoin Core is a multithreaded application, and deadlocks or other multithreading bugs
Zcash is a multithreaded application, and deadlocks or other multithreading bugs
can be very difficult to track down. Compiling with -DDEBUG_LOCKORDER (configure
CXXFLAGS="-DDEBUG_LOCKORDER -g") inserts run-time checks to keep track of which locks
are held, and adds warnings to the debug.log file if inconsistencies are detected.
@@ -170,7 +168,7 @@ Threads
- ThreadRPCServer : Remote procedure call handler, listens on port 8232 for connections and services them.
- BitcoinMiner : Generates bitcoins (if wallet is enabled).
- ZcashMiner : Generates zcash (if wallet is enabled).
- Shutdown : Does an orderly shutdown of everything.

View File

@@ -1,16 +1,14 @@
*** Warning: This document has not been updated for Zcash and may be inaccurate. ***
Expectations for DNS Seed operators
====================================
Bitcoin Core attempts to minimize the level of trust in DNS seeds,
Zcash attempts to minimize the level of trust in DNS seeds,
but DNS seeds still pose a small amount of risk for the network.
As such, DNS seeds must be run by entities which have some minimum
level of trust within the Bitcoin community.
level of trust within the Zcash community.
Other implementations of Bitcoin software may also use the same
Other implementations of Zcash software may also use the same
seeds and may be more exposed. In light of this exposure, this
document establishes some basic expectations for operating dnsseeds.
document establishes some basic expectations for operating DNS seeds.
0. A DNS seed operating organization or person is expected to follow good
host security practices, maintain control of applicable infrastructure,
@@ -18,17 +16,17 @@ and not sell or transfer control of the DNS seed. Any hosting services
contracted by the operator are equally expected to uphold these expectations.
1. The DNS seed results must consist exclusively of fairly selected and
functioning Bitcoin nodes from the public network to the best of the
functioning Zcash nodes from the public network to the best of the
operator's understanding and capability.
2. For the avoidance of doubt, the results may be randomized but must not
single-out any group of hosts to receive different results unless due to an
single out any group of hosts to receive different results unless due to an
urgent technical necessity and disclosed.
3. The results may not be served with a DNS TTL of less than one minute.
4. Any logging of DNS queries should be only that which is necessary
for the operation of the service or urgent health of the Bitcoin
for the operation of the service or urgent health of the Zcash
network and must not be retained longer than necessary nor disclosed
to any third party.
@@ -43,14 +41,14 @@ details of their operating practices.
7. A reachable email contact address must be published for inquiries
related to the DNS seed operation.
If these expectations cannot be satisfied the operator should
discontinue providing services and contact the active Bitcoin
Core development team as well as posting on
[bitcoin-dev](https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev).
If these expectations cannot be satisfied the operator should discontinue
providing services and contact the active Zcash development team as well as
creating an issue in the [Zcash repository](https://github.com/zcash/zcash).
Behavior outside of these expectations may be reasonable in some
situations but should be discussed in public in advance.
See also
----------
- [bitcoin-seeder](https://github.com/sipa/bitcoin-seeder) is a reference implementation of a DNS seed.
- [zcash-seeder](https://github.com/zcash/zcash-seeder) is a reference
implementation of a DNS seed.

View File

@@ -1,28 +1,12 @@
*** Warning: This document has not been updated for Zcash and may be inaccurate. ***
* bitcoin.conf: contains configuration settings for bitcoind or bitcoin-qt
* bitcoind.pid: stores the process id of bitcoind while running
* blocks/blk000??.dat: block data (custom, 128 MiB per file); since 0.8.0
* blocks/rev000??.dat; block undo data (custom); since 0.8.0 (format changed since pre-0.8)
* blocks/index/*; block index (LevelDB); since 0.8.0
* chainstate/*; block chain state database (LevelDB); since 0.8.0
* database/*: BDB database environment; only used for wallet since 0.8.0
* zcash.conf: contains configuration settings for zcashd
* zcashd.pid: stores the process id of zcashd while running
* blocks/blk000??.dat: block data (custom, 128 MiB per file)
* blocks/rev000??.dat; block undo data (custom)
* blocks/index/*; block index (LevelDB)
* chainstate/*; block chain state database (LevelDB)
* database/*: BDB database environment
* db.log: wallet database log file
* debug.log: contains debug information and general logging generated by bitcoind or bitcoin-qt
* fee_estimates.dat: stores statistics used to estimate minimum transaction fees and priorities required for confirmation; since 0.10.0
* peers.dat: peer IP address database (custom format); since 0.7.0
* debug.log: contains debug information and general logging generated by zcashd
* fee_estimates.dat: stores statistics used to estimate minimum transaction fees and priorities required for confirmation
* peers.dat: peer IP address database (custom format)
* wallet.dat: personal wallet (BDB) with keys and transactions
Only used in pre-0.8.0
---------------------
* blktree/*; block chain index (LevelDB); since pre-0.8, replaced by blocks/index/* in 0.8.0
* coins/*; unspent transaction output database (LevelDB); since pre-0.8, replaced by chainstate/* in 0.8.0
Only used before 0.8.0
---------------------
* blkindex.dat: block chain index database (BDB); replaced by {chainstate/*,blocks/index/*,blocks/rev000??.dat} in 0.8.0
* blk000?.dat: block data (custom, 2 GiB per file); replaced by blocks/blk000??.dat in 0.8.0
Only used before 0.7.0
---------------------
* addr.dat: peer IP address database (BDB); replaced by peers.dat in 0.7.0

View File

@@ -18,7 +18,7 @@ When a transfer involves zaddrs, you must use the new Zcash RPC calls.
Zcash supports all commands in the Bitcoin Core API (as of version 0.11.2). Where applicable, Zcash will extend commands in a backwards-compatible way to enable additional functionality.
We do not recommend use of accounts which are now deprecated in Bitcoin Core. Where the account parameter exists in the API, please use “” as its value.
We do not recommend use of accounts which are now deprecated in Bitcoin Core. Where the account parameter exists in the API, please use “” as its value, otherwise an error will be returned.
To support multiple users in a single nodes wallet, consider using getnewaddress or z_getnewaddress to obtain a new address for each user. Also consider mapping multiple addresses to each user.
@@ -61,7 +61,7 @@ z_listaddresses | | Returns a list of all the zaddrs in this nodes wallet for
Command | Parameters | Description
--- | --- | ---
z_exportkey | zaddr | _Requires an unlocked wallet or an unencrypted wallet._<br><br>Return a zkey for a given zaddr belonging to the nodes wallet.<br><br>The key will be returned as a string formatted using Base58Check as described in the Zcash protocol spec.<br><br>Output:AKWUAkypwQjhZ6LLNaMuuuLcmZ6gt5UFyo8m3jGutvALmwZKLdR5
z_importkey | zkey [rescan=true] | _Wallet must be unlocked._<br><br>Add a zkey as returned by z_exportkey to a node's wallet.<br><br>The key should be formatted using Base58Check as described in the Zcash protocol spec.<br><br>Set rescan to true (the default) to rescan the entire local block database for transactions affecting any address or pubkey script in the wallet (including transactions affecting the newly-added address for this spending key).<br><br>**NOTE:** If funds for imported keys fail to display, try stopping the node and restarting it with a `-reindex` flag. (`./src/zcashd -reindex`)
z_importkey | zkey [rescan=true] | _Wallet must be unlocked._<br><br>Add a zkey as returned by z_exportkey to a node's wallet.<br><br>The key should be formatted using Base58Check as described in the Zcash protocol spec.<br><br>Set rescan to true (the default) to rescan the entire local block database for transactions affecting any address or pubkey script in the wallet (including transactions affecting the newly-added address for this spending key).
z_exportwallet | filename | _Requires an unlocked wallet or an unencrypted wallet._<br><br>Creates or overwrites a file with taddr private keys and zaddr private keys in a human-readable format.<br><br>Filename is the file in which the wallet dump will be placed. May be prefaced by an absolute file path. An existing file with that name will be overwritten.<br><br>No value is returned but a JSON-RPC error will be reported if a failure occurred.
z_importwallet | filename | _Requires an unlocked wallet or an unencrypted wallet._<br><br>Imports private keys from a file in wallet export file format (see z_exportwallet). These keys will be added to the keys currently in the wallet. This call may need to rescan all or parts of the block chain for transactions affecting the newly-added keys, which may take several minutes.<br><br>Filename is the file to import. The path is relative to zcashds working directory.<br><br>No value is returned but a JSON-RPC error will be reported if a failure occurred.
@@ -70,7 +70,7 @@ z_importwallet | filename | _Requires an unlocked wallet or an unencrypted walle
Command | Parameters | Description
--- | --- | ---
z_listreceivedbyaddress<br> | zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the nodes wallet.<br><br>Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.<br><br>Output:<br>[{<br>“txid”: “4a0f…”,<br>“amount”: 0.54,<br>“memo”:”F0FF…”,}, {...}, {...}<br>]
z_sendmany<br> | fromaddress amounts [minconf=1] | _This is an Asynchronous RPC call_<br><br>Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.<br><br>Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.<br><br>When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.<br><br>Example of Outputs parameter:<br>[{“address”:”t123…”, “amount”:0.005},<br>,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]<br><br>Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.<br><br>The transaction fee will be determined by the nodes wallet. Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.<br><br>Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid.
z_sendmany<br> | fromaddress amounts [minconf=1] | _This is an Asynchronous RPC call_<br><br>Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.<br><br>Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.<br><br>When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.<br><br>**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.<br><br>Example of Outputs parameter:<br>[{“address”:”t123…”, “amount”:0.005},<br>,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]<br><br>Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.<br><br>The transaction fee will be determined by the nodes wallet. Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.<br><br>Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid.
### Operations

View File

@@ -0,0 +1,121 @@
4ZEC (1):
Correct line swap
Cory Fields (7):
release: add _IO_stdin_used to ignored exports
release: add check-symbols and check-security make targets
release: always link librt for glibc back-compat builds
release: add security/symbol checks to gitian
depends: allow for CONFIG_SITE to be used rather than stealing prefix
gitian: use CONFIG_SITE rather than hijacking the prefix
gitian: create debug packages for linux/windows
Daira Hopwood (6):
Fix RPC tests to not rely on accounts.
Cosmetics in RPC tests.
Fix blank lines in DEBIAN/copyright license texts.
Move the increment of nWitnessCacheSize to make the later assertions correct.
Add another assertion to narrow down where the bug occurs.
Add another assertion about the witness cache.
Jack Grigg (25):
Update release process to sign release tags
WriteWitnessCache: Catch errors and abort transaction
Throw an RPC error for all accounts except the default
Update tests for account deprecation
Deprecated -> Unsupported in RPC error
Correct docstring
Add unit tests for WriteWitnessCache
Document CWalletTx::FindMyNotes
Refactor test to clarify expectations
Add unit test that fails when calling FindMyNotes on a locked wallet
Add RPC test showing correct handling of JS txns from blockchain
Break the RPC test by encrypting the mirroring wallet
Delay caching of nullifiers when wallet is locked
Update comments
Only ignore runtime errors caused by failed note decryption
Remaining changes from bitcoin/bitcoin#6854
[gitian] Don't call "make check-symbols"
Fix Makefiles so "make dist" will run
Render full version correctly in configure.ac
Update libsnark to include determinism fix
Address review comments
Add more asserts to track down the bug
Increment witnesses for new transactions on rescan
Add clear error message for upgrading users
Set CBlockIndex.hashAnchor correctly in ConnectBlock
Jay Graber (17):
Document wallet reindexing for z_importkey description in payment-api.md
Rm beta 1 release note about encrypted wallets
Note that Coinbase maturity interval does not protect JoinSplits
Refer to Zcash wiki in INSTALL
Rm bitcoin logo
Rm build-unix.md, to keep single copy of build instructions for Zcash on github wiki
Rm Bitcoin-specific documentation
Add note that document is not updated for Zcash to translation policy
Rm doc for disabled REST interface
Change alpha to beta testnet, add zcash hidden service
Improve documentation on connecting to zcash hidden server
Improve documentation on connecting to zcash hidden server
Update tor.md
Distinguish between connecting to 1 vs multiple tor nodes
Revert "Rm Bitcoin-specific documentation"
Mv btc release notes to doc/bitcoin-release-notes
Reword joinsplit anchor paragraph
Kevin Gallagher (24):
Set wget retry options for fetching parameters
Increases timeout to 30s, wait before retry to 3s
Initial packaging for Debian
Moves zcash-fetch-params to /usr/bin
Adds newline between source and package definition
Adds copyright file back to Debian package
Updates Linux gitian descriptor file for Zcash
Updates trusty -> jessie in Gitian Linux descriptor
Adds distro: debian to gitian-linux.yml
Updates Gitian descriptor for Zcash
Removes Windows and OSX packaging from EXTRA_DIST
Moves V=1 and NO_QT=1 to MAKEOPTS
Include contrib/devtools/split-debug.sh from upstream
Adds faketime to Gitian build dependencies
Inlude crypto/equihash.tcc in list of sources for dist
Adds zcash/Zcash.h to LIBZCASH sources
Adds zcash/Proof.hpp to LIBZCASH_H
Add alertkeys.h to libbitcoin_server_a_SOURCES
Adds files in src/zcash/circuit to libzcash_a_SOURCES
Adds zcbenchmarks.h to libbitcoin_wallet_a_SOURCES
Adds json_test_vectors.h to zcash_gtest_SOURCES
Adds additional licenses to Debian copyright file
Updates Zcash Core developers -> Zcash developers
Adds . to blank lines in Google license
MarcoFalke (3):
[gitian] Set reference date to something more recent
[gitian] Default reference_datetime to commit author date
[gitian] hardcode datetime for depends
Sean Bowe (1):
Make 100KB transaction size limit a consensus rule, rather than a standard rule.
Simon (11):
Add vjoinsplit to JSON output of RPC call gettransaction
Fixes #1478 by ensuring wallet tests have the -datadir environment set appropriately.
Fixes #1491 by updating help message for rpc call z_importkey
Fix incorrect check of number of parameters for z_getnewaddress.
Add tests to verify that all z_* rpc calls return an error if there are too many input parameters.
Rename client identifier from Satoshi to MagicBean (closes #1481)
Use -debug=zrpc for z_* rpc calls (#1504)
Document CWallet::GetFilteredNotes and fix return type which should be void.
Fix test so that the encrypted wallet is output to the test_bitcoin -datadir folder.
Reorder gtests in zcash-gtest.
Return improved error message when trying to spend Coinbase coins (#1373).
Wladimir J. van der Laan (6):
devtools: add libraries for bitcoin-qt to symbol check
gitian: use trusty for building
gitian: make windows build deterministic
gitian: Need `ca-certificates` and `python` for LXC builds
build: Remove unnecessary executables from gitian release
gitian: Add --disable-bench to config flags for windows

View File

@@ -0,0 +1,106 @@
Daira Hopwood (22):
Add link to protocol specification.
Add tests for IsStandardTx applied to v2 transactions.
Make v2 transactions standard. This also corrects a rule about admitting large orphan transactions into the mempool, to account for v2-specific fields.
Changes to build on Alpine Linux.
Add Tromp's implementation of Equihash solver (as of tromp/equihash commit 690fc5eff453bc0c1ec66b283395c9df87701e93).
Integrate Tromp solver into miner code and remove its dependency on extra BLAKE2b implementation.
Minor edits to dnsseed-policy.md.
Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459
Add help for -equihashsolver= option.
Assert that the Equihash solver is a supported option.
Repair check-security-hardening.sh.
Revert "Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459"
Fix race condition in rpc-tests/wallet_protectcoinbase.py. closes #1597
Fix other potential race conditions similar to ref #1597 in RPC tests.
Update the error message string for tx version too low. ref #1600
Static assertion that standard and network min tx versions are consistent.
Update comments in chainparams.cpp.
Update unit-tests documentation. closes #1530
Address @str4d's comments on unit-tests doc. ref #1530
Remove copyright entries for some files we deleted.
Update license text in README.md. closes #38
Bump version numbers to 1.0.0-rc2.
David Mercer (4):
explicitly pass HOST and BUILD to ./configure
allow both HOST and BUILD to be passed in from the zcutil/build.sh
pass in both HOST and BUILD to depends system, needed for deterministic builds
explicitly pass HOST and BUILD to libgmp ./configure
Gregory Maxwell (1):
Only send one GetAddr response per connection.
Jack Grigg (31):
Implement MappedShuffle for tracking the permutation of an array
Implement static method for creating a randomized JSDescription
Randomize JoinSplits in z_sendmany
Refactor test code to better test JSDescription::Randomized()
Remove stale comment
Rename libbitcoinconsensus to libzcashconsensus
Rename bitcoin-tx to zcash-tx
Remove the RC 1 block index error message
Disable wallet encryption
Add more assertions, throw if find_output params are invalid
Clear witness cache when re-witnessing notes
Add heights to log output
Throw an error when encryptwallet is disabled
Document that wallet encryption is disabled
Document another wallet encryption concern
Improve security documentation
Fix RPC tests that require wallet encryption
Add test that encryptwallet is disabled
Revert "Revert "Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459""
GBT: Support coinbasetxn instead of coinbasevalue
GBT: Add informational founders' reward value to coinbasetxn
GBT: Correct block header in proposals RPC test
GBT: Add RPC tests
Disallow v0 transactions as a consensus rule
Reject block versions lower than 4
Regenerate genesis blocks with nVersion = 4
Use tromp's solver to regenerate miner tests
Update tests for new genesis blocks
Enforce standard transaction rules on testnet
Update sighash tests for new consensus rule
Fix RPC test
Jay Graber (7):
Rm bitcoin dev keys from gitian-downloader, add zcash dev keys
Rm bips.md
Update files.md for zcash
Update dnsseed-policy.md
Developer notes still relevant
Document RPC interface security assumptions in security-warnings.md
Update RPC interfaces warnings language
Patrick Strateman (1):
CDataStream::ignore Throw exception instead of assert on negative nSize.
Pieter Wuille (4):
Introduce constant for maximum CScript length
Treat overly long scriptPubKeys as unspendable
Fix OOM bug: UTXO entries with invalid script length
Add tests for CCoins deserialization
Simon (17):
Fixes CID 1147436 uninitialized scalar field.
Fixes CID 1352706 uninitialized scalar field.
Fixes CID 1352698 uninitialized scalar field.
Fixes CID 1352687 uninitialized scalar field.
Fixes CID 1352715 uninitialized scalar field.
Fixes CID 1352686 uninitialized scalar variable.
Fixes CID 1352599 unitialized scalar variable
Fixes CID 1352727 uninitialized scalar variable.
Fixes CID 1352714 uninitialized scalar variable.
Add security warning about logging of z_* calls.
Add debug option "zrpcunsafe" to be used when logging more sensitive information such as the memo field of a note.
Closes #1583 by setting up the datadir for the wallet gtest.
Fix issue where z_sendmany is too strict and does not allow integer based amount e.g. 1 which is the same as 1.0
Update test to use integer amount as well as decimal amount when calling z_sendmany
Fix build problem with coins_tests
Workaround g++ 5.x bug with brace enclosed initializer.
Patch backport of upstream 1588 as we don't (yet) use the NetMsgType namespace
Wladimir J. van der Laan (1):
net: Ignore `notfound` P2P messages

View File

@@ -0,0 +1,51 @@
Chirag Davé (1):
fReopenDebugLog and fRequestShutdown should be type sig_atomic_t
Daira Hopwood (9):
Refactor README docs to avoid duplication.
Fix licensing to comply with OpenSSL and Berkeley DB licenses.
Changes to upgrade bdb to 6.2.23
util: Update tinyformat
Tweak descriptions of mining parameters for example zcash.conf.
Update dnsseeds for mainnet. closes #1369
Minor update to release process.
Remove the override of nMaxTipAge that effectively disables it on testnet.
Update version numbers for rc3.
Jack Grigg (2):
Disable metrics screen in performance-measurements.sh
Link to #826 in doc/security-warnings.md, link to new Security website page
Joe Turgeon (2):
Fixing floating point exception caused by metrics. Using default column width unless in a TTY.
Adding handling for ioctl failure. Updates from code review in PR #1615.
Kevin Gallagher (2):
Prefer sha256sum but fall back to shasum if not available
Adds libgomp1 to Debian package depends
Louis Nyffenegger (1):
Fix typo in README.md
Paige Peterson (3):
add zcash.config
fix per Jack's mod suggestions
fix per Daira's suggestions
Pieter Wuille (3):
Include signal.h for sig_atomic_t in WIN32
Revert "Include signal.h for sig_atomic_t in WIN32"
Use std::atomic for fRequestShutdown and fReopenDebugLog
Sean Bowe (1):
Add manpages for zcashd and zcash-cli binaries for debian.
Simon (4):
Fix incorrect error message in z_sendmany
Add z_sendmany rule that when sending coinbase utxos to a zaddr they must be consumed entirely, without any change, since there is currently no way to specify a change address in z_sendmany.
Add assert to AsyncRPCOperation_sendmany
Bump version number in sendalert.cpp
bitcartel (1):
Update payment-api.md

View File

@@ -0,0 +1,14 @@
Daira Hopwood (3):
Update pchMessageStart for mainnet and testnet.
Update version numbers for 1.0.0-rc4.
Add release notes for 1.0.0-rc4.
Jack Grigg (4):
Integrate production Founders' Reward keys
Remove Founders' Reward override from #1398
Regenerate mainnet and testnet genesis blocks for nMaxTipAge change
Update tests for new genesis blocks
Sean Bowe (1):
Zcash zk-SNARK public parameters for 1.0 "Sprout".

View File

@@ -0,0 +1,18 @@
Jack Grigg (8):
Rework zcutil/build-debian-package.sh to place files correctly
Add lintian check to zcutil/build-debian-package.sh
Fix DEBIAN/control errors raised by lintian
Build libsnark with -march=x86-64 instead of -march=native
Disable the metrics screen on regtest
Add the Zcash genesis blocks
Update tests for new genesis blocks
Update version strings to 1.0.0
Kevin Gallagher (6):
Use fakeroot to build Debian package
Update Debian package maintainer scripts
Fixes executable mode of maintainer scripts
Add DEBIAN/rules file (required by policy)
Adds zcash.examples and zcash.manpages
Run Lintian after built package is copied to $SRC_PATH

View File

@@ -29,15 +29,18 @@ previous release:
$ ZCASH_RELEASE_PREV=1.0.0-beta1
## B. create a new release branch / github PR
### B1. update (commit) version in sources
## B. Create a new release branch / github PR
### B1. Update (commit) version in sources
doc/README.md
README.md
src/clientversion.h
configure.ac
contrib/DEBIAN/control
contrib/gitian-descriptors/gitian-linux.yml
help2man -n "RPC client for the Zcash daemon" src/zcash-cli > contrib/DEBIAN/manpages/zcash-cli.1
help2man -n "Network daemon for interacting with the Zcash blockchain" src/zcashd > contrib/DEBIAN/manpages/zcashd.1
In `configure.ac` and `clientversion.h`:
@@ -52,7 +55,7 @@ In `configure.ac` and `clientversion.h`:
- Change `CLIENT_VERSION_IS_RELEASE` to false while Zcash is in beta-test phase.
### B2. write release notes
### B2. Write release notes
git shortlog helps a lot, for example:
@@ -61,19 +64,21 @@ git shortlog helps a lot, for example:
Update the Debian package changelog:
export DEBVERSION='1.0.0-rc1'
export DEBVERSION="${ZCASH_RELEASE}"
export DEBEMAIL="${DEBEMAIL:-team@z.cash}"
export DEBFULLNAME="${DEBFULLNAME:-Zcash Company}"
dch -v $DEBVERSION -D jessie -c contrib/DEBIAN/changelog
### B3. change the network magics
(`dch` comes from the devscripts package.)
### B3. Change the network magics
If this release breaks backwards compatibility, change the network magic
numbers. Set the four `pchMessageStart` in `CTestNetParams` in `chainparams.cpp`
to random values.
### B4. merge the previous changes
### B4. Merge the previous changes
Do the normal pull-request, review, testing process for this release PR.
@@ -87,7 +92,7 @@ https://ci.z.cash/builders/depends-sources
Run `./fetch-params.sh`.
## D. make tag for the newly merged result
## D. Make tag for the newly merged result
In this example, we ensure master is up to date with the
previous merged PR, then:
@@ -95,7 +100,7 @@ previous merged PR, then:
$ git tag -s v${ZCASH_RELEASE}
$ git push origin v${ZCASH_RELEASE}
## E. deploy testnet
## E. Deploy testnet
Notify the Zcash DevOps engineer/sysadmin that the release has been tagged. They update some variables in the company's automation code and then run an Ansible playbook, which:
@@ -106,15 +111,20 @@ Notify the Zcash DevOps engineer/sysadmin that the release has been tagged. They
Then, verify that nodes can connect to the testnet server, and update the guide on the wiki to ensure the correct hostname is listed in the recommended zcash.conf.
## F. publish the release announcement (blog, zcash-dev, slack)
## G. celebrate
## F. Update the Beta Guide
## G. Publish the release announcement (blog, zcash-dev, slack)
## H. Make and deploy deterministic builds
- Run the [Gitian deterministic build environment](https://github.com/zcash/zcash-gitian)
- Compare the uploaded [build manifests on gitian.sigs](https://github.com/zcash/gitian.sigs)
- If all is well, the DevOps engineer will build the Debian packages and update the
[apt.z.cash package repository](https://apt.z.cash).
## I. Celebrate
## missing steps
Zcash still needs:
* deterministic or reproducible builds
* thorough pre-release testing (presumably more thorough than standard PR tests)
* release deployment steps (eg: updating build-depends mirror, deploying testnet, etc...)
* proper Zcash-specific versions and names in software and documentation.
* automated release deployment (e.g.: updating build-depends mirror, deploying testnet, etc...)

View File

@@ -4,7 +4,9 @@ Security Warnings
Security Audit
--------------
Zcash has been subjected to a formal third-party security review. For high priority security announcements, check https://z.cash.
Zcash has been subjected to a formal third-party security review. For security
announcements, audit results and other general security information, see
https://z.cash/support/security.html
x86-64 Linux Only
-----------------------
@@ -14,6 +16,34 @@ make proving keys generated on 64-bit systems unusable on 32-bit and big-endian
systems. It's unclear if a warning will be issued in this case, or if the
proving system will be silently compromised.
Wallet Encryption
-----------------
Wallet encryption is disabled, for several reasons:
- Encrypted wallets are unable to correctly detect shielded spends (due to the
nature of unlinkability of JoinSplits) and can incorrectly show larger
available shielded balances until the next time the wallet is unlocked. This
problem was not limited to failing to recognize the spend; it was possible for
the shown balance to increase by the amount of change from a spend, without
deducting the spent amount.
- While encrypted wallets prevent spending of funds, they do not maintain the
shielding properties of JoinSplits (due to the need to detect spends). That
is, someone with access to an encrypted wallet.dat has full visibility of
your entire transaction graph (other than newly-detected spends, which suffer
from the earlier issue).
- We were concerned about the resistance of the algorithm used to derive wallet
encryption keys (inherited from Bitcoin) to dictionary attacks by a powerful
attacker. If and when we re-enable wallet encryption, it is likely to be with
a modern passphrase-based key derivation algorithm designed for greater
resistance to dictionary attack, such as Argon2i.
You should use full-disk encryption (or encryption of your home directory) to
protect your wallet at rest, and should assume (even unprivileged) users who are
runnng on your OS can read your wallet.dat file.
Side-Channel Attacks
--------------------
@@ -44,9 +74,37 @@ The REST interface is a feature inherited from upstream Bitcoin. By default,
it is disabled. We do not recommend you enable it until it has undergone a
security review.
RPC Interface
---------------
Users should choose a strong RPC password. If no RPC username and password are set, zcashd will not start and will print an error message with a suggestion for a strong random password. If the client knows the RPC password, they have at least full access to the node. In addition, certain RPC commands can be misused to overwrite files and/or take over the account that is running zcashd. (In the future we may restrict these commands, but full node access including the ability to spend from and export keys held by the wallet would still be possible unless wallet methods are disabled.)
Users should also refrain from changing the default setting that only allows RPC connections from localhost. Allowing connections from remote hosts would enable a MITM to execute arbitrary RPC commands, which could lead to compromise of the account running zcashd and loss of funds. For multi-user services that use one or more zcashd instances on the backend, the parameters passed in by users should be controlled to prevent confused-deputy attacks which could spend from any keys held by that zcashd.
Block Chain Reorganization: Major Differences
---------------------------------------------------
-------------------------------------------------
Users should be aware of new behavior in Zcash that differs significantly from Bitcoin: in the case of a block chain reorganization, Bitcoin's coinbase maturity rule helps to ensure that any reorganization shorter than the maturity interval will not invalidate any of the rolled-back transactions. Zcash keeps Bitcoin's 100-block maturity interval for generation transactions, but because JoinSplits must be anchored within a block, this provides more limited protection against transactions becoming invalidated. In the case of a block chain reorganization for Zcash, all JoinSplits which were anchored within the reorganization interval and any transactions that depend on them will become invalid, rolling back transactions and reverting funds to the original owner. The transaction rebroadcast mechanism inherited from Bitcoin will not successfully rebroadcast transactions depending on invalidated JoinSplits if the anchor needs to change. The creator of an invalidated JoinSplit, as well as the creators of all transactions dependent on it, must rebroadcast the transactions themselves.
Receivers of funds from a JoinSplit can mitigate the risk of relying on funds received from transactions that may be rolled back by using a higher minconf (minimum number of confirmations).
Logging z_* RPC calls
---------------------
The option `-debug=zrpc` covers logging of the z_* calls. This will reveal information about private notes which you might prefer not to disclose. For example, when calling `z_sendmany` to create a shielded transaction, input notes are consumed and new output notes are created.
The option `-debug=zrpcunsafe` covers logging of sensitive information in z_* calls which you would only need for debugging and audit purposes. For example, if you want to examine the memo field of a note being spent.
Private spending keys for z addresses are never logged.
Potentially-Missing Required Modifications
------------------------------------------
In addition to potential mistakes in code we added to Bitcoin Core, and
potential mistakes in our modifications to Bitcoin Core, it is also possible
that there were potential changes we were supposed to make to Bitcoin Core but
didn't, either because we didn't even consider making those changes, or we ran
out of time. We have brainstormed and documented a variety of such possibilities
in [issue #826](https://github.com/zcash/zcash/issues/826), and believe that we
have changed or done everything that was necessary for the 1.0.0 launch. Users
may want to review this list themselves.

View File

@@ -1,20 +1,17 @@
*** Warning: This document has not been updated for Zcash and may be inaccurate. ***
Compiling/running automated tests
---------------------------------
Compiling/running unit tests
------------------------------------
Unit tests will be automatically compiled if dependencies were met in configure
Automated tests will be automatically compiled if dependencies were met in configure
and tests weren't explicitly disabled.
After configuring, they can be run with 'make check'.
There are two scripts for running tests:
To run the bitcoind tests manually, launch src/test/test_bitcoin .
* ``qa/zcash/full-test-suite.sh``, to run the main test suite
* ``qa/pull-tester/rpc-tests.sh``, to run the RPC tests.
To add more bitcoind tests, add `BOOST_AUTO_TEST_CASE` functions to the existing
.cpp files in the test/ directory or add new .cpp files that
implement new BOOST_AUTO_TEST_SUITE sections.
The main test suite uses two different testing frameworks. Tests using the Boost
framework are under ``src/test/``; tests using the Google Test/Google Mock
framework are under ``src/gtest/`` and ``src/wallet/gtest/``. The latter framework
is preferred for new Zcash unit tests.
To run the bitcoin-qt tests manually, launch src/qt/test/test_bitcoin-qt
To add more bitcoin-qt tests, add them to the `src/qt/test/` directory and
the `src/qt/test/test_main.cpp` file.
RPC tests are implemented in Python under the ``qa/rpc-tests/`` directory.

View File

@@ -3,9 +3,9 @@ exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: Bitcoin Core consensus library
Description: Library for the Bitcoin consensus protocol.
Name: Zcash consensus library
Description: Library for the Zcash consensus protocol.
Version: @PACKAGE_VERSION@
Libs: -L${libdir} -lbitcoinconsensus
Libs: -L${libdir} -lzcashconsensus
Cflags: -I${includedir}
Requires.private: libcrypto

View File

@@ -31,6 +31,7 @@ testScripts=(
'walletbackup.py'
'zcjoinsplit.py'
'zcjoinsplitdoublespend.py'
'getblocktemplate.py'
);
testScriptsExt=(
'bipdersig-p2p.py'

View File

@@ -0,0 +1,58 @@
#!/usr/bin/env python2
# Copyright (c) 2016 The Zcash developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import *
class GetBlockTemplateTest(BitcoinTestFramework):
'''
Test getblocktemplate.
'''
def setup_chain(self):
print("Initializing test directory "+self.options.tmpdir)
initialize_chain_clean(self.options.tmpdir, 4)
def setup_network(self, split=False):
self.nodes = start_nodes(2, self.options.tmpdir)
connect_nodes_bi(self.nodes,0,1)
self.is_network_split=False
self.sync_all()
def run_test(self):
node = self.nodes[0]
node.generate(1) # Mine a block to leave initial block download
# Test 1: Default to coinbasetxn
tmpl = node.getblocktemplate()
assert('coinbasetxn' in tmpl)
assert('coinbasevalue' not in tmpl)
# Test 2: Get coinbasetxn if requested
tmpl = node.getblocktemplate({'capabilities': ['coinbasetxn']})
assert('coinbasetxn' in tmpl)
assert('coinbasevalue' not in tmpl)
# Test 3: coinbasevalue not supported if requested
tmpl = node.getblocktemplate({'capabilities': ['coinbasevalue']})
assert('coinbasetxn' in tmpl)
assert('coinbasevalue' not in tmpl)
# Test 4: coinbasevalue not supported if both requested
tmpl = node.getblocktemplate({'capabilities': ['coinbasetxn', 'coinbasevalue']})
assert('coinbasetxn' in tmpl)
assert('coinbasevalue' not in tmpl)
# Test 5: General checks
tmpl = node.getblocktemplate()
assert(len(tmpl['noncerange']) == 16)
# Test 6: coinbasetxn checks
assert('foundersreward' in tmpl['coinbasetxn'])
assert(tmpl['coinbasetxn']['required'])
if __name__ == '__main__':
GetBlockTemplateTest().main()

View File

@@ -71,9 +71,11 @@ def genmrklroot(leaflist):
def template_to_bytes(tmpl, txlist):
blkver = pack('<L', tmpl['version'])
mrklroot = genmrklroot(list(dblsha(a) for a in txlist))
reserved = b'\0'*32
timestamp = pack('<L', tmpl['curtime'])
nonce = b'\0\0\0\0'
blk = blkver + a2b_hex(tmpl['previousblockhash'])[::-1] + mrklroot + timestamp + a2b_hex(tmpl['bits'])[::-1] + nonce
nonce = b'\0'*32
soln = b'\0'
blk = blkver + a2b_hex(tmpl['previousblockhash'])[::-1] + mrklroot + reserved + timestamp + a2b_hex(tmpl['bits'])[::-1] + nonce + soln
blk += varlenEncode(len(txlist))
for tx in txlist:
blk += tx

View File

@@ -98,7 +98,7 @@ def main():
os.makedirs(options.tmpdir)
initialize_chain(options.tmpdir)
nodes = start_nodes(1, options.tmpdir)
nodes = start_nodes(1, options.tmpdir, extra_args=[['-developerencryptwallet']])
run_test(nodes, options.tmpdir)

View File

@@ -65,6 +65,7 @@ def initialize_datadir(dirname, n):
os.makedirs(datadir)
with open(os.path.join(datadir, "zcash.conf"), 'w') as f:
f.write("regtest=1\n");
f.write("showmetrics=0\n");
f.write("rpcuser=rt\n");
f.write("rpcpassword=rt\n");
f.write("port="+str(p2p_port(n))+"\n");

View File

@@ -51,6 +51,7 @@ class WalletTest (BitcoinTestFramework):
assert_equal(walletinfo['immature_balance'], 0)
# Have node0 mine a block, thus it will collect its own fee.
self.sync_all()
self.nodes[0].generate(1)
self.sync_all()
@@ -87,6 +88,7 @@ class WalletTest (BitcoinTestFramework):
self.nodes[1].sendrawtransaction(txns_to_send[2]["hex"], True)
# Have node1 mine a block to confirm transactions:
self.sync_all()
self.nodes[1].generate(1)
self.sync_all()
@@ -99,6 +101,7 @@ class WalletTest (BitcoinTestFramework):
address = self.nodes[0].getnewaddress("")
self.nodes[2].settxfee(Decimal('0.001'))
txid = self.nodes[2].sendtoaddress(address, 10, "", "", False)
self.sync_all()
self.nodes[2].generate(1)
self.sync_all()
assert_equal(self.nodes[2].getbalance(), Decimal('39.99900000'))
@@ -108,6 +111,7 @@ class WalletTest (BitcoinTestFramework):
# Send 10 BTC with subtract fee from amount
txid = self.nodes[2].sendtoaddress(address, 10, "", "", True)
self.sync_all()
self.nodes[2].generate(1)
self.sync_all()
assert_equal(self.nodes[2].getbalance(), Decimal('29.99900000'))
@@ -117,6 +121,7 @@ class WalletTest (BitcoinTestFramework):
# Sendmany 10 BTC
txid = self.nodes[2].sendmany("", {address: 10}, 0, "", [])
self.sync_all()
self.nodes[2].generate(1)
self.sync_all()
assert_equal(self.nodes[2].getbalance(), Decimal('19.99800000'))
@@ -126,6 +131,7 @@ class WalletTest (BitcoinTestFramework):
# Sendmany 10 BTC with subtract fee from amount
txid = self.nodes[2].sendmany("", {address: 10}, 0, "", [address])
self.sync_all()
self.nodes[2].generate(1)
self.sync_all()
assert_equal(self.nodes[2].getbalance(), Decimal('9.99800000'))
@@ -190,6 +196,7 @@ class WalletTest (BitcoinTestFramework):
txIdNotBroadcasted = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 2);
txObjNotBroadcasted = self.nodes[0].gettransaction(txIdNotBroadcasted)
self.sync_all()
self.nodes[1].generate(1) #mine a block, tx should not be in there
self.sync_all()
assert_equal(self.nodes[2].getbalance(), Decimal('9.99800000')); #should not be changed because tx was not broadcasted
@@ -197,6 +204,7 @@ class WalletTest (BitcoinTestFramework):
#now broadcast from another node, mine a block, sync, and check the balance
self.nodes[1].sendrawtransaction(txObjNotBroadcasted['hex'])
self.sync_all()
self.nodes[1].generate(1)
self.sync_all()
txObjNotBroadcasted = self.nodes[0].gettransaction(txIdNotBroadcasted)
@@ -225,6 +233,7 @@ class WalletTest (BitcoinTestFramework):
# send from node 0 to node 2 taddr
mytaddr = self.nodes[2].getnewaddress();
mytxid = self.nodes[0].sendtoaddress(mytaddr, 10.0);
self.sync_all()
self.nodes[0].generate(1)
self.sync_all()
@@ -240,7 +249,7 @@ class WalletTest (BitcoinTestFramework):
# send node 2 taddr to zaddr
recipients = []
recipients.append({"address":myzaddr, "amount":7.0})
recipients.append({"address":myzaddr, "amount":7})
myopid = self.nodes[2].z_sendmany(mytaddr, recipients)
opids = []
@@ -258,6 +267,7 @@ class WalletTest (BitcoinTestFramework):
break
assert_equal("success", status)
self.sync_all()
self.nodes[2].generate(1)
self.sync_all()
@@ -288,7 +298,7 @@ class WalletTest (BitcoinTestFramework):
node2balance = self.nodes[2].getbalance() # 16.99790000
recipients = []
recipients.append({"address":self.nodes[0].getnewaddress(), "amount":1.0})
recipients.append({"address":self.nodes[0].getnewaddress(), "amount":1})
recipients.append({"address":self.nodes[2].getnewaddress(), "amount":1.0})
myopid = self.nodes[2].z_sendmany(myzaddr, recipients)
@@ -304,6 +314,7 @@ class WalletTest (BitcoinTestFramework):
break
assert_equal("success", status)
self.sync_all()
self.nodes[2].generate(1)
self.sync_all()

View File

@@ -10,6 +10,10 @@ from time import *
class WalletNullifiersTest (BitcoinTestFramework):
def setup_nodes(self):
return start_nodes(4, self.options.tmpdir,
extra_args=[['-developerencryptwallet']] * 4)
def run_test (self):
# add zaddr to node 0
myzaddr0 = self.nodes[0].z_getnewaddress()
@@ -17,7 +21,7 @@ class WalletNullifiersTest (BitcoinTestFramework):
# send node 0 taddr to zaddr to get out of coinbase
mytaddr = self.nodes[0].getnewaddress();
recipients = []
recipients.append({"address":myzaddr0, "amount":10.0})
recipients.append({"address":myzaddr0, "amount":Decimal('10.0')-Decimal('0.0001')}) # utxo amount less fee
myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
opids = []
@@ -35,6 +39,7 @@ class WalletNullifiersTest (BitcoinTestFramework):
mytxid = results[0]["result"]["txid"]
break
self.sync_all()
self.nodes[0].generate(1)
self.sync_all()
@@ -75,6 +80,7 @@ class WalletNullifiersTest (BitcoinTestFramework):
mytxid = results[0]["result"]["txid"]
break
self.sync_all()
self.nodes[0].generate(1)
self.sync_all()
@@ -106,6 +112,7 @@ class WalletNullifiersTest (BitcoinTestFramework):
mytxid = results[0]["result"]["txid"]
break
self.sync_all()
self.nodes[2].generate(1)
self.sync_all()
@@ -146,6 +153,7 @@ class WalletNullifiersTest (BitcoinTestFramework):
mytxid = results[0]["result"]["txid"]
break
self.sync_all()
self.nodes[1].generate(1)
self.sync_all()

View File

@@ -60,32 +60,57 @@ class Wallet2Test (BitcoinTestFramework):
# coinbase utxos can only be sent to a zaddr.
errorString = ""
try:
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 1.0)
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 1)
except JSONRPCException,e:
errorString = e.error['message']
assert_equal("Coinbase funds can only be sent to a zaddr" in errorString, True)
# send node 0 taddr to node 0 zaddr
# Prepare to send taddr->zaddr
mytaddr = self.nodes[0].getnewaddress()
myzaddr = self.nodes[0].z_getnewaddress()
# This send will fail because our wallet does not allow any change when protecting a coinbase utxo,
# as it's currently not possible to specify a change address in z_sendmany.
recipients = []
recipients.append({"address":myzaddr, "amount":20.0})
recipients.append({"address":myzaddr, "amount":Decimal('1.23456789')})
errorString = ""
myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
opids = []
opids.append(myopid)
timeout = 10
status = None
for x in xrange(1, timeout):
results = self.nodes[0].z_getoperationresult(opids)
if len(results)==0:
sleep(1)
else:
status = results[0]["status"]
errorString = results[0]["error"]["message"]
break
assert_equal("failed", status)
assert_equal("wallet does not allow any change" in errorString, True)
# This send will succeed. We send two coinbase utxos totalling 20.0 less a fee of 0.00010000, with no change.
recipients = []
recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')})
myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
self.wait_for_operationd_success(myopid)
self.sync_all()
self.nodes[1].generate(1)
self.sync_all()
# check balances (the z_sendmany consumes 3 coinbase utxos)
resp = self.nodes[0].z_gettotalbalance()
assert_equal(Decimal(resp["transparent"]), Decimal('10.0'))
assert_equal(Decimal(resp["private"]), Decimal('29.9999'))
assert_equal(Decimal(resp["transparent"]), Decimal('20.0'))
assert_equal(Decimal(resp["private"]), Decimal('19.9999'))
assert_equal(Decimal(resp["total"]), Decimal('39.9999'))
# convert note to transparent funds
recipients = []
recipients.append({"address":mytaddr, "amount":20.0})
recipients.append({"address":mytaddr, "amount":Decimal('10.0')})
myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
self.wait_for_operationd_success(myopid)
self.sync_all()
self.nodes[1].generate(1)
self.sync_all()
@@ -98,29 +123,30 @@ class Wallet2Test (BitcoinTestFramework):
# Send will fail because send amount is too big, even when including coinbase utxos
errorString = ""
try:
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 99999.0)
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 99999)
except JSONRPCException,e:
errorString = e.error['message']
assert_equal("Insufficient funds" in errorString, True)
# Send will fail because of insufficient funds unless sender uses coinbase utxos
try:
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 21.0)
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 21)
except JSONRPCException,e:
errorString = e.error['message']
assert_equal("Insufficient funds, coinbase funds can only be spent after they have been sent to a zaddr" in errorString, True)
# Send will succeed because the balance of non-coinbase utxos is 20.0
# Send will succeed because the balance of non-coinbase utxos is 10.0
try:
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 19.0)
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 9)
except JSONRPCException:
assert(False)
self.nodes[1].generate(10)
self.sync_all()
self.nodes[1].generate(1)
self.sync_all()
# check balance
assert_equal(self.nodes[2].getbalance(), Decimal('19'))
assert_equal(self.nodes[2].getbalance(), 9)
if __name__ == '__main__':
Wallet2Test ().main ()

View File

@@ -32,7 +32,7 @@ make -C "$REPOROOT/src" check-security
test_rpath_runpath "${REPOROOT}/src/zcashd"
test_rpath_runpath "${REPOROOT}/src/zcash-cli"
test_rpath_runpath "${REPOROOT}/src/zcash-gtest"
test_rpath_runpath "${REPOROOT}/src/bitcoin-tx"
test_rpath_runpath "${REPOROOT}/src/zcash-tx"
test_rpath_runpath "${REPOROOT}/src/test/test_bitcoin"
test_rpath_runpath "${REPOROOT}/src/zcash/GenerateParams"
@@ -41,6 +41,6 @@ test_rpath_runpath "${REPOROOT}/src/zcash/GenerateParams"
test_fortify_source "${REPOROOT}/src/zcashd"
test_fortify_source "${REPOROOT}/src/zcash-cli"
test_fortify_source "${REPOROOT}/src/zcash-gtest"
test_fortify_source "${REPOROOT}/src/bitcoin-tx"
test_fortify_source "${REPOROOT}/src/zcash-tx"
test_fortify_source "${REPOROOT}/src/test/test_bitcoin"
test_fortify_source "${REPOROOT}/src/zcash/GenerateParams"

View File

@@ -15,7 +15,7 @@ function zcashd_generate {
function zcashd_start {
rm -rf "$DATADIR"
mkdir -p "$DATADIR"
./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 &
./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 &
ZCASHD_PID=$!
}
@@ -28,7 +28,7 @@ function zcashd_massif_start {
rm -rf "$DATADIR"
mkdir -p "$DATADIR"
rm -f massif.out
valgrind --tool=massif --time-unit=ms --massif-out-file=massif.out ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 &
valgrind --tool=massif --time-unit=ms --massif-out-file=massif.out ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 &
ZCASHD_PID=$!
}
@@ -42,7 +42,7 @@ function zcashd_valgrind_start {
rm -rf "$DATADIR"
mkdir -p "$DATADIR"
rm -f valgrind.out
valgrind --leak-check=yes -v --error-limit=no --log-file="valgrind.out" ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 &
valgrind --leak-check=yes -v --error-limit=no --log-file="valgrind.out" ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 &
ZCASHD_PID=$!
}

View File

@@ -52,10 +52,10 @@ EXTRA_LIBRARIES += libbitcoin_wallet.a
endif
if BUILD_BITCOIN_LIBS
lib_LTLIBRARIES = libbitcoinconsensus.la
LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la
lib_LTLIBRARIES = libzcashconsensus.la
LIBZCASH_CONSENSUS=libzcashconsensus.la
else
LIBBITCOIN_CONSENSUS=
LIBZCASH_CONSENSUS=
endif
bin_PROGRAMS =
@@ -120,6 +120,7 @@ BITCOIN_CORE_H = \
main.h \
memusage.h \
merkleblock.h \
metrics.h \
miner.h \
mruset.h \
net.h \
@@ -205,6 +206,7 @@ libbitcoin_server_a_SOURCES = \
leveldbwrapper.cpp \
main.cpp \
merkleblock.cpp \
metrics.cpp \
miner.cpp \
net.cpp \
noui.cpp \
@@ -243,8 +245,13 @@ libbitcoin_wallet_a_SOURCES = \
$(BITCOIN_CORE_H) \
$(LIBZCASH_H)
EQUIHASH_TROMP_SOURCES = \
pow/tromp/equi_miner.h \
pow/tromp/equi.h \
pow/tromp/osx_barrier.h
# crypto primitives library
crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES)
crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES) -DEQUIHASH_TROMP_ATOMIC
crypto_libbitcoin_crypto_a_SOURCES = \
crypto/common.h \
crypto/equihash.cpp \
@@ -261,7 +268,8 @@ crypto_libbitcoin_crypto_a_SOURCES = \
crypto/sha256.cpp \
crypto/sha256.h \
crypto/sha512.cpp \
crypto/sha512.h
crypto/sha512.h \
${EQUIHASH_TROMP_SOURCES}
# univalue JSON library
univalue_libbitcoin_univalue_a_SOURCES = \
@@ -393,17 +401,17 @@ komodo_cli_LDADD = \
$(LIBZCASH_LIBS)
#
# bitcoin-tx binary #
bitcoin_tx_SOURCES = bitcoin-tx.cpp
bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES)
bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
# zcash-tx binary #
zcash_tx_SOURCES = bitcoin-tx.cpp
zcash_tx_CPPFLAGS = $(BITCOIN_INCLUDES)
zcash_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
if TARGET_WINDOWS
bitcoin_tx_SOURCES += bitcoin-tx-res.rc
zcash_tx_SOURCES += bitcoin-tx-res.rc
endif
# FIXME: Is libzcash needed for bitcoin_tx?
bitcoin_tx_LDADD = \
# FIXME: Is libzcash needed for zcash_tx?
zcash_tx_LDADD = \
$(LIBBITCOIN_UNIVALUE) \
$(LIBBITCOIN_COMMON) \
$(LIBBITCOIN_UTIL) \
@@ -412,7 +420,7 @@ bitcoin_tx_LDADD = \
$(LIBBITCOIN_CRYPTO) \
$(LIBZCASH_LIBS)
bitcoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
zcash_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
#
# zcash protocol primitives #
@@ -440,10 +448,10 @@ libzcash_a_LDFLAGS = $(HARDENED_LDFLAGS)
libzcash_a_CPPFLAGS += -DMONTGOMERY_OUTPUT
# bitcoinconsensus library #
# zcashconsensus library #
if BUILD_BITCOIN_LIBS
include_HEADERS = script/bitcoinconsensus.h
libbitcoinconsensus_la_SOURCES = \
include_HEADERS = script/zcashconsensus.h
libzcashconsensus_la_SOURCES = \
crypto/equihash.cpp \
crypto/hmac_sha512.cpp \
crypto/ripemd160.cpp \
@@ -455,19 +463,19 @@ libbitcoinconsensus_la_SOURCES = \
hash.cpp \
primitives/transaction.cpp \
pubkey.cpp \
script/bitcoinconsensus.cpp \
script/zcashconsensus.cpp \
script/interpreter.cpp \
script/script.cpp \
uint256.cpp \
utilstrencodings.cpp
if GLIBC_BACK_COMPAT
libbitcoinconsensus_la_SOURCES += compat/glibc_compat.cpp
libzcashconsensus_la_SOURCES += compat/glibc_compat.cpp
endif
libbitcoinconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS)
libbitcoinconsensus_la_LIBADD = $(CRYPTO_LIBS)
libbitcoinconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL
libzcashconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS)
libzcashconsensus_la_LIBADD = $(CRYPTO_LIBS)
libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL
endif
#

View File

@@ -4,6 +4,8 @@ bin_PROGRAMS += komodo-gtest
# tool for generating our public parameters
komodo_gtest_SOURCES = \
gtest/main.cpp \
gtest/utils.cpp \
gtest/test_checkblock.cpp \
gtest/test_checktransaction.cpp \
gtest/json_test_vectors.cpp \
gtest/json_test_vectors.h \
@@ -17,7 +19,9 @@ komodo_gtest_SOURCES = \
gtest/test_noteencryption.cpp \
gtest/test_merkletree.cpp \
gtest/test_pow.cpp \
gtest/test_random.cpp \
gtest/test_rpc.cpp \
gtest/test_transaction.cpp \
gtest/test_circuit.cpp \
gtest/test_txid.cpp \
gtest/test_libzcash_utils.cpp \

View File

@@ -103,7 +103,7 @@ if ENABLE_WALLET
test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET)
endif
test_test_bitcoin_LDADD += $(LIBBITCOIN_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS)
test_test_bitcoin_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS)
test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static
nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES)

View File

@@ -16,14 +16,14 @@ BEGIN
BEGIN
BLOCK "040904E4" // U.S. English - multilingual (hex)
BEGIN
VALUE "CompanyName", "Bitcoin"
VALUE "FileDescription", "bitcoin-tx (CLI Bitcoin transaction editor utility)"
VALUE "CompanyName", "Zcash"
VALUE "FileDescription", "zcash-tx (CLI Zcash transaction editor utility)"
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", "bitcoin-tx"
VALUE "InternalName", "zcash-tx"
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-tx.exe"
VALUE "ProductName", "bitcoin-tx"
VALUE "OriginalFilename", "zcash-tx.exe"
VALUE "ProductName", "zcash-tx"
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END

View File

@@ -46,10 +46,10 @@ static bool AppInitRawTx(int argc, char* argv[])
if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help"))
{
// First part of help message is specific to this utility
std::string strUsage = _("Bitcoin Core bitcoin-tx utility version") + " " + FormatFullVersion() + "\n\n" +
std::string strUsage = _("Zcash zcash-tx utility version") + " " + FormatFullVersion() + "\n\n" +
_("Usage:") + "\n" +
" bitcoin-tx [options] <hex-tx> [commands] " + _("Update hex-encoded bitcoin transaction") + "\n" +
" bitcoin-tx [options] -create [commands] " + _("Create hex-encoded bitcoin transaction") + "\n" +
" zcash-tx [options] <hex-tx> [commands] " + _("Update hex-encoded zcash transaction") + "\n" +
" zcash-tx [options] -create [commands] " + _("Create hex-encoded zcash transaction") + "\n" +
"\n";
fprintf(stdout, "%s", strUsage.c_str());
@@ -159,7 +159,7 @@ static void RegisterLoad(const string& strInput)
static void MutateTxVersion(CMutableTransaction& tx, const string& cmdVal)
{
int64_t newVersion = atoi64(cmdVal);
if (newVersion < 1 || newVersion > CTransaction::CURRENT_VERSION)
if (newVersion < CTransaction::MIN_CURRENT_VERSION || newVersion > CTransaction::MAX_CURRENT_VERSION)
throw runtime_error("Invalid TX version requested");
tx.nVersion = (int) newVersion;

View File

@@ -324,11 +324,6 @@ public:
READWRITE(VARINT(nDataPos));
if (nStatus & BLOCK_HAVE_UNDO)
READWRITE(VARINT(nUndoPos));
uint8_t tag = 0;
READWRITE(tag);
if (ser_action.ForRead() && tag != 0) {
assert(!"For the first time running zcashd after upgrading to v1.0.0-rc1, please use the -reindex option.");
}
READWRITE(hashAnchor);
// block header

View File

@@ -42,9 +42,7 @@ public:
consensus.nMajorityEnforceBlockUpgrade = 750;
consensus.nMajorityRejectBlockOutdated = 950;
consensus.nMajorityWindow = 4000;
// TODO generate harder genesis block
//consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
consensus.nPowAveragingWindow = 17;
assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
@@ -62,6 +60,7 @@ public:
pchMessageStart[3] = 0x8d;
vAlertPubKey = ParseHex("020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9");
nDefaultPort = 7770;
nMinerThreads = 0;
nMaxTipAge = 24 * 60 * 60;
nPruneAfterHeight = 100000;
@@ -73,24 +72,22 @@ public:
/**
* Build the genesis block. Note that the output of its generation
* transaction cannot be spent since it did not originally exist in the
* database.
* database (and is in any case of zero value).
*
* 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
* >>> from pyblake2 import blake2s
* >>> 'Zcash' + blake2s(b'The Economist 2016-10-29 Known unknown: Another crypto-currency is born. BTC#436254 0000000000000000044f321997f336d2908cf8c8d6893e88dbf067e2d949487d ETH#2521903 483039a6b6bd8bd05f0584f9a078d075e454925eb71c1f13eaff59b405a721bb DJIA close on 27 Oct 2016: 18,169.68').hexdigest()
*/
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34";
CMutableTransaction txNew;
txNew.vin.resize(1);
txNew.vout.resize(1);
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
txNew.vout[0].nValue = 50 * COIN;
txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
txNew.vout[0].nValue = 0;
txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
genesis.vtx.push_back(txNew);
genesis.hashPrevBlock.SetNull();
genesis.hashMerkleRoot = genesis.BuildMerkleTree();
genesis.nVersion = 1;
genesis.nTime = 1231006505;
// TODO generate harder genesis block
@@ -100,11 +97,12 @@ public:
genesis.nSolution = ParseHex("000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2");
consensus.hashGenesisBlock = genesis.GetHash();
assert(consensus.hashGenesisBlock == uint256S("0x027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71"));
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08"));
assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
vFixedSeeds.clear();
vSeeds.clear();
// TODO: set up bootstrapping for mainnet
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,60);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,85);
@@ -162,7 +160,7 @@ public:
consensus.nMajorityEnforceBlockUpgrade = 51;
consensus.nMajorityRejectBlockOutdated = 75;
consensus.nMajorityWindow = 400;
consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
consensus.fPowAllowMinDifficultyBlocks = true;
pchMessageStart[0] = 0x5A;
@@ -172,7 +170,6 @@ public:
vAlertPubKey = ParseHex("00");
nDefaultPort = 17770;
nMinerThreads = 0;
nMaxTipAge = 0x7fffffff;
nPruneAfterHeight = 1000;
//! Modify the testnet genesis block so the timestamp is valid for a later start.
@@ -181,7 +178,7 @@ public:
genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000009");
genesis.nSolution = ParseHex("003423da3e41f916bf3ff0ee770eb844a240361abe08a8c9d46bd30226e2ad411a4047b6ddc230d173c60537e470e24f764120f5a2778b2a1285b0727bf79a0b085ad67e6266fb38fd72ef17f827315c42f921720248c983d4100e6ebd1c4b5e8762a973bac3bec7f7153b93752ebbb465f0fc9520bcfc30f9abfe303627338fed6ede9cf1b9173a736cf270cf4d9c6999ff4c3a301a78fd50dab6ccca67a0c5c2e41f216a1f3efd049a74bbe6252f9773bc309d3f9e554d996913ce8e1cec672a1fa4ea59726b61ea9e75d5ce9aa5dbfa96179a293810e02787f26de324fe7c88376ff57e29574a55faff7c2946f3e40e451861c32bf67da7377de3136858a18f34fab1bc8da37726ca2c25fc7b312a5427554ec944da81c7e27255d6c94ade9987ff7daedc2d1cc63d7d4cf93e691d13326fb1c7ee72ccdc0b134eb665fc6a9821e6fef6a6d45e4aac6dca6b505a0100ad56ea4f6fa4cdc2f0d1b65f730104a515172e34163bdb422f99d083e6eb860cf6b3f66642c4dbaf0d0fa1dca1b6166f1d1ffaa55a9d6d6df628afbdd14f1622c1c8303259299521a253bc28fcc93676723158067270fc710a09155a1e50c533e9b79ed5edba4ab70a08a9a2fc0eef0ddae050d75776a9804f8d6ad7e30ccb66c6a98d86710ca7a4dfb4feb159484796b9a015c5764aa3509051c87f729b9877ea41f8b470898c01388ed9098b1e006d3c30fc6e7c781072fa3f75d918505ee8ca75840fc62f67c57060666aa42578a2dd022eda62e3f1e447d7364074d34fd60ad9b138f60422afa6cfcb913fd6c213b496144dbfda7bfc7c24540cfe40ad0c0fd5a8c0902127f53d3178ba1b2a87bf1224d53d3a15e49ccdf121ae872a011c996d1b9793153cdcd4c0a7e99f8a35669788551cca2b62769eda24b6b55e2f4e0ac0d30aa50ecf33c6cdb24adfc922006a7bf434ced800fefe814c94c6fc8caa37b372d5088bb31d2f6b11a7a67ad3f70abbac0d5c256b637828de6cc525978cf151a2e50798e0c591787639a030291272c9ced3ab7d682e03f8c7db51f60163baa85315789666ea8c5cd6f789a7f4a5de4f8a9dfefce20f353cec606492fde8eab3e3b487b3a3a57434f8cf252a4b643fc125c8a5948b06744f5dc306aa587bdc85364c7488235c6edddd78763675e50a9637181519be06dd30c4ba0d845f9ba320d01706fd6dd64d1aa3cd4211a4a7d1d3f2c1ef2766d27d5d2cdf8e7f5e3ea309d4f149bb737305df1373a7f5313abe5986f4aa620bec4b0065d48aafac3631de3771f5c4d2f6eec67b09d9c70a3c1969fecdb014cb3c69832b63cc9d6efa378bff0ef95ffacdeb1675bb326e698f022c1a3a2e1c2b0f05e1492a6d2b7552388eca7ee8a2467ef5d4207f65d4e2ae7e33f13eb473954f249d7c20158ae703e1accddd4ea899f026618695ed2949715678a32a153df32c08922fafad68b1895e3b10e143e712940104b3b352369f4fe79bd1f1dbe03ea9909dbcf5862d1f15b3d1557a6191f54c891513cdb3c729bb9ab08c0d4c35a3ed67d517ffe1e2b7a798521aed15ff9822169c0ec860d7b897340bc2ef4c37f7eb73bd7dafef12c4fd4e6f5dd3690305257ae14ed03df5e3327b68467775a90993e613173fa6650ffa2a26e84b3ce79606bf234eda9f4053307f344099e3b10308d3785b8726fd02d8e94c2759bebd05748c3fe7d5fe087dc63608fb77f29708ab167a13f32da251e249a544124ed50c270cfc6986d9d1814273d2f0510d0d2ea335817207db6a4a23ae9b079967b63b25cb3ceea7001b65b879263f5009ac84ab89738a5b8b71fd032beb9f297326f1f5afa630a5198d684514e242f315a4d95fa6802e82799a525bb653b80b4518ec610a5996403b1391");
consensus.hashGenesisBlock = genesis.GetHash();
assert(consensus.hashGenesisBlock == uint256S("0x0cdf00b25a93ded11d73ebe1728cf7867f18e1f62aca9554b95e0f3026174e33"));
assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38"));
vFixedSeeds.clear();
vSeeds.clear();
@@ -200,7 +197,7 @@ public:
fRequireRPCPassword = true;
fMiningRequiresPeers = false;//true;
fDefaultConsistencyChecks = false;
fRequireStandard = false;
fRequireStandard = true;
fMineBlocksOnDemand = false;
fTestnetToBeDeprecatedFieldRPC = true;
@@ -351,14 +348,6 @@ std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const {
CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight());
// #1398 START
// We can remove this code when miner_tests no longer expect this script
if (fMinerTestModeForFoundersRewardScript) {
auto rewardScript = ParseHex("a9146708e6670db0b950dac68031025cc5b63213a49187");
return CScript(rewardScript.begin(), rewardScript.end());
}
// #1398 END
CBitcoinAddress address(GetFoundersRewardAddressAtHeight(nHeight).c_str());
assert(address.IsValid());
assert(address.IsScript());

View File

@@ -83,8 +83,6 @@ public:
std::string GetFoundersRewardAddressAtHeight(int height) const;
CScript GetFoundersRewardScriptAtHeight(int height) const;
std::string GetFoundersRewardAddressAtIndex(int i) const;
/** #1398 to return a fixed founders reward script for miner_tests */
bool fMinerTestModeForFoundersRewardScript = false;
/** Enforce coinbase consensus rule in regtest mode */
void SetRegTestCoinbaseMustBeProtected() { consensus.fCoinbaseMustBeProtected = true; }
protected:
@@ -94,23 +92,23 @@ protected:
CMessageHeader::MessageStartChars pchMessageStart;
//! Raw pub key bytes for the broadcast alert signing key.
std::vector<unsigned char> vAlertPubKey;
int nDefaultPort;
int nMinerThreads;
long nMaxTipAge;
uint64_t nPruneAfterHeight;
unsigned int nEquihashN;
unsigned int nEquihashK;
int nDefaultPort = 0;
int nMinerThreads = 0;
long nMaxTipAge = 0;
uint64_t nPruneAfterHeight = 0;
unsigned int nEquihashN = 0;
unsigned int nEquihashK = 0;
std::vector<CDNSSeedData> vSeeds;
std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
std::string strNetworkID;
CBlock genesis;
std::vector<SeedSpec6> vFixedSeeds;
bool fRequireRPCPassword;
bool fMiningRequiresPeers;
bool fDefaultConsistencyChecks;
bool fRequireStandard;
bool fMineBlocksOnDemand;
bool fTestnetToBeDeprecatedFieldRPC;
bool fRequireRPCPassword = false;
bool fMiningRequiresPeers = false;
bool fDefaultConsistencyChecks = false;
bool fRequireStandard = false;
bool fMineBlocksOnDemand = false;
bool fTestnetToBeDeprecatedFieldRPC = false;
Checkpoints::CCheckpointData checkpointData;
std::vector<std::string> vFoundersRewardAddress;
};

View File

@@ -29,7 +29,7 @@ public:
protected:
CBaseChainParams() {}
int nRPCPort;
int nRPCPort = 0;
std::string strDataDir;
};

View File

@@ -17,10 +17,10 @@
#define CLIENT_VERSION_MAJOR 1
#define CLIENT_VERSION_MINOR 0
#define CLIENT_VERSION_REVISION 0
#define CLIENT_VERSION_BUILD 1
#define CLIENT_VERSION_BUILD 50
//! Set to true for release, false for prerelease or test build
#define CLIENT_VERSION_IS_RELEASE false
#define CLIENT_VERSION_IS_RELEASE true
/**
* Copyright year (2009-this)
@@ -38,7 +38,7 @@
#define DO_STRINGIZE(X) #X
//! Copyright string used in Windows .rc files
#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " The Bitcoin Core Developers"
#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " The Bitcoin Core Developers and The Zcash developers"
/**
* bitcoind-res.rc includes this file, but it cannot cope with real c++ code.

View File

@@ -32,7 +32,7 @@
#include <windows.h>
#include <ws2tcpip.h>
#else
#include <sys/fcntl.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/types.h>

View File

@@ -86,8 +86,14 @@ public:
return;
}
nSize -= nSpecialScripts;
script.resize(nSize);
s >> REF(CFlatData(script));
if (nSize > MAX_SCRIPT_SIZE) {
// Overly long script, replace with a short invalid one
script << OP_RETURN;
s.ignore(nSize);
} else {
script.resize(nSize);
s >> REF(CFlatData(script));
}
}
};

View File

@@ -6,6 +6,10 @@
#ifndef BITCOIN_CONSENSUS_CONSENSUS_H
#define BITCOIN_CONSENSUS_CONSENSUS_H
/** The minimum allowed block version (network rule) */
static const int32_t MIN_BLOCK_VERSION = 4;
/** The minimum allowed transaction version (network rule) */
static const int32_t MIN_TX_VERSION = 1;
/** The maximum allowed size for a serialized block, in bytes (network rule) */
static const unsigned int MAX_BLOCK_SIZE = 2000000;
/** The maximum allowed number of signature check operations in a block (network rule) */

View File

@@ -0,0 +1,31 @@
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "consensus/validation.h"
#include "main.h"
class MockCValidationState : public CValidationState {
public:
MOCK_METHOD5(DoS, bool(int level, bool ret,
unsigned char chRejectCodeIn, std::string strRejectReasonIn,
bool corruptionIn));
MOCK_METHOD3(Invalid, bool(bool ret,
unsigned char _chRejectCode, std::string _strRejectReason));
MOCK_METHOD1(Error, bool(std::string strRejectReasonIn));
MOCK_CONST_METHOD0(IsValid, bool());
MOCK_CONST_METHOD0(IsInvalid, bool());
MOCK_CONST_METHOD0(IsError, bool());
MOCK_CONST_METHOD1(IsInvalid, bool(int &nDoSOut));
MOCK_CONST_METHOD0(CorruptionPossible, bool());
MOCK_CONST_METHOD0(GetRejectCode, unsigned char());
MOCK_CONST_METHOD0(GetRejectReason, std::string());
};
TEST(CheckBlock, VersionTooLow) {
CBlock block;
block.nVersion = 1;
MockCValidationState state;
EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "version-too-low", false)).Times(1);
EXPECT_FALSE(CheckBlock(block, state, false, false));
}

View File

@@ -94,6 +94,16 @@ TEST(checktransaction_tests, valid_transaction) {
EXPECT_TRUE(CheckTransactionWithoutProofVerification(tx, state));
}
TEST(checktransaction_tests, BadVersionTooLow) {
CMutableTransaction mtx = GetValidTransaction();
mtx.nVersion = 0;
CTransaction tx(mtx);
MockCValidationState state;
EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-txns-version-too-low", false)).Times(1);
CheckTransactionWithoutProofVerification(tx, state);
}
TEST(checktransaction_tests, bad_txns_vin_empty) {
CMutableTransaction mtx = GetValidTransaction();
mtx.vjoinsplit.resize(0);

27
src/gtest/test_random.cpp Normal file
View File

@@ -0,0 +1,27 @@
#include <gtest/gtest.h>
#include "random.h"
extern int GenZero(int n);
extern int GenMax(int n);
TEST(Random, MappedShuffle) {
std::vector<int> a {8, 4, 6, 3, 5};
std::vector<int> m {0, 1, 2, 3, 4};
auto a1 = a;
auto m1 = m;
MappedShuffle(a1.begin(), m1.begin(), a1.size(), GenZero);
std::vector<int> ea1 {4, 6, 3, 5, 8};
std::vector<int> em1 {1, 2, 3, 4, 0};
EXPECT_EQ(ea1, a1);
EXPECT_EQ(em1, m1);
auto a2 = a;
auto m2 = m;
MappedShuffle(a2.begin(), m2.begin(), a2.size(), GenMax);
std::vector<int> ea2 {8, 4, 6, 3, 5};
std::vector<int> em2 {0, 1, 2, 3, 4};
EXPECT_EQ(ea2, a2);
EXPECT_EQ(em2, m2);
}

View File

@@ -0,0 +1,85 @@
#include <gtest/gtest.h>
#include "primitives/transaction.h"
#include "zcash/Note.hpp"
#include "zcash/Address.hpp"
extern ZCJoinSplit* params;
extern int GenZero(int n);
extern int GenMax(int n);
TEST(Transaction, JSDescriptionRandomized) {
// construct a merkle tree
ZCIncrementalMerkleTree merkleTree;
libzcash::SpendingKey k = libzcash::SpendingKey::random();
libzcash::PaymentAddress addr = k.address();
libzcash::Note note(addr.a_pk, 100, uint256(), uint256());
// commitment from coin
uint256 commitment = note.cm();
// insert commitment into the merkle tree
merkleTree.append(commitment);
// compute the merkle root we will be working with
uint256 rt = merkleTree.root();
auto witness = merkleTree.witness();
// create JSDescription
uint256 pubKeyHash;
boost::array<libzcash::JSInput, ZC_NUM_JS_INPUTS> inputs = {
libzcash::JSInput(witness, note, k),
libzcash::JSInput() // dummy input of zero value
};
boost::array<libzcash::JSOutput, ZC_NUM_JS_OUTPUTS> outputs = {
libzcash::JSOutput(addr, 50),
libzcash::JSOutput(addr, 50)
};
boost::array<size_t, ZC_NUM_JS_INPUTS> inputMap;
boost::array<size_t, ZC_NUM_JS_OUTPUTS> outputMap;
{
auto jsdesc = JSDescription::Randomized(
*params, pubKeyHash, rt,
inputs, outputs,
inputMap, outputMap,
0, 0, false);
std::set<size_t> inputSet(inputMap.begin(), inputMap.end());
std::set<size_t> expectedInputSet {0, 1};
EXPECT_EQ(expectedInputSet, inputSet);
std::set<size_t> outputSet(outputMap.begin(), outputMap.end());
std::set<size_t> expectedOutputSet {0, 1};
EXPECT_EQ(expectedOutputSet, outputSet);
}
{
auto jsdesc = JSDescription::Randomized(
*params, pubKeyHash, rt,
inputs, outputs,
inputMap, outputMap,
0, 0, false, GenZero);
boost::array<size_t, ZC_NUM_JS_INPUTS> expectedInputMap {1, 0};
boost::array<size_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {1, 0};
EXPECT_EQ(expectedInputMap, inputMap);
EXPECT_EQ(expectedOutputMap, outputMap);
}
{
auto jsdesc = JSDescription::Randomized(
*params, pubKeyHash, rt,
inputs, outputs,
inputMap, outputMap,
0, 0, false, GenMax);
boost::array<size_t, ZC_NUM_JS_INPUTS> expectedInputMap {0, 1};
boost::array<size_t, ZC_NUM_JS_OUTPUTS> expectedOutputMap {0, 1};
EXPECT_EQ(expectedInputMap, inputMap);
EXPECT_EQ(expectedOutputMap, outputMap);
}
}

13
src/gtest/utils.cpp Normal file
View File

@@ -0,0 +1,13 @@
#include "zcash/JoinSplit.hpp"
ZCJoinSplit* params = ZCJoinSplit::Unopened();
int GenZero(int n)
{
return 0;
}
int GenMax(int n)
{
return n-1;
}

View File

@@ -16,6 +16,7 @@
#include "consensus/validation.h"
#include "key.h"
#include "main.h"
#include "metrics.h"
#include "miner.h"
#include "net.h"
#include "rpcserver.h"
@@ -110,7 +111,7 @@ CClientUIInterface uiInterface; // Declared but not defined in ui_interface.h
// shutdown thing.
//
volatile bool fRequestShutdown = false;
std::atomic<bool> fRequestShutdown(false);
void StartShutdown()
{
@@ -156,7 +157,7 @@ void Shutdown()
/// for example if the data directory was found to be locked.
/// Be sure that anything that writes files or flushes caches only does this if the respective
/// module was initialized.
RenameThread("bitcoin-shutoff");
RenameThread("zcash-shutoff");
mempool.AddTransactionsUpdated(1);
StopRPCThreads();
#ifdef ENABLE_WALLET
@@ -383,6 +384,7 @@ std::string HelpMessage(HelpMessageMode mode)
#ifdef ENABLE_WALLET
strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
strUsage += HelpMessageOpt("-equihashsolver=<name>", _("Specify the Equihash solver to be used if enabled (default: \"default\")"));
#endif
strUsage += HelpMessageOpt("-help-debug", _("Show all debugging options (usage: --help -help-debug)"));
strUsage += HelpMessageOpt("-logips", strprintf(_("Include IP addresses in debug output (default: %u)"), 0));
@@ -529,7 +531,7 @@ void CleanupBlockRevFiles()
void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
{
RenameThread("bitcoin-loadblk");
RenameThread("zcash-loadblk");
// -reindex
if (fReindex) {
#ifdef ENABLE_WALLET
@@ -613,8 +615,8 @@ static void ZC_LoadParams()
struct timeval tv_start, tv_end;
float elapsed;
boost::filesystem::path pk_path = ZC_GetParamsDir() / "beta2-proving.key";
boost::filesystem::path vk_path = ZC_GetParamsDir() / "beta2-verifying.key";
boost::filesystem::path pk_path = ZC_GetParamsDir() / "sprout-proving.key";
boost::filesystem::path vk_path = ZC_GetParamsDir() / "sprout-verifying.key";
pzcashParams = ZCJoinSplit::Unopened();
@@ -924,7 +926,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// Sanity check
if (!InitSanityCheck())
return InitError(_("Initialization sanity check failed. Bitcoin Core is shutting down."));
return InitError(_("Initialization sanity check failed. Zcash is shutting down."));
std::string strDataDir = GetDataDir().string();
#ifdef ENABLE_WALLET
@@ -940,9 +942,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
try {
static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
if (!lock.try_lock())
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running."), strDataDir));
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Zcash is probably already running."), strDataDir));
} catch(const boost::interprocess::interprocess_exception& e) {
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.") + " %s.", strDataDir, e.what()));
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Zcash is probably already running.") + " %s.", strDataDir, e.what()));
}
#ifndef WIN32
@@ -951,7 +953,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
if (GetBoolArg("-shrinkdebugfile", !fDebug))
ShrinkDebugFile();
LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
LogPrintf("Bitcoin version %s (%s)\n", FormatFullVersion(), CLIENT_DATE);
LogPrintf("Zcash version %s (%s)\n", FormatFullVersion(), CLIENT_DATE);
LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION));
#ifdef ENABLE_WALLET
LogPrintf("Using BerkeleyDB version %s\n", DbEnv::version(0, 0, 0));
@@ -974,6 +976,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
if ((chainparams.NetworkIDString() != "regtest") &&
GetBoolArg("-showmetrics", true) &&
!fPrintToConsole && !GetBoolArg("-daemon", false)) {
// Start the persistent metrics interface
ConnectMetricsScreen();
threadGroup.create_thread(&ThreadShowMetricsScreen);
}
// Initialize Zcash circuit parameters
ZC_LoadParams();
// These must be disabled for now, they are buggy and we probably don't

View File

@@ -16,6 +16,7 @@
#include "consensus/validation.h"
#include "init.h"
#include "merkleblock.h"
#include "metrics.h"
#include "net.h"
#include "pow.h"
#include "txdb.h"
@@ -38,7 +39,7 @@
using namespace std;
#if defined(NDEBUG)
# error "Bitcoin cannot be compiled without assertions."
# error "Zcash cannot be compiled without assertions."
#endif
@@ -577,7 +578,7 @@ bool AddOrphanTx(const CTransaction& tx, NodeId peer)
// have been mined or received.
// 10,000 orphans, each of which is at most 5,000 bytes big is
// at most 500 megabytes of orphans:
unsigned int sz = tx.GetSerializeSize(SER_NETWORK, CTransaction::CURRENT_VERSION);
unsigned int sz = tx.GetSerializeSize(SER_NETWORK, tx.nVersion);
if (sz > 5000)
{
LogPrint("mempool", "ignoring large orphan tx (size: %u, hash: %s)\n", sz, hash.ToString());
@@ -652,7 +653,7 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
bool IsStandardTx(const CTransaction& tx, string& reason)
{
if (tx.nVersion > CTransaction::CURRENT_VERSION || tx.nVersion < 1) {
if (tx.nVersion > CTransaction::MAX_CURRENT_VERSION || tx.nVersion < CTransaction::MIN_CURRENT_VERSION) {
reason = "version";
return false;
}
@@ -863,6 +864,11 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in
bool CheckTransaction(const CTransaction& tx, CValidationState &state)
{
// Don't count coinbase transactions because mining skews the count
if (!tx.IsCoinBase()) {
transactionsValidated.increment();
}
if (!CheckTransactionWithoutProofVerification(tx, state)) {
return false;
} else {
@@ -881,6 +887,12 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio
{
// Basic checks that don't depend on any context
// Check transaction version
if (tx.nVersion < MIN_TX_VERSION) {
return state.DoS(100, error("CheckTransaction(): version too low"),
REJECT_INVALID, "bad-txns-version-too-low");
}
// Transactions can contain empty `vin` and `vout` so long as
// `vjoinsplit` is non-empty.
if (tx.vin.empty() && tx.vjoinsplit.empty())
@@ -2006,7 +2018,7 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
static CCheckQueue<CScriptCheck> scriptcheckqueue(128);
void ThreadScriptCheck() {
RenameThread("bitcoin-scriptch");
RenameThread("zcash-scriptch");
scriptcheckqueue.Thread();
}
@@ -3003,14 +3015,15 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl
// Check timestamp
if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60)
return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new");
// Check block version
//if (block.nVersion < MIN_BLOCK_VERSION)
// return state.DoS(100, error("CheckBlockHeader(): block version too low"),REJECT_INVALID, "version-too-low");
// Check Equihash solution is valid
if ( fCheckPOW && !CheckEquihashSolution(&blockhdr, Params()) )
return state.DoS(100, error("CheckBlockHeader(): Equihash solution invalid"),REJECT_INVALID, "invalid-solution");
// Check proof of work matches claimed amount
//printf("from checkblockheader pindex.%p %p\n",pindex,mapBlockIndex[blockhdr.GetHash()]);
//if ( pindex == 0 )
// pindex = mapBlockIndex[blockhdr.GetHash()];
komodo_index2pubkey33(pubkey33,pindex,height);
if ( fCheckPOW && !CheckProofOfWork(height,pubkey33,blockhdr.GetHash(), blockhdr.nBits, Params().GetConsensus()) )
return state.DoS(50, error("CheckBlockHeader(): proof of work failed"),REJECT_INVALID, "high-hash");
@@ -4916,6 +4929,14 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// the getaddr message mitigates the attack.
else if ((strCommand == "getaddr") && (pfrom->fInbound))
{
// Only send one GetAddr response per connection to reduce resource waste
// and discourage addr stamping of INV announcements.
if (pfrom->fSentAddr) {
LogPrint("net", "Ignoring repeated \"getaddr\". peer=%d\n", pfrom->id);
return true;
}
pfrom->fSentAddr = true;
pfrom->vAddrToSend.clear();
vector<CAddress> vAddr = addrman.GetAddr();
BOOST_FOREACH(const CAddress &addr, vAddr)
@@ -5130,15 +5151,14 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
}
}
/*else if (strCommand == "komodo")
{
vector<unsigned char> vData;
vRecv >> vData;
komodo_checkmsg(pfrom,vData.data(),vData.size());
}*/
else
{
LogPrint("net", "Unknown \"%s\" from peer=%d\n", SanitizeString(strCommand),pfrom->id);
else if (strCommand == "notfound") {
// We do not care about the NOTFOUND message, but logging an Unknown Command
// message would be undesirable as we transmit it ourselves.
}
else {
// Ignore unknown commands for extensibility
LogPrint("net", "Unknown command \"%s\" from peer=%d\n", SanitizeString(strCommand), pfrom->id);
}

223
src/metrics.cpp Normal file
View File

@@ -0,0 +1,223 @@
// Copyright (c) 2016 The Zcash developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "metrics.h"
#include "chainparams.h"
#include "ui_interface.h"
#include "util.h"
#include "utiltime.h"
#include <boost/thread.hpp>
#include <boost/thread/synchronized_value.hpp>
#include <string>
#include <sys/ioctl.h>
#include <unistd.h>
AtomicCounter transactionsValidated;
AtomicCounter ehSolverRuns;
AtomicCounter solutionTargetChecks;
AtomicCounter minedBlocks;
boost::synchronized_value<std::list<std::string>> messageBox;
boost::synchronized_value<std::string> initMessage;
bool loaded = false;
static bool metrics_ThreadSafeMessageBox(const std::string& message,
const std::string& caption,
unsigned int style)
{
std::string strCaption;
// Check for usage of predefined caption
switch (style) {
case CClientUIInterface::MSG_ERROR:
strCaption += _("Error");
break;
case CClientUIInterface::MSG_WARNING:
strCaption += _("Warning");
break;
case CClientUIInterface::MSG_INFORMATION:
strCaption += _("Information");
break;
default:
strCaption += caption; // Use supplied caption (can be empty)
}
boost::strict_lock_ptr<std::list<std::string>> u = messageBox.synchronize();
u->push_back(strCaption + ": " + message);
if (u->size() > 5) {
u->pop_back();
}
}
static void metrics_InitMessage(const std::string& message)
{
*initMessage = message;
}
void ConnectMetricsScreen()
{
uiInterface.ThreadSafeMessageBox.disconnect_all_slots();
uiInterface.ThreadSafeMessageBox.connect(metrics_ThreadSafeMessageBox);
uiInterface.InitMessage.disconnect_all_slots();
uiInterface.InitMessage.connect(metrics_InitMessage);
}
void printMiningStatus(bool mining)
{
if (mining) {
int nThreads = GetArg("-genproclimit", 1);
if (nThreads < 0) {
// In regtest threads defaults to 1
if (Params().DefaultMinerThreads())
nThreads = Params().DefaultMinerThreads();
else
nThreads = boost::thread::hardware_concurrency();
}
std::cout << strprintf(_("You are running %d mining threads."), nThreads) << std::endl;
} else {
std::cout << _("You are currently not mining.") << std::endl;
std::cout << _("To enable mining, add 'gen=1' to your zcash.conf and restart.") << std::endl;
}
std::cout << std::endl;
}
int printMetrics(size_t cols, int64_t nStart, bool mining)
{
// Number of lines that are always displayed
int lines = 3;
// Calculate uptime
int64_t uptime = GetTime() - nStart;
int days = uptime / (24 * 60 * 60);
int hours = (uptime - (days * 24 * 60 * 60)) / (60 * 60);
int minutes = (uptime - (((days * 24) + hours) * 60 * 60)) / 60;
int seconds = uptime - (((((days * 24) + hours) * 60) + minutes) * 60);
// Display uptime
std::string duration;
if (days > 0) {
duration = strprintf(_("%d days, %d hours, %d minutes, %d seconds"), days, hours, minutes, seconds);
} else if (hours > 0) {
duration = strprintf(_("%d hours, %d minutes, %d seconds"), hours, minutes, seconds);
} else if (minutes > 0) {
duration = strprintf(_("%d minutes, %d seconds"), minutes, seconds);
} else {
duration = strprintf(_("%d seconds"), seconds);
}
std::string strDuration = strprintf(_("Since starting this node %s ago:"), duration);
std::cout << strDuration << std::endl;
lines += (strDuration.size() / cols);
std::cout << "- " << strprintf(_("You have validated %d transactions!"), transactionsValidated.get()) << std::endl;
if (mining) {
double solps = uptime > 0 ? (double)solutionTargetChecks.get() / uptime : 0;
std::string strSolps = strprintf("%.4f Sol/s", solps);
std::cout << "- " << strprintf(_("You have contributed %s on average to the network solution rate."), strSolps) << std::endl;
std::cout << "- " << strprintf(_("You have completed %d Equihash solver runs."), ehSolverRuns.get()) << std::endl;
lines += 2;
int mined = minedBlocks.get();
if (mined > 0) {
std::cout << "- " << strprintf(_("You have mined %d blocks!"), mined) << std::endl;
lines++;
}
}
std::cout << std::endl;
return lines;
}
int printMessageBox(size_t cols)
{
boost::strict_lock_ptr<std::list<std::string>> u = messageBox.synchronize();
if (u->size() == 0) {
return 0;
}
int lines = 2 + u->size();
std::cout << _("Messages:") << std::endl;
for (auto it = u->cbegin(); it != u->cend(); ++it) {
std::cout << *it << std::endl;
// Handle wrapped lines
lines += (it->size() / cols);
}
std::cout << std::endl;
return lines;
}
int printInitMessage()
{
if (loaded) {
return 0;
}
std::string msg = *initMessage;
std::cout << _("Init message:") << " " << msg << std::endl;
std::cout << std::endl;
if (msg == _("Done loading")) {
loaded = true;
}
return 2;
}
void ThreadShowMetricsScreen()
{
// Make this thread recognisable as the metrics screen thread
RenameThread("zcash-metrics-screen");
// Clear screen
std::cout << "\e[2J";
// Print art
std::cout << METRICS_ART << std::endl;
std::cout << std::endl;
// Thank you text
std::cout << _("Thank you for running a Zcash node!") << std::endl;
std::cout << _("You're helping to strengthen the network and contributing to a social good :)") << std::endl;
std::cout << std::endl;
// Miner status
bool mining = GetBoolArg("-gen", false);
printMiningStatus(mining);
// Count uptime
int64_t nStart = GetTime();
while (true) {
// Number of lines that are always displayed
int lines = 1;
int cols = 80;
// Get current window size
if (isatty(STDOUT_FILENO)) {
struct winsize w;
w.ws_col = 0;
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) {
cols = w.ws_col;
}
}
// Erase below current position
std::cout << "\e[J";
lines += printMetrics(cols, nStart, mining);
lines += printMessageBox(cols);
lines += printInitMessage();
// Explain how to exit
std::cout << "[" << _("Press Ctrl+C to exit") << "] [" << _("Set 'showmetrics=0' to hide") << "]" << std::endl;;
boost::this_thread::interruption_point();
MilliSleep(1000);
// Return to the top of the updating section
std::cout << "\e[" << lines << "A";
}
}

62
src/metrics.h Normal file
View File

@@ -0,0 +1,62 @@
// Copyright (c) 2016 The Zcash developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <atomic>
#include <string>
struct AtomicCounter {
std::atomic<int> value;
AtomicCounter() : value {0} { }
void increment(){
++value;
}
void decrement(){
--value;
}
int get(){
return value.load();
}
};
extern AtomicCounter transactionsValidated;
extern AtomicCounter ehSolverRuns;
extern AtomicCounter solutionTargetChecks;
extern AtomicCounter minedBlocks;
void ConnectMetricsScreen();
void ThreadShowMetricsScreen();
/**
* Heart image: https://commons.wikimedia.org/wiki/File:Heart_coraz%C3%B3n.svg
* License: CC BY-SA 3.0
*
* Rendering options:
* Zcash: img2txt -W 40 -H 20 -f utf8 -d none -g 0.7 Z-yellow.orange-logo.png
* Heart: img2txt -W 40 -H 20 -f utf8 -d none 2000px-Heart_corazón.svg.png
*/
const std::string METRICS_ART =
"   \n"
"   \n"
"  :88SX@888@@X8:  8; %X X% ;8 \n"
"  %%Xt%tt%SSSSS:XXXt@@  X :: :: X \n"
"  @S;;tt%%%t ;;::XXXXSX  % SS % \n"
"  .t:::;;%8888 88888tXXXX8;  S S \n"
"  .%...:::8 8::XXX%;  X X \n"
"  8888...:t888888X 8t;;::XX8   8 8 \n"
" %888888...:::;:8  :Xttt;;;::X@    \n"
" 888888888...:St 8:%%tttt;;;:X  X X \n"
" 88888888888S8  :%;ttt%%tttt;;X  8 8 \n"
" %888888888%t 8S:;;;tt%%%ttt;8  : : \n"
"  8t8888888  S8888888Stt%%%t@   :: :: \n"
"  .@tt888@ 8;;ttt@;  t t \n"
"  .8ttt8@SSSSS SXXXX%:;;;X;  8 8 \n"
"  X8ttt8888% %88...::X8   X. .X \n"
"  %8@tt88;8888%8888%8X   :; ;: \n"
"  :@888@XXX@888:  tt \n"
"   \n"
"   ";

View File

@@ -4,6 +4,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "miner.h"
#include "pow/tromp/equi_miner.h"
#include "amount.h"
#include "chainparams.h"
@@ -11,6 +12,7 @@
#include "consensus/validation.h"
#include "hash.h"
#include "main.h"
#include "metrics.h"
#include "net.h"
#include "pow.h"
#include "primitives/transaction.h"
@@ -450,6 +452,8 @@ static bool ProcessBlockFound(CBlock* pblock, CWallet& wallet, CReserveKey& rese
if (!ProcessNewBlock(state, NULL, pblock, true, NULL))
return error("ZcashMiner: ProcessNewBlock, block not accepted");
minedBlocks.increment();
return true;
}
@@ -471,6 +475,10 @@ void static BitcoinMiner(CWallet *pwallet)
unsigned int n = chainparams.EquihashN();
unsigned int k = chainparams.EquihashK();
std::string solver = GetArg("-equihashsolver", "default");
assert(solver == "tromp" || solver == "default");
LogPrint("pow", "Using Equihash solver \"%s\" with n = %u, k = %u\n", solver, n, k);
std::mutex m_cs;
bool cancelSolver = false;
boost::signals2::connection c = uiInterface.NotifyBlockTip.connect(
@@ -554,8 +562,8 @@ void static BitcoinMiner(CWallet *pwallet)
pblock->nNonce.size());
// (x_1, x_2, ...) = A(I, V, n, k)
LogPrint("pow", "Running Equihash solver with nNonce = %s\n",
pblock->nNonce.ToString());
LogPrint("pow", "Running Equihash solver \"%s\" with nNonce = %s\n",
solver, pblock->nNonce.ToString());
std::function<bool(std::vector<unsigned char>)> validBlock =
[&pblock, &hashTarget, &pwallet, &reservekey, &m_cs, &cancelSolver, &chainparams]
@@ -563,6 +571,7 @@ void static BitcoinMiner(CWallet *pwallet)
// Write the solution to the hash and compute the result.
LogPrint("pow", "- Checking solution against target\n");
pblock->nSolution = soln;
solutionTargetChecks.increment();
if (UintToArith256(pblock->GetHash()) > hashTarget) {
return false;
@@ -586,8 +595,11 @@ void static BitcoinMiner(CWallet *pwallet)
SetThreadPriority(THREAD_PRIORITY_LOWEST);
// In regression test mode, stop mining after a block is found.
if (chainparams.MineBlocksOnDemand())
if (chainparams.MineBlocksOnDemand()) {
// Increment here because throwing skips the call below
ehSolverRuns.increment();
throw boost::thread_interrupted();
}
return true;
};
@@ -595,14 +607,53 @@ void static BitcoinMiner(CWallet *pwallet)
std::lock_guard<std::mutex> lock{m_cs};
return cancelSolver;
};
try {
// If we find a valid block, we rebuild
if (EhOptimisedSolve(n, k, curr_state, validBlock, cancelled))
break;
} catch (EhSolverCancelledException&) {
LogPrint("pow", "Equihash solver cancelled\n");
std::lock_guard<std::mutex> lock{m_cs};
cancelSolver = false;
// TODO: factor this out into a function with the same API for each solver.
if (solver == "tromp") {
// Create solver and initialize it.
equi eq(1);
eq.setstate(&curr_state);
// Intialization done, start algo driver.
eq.digit0(0);
eq.xfull = eq.bfull = eq.hfull = 0;
eq.showbsizes(0);
for (u32 r = 1; r < WK; r++) {
(r&1) ? eq.digitodd(r, 0) : eq.digiteven(r, 0);
eq.xfull = eq.bfull = eq.hfull = 0;
eq.showbsizes(r);
}
eq.digitK(0);
ehSolverRuns.increment();
// Convert solution indices to byte array (decompress) and pass it to validBlock method.
for (size_t s = 0; s < eq.nsols; s++) {
LogPrint("pow", "Checking solution %d\n", s+1);
std::vector<eh_index> index_vector(PROOFSIZE);
for (size_t i = 0; i < PROOFSIZE; i++) {
index_vector[i] = eq.sols[s][i];
}
std::vector<unsigned char> sol_char = GetMinimalFromIndices(index_vector, DIGITBITS);
if (validBlock(sol_char)) {
// If we find a POW solution, do not try other solutions
// because they become invalid as we created a new block in blockchain.
break;
}
}
} else {
try {
// If we find a valid block, we rebuild
bool found = EhOptimisedSolve(n, k, curr_state, validBlock, cancelled);
ehSolverRuns.increment();
if (found) {
break;
}
} catch (EhSolverCancelledException&) {
LogPrint("pow", "Equihash solver cancelled\n");
std::lock_guard<std::mutex> lock{m_cs};
cancelSolver = false;
}
}
// Check for stop or if block needs to be rebuilt

View File

@@ -2142,6 +2142,7 @@ CNode::CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn, bool fIn
nStartingHeight = -1;
fGetAddr = false;
fRelayTxes = false;
fSentAddr = false;
pfilter = new CBloomFilter();
nPingNonceSent = 0;
nPingUsecStart = 0;

View File

@@ -278,6 +278,7 @@ public:
// b) the peer may tell us in its version message that we should not relay tx invs
// until it has initialized its bloom filter.
bool fRelayTxes;
bool fSentAddr;
CSemaphoreGrant grantOutbound;
CCriticalSection cs_filter;
CBloomFilter* pfilter;

View File

@@ -66,6 +66,9 @@ class CTxMemPoolEntry;
* they've been outstanding.
*/
/** Decay of .998 is a half-life of 346 blocks or about 2.4 days */
static const double DEFAULT_DECAY = .998;
/**
* We will instantiate two instances of this class, one to track transactions
* that were included in a block due to fee, and one for tx's included due to
@@ -105,7 +108,7 @@ private:
// Combine the total value with the tx counts to calculate the avg fee/priority per bucket
std::string dataTypeString;
double decay;
double decay = DEFAULT_DECAY;
// Mempool counts of outstanding transactions
// For each bucket X, track the number of transactions in the mempool
@@ -179,9 +182,6 @@ public:
/** Track confirm delays up to 25 blocks, can't estimate beyond that */
static const unsigned int MAX_BLOCK_CONFIRMS = 25;
/** Decay of .998 is a half-life of 346 blocks or about 2.4 days */
static const double DEFAULT_DECAY = .998;
/** Require greater than 85% of X fee transactions to be confirmed within Y blocks for X to be big enough */
static const double MIN_SUCCESS_PCT = .85;
static const double UNLIKELY_PCT = .5;

98
src/pow/tromp/equi.h Normal file
View File

@@ -0,0 +1,98 @@
// Equihash solver
// Copyright (c) 2016-2016 John Tromp, The Zcash developers
#include "sodium.h"
#ifdef __APPLE__
#include "pow/tromp/osx_barrier.h"
#endif
#include "compat/endian.h"
#include <stdint.h> // for types uint32_t,uint64_t
#include <string.h> // for functions memset
#include <stdlib.h> // for function qsort
typedef uint32_t u32;
typedef unsigned char uchar;
// algorithm parameters, prefixed with W to reduce include file conflicts
#ifndef WN
#define WN 200
#endif
#ifndef WK
#define WK 9
#endif
#define NDIGITS (WK+1)
#define DIGITBITS (WN/(NDIGITS))
static const u32 PROOFSIZE = 1<<WK;
static const u32 BASE = 1<<DIGITBITS;
static const u32 NHASHES = 2*BASE;
static const u32 HASHESPERBLAKE = 512/WN;
static const u32 HASHOUT = HASHESPERBLAKE*WN/8;
typedef u32 proof[PROOFSIZE];
enum verify_code { POW_OK, POW_DUPLICATE, POW_OUT_OF_ORDER, POW_NONZERO_XOR };
const char *errstr[] = { "OK", "duplicate index", "indices out of order", "nonzero xor" };
void genhash(const crypto_generichash_blake2b_state *ctx, u32 idx, uchar *hash) {
crypto_generichash_blake2b_state state = *ctx;
u32 leb = htole32(idx / HASHESPERBLAKE);
crypto_generichash_blake2b_update(&state, (uchar *)&leb, sizeof(u32));
uchar blakehash[HASHOUT];
crypto_generichash_blake2b_final(&state, blakehash, HASHOUT);
memcpy(hash, blakehash + (idx % HASHESPERBLAKE) * WN/8, WN/8);
}
int verifyrec(const crypto_generichash_blake2b_state *ctx, u32 *indices, uchar *hash, int r) {
if (r == 0) {
genhash(ctx, *indices, hash);
return POW_OK;
}
u32 *indices1 = indices + (1 << (r-1));
if (*indices >= *indices1)
return POW_OUT_OF_ORDER;
uchar hash0[WN/8], hash1[WN/8];
int vrf0 = verifyrec(ctx, indices, hash0, r-1);
if (vrf0 != POW_OK)
return vrf0;
int vrf1 = verifyrec(ctx, indices1, hash1, r-1);
if (vrf1 != POW_OK)
return vrf1;
for (int i=0; i < WN/8; i++)
hash[i] = hash0[i] ^ hash1[i];
int i, b = r * DIGITBITS;
for (i = 0; i < b/8; i++)
if (hash[i])
return POW_NONZERO_XOR;
if ((b%8) && hash[i] >> (8-(b%8)))
return POW_NONZERO_XOR;
return POW_OK;
}
int compu32(const void *pa, const void *pb) {
u32 a = *(u32 *)pa, b = *(u32 *)pb;
return a<b ? -1 : a==b ? 0 : +1;
}
bool duped(proof prf) {
proof sortprf;
memcpy(sortprf, prf, sizeof(proof));
qsort(sortprf, PROOFSIZE, sizeof(u32), &compu32);
for (u32 i=1; i<PROOFSIZE; i++)
if (sortprf[i] <= sortprf[i-1])
return true;
return false;
}
// verify Wagner conditions
int verify(u32 indices[PROOFSIZE], const crypto_generichash_blake2b_state *ctx) {
if (duped(indices))
return POW_DUPLICATE;
uchar hash[WN/8];
return verifyrec(ctx, indices, hash, WK);
}

644
src/pow/tromp/equi_miner.h Normal file
View File

@@ -0,0 +1,644 @@
// Equihash solver
// Copyright (c) 2016 John Tromp, The Zcash developers
// Fix N, K, such that n = N/(k+1) is integer
// Fix M = 2^{n+1} hashes each of length N bits,
// H_0, ... , H_{M-1}, generated fom (n+1)-bit indices.
// Problem: find binary tree on 2^K distinct indices,
// for which the exclusive-or of leaf hashes is all 0s.
// Additionally, it should satisfy the Wagner conditions:
// for each height i subtree, the exclusive-or
// of its 2^i corresponding hashes starts with i*n 0 bits,
// and for i>0 the leftmost leaf of its left subtree
// is less than the leftmost leaf of its right subtree
// The algorithm below solves this by maintaining the trees
// in a graph of K layers, each split into buckets
// with buckets indexed by the first n-RESTBITS bits following
// the i*n 0s, each bucket having 4 * 2^RESTBITS slots,
// twice the number of subtrees expected to land there.
#include "pow/tromp/equi.h"
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>
typedef uint16_t u16;
typedef uint64_t u64;
#ifdef EQUIHASH_TROMP_ATOMIC
#include <atomic>
typedef std::atomic<u32> au32;
#else
typedef u32 au32;
#endif
#ifndef RESTBITS
#define RESTBITS 8
#endif
// 2_log of number of buckets
#define BUCKBITS (DIGITBITS-RESTBITS)
#ifndef SAVEMEM
#if RESTBITS == 4
// can't save memory in such small buckets
#define SAVEMEM 1
#elif RESTBITS >= 8
// take advantage of law of large numbers (sum of 2^8 random numbers)
// this reduces (200,9) memory to under 144MB, with negligible discarding
#define SAVEMEM 9/14
#endif
#endif
// number of buckets
static const u32 NBUCKETS = 1<<BUCKBITS;
// 2_log of number of slots per bucket
static const u32 SLOTBITS = RESTBITS+1+1;
static const u32 SLOTRANGE = 1<<SLOTBITS;
static const u32 SLOTMSB = 1<<(SLOTBITS-1);
// number of slots per bucket
static const u32 NSLOTS = SLOTRANGE * SAVEMEM;
// number of per-xhash slots
static const u32 XFULL = 16;
// SLOTBITS mask
static const u32 SLOTMASK = SLOTRANGE-1;
// number of possible values of xhash (rest of n) bits
static const u32 NRESTS = 1<<RESTBITS;
// number of blocks of hashes extracted from single 512 bit blake2b output
static const u32 NBLOCKS = (NHASHES+HASHESPERBLAKE-1)/HASHESPERBLAKE;
// nothing larger found in 100000 runs
static const u32 MAXSOLS = 8;
// tree node identifying its children as two different slots in
// a bucket on previous layer with the same rest bits (x-tra hash)
struct tree {
u32 bid_s0_s1; // manual bitfields
tree(const u32 idx) {
bid_s0_s1 = idx;
}
tree(const u32 bid, const u32 s0, const u32 s1) {
#ifdef SLOTDIFF
u32 ds10 = (s1 - s0) & SLOTMASK;
if (ds10 & SLOTMSB) {
bid_s0_s1 = (((bid << SLOTBITS) | s1) << (SLOTBITS-1)) | (SLOTMASK & ~ds10);
} else {
bid_s0_s1 = (((bid << SLOTBITS) | s0) << (SLOTBITS-1)) | (ds10 - 1);
}
#else
bid_s0_s1 = (((bid << SLOTBITS) | s0) << SLOTBITS) | s1;
#endif
}
u32 getindex() const {
return bid_s0_s1;
}
u32 bucketid() const {
#ifdef SLOTDIFF
return bid_s0_s1 >> (2 * SLOTBITS - 1);
#else
return bid_s0_s1 >> (2 * SLOTBITS);
#endif
}
u32 slotid0() const {
#ifdef SLOTDIFF
return (bid_s0_s1 >> (SLOTBITS-1)) & SLOTMASK;
#else
return (bid_s0_s1 >> SLOTBITS) & SLOTMASK;
#endif
}
u32 slotid1() const {
#ifdef SLOTDIFF
return (slotid0() + 1 + (bid_s0_s1 & (SLOTMASK>>1))) & SLOTMASK;
#else
return bid_s0_s1 & SLOTMASK;
#endif
}
};
union hashunit {
u32 word;
uchar bytes[sizeof(u32)];
};
#define WORDS(bits) ((bits + 31) / 32)
#define HASHWORDS0 WORDS(WN - DIGITBITS + RESTBITS)
#define HASHWORDS1 WORDS(WN - 2*DIGITBITS + RESTBITS)
struct slot0 {
tree attr;
hashunit hash[HASHWORDS0];
};
struct slot1 {
tree attr;
hashunit hash[HASHWORDS1];
};
// a bucket is NSLOTS treenodes
typedef slot0 bucket0[NSLOTS];
typedef slot1 bucket1[NSLOTS];
// the N-bit hash consists of K+1 n-bit "digits"
// each of which corresponds to a layer of NBUCKETS buckets
typedef bucket0 digit0[NBUCKETS];
typedef bucket1 digit1[NBUCKETS];
// size (in bytes) of hash in round 0 <= r < WK
u32 hashsize(const u32 r) {
const u32 hashbits = WN - (r+1) * DIGITBITS + RESTBITS;
return (hashbits + 7) / 8;
}
u32 hashwords(u32 bytes) {
return (bytes + 3) / 4;
}
// manages hash and tree data
struct htalloc {
u32 *heap0;
u32 *heap1;
bucket0 *trees0[(WK+1)/2];
bucket1 *trees1[WK/2];
u32 alloced;
htalloc() {
alloced = 0;
}
void alloctrees() {
// optimize xenoncat's fixed memory layout, avoiding any waste
// digit trees hashes trees hashes
// 0 0 A A A A A A . . . . . .
// 1 0 A A A A A A 1 B B B B B
// 2 0 2 C C C C C 1 B B B B B
// 3 0 2 C C C C C 1 3 D D D D
// 4 0 2 4 E E E E 1 3 D D D D
// 5 0 2 4 E E E E 1 3 5 F F F
// 6 0 2 4 6 . G G 1 3 5 F F F
// 7 0 2 4 6 . G G 1 3 5 7 H H
// 8 0 2 4 6 8 . I 1 3 5 7 H H
assert(DIGITBITS >= 16); // ensures hashes shorten by 1 unit every 2 digits
heap0 = (u32 *)alloc(1, sizeof(digit0));
heap1 = (u32 *)alloc(1, sizeof(digit1));
for (int r=0; r<WK; r++)
if ((r&1) == 0)
trees0[r/2] = (bucket0 *)(heap0 + r/2);
else
trees1[r/2] = (bucket1 *)(heap1 + r/2);
}
void dealloctrees() {
free(heap0);
free(heap1);
}
void *alloc(const u32 n, const u32 sz) {
void *mem = calloc(n, sz);
assert(mem);
alloced += n * sz;
return mem;
}
};
typedef au32 bsizes[NBUCKETS];
u32 min(const u32 a, const u32 b) {
return a < b ? a : b;
}
struct equi {
crypto_generichash_blake2b_state blake_ctx;
htalloc hta;
bsizes *nslots; // PUT IN BUCKET STRUCT
proof *sols;
au32 nsols;
u32 nthreads;
u32 xfull;
u32 hfull;
u32 bfull;
pthread_barrier_t barry;
equi(const u32 n_threads) {
assert(sizeof(hashunit) == 4);
nthreads = n_threads;
const int err = pthread_barrier_init(&barry, NULL, nthreads);
assert(!err);
hta.alloctrees();
nslots = (bsizes *)hta.alloc(2 * NBUCKETS, sizeof(au32));
sols = (proof *)hta.alloc(MAXSOLS, sizeof(proof));
}
~equi() {
hta.dealloctrees();
free(nslots);
free(sols);
}
void setstate(const crypto_generichash_blake2b_state *ctx) {
blake_ctx = *ctx;
memset(nslots, 0, NBUCKETS * sizeof(au32)); // only nslots[0] needs zeroing
nsols = 0;
}
u32 getslot(const u32 r, const u32 bucketi) {
#ifdef EQUIHASH_TROMP_ATOMIC
return std::atomic_fetch_add_explicit(&nslots[r&1][bucketi], 1U, std::memory_order_relaxed);
#else
return nslots[r&1][bucketi]++;
#endif
}
u32 getnslots(const u32 r, const u32 bid) { // SHOULD BE METHOD IN BUCKET STRUCT
au32 &nslot = nslots[r&1][bid];
const u32 n = min(nslot, NSLOTS);
nslot = 0;
return n;
}
void orderindices(u32 *indices, u32 size) {
if (indices[0] > indices[size]) {
for (u32 i=0; i < size; i++) {
const u32 tmp = indices[i];
indices[i] = indices[size+i];
indices[size+i] = tmp;
}
}
}
void listindices0(u32 r, const tree t, u32 *indices) {
if (r == 0) {
*indices = t.getindex();
return;
}
const bucket1 &buck = hta.trees1[--r/2][t.bucketid()];
const u32 size = 1 << r;
u32 *indices1 = indices + size;
listindices1(r, buck[t.slotid0()].attr, indices);
listindices1(r, buck[t.slotid1()].attr, indices1);
orderindices(indices, size);
}
void listindices1(u32 r, const tree t, u32 *indices) {
const bucket0 &buck = hta.trees0[--r/2][t.bucketid()];
const u32 size = 1 << r;
u32 *indices1 = indices + size;
listindices0(r, buck[t.slotid0()].attr, indices);
listindices0(r, buck[t.slotid1()].attr, indices1);
orderindices(indices, size);
}
void candidate(const tree t) {
proof prf;
listindices1(WK, t, prf); // assume WK odd
qsort(prf, PROOFSIZE, sizeof(u32), &compu32);
for (u32 i=1; i<PROOFSIZE; i++)
if (prf[i] <= prf[i-1])
return;
#ifdef EQUIHASH_TROMP_ATOMIC
u32 soli = std::atomic_fetch_add_explicit(&nsols, 1U, std::memory_order_relaxed);
#else
u32 soli = nsols++;
#endif
if (soli < MAXSOLS)
listindices1(WK, t, sols[soli]); // assume WK odd
}
void showbsizes(u32 r) {
#if defined(HIST) || defined(SPARK) || defined(LOGSPARK)
u32 binsizes[65];
memset(binsizes, 0, 65 * sizeof(u32));
for (u32 bucketid = 0; bucketid < NBUCKETS; bucketid++) {
u32 bsize = min(nslots[r&1][bucketid], NSLOTS) >> (SLOTBITS-6);
binsizes[bsize]++;
}
for (u32 i=0; i < 65; i++) {
#ifdef HIST
// printf(" %d:%d", i, binsizes[i]);
#else
#ifdef SPARK
u32 sparks = binsizes[i] / SPARKSCALE;
#else
u32 sparks = 0;
for (u32 bs = binsizes[i]; bs; bs >>= 1) sparks++;
sparks = sparks * 7 / SPARKSCALE;
#endif
// printf("\342\226%c", '\201' + sparks);
#endif
}
// printf("\n");
#endif
}
struct htlayout {
htalloc hta;
u32 prevhashunits;
u32 nexthashunits;
u32 dunits;
u32 prevbo;
u32 nextbo;
htlayout(equi *eq, u32 r): hta(eq->hta), prevhashunits(0), dunits(0) {
u32 nexthashbytes = hashsize(r);
nexthashunits = hashwords(nexthashbytes);
prevbo = 0;
nextbo = nexthashunits * sizeof(hashunit) - nexthashbytes; // 0-3
if (r) {
u32 prevhashbytes = hashsize(r-1);
prevhashunits = hashwords(prevhashbytes);
prevbo = prevhashunits * sizeof(hashunit) - prevhashbytes; // 0-3
dunits = prevhashunits - nexthashunits;
}
}
u32 getxhash0(const slot0* pslot) const {
#if WN == 200 && RESTBITS == 4
return pslot->hash->bytes[prevbo] >> 4;
#elif WN == 200 && RESTBITS == 8
return (pslot->hash->bytes[prevbo] & 0xf) << 4 | pslot->hash->bytes[prevbo+1] >> 4;
#elif WN == 200 && RESTBITS == 9
return (pslot->hash->bytes[prevbo] & 0x1f) << 4 | pslot->hash->bytes[prevbo+1] >> 4;
#elif WN == 144 && RESTBITS == 4
return pslot->hash->bytes[prevbo] & 0xf;
#else
#error non implemented
#endif
}
u32 getxhash1(const slot1* pslot) const {
#if WN == 200 && RESTBITS == 4
return pslot->hash->bytes[prevbo] & 0xf;
#elif WN == 200 && RESTBITS == 8
return pslot->hash->bytes[prevbo];
#elif WN == 200 && RESTBITS == 9
return (pslot->hash->bytes[prevbo]&1) << 8 | pslot->hash->bytes[prevbo+1];
#elif WN == 144 && RESTBITS == 4
return pslot->hash->bytes[prevbo] & 0xf;
#else
#error non implemented
#endif
}
bool equal(const hashunit *hash0, const hashunit *hash1) const {
return hash0[prevhashunits-1].word == hash1[prevhashunits-1].word;
}
};
struct collisiondata {
#ifdef XBITMAP
#if NSLOTS > 64
#error cant use XBITMAP with more than 64 slots
#endif
u64 xhashmap[NRESTS];
u64 xmap;
#else
#if RESTBITS <= 6
typedef uchar xslot;
#else
typedef u16 xslot;
#endif
xslot nxhashslots[NRESTS];
xslot xhashslots[NRESTS][XFULL];
xslot *xx;
u32 n0;
u32 n1;
#endif
u32 s0;
void clear() {
#ifdef XBITMAP
memset(xhashmap, 0, NRESTS * sizeof(u64));
#else
memset(nxhashslots, 0, NRESTS * sizeof(xslot));
#endif
}
bool addslot(u32 s1, u32 xh) {
#ifdef XBITMAP
xmap = xhashmap[xh];
xhashmap[xh] |= (u64)1 << s1;
s0 = -1;
return true;
#else
n1 = (u32)nxhashslots[xh]++;
if (n1 >= XFULL)
return false;
xx = xhashslots[xh];
xx[n1] = s1;
n0 = 0;
return true;
#endif
}
bool nextcollision() const {
#ifdef XBITMAP
return xmap != 0;
#else
return n0 < n1;
#endif
}
u32 slot() {
#ifdef XBITMAP
const u32 ffs = __builtin_ffsll(xmap);
s0 += ffs; xmap >>= ffs;
return s0;
#else
return (u32)xx[n0++];
#endif
}
};
void digit0(const u32 id) {
uchar hash[HASHOUT];
crypto_generichash_blake2b_state state;
htlayout htl(this, 0);
const u32 hashbytes = hashsize(0);
for (u32 block = id; block < NBLOCKS; block += nthreads) {
state = blake_ctx;
u32 leb = htole32(block);
crypto_generichash_blake2b_update(&state, (uchar *)&leb, sizeof(u32));
crypto_generichash_blake2b_final(&state, hash, HASHOUT);
for (u32 i = 0; i<HASHESPERBLAKE; i++) {
const uchar *ph = hash + i * WN/8;
#if BUCKBITS == 16 && RESTBITS == 4
const u32 bucketid = ((u32)ph[0] << 8) | ph[1];
#elif BUCKBITS == 12 && RESTBITS == 8
const u32 bucketid = ((u32)ph[0] << 4) | ph[1] >> 4;
#elif BUCKBITS == 11 && RESTBITS == 9
const u32 bucketid = ((u32)ph[0] << 3) | ph[1] >> 5;
#elif BUCKBITS == 20 && RESTBITS == 4
const u32 bucketid = ((((u32)ph[0] << 8) | ph[1]) << 4) | ph[2] >> 4;
#elif BUCKBITS == 12 && RESTBITS == 4
const u32 bucketid = ((u32)ph[0] << 4) | ph[1] >> 4;
const u32 xhash = ph[1] & 0xf;
#else
#error not implemented
#endif
const u32 slot = getslot(0, bucketid);
if (slot >= NSLOTS) {
bfull++;
continue;
}
slot0 &s = hta.trees0[0][bucketid][slot];
s.attr = tree(block * HASHESPERBLAKE + i);
memcpy(s.hash->bytes+htl.nextbo, ph+WN/8-hashbytes, hashbytes);
}
}
}
void digitodd(const u32 r, const u32 id) {
htlayout htl(this, r);
collisiondata cd;
for (u32 bucketid=id; bucketid < NBUCKETS; bucketid += nthreads) {
cd.clear();
slot0 *buck = htl.hta.trees0[(r-1)/2][bucketid]; // optimize by updating previous buck?!
u32 bsize = getnslots(r-1, bucketid); // optimize by putting bucketsize with block?!
for (u32 s1 = 0; s1 < bsize; s1++) {
const slot0 *pslot1 = buck + s1; // optimize by updating previous pslot1?!
if (!cd.addslot(s1, htl.getxhash0(pslot1))) {
xfull++;
continue;
}
for (; cd.nextcollision(); ) {
const u32 s0 = cd.slot();
const slot0 *pslot0 = buck + s0;
if (htl.equal(pslot0->hash, pslot1->hash)) {
hfull++;
continue;
}
u32 xorbucketid;
const uchar *bytes0 = pslot0->hash->bytes, *bytes1 = pslot1->hash->bytes;
#if WN == 200 && BUCKBITS == 12 && RESTBITS == 8
xorbucketid = (((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) & 0xf) << 8)
| (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]);
#elif WN == 200 && BUCKBITS == 11 && RESTBITS == 9
xorbucketid = (((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) & 0xf) << 7)
| (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) >> 1;
#elif WN == 144 && BUCKBITS == 20 && RESTBITS == 4
xorbucketid = ((((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 8)
| (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2])) << 4)
| (bytes0[htl.prevbo+3] ^ bytes1[htl.prevbo+3]) >> 4;
#elif WN == 96 && BUCKBITS == 12 && RESTBITS == 4
xorbucketid = ((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 4)
| (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) >> 4;
#else
#error not implemented
#endif
const u32 xorslot = getslot(r, xorbucketid);
if (xorslot >= NSLOTS) {
bfull++;
continue;
}
slot1 &xs = htl.hta.trees1[r/2][xorbucketid][xorslot];
xs.attr = tree(bucketid, s0, s1);
for (u32 i=htl.dunits; i < htl.prevhashunits; i++)
xs.hash[i-htl.dunits].word = pslot0->hash[i].word ^ pslot1->hash[i].word;
}
}
}
}
void digiteven(const u32 r, const u32 id) {
htlayout htl(this, r);
collisiondata cd;
for (u32 bucketid=id; bucketid < NBUCKETS; bucketid += nthreads) {
cd.clear();
slot1 *buck = htl.hta.trees1[(r-1)/2][bucketid]; // OPTIMIZE BY UPDATING PREVIOUS
u32 bsize = getnslots(r-1, bucketid);
for (u32 s1 = 0; s1 < bsize; s1++) {
const slot1 *pslot1 = buck + s1; // OPTIMIZE BY UPDATING PREVIOUS
if (!cd.addslot(s1, htl.getxhash1(pslot1))) {
xfull++;
continue;
}
for (; cd.nextcollision(); ) {
const u32 s0 = cd.slot();
const slot1 *pslot0 = buck + s0;
if (htl.equal(pslot0->hash, pslot1->hash)) {
hfull++;
continue;
}
u32 xorbucketid;
const uchar *bytes0 = pslot0->hash->bytes, *bytes1 = pslot1->hash->bytes;
#if WN == 200 && BUCKBITS == 12 && RESTBITS == 8
xorbucketid = ((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 4)
| (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) >> 4;
#elif WN == 200 && BUCKBITS == 11 && RESTBITS == 9
xorbucketid = ((u32)(bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) << 3)
| (bytes0[htl.prevbo+3] ^ bytes1[htl.prevbo+3]) >> 5;
#elif WN == 144 && BUCKBITS == 20 && RESTBITS == 4
xorbucketid = ((((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 8)
| (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2])) << 4)
| (bytes0[htl.prevbo+3] ^ bytes1[htl.prevbo+3]) >> 4;
#elif WN == 96 && BUCKBITS == 12 && RESTBITS == 4
xorbucketid = ((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 4)
| (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) >> 4;
#else
#error not implemented
#endif
const u32 xorslot = getslot(r, xorbucketid);
if (xorslot >= NSLOTS) {
bfull++;
continue;
}
slot0 &xs = htl.hta.trees0[r/2][xorbucketid][xorslot];
xs.attr = tree(bucketid, s0, s1);
for (u32 i=htl.dunits; i < htl.prevhashunits; i++)
xs.hash[i-htl.dunits].word = pslot0->hash[i].word ^ pslot1->hash[i].word;
}
}
}
}
void digitK(const u32 id) {
collisiondata cd;
htlayout htl(this, WK);
u32 nc = 0;
for (u32 bucketid = id; bucketid < NBUCKETS; bucketid += nthreads) {
cd.clear();
slot0 *buck = htl.hta.trees0[(WK-1)/2][bucketid];
u32 bsize = getnslots(WK-1, bucketid);
for (u32 s1 = 0; s1 < bsize; s1++) {
const slot0 *pslot1 = buck + s1;
if (!cd.addslot(s1, htl.getxhash0(pslot1))) // assume WK odd
continue;
for (; cd.nextcollision(); ) {
const u32 s0 = cd.slot();
if (htl.equal(buck[s0].hash, pslot1->hash))
nc++, candidate(tree(bucketid, s0, s1));
}
}
}
//printf(" %d candidates ", nc);
}
};
typedef struct {
u32 id;
pthread_t thread;
equi *eq;
} thread_ctx;
void barrier(pthread_barrier_t *barry) {
const int rc = pthread_barrier_wait(barry);
if (rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {
// printf("Could not wait on barrier\n");
pthread_exit(NULL);
}
}
void *worker(void *vp) {
thread_ctx *tp = (thread_ctx *)vp;
equi *eq = tp->eq;
if (tp->id == 0)
// printf("Digit 0\n");
barrier(&eq->barry);
eq->digit0(tp->id);
barrier(&eq->barry);
if (tp->id == 0) {
eq->xfull = eq->bfull = eq->hfull = 0;
eq->showbsizes(0);
}
barrier(&eq->barry);
for (u32 r = 1; r < WK; r++) {
if (tp->id == 0)
// printf("Digit %d", r);
barrier(&eq->barry);
r&1 ? eq->digitodd(r, tp->id) : eq->digiteven(r, tp->id);
barrier(&eq->barry);
if (tp->id == 0) {
// printf(" x%d b%d h%d\n", eq->xfull, eq->bfull, eq->hfull);
eq->xfull = eq->bfull = eq->hfull = 0;
eq->showbsizes(r);
}
barrier(&eq->barry);
}
if (tp->id == 0)
// printf("Digit %d\n", WK);
eq->digitK(tp->id);
barrier(&eq->barry);
pthread_exit(NULL);
return 0;
}

Some files were not shown because too many files have changed in this diff Show More