summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmir Taaki <genjix@riseup.net>2014-04-16 16:24:53 (GMT)
committer Amir Taaki <genjix@riseup.net>2014-04-16 16:24:53 (GMT)
commit2258b5daa7a613167c7941b93680a16b062076fa (patch)
tree43f899e4d45c0412a9684893cf243119bfebb7e5
parent4c8f51db78b63d7c9c3d5e283701274b62493220 (diff)
repo is moved!
-rw-r--r--AUTHORS29
-rw-r--r--COPYING661
-rw-r--r--ChangeLog2
-rw-r--r--Doxyfile1716
-rw-r--r--HACKING15
-rw-r--r--INSTALL385
-rw-r--r--LICENSE686
-rw-r--r--Makefile.am38
-rw-r--r--NEWS0
-rw-r--r--README137
-rw-r--r--README.md3
-rw-r--r--autogen.sh3
-rw-r--r--builds/msvc/.gitignore3
-rw-r--r--builds/msvc/README.md7
-rw-r--r--builds/msvc/vs2013/examples/libbitcoin_examples.props78
-rw-r--r--builds/msvc/vs2013/examples/libbitcoin_examples.vcxproj215
-rw-r--r--builds/msvc/vs2013/examples/libbitcoin_examples.vcxproj.filters49
-rw-r--r--builds/msvc/vs2013/examples/packages.config19
-rw-r--r--builds/msvc/vs2013/libbitcoin.import.props79
-rw-r--r--builds/msvc/vs2013/libbitcoin.import.xml34
-rw-r--r--builds/msvc/vs2013/libbitcoin.sln78
-rw-r--r--builds/msvc/vs2013/libbitcoin/libbitcoin.props71
-rw-r--r--builds/msvc/vs2013/libbitcoin/libbitcoin.vcxproj326
-rw-r--r--builds/msvc/vs2013/libbitcoin/libbitcoin.vcxproj.filters329
-rw-r--r--builds/msvc/vs2013/libbitcoin/libbitcoin.xml20
-rw-r--r--builds/msvc/vs2013/libbitcoin/packages.config11
-rw-r--r--builds/msvc/vs2013/libbitcoin/readme.txt5
-rw-r--r--builds/msvc/vs2013/packages.config19
-rw-r--r--builds/msvc/vs2013/properties/Common.props26
-rw-r--r--builds/msvc/vs2013/properties/Console.props20
-rw-r--r--builds/msvc/vs2013/properties/ConsoleDebugDynamic.props21
-rw-r--r--builds/msvc/vs2013/properties/ConsoleDebugLinkTimeCodeGeneration.props21
-rw-r--r--builds/msvc/vs2013/properties/ConsoleDebugStatic.props20
-rw-r--r--builds/msvc/vs2013/properties/ConsoleReleaseDynamic.props20
-rw-r--r--builds/msvc/vs2013/properties/ConsoleReleaseLinkTimeCodeGeneration.props20
-rw-r--r--builds/msvc/vs2013/properties/ConsoleReleaseStatic.props19
-rw-r--r--builds/msvc/vs2013/properties/Debug.props28
-rw-r--r--builds/msvc/vs2013/properties/Dynamic.props18
-rw-r--r--builds/msvc/vs2013/properties/DynamicDebug.props21
-rw-r--r--builds/msvc/vs2013/properties/DynamicRelease.props20
-rw-r--r--builds/msvc/vs2013/properties/LinkTimeCodeGeneration.props20
-rw-r--r--builds/msvc/vs2013/properties/Release.props40
-rw-r--r--builds/msvc/vs2013/properties/Static.props18
-rw-r--r--builds/msvc/vs2013/properties/StaticDebug.props21
-rw-r--r--builds/msvc/vs2013/properties/StaticDebugLinkTimeCodeGeneration.props21
-rw-r--r--builds/msvc/vs2013/properties/StaticLinkTimeCodeGeneration.props17
-rw-r--r--builds/msvc/vs2013/properties/StaticRelease.props20
-rw-r--r--builds/msvc/vs2013/properties/StaticReleaseLinkTimeCodeGeneration.props20
-rw-r--r--builds/msvc/vs2013/properties/Win32.props20
-rw-r--r--builds/msvc/vs2013/properties/x64.props23
-rw-r--r--configure.ac58
-rw-r--r--doc/README.tutorial13
-rw-r--r--doc/libbitcoin/README2
-rw-r--r--doc/libbitcoin/drawing.svg929
-rw-r--r--doc/libbitcoin/index.html66
-rw-r--r--doc/libbitcoin/inner_core.pngbin43777 -> 0 bytes
-rw-r--r--doc/libbitcoin/make_transaction.pngbin19883 -> 0 bytes
-rw-r--r--doc/libbitcoin/multiple_currencies.pngbin20901 -> 0 bytes
-rw-r--r--doc/libbitcoin/pluggable.pngbin47937 -> 0 bytes
-rw-r--r--doc/libbitcoin/python_layer.pngbin14921 -> 0 bytes
-rw-r--r--doc/libbitcoin/switching_nets.pngbin22625 -> 0 bytes
-rw-r--r--doc/libbitcoin/switching_serialisers.pngbin27536 -> 0 bytes
-rw-r--r--doc/sphinx/Makefile153
-rw-r--r--doc/sphinx/blockchain.rst495
-rw-r--r--doc/sphinx/conf.py243
-rw-r--r--doc/sphinx/crypto.rst260
-rw-r--r--doc/sphinx/examples/accept.rst91
-rw-r--r--doc/sphinx/examples/balance.rst77
-rw-r--r--doc/sphinx/examples/connect.rst71
-rw-r--r--doc/sphinx/examples/determ.rst51
-rw-r--r--doc/sphinx/examples/display-last.rst105
-rw-r--r--doc/sphinx/examples/fullnode.rst332
-rw-r--r--doc/sphinx/examples/initchain.rst58
-rw-r--r--doc/sphinx/examples/priv.rst118
-rw-r--r--doc/sphinx/examples/proto.rst96
-rw-r--r--doc/sphinx/examples/satoshiwords.rst37
-rw-r--r--doc/sphinx/examples/txrad.rst223
-rw-r--r--doc/sphinx/fullnode.rst396
-rw-r--r--doc/sphinx/img/operations.pngbin24408 -> 0 bytes
-rw-r--r--doc/sphinx/index.rst42
-rw-r--r--doc/sphinx/introduction.rst145
-rw-r--r--doc/sphinx/make.bat190
-rw-r--r--doc/sphinx/network.rst566
-rw-r--r--doc/sphinx/offlinetx.rst27
-rw-r--r--doc/sphinx/overview.rst361
-rw-r--r--doc/sphinx/quickstart.rst24
-rw-r--r--doc/style75
-rw-r--r--examples/Makefile76
-rw-r--r--examples/README10
-rw-r--r--examples/accept.cpp109
-rw-r--r--examples/balance.cpp89
-rwxr-xr-xexamples/blocks.sh22
-rw-r--r--examples/connect.cpp88
-rw-r--r--examples/display-last.cpp114
-rw-r--r--examples/fullnode.cpp349
-rw-r--r--examples/initchain.cpp94
-rw-r--r--examples/priv.cpp132
-rw-r--r--examples/proto.cpp109
-rw-r--r--examples/query-stealth.cpp64
-rw-r--r--examples/satoshiwords.cpp51
-rw-r--r--examples/txrad.cpp236
-rw-r--r--include/bitcoin/Makefile.am72
-rw-r--r--include/bitcoin/address.hpp127
-rw-r--r--include/bitcoin/bitcoin.hpp207
-rw-r--r--include/bitcoin/block.hpp56
-rw-r--r--include/bitcoin/blockchain/blockchain.hpp439
-rw-r--r--include/bitcoin/blockchain/database/stealth_database.hpp75
-rw-r--r--include/bitcoin/blockchain/leveldb_blockchain.hpp211
-rw-r--r--include/bitcoin/blockchain/organizer.hpp133
-rw-r--r--include/bitcoin/constants.hpp101
-rw-r--r--include/bitcoin/define.hpp60
-rw-r--r--include/bitcoin/error.hpp122
-rw-r--r--include/bitcoin/format.hpp142
-rw-r--r--include/bitcoin/getx_responder.hpp68
-rw-r--r--include/bitcoin/impl/serialize/block.ipp185
-rw-r--r--include/bitcoin/impl/serialize/misc.ipp294
-rw-r--r--include/bitcoin/impl/utility/serializer.ipp359
-rw-r--r--include/bitcoin/network/channel.hpp341
-rw-r--r--include/bitcoin/network/handshake.hpp99
-rw-r--r--include/bitcoin/network/hosts.hpp88
-rw-r--r--include/bitcoin/network/network.hpp88
-rw-r--r--include/bitcoin/network/protocol.hpp349
-rw-r--r--include/bitcoin/network/shared_const_buffer.hpp63
-rw-r--r--include/bitcoin/poller.hpp62
-rw-r--r--include/bitcoin/primitives.hpp178
-rw-r--r--include/bitcoin/satoshi_serialize.hpp157
-rw-r--r--include/bitcoin/script.hpp317
-rw-r--r--include/bitcoin/session.hpp142
-rw-r--r--include/bitcoin/stealth.hpp40
-rw-r--r--include/bitcoin/threadpool.hpp218
-rw-r--r--include/bitcoin/transaction.hpp61
-rw-r--r--include/bitcoin/transaction_indexer.hpp146
-rw-r--r--include/bitcoin/transaction_pool.hpp211
-rw-r--r--include/bitcoin/types.hpp101
-rw-r--r--include/bitcoin/utility/assert.hpp33
-rw-r--r--include/bitcoin/utility/async_parallel.hpp93
-rw-r--r--include/bitcoin/utility/base58.hpp37
-rw-r--r--include/bitcoin/utility/big_number.hpp105
-rw-r--r--include/bitcoin/utility/decorator.hpp64
-rw-r--r--include/bitcoin/utility/elliptic_curve_key.hpp62
-rw-r--r--include/bitcoin/utility/logger.hpp89
-rw-r--r--include/bitcoin/utility/mmfile.hpp45
-rw-r--r--include/bitcoin/utility/ripemd.hpp38
-rw-r--r--include/bitcoin/utility/serializer.hpp220
-rw-r--r--include/bitcoin/utility/sha256.hpp39
-rw-r--r--include/bitcoin/utility/subscriber.hpp88
-rw-r--r--include/bitcoin/utility/timed_section.hpp52
-rw-r--r--include/bitcoin/utility/weak_bind.hpp71
-rw-r--r--include/bitcoin/validate.hpp150
-rw-r--r--include/bitcoin/version.hpp42
-rw-r--r--libbitcoin.pc.in14
-rw-r--r--m4/.gitignore2
-rw-r--r--m4/ax_berkeley_db_cxx.m4112
-rw-r--r--m4/ax_boost_base.m4258
-rw-r--r--m4/ax_boost_system.m4120
-rw-r--r--m4/ax_boost_thread.m4153
-rw-r--r--m4/ax_cxx_compile_stdcxx_11.m4133
-rw-r--r--src/Makefile.am51
-rw-r--r--src/address.cpp175
-rw-r--r--src/block.cpp151
-rw-r--r--src/blockchain/blockchain.cpp215
-rw-r--r--src/blockchain/database/mman_win32.c191
-rw-r--r--src/blockchain/database/mman_win32.h58
-rw-r--r--src/blockchain/database/stealth_database.cpp124
-rw-r--r--src/blockchain/leveldb/leveldb_blockchain.cpp749
-rw-r--r--src/blockchain/leveldb/leveldb_chain_keeper.cpp191
-rw-r--r--src/blockchain/leveldb/leveldb_chain_keeper.hpp57
-rw-r--r--src/blockchain/leveldb/leveldb_common.cpp446
-rw-r--r--src/blockchain/leveldb/leveldb_common.hpp143
-rw-r--r--src/blockchain/leveldb/leveldb_organizer.cpp66
-rw-r--r--src/blockchain/leveldb/leveldb_organizer.hpp54
-rw-r--r--src/blockchain/leveldb/leveldb_validate_block.cpp196
-rw-r--r--src/blockchain/leveldb/leveldb_validate_block.hpp66
-rw-r--r--src/blockchain/organizer.cpp283
-rw-r--r--src/constants.cpp40
-rw-r--r--src/error.cpp193
-rw-r--r--src/format.cpp102
-rw-r--r--src/getx_responder.cpp115
-rw-r--r--src/network/channel.cpp619
-rw-r--r--src/network/handshake.cpp266
-rw-r--r--src/network/hosts.cpp151
-rw-r--r--src/network/network.cpp187
-rw-r--r--src/network/protocol.cpp618
-rw-r--r--src/poller.cpp175
-rw-r--r--src/satoshi_serialize.cpp203
-rw-r--r--src/script.cpp2139
-rw-r--r--src/session.cpp182
-rw-r--r--src/stealth.cpp62
-rw-r--r--src/threadpool.cpp82
-rw-r--r--src/transaction.cpp177
-rw-r--r--src/transaction_indexer.cpp286
-rw-r--r--src/transaction_pool.cpp205
-rw-r--r--src/utility/base58.cpp121
-rw-r--r--src/utility/big_number.cpp406
-rw-r--r--src/utility/elliptic_curve_key.cpp207
-rw-r--r--src/utility/logger.cpp133
-rw-r--r--src/utility/mmfile.cpp74
-rw-r--r--src/utility/ripemd.cpp47
-rw-r--r--src/utility/sha256.cpp50
-rw-r--r--src/utility/timed_section.cpp134
-rw-r--r--src/validate.cpp899
-rw-r--r--test/fakechain/Makefile12
-rw-r--r--test/fakechain/fake.cpp444
-rw-r--r--test/fakechain/privkey1
-rwxr-xr-xtest/fakechain/run.sh25
-rw-r--r--test/fakechain/step.hpp91
-rw-r--r--test/format.cpp32
-rw-r--r--test/main.cpp23
-rwxr-xr-xtest/make.sh36
-rw-r--r--test/oldtests/1vaynert.cpp51
-rw-r--r--test/oldtests/addr.cpp55
-rw-r--r--test/oldtests/base58-test.cpp33
-rw-r--r--test/oldtests/bdb-last.cpp53
-rw-r--r--test/oldtests/bdb-test.cpp284
-rw-r--r--test/oldtests/big-number-test.cpp61
-rw-r--r--test/oldtests/bip16/block-44987.testnet1
-rw-r--r--test/oldtests/bip16/block-44989.testnet1
-rw-r--r--test/oldtests/bip16/hachem.cpp49
-rw-r--r--test/oldtests/bip16/make.sh21
-rw-r--r--test/oldtests/bip16/raw_block44987.cpp26556
-rw-r--r--test/oldtests/bip16/raw_block44989.cpp18701
-rw-r--r--test/oldtests/block-hash.cpp76
-rw-r--r--test/oldtests/blockchain.cpp372
-rw-r--r--test/oldtests/chanstop.cpp74
-rw-r--r--test/oldtests/checksig.cpp75
-rw-r--r--test/oldtests/clock-test.cpp30
-rw-r--r--test/oldtests/corot.cpp110
-rw-r--r--test/oldtests/crap/main.cpp459
-rw-r--r--test/oldtests/determ.cpp58
-rw-r--r--test/oldtests/development-makefile547
-rw-r--r--test/oldtests/ec-key.cpp136
-rw-r--r--test/oldtests/echo.cpp99
-rw-r--r--test/oldtests/exporter-test.cpp48
-rw-r--r--test/oldtests/feeder.cpp93
-rw-r--r--test/oldtests/fork-blks/README2
-rw-r--r--test/oldtests/fork-blks/blk01
-rw-r--r--test/oldtests/fork-blks/blk11
-rw-r--r--test/oldtests/fork-blks/blk21
-rw-r--r--test/oldtests/fork-blks/blkspec1
-rw-r--r--test/oldtests/gengen.cpp125
-rw-r--r--test/oldtests/getx.cpp97
-rw-r--r--test/oldtests/hmac512.cpp208
-rw-r--r--test/oldtests/hosts-test.cpp75
-rw-r--r--test/oldtests/import-test.cpp165
-rw-r--r--test/oldtests/irc.cpp39
-rw-r--r--test/oldtests/kyot.cpp46
-rw-r--r--test/oldtests/logtst.cpp59
-rw-r--r--test/oldtests/memcheck/begin.cpp28
-rw-r--r--test/oldtests/memcheck/curl.supp24
-rwxr-xr-xtest/oldtests/memcheck/make.sh23
-rw-r--r--test/oldtests/mempool.cpp123
-rw-r--r--test/oldtests/merkle.cpp86
-rw-r--r--test/oldtests/minikey.cpp384
-rw-r--r--test/oldtests/net.cpp117
-rw-r--r--test/oldtests/pol.cpp65
-rw-r--r--test/oldtests/priv.cpp31
-rw-r--r--test/oldtests/protst.cpp79
-rw-r--r--test/oldtests/psql.cpp137
-rw-r--r--test/oldtests/reorg/Makefile3
-rw-r--r--test/oldtests/reorg/chains.hpp57
-rw-r--r--test/oldtests/reorg/main.cpp229
-rw-r--r--test/oldtests/reorg/reorg.cpp177
-rw-r--r--test/oldtests/script-test.cpp115
-rw-r--r--test/oldtests/scritp.cpp229
-rw-r--r--test/oldtests/serial-test.cpp41
-rw-r--r--test/oldtests/sesh.cpp215
-rw-r--r--test/oldtests/subscribe.cpp78
-rw-r--r--test/oldtests/tx-hash.cpp99
-rw-r--r--test/oldtests/types-test.cpp53
-rw-r--r--test/oldtests/verify-block.cpp66
-rw-r--r--test/python/scrjson.py58
-rw-r--r--test/serial.cpp142
-rw-r--r--test/stealth.cpp31
-rw-r--r--tools/Makefile28
-rw-r--r--tools/bootstrap-fast.cpp192
-rw-r--r--tools/bootstrap.cpp262
-rw-r--r--tools/detect-network.cpp43
-rw-r--r--tools/verifier/README14
-rw-r--r--tools/verifier/check_binfo_json.py19
-rw-r--r--tools/verifier/cmp_binfo.py104
-rw-r--r--tools/verifier/cmp_history.py74
-rw-r--r--tools/verifier/fetch-history.cpp83
-rw-r--r--tools/verifier/final_check.py21
-rw-r--r--tools/verifier/query_binfo.py37
284 files changed, 3 insertions, 83851 deletions
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index eae072d..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,29 +0,0 @@
-Authors:
-
-* Robert Williamson
- Development. Added support for testnet.
-
-* Eric Voskuil
- Windows port and code cleanup.
-
-* William Swanson
- Android port and wallet code development.
-
-* Amir Taaki (genjix)
- Development
- amir@unsystem.net
-
-* Patrick Strateman (phantomcircuit)
- Development. Early contributor.
-
-* Denis Roio (jaromil)
- Hosting.
-
-Thanks:
-
-Kamil Domański (kdomanski)
-Jan Engelhardt (se7) <jengelh@medozas.de>
-
-Aaron Williamson (SFLC) and Richard Stallman (FSF) for the license,
-Luke Dashjr for pointing out OpenSSL license conflict.
-
diff --git a/COPYING b/COPYING
deleted file mode 100644
index dba13ed..0000000
--- a/COPYING
+++ /dev/null
@@ -1,661 +0,0 @@
- 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/>.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index 800d7ea..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,2 +0,0 @@
-Run:
- git log
diff --git a/Doxyfile b/Doxyfile
deleted file mode 100644
index c34f0b1..0000000
--- a/Doxyfile
+++ /dev/null
@@ -1,1716 +0,0 @@
-# Doxyfile 1.7.4
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME = libbitcoin
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER =
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer
-# a quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF = Bitcoin toolkit library for asynchonrous apps
-
-# With the PROJECT_LOGO tag one can specify an logo or icon that is
-# included in the documentation. The maximum height of the logo should not
-# exceed 55 pixels and the maximum width should not exceed 200 pixels.
-# Doxygen will copy the logo to the output directory.
-
-PROJECT_LOGO =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = doc/api/
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
-# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
-# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
-# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
-
-OUTPUT_LANGUAGE = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful if your file system
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like regular Qt-style comments
-# (thus requiring an explicit @brief command for a brief description.)
-
-JAVADOC_AUTOBRIEF = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
-# interpret the first line (until the first dot) of a Qt-style
-# comment as the brief description. If set to NO, the comments
-# will behave just like regular Qt-style comments (thus requiring
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
-INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 4
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for
-# Java. For instance, namespaces will be presented as packages, qualified
-# scopes will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources only. Doxygen will then generate output that is more tailored for
-# Fortran.
-
-OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for
-# VHDL.
-
-OPTIMIZE_OUTPUT_VHDL = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given extension.
-# Doxygen has a built-in mapping, but you can override or extend it using this
-# tag. The format is ext=language, where ext is a file extension, and language
-# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
-# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
-# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
-# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
-# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
-
-EXTENSION_MAPPING =
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also makes the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT = YES
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-
-CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
-# Doxygen will parse them like normal C++ but will assume all classes use public
-# instead of private inheritance when no explicit protection keyword is present.
-
-SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate getter
-# and setter methods for a property. Setting this option to YES (the default)
-# will make doxygen replace the get and set methods by a property in the
-# documentation. This will only work if the methods are indeed getting or
-# setting a simple type. If this is not the case, or you want to show the
-# methods anyway, you should set this option to NO.
-
-IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
-SUBGROUPING = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
-# unions are shown inside the group in which they are included (e.g. using
-# @ingroup) instead of on a separate page (for HTML and Man pages) or
-# section (for LaTeX and RTF).
-
-INLINE_GROUPED_CLASSES = NO
-
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
-# is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically
-# be useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT = NO
-
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-# determine which symbols to keep in memory and which to flush to disk.
-# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penalty.
-# If the system has enough physical memory increasing the cache will improve the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will roughly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols
-
-SYMBOL_CACHE_SIZE = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base
-# name of the file that contains the anonymous namespace. By default
-# anonymous namespaces are hidden.
-
-EXTRACT_ANON_NSPACES = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
-# will list include files with double quotes in the documentation
-# rather than with sharp brackets.
-
-FORCE_LOCAL_INCLUDES = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
-SORT_BRIEF_DOCS = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
-# will sort the (brief and detailed) documentation of class members so that
-# constructors and destructors are listed first. If set to NO (the default)
-# the constructors will appear in the respective orders defined by
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
-# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
-# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
-# hierarchy of group names into alphabetical order. If set to NO (the default)
-# the group names will appear in their defined order.
-
-SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
-# do proper type resolution of all parameters of a function it will reject a
-# match between the prototype and the implementation of a member function even
-# if there is only one candidate or it is obvious which candidate to choose
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
-# will still accept a match between prototype and implementation in such cases.
-
-STRICT_PROTO_MATCHING = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
-GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or macro consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and macros in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES = YES
-
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES = NO
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the
-# Folder Tree View (if specified). The default is YES.
-
-SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
-# Namespaces page.
-# This will remove the Namespaces entry from the Quick Index
-# and from the Folder Tree View (if specified). The default is YES.
-
-SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. The create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option.
-# You can optionally specify a file name after the option, if omitted
-# DoxygenLayout.xml will be used as the name of the layout file.
-
-LAYOUT_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR = YES
-
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
-WARN_NO_PARAMDOC = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = include/bitcoin/ include/bitcoin/blockchain include/bitcoin/network include/bitcoin/utility
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
-# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
-# the list of possible encodings.
-
-INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
-# *.f90 *.f *.for *.vhd *.vhdl
-
-FILE_PATTERNS =
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-# If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.
-# Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.
-# The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty or if
-# non of the patterns match the file name, INPUT_FILTER is applied.
-
-FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
-# and it is also possible to disable source filtering for a specific pattern
-# using *.ext= (so without naming a filter). This option only has effect when
-# FILTER_SOURCE_FILES is enabled.
-
-FILTER_SOURCE_PATTERNS =
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES
-# then for each documented function all documented
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
-REFERENCES_RELATION = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.
-# Otherwise they will link to the documentation.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
-USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header. Note that when using a custom header you are responsible
-# for the proper inclusion of any scripts and style sheets that doxygen
-# needs, which is dependent on the configuration options used.
-# It is adviced to generate a default header using "doxygen -w html
-# header.html footer.html stylesheet.css YourConfigFile" and then modify
-# that header. Note that the header is subject to change so you typically
-# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW!
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that
-# the files will be copied as-is; there are no commands or markers available.
-
-HTML_EXTRA_FILES =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
-# Doxygen will adjust the colors in the stylesheet and background images
-# according to this color. Hue is specified as an angle on a colorwheel,
-# see http://en.wikipedia.org/wiki/Hue for more information.
-# For instance the value 0 represents red, 60 is yellow, 120 is green,
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
-# The allowed range is 0 to 359.
-
-HTML_COLORSTYLE_HUE = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
-# the colors in the HTML output. For a value of 0 the output will use
-# grayscales only. A value of 255 will produce the most vivid colors.
-
-HTML_COLORSTYLE_SAT = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
-# the luminance component of the colors in the HTML output. Values below
-# 100 gradually make the output lighter, whereas values above 100 make
-# the output darker. The value divided by 100 is the actual gamma applied,
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
-# and 100 does not change the gamma.
-
-HTML_COLORSTYLE_GAMMA = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting
-# this to NO can help when comparing the output of multiple runs.
-
-HTML_TIMESTAMP = YES
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded. For this to work a browser that supports
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
-
-HTML_DYNAMIC_SECTIONS = NO
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files
-# will be generated that can be used as input for Apple's Xcode 3
-# integrated development environment, introduced with OSX 10.5 (Leopard).
-# To create a documentation set, doxygen will generate a Makefile in the
-# HTML output directory. Running make will produce the docset in that
-# directory and running "make install" will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
-# it at startup.
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-
-GENERATE_DOCSET = NO
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
-# feed. A documentation feed provides an umbrella under which multiple
-# documentation sets from a single provider (such as a company or product suite)
-# can be grouped.
-
-DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
-# should uniquely identify the documentation set bundle. This should be a
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
-# will append .docset to the name.
-
-DOCSET_BUNDLE_ID = org.doxygen.Project
-
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-
-DOCSET_PUBLISHER_ID = org.doxygen.Publisher
-
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
-
-DOCSET_PUBLISHER_NAME = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-# content.
-
-CHM_INDEX_ENCODING =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
-# that can be used as input for Qt's qhelpgenerator to generate a
-# Qt Compressed Help (.qch) of the generated HTML documentation.
-
-GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
-# be used to specify the file name of the resulting .qch file.
-# The path specified is relative to the HTML output folder.
-
-QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#namespace
-
-QHP_NAMESPACE = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
-
-QHP_VIRTUAL_FOLDER = doc
-
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
-# add. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
-
-QHP_CUST_FILTER_NAME =
-
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
-# Qt Help Project / Custom Filters</a>.
-
-QHP_CUST_FILTER_ATTRS =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's
-# filter section matches.
-# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
-# Qt Help Project / Filter Attributes</a>.
-
-QHP_SECT_FILTER_ATTRS =
-
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
-# be used to specify the location of Qt's qhelpgenerator.
-# If non-empty doxygen will try to run qhelpgenerator on the generated
-# .qhp file.
-
-QHG_LOCATION =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
-# will be generated, which together with the HTML files, form an Eclipse help
-# plugin. To install this plugin and make it available under the help contents
-# menu in Eclipse, the contents of the directory containing the HTML and XML
-# files needs to be copied into the plugins directory of eclipse. The name of
-# the directory within the plugins directory should be the same as
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
-# the help appears.
-
-GENERATE_ECLIPSEHELP = NO
-
-# A unique identifier for the eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have
-# this name.
-
-ECLIPSE_DOC_ID = org.doxygen.Project
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML
-# documentation. Note that a value of 0 will completely suppress the enum
-# values from appearing in the overview section.
-
-ENUM_VALUES_PER_LINE = 4
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information.
-# If the tag value is set to YES, a side panel will be generated
-# containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
-# Windows users are probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW = NO
-
-# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
-# and Class Hierarchy pages using a tree view instead of an ordered list.
-
-USE_INLINE_TREES = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH = 250
-
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
-# links to external symbols imported via tag files in a separate window.
-
-EXT_LINKS_IN_WINDOW = NO
-
-# Use this tag to change the font size of Latex formulas included
-# as images in the HTML documentation. The default is 10. Note that
-# when you change the font size after a successful doxygen run you need
-# to manually remove any form_*.png images from the HTML output directory
-# to force them to be regenerated.
-
-FORMULA_FONTSIZE = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are
-# not supported properly for IE 6.0, but are supported on all modern browsers.
-# Note that when changing this option you need to delete any form_*.png files
-# in the HTML output before the changes have effect.
-
-FORMULA_TRANSPARENT = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
-# (see http://www.mathjax.org) which uses client side Javascript for the
-# rendering instead of using prerendered bitmaps. Use this if you do not
-# have LaTeX installed or if you want to formulas look prettier in the HTML
-# output. When enabled you also need to install MathJax separately and
-# configure the path to it using the MATHJAX_RELPATH option.
-
-USE_MATHJAX = NO
-
-# When MathJax is enabled you need to specify the location relative to the
-# HTML output directory using the MATHJAX_RELPATH option. The destination
-# directory should contain the MathJax.js script. For instance, if the mathjax
-# directory is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the
-# mathjax.org site, so you can quickly see the result without installing
-# MathJax, but it is strongly recommended to install a local copy of MathJax
-# before deployment.
-
-MATHJAX_RELPATH = http://www.mathjax.org/mathjax
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box
-# for the HTML output. The underlying search engine uses javascript
-# and DHTML and should work on any modern browser. Note that when using
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
-# (GENERATE_DOCSET) there is already a search function so this one should
-# typically be disabled. For large projects the javascript based search engine
-# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
-
-SEARCHENGINE = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a PHP enabled web server instead of at the web client
-# using Javascript. Doxygen will generate the search PHP script and index
-# file to put on the web server. The advantage of the server
-# based approach is that it scales better to large projects and allows
-# full text search. The disadvantages are that it is more difficult to setup
-# and does not have live searching capabilities.
-
-SERVER_BASED_SEARCH = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-# Note that when enabling USE_PDFLATEX this option is only used for
-# generating bitmaps for formulas in the HTML output, but not in the
-# Makefile that is written to the output directory.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE = a4
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
-# the generated latex document. The footer should contain everything after
-# the last chapter. If it is left blank doxygen will generate a
-# standard footer. Notice: only use this tag if you know what you are doing!
-
-LATEX_FOOTER =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
-LATEX_HIDE_INDICES = NO
-
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include
-# source code with syntax highlighting in the LaTeX output.
-# Note that which sources are shown also depends on other settings
-# such as SOURCE_BROWSER.
-
-LATEX_SOURCE_CODE = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.
-# This is useful
-# if you want to understand what is going on.
-# On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED =
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition that
-# overrules the definition found in the source code.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all references to function-like macros
-# that are alone on a line, have an all uppercase name, and do not end with a
-# semicolon, because these will confuse the parser if not removed.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-#
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-#
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
-EXTERNAL_GROUPS = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option also works with HAVE_DOT disabled, but it is recommended to
-# install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH =
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = NO
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
-# allowed to run in parallel. When set to 0 (the default) doxygen will
-# base this on the number of processors available in the system. You can set it
-# explicitly to a value larger than 0 to get control over the balance
-# between CPU load and processing speed.
-
-DOT_NUM_THREADS = 0
-
-# By default doxygen will write a font called Helvetica to the output
-# directory and reference it in all dot files that doxygen generates.
-# When you want a differently looking font you can specify the font name
-# using DOT_FONTNAME. You need to make sure dot is able to find the font,
-# which can be done by putting it in a standard location or by setting the
-# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
-# containing the font.
-
-DOT_FONTNAME = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
-# The default size is 10pt.
-
-DOT_FONTSIZE = 10
-
-# By default doxygen will tell dot to use the output directory to look for the
-# FreeSans.ttf font (which doxygen will put there itself). If you specify a
-# different font using DOT_FONTNAME you can set the path where dot
-# can find it using this tag.
-
-DOT_FONTPATH =
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
-UML_LOOK = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then
-# doxygen will generate a call dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable call graphs
-# for selected functions only using the \callgraph command.
-
-CALL_GRAPH = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
-# doxygen will generate a caller dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable caller
-# graphs for selected functions only using the \callergraph command.
-
-CALLER_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will generate a graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are svg, png, jpg, or gif.
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the
-# \mscfile command).
-
-MSCFILE_DIRS =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen if the
-# number of direct children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum height of the
-# graphs generated by dot. A height value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a height of 0 means no height restriction.
-
-MAX_DOT_GRAPH_DEPTH = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not
-# seem to support this out of the box. Warning: Depending on the platform used,
-# enabling this option may lead to badly anti-aliased labels on the edges of
-# a graph (i.e. they become hard to read).
-
-DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS = YES
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
-DOT_CLEANUP = YES
diff --git a/HACKING b/HACKING
deleted file mode 100644
index 0ce3945..0000000
--- a/HACKING
+++ /dev/null
@@ -1,15 +0,0 @@
-Releasing
-=========
-
-We use the git flow branching model, so you can assume that the code in the
-master branch is stable and the bleeding edge is in the develop branch.
-
-http://nvie.com/posts/a-successful-git-branching-model/
-
-Style
-=====
-
-See our style guide here:
-
-https://wiki.unsystem.net/index.php/Libbitcoin/Style
-
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index 7c5fd79..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,385 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
-2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-
- Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved. This file is offered as-is,
-without warranty of any kind.
-
-==========================
-Debian/Ubuntu Instructions
-==========================
-
- VVVVVVVVVVV
-> Start Here! <
- ^^^^^^^^^^^
-
- $ sudo apt-get install build-essential autoconf libtool libboost-all-dev pkg-config libcurl4-openssl-dev libleveldb-dev
- $ autoreconf -i
- $ ./configure --enable-leveldb
- $ make
- $ sudo make install
- $ sudo ldconfig
-
-libbitcoin is now installed in /usr/local/.
-
-* Ubuntu Precise Pangolin requires libboost1.48-all-dev instead of
- libboost-all-dev above.
-
-Basic Installation
-==================
-
- Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package. The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package. Some packages provide this
-`INSTALL' file but do not implement all of the features documented
-below. The lack of an optional feature in a given package is not
-necessarily a bug. More recommendations for GNU packages can be found
-in *note Makefile Conventions: (standards)Makefile Conventions.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
- It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring. Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
- The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'. You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
- The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system.
-
- Running `configure' might take a while. While running, it prints
- some messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package, generally using the just-built uninstalled binaries.
-
- 4. Type `make install' to install the programs and any data files and
- documentation. When installing into a prefix owned by root, it is
- recommended that the package be configured and built as a regular
- user, and only the `make install' phase executed with root
- privileges.
-
- 5. Optionally, type `make installcheck' to repeat any self-tests, but
- this time using the binaries in their final installed location.
- This target does not install anything. Running this target as a
- regular user, particularly if the prior `make install' required
- root privileges, verifies that the installation completed
- correctly.
-
- 6. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
- 7. Often, you can also type `make uninstall' to remove the installed
- files again. In practice, not all packages have tested that
- uninstallation works correctly, even though it is required by the
- GNU Coding Standards.
-
- 8. Some packages, particularly those that use Automake, provide `make
- distcheck', which can by used by developers to test that all other
- targets like `make install' and `make uninstall' work correctly.
- This target is generally not run by end users.
-
-Compilers and Options
-=====================
-
- Some systems require unusual options for compilation or linking that
-the `configure' script does not know about. Run `./configure --help'
-for details on some of the pertinent environment variables.
-
- You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment. Here
-is an example:
-
- ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
- *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
- You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you can use GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'. This
-is known as a "VPATH" build.
-
- With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory. After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
- On MacOS X 10.5 and later systems, you can create libraries and
-executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor. Like
-this:
-
- ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CPP="gcc -E" CXXCPP="g++ -E"
-
- This is not guaranteed to produce working output in all cases, you
-may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
-
-Installation Names
-==================
-
- By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc. You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
-absolute file name.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
- In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files. Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them. In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
-specifications that were not explicitly provided.
-
- The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
-both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
-having to reconfigure or recompile.
-
- The first method involves providing an override variable for each
-affected directory. For example, `make install
-prefix=/alternate/directory' will choose an alternate location for all
-directory configuration variables that were expressed in terms of
-`${prefix}'. Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated. The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
- The second method involves providing the `DESTDIR' variable. For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names. The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
-does not work on platforms that have drive letters. On the other hand,
-it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
-
-Optional Features
-=================
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
- Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
- Some packages offer the ability to configure how verbose the
-execution of `make' will be. For these packages, running `./configure
---enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
---disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
-
-Particular systems
-==================
-
- On HP-UX, the default C compiler is not ANSI C compatible. If GNU
-CC is not installed, it is recommended to use the following options in
-order to use an ANSI C compiler:
-
- ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
-
-and if that doesn't work, install pre-built binaries of GCC for HP-UX.
-
- On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file. The option `-nodtk' can be used as
-a workaround. If GNU CC is not installed, it is therefore recommended
-to try
-
- ./configure CC="cc"
-
-and if that doesn't work, try
-
- ./configure CC="cc -nodtk"
-
- On Solaris, don't put `/usr/ucb' early in your `PATH'. This
-directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
-
- On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'. It is recommended to use the following options:
-
- ./configure --prefix=/boot/common
-
-Specifying the System Type
-==========================
-
- There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on. Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
- CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
- OS
- KERNEL-OS
-
- See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
- If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
- If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
- If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
- Variables not defined in a site shell script can be set in the
-environment passed to `configure'. However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost. In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'. For example:
-
- ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf bug. Until the bug is fixed you can use this workaround:
-
- CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
- Print a summary of all of the options to `configure', and exit.
-
-`--help=short'
-`--help=recursive'
- Print a summary of the options unique to this package's
- `configure', and exit. The `short' variant lists options used
- only in the top level, while the `recursive' variant lists options
- also present in any nested packages.
-
-`--version'
-`-V'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`--cache-file=FILE'
- Enable the cache: use and save the results of the tests in FILE,
- traditionally `config.cache'. FILE defaults to `/dev/null' to
- disable caching.
-
-`--config-cache'
-`-C'
- Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`--prefix=DIR'
- Use DIR as the installation prefix. *note Installation Names::
- for more details, including other options available for fine-tuning
- the installation locations.
-
-`--no-create'
-`-n'
- Run the configure checks, but stop before creating any output
- files.
-
-`configure' also accepts some other, not widely useful, options. Run
-`configure --help' for more details.
-
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index fe4153c..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,686 +0,0 @@
-This license applies to all works under this directory.
-
-Amir Taaki - libbitcoin
-Copyright (C) 2011-2013 Amir Taaki
-
-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.
-
-EXCEPTION: This distribution of libbitcoin may be linked against OpenSSL
-according to the terms of the section below entitled "OpenSSL Exception."
-
-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/>.
-
-Additional permission under the GNU Affero GPL version 3 section 7:
-
-If the covered work has no means of communicating an offer to provide
-Corresponding Source to the users interacting with it remotely over a
-computer network, then you may comply with this requirement by making
-the Corresponding Source for your version 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.
-
-If you modify this Program, or any covered work, by linking or
-combining it with other code, such other code is not for that reason
-alone subject to any of the requirements of the GNU Affero GPL
-version 3.
-
- _OpenSSL Exception_
-
-0. Definitions
-
-"libbitcoin" means libbitcoin software licensed under version 3 or any later
-version of the GNU Affero General Public License (collectively, "AGPL"), or a
-work based on such software and licensed under the AGPL.
-
-"OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-Project and licensed under the OpenSSL Licenses, or a work based on such
-software and licensed under the OpenSSL Licenses.
-
-"OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-under which the OpenSSL Project distributes the OpenSSL toolkit software,
-as those licenses appear in the file LICENSE-OPENSSL.
-
-1. Exception
-
-You have permission to copy, modify, propagate, and distribute a work
-formed by combining OpenSSL with libbitcoin, or a work derivative of such a
-combination, even if such copying, modification, propagation, or
-distribution would otherwise violate the terms of the AGPL. You must
-comply with the AGPL in all respects for all of the code used other than
-OpenSSL.
-
-You may include this OpenSSL Exception and its grant of permissions when
-you distribute libbitcoin. Inclusion of this notice with such a
-distribution constitutes a grant of such permission. If you do not wish
-to grant these permissions, remove this section entitled "OpenSSL
-Exception" from your distribution.
-
- 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
-
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index cdb22af..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,38 +0,0 @@
-doc_DATA = README INSTALL COPYING doc/README.tutorial
-
-#doc_sphinxdir = $(docdir)/sphinx/
-#doc_sphinx_DATA = \
-# doc/sphinx/Makefile \
-# doc/sphinx/overview.rst \
-# doc/sphinx/network.rst \
-# doc/sphinx/make.bat \
-# doc/sphinx/crypto.rst \
-# doc/sphinx/fullnode.rst \
-# doc/sphinx/offlinetx.rst \
-# doc/sphinx/blockchain.rst \
-# doc/sphinx/index.rst \
-# doc/sphinx/quickstart.rst \
-# doc/sphinx/conf.py \
-# doc/sphinx/introduction.rst
-#
-#doc_sphinx_imgdir = $(docdir)/sphinx/img/
-#doc_sphinx_img_DATA = doc/sphinx/img/operations.png
-#
-#doc_sphinx_examplesdir = $(docdir)/sphinx/examples/
-#doc_sphinx_examples_DATA = \
-# doc/sphinx/examples/connect.rst \
-# doc/sphinx/examples/initchain.rst \
-# doc/sphinx/examples/priv.rst \
-# doc/sphinx/examples/determ.rst \
-# doc/sphinx/examples/accept.rst \
-# doc/sphinx/examples/txrad.rst \
-# doc/sphinx/examples/satoshiwords.rst \
-# doc/sphinx/examples/fullnode.rst \
-# doc/sphinx/examples/display-last.rst \
-# doc/sphinx/examples/proto.rst
-
-pkgconfig_DATA = libbitcoin.pc
-
-SUBDIRS = include/bitcoin src
-ACLOCAL_AMFLAGS = -I m4
-
diff --git a/NEWS b/NEWS
deleted file mode 100644
index e69de29..0000000
--- a/NEWS
+++ /dev/null
diff --git a/README b/README
deleted file mode 100644
index c0d340c..0000000
--- a/README
+++ /dev/null
@@ -1,137 +0,0 @@
-All files in this repository fall under the license specified in LICENSE
-The project is licensed as AGPL with a lesser clause. It may be used within
-a proprietary project, but the core library and any changes to it must be
-published online. Source code for this library must always remain free for
-everybody to access.
-
-==========================
-Debian/Ubuntu Instructions
-==========================
-
-Note that you need g++ 4.7 or higher. For this reason Ubuntu 12.04 and older are not supported.
-
- VVVVVVVVVVV
-> Start Here! <
- ^^^^^^^^^^^
-
- $ sudo apt-get install build-essential autoconf automake libtool libboost-all-dev pkg-config libcurl4-openssl-dev libleveldb-dev
- $ autoreconf -i
- $ ./configure --enable-leveldb
- $ make
- $ sudo make install
- $ sudo ldconfig
-
-libbitcoin is now installed in /usr/local/.
-
-* Ubuntu Precise Pangolin requires libboost1.48-all-dev instead of
- libboost-all-dev above.
-
---------
-Advanced
---------
-
-Files Open Limit
-----------------
-
-For the blockchain database, set the max open files limit higher.
-The default limit on most Linux systems is too low.
-
- $ ulimit -n 4096
-
-Core Dependencies
------------------
-
-You will need:
-
- - GCC 4.7 or newer
- - Boost 1.48 or newer
- - OpenSSL 0.9 or newer
- - LevelDB
-
-Install Prefix
---------------
-
-'./configure' accepts a --prefix switch. This is useful if you prefer to
-install libbitcoin to a local directory instead.
-
- $ ./configure --enable-leveldb --prefix /home/genjix/usr/
- $ make
- $ make install
-
-Then add these environment variables to the end of your ~/.bashrc to point
-software to your local installation. Otherwise software will have trouble
-finding the libbitcoin install.
-
- export LD_LIBRARY_PATH=~/usr/lib/
- export PKG_CONFIG_PATH=~/usr/lib/pkgconfig/
-
-'./configure' also accepts the following flags:
- --enable-testnet (enables the alternative blockchain used for testing)
- --enable-debug (verbose output)
-
-Compile/Build Flags
--------------------
-
-pkg-config can be invoked to get the neccessary compile and build flags
-for creating software using libbitcoin.
-
- $ pkg-config --cflags --libs libbitcoin
-
---------
-Examples
---------
-
-Start with the examples/ to see a few sample programs:
-
- $ cd examples/
- $ make
- # Play around with private keys.
- $ ./priv
- # Initialize a new LevelDB blockchain database.
- $ mkdir database
- $ ./initchain database/
- # Run the fullnode example (validates blocks and transactions).
- $ ./fullnode
-
-=======================
-Arch Linux Instructions
-=======================
-
-Libbitcoin is available from the AUR: https://aur.archlinux.org/packages/libbitcoin-leveldb-git/
-
-=======================
-Gentoo Linux Instructions
-=======================
-
-Libbitcoin is available in the 'bitcoin' overlay. Use layman to fetch
-the overlay then emerge as usual.
-
-If you want to use live build, unlock the '**' keyword for net-p2p/libbitcoin
-in /etc/portage/package.accept_keywords
-
-====================
-Mac OSX Instructions
-====================
-
-To build on Mac OSX, you will need to download and compile your own boost,
-leveldb using gcc 4.7 before building libbitcoin. Then set the following
-environment variables before running the build process.
-
- CC=/usr/local/bin/gcc-4.7
- CXX=/usr/local/bin/g++-4.7
-
-For Mac OSX Mountain Lion, you need to follow these brew commands:
-
- $ brew install boost openssl leveldb
- $ brew tap homebrew/versions
- $ brew install gcc48
- # Can be replaced back later if you prefer, but
- # keeping the new g++ is a good idea.
- $ sudo ln -sf /usr/local/bin/g++-4.8 /usr/bin/g++
-
-
- $ autoreconf -i
- $ ./configure --enable-leveldb
- $ make
- $ sudo make install
-
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..28caf8e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+This repo has moved to:
+
+ https://github.com/libbitcoin/libbitcoin/
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100644
index b50dab0..0000000
--- a/autogen.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-autoreconf -i
-
diff --git a/builds/msvc/.gitignore b/builds/msvc/.gitignore
deleted file mode 100644
index 7f1fcda..0000000
--- a/builds/msvc/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.suo
-*.opensdf
-*.sdf
diff --git a/builds/msvc/README.md b/builds/msvc/README.md
deleted file mode 100644
index f7e89d8..0000000
--- a/builds/msvc/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-The `CTP_Nov2013` compiler is required due to the use of **C++11/14** features. You can [download the compiler add-on here](http://www.microsoft.com/en-us/download/details.aspx?id=41151).
-
-There are a number of NuGet packages required to compile. Several inject source code into the build, others are required for resolving references and linking. I currently have the NuGet references to my local (relative) NuGet repo embedded in the project files. If you don't have the packages in that location NuGet will produce errors.
-
-After you pull down the referenced packages you will still have one set of issues (which I am working on). In our set of dependencies there are four packages that reference a compiled library where the package does not have a version compiled for `CTP_Nov2013` compiler. This causes linkage to fail. That can be hacked around, but the result (based on my testing) is a runtime failure when the library is entered. I have determined that this is because the libraries are compiled for `VC100` (VS2010) and `VC110` (VS2012), which should not be compatible with `VC120` (VS2013). I am in the process of building NuGet packages for all dependencies as `VC120`, since this will link properly with `CTP_Nov2013`.
-
-The packages that I've completed are visible [here](http://www.nuget.org/profiles/evoskuil/), specifically the ones ending in **_vc120**. There are four remaining (to support **libbitcoin**, **libwallet**, **obelisk** and **sx**): **cURL**, **libssh2**, **openssl** and **zlib**. Once those are complete I will package the libbitcoin libs for NuGet as well. Ultimately I would like to produce C# bindings for the libs.
diff --git a/builds/msvc/vs2013/examples/libbitcoin_examples.props b/builds/msvc/vs2013/examples/libbitcoin_examples.props
deleted file mode 100644
index 6d66aa8..0000000
--- a/builds/msvc/vs2013/examples/libbitcoin_examples.props
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Libbitcoin Examples Common Settings</_PropertySheetDisplayName>
- <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
- <RunCodeAnalysis>false</RunCodeAnalysis>
- </PropertyGroup>
-
- <!-- Configuration -->
-
- <ItemDefinitionGroup>
- <ClCompile>
- <DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings>
- <EnablePREfast>false</EnablePREfast>
- <PreprocessorDefinitions>_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessorDefinitions Condition="$(Configuration.IndexOf('Release')) != -1">BITCOIN_DISABLE_ASSERTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <!-- HACK : CURL_STATICLIB should be injected by the cURL package. -->
- <PreprocessorDefinitions Condition="$(Configuration.IndexOf('SEXE')) != -1 Or $(Configuration.IndexOf('LEXE')) != -1">CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- <!-- BUGBUG: there are linker errors in two examples. -->
- <Link>
- <AdditionalOptions Condition="$(Configuration.IndexOf('Debug')) != -1">/OPT:NOLBR /IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
- </Link>
- </ItemDefinitionGroup>
-
- <!-- Extensions -->
-
- <ImportGroup Label="PropertySheets">
- <Import Project="$(SolutionDir)libbitcoin.import.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <!-- Libbitcoin must also be built with leveldb. -->
- <Option-leveldb>true</Option-leveldb>
- </PropertyGroup>
-
- <PropertyGroup Condition="$(Configuration.IndexOf('DEXE')) != -1">
- <Linkage-curl>dynamic</Linkage-curl>
- <Linkage-zlib>dynamic</Linkage-zlib>
- <Linkage-openssl>dynamic</Linkage-openssl>
- <Linkage-libbitcoin>dynamic</Linkage-libbitcoin>
- </PropertyGroup>
- <PropertyGroup Condition="$(Configuration.IndexOf('LEXE')) != -1">
- <Linkage-curl>ltcg</Linkage-curl>
- <Linkage-zlib>ltcg</Linkage-zlib>
- <Linkage-openssl>ltcg</Linkage-openssl>
- <Linkage-libbitcoin>ltcg</Linkage-libbitcoin>
- </PropertyGroup>
- <PropertyGroup Condition="$(Configuration.IndexOf('SEXE')) != -1">
- <Linkage-curl>static</Linkage-curl>
- <Linkage-zlib>static</Linkage-zlib>
- <Linkage-openssl>static</Linkage-openssl>
- <Linkage-libbitcoin>static</Linkage-libbitcoin>
- </PropertyGroup>
-
- <!-- Messages -->
-
- <Target Name="OptionInfo" BeforeTargets="PrepareForBuild">
- <Message Text="Option-leveldb : $(Option-leveldb)" Importance="high"/>
- <Message Text="Option-testnet : $(Option-testnet)" Importance="high"/>
- </Target>
-
- <Target Name="LinkageInfo" BeforeTargets="PrepareForBuild">
- <Message Text="Linkage-curl : $(Linkage-curl)" Importance="high"/>
- <Message Text="Linkage-zlib : $(Linkage-zlib)" Importance="high"/>
- <Message Text="Linkage-openssl : $(Linkage-openssl)" Importance="high"/>
- <Message Text="Linkage-libbitcoin: $(Linkage-libbitcoin)" Importance="high"/>
- </Target>
-
- <Target Name="CustomInfo" AfterTargets="Build" Condition="$(Configuration.IndexOf('SEXE')) != -1">
- <Message Text="A LTCG warning on 'libeay32.lib' is a the result of a COAPP OpenSSL packaging error and can be safely ignored." Importance="high"/>
- </Target>
-
-</Project>
-
-
-
diff --git a/builds/msvc/vs2013/examples/libbitcoin_examples.vcxproj b/builds/msvc/vs2013/examples/libbitcoin_examples.vcxproj
deleted file mode 100644
index f0f4a36..0000000
--- a/builds/msvc/vs2013/examples/libbitcoin_examples.vcxproj
+++ /dev/null
@@ -1,215 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="..\..\..\..\..\..\nuget\LevelDB.1.16.0.5\build\native\LevelDB.props" Condition="Exists('..\..\..\..\..\..\nuget\LevelDB.1.16.0.5\build\native\LevelDB.props')" />
- <Import Project="..\..\..\..\..\..\nuget\Snappy.1.1.1.7\build\native\Snappy.props" Condition="Exists('..\..\..\..\..\..\nuget\Snappy.1.1.1.7\build\native\Snappy.props')" />
- <Import Project="..\..\..\..\..\..\nuget\Crc32C.1.0.4\build\native\Crc32C.props" Condition="Exists('..\..\..\..\..\..\nuget\Crc32C.1.0.4\build\native\Crc32C.props')" />
- <Import Project="..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.props" Condition="Exists('..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.props')" />
- <PropertyGroup Label="Globals">
- <ProjectGuid>{15BF93A0-69D3-4723-9FDE-EB8B73C69E09}</ProjectGuid>
- <ProjectName>libbitcoin_examples</ProjectName>
- <RootNamespace>libbitcoin_examples12</RootNamespace>
- </PropertyGroup>
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="DebugDEXE|Win32">
- <Configuration>DebugDEXE</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseDEXE|Win32">
- <Configuration>ReleaseDEXE</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugDEXE|x64">
- <Configuration>DebugDEXE</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseDEXE|x64">
- <Configuration>ReleaseDEXE</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugLEXE|Win32">
- <Configuration>DebugLEXE</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseLEXE|Win32">
- <Configuration>ReleaseLEXE</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugLEXE|x64">
- <Configuration>DebugLEXE</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseLEXE|x64">
- <Configuration>ReleaseLEXE</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugSEXE|Win32">
- <Configuration>DebugSEXE</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseSEXE|Win32">
- <Configuration>ReleaseSEXE</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugSEXE|x64">
- <Configuration>DebugSEXE</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseSEXE|x64">
- <Configuration>ReleaseSEXE</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Configuration">
- <PlatformToolset>CTP_Nov2013</PlatformToolset>
- <ConfigurationType>Application</ConfigurationType>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='DebugDEXE|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleDebugDynamic.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='ReleaseDEXE|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleReleaseDynamic.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDEXE|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleDebugDynamic.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDEXE|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleReleaseDynamic.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLEXE|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleDebugLinkTimeCodeGeneration.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLEXE|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleReleaseLinkTimeCodeGeneration.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLEXE|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleDebugLinkTimeCodeGeneration.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLEXE|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleReleaseLinkTimeCodeGeneration.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSEXE|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleDebugStatic.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseSEXE|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleReleaseStatic.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugSEXE|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleDebugStatic.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseSEXE|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\ConsoleReleaseStatic.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets" />
- <ImportGroup Label="ExtensionSettings">
- <Import Project="..\..\..\..\..\..\nuget\openssl.redist.1.0.1.24\build\native\openssl.redist.targets" Condition="Exists('..\..\..\..\..\..\nuget\openssl.redist.1.0.1.24\build\native\openssl.redist.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.targets" Condition="Exists('..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost.1.55.0.16\build\native\boost.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost.1.55.0.16\build\native\boost.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost_system-vc120.1.55.0.16\build\native\boost_system-vc120.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost_system-vc120.1.55.0.16\build\native\boost_system-vc120.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost_date_time-vc120.1.55.0.16\build\native\boost_date_time-vc120.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost_date_time-vc120.1.55.0.16\build\native\boost_date_time-vc120.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost_regex-vc120.1.55.0.16\build\native\boost_regex-vc120.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost_regex-vc120.1.55.0.16\build\native\boost_regex-vc120.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\zlib.redist.1.2.8.6\build\native\zlib.redist.targets" Condition="Exists('..\..\..\..\..\..\nuget\zlib.redist.1.2.8.6\build\native\zlib.redist.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\zlib.1.2.8.6\build\native\zlib.targets" Condition="Exists('..\..\..\..\..\..\nuget\zlib.1.2.8.6\build\native\zlib.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost_filesystem-vc120.1.55.0.16\build\native\boost_filesystem-vc120.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost_filesystem-vc120.1.55.0.16\build\native\boost_filesystem-vc120.targets')" />
- </ImportGroup>
- <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
- <PropertyGroup>
- <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
- </PropertyGroup>
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\openssl.redist.1.0.1.24\build\native\openssl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\openssl.redist.1.0.1.24\build\native\openssl.redist.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.props'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost.1.55.0.16\build\native\boost.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost.1.55.0.16\build\native\boost.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost_system-vc120.1.55.0.16\build\native\boost_system-vc120.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost_system-vc120.1.55.0.16\build\native\boost_system-vc120.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost_date_time-vc120.1.55.0.16\build\native\boost_date_time-vc120.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost_date_time-vc120.1.55.0.16\build\native\boost_date_time-vc120.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost_regex-vc120.1.55.0.16\build\native\boost_regex-vc120.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost_regex-vc120.1.55.0.16\build\native\boost_regex-vc120.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\Crc32C.1.0.4\build\native\Crc32C.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\Crc32C.1.0.4\build\native\Crc32C.props'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\Snappy.1.1.1.7\build\native\Snappy.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\Snappy.1.1.1.7\build\native\Snappy.props'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\LevelDB.1.16.0.5\build\native\LevelDB.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\LevelDB.1.16.0.5\build\native\LevelDB.props'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\zlib.redist.1.2.8.6\build\native\zlib.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\zlib.redist.1.2.8.6\build\native\zlib.redist.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\zlib.1.2.8.6\build\native\zlib.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\zlib.1.2.8.6\build\native\zlib.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost_filesystem-vc120.1.55.0.16\build\native\boost_filesystem-vc120.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost_filesystem-vc120.1.55.0.16\build\native\boost_filesystem-vc120.targets'))" />
- </Target>
- <ItemGroup>
- <ClCompile Include="..\..\..\..\examples\accept.cpp">
- <ExcludedFromBuild>false</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\balance.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\connect.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\display-last.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\fullnode.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\initchain.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\priv.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\proto.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\query-stealth.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\satoshiwords.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\txrad.cpp">
- <ExcludedFromBuild>true</ExcludedFromBuild>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <None Include="packages.config">
- </None>
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\libbitcoin\libbitcoin.vcxproj">
- <Project>{39F60708-FF48-4C22-952D-43470866F684}</Project>
- </ProjectReference>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/examples/libbitcoin_examples.vcxproj.filters b/builds/msvc/vs2013/examples/libbitcoin_examples.vcxproj.filters
deleted file mode 100644
index c0e1563..0000000
--- a/builds/msvc/vs2013/examples/libbitcoin_examples.vcxproj.filters
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <ClCompile Include="..\..\..\..\examples\accept.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\display-last.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\fullnode.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\initchain.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\priv.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\proto.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\query-stealth.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\satoshiwords.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\txrad.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\balance.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\examples\connect.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\leveldb-single-file.cpp" />
- <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\snappy-single-file.cpp" />
- <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\crc32c.cpp" />
- </ItemGroup>
- <ItemGroup>
- <Filter Include="src">
- <UniqueIdentifier>{9a1b1e98-7cf9-47aa-9449-1f27fe15f5a6}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <None Include="packages.config" />
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/examples/packages.config b/builds/msvc/vs2013/examples/packages.config
deleted file mode 100644
index 86e89f3..0000000
--- a/builds/msvc/vs2013/examples/packages.config
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="boost" version="1.55.0.16" targetFramework="Native" />
- <package id="boost_date_time-vc120" version="1.55.0.16" targetFramework="Native" />
- <package id="boost_filesystem-vc120" version="1.55.0.16" targetFramework="Native" />
- <package id="boost_regex-vc120" version="1.55.0.16" targetFramework="Native" />
- <package id="boost_system-vc120" version="1.55.0.16" targetFramework="Native" />
- <package id="Crc32C" version="1.0.4" targetFramework="Native" />
- <package id="curl" version="7.30.0.2" targetFramework="Native" />
- <package id="curl.redist" version="7.30.0.2" targetFramework="Native" />
- <package id="LevelDB" version="1.16.0.5" targetFramework="Native" />
- <package id="libssh2" version="1.4.3.1" targetFramework="Native" />
- <package id="libssh2.redist" version="1.4.3.1" targetFramework="Native" />
- <package id="openssl" version="1.0.1.24" targetFramework="Native" />
- <package id="openssl.redist" version="1.0.1.24" targetFramework="Native" />
- <package id="Snappy" version="1.1.1.7" targetFramework="Native" />
- <package id="zlib" version="1.2.8.6" targetFramework="Native" />
- <package id="zlib.redist" version="1.2.8.6" targetFramework="Native" />
-</packages> \ No newline at end of file
diff --git a/builds/msvc/vs2013/libbitcoin.import.props b/builds/msvc/vs2013/libbitcoin.import.props
deleted file mode 100644
index 4b0a573..0000000
--- a/builds/msvc/vs2013/libbitcoin.import.props
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup Label="Globals">
- <_PropertySheetDisplayName>Libbitcoin Import Settings</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <!-- User Interface -->
-
- <ItemGroup Label="BuildOptionsExtension">
- <PropertyPageSchema Include="$(MSBuildThisFileDirectory)libbitcoin.import.xml" />
- </ItemGroup>
-
- <!-- Configuration -->
-
- <ItemDefinitionGroup>
- <ClCompile>
- <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\..\libbitcoin\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreprocessorDefinitions Condition="'$(Option-testnet)' == 'true'">ENABLE_TESTNET;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessorDefinitions Condition="'$(Option-leveldb)' == 'true'">LEVELDB_ENABLED;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessorDefinitions Condition="$(Configuration.IndexOf('Release')) != -1">BITCOIN_DISABLE_ASSERTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessorDefinitions Condition="'$(Linkage-libbitcoin)' == 'static' Or '$(Linkage-libbitcoin)' == 'ltcg'">BC_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- </ItemDefinitionGroup>
-
- <!-- Linkage -->
-
- <ItemDefinitionGroup Condition="'$(Linkage-libbitcoin)' == 'dynamic'">
- <Link Condition="$(Configuration.IndexOf('Debug')) != -1">
- <AdditionalDependencies>$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Debug\libbitcoin12\libbitcoin.imp.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- <Link Condition="$(Configuration.IndexOf('Release')) != -1">
- <AdditionalDependencies>$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Release\libbitcoin12\libbitcoin.imp.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
-
- <ItemDefinitionGroup Condition="'$(Linkage-libbitcoin)' == 'static'">
- <Link Condition="$(Configuration.IndexOf('Debug')) != -1">
- <AdditionalDependencies>$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Debug\libbitcoin12\libbitcoin.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- <Link Condition="$(Configuration.IndexOf('Release')) != -1">
- <AdditionalDependencies>$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Release\libbitcoin12\libbitcoin.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
-
- <ItemDefinitionGroup Condition="'$(Linkage-libbitcoin)' == 'ltcg'">
- <Link Condition="$(Configuration.IndexOf('Debug')) != -1">
- <AdditionalDependencies>$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Debug\libbitcoin12\libbitcoin.ltcg.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- <Link Condition="$(Configuration.IndexOf('Release')) != -1">
- <AdditionalDependencies>$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Release\libbitcoin12\libbitcoin.ltcg.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
-
- <!-- Copy -->
-
- <Target Name="Linkage-libbitcoin-dynamic" AfterTargets="AfterBuild" Condition="'$(Linkage-libbitcoin)' == 'dynamic'">
- <Copy Condition="$(Configuration.IndexOf('Debug')) != -1"
- SourceFiles="$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Debug\libbitcoin12\libbitcoin.dll"
- DestinationFiles="$(TargetDir)libbitcoin.dll"
- SkipUnchangedFiles="true" />
- <Copy Condition="$(Configuration.IndexOf('Debug')) != -1"
- SourceFiles="$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Debug\libbitcoin12\libbitcoin.pdb"
- DestinationFiles="$(TargetDir)libbitcoin.pdb"
- SkipUnchangedFiles="true" />
- <Copy Condition="$(Configuration.IndexOf('Release')) != -1"
- SourceFiles="$(ProjectDir)..\..\..\..\..\libbitcoin\bin\$(PlatformName)\Release\libbitcoin12\libbitcoin.dll"
- DestinationFiles="$(TargetDir)libbitcoin.dll"
- SkipUnchangedFiles="true" />
- </Target>
-
- <!-- Messages -->
-
- <Target Name="libbitcoin-info" BeforeTargets="AfterBuild" Condition="'$(Linkage-libbitcoin)' == 'dynamic'">
- <Message Text="Copying libbitcoin.dll -&gt; $(TargetDir)libbitcoin.dll" Importance="high"/>
- <Message Text="Copying libbitcoin.pdb -&gt; $(TargetDir)libbitcoin.pdb" Importance="high" Condition="$(Configuration.IndexOf('Debug')) != -1" />
- </Target>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/libbitcoin.import.xml b/builds/msvc/vs2013/libbitcoin.import.xml
deleted file mode 100644
index 1baa1b7..0000000
--- a/builds/msvc/vs2013/libbitcoin.import.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework">
- <Rule Name="libbitcoin-options-uiextension" PageTemplate="tool" DisplayName="Bitcoin Options" SwitchPrefix="/" Order="1">
- <Rule.Categories>
- <Category Name="leveldb" DisplayName="leveldb" />
- <Category Name="testnet" DisplayName="testnet" />
- </Rule.Categories>
- <Rule.DataSource>
- <DataSource Persistence="ProjectFile" ItemType="" />
- </Rule.DataSource>
- <EnumProperty Name="Option-leveldb" DisplayName="Enable LevelDB" Description="Enable the LevelDB build option" Category="leveldb">
- <EnumValue Name="" DisplayName="No" />
- <EnumValue Name="true" DisplayName="Yes" />
- </EnumProperty>
- <EnumProperty Name="Option-testnet" DisplayName="Enable Testnet" Description="Enable the Testnet build option" Category="testnet">
- <EnumValue Name="" DisplayName="No" />
- <EnumValue Name="true" DisplayName="Yes" />
- </EnumProperty>
- </Rule>
- <Rule Name="libbitcoin-linkage-uiextension" PageTemplate="tool" DisplayName="Local Dependencies" SwitchPrefix="/" Order="1">
- <Rule.Categories>
- <Category Name="libbitcoin" DisplayName="libbitcoin" />
- </Rule.Categories>
- <Rule.DataSource>
- <DataSource Persistence="ProjectFile" ItemType="" />
- </Rule.DataSource>
- <EnumProperty Name="Linkage-libbitcoin" DisplayName="Linkage" Description="How libbitcoin will be linked into the output of this project" Category="libbitcoin">
- <EnumValue Name="" DisplayName="Not linked" />
- <EnumValue Name="dynamic" DisplayName="Dynamic (DLL)" />
- <EnumValue Name="static" DisplayName="Static (LIB)" />
- <EnumValue Name="ltcg" DisplayName="Static using link time compile generation (LTCG)" />
- </EnumProperty>
- </Rule>
-</ProjectSchemaDefinitions> \ No newline at end of file
diff --git a/builds/msvc/vs2013/libbitcoin.sln b/builds/msvc/vs2013/libbitcoin.sln
deleted file mode 100644
index b5d387c..0000000
--- a/builds/msvc/vs2013/libbitcoin.sln
+++ /dev/null
@@ -1,78 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.30110.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbitcoin", "libbitcoin\libbitcoin.vcxproj", "{39F60708-FF48-4C22-952D-43470866F684}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbitcoin_examples", "examples\libbitcoin_examples.vcxproj", "{15BF93A0-69D3-4723-9FDE-EB8B73C69E09}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DynDebug|Win32 = DynDebug|Win32
- DynDebug|x64 = DynDebug|x64
- DynRelease|Win32 = DynRelease|Win32
- DynRelease|x64 = DynRelease|x64
- LtcgDebug|Win32 = LtcgDebug|Win32
- LtcgDebug|x64 = LtcgDebug|x64
- LtcgRelease|Win32 = LtcgRelease|Win32
- LtcgRelease|x64 = LtcgRelease|x64
- StaticDebug|Win32 = StaticDebug|Win32
- StaticDebug|x64 = StaticDebug|x64
- StaticRelease|Win32 = StaticRelease|Win32
- StaticRelease|x64 = StaticRelease|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {39F60708-FF48-4C22-952D-43470866F684}.DynDebug|Win32.ActiveCfg = DebugDLL|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.DynDebug|Win32.Build.0 = DebugDLL|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.DynDebug|x64.ActiveCfg = DebugDLL|x64
- {39F60708-FF48-4C22-952D-43470866F684}.DynDebug|x64.Build.0 = DebugDLL|x64
- {39F60708-FF48-4C22-952D-43470866F684}.DynRelease|Win32.ActiveCfg = ReleaseDLL|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.DynRelease|Win32.Build.0 = ReleaseDLL|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.DynRelease|x64.ActiveCfg = ReleaseDLL|x64
- {39F60708-FF48-4C22-952D-43470866F684}.DynRelease|x64.Build.0 = ReleaseDLL|x64
- {39F60708-FF48-4C22-952D-43470866F684}.LtcgDebug|Win32.ActiveCfg = DebugLTCG|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.LtcgDebug|Win32.Build.0 = DebugLTCG|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.LtcgDebug|x64.ActiveCfg = DebugLTCG|x64
- {39F60708-FF48-4C22-952D-43470866F684}.LtcgDebug|x64.Build.0 = DebugLTCG|x64
- {39F60708-FF48-4C22-952D-43470866F684}.LtcgRelease|Win32.ActiveCfg = ReleaseLTCG|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.LtcgRelease|Win32.Build.0 = ReleaseLTCG|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.LtcgRelease|x64.ActiveCfg = ReleaseLTCG|x64
- {39F60708-FF48-4C22-952D-43470866F684}.LtcgRelease|x64.Build.0 = ReleaseLTCG|x64
- {39F60708-FF48-4C22-952D-43470866F684}.StaticDebug|Win32.ActiveCfg = DebugLIB|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.StaticDebug|Win32.Build.0 = DebugLIB|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.StaticDebug|x64.ActiveCfg = DebugLIB|x64
- {39F60708-FF48-4C22-952D-43470866F684}.StaticDebug|x64.Build.0 = DebugLIB|x64
- {39F60708-FF48-4C22-952D-43470866F684}.StaticRelease|Win32.ActiveCfg = ReleaseLIB|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.StaticRelease|Win32.Build.0 = ReleaseLIB|Win32
- {39F60708-FF48-4C22-952D-43470866F684}.StaticRelease|x64.ActiveCfg = ReleaseLIB|x64
- {39F60708-FF48-4C22-952D-43470866F684}.StaticRelease|x64.Build.0 = ReleaseLIB|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.DynDebug|Win32.ActiveCfg = DebugDEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.DynDebug|Win32.Build.0 = DebugDEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.DynDebug|x64.ActiveCfg = DebugDEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.DynDebug|x64.Build.0 = DebugDEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.DynRelease|Win32.ActiveCfg = ReleaseDEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.DynRelease|Win32.Build.0 = ReleaseDEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.DynRelease|x64.ActiveCfg = ReleaseDEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.DynRelease|x64.Build.0 = ReleaseDEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.LtcgDebug|Win32.ActiveCfg = DebugLEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.LtcgDebug|Win32.Build.0 = DebugLEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.LtcgDebug|x64.ActiveCfg = DebugLEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.LtcgDebug|x64.Build.0 = DebugLEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.LtcgRelease|Win32.ActiveCfg = ReleaseLEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.LtcgRelease|Win32.Build.0 = ReleaseLEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.LtcgRelease|x64.ActiveCfg = ReleaseLEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.LtcgRelease|x64.Build.0 = ReleaseLEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.StaticDebug|Win32.ActiveCfg = DebugSEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.StaticDebug|Win32.Build.0 = DebugSEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.StaticDebug|x64.ActiveCfg = DebugSEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.StaticDebug|x64.Build.0 = DebugSEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.StaticRelease|Win32.ActiveCfg = ReleaseSEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.StaticRelease|Win32.Build.0 = ReleaseSEXE|Win32
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.StaticRelease|x64.ActiveCfg = ReleaseSEXE|x64
- {15BF93A0-69D3-4723-9FDE-EB8B73C69E09}.StaticRelease|x64.Build.0 = ReleaseSEXE|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/builds/msvc/vs2013/libbitcoin/libbitcoin.props b/builds/msvc/vs2013/libbitcoin/libbitcoin.props
deleted file mode 100644
index 86ee3df..0000000
--- a/builds/msvc/vs2013/libbitcoin/libbitcoin.props
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Libbitcoin Library Common Settings</_PropertySheetDisplayName>
- <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
- <RunCodeAnalysis>false</RunCodeAnalysis>
- </PropertyGroup>
-
- <!-- User Interface -->
-
- <ItemGroup Label="BuildOptionsExtension">
- <PropertyPageSchema Include="$(MSBuildThisFileDirectory)$(ProjectName).xml" />
- </ItemGroup>
-
- <PropertyGroup>
- <Option-leveldb>true</Option-leveldb>
- </PropertyGroup>
-
- <!-- Configuration -->
-
- <ItemDefinitionGroup>
- <ClCompile>
- <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
- <EnablePREfast>false</EnablePREfast>
- <PreprocessorDefinitions>_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessorDefinitions Condition="'$(Option-testnet)' == 'true'">ENABLE_TESTNET;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessorDefinitions Condition="'$(Option-leveldb)' == 'true'">LEVELDB_ENABLED;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <PreprocessorDefinitions Condition="'$(ConfigurationType)'=='DynamicLibrary'">BC_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <!-- HACK : CURL_STATICLIB should be injected by the cURL package. -->
- <PreprocessorDefinitions Condition="'$(ConfigurationType)'=='StaticLibrary'">BC_STATIC;CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- </ItemDefinitionGroup>
-
- <!-- Dependencies -->
-
- <PropertyGroup Condition="$(Configuration.IndexOf('DLL')) != -1">
- <Linkage-curl>dynamic</Linkage-curl>
- <Linkage-zlib>dynamic</Linkage-zlib>
- <Linkage-openssl>dynamic</Linkage-openssl>
- <Linkage-libssh2>dynamic</Linkage-libssh2>
- </PropertyGroup>
- <PropertyGroup Condition="$(Configuration.IndexOf('LTCG')) != -1">
- <Linkage-curl>ltcg</Linkage-curl>
- <Linkage-zlib>ltcg</Linkage-zlib>
- <Linkage-openssl>ltcg</Linkage-openssl>
- <Linkage-libssh2>ltcg</Linkage-libssh2>
- </PropertyGroup>
- <PropertyGroup Condition="$(Configuration.IndexOf('LIB')) != -1">
- <Linkage-curl>static</Linkage-curl>
- <Linkage-zlib>static</Linkage-zlib>
- <Linkage-openssl>static</Linkage-openssl>
- <Linkage-libssh2>static</Linkage-libssh2>
- </PropertyGroup>
-
- <!-- Messages -->
-
- <Target Name="OptionInfo" BeforeTargets="PrepareForBuild">
- <Message Text="Option-leveldb : $(Option-leveldb)" Importance="high"/>
- <Message Text="Option-testnet : $(Option-testnet)" Importance="high"/>
- </Target>
-
- <Target Name="LinkageInfo" BeforeTargets="PrepareForBuild">
- <Message Text="Linkage-curl : $(Linkage-curl)" Importance="high"/>
- <Message Text="Linkage-zlib : $(Linkage-zlib)" Importance="high"/>
- <Message Text="Linkage-openssl : $(Linkage-openssl)" Importance="high"/>
- <Message Text="Linkage-libssh2 : $(Linkage-libssh2)" Importance="high"/>
- </Target>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/libbitcoin/libbitcoin.vcxproj b/builds/msvc/vs2013/libbitcoin/libbitcoin.vcxproj
deleted file mode 100644
index 1a4ccbe..0000000
--- a/builds/msvc/vs2013/libbitcoin/libbitcoin.vcxproj
+++ /dev/null
@@ -1,326 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup Label="Globals">
- <ProjectGuid>{39F60708-FF48-4C22-952D-43470866F684}</ProjectGuid>
- <ProjectName>libbitcoin</ProjectName>
- <RootNamespace>libbitcoin12</RootNamespace>
- </PropertyGroup>
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="DebugDLL|Win32">
- <Configuration>DebugDLL</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseDLL|Win32">
- <Configuration>ReleaseDLL</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugDLL|x64">
- <Configuration>DebugDLL</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseDLL|x64">
- <Configuration>ReleaseDLL</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugLTCG|Win32">
- <Configuration>DebugLTCG</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseLTCG|Win32">
- <Configuration>ReleaseLTCG</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugLTCG|x64">
- <Configuration>DebugLTCG</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseLTCG|x64">
- <Configuration>ReleaseLTCG</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugLIB|Win32">
- <Configuration>DebugLIB</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseLIB|Win32">
- <Configuration>ReleaseLIB</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="DebugLIB|x64">
- <Configuration>DebugLIB</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="ReleaseLIB|x64">
- <Configuration>ReleaseLIB</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Configuration">
- <PlatformToolset>CTP_Nov2013</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'" Label="Configuration">
- <ConfigurationType>DynamicLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'" Label="Configuration">
- <ConfigurationType>DynamicLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'" Label="Configuration">
- <ConfigurationType>DynamicLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'" Label="Configuration">
- <ConfigurationType>DynamicLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLTCG|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTCG|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLTCG|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTCG|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLIB|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLIB|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLIB|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLIB|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\DynamicDebug.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\DynamicRelease.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\DynamicDebug.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\DynamicRelease.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLTCG|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\StaticDebugLinkTimeCodeGeneration.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTCG|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\StaticReleaseLinkTimeCodeGeneration.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLTCG|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\StaticDebugLinkTimeCodeGeneration.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTCG|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\StaticReleaseLinkTimeCodeGeneration.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLIB|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\StaticDebug.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLIB|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\StaticRelease.props" />
- <Import Project="$(ProjectDir)..\properties\Win32.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLIB|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\StaticDebug.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLIB|x64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- <Import Project="$(ProjectDir)$(ProjectName).props" />
- <Import Project="$(ProjectDir)..\properties\StaticRelease.props" />
- <Import Project="$(ProjectDir)..\properties\x64.props" />
- </ImportGroup>
- <ItemGroup>
- <ClCompile Include="..\..\..\..\src\address.cpp" />
- <ClCompile Include="..\..\..\..\src\block.cpp" />
- <ClCompile Include="..\..\..\..\src\blockchain\blockchain.cpp" />
- <ClCompile Include="..\..\..\..\src\blockchain\database\mman_win32.c" />
- <ClCompile Include="..\..\..\..\src\blockchain\database\stealth_database.cpp" />
- <ClCompile Include="..\..\..\..\src\blockchain\organizer.cpp" />
- <ClCompile Include="..\..\..\..\src\constants.cpp" />
- <ClCompile Include="..\..\..\..\src\error.cpp" />
- <ClCompile Include="..\..\..\..\src\format.cpp" />
- <ClCompile Include="..\..\..\..\src\getx_responder.cpp" />
- <ClCompile Include="..\..\..\..\src\network\channel.cpp" />
- <ClCompile Include="..\..\..\..\src\network\handshake.cpp" />
- <ClCompile Include="..\..\..\..\src\network\hosts.cpp" />
- <ClCompile Include="..\..\..\..\src\network\network.cpp" />
- <ClCompile Include="..\..\..\..\src\network\protocol.cpp" />
- <ClCompile Include="..\..\..\..\src\poller.cpp" />
- <ClCompile Include="..\..\..\..\src\satoshi_serialize.cpp" />
- <ClCompile Include="..\..\..\..\src\script.cpp" />
- <ClCompile Include="..\..\..\..\src\session.cpp" />
- <ClCompile Include="..\..\..\..\src\stealth.cpp" />
- <ClCompile Include="..\..\..\..\src\threadpool.cpp" />
- <ClCompile Include="..\..\..\..\src\transaction.cpp" />
- <ClCompile Include="..\..\..\..\src\transaction_indexer.cpp" />
- <ClCompile Include="..\..\..\..\src\transaction_pool.cpp" />
- <ClCompile Include="..\..\..\..\src\utility\base58.cpp" />
- <ClCompile Include="..\..\..\..\src\utility\big_number.cpp" />
- <ClCompile Include="..\..\..\..\src\utility\elliptic_curve_key.cpp" />
- <ClCompile Include="..\..\..\..\src\utility\logger.cpp" />
- <ClCompile Include="..\..\..\..\src\utility\mmfile.cpp" />
- <ClCompile Include="..\..\..\..\src\utility\ripemd.cpp" />
- <ClCompile Include="..\..\..\..\src\utility\sha256.cpp" />
- <ClCompile Include="..\..\..\..\src\utility\timed_section.cpp" />
- <ClCompile Include="..\..\..\..\src\validate.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\..\..\include\bitcoin\address.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\bitcoin.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\block.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\blockchain\blockchain.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\blockchain\database\stealth_database.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\blockchain\leveldb_blockchain.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\blockchain\organizer.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\constants.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\define.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\error.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\format.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\getx_responder.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\network\channel.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\network\handshake.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\network\hosts.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\network\network.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\network\protocol.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\network\shared_const_buffer.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\poller.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\primitives.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\satoshi_serialize.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\script.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\session.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\stealth.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\threadpool.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\transaction.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\transaction_indexer.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\transaction_pool.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\types.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\assert.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\async_parallel.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\base58.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\big_number.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\decorator.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\elliptic_curve_key.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\logger.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\mmfile.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\ripemd.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\serializer.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\sha256.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\subscriber.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\timed_section.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\weak_bind.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\validate.hpp" />
- <ClInclude Include="..\..\..\..\include\bitcoin\version.hpp" />
- <ClInclude Include="..\..\..\..\src\blockchain\database\mman_win32.h" />
- <ClInclude Include="..\..\..\..\src\blockchain\leveldb\leveldb_chain_keeper.hpp" />
- <ClInclude Include="..\..\..\..\src\blockchain\leveldb\leveldb_common.hpp" />
- <ClInclude Include="..\..\..\..\src\blockchain\leveldb\leveldb_organizer.hpp" />
- <ClInclude Include="..\..\..\..\src\blockchain\leveldb\leveldb_validate_block.hpp" />
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_blockchain.cpp">
- <ExcludedFromBuild Condition="'$(Option-leveldb)' != 'true'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_chain_keeper.cpp">
- <ExcludedFromBuild Condition="'$(Option-leveldb)' != 'true'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_common.cpp">
- <ExcludedFromBuild Condition="'$(Option-leveldb)' != 'true'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_organizer.cpp">
- <ExcludedFromBuild Condition="'$(Option-leveldb)' != 'true'">true</ExcludedFromBuild>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_validate_block.cpp">
- <ExcludedFromBuild Condition="'$(Option-leveldb)' != 'true'">true</ExcludedFromBuild>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <None Include="..\..\..\..\include\bitcoin\impl\serialize\block.ipp" />
- <None Include="..\..\..\..\include\bitcoin\impl\serialize\misc.ipp" />
- <None Include="packages.config" />
- </ItemGroup>
- <ItemGroup>
- <Text Include="readme.txt" />
- </ItemGroup>
- <Import Project="..\..\..\..\..\..\nuget\Snappy.1.1.1.7\build\native\Snappy.props" Condition="Exists('..\..\..\..\..\..\nuget\Snappy.1.1.1.7\build\native\Snappy.props')" />
- <Import Project="..\..\..\..\..\..\nuget\LevelDB.1.16.0.5\build\native\LevelDB.props" Condition="Exists('..\..\..\..\..\..\nuget\LevelDB.1.16.0.5\build\native\LevelDB.props')" />
- <Import Project="..\..\..\..\..\..\nuget\Crc32C.1.0.4\build\native\Crc32C.props" Condition="Exists('..\..\..\..\..\..\nuget\Crc32C.1.0.4\build\native\Crc32C.props')" />
- <Import Project="..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.props" Condition="Exists('..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.props')" />
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets" />
- <ImportGroup Label="ExtensionSettings">
- <Import Project="..\..\..\..\..\..\nuget\boost.1.55.0.16\build\native\boost.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost.1.55.0.16\build\native\boost.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost_system-vc120.1.55.0.16\build\native\boost_system-vc120.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost_system-vc120.1.55.0.16\build\native\boost_system-vc120.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost_date_time-vc120.1.55.0.16\build\native\boost_date_time-vc120.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost_date_time-vc120.1.55.0.16\build\native\boost_date_time-vc120.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost_regex-vc120.1.55.0.16\build\native\boost_regex-vc120.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost_regex-vc120.1.55.0.16\build\native\boost_regex-vc120.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\boost_filesystem-vc120.1.55.0.16\build\native\boost_filesystem-vc120.targets" Condition="Exists('..\..\..\..\..\..\nuget\boost_filesystem-vc120.1.55.0.16\build\native\boost_filesystem-vc120.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\curl.redist.7.30.0.2\build\native\curl.redist.targets" Condition="Exists('..\..\..\..\..\..\nuget\curl.redist.7.30.0.2\build\native\curl.redist.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\curl.7.30.0.2\build\native\curl.targets" Condition="Exists('..\..\..\..\..\..\nuget\curl.7.30.0.2\build\native\curl.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\zlib.redist.1.2.8.6\build\native\zlib.redist.targets" Condition="Exists('..\..\..\..\..\..\nuget\zlib.redist.1.2.8.6\build\native\zlib.redist.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\zlib.1.2.8.6\build\native\zlib.targets" Condition="Exists('..\..\..\..\..\..\nuget\zlib.1.2.8.6\build\native\zlib.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\openssl.redist.1.0.1.24\build\native\openssl.redist.targets" Condition="Exists('..\..\..\..\..\..\nuget\openssl.redist.1.0.1.24\build\native\openssl.redist.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.targets" Condition="Exists('..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\libssh2.redist.1.4.3.3\build\native\libssh2.redist.targets" Condition="Exists('..\..\..\..\..\..\nuget\libssh2.redist.1.4.3.3\build\native\libssh2.redist.targets')" />
- <Import Project="..\..\..\..\..\..\nuget\libssh2.1.4.3.3\build\native\libssh2.targets" Condition="Exists('..\..\..\..\..\..\nuget\libssh2.1.4.3.3\build\native\libssh2.targets')" />
- </ImportGroup>
- <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
- <PropertyGroup>
- <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
- </PropertyGroup>
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\Crc32C.1.0.4\build\native\Crc32C.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\Crc32C.1.0.4\build\native\Crc32C.props'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\Snappy.1.1.1.7\build\native\Snappy.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\Snappy.1.1.1.7\build\native\Snappy.props'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\LevelDB.1.16.0.5\build\native\LevelDB.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\LevelDB.1.16.0.5\build\native\LevelDB.props'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost.1.55.0.16\build\native\boost.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost.1.55.0.16\build\native\boost.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost_system-vc120.1.55.0.16\build\native\boost_system-vc120.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost_system-vc120.1.55.0.16\build\native\boost_system-vc120.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost_date_time-vc120.1.55.0.16\build\native\boost_date_time-vc120.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost_date_time-vc120.1.55.0.16\build\native\boost_date_time-vc120.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost_regex-vc120.1.55.0.16\build\native\boost_regex-vc120.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost_regex-vc120.1.55.0.16\build\native\boost_regex-vc120.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\boost_filesystem-vc120.1.55.0.16\build\native\boost_filesystem-vc120.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\boost_filesystem-vc120.1.55.0.16\build\native\boost_filesystem-vc120.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\curl.redist.7.30.0.2\build\native\curl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\curl.redist.7.30.0.2\build\native\curl.redist.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\curl.7.30.0.2\build\native\curl.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\curl.7.30.0.2\build\native\curl.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\zlib.redist.1.2.8.6\build\native\zlib.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\zlib.redist.1.2.8.6\build\native\zlib.redist.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\zlib.1.2.8.6\build\native\zlib.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\zlib.1.2.8.6\build\native\zlib.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\openssl.redist.1.0.1.24\build\native\openssl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\openssl.redist.1.0.1.24\build\native\openssl.redist.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.props'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\openssl.1.0.1.24\build\native\openssl.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\libssh2.redist.1.4.3.3\build\native\libssh2.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\libssh2.redist.1.4.3.3\build\native\libssh2.redist.targets'))" />
- <Error Condition="!Exists('..\..\..\..\..\..\nuget\libssh2.1.4.3.3\build\native\libssh2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\..\nuget\libssh2.1.4.3.3\build\native\libssh2.targets'))" />
- </Target>
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/libbitcoin/libbitcoin.vcxproj.filters b/builds/msvc/vs2013/libbitcoin/libbitcoin.vcxproj.filters
deleted file mode 100644
index d61a6f4..0000000
--- a/builds/msvc/vs2013/libbitcoin/libbitcoin.vcxproj.filters
+++ /dev/null
@@ -1,329 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="src">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="include">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="src\utility">
- <UniqueIdentifier>{8d26a34b-6f23-4d66-8d64-6b50feadc4db}</UniqueIdentifier>
- </Filter>
- <Filter Include="src\network">
- <UniqueIdentifier>{785639c3-4aba-44db-9501-9797e573c681}</UniqueIdentifier>
- </Filter>
- <Filter Include="src\blockchain">
- <UniqueIdentifier>{cfa7bc5d-1852-4eae-836d-7ca997d7eb24}</UniqueIdentifier>
- </Filter>
- <Filter Include="include\blockchain">
- <UniqueIdentifier>{812d0350-06b8-414d-b0d8-d8de8110c38c}</UniqueIdentifier>
- </Filter>
- <Filter Include="include\utility">
- <UniqueIdentifier>{67a8f56c-9dc0-4c44-a5ff-020667929caa}</UniqueIdentifier>
- </Filter>
- <Filter Include="include\network">
- <UniqueIdentifier>{86cf2b40-4c9c-4858-80f7-7bb8c4d06b36}</UniqueIdentifier>
- </Filter>
- <Filter Include="include\impl">
- <UniqueIdentifier>{5afb9fba-cd2c-438a-aedd-39c8acc14af4}</UniqueIdentifier>
- </Filter>
- <Filter Include="include\impl\serialize">
- <UniqueIdentifier>{849640c1-d79f-4baa-bfb5-0ea86d1c9988}</UniqueIdentifier>
- </Filter>
- <Filter Include="include\blockchain\database">
- <UniqueIdentifier>{a20c92ac-7138-4374-9d06-e95d1df0ecc5}</UniqueIdentifier>
- </Filter>
- <Filter Include="src\blockchain\database">
- <UniqueIdentifier>{441e5e7d-632f-4dcb-b342-06f5795d3f19}</UniqueIdentifier>
- </Filter>
- <Filter Include="src\blockchain\leveldb">
- <UniqueIdentifier>{61f50a9e-d52f-4336-820e-3ac84f2305d4}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <None Include="..\..\..\..\include\bitcoin\impl\serialize\block.ipp">
- <Filter>include\impl\serialize</Filter>
- </None>
- <None Include="..\..\..\..\include\bitcoin\impl\serialize\misc.ipp">
- <Filter>include\impl\serialize</Filter>
- </None>
- <None Include="packages.config" />
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\..\..\..\src\error.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\format.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\getx_responder.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\poller.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\satoshi_serialize.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\script.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\threadpool.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\transaction.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\transaction_indexer.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\transaction_pool.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\validate.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\address.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\block.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\constants.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\utility\ripemd.cpp">
- <Filter>src\utility</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\utility\sha256.cpp">
- <Filter>src\utility</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\utility\timed_section.cpp">
- <Filter>src\utility</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\utility\base58.cpp">
- <Filter>src\utility</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\utility\big_number.cpp">
- <Filter>src\utility</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\utility\elliptic_curve_key.cpp">
- <Filter>src\utility</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\utility\logger.cpp">
- <Filter>src\utility</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\network\hosts.cpp">
- <Filter>src\network</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\network\network.cpp">
- <Filter>src\network</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\network\protocol.cpp">
- <Filter>src\network</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\network\channel.cpp">
- <Filter>src\network</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\network\handshake.cpp">
- <Filter>src\network</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\blockchain.cpp">
- <Filter>src\blockchain</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\organizer.cpp">
- <Filter>src\blockchain</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_organizer.cpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_validate_block.cpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_blockchain.cpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_chain_keeper.cpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\leveldb\leveldb_common.cpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClCompile>
- <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\snappy-single-file.cpp" />
- <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\leveldb-single-file.cpp" />
- <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\crc32c.cpp" />
- <ClCompile Include="..\..\..\..\src\stealth.cpp">
- <Filter>src</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\utility\mmfile.cpp">
- <Filter>src\utility</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\database\stealth_database.cpp">
- <Filter>src\blockchain\database</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\blockchain\database\mman_win32.c">
- <Filter>src\blockchain\database</Filter>
- </ClCompile>
- <ClCompile Include="..\..\..\..\src\session.cpp">
- <Filter>src</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\..\..\..\src\blockchain\leveldb\leveldb_organizer.hpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\src\blockchain\leveldb\leveldb_validate_block.hpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\src\blockchain\leveldb\leveldb_chain_keeper.hpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\src\blockchain\leveldb\leveldb_common.hpp">
- <Filter>src\blockchain\leveldb</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\error.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\format.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\getx_responder.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\poller.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\primitives.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\satoshi_serialize.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\script.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\session.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\threadpool.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\transaction.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\transaction_indexer.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\transaction_pool.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\types.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\validate.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\version.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\address.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\bitcoin.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\block.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\constants.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\ripemd.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\serializer.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\sha256.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\subscriber.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\timed_section.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\weak_bind.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\assert.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\async_parallel.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\base58.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\big_number.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\decorator.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\elliptic_curve_key.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\logger.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\blockchain\leveldb_blockchain.hpp">
- <Filter>include\blockchain</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\blockchain\organizer.hpp">
- <Filter>include\blockchain</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\blockchain\blockchain.hpp">
- <Filter>include\blockchain</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\network\network.hpp">
- <Filter>include\network</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\network\protocol.hpp">
- <Filter>include\network</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\network\shared_const_buffer.hpp">
- <Filter>include\network</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\network\channel.hpp">
- <Filter>include\network</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\network\handshake.hpp">
- <Filter>include\network</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\network\hosts.hpp">
- <Filter>include\network</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\blockchain\database\stealth_database.hpp">
- <Filter>include\blockchain\database</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\stealth.hpp">
- <Filter>include</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\utility\mmfile.hpp">
- <Filter>include\utility</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\src\blockchain\database\mman_win32.h">
- <Filter>src\blockchain\database</Filter>
- </ClInclude>
- <ClInclude Include="..\..\..\..\include\bitcoin\define.hpp">
- <Filter>include</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <Text Include="readme.txt" />
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/libbitcoin/libbitcoin.xml b/builds/msvc/vs2013/libbitcoin/libbitcoin.xml
deleted file mode 100644
index 70e37de..0000000
--- a/builds/msvc/vs2013/libbitcoin/libbitcoin.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ProjectSchemaDefinitions xmlns="clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework">
- <Rule Name="libbitcoin-uiextension" PageTemplate="tool" DisplayName="Bitcoin Options" SwitchPrefix="/" Order="1">
- <Rule.Categories>
- <Category Name="leveldb" DisplayName="leveldb" />
- <Category Name="testnet" DisplayName="testnet" />
- </Rule.Categories>
- <Rule.DataSource>
- <DataSource Persistence="ProjectFile" ItemType="" />
- </Rule.DataSource>
- <EnumProperty Name="Option-leveldb" DisplayName="Enable LevelDB" Description="Enable the LevelDB build option" Category="leveldb">
- <EnumValue Name="" DisplayName="No" />
- <EnumValue Name="true" DisplayName="Yes" />
- </EnumProperty>
- <EnumProperty Name="Option-testnet" DisplayName="Enable Testnet" Description="Enable the Testnet build option" Category="testnet">
- <EnumValue Name="" DisplayName="No" />
- <EnumValue Name="true" DisplayName="Yes" />
- </EnumProperty>
- </Rule>
-</ProjectSchemaDefinitions> \ No newline at end of file
diff --git a/builds/msvc/vs2013/libbitcoin/packages.config b/builds/msvc/vs2013/libbitcoin/packages.config
deleted file mode 100644
index 5c9602a..0000000
--- a/builds/msvc/vs2013/libbitcoin/packages.config
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="curl" version="7.30.0.2" targetFramework="Native" />
- <package id="curl.redist" version="7.30.0.2" targetFramework="Native" />
- <package id="libssh2" version="1.4.3.3" targetFramework="Native" />
- <package id="libssh2.redist" version="1.4.3.3" targetFramework="Native" />
- <package id="openssl" version="1.0.1.24" targetFramework="Native" />
- <package id="openssl.redist" version="1.0.1.24" targetFramework="Native" />
- <package id="zlib" version="1.2.8.6" targetFramework="Native" />
- <package id="zlib.redist" version="1.2.8.6" targetFramework="Native" />
-</packages> \ No newline at end of file
diff --git a/builds/msvc/vs2013/libbitcoin/readme.txt b/builds/msvc/vs2013/libbitcoin/readme.txt
deleted file mode 100644
index d28acda..0000000
--- a/builds/msvc/vs2013/libbitcoin/readme.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Unsafe endian assumption in crc32c.h:
-
-// This assumes little-endian integers, as is the case on Intel processors that
-// the assembler code here is for.
-static uint32_t append_adler_table(uint32_t crci, buffer input, size_t length)
diff --git a/builds/msvc/vs2013/packages.config b/builds/msvc/vs2013/packages.config
deleted file mode 100644
index 8ba6d71..0000000
--- a/builds/msvc/vs2013/packages.config
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="boost" version="1.55.0.16" targetFramework="Native" />
- <package id="boost_date_time-vc120" version="1.55.0.16" targetFramework="Native" />
- <package id="boost_filesystem-vc120" version="1.55.0.16" targetFramework="Native" />
- <package id="boost_regex-vc120" version="1.55.0.16" targetFramework="Native" />
- <package id="boost_system-vc120" version="1.55.0.16" targetFramework="Native" />
- <package id="Crc32C" version="1.0.4" targetFramework="Native" />
- <package id="curl" version="7.30.0.2" targetFramework="Native" />
- <package id="curl.redist" version="7.30.0.2" targetFramework="Native" />
- <package id="LevelDB" version="1.16.0.5" targetFramework="Native" />
- <package id="libssh2" version="1.4.3.3" targetFramework="Native" />
- <package id="libssh2.redist" version="1.4.3.3" targetFramework="Native" />
- <package id="openssl" version="1.0.1.24" targetFramework="Native" />
- <package id="openssl.redist" version="1.0.1.24" targetFramework="Native" />
- <package id="Snappy" version="1.1.1.7" targetFramework="Native" />
- <package id="zlib" version="1.2.8.6" targetFramework="Native" />
- <package id="zlib.redist" version="1.2.8.6" targetFramework="Native" />
-</packages> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/Common.props b/builds/msvc/vs2013/properties/Common.props
deleted file mode 100644
index 2acf2e6..0000000
--- a/builds/msvc/vs2013/properties/Common.props
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Common Settings</_PropertySheetDisplayName>
- <CharacterSet>Unicode</CharacterSet>
- <TargetName>$(ProjectName)</TargetName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <MultiProcessorCompilation>true</MultiProcessorCompilation>
- <!-- Windows and CRT definitions for unicode. Note that Linux only supports unicode so char is 16 bit. -->
- <PreprocessorDefinitions>UNICODE;_UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <WarningLevel>Level3</WarningLevel>
- </ClCompile>
- </ItemDefinitionGroup>
-
- <Target Name="ConfigInfo" BeforeTargets="PrepareForBuild">
- <Message Text="ConfigurationType : $(ConfigurationType)" Importance="high"/>
- <Message Text="Configuration : $(Configuration)" Importance="high"/>
- <Message Text="PlatformToolset : $(PlatformToolset)" Importance="high"/>
- <Message Text="Building..." Importance="high"/>
- </Target>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/Console.props b/builds/msvc/vs2013/properties/Console.props
deleted file mode 100644
index 414c98a..0000000
--- a/builds/msvc/vs2013/properties/Console.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Common.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Console Application</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- </Link>
- </ItemDefinitionGroup>
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/ConsoleDebugDynamic.props b/builds/msvc/vs2013/properties/ConsoleDebugDynamic.props
deleted file mode 100644
index 5872b5c..0000000
--- a/builds/msvc/vs2013/properties/ConsoleDebugDynamic.props
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Console.props" />
- <Import Project="Debug.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Console Debug Dynamic</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Linking CRT dynamically when building a dynamic library is conventional. -->
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <LinkIncremental>true</LinkIncremental>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/ConsoleDebugLinkTimeCodeGeneration.props b/builds/msvc/vs2013/properties/ConsoleDebugLinkTimeCodeGeneration.props
deleted file mode 100644
index 1e752c2..0000000
--- a/builds/msvc/vs2013/properties/ConsoleDebugLinkTimeCodeGeneration.props
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Console.props" />
- <Import Project="Debug.props" />
- <Import Project="LinkTimeCodeGeneration.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Console Debug Link Time Code Generation Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <LinkIncremental>false</LinkIncremental>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/ConsoleDebugStatic.props b/builds/msvc/vs2013/properties/ConsoleDebugStatic.props
deleted file mode 100644
index 5d72bbc..0000000
--- a/builds/msvc/vs2013/properties/ConsoleDebugStatic.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Console.props" />
- <Import Project="Debug.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Console Debug Static</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <LinkIncremental>true</LinkIncremental>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/ConsoleReleaseDynamic.props b/builds/msvc/vs2013/properties/ConsoleReleaseDynamic.props
deleted file mode 100644
index f15070d..0000000
--- a/builds/msvc/vs2013/properties/ConsoleReleaseDynamic.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Console.props" />
- <Import Project="Release.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Console Release Dynamic</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Linking CRT dynamically when building a dynamic library is conventional. -->
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/ConsoleReleaseLinkTimeCodeGeneration.props b/builds/msvc/vs2013/properties/ConsoleReleaseLinkTimeCodeGeneration.props
deleted file mode 100644
index 984891b..0000000
--- a/builds/msvc/vs2013/properties/ConsoleReleaseLinkTimeCodeGeneration.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Console.props" />
- <Import Project="Release.props" />
- <Import Project="LinkTimeCodeGeneration.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Console Release Link Time Code Generation Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/ConsoleReleaseStatic.props b/builds/msvc/vs2013/properties/ConsoleReleaseStatic.props
deleted file mode 100644
index 2aaf303..0000000
--- a/builds/msvc/vs2013/properties/ConsoleReleaseStatic.props
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Console.props" />
- <Import Project="Release.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Console Release Static</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/Debug.props b/builds/msvc/vs2013/properties/Debug.props
deleted file mode 100644
index a286777..0000000
--- a/builds/msvc/vs2013/properties/Debug.props
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Debug Configuration</_PropertySheetDisplayName>
- <!-- RootNamespace is used to deconflict output files from differing project versions. -->
- <IntDir>$(ProjectDir)..\..\..\..\obj\$(PlatformName)\$(Configuration)\$(RootNamespace)\</IntDir>
- <OutDir>$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Debug\$(RootNamespace)\</OutDir>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile><DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ResourceCompile>
- <Link>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <ImportLibrary>$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Debug\$(RootNamespace)\$(TargetName).imp.lib</ImportLibrary>
- </Link>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/Dynamic.props b/builds/msvc/vs2013/properties/Dynamic.props
deleted file mode 100644
index 9e74917..0000000
--- a/builds/msvc/vs2013/properties/Dynamic.props
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Common.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Dynamic Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <PreprocessorDefinitions>_DLL;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/DynamicDebug.props b/builds/msvc/vs2013/properties/DynamicDebug.props
deleted file mode 100644
index ee40a01..0000000
--- a/builds/msvc/vs2013/properties/DynamicDebug.props
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Dynamic.props" />
- <Import Project="Debug.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Dynamic Debug Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Linking CRT dynamically when building a dynamic library is conventional. -->
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <LinkIncremental>true</LinkIncremental>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/DynamicRelease.props b/builds/msvc/vs2013/properties/DynamicRelease.props
deleted file mode 100644
index c3f36f8..0000000
--- a/builds/msvc/vs2013/properties/DynamicRelease.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Dynamic.props" />
- <Import Project="Release.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Dynamic Release Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Linking CRT dynamically when building a dynamic library is conventional. -->
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/LinkTimeCodeGeneration.props b/builds/msvc/vs2013/properties/LinkTimeCodeGeneration.props
deleted file mode 100644
index 644462f..0000000
--- a/builds/msvc/vs2013/properties/LinkTimeCodeGeneration.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Link Time Code Generation Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </ClCompile>
- <Link>
- <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
- </Link>
- <Lib>
- <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>
- </Lib>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/Release.props b/builds/msvc/vs2013/properties/Release.props
deleted file mode 100644
index c211128..0000000
--- a/builds/msvc/vs2013/properties/Release.props
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Release Configuration</_PropertySheetDisplayName>
- <!-- RootNamespace is used to deconflict output files from differing project versions. -->
- <IntDir>$(ProjectDir)..\..\..\..\obj\$(PlatformName)\$(Configuration)\$(RootNamespace)\</IntDir>
- <OutDir>$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Release\$(RootNamespace)\</OutDir>
- <LinkIncremental>false</LinkIncremental>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <AdditionalOptions>/Oy- %(AdditionalOptions)</AdditionalOptions>
- <!--<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>-->
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
- <MinimalRebuild>false</MinimalRebuild>
- <Optimization>MaxSpeed</Optimization>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- <ResourceCompile>
- <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ResourceCompile>
- <Link>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <!--<GenerateDebugInformation>true</GenerateDebugInformation>-->
- <ImportLibrary>$(ProjectDir)..\..\..\..\bin\$(PlatformName)\Release\$(RootNamespace)\$(TargetName).imp.lib</ImportLibrary>
- <OptimizeReferences>true</OptimizeReferences>
- </Link>
- </ItemDefinitionGroup>
-
- <ItemDefinitionGroup Condition="'$(Platform)'=='Win32'">
- <ClCompile>
- <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/Static.props b/builds/msvc/vs2013/properties/Static.props
deleted file mode 100644
index 85207e4..0000000
--- a/builds/msvc/vs2013/properties/Static.props
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Common.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Static Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/StaticDebug.props b/builds/msvc/vs2013/properties/StaticDebug.props
deleted file mode 100644
index 8668424..0000000
--- a/builds/msvc/vs2013/properties/StaticDebug.props
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Static.props" />
- <Import Project="Debug.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Static Debug Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Linking CRT statically when building a static library is conventional. -->
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <LinkIncremental>true</LinkIncremental>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/StaticDebugLinkTimeCodeGeneration.props b/builds/msvc/vs2013/properties/StaticDebugLinkTimeCodeGeneration.props
deleted file mode 100644
index a35e0e7..0000000
--- a/builds/msvc/vs2013/properties/StaticDebugLinkTimeCodeGeneration.props
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Debug.props" />
- <Import Project="StaticLinkTimeCodeGeneration.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Static Debug Link Time Code Generation Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Linking CRT statically when building a static library is conventional. -->
- <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
- <LinkIncremental>false</LinkIncremental>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/StaticLinkTimeCodeGeneration.props b/builds/msvc/vs2013/properties/StaticLinkTimeCodeGeneration.props
deleted file mode 100644
index 6a8d883..0000000
--- a/builds/msvc/vs2013/properties/StaticLinkTimeCodeGeneration.props
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Static.props" />
- <Import Project="LinkTimeCodeGeneration.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Static Link Time Code Generation Library</_PropertySheetDisplayName>
-
- <!-- This overrides Static.props->Common.props->TargetName and therefore this
- reference must always be set after Static.props->Common.props is included. -->
- <TargetName>$(TargetName).ltcg</TargetName>
- </PropertyGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/StaticRelease.props b/builds/msvc/vs2013/properties/StaticRelease.props
deleted file mode 100644
index 5eaadae..0000000
--- a/builds/msvc/vs2013/properties/StaticRelease.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Static.props" />
- <Import Project="Release.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Static Release Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Linking CRT statically when building a static library is conventional. -->
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/StaticReleaseLinkTimeCodeGeneration.props b/builds/msvc/vs2013/properties/StaticReleaseLinkTimeCodeGeneration.props
deleted file mode 100644
index 4515bef..0000000
--- a/builds/msvc/vs2013/properties/StaticReleaseLinkTimeCodeGeneration.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <ImportGroup Label="PropertySheets">
- <Import Project="Release.props" />
- <Import Project="StaticLinkTimeCodeGeneration.props" />
- </ImportGroup>
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Static Release Link Time Code Generation Library</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Linking CRT statically when building a static library is conventional. -->
- <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
- </ClCompile>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/Win32.props b/builds/msvc/vs2013/properties/Win32.props
deleted file mode 100644
index 8d611a0..0000000
--- a/builds/msvc/vs2013/properties/Win32.props
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup>
- <_PropertySheetDisplayName>Win32 Settings</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- <Link>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- <Lib>
- <AdditionalOptions>/MACHINE:X86 %(AdditionalOptions)</AdditionalOptions>
- </Lib>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/builds/msvc/vs2013/properties/x64.props b/builds/msvc/vs2013/properties/x64.props
deleted file mode 100644
index ddf9c14..0000000
--- a/builds/msvc/vs2013/properties/x64.props
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-
- <PropertyGroup>
- <_PropertySheetDisplayName>x64 Settings</_PropertySheetDisplayName>
- </PropertyGroup>
-
- <ItemDefinitionGroup>
- <ClCompile>
- <!-- Note that Win64 defines may cause WIN32 to become defined when using windows headers,
- but _WIN32 implies Windows 32 bit or above. If the standard headers are not included
- these are sometimes required even for 64 bit builds and should never cause harm there.-->
- <PreprocessorDefinitions>WIN32;_WIN32;WIN64;_WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- </ClCompile>
- <Link>
- <TargetMachine>MachineX64</TargetMachine>
- </Link>
- <Lib>
- <AdditionalOptions>/MACHINE:X64 %(AdditionalOptions)</AdditionalOptions>
- </Lib>
- </ItemDefinitionGroup>
-
-</Project> \ No newline at end of file
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index c574cb4..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,58 +0,0 @@
-AC_INIT([libbitcoin], [1.0.10], [amir@unsystem.net])
-AC_USE_SYSTEM_EXTENSIONS
-AC_LANG(C++)
-AC_CONFIG_AUX_DIR([build-aux])
-AC_CONFIG_MACRO_DIR([m4])
-AM_INIT_AUTOMAKE([-Wall -Werror])
-AM_PROG_AR
-LT_INIT
-AC_PROG_CXX
-AC_PROG_LIBTOOL
-AC_GNU_SOURCE
-AX_CXX_COMPILE_STDCXX_11(noext,mandatory)
-
-m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
-
-AC_ARG_ENABLE(leveldb,
- [AC_HELP_STRING([--enable-leveldb],
- [Build LevelDB support.])],
- [bld_leveldb="$enable_leveldb"], [bld_leveldb="no"])
-AM_CONDITIONAL([DO_LEVELDB], [test "$enable_leveldb" = "yes"])
-
-AC_MSG_CHECKING(--enable-testnet argument)
-AC_ARG_ENABLE(testnet,
- [ --enable-testnet Enable testnet],
- [enable_testnet=$enableval],
- [enable_testnet="no"])
-AC_MSG_RESULT($enable_testnet)
-if test "$enable_testnet" = "yes"; then
- AC_DEFINE(ENABLE_TESTNET)
-fi
-
-AX_BOOST_BASE
-#AX_BOOST_SYSTEM
-#AX_BOOST_THREAD
-
-PKG_PROG_PKG_CONFIG
-
-if test "$bld_leveldb" = "yes"; then
- AC_SUBST(LDFLAG_LEVELDB)
- LDFLAG_LEVELDB="-lleveldb"
- AC_SUBST(CFLAG_LEVELDB)
- CFLAG_LEVELDB="-DLEVELDB_ENABLED"
-fi
-
-AM_CXXFLAGS="-ggdb -g3 -Wall -Wno-missing-braces -pedantic -Wextra -fstack-protector-all -DDEBUG"
-AC_SUBST([AM_CXXFLAGS])
-
-PKG_CHECK_MODULES([SSL], [libssl >= 0.9])
-PKG_CHECK_MODULES([CURL], [libcurl])
-
-AC_ARG_WITH([pkgconfigdir], AS_HELP_STRING([--with-pkgconfigdir=PATH],
- [Path to the pkgconfig directory [[LIBDIR/pkgconfig]]]),
- [pkgconfigdir="$withval"], [pkgconfigdir='${libdir}/pkgconfig'])
-AC_SUBST([pkgconfigdir])
-
-AC_CONFIG_FILES([Makefile include/bitcoin/Makefile src/Makefile libbitcoin.pc])
-AC_OUTPUT
-
diff --git a/doc/README.tutorial b/doc/README.tutorial
deleted file mode 100644
index 00cd4eb..0000000
--- a/doc/README.tutorial
+++ /dev/null
@@ -1,13 +0,0 @@
-You can view the libbitcoin documentation online:
-
- http://libbitcoin.dyne.org/doc/
-
-If you prefer to generate the documentation install python-sphinx.
-
- $ cd sphinx
- $ make html
-
-The documentation will be built in sphinx/_build/html/
-It's also possible to generate man pages or other formats.
-Type 'make' by itself to see a list of the possible output formats.
-
diff --git a/doc/libbitcoin/README b/doc/libbitcoin/README
deleted file mode 100644
index 31893f6..0000000
--- a/doc/libbitcoin/README
+++ /dev/null
@@ -1,2 +0,0 @@
-This is the historic founding document behind libbitcoin.
-
diff --git a/doc/libbitcoin/drawing.svg b/doc/libbitcoin/drawing.svg
deleted file mode 100644
index 45ecefe..0000000
--- a/doc/libbitcoin/drawing.svg
+++ /dev/null
@@ -1,929 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.1 r9760"
- sodipodi:docname="New document 1">
- <defs
- id="defs4">
- <marker
- inkscape:stockid="Arrow1Lstart"
- orient="auto"
- refY="0.0"
- refX="0.0"
- id="Arrow1Lstart"
- style="overflow:visible">
- <path
- id="path4052"
- d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
- transform="scale(0.8) translate(12.5,0)" />
- </marker>
- <marker
- inkscape:stockid="Arrow1Lend"
- orient="auto"
- refY="0.0"
- refX="0.0"
- id="Arrow1Lend"
- style="overflow:visible;">
- <path
- id="path4055"
- d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
- transform="scale(0.8) rotate(180) translate(12.5,0)" />
- </marker>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="0.49497475"
- inkscape:cx="331.18872"
- inkscape:cy="-2525.7329"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="false"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1020"
- inkscape:window-height="745"
- inkscape:window-x="0"
- inkscape:window-y="19"
- inkscape:window-maximized="0" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- sodipodi:type="arc"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="path3805"
- sodipodi:cx="327.28943"
- sodipodi:cy="188.17668"
- sodipodi:rx="324.25897"
- sodipodi:ry="226.77925"
- d="m 651.5484,188.17668 a 324.25897,226.77925 0 1 1 -648.5179435,0 324.25897,226.77925 0 1 1 648.5179435,0 z"
- transform="matrix(1,0,0,1.1879246,18.182746,-40.222796)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- inkscape:export-xdpi="69.07"
- inkscape:export-ydpi="69.07" />
- <g
- id="g3811">
- <path
- inkscape:export-ydpi="69.07"
- inkscape:export-xdpi="69.07"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- transform="translate(-2.0203051,-7.0710678)"
- d="m 595.98999,89.686806 a 242.94168,40.406101 0 1 1 -485.88336,0 242.94168,40.406101 0 1 1 485.88336,0 z"
- sodipodi:ry="40.406101"
- sodipodi:rx="242.94168"
- sodipodi:cy="89.686806"
- sodipodi:cx="353.04831"
- id="path3767"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- sodipodi:type="arc" />
- <text
- inkscape:export-ydpi="69.07"
- inkscape:export-xdpi="69.07"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- sodipodi:linespacing="125%"
- id="text2985"
- y="96.757874"
- x="135.36044"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- xml:space="preserve"><tspan
- y="96.757874"
- x="135.36044"
- id="tspan2987"
- sodipodi:role="line">block_chain_manager</tspan></text>
- </g>
- <path
- sodipodi:type="arc"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="path2997"
- sodipodi:cx="220.21326"
- sodipodi:cy="189.18683"
- sodipodi:rx="155.56349"
- sodipodi:ry="41.921329"
- d="m 375.77675,189.18683 a 155.56349,41.921329 0 1 1 -311.126985,0 155.56349,41.921329 0 1 1 311.126985,0 z"
- transform="translate(-11.111678,-4.0406102)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- inkscape:export-xdpi="69.07"
- inkscape:export-ydpi="69.07" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="75.761444"
- y="197.77313"
- id="text2989"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- inkscape:export-xdpi="69.07"
- inkscape:export-ydpi="69.07"><tspan
- sodipodi:role="line"
- id="tspan2991"
- x="75.761444"
- y="197.77313">script_engine</tspan></text>
- <g
- id="g3771"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- inkscape:export-xdpi="69.07"
- inkscape:export-ydpi="69.07">
- <path
- d="m 417.193,276.05994 a 62.629459,28.789347 0 1 1 -125.25892,0 62.629459,28.789347 0 1 1 125.25892,0 z"
- sodipodi:ry="28.789347"
- sodipodi:rx="62.629459"
- sodipodi:cy="276.05994"
- sodipodi:cx="354.56354"
- id="path3769"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- sodipodi:type="arc" />
- <text
- sodipodi:linespacing="125%"
- id="text2993"
- y="284.64624"
- x="332.34018"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- xml:space="preserve"><tspan
- y="284.64624"
- x="332.34018"
- id="tspan2995"
- sodipodi:role="line">...</tspan></text>
- </g>
- <g
- transform="translate(151.52289,-65.154824)"
- id="g3771-4"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- inkscape:export-xdpi="69.07"
- inkscape:export-ydpi="69.07">
- <path
- d="m 417.193,276.05994 c 0,15.89991 -28.04017,28.78934 -62.62946,28.78934 -34.5893,0 -62.62946,-12.88943 -62.62946,-28.78934 0,-15.89992 28.04016,-28.78935 62.62946,-28.78935 34.58929,0 62.62946,12.88943 62.62946,28.78935 z"
- sodipodi:ry="28.789347"
- sodipodi:rx="62.629459"
- sodipodi:cy="276.05994"
- sodipodi:cx="354.56354"
- id="path3769-3"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- sodipodi:type="arc" />
- <text
- sodipodi:linespacing="125%"
- id="text2993-1"
- y="284.64624"
- x="332.34018"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- xml:space="preserve"><tspan
- y="284.64624"
- x="332.34018"
- id="tspan2995-4"
- sodipodi:role="line">...</tspan></text>
- </g>
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Sans"
- x="237.38585"
- y="380.61075"
- id="text3807"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- inkscape:export-xdpi="69.07"
- inkscape:export-ydpi="69.07"><tspan
- sodipodi:role="line"
- id="tspan3809"
- x="237.38585"
- y="380.61075">Inner core</tspan></text>
- <g
- transform="translate(-47.982241,559.62451)"
- id="g3811-3"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/make_transaction.png"
- inkscape:export-xdpi="58.939999"
- inkscape:export-ydpi="58.939999">
- <path
- inkscape:export-ydpi="69.07"
- inkscape:export-xdpi="69.07"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- transform="translate(-2.0203051,-7.0710678)"
- d="m 595.98999,89.686806 c 0,22.315674 -108.7687,40.406104 -242.94168,40.406104 -134.17299,0 -242.94168,-18.09043 -242.94168,-40.406104 0,-22.315674 108.76869,-40.406102 242.94168,-40.406102 134.17298,0 242.94168,18.090428 242.94168,40.406102 z"
- sodipodi:ry="40.406101"
- sodipodi:rx="242.94168"
- sodipodi:cy="89.686806"
- sodipodi:cx="353.04831"
- id="path3767-2"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- sodipodi:type="arc" />
- <text
- inkscape:export-ydpi="69.07"
- inkscape:export-xdpi="69.07"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- sodipodi:linespacing="125%"
- id="text2985-1"
- y="96.757874"
- x="135.36044"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- xml:space="preserve"><tspan
- y="96.757874"
- x="135.36044"
- id="tspan2987-7"
- sodipodi:role="line">block_chain_manager</tspan></text>
- </g>
- <rect
- style="fill:#f9f9f9;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3865"
- width="384.86813"
- height="84.852814"
- x="-83.842667"
- y="762.44843"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/make_transaction.png"
- inkscape:export-xdpi="58.939999"
- inkscape:export-ydpi="58.939999" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="-67.680214"
- y="820.0271"
- id="text3857"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/make_transaction.png"
- inkscape:export-xdpi="58.939999"
- inkscape:export-ydpi="58.939999"><tspan
- sodipodi:role="line"
- id="tspan3859"
- x="-67.680214"
- y="820.0271">make_transaction</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="608.11182"
- y="796.79352"
- id="text3861"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/make_transaction.png"
- inkscape:export-xdpi="58.939999"
- inkscape:export-ydpi="58.939999"><tspan
- sodipodi:role="line"
- id="tspan3863"
- x="608.11182"
- y="796.79352">net</tspan></text>
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-mid:none;marker-end:url(#Arrow1Lend)"
- d="m 114.14724,761.43825 42.4264,-84.85281"
- id="path3867"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/make_transaction.png"
- inkscape:export-xdpi="58.939999"
- inkscape:export-ydpi="58.939999" />
- <path
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:8,4;stroke-dashoffset:0"
- d="M 676.80221,641.2301 418.20315,893.76823"
- id="path4493"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/make_transaction.png"
- inkscape:export-xdpi="58.939999"
- inkscape:export-ydpi="58.939999" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
- d="m 450,673.79075 98.57143,87.14286"
- id="path4495"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/make_transaction.png"
- inkscape:export-xdpi="58.939999"
- inkscape:export-ydpi="58.939999" />
- <path
- sodipodi:type="arc"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4716"
- sodipodi:cx="201.42857"
- sodipodi:cy="1492.3622"
- sodipodi:rx="161.42857"
- sodipodi:ry="161.42857"
- d="m 362.85715,1492.3622 a 161.42857,161.42857 0 1 1 -322.85715,0 161.42857,161.42857 0 1 1 322.85715,0 z"
- transform="translate(-1.4285714,-1.4285714)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/pluggable.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- sodipodi:type="arc"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4703"
- sodipodi:cx="187.85715"
- sodipodi:cy="1375.9336"
- sodipodi:rx="92.14286"
- sodipodi:ry="92.14286"
- d="m 280.00001,1375.9336 a 92.14286,92.14286 0 1 1 -184.285723,0 92.14286,92.14286 0 1 1 184.285723,0 z"
- transform="translate(14.285715,118.57143)" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Sans"
- x="147.62796"
- y="1482.5132"
- id="text3807-8"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/inner_core.png"
- inkscape:export-xdpi="69.07"
- inkscape:export-ydpi="69.07"><tspan
- sodipodi:role="line"
- id="tspan3809-3"
- x="147.62796"
- y="1482.5132">Inner</tspan><tspan
- sodipodi:role="line"
- x="147.62796"
- y="1532.5132"
- id="tspan4705">core</tspan></text>
- <rect
- style="fill:#ffffff;fill-opacity:1;stroke:none"
- id="rect4743"
- width="218.57143"
- height="115.71429"
- x="165.71428"
- y="1276.6479" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#666666;fill-opacity:1;stroke:none;font-family:Sans"
- id="text4707"
- sodipodi:linespacing="125%"
- transform="matrix(-0.92951885,0.3687746,-0.3687746,-0.92951885,947.48333,2787.9321)"><textPath
- xlink:href="#path4711"
- id="textPath4713"><tspan
- id="tspan4709">Outer core</tspan></textPath></text>
- <path
- sodipodi:type="arc"
- style="opacity:0;fill:#666666;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4711"
- sodipodi:cx="222.14285"
- sodipodi:cy="1483.0764"
- sodipodi:rx="109.28571"
- sodipodi:ry="109.28571"
- d="m 331.42857,1483.0764 a 109.28571,109.28571 0 1 1 -218.57143,0 109.28571,109.28571 0 1 1 218.57143,0 z" />
- <rect
- style="fill:#ffffff;fill-opacity:1;stroke:none"
- id="rect4743-9"
- width="218.57143"
- height="115.71429"
- x="-340.32465"
- y="1595.2932"
- transform="matrix(0.92867796,-0.37088711,0.37088711,0.92867796,0,0)" />
- <rect
- style="fill:#ffffff;fill-opacity:1;stroke:none"
- id="rect4743-0"
- width="218.57143"
- height="274.28571"
- x="323.57144"
- y="1358.7908" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- id="text4718"
- sodipodi:linespacing="125%"
- transform="matrix(-0.21340865,-0.97696302,0.97696302,-0.21340865,-1028.7088,2129.9668)"><textPath
- xlink:href="#path4716-9"
- id="textPath4740"><tspan
- id="tspan4720">C Api - Swig bindings</tspan></textPath></text>
- <path
- sodipodi:type="arc"
- style="opacity:0;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4716-9"
- sodipodi:cx="201.42857"
- sodipodi:cy="1492.3622"
- sodipodi:rx="161.42857"
- sodipodi:ry="161.42857"
- d="m 362.85715,1492.3622 a 161.42857,161.42857 0 1 1 -322.85715,0 161.42857,161.42857 0 1 1 322.85715,0 z"
- transform="matrix(0.93423937,0,0,0.93423937,173.96036,-52.575607)" />
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-opacity:1;stroke:none"
- id="path4770"
- sodipodi:cx="275.71429"
- sodipodi:cy="1385.9336"
- sodipodi:rx="12.142858"
- sodipodi:ry="12.142858"
- d="m 287.85715,1385.9336 a 12.142858,12.142858 0 1 1 -24.28571,0 12.142858,12.142858 0 1 1 24.28571,0 z"
- transform="translate(1.4285714,4.2857143)" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="502.85712"
- y="1542.3622"
- id="text4772-8"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan4774-5"
- x="502.85712"
- y="1542.3622">MySQL</tspan><tspan
- sodipodi:role="line"
- x="502.85712"
- y="1592.3622"
- id="tspan4802">serialiser</tspan></text>
- <path
- sodipodi:type="arc"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4804"
- sodipodi:cx="582.14288"
- sodipodi:cy="1568.7908"
- sodipodi:rx="109.28571"
- sodipodi:ry="109.28571"
- d="m 691.4286,1568.7908 a 109.28571,109.28571 0 1 1 -218.57143,0 109.28571,109.28571 0 1 1 218.57143,0 z"
- transform="translate(11.428571,-11.428571)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/pluggable.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="489.28564"
- y="1224.505"
- id="text4772-8-5"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- x="489.28564"
- y="1224.505"
- id="tspan4802-1">net</tspan></text>
- <path
- sodipodi:type="arc"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4804-9"
- sodipodi:cx="582.14288"
- sodipodi:cy="1568.7908"
- sodipodi:rx="109.28571"
- sodipodi:ry="109.28571"
- d="m 691.4286,1568.7908 a 109.28571,109.28571 0 1 1 -218.57143,0 109.28571,109.28571 0 1 1 218.57143,0 z"
- transform="translate(-55.000026,-350.7143)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/pluggable.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 282.85714,1385.2193 c 0,0 72.85715,-115.7143 145.71429,-121.4285"
- id="path4841"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-opacity:1;stroke:none"
- id="path4770-9"
- sodipodi:cx="275.71429"
- sodipodi:cy="1385.9336"
- sodipodi:rx="12.142858"
- sodipodi:ry="12.142858"
- d="m 287.85715,1385.9336 a 12.142858,12.142858 0 1 1 -24.28571,0 12.142858,12.142858 0 1 1 24.28571,0 z"
- transform="translate(39.999991,139.28573)" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 314.28571,1523.7908 c 0,0 115.71429,44.2857 170,40"
- id="path4861"
- inkscape:connector-curvature="0" />
- <path
- sodipodi:type="arc"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4716-4"
- sodipodi:cx="201.42857"
- sodipodi:cy="1492.3622"
- sodipodi:rx="247.29153"
- sodipodi:ry="247.29153"
- d="m 448.72011,1492.3622 a 247.29153,247.29153 0 1 1 -494.583071,0 247.29153,247.29153 0 1 1 494.583071,0 z"
- transform="translate(-116.32344,543.15661)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/pluggable.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="375.67972"
- y="2201.0581"
- id="text4772-8-2"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002"><tspan
- sodipodi:role="line"
- id="tspan4774-5-1"
- x="375.67972"
- y="2201.0581">SQLlite</tspan><tspan
- sodipodi:role="line"
- x="375.67972"
- y="2251.0581"
- id="tspan4802-3">serialiser</tspan></text>
- <path
- sodipodi:type="arc"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4804-2"
- sodipodi:cx="582.14288"
- sodipodi:cy="1568.7908"
- sodipodi:rx="109.28571"
- sodipodi:ry="109.28571"
- d="m 691.4286,1568.7908 a 109.28571,109.28571 0 1 1 -218.57143,0 109.28571,109.28571 0 1 1 218.57143,0 z"
- transform="translate(-115.74883,647.26715)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-opacity:1;stroke:none"
- id="path4770-9-6"
- sodipodi:cx="275.71429"
- sodipodi:cy="1385.9336"
- sodipodi:rx="12.142858"
- sodipodi:ry="12.142858"
- d="m 287.85715,1385.9336 a 12.142858,12.142858 0 1 1 -24.28571,0 12.142858,12.142858 0 1 1 24.28571,0 z"
- transform="translate(-25.558106,791.92053)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 248.72762,2176.4256 c 0,0 55.10513,40.2451 109.39084,35.9594"
- id="path4861-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="415.37207"
- y="1845.4845"
- id="text4772-8-2-3"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002"><tspan
- sodipodi:role="line"
- id="tspan4774-5-1-1"
- x="415.37207"
- y="1845.4845">MySQL</tspan><tspan
- sodipodi:role="line"
- x="415.37207"
- y="1895.4845"
- id="tspan4802-3-4">serialiser</tspan></text>
- <path
- sodipodi:type="arc"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4804-2-1"
- sodipodi:cx="582.14288"
- sodipodi:cy="1568.7908"
- sodipodi:rx="109.28571"
- sodipodi:ry="109.28571"
- d="m 691.4286,1568.7908 a 109.28571,109.28571 0 1 1 -218.57143,0 109.28571,109.28571 0 1 1 218.57143,0 z"
- transform="translate(-76.056458,291.69345)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect4948"
- width="25.253813"
- height="10.101525"
- x="367.69553"
- y="2007.9664"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect4948-4"
- width="25.253813"
- height="10.101525"
- x="367.69553"
- y="2037.9664"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect4948-3"
- width="25.253813"
- height="10.101525"
- x="367.69553"
- y="2021.9664"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- style="fill:#ffeded;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;fill-opacity:1"
- d="m 401.52427,2007.9781 c -4.05074,0 -7.93436,0.3407 -11.59375,1 l 0,40.4063 c 3.65939,0.6592 7.54301,1 11.59375,1 20.92095,0 37.90625,-9.5031 37.90625,-21.2188 0,-11.7157 -16.9853,-21.1875 -37.90625,-21.1875 z"
- id="path4941"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
- d="m 483.86307,1968.5705 c 0,0 -39.39595,22.2234 -24.24366,26.264 15.15229,4.0406 81.82235,4.0406 65.65991,20.2031 -16.16244,16.1624 -86.87312,13.1319 -86.87312,13.1319"
- id="path4946"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <rect
- style="fill:none;fill-opacity:1;stroke:none;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;opacity:1"
- id="rect4975"
- width="82.832512"
- height="145.46196"
- x="137.38075"
- y="1908.9716"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_serialisers.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="-94.954338"
- y="2929.2256"
- id="text4977"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07"><tspan
- sodipodi:role="line"
- id="tspan4979"
- x="-94.954338"
- y="2929.2256">Python layer</tspan></text>
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m -234.35539,2858.515 901.05607,0"
- id="path4981"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="-167.68532"
- y="2539.3066"
- id="text4983"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07"><tspan
- sodipodi:role="line"
- id="tspan4985"
- x="-167.68532"
- y="2539.3066">RPC server</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="248.49753"
- y="2577.6924"
- id="text4987"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07"><tspan
- sodipodi:role="line"
- id="tspan4989"
- x="248.49753"
- y="2577.6924">GUI client</tspan></text>
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="375.77676"
- y="2731.2356"
- id="text4991"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07"><tspan
- sodipodi:role="line"
- id="tspan4993"
- x="375.77676"
- y="2731.2356">accounts support</tspan></text>
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
- d="M -28.284271,2882.7586 -88.893428,2567.591"
- id="path4995"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:none;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
- d="M 88.893424,2878.718 276.7818,2603.9565"
- id="path5179"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none"
- d="m 379.81736,2692.8499 -42.42641,-92.934"
- id="path5919"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none"
- d="M 359.61431,2717.0936 -28.284271,2559.5098"
- id="path6289"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/python_layer.png"
- inkscape:export-xdpi="47.07"
- inkscape:export-ydpi="47.07" />
- <path
- sodipodi:type="arc"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4716-4-9"
- sodipodi:cx="201.42857"
- sodipodi:cy="1492.3622"
- sodipodi:rx="247.29153"
- sodipodi:ry="247.29153"
- d="m 448.72011,1492.3622 a 247.29153,247.29153 0 1 1 -494.583071,0 247.29153,247.29153 0 1 1 494.583071,0 z"
- transform="translate(-118.66244,1921.0047)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/pluggable.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- sodipodi:type="arc"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4804-2-7"
- sodipodi:cx="582.14288"
- sodipodi:cy="1568.7908"
- sodipodi:rx="109.28571"
- sodipodi:ry="109.28571"
- d="m 691.4286,1568.7908 a 109.28571,109.28571 0 1 1 -218.57143,0 109.28571,109.28571 0 1 1 218.57143,0 z"
- transform="translate(-118.08783,2025.1152)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/multiple_currencies.png"
- inkscape:export-xdpi="124.52067"
- inkscape:export-ydpi="124.52067" />
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-opacity:1;stroke:none"
- id="path4770-9-6-4"
- sodipodi:cx="275.71429"
- sodipodi:cy="1385.9336"
- sodipodi:rx="12.142858"
- sodipodi:ry="12.142858"
- d="m 287.85715,1385.9336 a 12.142858,12.142858 0 1 1 -24.28571,0 12.142858,12.142858 0 1 1 24.28571,0 z"
- transform="translate(-27.897113,2169.7686)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/multiple_currencies.png"
- inkscape:export-xdpi="124.52067"
- inkscape:export-ydpi="124.52067" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 246.38862,3554.2737 c 0,0 55.10513,40.2451 109.39084,35.9594"
- id="path4861-8-0"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/multiple_currencies.png"
- inkscape:export-xdpi="124.52067"
- inkscape:export-ydpi="124.52067" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="461.52042"
- y="3251.6169"
- id="text4772-8-2-3-2"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_nets.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002"><tspan
- sodipodi:role="line"
- x="461.52042"
- y="3251.6169"
- id="tspan4802-3-4-0">net</tspan></text>
- <path
- sodipodi:type="arc"
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4804-2-1-8"
- sodipodi:cx="582.14288"
- sodipodi:cy="1568.7908"
- sodipodi:rx="109.28571"
- sodipodi:ry="109.28571"
- d="m 691.4286,1568.7908 a 109.28571,109.28571 0 1 1 -218.57143,0 109.28571,109.28571 0 1 1 218.57143,0 z"
- transform="translate(-78.395463,1669.5415)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_nets.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect4948-5"
- width="25.253813"
- height="10.101525"
- x="365.35651"
- y="3385.8147"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_nets.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect4948-4-0"
- width="25.253813"
- height="10.101525"
- x="365.35651"
- y="3415.8147"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_nets.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="rect4948-3-2"
- width="25.253813"
- height="10.101525"
- x="365.35651"
- y="3399.8147"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_nets.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- style="fill:#ffeded;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- d="m 399.18527,3385.8262 c -4.05074,0 -7.93436,0.3407 -11.59375,1 l 0,40.4063 c 3.65939,0.6592 7.54301,1 11.59375,1 20.92095,0 37.90625,-9.5031 37.90625,-21.2188 0,-11.7157 -16.9853,-21.1875 -37.90625,-21.1875 z"
- id="path4941-8"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_nets.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 481.52407,3346.4186 c 0,0 -39.39595,22.2234 -24.24366,26.264 15.15229,4.0406 81.82235,4.0406 65.65991,20.2031 -16.16244,16.1624 -86.87312,13.1319 -86.87312,13.1319"
- id="path4946-1"
- inkscape:connector-curvature="0"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_nets.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <rect
- style="fill:none;stroke:none"
- id="rect4975-6"
- width="82.832512"
- height="145.46196"
- x="135.04175"
- y="3286.8198"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/switching_nets.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <text
- xml:space="preserve"
- style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
- x="432.5108"
- y="3603.6252"
- id="text4772-8-2-3-2-8"
- sodipodi:linespacing="125%"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/multiple_currencies.png"
- inkscape:export-xdpi="124.52067"
- inkscape:export-ydpi="124.52067"><tspan
- sodipodi:role="line"
- x="432.5108"
- y="3603.6252"
- id="tspan4802-3-4-0-1">net</tspan></text>
- <path
- sodipodi:type="arc"
- style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
- id="path4716-4-9-4"
- sodipodi:cx="201.42857"
- sodipodi:cy="1492.3622"
- sodipodi:rx="247.29153"
- sodipodi:ry="247.29153"
- d="m 448.72011,1492.3622 a 247.29153,247.29153 0 1 1 -494.583071,0 247.29153,247.29153 0 1 1 494.583071,0 z"
- transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,-647.87768,4893.3627)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/pluggable.png"
- inkscape:export-xdpi="67.440002"
- inkscape:export-ydpi="67.440002" />
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-opacity:1;stroke:none"
- id="path4770-9-6-4-8"
- sodipodi:cx="275.71429"
- sodipodi:cy="1385.9336"
- sodipodi:rx="12.142858"
- sodipodi:ry="12.142858"
- d="m 287.85715,1385.9336 a 12.142858,12.142858 0 1 1 -24.28571,0 12.142858,12.142858 0 1 1 24.28571,0 z"
- transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,-477.82448,4690.3757)"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/multiple_currencies.png"
- inkscape:export-xdpi="124.52067"
- inkscape:export-ydpi="124.52067" />
- <path
- style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 584.04924,3760.5847 c 0,0 7.30071,-67.845 -23.55367,-112.7149"
- id="path4861-8-0-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc"
- inkscape:export-filename="/home/genjix/tmp/bitent_design/multiple_currencies.png"
- inkscape:export-xdpi="124.52067"
- inkscape:export-ydpi="124.52067" />
- </g>
-</svg>
diff --git a/doc/libbitcoin/index.html b/doc/libbitcoin/index.html
deleted file mode 100644
index 5878e3e..0000000
--- a/doc/libbitcoin/index.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<img src="inner_core.png" />
-
-<p>This is the inner core which consists of a bunch of subsystems co-operating over clearly defined interfaces.</p>
-
-<img src="make_transaction.png" />
-
-<p>As an example one such message could command the block_chain_manager to create a transaction. It then sends the new transaction to the network component to actualise it.</p>
-
-<img src="pluggable.png" />
-
-<p>The inner core is very difficult to use so we abstract it's usage to a more usable outer core. Think of the inner core like X-windows and outer core an easy to use GUI toolkit like Qt (by analogy).</p>
-
-<img src="switching_serialisers.png" />
-
-<p>Into the core we can switch in and out different components. In this example we choose to replace a MySQL serialiser/de-serialiser with an SQLite one. Maybe there could also be in-memory serialisers (never store to disk) or whatever.</p>
-
-<p>A serialiser takes in a data object and then stores it. The type of component decides where + how it looks when stored. When reading the object it de-serialises in reverse.</p>
-
-<p>The whole point is not to just dump binary blobs into MySQL rows but to put them there in a readable format so an admin can dissect them in case of problems. We also will only create a MySQL serialiser for the time being unless it's possible to use standard SQL and simultaneously support MySQL, PostgresSQL, SQLite.</p>
-
-<img src="python_layer.png" />
-
-<p>Above the diagram for the outer core indicated an exposed C api with auto-generated Swig bindings.</p>
-
-<p>We try to keep the core very simple and focused; no mining, no accounts, no GUI, no RPC server. These things can all be implemented in Python. Already genjix has Spesmilo as a Qt GUI using bitcoind that we can easily use since it has a special interface that can be re-implemented for whatever Bitcoin implementation. Accounts can be provided as a Python module or special plugin in C or C++.</p>
-
-<img src="switching_nets.png" />
-
-<p>As another example, by being able to switch the networking component, we can replace it with a dummy networking component that is used for debugging.</p>
-
-<img src="multiple_currencies.png" />
-
-<p>Or use one networking component for multiple instances of Bitcoin or other currencies.</p>
-
-<p>We try to split everything up as much as possible to help developers long term. It makes it easier for new contributors to get started. That's the free-software way: lots of components and clear separation to allow maintainers to work on their piece of turf.<p>
-
-<h3>Callbacks</h3>
-
-<p>A good plugin+component system is a must for this project. The core will probably have to be thread-safe if we use threads for networking. Otherwise an event system could be a bottleneck since we get the worst of both worlds.</p>
-
-<p>If we make a block-chain verifier subsystem, is there an object to making it one-shot (verify once or every X blocks the block chain in one go) or does it need to be after every block is downloaded?</p>
-
-<p>In any case, it would be nicer to be able to hook the verifier system to a generic callback as opposed to calling it manually in the code.<p>
-
-<p>boost::signals2 seems like a good choice to be considered, although it has to be seen whether there is any bottleneck. Also any callback system would have to be exposed in Python somehow</p>
-
-<h3>Random notes:</h3>
-
-<ul>
- <li>Our main target is large scale deployments. Bitcoin Enterprise (utilising our libbitcoin). The Red Hat of Bitcoin, not the Ubuntu.</li>
- <li>Use boost::property_map?</li>
- <li>boost::asio is a good choice for networking.</li>
- <li>Externally we expose a C api for people that cannot program C++ but use C++ internally. A C ABI is also nice since it doesn't get mangled by the compiler.</li>
- <li>Status during initialisation for debugging/showing progress in GUI client.</li>
-</ul>
-
-<p>Inside serialiser plugin:
-<pre>
-class transaction:
- // Return new transaction object de-serialised
- static Transaction& read();
- // Write current object to store
- void write();
-</pre>
-</p>
-
diff --git a/doc/libbitcoin/inner_core.png b/doc/libbitcoin/inner_core.png
deleted file mode 100644
index 4908220..0000000
--- a/doc/libbitcoin/inner_core.png
+++ /dev/null
Binary files differ
diff --git a/doc/libbitcoin/make_transaction.png b/doc/libbitcoin/make_transaction.png
deleted file mode 100644
index 5d25544..0000000
--- a/doc/libbitcoin/make_transaction.png
+++ /dev/null
Binary files differ
diff --git a/doc/libbitcoin/multiple_currencies.png b/doc/libbitcoin/multiple_currencies.png
deleted file mode 100644
index efe1d62..0000000
--- a/doc/libbitcoin/multiple_currencies.png
+++ /dev/null
Binary files differ
diff --git a/doc/libbitcoin/pluggable.png b/doc/libbitcoin/pluggable.png
deleted file mode 100644
index b497b0f..0000000
--- a/doc/libbitcoin/pluggable.png
+++ /dev/null
Binary files differ
diff --git a/doc/libbitcoin/python_layer.png b/doc/libbitcoin/python_layer.png
deleted file mode 100644
index 83c9e50..0000000
--- a/doc/libbitcoin/python_layer.png
+++ /dev/null
Binary files differ
diff --git a/doc/libbitcoin/switching_nets.png b/doc/libbitcoin/switching_nets.png
deleted file mode 100644
index 1091ee2..0000000
--- a/doc/libbitcoin/switching_nets.png
+++ /dev/null
Binary files differ
diff --git a/doc/libbitcoin/switching_serialisers.png b/doc/libbitcoin/switching_serialisers.png
deleted file mode 100644
index 650b11c..0000000
--- a/doc/libbitcoin/switching_serialisers.png
+++ /dev/null
Binary files differ
diff --git a/doc/sphinx/Makefile b/doc/sphinx/Makefile
deleted file mode 100644
index b337859..0000000
--- a/doc/sphinx/Makefile
+++ /dev/null
@@ -1,153 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS =
-SPHINXBUILD = sphinx-build
-PAPER =
-BUILDDIR = _build
-
-# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
-
-help:
- @echo "Please use \`make <target>' where <target> is one of"
- @echo " html to make standalone HTML files"
- @echo " dirhtml to make HTML files named index.html in directories"
- @echo " singlehtml to make a single large HTML file"
- @echo " pickle to make pickle files"
- @echo " json to make JSON files"
- @echo " htmlhelp to make HTML files and a HTML help project"
- @echo " qthelp to make HTML files and a qthelp project"
- @echo " devhelp to make HTML files and a Devhelp project"
- @echo " epub to make an epub"
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
- @echo " text to make text files"
- @echo " man to make manual pages"
- @echo " texinfo to make Texinfo files"
- @echo " info to make Texinfo files and run them through makeinfo"
- @echo " gettext to make PO message catalogs"
- @echo " changes to make an overview of all changed/added/deprecated items"
- @echo " linkcheck to check all external links for integrity"
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
-
-clean:
- -rm -rf $(BUILDDIR)/*
-
-html:
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
- @echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
- @echo
- @echo "Build finished; now you can process the pickle files."
-
-json:
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
- @echo
- @echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
- @echo
- @echo "Build finished; now you can run HTML Help Workshop with the" \
- ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
- @echo
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/libbitcoin.qhcp"
- @echo "To view the help file:"
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/libbitcoin.qhc"
-
-devhelp:
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
- @echo
- @echo "Build finished."
- @echo "To view the help file:"
- @echo "# mkdir -p $$HOME/.local/share/devhelp/libbitcoin"
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/libbitcoin"
- @echo "# devhelp"
-
-epub:
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
- @echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
- "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through pdflatex..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
- @echo
- @echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
- @echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
- @echo "Run \`make' in that directory to run these through makeinfo" \
- "(use \`make info' here to do that automatically)."
-
-info:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo "Running Texinfo files through makeinfo..."
- make -C $(BUILDDIR)/texinfo info
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
- @echo
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
- @echo
- @echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
- $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
- @echo
- @echo "Link check complete; look for any errors in the above output " \
- "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
- $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
- @echo "Testing of doctests in the sources finished, look at the " \
- "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/doc/sphinx/blockchain.rst b/doc/sphinx/blockchain.rst
deleted file mode 100644
index 44e4ceb..0000000
--- a/doc/sphinx/blockchain.rst
+++ /dev/null
@@ -1,495 +0,0 @@
-.. _tut-blockchain:
-
-*******************************
-Fun With The Bitcoin Blockchain
-*******************************
-
-For this tutorial we will use the :class:`leveldb_blockchain` backend, which
-uses the LevelDB database to store the Bitcoin blockchain.
-Backends implement the :class:`blockchain` interface. Starting and stopping
-a backend is down to the individual implementation.
-
-The blockchain can consume a large number of open file handles during normal
-operation. In particular, the LevelDB backend may accumulate a number of data
-files. The creation of numerous data files is normal. Most operating
-systems can change the open-files limit using the ``ulimit -n`` command.
-Example::
-
- ulimit -n 4096
-
-However, this only changes the limit for the current shell session. Changing the
-limit on a system-wide, permanent basis varies more between systems. See
-`this guide <http://docs.basho.com/riak/latest/cookbooks/Open-Files-Limit/>`_
-for more information on open files limits.
-
-Initialization: Importing The Genesis Block
-===========================================
-
-Before we can use :class:`leveldb_blockchain`, the database needs to be
-initialised.
-
-#. Create a :class:`leveldb_blockchain` object. If no database exists in the
- specified path, it will automatically be created.
-#. Recreate the genesis block. The first block in the Bitcoin blockchain is
- part of the specification for the Bitcoin standard.
-#. Import the genesis block at height 0 in the blockchain.
-
-You now have a working :class:`leveldb_blockchain`.
-
-To create the database which initialises a new one if one doesn't already
-exist, we call :func:`leveldb_blockchain::start` with a root path. The
-completion handler is called passing an :class:`std::error_code` that
-indicates whether the operation was successful or not.
-
-::
-
- // Threadpool context containing 1 thread.
- threadpool pool(1);
- // leveldb_blockchain operations execute in pool's thread.
- leveldb_blockchain chain(pool);
- // Completion handler for starting the leveldb_blockchain.
- // Does nothing.
- auto blockchain_start = [](const std::error_code& ec) {};
- // Start blockchain with a database path.
- chain.start(dbpath, blockchain_start);
-
-The function :func:`genesis_block` returns a genesis block.
-
-::
-
- // First block is the genesis block.
- block_type first_block = genesis_block();
-
-We call :func:`blockchain::import` to save a block in the blockchain
-at a specified height directly. It doesn't validate or perform any safety
-checks on the imported block. Instead the block is written directly.
-
-::
-
- // Completion handler for import method.
- auto import_finished =
- [&ec_promise](const std::error_code& ec)
- {
- ec_promise.set_value(ec);
- };
- // Import the genesis block at height 0.
- // Doesn't validate or perform checks on the block.
- chain.import(first_block, 0, import_finished);
- // Wait until std::error_code is set by
- // import_finished completion handler.
- std::error_code ec = ec_promise.get_future().get();
- if (ec)
- {
- log_error() << "Importing genesis block failed: " << ec.message();
- return -1;
- }
-
-All operations need to finish on :class:`leveldb_blockchain` before it can
-be closed properly so we first stop the threadpool before calling
-:func:`leveldb_blockchain::stop`.
-
-::
-
- // All threadpools stopping in parallel...
- pool.stop();
- // ... Make them all join main thread and wait until they finish.
- pool.join();
- // Now safely close leveldb_blockchain.
- chain.stop();
-
-:func:`blockchain::store` is the recommended way to add new blocks to
-the blockchain. It finds the correct height by looking up the previous block,
-handles reorganisations, validates the blocks and calls the subscription
-handlers.
-
-.. cpp:function:: void blockchain::store(const block_type& block, store_block_handler handle_store)
-
- Store a new block.
-
- Subscriber is notified exactly once of changes to the blockchain
- and needs to re-subscribe to continue being notified.
- ::
-
- void handle_store(
- const std::error_code& ec, // Status of operation
- block_info info // Status and height of block
- );
-
-The full sourcecode can be found in :ref:`examples_initchain`.
-
-Fetch and Display Block Info
-============================
-
-Services like blockchain do not block. Methods return immediately and upon
-completion call a completion handler. The semantics of the blockchain reflect
-this with the ``set/get_*`` methods being equivalently called ``store/fetch_*``.
-
-The only thing we add to the blockchain is new blocks. There is one method called
-:func:`blockchain::store`. This method handles the internal details of
-validating the block against the current blockchain, returning competing blocks
-to the orphan pool (if needed), insertion into the database and processing
-any dependent blocks.
-
-In our example we want to fetch and display the last block header. To fetch
-the last height number, we use :func:`blockchain::fetch_last_height`. To fetch
-the block header for a height number, we use
-:func:`blockchain::fetch_block_header`.
-
-.. cpp:function:: void blockchain::fetch_block_header(size_t height, fetch_handler_block_header handle_fetch)
-
- Fetches the block header by height.
- ::
-
- void handle_fetch(
- const std::error_code& ec, // Status of operation
- const block_header_type& blk // Block header
- );
-
-.. cpp:function:: void blockchain::fetch_last_height(fetch_handler_last_height handle_fetch)
-
- Fetches the height of the last block in our blockchain.
- ::
-
- void handle_fetch(
- const std::error_code& ec, // Status of operation
- size_t block_height // Height of last block
- );
-
-All the blockchain fetch methods give you access to all of the data in the
-blockchain to reconstruct or link any piece of data. Full navigation around
-the chain is possible.
-
-Starting at the basic level, we start with an application to start the
-blockchain otherwise report the error back.
-
-We create a threadpool, blockchain, and then call start. Then after when
-the user is ready to exit, we stop and join the threadpool, and safely
-close the blockchain.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- blockchain* chain = nullptr;
-
- // Completion handler for when the blockchain has finished initializing.
- void blockchain_started(const std::error_code& ec)
- {
- // std::error_code's can be tested like bools, and
- // compared against specific error enums.
- // See <bitcoin/error.hpp> for a full list of them.
- if (ec)
- {
- log_error() << "Blockchain failed to start: " << ec.message();
- return;
- }
- // Blockchain has safely started.
- log_info() << "Blockchain started.";
- }
-
- int main()
- {
- // Define a threadpool with 1 thread.
- threadpool pool(1);
- // Create a LevelDB blockchain.
- leveldb_blockchain ldb_chain(pool);
- // Initialize our global 'chain' pointer from above.
- chain = &ldb_chain;
- // Start the database using its implementation specific method.
- ldb_chain.start("../database", blockchain_started);
- // Keep running until the user presses enter.
- // Since libbitcoin is asynchronous, you need to synchronise with
- // them to know when to exit safely.
- // For these examples we just pause until enter for simplicity sake.
- std::cin.get();
- // Begin stopping the threadpools in parallel (only 1 here).
- pool.stop();
- // Join them one by one.
- pool.join();
- // Finally stop the blockchain safely now everything has stopped.
- ldb_chain.stop();
- return 0;
- }
-
-After the blockchain has started, we want to begin the entire process.
-The process starts with getting the last height in our blockchain, then
-fetching the block header at that height, and finally displaying the
-block header to the screen.
-
-::
-
- // Completion handler for when the blockchain has finished initializing.
- void blockchain_started(const std::error_code& ec);
- // Fetch the last block now that we have the height.
- void height_fetched(const std::error_code& ec, size_t last_height);
- // Result: print the block header.
- void display_block_header(const std::error_code& ec,
- const block_header_type& header);
-
-After the blockchain has started, we begin the operation to fetch the last
-height, calling :func:`height_fetched` after it's finished.
-
-::
-
- void blockchain_started(const std::error_code& ec)
- {
- // std::error_code's can be tested like bools, and
- // compared against specific error enums.
- // See <bitcoin/error.hpp> for a full list of them.
- if (ec)
- {
- log_error() << "Blockchain failed to start: " << ec.message();
- return;
- }
- // Blockchain has safely started.
- log_info() << "Blockchain started.";
- // chain should've been set inside main().
- assert(chain);
- // Begin fetching the last height number.
- chain->fetch_last_height(height_fetched);
- }
-
-After :func:`height_fetched` has been called, we know the block number and
-begin fetching the block header.
-
-::
-
- void height_fetched(const std::error_code& ec, size_t last_height)
- {
- if (ec)
- {
- log_error() << "Failed to fetch last height: " << ec.message();
- return;
- }
- // Display the block number.
- log_info() << "Height: " << last_height;
- assert(chain);
- // Begin fetching the block header.
- chain->fetch_block_header(last_height, display_block_header);
- }
-
-Now finally the block header is received, and can be displayed. This is
-the final operation in this sequence.
-
-As we only requested the block header, the transactions list will be
-empty. Getting a full block involves getting the transaction hashes
-associated with that block, and fetching each one which is provided
-by the composed operation :func:`fetch_block`.
-::
-
- void display_block_header(const std::error_code& ec,
- const block_header_type& header)
- {
- if (ec)
- {
- log_error() << "Failure fetching block header: " << ec.message();
- return;
- }
- // 32 byte std::array of uint8_t
- const hash_digest& blk_hash = hash_block_header(header);
- // Encode block hash into a pretty hex string.
- log_info() << "hash: " << encode_hex(blk_hash);
- // Display a few fields from the block header.
- // See <bitcoin/primitives.hpp> for the definition of block_type.
- log_info() << "version: " << header.version;
- // hash_digest can be used directly in log_info(),
- // implicity calling encode_hex() on the hash_digest.
- log_info() << "previous_block_hash: " << header.previous_block_hash;
- log_info() << "merkle: " << header.merkle;
- log_info() << "timestamp: " << header.timestamp;
- log_info() << "bits: " << header.bits;
- log_info() << "nonce: " << header.nonce;
- // A goodbye message.
- log_info() << "Finished.";
- }
-
-The full example is in :ref:`examples/display-last.cpp <examples_display-last>`.
-
-Message from Satoshi, Bitcoin's creator
-=======================================
-
-Satoshi left us a message inside the first Bitcoin *genesis* block.
-::
-
- // The Times 03/Jan/2009 Chancellor on brink of second bailout for banks
-
-The message is inside the first input, of the first transaction, of the
-first Bitcoin block.
-
-Block 0 is predefined by Bitcoin. All blockchains must begin with
-the same block otherwise they aren't Bitcoin. :func:`genesis_block`
-recreates a copy of block 0.
-
-#. Create genesis block.
-#. Lookup first transaction in block (the coinbase transaction).
-#. Get the first input from the coinbase transaction.
-#. Serialize the input's script back into raw form.
-#. Display the raw input script.
-
-The input script for the first input of the coinbase transaction inside the
-genesis block contains the message from Satoshi.
-
-::
-
- // examples/satoshiwords.cpp
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- int main()
- {
- // Create genesis block.
- block_type genblk = genesis_block();
- // Genesis block contains a single coinbase transaction.
- assert(genblk.transactions.size() == 1);
- // Get first transaction in block (coinbase).
- const transaction_type& coinbase_tx = genblk.transactions[0];
- // Coinbase tx has a single input.
- assert(coinbase_tx.inputs.size() == 1);
- const transaction_input_type& coinbase_input = coinbase_tx.inputs[0];
- // Get the input script (sometimes called scriptSig).
- const script& input_script = coinbase_input.input_script;
- // Convert this to its raw format.
- const data_chunk& raw_block_message = save_script(input_script);
- // Convert this to an std::string.
- std::string message;
- message.resize(raw_block_message.size());
- std::copy(raw_block_message.begin(), raw_block_message.end(),
- message.begin());
- // Display the genesis block message.
- std::cout << message << std::endl;
- return 0;
- }
-
-Reconstruct Block Transactions
-==============================
-
-To reconstruct an entire block from a block header, first obtain a list of
-transaction hashes that makeup that block. Then iterate the list of
-transaction hashes, fetching the transactions one by one.
-
-.. cpp:function:: void blockchain::fetch_block_transaction_hashes(const hash_digest &block_hash, fetch_handler_block_transaction_hashes handle_fetch)
-
- Fetches list of transaction hashes in a block given the block hash.
- ::
-
- void handle_fetch(
- const std::error_code& ec, // Status of operation
- const inventory_list& hashes // List of hashes
- );
-
-.. cpp:function:: void blockchain::fetch_transaction(const hash_digest &transaction_hash, fetch_handler_transaction handle_fetch)
-
- Fetches a transaction by hash
- ::
-
- void handle_fetch(
- const std::error_code& ec, // Status of operation
- const transaction_type& tx // Transaction
- );
-
-.. _composed_operations:
-
-:func:`fetch_block` and Composed Operations
--------------------------------------------
-
-libbitcoin provides a convenience function :func:`fetch_block` to wrap the
-details of fetching a full block. These kind of operations that wrap a bunch
-of other operations are called *composed operations*.
-
-A general :ref:`design principle of libbitcoin <intro_design>` is to keep the implementation simple
-and not pollute class interfaces. Instead composed operations wrap lower
-level class methods to simplify common operations.
-
-.. cpp:function:: void fetch_block(blockchain& chain, size_t height, blockchain_fetch_handler_block handle_fetch)
-
- Fetch a block by height.
- If the blockchain reorganises, operation may fail halfway.
- ::
-
- void handle_fetch(
- const std::error_code& ec, // Status of operation
- const block_type& blk // Block header
- );
-
-.. _tut-poller:
-
-Polling Blocks From Nodes
-=========================
-
-The :class:`poller` service downloads blocks from nodes into the blockchain.
-::
-
- // ...
-
- void connection_established(const std::error_code& ec, channel_ptr node,
- poller& poll)
- {
- // ...
- // getblocks request asking node for a list of blocks to download.
- // Usually you call query() on the first node you connect to.
- poll.query(node);
- // Monitor for inventory packets containing blocks we don't have.
- // Then request and attempt to store the blocks in the blockchain.
- poll.monitor(node);
- }
-
- int main()
- {
- threadpool pool(2);
- leveldb_blockchain chain(pool);
- // ...
- poller poll(pool, chain);
- // ...
- return 0;
- }
-
-:class:`poller` handles the details of watching for notification of new blocks,
-sending requests as needed and storing them in the blockchain by calling
-:func:`blockchain::store`.
-
-Reorganizations And New Blocks
-------------------------------
-
-While polling new blocks from the network, callbacks registered with
-:func:`blockchain::subscribe_reorganize` will be notified of any changes
-to the blockchain.
-
-.. cpp:function:: void blockchain::subscribe_reorganize(reorganize_handler handle_reorganize)
-
- Be notified of the next blockchain change.
-
- Subscriber is notified exactly once of changes to the blockchain
- and needs to re-subscribe to continue being notified.
- ::
-
- void handle_reorganize(
- const std::error_code& ec, // Status of operation
- size_t fork_point, // Index where blockchain forks
- const block_list& added, // New blocks added to blockchain
- const block_list& removed // Blocks removed (empty if none)
- );
-
-The ``fork_point`` gives the height of the ancestor block before the split.
-Both lists are ordered from lowest height first.
-::
-
- for (size_t i = 0; i < added_blocks.size(); ++i)
- {
- size_t height = fork_point + 1 + i;
- const block_type& blk = *added_blocks[i];
- }
-
-Optimization Techniques
-=======================
-
-* Create a separate partition for the database directory with the
- *noatime* parameter set.
-* Lower VM `swappiness <http://en.wikipedia.org/wiki/Swappiness>`_.
-* Increase the `max number of open files <http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in-linux>`_.
-* Disable filesystem caching to prevent double caching by database and
- operating system.
-* Make heavy use of replication i.e multiple :class:`blockchain` instances
- each with their own database.
-* Follow the `guidelines here <http://docs.basho.com/riak/latest/tutorials/choosing-a-backend/LevelDB/>`_.
-
diff --git a/doc/sphinx/conf.py b/doc/sphinx/conf.py
deleted file mode 100644
index a1fbfcf..0000000
--- a/doc/sphinx/conf.py
+++ /dev/null
@@ -1,243 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# libbitcoin documentation build configuration file, created by
-# sphinx-quickstart on Fri Jan 4 11:52:36 2013.
-#
-# This file is execfile()d with the current directory set to its containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys, os
-
-highlight_language = "cpp"
-primary_domain = "cpp"
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
-
-# -- General configuration -----------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be extensions
-# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.todo']
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'libbitcoin'
-copyright = u'2013, libbitcoin'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '1'
-# The full version, including alpha/beta/rc tags.
-release = '1'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
-
-# The reST default role (used for this markup: `text`) to use for all documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-
-# -- Options for HTML output ---------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-html_theme = 'default'
-html_theme_options = {
- "collapsiblesidebar": "true"
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
-
-# The name for this set of Sphinx documents. If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar. Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it. The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'libbitcoindoc'
-
-
-# -- Options for LaTeX output --------------------------------------------------
-
-latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title, author, documentclass [howto/manual]).
-latex_documents = [
- ('index', 'libbitcoin.tex', u'libbitcoin Documentation',
- u'libbitcoin', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output --------------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- ('index', 'libbitcoin', u'libbitcoin Documentation',
- [u'Amir Taaki <amir@unsystem.net>'], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output ------------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- ('index', 'libbitcoin', u'libbitcoin Documentation',
- u'libbitcoin', 'libbitcoin', 'One line description of project.',
- 'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
diff --git a/doc/sphinx/crypto.rst b/doc/sphinx/crypto.rst
deleted file mode 100644
index 940fede..0000000
--- a/doc/sphinx/crypto.rst
+++ /dev/null
@@ -1,260 +0,0 @@
-.. _tut-crypto:
-
-***********************
-Crypto and Private Keys
-***********************
-
-Vanilla Private Keys
-====================
-
-Bitcoin uses a form of encryption called elliptic curve cryptography.
-libbitcoin represents this type of private key using the
-:class:`elliptic_curve_key` class.
-::
-
- // Generate new private key and echo to STDOUT.
- bool new_keypair()
- {
- elliptic_curve_key ec;
- if (!ec.new_key_pair())
- return false;
- private_data raw_private_key = ec.private_key();
- std::cout << std::string(raw_private_key.begin(), raw_private_key.end());
- return true;
- }
-
-To load the private_key, we can use the :func:`set_private_key` member function.
-
-.. cpp:function:: bool elliptic_curve_key::set_public_key(const data_chunk& pubkey)
-.. cpp:function:: data_chunk elliptic_curve_key::public_key() const
-
-.. cpp:function:: bool elliptic_curve_key::set_private_key(const private_data& privkey)
-.. cpp:function:: private_data elliptic_curve_key::private_key() const
-
-Using private key functionality when a public key is set is undefined, and
-most operations will likely fail.
-
-:ref:`examples_priv` is an example program for working with Bitcoin private keys.
-The example shows generating private keys, showing the address and
-signing/verifying of a hash digest.
-
-Show Your Bitcoin Address
--------------------------
-
-A Bitcoin address is a specially encoded hash of the public key. First the
-public key is hashed with :func:`generate_ripemd_hash` by calling RIPEMD twice.
-Then a checksum is generated with :func:`generate_sha256_checksum` and appended.
-A version byte is prepended, usually :type:`payment_address::pubkey_version`.
-Finally the whole byte array is encoded in base58 using :func:`encode_base58`.
-
-Bitcoin addresses are between 27-34 alphanumeric characters. The
-:class:`payment_address` class represents a Bitcoin address.
-::
-
- // Takes a raw private key, loads it using the elliptic_curve_key class,
- // and displays the Bitcoin address for it.
- bool display_address(const std::string raw_private_key)
- {
- elliptic_curve_key ec;
- if (!ec.set_private_key(
- private_data(raw_private_key.begin(), raw_private_key.end())))
- return false;
- payment_address address;
- if (!set_public_key(address, ec.public_key()))
- return false;
- log_info() << address.encoded();
- return true;
- }
-
-:class:`payment_address` is able to tell us more information about a
-Bitcoin address such as its payment type.
-::
-
- // We can also use address.set_encoded(addr) and check the bool return value.
- payment_address address("1MuqPCL7Uven1pAPzfXPVpErZq1R8G3yHs");
- // payment_type enum is defined in script.hpp
- assert(address.type() == payment_type::pubkey_hash);
-
-libwallet
-=========
-
-libwallet is an additional library that extends libbitcoin with support for
-old-style pre-HE deterministic wallets, and working with various key formats.
-
-The `libwallet repo <https://github.com/spesmilo/libwallet>`_ was originally
-part of libbitcoin but was split for modularity and maintenance. To use it
-in your project add these lines to source files::
-
- #include <wallet/wallet.hpp>
- using namespace libwallet;
-
-Deterministic Wallets
-=====================
-
-A deterministic wallet is a wallet where private and public keys are all derived
-from a starting seed value. Take ``hash(seed + n)`` where ``n`` starts from 1
-and increment as additional keys are needed. Use this value to generate the nth
-private key. This is a deterministic wallet.
-
-A deterministic wallet can be backed up by copying the starting seed
-value to a secure location, and this only needs to be done once. If the wallet
-ever gets lost, all private and public keys can be regenerated from the initial
-seed.
-
-Also, multiple devices could host the same wallet based off of the same seed and
-automatically stay in sync with each other. Non-critical information such as
-address books would need to be stored and copied between wallets.
-
-libwallet implements the same compatible deterministic wallet algorithm as `Electrum <http://electrum.org/>`_.
-Wallet seeds from the Bitcoin client Electrum are usable in libwallet.
-Deterministic wallets are always initialized with a seed whether newly
-generated or set.
-::
-
- deterministic_wallet wallet;
- // Create new seed.
- wallet.new_seed();
- log_info() << "new seed: " << wallet.seed();
-
-::
-
- deterministic_wallet wallet;
- // Set seed.
- if (!wallet.set_seed("a219213f9b12422aa206d988e3e49607"))
- log_error() << "Error setting seed.";
-
-Calling :func:`deterministic_wallet::generate_public_key` with an integer n generates
-the nth public key. To iterate through the public keys in a wallet, repeatedly
-call :func:`deterministic_wallet::generate_public_key` starting at 1 and incrementing.
-
-Deterministic wallets usually use a *gap limit* number to decide when to stop
-incrementing n. The *gap limit* is how many sequential addresses must have a
-0 balance before it stops generating Bitcoin addresses.
-::
-
- // Get an address from wallet...
- data_chunk pubkey = wallet.generate_public_key(2);
- payment_address addr;
- if (!set_public_key(addr, pubkey))
- log_error() << "Error setting public key.";
- assert(addr.encoded() == "1E4vM9q25xsyDwWwdqHUWnwshdWC9PykmL");
-
-Computing the corresponding private key involves a similar logic. Instead of
-reading the private key directly, a value called the *secret parameter* is
-created by the deterministic wallet. This is put into the elliptic curve
-formula and used to create the private key.
-::
-
- // ... Get the corresponding private key.
- // Extract the secret parameter.
- secret_parameter secret = wallet.generate_secret(2);
- assert(encode_hex(secret) == "33cc7e35fbb78d17d207e53d0fe950d1db571be889b3ff87aec653e501759264");
- // The secret parameter is used to compute the private key
- // by the elliptic curve formula.
- elliptic_curve_key privkey;
- if (!privkey.set_secret(secret))
- log_error() << "Error set private key.";
- // Wallet generated public key should match corresponding public key
- // in the private key.
- assert(privkey.public_key() == pubkey);
-
-To see all this working together, view :ref:`examples_determ`.
-
-Master Public Key
------------------
-
-The master public key is an interesting concept. A :class:`deterministic_wallet`
-can be initialized with a master public key that allows generating all the
-public keys with :func:`deterministic_wallet::generate_public_key`, but not
-the corresponding private keys (through the secret parameter).
-
-Imagine a small business owner who wants their staff to have access to deposit
-addresses in their wallet to accept payments from customers, but not the
-ability to access all the funds. Waiters in a restaurant can accept Bitcoin
-payments which only the shop owner can spend.
-
-Another use-case is a website keeping their Bitcoins offline. They can accept
-payments into their offline wallet. Without access to their seed (which is kept
-offline), nobody can spend their Bitcoins.
-::
-
- data_chunk mpk = wallet.master_public_key();
- assert(encode_hex(mpk) == "d996c1a50ca4a57a9dface614338a1d837cb339e08361cfaf66ffd7da8e21786a7142a014056439d579654d7bb58dd5724b93372b5efae62e76783300f2b6cb5");
-
-A master key can only generate public keys but never the private keys.
-Calls to :func:`deterministic_wallet::generate_secret` will always return
-a zero-initialized :type:`hash_digest`, defined as the constant *null_hash*.
-::
-
- deterministic_wallet wallet2;
- wallet2.set_master_public_key(mpk);
- assert(wallet2.generate_public_key(2) == pubkey);
- // Trying to generate the secret parameter will always return null_hash.
- assert(wallet2.generate_secret(2) == null_hash);
-
-Different Key Formats
-=====================
-
-Hex-Encoded Secret
-------------------
-
-The *secret parameter* is a value used by the elliptic curve formula to
-compute the private key.
-::
-
- secret_parameter secret = decode_hex_digest<secret_parameter>("33cc7e35fbb78d17d207e53d0fe950d1db571be889b3ff87aec653e501759264");
- // The secret parameter is used to compute the private key
- // by the elliptic curve formula.
- elliptic_curve_key privkey;
- if (!privkey.set_secret(secret))
- log_error() << "Error set private key.";
-
-::
-
- // Display the secret parameter.
- std::cout << privkey.secret() << std::endl;
-
-Wallet Import Format
---------------------
-
-Wallet Import Format (WIF) is a way to encode the secret parameter to make
-copying the private key easier.
-
-.. cpp:function:: std::string secret_to_wif(const secret_parameter& secret)
-
- Convert a secret parameter to the wallet import format.
- Returns an empty string on error.
- ::
-
- std::string wif = secret_to_wif(secret);
- if (wif.empty())
- // Error...
-
-.. cpp:function:: secret_parameter wif_to_secret(const std::string& wif)
-
- Convert wallet import format key to secret parameter.
- Returns a nulled secret on error.
- ::
-
- secret_parameter secret = wif_to_secret(
- "5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ");
- if (secret == null_hash)
- // Error...
-
-Casascius Minikey
------------------
-
-Casascius coins encode private keys in a format known as Casascius minikey.
-:func:`minikey_to_secret` converts a Casascius minikey to a secret parameter.
-
-.. cpp:function:: secret_parameter minikey_to_secret(const std::string& minikey)
-
- Convert Cascasius minikey to secret parameter.
- Returns a nulled secret on error.
- ::
-
- secret_parameter secret =
- minikey_to_secret("S6c56bnXQiBjk9mqSYE7ykVQ7NzrRy");
- if (secret == null_hash)
- // Error...
-
diff --git a/doc/sphinx/examples/accept.rst b/doc/sphinx/examples/accept.rst
deleted file mode 100644
index a9ace77..0000000
--- a/doc/sphinx/examples/accept.rst
+++ /dev/null
@@ -1,91 +0,0 @@
-.. _examples_accept:
-
-examples/accept.cpp
-#####################
-
-Accept connections from Bitcoin nodes on port 8333.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- using std::placeholders::_1;
- using std::placeholders::_2;
-
- // Listening has started.
- // Wait to accept a connection.
- void listening_started(const std::error_code& ec, acceptor_ptr accept);
- // Connection to another Bitcoin node has been established.
- // Wait for version message.
- void accepted_connection(const std::error_code& ec, channel_ptr node,
- acceptor_ptr accept);
- // Version message received.
- // Display the user agent.
- void version_received(const std::error_code& ec, const version_type& version,
- channel_ptr node);
- void node_stopped(const std::error_code& ec);
-
- void listening_started(const std::error_code& ec, acceptor_ptr accept)
- {
- if (ec)
- {
- log_error() << "Listen: " << ec.message();
- return;
- }
- // Accept first connection.
- accept->accept(
- std::bind(accepted_connection, _1, _2, accept));
- }
-
- void accepted_connection(const std::error_code& ec, channel_ptr node,
- acceptor_ptr accept)
- {
- if (ec)
- {
- log_error() << "Accept: " << ec.message();
- return;
- }
- log_info() << "Accepted connection!";
- node->subscribe_stop(node_stopped);
- // Now we need to keep it alive otherwise the connection is closed.
- node->subscribe_version(
- std::bind(version_received, _1, _2, node));
- // Keep accepting more connections.
- accept->accept(
- std::bind(accepted_connection, _1, _2, accept));
- }
-
- void version_received(const std::error_code& ec, const version_type& version,
- channel_ptr node)
- {
- // error::service_stopped means the connection was closed.
- if (ec == error::service_stopped)
- return;
- else if (ec)
- {
- log_error() << "Version message: " << ec.message();
- return;
- }
- log_info() << "User agent: " << version.user_agent;
- }
-
- void node_stopped(const std::error_code& ec)
- {
- if (ec == error::service_stopped)
- log_info() << "Connection closed.";
- else if (ec)
- log_error() << "Connection closed: " << ec.message();
- }
-
- int main()
- {
- threadpool pool(4);
- network net(pool);
- net.listen(8333, listening_started);
- std::cin.get();
- pool.stop();
- pool.join();
- return 0;
- }
-
diff --git a/doc/sphinx/examples/balance.rst b/doc/sphinx/examples/balance.rst
deleted file mode 100644
index 4924672..0000000
--- a/doc/sphinx/examples/balance.rst
+++ /dev/null
@@ -1,77 +0,0 @@
-.. _examples_balance:
-
-examples/balance.cpp
-#####################
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- blockchain* c = nullptr;
- std::string addr;
-
- void blockchain_started(const std::error_code& ec);
- void history_fetched(const std::error_code& ec,
- const blockchain::history_list& history);
-
- void blockchain_started(const std::error_code& ec)
- {
- if (ec)
- {
- log_error() << "Blockchain failed to start: " << ec.message();
- return;
- }
- log_info() << "Blockchain started.";
- payment_address payaddr;
- if (!payaddr.set_encoded(addr))
- {
- log_fatal() << "Invalid address";
- return;
- }
- c->fetch_history(payaddr, history_fetched);
- }
-
- void history_fetched(const std::error_code& ec,
- const blockchain::history_list& history)
- {
- if (ec)
- {
- log_error() << "Failed to fetch history: " << ec.message();
- return;
- }
- #define LOG_RESULT "result"
- uint64_t total_recv = 0, balance = 0;
- for (const auto& row: history)
- {
- uint64_t value = row.value;
- BITCOIN_ASSERT(value >= 0);
- total_recv += value;
- if (row.spend.hash == null_hash)
- balance += value;
- }
- log_debug(LOG_RESULT) << "Queried " << history.size()
- << " outpoints, values and their spends.";
- log_debug(LOG_RESULT) << "Total received: " << total_recv;
- log_debug(LOG_RESULT) << "Balance: " << balance;
- log_info(LOG_RESULT) << "History fetched";
- }
-
- int main(int argc, char** argv)
- {
- if (argc != 2)
- {
- log_info() << "Usage: balance ADDRESS";
- return -1;
- }
- addr = argv[1];
- threadpool pool(1);
- leveldb_blockchain chain(pool);
- c = &chain;
- chain.start("blockchain", blockchain_started);
- pool.shutdown();
- pool.join();
- chain.stop();
- return 0;
- }
-
diff --git a/doc/sphinx/examples/connect.rst b/doc/sphinx/examples/connect.rst
deleted file mode 100644
index 127a50b..0000000
--- a/doc/sphinx/examples/connect.rst
+++ /dev/null
@@ -1,71 +0,0 @@
-.. _examples_connect:
-
-examples/connect.cpp
-#####################
-
-Connect to a Bitcoin node on localhost, port 8333.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- using std::placeholders::_1;
-
- // Connection is established.
- // Send version message to remote host.
- void connect_started(const std::error_code& ec, channel_ptr node);
- // Verson message finished sending.
- // Program completed.
- void version_sent(const std::error_code& ec, channel_ptr node);
-
- void connect_started(const std::error_code& ec, channel_ptr node)
- {
- if (ec)
- {
- log_error() << "Connect: " << ec.message();
- return;
- }
- // Create our version message we want to send.
- // Fill in a bunch of fields.
- version_type version;
- version.version = 60000;
- version.services = 1;
- version.address_me.services = version.services;
- version.address_me.ip =
- ip_address_type{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x01};
- version.address_me.port = 8333;
- version.address_you.services = version.services;
- version.address_you.ip =
- ip_address_type{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x01};
- version.address_you.port = 8333;
- // Set the user agent.
- version.user_agent = "/libbitcoin/connect-test/";
- version.start_height = 0;
- version.nonce = rand();
- // Begin the send.
- // Calls version_sent callback when complete.
- node->send(version, std::bind(version_sent, _1, node));
- }
-
- void version_sent(const std::error_code& ec, channel_ptr node)
- {
- if (ec)
- log_error() << "Sending version: " << ec.message();
- else
- log_info() << "Version sent.";
- }
-
- int main()
- {
- threadpool pool(1);
- network net(pool);
- net.connect("localhost", 8333, connect_started);
- std::cin.get();
- pool.stop();
- pool.join();
- return 0;
- }
-
diff --git a/doc/sphinx/examples/determ.rst b/doc/sphinx/examples/determ.rst
deleted file mode 100644
index e481467..0000000
--- a/doc/sphinx/examples/determ.rst
+++ /dev/null
@@ -1,51 +0,0 @@
-.. _examples_determ:
-
-examples/determ.cpp
-###################
-
-Demonstration of deterministic wallet.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- int main()
- {
- deterministic_wallet wallet;
- // Set seed.
- if (!wallet.set_seed("a219213f9b12422aa206d988e3e49607"))
- log_error() << "Error setting seed.";
-
- // Get an address from wallet...
- data_chunk pubkey = wallet.generate_public_key(2);
- payment_address addr;
- set_public_key(addr, pubkey);
- assert(addr.encoded() == "1E4vM9q25xsyDwWwdqHUWnwshdWC9PykmL");
-
- // ... Get the corresponding private key.
- // Extract the secret parameter.
- secret_parameter secret = wallet.generate_secret(2);
- assert(encode_hex(secret) == "33cc7e35fbb78d17d207e53d0fe950d1db571be889b3ff87aec653e501759264");
- // The secret parameter is used to compute the private key
- // by the elliptic curve formula.
- elliptic_curve_key privkey;
- if (!privkey.set_secret(secret))
- log_error() << "Error set private key.";
- // Wallet generated public key should match corresponding public key
- // in the private key.
- assert(privkey.public_key() == pubkey);
-
- // Master public key
- data_chunk mpk = wallet.master_public_key();
- assert(encode_hex(mpk) == "d996c1a50ca4a57a9dface614338a1d837cb339e08361cfaf66ffd7da8e21786a7142a014056439d579654d7bb58dd5724b93372b5efae62e76783300f2b6cb5");
-
- // A master key can only generate public keys and not the private keys.
- deterministic_wallet wallet2;
- wallet2.set_master_public_key(mpk);
- assert(wallet2.generate_public_key(2) == pubkey);
- // Trying to generate the secret parameter will always return null_hash.
- assert(wallet2.generate_secret(2) == null_hash);
- return 0;
- }
-
diff --git a/doc/sphinx/examples/display-last.rst b/doc/sphinx/examples/display-last.rst
deleted file mode 100644
index 3a304f5..0000000
--- a/doc/sphinx/examples/display-last.rst
+++ /dev/null
@@ -1,105 +0,0 @@
-.. _examples_display-last:
-
-examples/display-last.cpp
-#########################
-
-Display info from the last block in our blockchain at "./blockchain/"
-
-You will need to call initchain on the database first before using this.
-Maybe even download a few blocks into the database. See the section on
-the blockchain in the docs.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- blockchain* chain = nullptr;
-
- // Completion handler for when the blockchain has finished initializing.
- void blockchain_started(const std::error_code& ec);
- // Fetch the last block now that we have the height.
- void height_fetched(const std::error_code& ec, size_t last_height);
- // Result: print the block header.
- void display_block_header(const std::error_code& ec,
- const block_header_type& header);
-
- void blockchain_started(const std::error_code& ec)
- {
- // std::error_code's can be tested like bools, and
- // compared against specific error enums.
- // See <bitcoin/error.hpp> for a full list of them.
- if (ec)
- {
- log_error() << "Blockchain failed to start: " << ec.message();
- return;
- }
- // Blockchain has safely started.
- log_info() << "Blockchain started.";
- // chain should've been set inside main().
- assert(chain);
- // Begin fetching the last height number.
- chain->fetch_last_height(height_fetched);
- }
-
- void height_fetched(const std::error_code& ec, size_t last_height)
- {
- if (ec)
- {
- log_error() << "Failed to fetch last height: " << ec.message();
- return;
- }
- // Display the block number.
- log_info() << "height: " << last_height;
- assert(chain);
- // Begin fetching the block header.
- chain->fetch_block_header(last_height, display_block_header);
- }
-
- // This is not the full block, only the header.
- // For the full block use fetch_block() instead.
- void display_block_header(const std::error_code& ec,
- const block_header_type& header)
- {
- if (ec)
- {
- log_error() << "Failure fetching block header: " << ec.message();
- return;
- }
- // 32 byte std::array of uint8_t
- const hash_digest& blk_hash = hash_block_header(header);
- // Encode block hash into a pretty hex string.
- log_info() << "hash: " << encode_hex(blk_hash);
- // Display a few fields from the block header.
- // See <bitcoin/primitives.hpp> for the definition of block_type.
- log_info() << "version: " << header.version;
- // hash_digest can be used directly in log_info(),
- // implicity calling encode_hex() on the hash_digest.
- log_info() << "previous_block_hash: " << header.previous_block_hash;
- log_info() << "merkle: " << header.merkle;
- log_info() << "timestamp: " << header.timestamp;
- log_info() << "bits: " << header.bits;
- log_info() << "nonce: " << header.nonce;
- // A goodbye message.
- log_info() << "Finished.";
- }
-
- int main()
- {
- // Define a threadpool with 1 thread.
- threadpool pool(1);
- // Create a LevelDB blockchain.
- leveldb_blockchain ldb_chain(pool);
- // Initialize our global 'chain' pointer from above.
- chain = &ldb_chain;
- // Start the database using its implementation specific method.
- ldb_chain.start("blockchain", blockchain_started);
- // Don't wait after all current operations have completed.
- pool.shutdown();
- // Join them one by one.
- pool.join();
- // Finally stop the blockchain safely now everything has stopped.
- ldb_chain.stop();
- return 0;
- }
-
diff --git a/doc/sphinx/examples/fullnode.rst b/doc/sphinx/examples/fullnode.rst
deleted file mode 100644
index 5fb6ad1..0000000
--- a/doc/sphinx/examples/fullnode.rst
+++ /dev/null
@@ -1,332 +0,0 @@
-.. _examples_fullnode:
-
-examples/fullnode.cpp
-#####################
-
-Full node implementation. Expects the blockchain to be present in
-"./blockchain/" and initialized using ./initchain
-
-::
-
- #include <future>
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- using std::placeholders::_1;
- using std::placeholders::_2;
- using std::placeholders::_3;
-
- void log_to_file(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
- {
- if (body.empty())
- return;
- file << level_repr(level);
- if (!domain.empty())
- file << " [" << domain << "]";
- file << ": " << body << std::endl;
- }
- void log_to_both(std::ostream& device, std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
- {
- if (body.empty())
- return;
- std::ostringstream output;
- output << level_repr(level);
- if (!domain.empty())
- output << " [" << domain << "]";
- output << ": " << body;
- device << output.str() << std::endl;
- file << output.str() << std::endl;
- }
-
- void output_file(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
- {
- log_to_file(file, level, domain, body);
- }
- void output_both(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
- {
- log_to_both(std::cout, file, level, domain, body);
- }
-
- void error_file(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
- {
- log_to_file(file, level, domain, body);
- }
- void error_both(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
- {
- log_to_both(std::cerr, file, level, domain, body);
- }
-
- class fullnode
- {
- public:
- fullnode();
- void start();
- // Should only be called from the main thread.
- // It's an error to join() a thread from inside it.
- void stop();
-
- blockchain& chain();
- transaction_indexer& indexer();
-
- private:
- void handle_start(const std::error_code& ec);
-
- // New connection has been started.
- // Subscribe to new transaction messages from the network.
- void connection_started(const std::error_code& ec, channel_ptr node);
- // New transaction message from the network.
- // Attempt to validate it by storing it in the transaction pool.
- void recv_tx(const std::error_code& ec,
- const transaction_type& tx, channel_ptr node);
- // Result of store operation in transaction pool.
- void new_unconfirm_valid_tx(
- const std::error_code& ec, const index_list& unconfirmed,
- const transaction_type& tx);
-
- // Threadpools
- threadpool net_pool_, disk_pool_, mem_pool_;
- // Services
- hosts hosts_;
- handshake handshake_;
- network network_;
- protocol protocol_;
- leveldb_blockchain chain_;
- poller poller_;
- transaction_pool txpool_;
- transaction_indexer txidx_;
- // Mac OSX needs the bc:: namespace qualifier to compile.
- // Other systems should be OK.
- bc::session session_;
- };
-
- fullnode::fullnode()
- // Threadpools and the number of threads they spawn.
- // 6 threads spawned in total.
- : net_pool_(1), disk_pool_(4), mem_pool_(1),
- // Networking related services.
- hosts_(net_pool_), handshake_(net_pool_), network_(net_pool_),
- protocol_(net_pool_, hosts_, handshake_, network_),
- // Blockchain database service.
- chain_(disk_pool_),
- // Poll new blocks, and transaction memory pool.
- poller_(mem_pool_, chain_), txpool_(mem_pool_, chain_), txidx_(mem_pool_),
- // Session manager service. Convenience wrapper.
- session_(net_pool_, {
- handshake_, protocol_, chain_, poller_, txpool_})
- {
- }
-
- void fullnode::start()
- {
- // Subscribe to new connections.
- protocol_.subscribe_channel(
- std::bind(&fullnode::connection_started, this, _1, _2));
- // Start blockchain. Must finish before any operations
- // are performed on the database (or they will fail).
- std::promise<std::error_code> ec_promise;
- auto blockchain_started =
- [&ec_promise](const std::error_code& ec)
- {
- ec_promise.set_value(ec);
- };
- chain_.start("blockchain", blockchain_started);
- std::error_code ec = ec_promise.get_future().get();
- if (ec)
- {
- log_error() << "Problem starting blockchain: " << ec.message();
- return;
- }
- // Start transaction pool
- txpool_.start();
- // Fire off app.
- auto handle_start =
- std::bind(&fullnode::handle_start, this, _1);
- session_.start(handle_start);
- }
-
- void fullnode::stop()
- {
- std::promise<std::error_code> ec_promise;
- auto session_stopped =
- [&ec_promise](const std::error_code& ec)
- {
- ec_promise.set_value(ec);
- };
- session_.stop(session_stopped);
- std::error_code ec = ec_promise.get_future().get();
- if (ec)
- log_error() << "Problem stopping session: " << ec.message();
-
- // Stop threadpools.
- net_pool_.stop();
- disk_pool_.stop();
- mem_pool_.stop();
- // Join threadpools. Wait for them to finish.
- net_pool_.join();
- disk_pool_.join();
- mem_pool_.join();
-
- // Safely close blockchain database.
- chain_.stop();
- }
-
- blockchain& fullnode::chain()
- {
- return chain_;
- }
- transaction_indexer& fullnode::indexer()
- {
- return txidx_;
- }
-
- void fullnode::handle_start(const std::error_code& ec)
- {
- if (ec)
- log_error() << "fullnode: " << ec.message();
- }
-
- void fullnode::connection_started(const std::error_code& ec, channel_ptr node)
- {
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- // Subscribe to transaction messages from this node.
- node->subscribe_transaction(
- std::bind(&fullnode::recv_tx, this, _1, _2, node));
- // Stay subscribed to new connections.
- protocol_.subscribe_channel(
- std::bind(&fullnode::connection_started, this, _1, _2));
- }
-
- void fullnode::recv_tx(const std::error_code& ec,
- const transaction_type& tx, channel_ptr node)
- {
- if (ec)
- {
- log_error() << "Receive transaction: " << ec.message();
- return;
- }
- auto handle_deindex = [](const std::error_code& ec)
- {
- if (ec)
- log_error() << "Deindex error: " << ec.message();
- };
- // Called when the transaction becomes confirmed in a block.
- auto handle_confirm = [this, tx, handle_deindex](
- const std::error_code& ec)
- {
- log_debug() << "handle_confirm ec = " << ec.message()
- << " " << hash_transaction(tx);
- if (ec)
- log_error() << "Confirm error ("
- << hash_transaction(tx) << "): " << ec.message();
- txidx_.deindex(tx, handle_deindex);
- };
- // Validate the transaction from the network.
- // Attempt to store in the transaction pool and check the result.
- txpool_.store(tx, handle_confirm,
- std::bind(&fullnode::new_unconfirm_valid_tx, this, _1, _2, tx));
- // Resubscribe to transaction messages from this node.
- node->subscribe_transaction(
- std::bind(&fullnode::recv_tx, this, _1, _2, node));
- }
-
- void fullnode::new_unconfirm_valid_tx(
- const std::error_code& ec, const index_list& unconfirmed,
- const transaction_type& tx)
- {
- auto handle_index = [](const std::error_code& ec)
- {
- if (ec)
- log_error() << "Index error: " << ec.message();
- };
- const hash_digest& tx_hash = hash_transaction(tx);
- if (ec)
- {
- log_warning()
- << "Error storing memory pool transaction "
- << tx_hash << ": " << ec.message();
- }
- else
- {
- auto l = log_debug();
- l << "Accepted transaction ";
- if (!unconfirmed.empty())
- {
- l << "(Unconfirmed inputs";
- for (auto idx: unconfirmed)
- l << " " << idx;
- l << ") ";
- }
- l << tx_hash;
- txidx_.index(tx, handle_index);
- }
- }
-
- void history_fetched(const std::error_code& ec,
- const blockchain::history_list& history)
- {
- if (ec)
- {
- log_error() << "Failed to fetch history: " << ec.message();
- return;
- }
- log_info() << "Query fine.";
- for (const auto& row: history)
- {
- log_info() << "output: " << row.output
- << " height: " << row.output_height;
- log_info() << "value: " << row.value;
- auto l = log_info();
- l << "spend: ";
- if (row.spend.hash == null_hash)
- l << "Unspent";
- else
- l << row.spend << " height: " << row.spend_height;
- }
- }
-
- int main()
- {
- std::ofstream outfile("debug.log"), errfile("error.log");
- log_debug().set_output_function(
- std::bind(output_file, std::ref(outfile), _1, _2, _3));
- log_info().set_output_function(
- std::bind(output_both, std::ref(outfile), _1, _2, _3));
- log_warning().set_output_function(
- std::bind(error_file, std::ref(errfile), _1, _2, _3));
- log_error().set_output_function(
- std::bind(error_both, std::ref(errfile), _1, _2, _3));
- log_fatal().set_output_function(
- std::bind(error_both, std::ref(errfile), _1, _2, _3));
-
- fullnode app;
- app.start();
- while (true)
- {
- std::string addr;
- std::getline(std::cin, addr);
- if (addr == "stop")
- break;
- payment_address payaddr;
- if (!payaddr.set_encoded(addr))
- {
- log_error() << "Skipping invalid Bitcoin address.";
- continue;
- }
- fetch_history(app.chain(), app.indexer(),
- payaddr, history_fetched);
- }
- app.stop();
-
- return 0;
- }
-
diff --git a/doc/sphinx/examples/initchain.rst b/doc/sphinx/examples/initchain.rst
deleted file mode 100644
index c94aae9..0000000
--- a/doc/sphinx/examples/initchain.rst
+++ /dev/null
@@ -1,58 +0,0 @@
-.. _examples_initchain:
-
-examples/initchain.cpp
-######################
-
-Create a new leveldb blockchain database.
-
-::
-
- #include <future>
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- int main(int argc, char** argv)
- {
- if (argc != 2)
- return 1;
- const std::string dbpath = argv[1];
- // Threadpool context containing 1 thread.
- threadpool pool(1);
- // leveldb_blockchain operations execute in pool's thread.
- leveldb_blockchain chain(pool);
- // Completion handler for starting the leveldb_blockchain.
- // Does nothing.
- auto blockchain_start = [](const std::error_code& ec) {};
- // Start blockchain with a database path.
- chain.start(dbpath, blockchain_start);
- // First block is the genesis block.
- block_type first_block = genesis_block();
- std::promise<std::error_code> ec_promise;
- // Completion handler for import method.
- auto import_finished =
- [&ec_promise](const std::error_code& ec)
- {
- ec_promise.set_value(ec);
- };
- // Import the genesis block at height 0.
- // Doesn't validate or perform checks on the block.
- chain.import(first_block, 0, import_finished);
- // Wait until std::error_code is set by
- // import_finished completion handler.
- std::error_code ec = ec_promise.get_future().get();
- if (ec)
- {
- log_error() << "Importing genesis block failed: " << ec.message();
- return -1;
- }
- log_info() << "Imported genesis block "
- << hash_block_header(first_block.header);
- // All threadpools stopping in parallel...
- pool.stop();
- // ... Make them all join main thread and wait until they finish.
- pool.join();
- // Now safely close leveldb_blockchain.
- chain.stop();
- return 0;
- }
-
diff --git a/doc/sphinx/examples/priv.rst b/doc/sphinx/examples/priv.rst
deleted file mode 100644
index 85f3f61..0000000
--- a/doc/sphinx/examples/priv.rst
+++ /dev/null
@@ -1,118 +0,0 @@
-.. _examples_priv:
-
-examples/priv.cpp
-#################
-
-Demonstration of private keys.
-
-::
-
- #include <iostream>
- #include <sstream>
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- void display_help()
- {
- puts("Usage: priv [COMMAND] [ARGS]...");
- puts("");
- puts("The priv commands are:");
- puts(" new\t\tGenerate a new private key and output to STDOUT");
- puts(" sign\t\tSign the next argument using the private key in STDIN");
- puts(" verify\tVerify the next argument using the private key in STDIN");
- puts(" address\tshow the associated bitcoin address");
- }
-
- void error_exit(const char* message, int status=1)
- {
- std::cerr << "priv: " << message << std::endl;
- exit(status);
- }
-
- int new_keypair()
- {
- elliptic_curve_key ec;
- ec.new_key_pair();
- private_data raw_private_key = ec.private_key();
- std::cout << std::string(raw_private_key.begin(), raw_private_key.end());
- return 0;
- }
-
- int sign(const std::string input_data, const std::string raw_private_key)
- {
- hash_digest digest = decode_hex_digest<hash_digest>(input_data);
- elliptic_curve_key ec;
- if (!ec.set_private_key(
- private_data(raw_private_key.begin(), raw_private_key.end())))
- error_exit("bad private key");
- log_info() << encode_hex(ec.sign(digest));
- return 0;
- }
-
- int verify(const std::string input_data, const std::string& signature_data,
- const std::string raw_private_key)
- {
- hash_digest digest = decode_hex_digest<hash_digest>(input_data);
- data_chunk signature = decode_hex(signature_data);
- elliptic_curve_key ec;
- if (!ec.set_private_key(
- private_data(raw_private_key.begin(), raw_private_key.end())))
- error_exit("bad private key");
- log_info() << (ec.verify(digest, signature) ? '1' : '0');
- return 0;
- }
-
- int address(const std::string raw_private_key)
- {
- elliptic_curve_key ec;
- if (!ec.set_private_key(
- private_data(raw_private_key.begin(), raw_private_key.end())))
- error_exit("bad private key");
- payment_address address;
- set_public_key(address, ec.public_key());
- log_info() << address.encoded();
- return 0;
- }
-
- std::string read_private_key()
- {
- std::istreambuf_iterator<char> it(std::cin);
- std::istreambuf_iterator<char> end;
- return std::string(it, end);
- }
-
- int main(int argc, char** argv)
- {
- if (argc < 2)
- {
- display_help();
- return 0;
- }
- std::string command = argv[1];
- size_t number_args = argc - 2, arg_index = 2;
- if (command == "new")
- return new_keypair();
- else if (command == "sign")
- {
- if (number_args != 1)
- error_exit("sign requires argument data");
- std::string input_data = argv[arg_index];
- return sign(input_data, read_private_key());
- }
- else if (command == "verify")
- {
- if (number_args != 2)
- error_exit("verify requires argument data and signature");
- std::string input_data = argv[arg_index],
- signature = argv[arg_index + 1];
- return verify(input_data, signature, read_private_key());
- }
- else if (command == "address")
- return address(read_private_key());
- else
- error_exit("not a valid command. See priv help text.");
- // Should never happen!
- return 1;
- }
-
diff --git a/doc/sphinx/examples/proto.rst b/doc/sphinx/examples/proto.rst
deleted file mode 100644
index a18a075..0000000
--- a/doc/sphinx/examples/proto.rst
+++ /dev/null
@@ -1,96 +0,0 @@
-.. _examples_proto:
-
-examples/proto.cpp
-#####################
-
-Join the Bitcoin network.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- using std::placeholders::_1;
- using std::placeholders::_2;
-
- // We don't have a database open, and aren't doing any critical file
- // operations so we aren't worried about exiting suddenly.
- void check_error(const std::error_code& ec)
- {
- if (!ec)
- return;
- log_fatal() << ec.message();
- exit(-1);
- }
-
- // Needed for the C callback capturing the signals.
- bool stopped = false;
- void signal_handler(int sig)
- {
- log_info() << "Caught signal: " << sig;
- stopped = true;
- }
-
- // Started protocol. Node discovery complete.
- void handle_start(const std::error_code& ec);
- // After number of connections is fetched, this completion handler is called
- // and the number of connections is displayed.
- void display_number_of_connections(
- const std::error_code& ec, size_t connection_count);
-
- void handle_start(const std::error_code& ec)
- {
- check_error(ec);
- log_debug() << "Started.";
- }
-
- void display_number_of_connections(
- const std::error_code& ec, size_t connection_count)
- {
- check_error(ec);
- log_debug() << connection_count << " CONNECTIONS";
- }
-
- void connection_started(const std::error_code& ec, channel_ptr node,
- protocol& prot)
- {
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- log_info() << "Connection established.";
- // Resubscribe to new nodes.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot)));
- }
-
- int main()
- {
- threadpool pool(1);
- // Create dependencies for our protocol object.
- hosts hst(pool);
- handshake hs(pool);
- network net(pool);
- // protocol service.
- protocol prot(pool, hst, hs, net);
- // Perform node discovery if needed and then creating connections.
- prot.start(handle_start);
- // Notify us of new connections.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot)));
- // Catch C signals for stopping the program.
- signal(SIGABRT, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
- while (!stopped)
- {
- prot.fetch_connection_count(display_number_of_connections);
- sleep(1);
- }
- // Safely close down.
- pool.stop();
- pool.join();
- return 0;
- }
-
diff --git a/doc/sphinx/examples/satoshiwords.rst b/doc/sphinx/examples/satoshiwords.rst
deleted file mode 100644
index e8281a8..0000000
--- a/doc/sphinx/examples/satoshiwords.rst
+++ /dev/null
@@ -1,37 +0,0 @@
-.. _examples_satoshiwords:
-
-examples/satoshiwords.cpp
-#########################
-
-Display the genesis block message by Satoshi.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- int main()
- {
- // Create genesis block.
- block_type genblk = genesis_block();
- // Genesis block contains a single coinbase transaction.
- assert(genblk.transactions.size() == 1);
- // Get first transaction in block (coinbase).
- const transaction_type& coinbase_tx = genblk.transactions[0];
- // Coinbase tx has a single input.
- assert(coinbase_tx.inputs.size() == 1);
- const transaction_input_type& coinbase_input = coinbase_tx.inputs[0];
- // Get the input script (sometimes called scriptSig).
- const script& input_script = coinbase_input.input_script;
- // Convert this to its raw format.
- const data_chunk& raw_block_message = save_script(input_script);
- // Convert this to an std::string.
- std::string message;
- message.resize(raw_block_message.size());
- std::copy(raw_block_message.begin(), raw_block_message.end(),
- message.begin());
- // Display the genesis block message.
- std::cout << message << std::endl;
- return 0;
- }
-
diff --git a/doc/sphinx/examples/txrad.rst b/doc/sphinx/examples/txrad.rst
deleted file mode 100644
index 63cf1d0..0000000
--- a/doc/sphinx/examples/txrad.rst
+++ /dev/null
@@ -1,223 +0,0 @@
-.. _examples_txrad:
-
-examples/txrad.cpp
-#####################
-
-Transaction radar.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- using std::placeholders::_1;
- using std::placeholders::_2;
-
- // Watches transactions. Keeps a view count per seen tx hash, and
- // cleans up old expired tx hashes.
- class tx_watch
- : public async_strand
- {
- public:
- tx_watch(threadpool& pool, time_t timeout=200);
-
- // Push a seen tx hash. If this entry exists then the count
- // will be incremented.
- // Else create a new entry in our list.
- void push(const hash_digest& tx_hash);
- // Cleans up expired items. We could make this implicitly called
- // by push() or display(), but single use methods with no side-effects
- // is better code design.
- void cleanup();
- // Display transactions and their count. A better design would be to
- // separate the view from the model and instead provide a method which
- // fetches a copy of our list, but we keep it simple here.
- void display();
-
- private:
- struct entry_count
- {
- hash_digest tx_hash;
- size_t count;
- // Timestamp of when transaction hash was first seen.
- time_t timest;
- };
-
- typedef std::vector<entry_count> entry_list;
-
- // The public methods push these methods to the threadpool to be
- // executed and then return immediately.
- // async_strand::queue() is a helper method which posts the work
- // to the threadpool and serializes access.
- // No 2 operations posted through the same async_strand using queue()
- // will execute at the same time.
- void do_push(const hash_digest& tx_hash);
- void do_cleanup();
- void do_display();
-
- entry_list entries_;
- // Time until an entry is ready to be removed.
- time_t timeout_;
- };
-
- tx_watch::tx_watch(threadpool& pool, time_t timeout)
- : async_strand(pool), timeout_(timeout)
- {
- }
-
- void tx_watch::push(const hash_digest& tx_hash)
- {
- queue(std::bind(&tx_watch::do_push, this, tx_hash));
- // Returns immediately.
- }
- void tx_watch::do_push(const hash_digest& tx_hash)
- {
- // If tx_hash is found then increment count...
- bool is_found = false;
- for (entry_count& entry: entries_)
- if (entry.tx_hash == tx_hash)
- {
- ++entry.count;
- is_found = true;
- }
- // Else create a new entry with a count of 1.
- if (!is_found)
- entries_.push_back({tx_hash, 1, time(nullptr)});
- }
-
- void tx_watch::cleanup()
- {
- queue(std::bind(&tx_watch::do_cleanup, this));
- }
- void tx_watch::do_cleanup()
- {
- // Erase entries where timest is older than (now - timeout_) seconds.
- time_t current_time = time(nullptr);
- auto erase_pred =
- [&](const entry_count& entry)
- {
- return (current_time - entry.timest) > timeout_;
- };
- auto erase_begin =
- std::remove_if(entries_.begin(), entries_.end(), erase_pred);
- // If we have old entries to delete then erase them.
- if (erase_begin != entries_.end())
- entries_.erase(erase_begin);
- }
-
- void tx_watch::display()
- {
- queue(std::bind(&tx_watch::do_display, this));
- }
- void tx_watch::do_display()
- {
- // Sort entries by count. Highest numbers at the top.
- std::sort(entries_.begin(), entries_.end(),
- [](const entry_count& entry_a, const entry_count& entry_b)
- {
- return entry_a.count > entry_b.count;
- });
- // Display the first 20 entries.
- for (size_t i = 0; i < 20 && i < entries_.size(); ++i)
- {
- const entry_count& entry = entries_[i];
- log_info() << entry.tx_hash << " " << entry.count;
- }
- }
-
- // We don't have a database open, and aren't doing any critical file
- // operations so we aren't worried about exiting suddenly.
- void check_error(const std::error_code& ec)
- {
- if (!ec)
- return;
- log_fatal() << ec.message();
- exit(-1);
- }
-
- // Needed for the C callback capturing the signals.
- bool stopped = false;
- void signal_handler(int sig)
- {
- log_info() << "Caught signal: " << sig;
- stopped = true;
- }
-
- // Started protocol. Node discovery complete.
- void handle_start(const std::error_code& ec)
- {
- check_error(ec);
- log_debug() << "Started.";
- }
-
- void connection_started(const std::error_code& ec, channel_ptr node,
- protocol& prot, tx_watch& watch);
- void inventory_received(const std::error_code& ec, const inventory_type& inv,
- channel_ptr node, tx_watch& watch);
-
- void connection_started(const std::error_code& ec, channel_ptr node,
- protocol& prot, tx_watch& watch)
- {
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- log_info() << "Connection established.";
- // Subscribe to inventory packets.
- node->subscribe_inventory(
- std::bind(inventory_received, _1, _2, node, std::ref(watch)));
- // Resubscribe to new nodes.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot), std::ref(watch)));
- }
-
- void inventory_received(const std::error_code& ec, const inventory_type& inv,
- channel_ptr node, tx_watch& watch)
- {
- check_error(ec);
- // Loop through inventory hashes.
- for (const inventory_vector_type& ivec: inv.inventories)
- {
- // We're only interested in transactions. Discard everything else.
- if (ivec.type != inventory_type_id::transaction)
- continue;
- watch.push(ivec.hash);
- }
- // Resubscribe to inventory packets.
- node->subscribe_inventory(
- std::bind(inventory_received, _1, _2, node, std::ref(watch)));
- }
-
- int main()
- {
- threadpool pool(4);
- // Create dependencies for our protocol object.
- hosts hst(pool);
- handshake hs(pool);
- network net(pool);
- // protocol service.
- protocol prot(pool, hst, hs, net);
- // Perform node discovery if needed and then creating connections.
- prot.start(handle_start);
- // Our table tracking transaction counts.
- tx_watch watch(pool, 200);
- // Notify us of new connections.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot), std::ref(watch)));
- // Catch C signals for stopping the program.
- signal(SIGABRT, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
- while (!stopped)
- {
- watch.cleanup();
- watch.display();
- sleep(10);
- }
- // Safely close down.
- pool.stop();
- pool.join();
- return 0;
- }
-
diff --git a/doc/sphinx/fullnode.rst b/doc/sphinx/fullnode.rst
deleted file mode 100644
index 57f33ac..0000000
--- a/doc/sphinx/fullnode.rst
+++ /dev/null
@@ -1,396 +0,0 @@
-.. _tut-fullnode:
-
-************************
-Full Node Implementation
-************************
-
-Recap
-=====
-
-The library is based around the concept of *services* which operate through
-*threadpools*. We've covered the basics of the different services present
-to build Bitcoin applications.
-
-:ref:`Chapter 1<tut-intro>` talked about the design philosophy of libbitcoin.
-It was a largely theoretical text about the underpinnings of the library.
-
-:ref:`Chapter 2<tut-quickstart>` gave a quick practical example.
-
-:ref:`Chapter 3<tut-overview>` introduced core libbitcoin concepts, and
-an anatomy of the library. We looked at basic data types, the logging subsystem
-and useful snippets of the standard library.
-
-:ref:`Chapter 4<tut-crypto>` covered basic crypto, working with keys,
-deterministic wallets and converting different key formats.
-
-:ref:`Chapter 5<tut-blockchain>` discussed how to operate the
-:class:`blockchain` and use the :class:`leveldb_blockchain` backend.
-We saw how the :class:`poller` service :ref:`polls new blocks from nodes<tut-poller>`,
-and how new blocks/reorganisations are handled.
-
-:ref:`Chapter 6<tut-network>` illustrated the networking concepts.
-:class:`network` is the base service that handles networking, while
-:class:`protocol` handles :ref:`joining the peer to peer network<tut-protocol>`.
-There are other services that manage different aspects of the Bitcoin
-network like :class:`handshake` for the initialization handshake between
-2 nodes, or :class:`hosts` for managing lists of Bitcoin hosts.
-
-In this chapter we will introduce the final puzzle piece: unconfirmed
-transactions. Putting it all together we will build a full Bitcoin node
-in under 200 lines of code.
-
-We will introduce 2 new services. :class:`transaction_pool` is the unconfirmed
-transaction memory pool and validates incoming transactions for us.
-:class:`session` ties all the services together in a high level wrapper.
-It's a convenience service dealing with details like requesting transactions
-from the network or starting the protocol service.
-
-Source Code
-===========
-
-You can view the source code: :ref:`examples_fullnode`.
-
-Before starting, make sure to have initialized a blockchain database.
-::
-
- $ cd examples/
- $ make
- $ mkdir database/
- $ ./initchain database
- Imported genesis block 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
- $ ./fullnode
- ...
-
-Basic Outline
-=============
-
-We will make a :class:`fullnode` class that is responsible for holding all
-the :class:`threadpool` and :class:`service` objects. There are 2 class methods
-to :func:`start` and :func:`stop` it respectively.
-::
-
- class fullnode
- {
- public:
- fullnode();
- void start();
- // Should only be called from the main thread.
- // It's an error to join() a thread from inside it.
- void stop();
-
- private:
- // ...
-
- // Threadpools
- threadpool net_pool_, disk_pool_, mem_pool_;
- // Services
- hosts hosts_;
- handshake handshake_;
- network network_;
- protocol protocol_;
- leveldb_blockchain chain_;
- poller poller_;
- transaction_pool txpool_;
- // Mac OSX needs the bc:: namespace qualifier to compile.
- // Other systems should be OK.
- bc::session session_;
- };
-
-Our :func:`main` function instantiates the fullnode, starts it and then
-waits for the user to stop the node by pressing enter.
-::
-
- int main()
- {
- // ...
-
- fullnode app;
- app.start();
- std::cin.get();
- app.stop();
-
- return 0;
- }
-
-The constructor of :class:`fullnode` creates the threadpools and services,
-passing their dependencies into the constructor. Services generally use their
-constructor for specifying their dependencies.
-::
-
- fullnode::fullnode()
- // Threadpools and the number of threads they spawn.
- // 6 threads spawned in total.
- : net_pool_(1), disk_pool_(4), mem_pool_(1),
- // Networking related services.
- hosts_(net_pool_), handshake_(net_pool_), network_(net_pool_),
- protocol_(net_pool_, hosts_, handshake_, network_),
- // Blockchain database service.
- chain_(disk_pool_),
- // Poll new blocks, and transaction memory pool.
- poller_(mem_pool_, chain_), txpool_(mem_pool_, chain_),
- // Session manager service. Convenience wrapper.
- session_(net_pool_, {
- handshake_, protocol_, chain_, poller_, txpool_})
- {
- }
-
-We also define the :func:`start` and :func:`stop` methods of the
-:class:`fullnode`. If :func:`start` fails then :func:`fullnode::handle_start`
-will be called with :class:`std::error_code` set. If the
-:class:`std::error_code` is set then the error message is displayed.
-
-It's a mistake to call :func:`fullnode::stop` from within the same completion
-handler as we would then try to call :func:`threadpool::join` within the
-same thread causing a resource deadlock. Instead it is preferable to use
-:class:`std::condition_variable` to signal to :func:`main` that it's time
-to exit. We leave this as an exercise to the reader.
-::
-
- void fullnode::start()
- {
- // Start blockchain. Must finish before any operations
- // are performed on the database (or they will fail).
- std::promise<std::error_code> ec_chain;
- auto blockchain_started =
- [&](const std::error_code& ec)
- {
- ec_chain.set_value(ec);
- };
- chain_.start("database", blockchain_started);
- std::error_code ec = ec_chain.get_future().get();
- if (ec)
- {
- log_error() << "Problem starting blockchain: " << ec.message();
- return;
- }
- // Start transaction pool
- txpool_.start();
- // Fire off app.
- auto handle_start =
- std::bind(&fullnode::handle_start, this, _1);
- session_.start(handle_start);
- }
-
- void fullnode::stop()
- {
- session_.stop([](const std::error_code&) {});
-
- // Stop threadpools.
- net_pool_.stop();
- disk_pool_.stop();
- mem_pool_.stop();
- // Join threadpools. Wait for them to finish.
- net_pool_.join();
- disk_pool_.join();
- mem_pool_.join();
-
- // Safely close blockchain database.
- chain_.stop();
- }
-
- void fullnode::handle_start(const std::error_code& ec)
- {
- if (ec)
- log_error() << "fullnode: " << ec.message();
- }
-
-Unconfirmed Transactions
-========================
-
-Before bitcoin transactions make it into a block, they go into
-a transaction memory pool. :class:`transaction_pool` encapsulates that functionality
-performing the neccessary validation of a transaction before accepting
-it into its internal buffer.
-::
-
- threadpool pool(1);
- // transaction_pool needs access to the blockchain
- blockchain* chain = load_our_backend();
- // create and initialize the transaction memory pool
- transaction_pool txpool(pool, *chain);
- txpool.start();
-
-The :class:`session` service automatically does the task of asking for new
-transactions that the :class:`transaction_pool` doesn't have. For every new
-connection, we must subscribe to new transactions from the network using
-:func:`channel::subscribe_transaction`.
-
-These new transactions must then be validated by attempting to store it in the
-transaction memory pool with :func:`transaction_pool::store`.
-::
-
- class fullnode
- {
- public:
- // ...
-
- private:
- // ...
-
- // New connection has been started.
- // Subscribe to new transaction messages from the network.
- void connection_started(const std::error_code& ec, channel_ptr node);
- // New transaction message from the network.
- // Attempt to validate it by storing it in the transaction pool.
- void recv_tx(const std::error_code& ec,
- const transaction_type& tx, channel_ptr node);
- // Result of store operation in transaction pool.
- void new_unconfirm_valid_tx(
- const std::error_code& ec, const index_list& unconfirmed,
- const transaction_type& tx);
-
- // ...
- };
-
-At the beginning of start, we subscribe to new connections.
-::
-
- void fullnode::start()
- {
- // Subscribe to new connections.
- protocol_.subscribe_channel(
- std::bind(&fullnode::connection_started, this, _1, _2));
- // ...
- }
-
-And for every new connection, we subscribe to transaction messages from the
-network by calling :func:`channel::subscribe_transaction`. We again call
-:func:`protocol::subscribe_channel` to continue being notified of new
-connections.
-::
-
- void fullnode::connection_started(const std::error_code& ec, channel_ptr node)
- {
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- // Subscribe to transaction messages from this node.
- node->subscribe_transaction(
- std::bind(&fullnode::recv_tx, this, _1, _2, node));
- // Stay subscribed to new connections.
- protocol_.subscribe_channel(
- std::bind(&fullnode::connection_started, this, _1, _2));
- }
-
-Validating The Transaction
---------------------------
-
-The :class:`transaction_pool` interface is deliberately simple to minimise overhead.
-This class attempts no tracking of inputs or spends and only provides
-a store/fetch paradigm. Tracking must be performed externally and make
-use of :func:`transaction_pool::store`'s ``handle_store`` and
-``handle_confirm`` to manage changes in the state of memory pool transactions.
-
-.. cpp:function:: void transaction_pool::store(const transaction_type& stored_transaction, confirm_handler handle_confirm, store_handler handle_store)
-
- Attempt to store a transaction.
-
- ``handle_store`` is called on completion. The second argument is a list
- of unconfirmed input indexes. These inputs refer to a transaction
- that is not in the blockchain and is currently in the memory pool.
-
- In the case where store results in :class:`error::input_not_found`, the
- unconfirmed field refers to the single problematic input.
- ::
-
- void handle_store(
- const std::error_code& ec, // Status of operation
- const index_list& unconfirmed // Unconfirmed input indexes
- );
-
- ``handle_confirm`` is called when the transaction makes it into a block
- (becoming confirmed) and is removed from the transaction pool.
- ::
-
- void handle_confirm(
- const std::error_code& ec // Status of operation
- );
-
-Upon receiving transactions in :func:`fullnode::recv_tx`, we validate the
-transaction by attempting to store it in the transaction pool.
-::
-
- void fullnode::recv_tx(const std::error_code& ec,
- const transaction_type& tx, channel_ptr node)
- {
- if (ec)
- {
- log_error() << "Receive transaction: " << ec.message();
- return;
- }
- // Called when the transaction becomes confirmed in a block.
- auto handle_confirm = [](const std::error_code& ec)
- {
- if (ec)
- log_error() << "Confirm error: " << ec.message();
- };
- // Validate the transaction from the network.
- // Attempt to store in the transaction pool and check the result.
- txpool_.store(tx, handle_confirm,
- std::bind(&fullnode::new_unconfirm_valid_tx, this, _1, _2, tx));
- // Resubscribe to transaction messages from this node.
- node->subscribe_transaction(
- std::bind(&fullnode::recv_tx, this, _1, _2, node));
- }
-
-We now have the result of this sequence of operations. We know whether the
-transaction successfully passed validation or not.
-::
-
- void fullnode::new_unconfirm_valid_tx(
- const std::error_code& ec, const index_list& unconfirmed,
- const transaction_type& tx)
- {
- const hash_digest& tx_hash = hash_transaction(tx);
- if (ec)
- {
- log_error()
- << "Error storing memory pool transaction "
- << tx_hash << ": " << ec.message();
- }
- else
- {
- auto l = log_info();
- l << "Accepted transaction ";
- if (!unconfirmed.empty())
- {
- l << "(Unconfirmed inputs";
- for (auto idx: unconfirmed)
- l << " " << idx;
- l << ") ";
- }
- l << tx_hash;
- }
- }
-
-Requesting Dependencies
------------------------
-
-If the transaction failed to validate because one of its inputs was missing,
-then :class:`error::input_not_found` will be set as the
-:class:`std::error_code`, and ``unconfirmed`` will be set to a single value
-of which input was missing in the transaction. From this we can request the
-missing dependency from the network.
-::
-
- if (ec == error::input_not_found)
- {
- BITCOIN_ASSERT(unconfirmed.size() == 1);
- BITCOIN_ASSERT(unconfirmed[0] < tx.inputs.size());
- size_t missing_index = unconfirmed[0];
- const auto& prevout = tx.inputs[missing_index].previous_output;
- log_info() << "Requesting dependency " << encode_hex(prevout.hash)
- << " for " << encode_hex(tx_hash);
- get_data_type getdata;
- getdata.inventories.push_back(
- {inventory_type_id::transaction, prevout.hash});
- node->send(getdata, depends_requested);
- }
-
-Upon receipt of the dependency transaction from the remote host, and its
-successful validation in the :class:`transaction_pool`, we must resubmit this
-transaction. Assuming no other inputs are missing, the resubmitted
-transaction should then pass validation.
-
diff --git a/doc/sphinx/img/operations.png b/doc/sphinx/img/operations.png
deleted file mode 100644
index e0d5837..0000000
--- a/doc/sphinx/img/operations.png
+++ /dev/null
Binary files differ
diff --git a/doc/sphinx/index.rst b/doc/sphinx/index.rst
deleted file mode 100644
index bfa06a6..0000000
--- a/doc/sphinx/index.rst
+++ /dev/null
@@ -1,42 +0,0 @@
-.. _tutorial-index:
-
-###########################
- The libbitcoin Tutorial
-###########################
-
-Welcome to the online version of The libbitcoin Tutorial, a free tutorial about
-the libbitcoin library for the Bitcoin cryptocurrency.
-
-.. TODO: chapter 8 in progress.
-
-Contents:
-
-.. toctree::
- :numbered:
-
- introduction
- quickstart
- overview
- crypto
- blockchain
- network
- fullnode
- offlinetx
-
-.. toctree::
- :hidden:
-
- examples/priv
- examples/determ
- examples/initchain
- examples/display-last
- examples/balance
- examples/satoshiwords
- examples/connect
- examples/accept
- examples/proto
- examples/txrad
- examples/fullnode
-
-Author: Amir Taaki <amir@unsystem.net>
-
diff --git a/doc/sphinx/introduction.rst b/doc/sphinx/introduction.rst
deleted file mode 100644
index 05b909f..0000000
--- a/doc/sphinx/introduction.rst
+++ /dev/null
@@ -1,145 +0,0 @@
-.. _tut-intro:
-
-***************
-Introduction
-***************
-
-libbitcoin is a Bitcoin library targeted towards high end use. The library
-places a heavy focus around asychronicity. This enables a big scope for future
-scalability as each component has its own thread pool. By increasing the number
-of threads for that component the library is able to scale outwards across CPU
-cores. This will be vital in the future as the demands of the Bitcoin network
-grow.
-
-Another core design principle is libbitcoin is not a framework, but a toolkit.
-Frameworks hinder development during the latter stages of a development cycle,
-enforce one style of coding and do not work well with other frameworks. By
-contrast, we have gone to great pains to make libbitcoin function as an
-independent set of mutual components with no dependencies between them.
-
-The approach we took to our threaded design is built not around the data, but
-around tasks. On a finer level: operations. libbitcoin is a toolkit library that
-uses the proactor design pattern. It implements the proactor pattern through the
-use of completion handlers like in boost::asio.
-
-* **Scalability**. The library should facilitate the development of applications
- that scale to thousands of concurrent operations.
-* **Model concepts in an intuitive manner**. The library models different
- subsystems of Bitcoin in a clear and intuitive manner. We choose abstractions
- that allow designing a wide range of applications that rely on Bitcoin.
-* **Basis for further abstraction**. The library should permit the development
- of other libraries that provide higher levels of abstraction. For example,
- implementations of the Bitcoin protocol in other networks such as Tor.
-* **No blocking**. No blocking ever occurs waiting for another thread to complete
- (except possibly on a low level within boost dispatches- but that is uncommon).
-* **UNIX approach**. The library attempts to provide small units of
- functionality that perform one single task. Our philosophy is to break down
- higher level functionality into small parts and to simply provide those
- parts. The cost is inconvenience. The benefit is flexibility.
-
-.. _intro_design:
-
-Design
-======
-
-libbitcoin follows a few basic code design principles that quality does not
-necessarily increase with functionality. There is a point where less
-functionality is a preferable option in terms of practicality and usability.
-
-* **Simplicity**. It is more important for the implementation to be simple than
- the interface. Simplicity is the most important consideration in a design.
-* **Correctness**. The design should be correct in all aspects.
-* **Consistency**. The design must not be overly inconsistent. Consistency can
- be sacrificed for simplicity in some cases, but it is better to drop those
- parts of the design that deal with less common circumstances than to
- introduce either complexity or inconsistency in the implementation.
-* **Completeness**. The design must cover as many important situations as is
- practical. Completeness must be sacrificed whenever implementation simplicity
- is jeopardized.
-
-Unix and C are examples of this design. Small building blocks that are flexible
-in how they combine together.
-
-Generally the API focuses on implementation simplicity and only implements the
-bare neccessary functionality. Keep implementation simple and don't pollute
-class interfaces. Instead composed operations wrap lower level class methods
-to simplify common operations.
-::
-
- threadpool pool(1);
- network net(pool);
- handshake shake(pool);
- // ...
- connect(shake, net, "localhost", 8333, handle_handshake);
-
-Composed operations take the services they wrap as their primary arguments
-before their function parameters.
-
-**Classes do not implement more functionality than is neccessary.**
-
-Dependency Injection
---------------------
-
-Dependency injection is a software design pattern that allows removing
-hard-coded dependencies and making it possible to change them, whether at
-run-time or compile-time.
-
-Instead of having your objects creating a dependency or asking a factory
-object to make one for them, you pass the needed dependencies into the
-constructor.
-::
-
- threadpool pool(1);
- leveldb_blockchain chain(pool);
- // The dependencies for transaction_pool are passed into its constructor.
- // We could instead pass in a bdb_blockchain.
- transaction_pool txpool(pool, chain);
-
-The Zen of libbitcoin
-=====================
-
-| Readability over speed.
-| Beauty over convenience.
-| Simplicity over complexity.
-| Architected, not hacked.
-| Flat, not nested.
-| Explicit, not implicit.
-| Errors should be loud.
-| Never is better than right now.
-| Now is better than never.
-| Be flexible and configurable.
-| Build houses from bricks, software from modules.
-
-Examples
-========
-
-Each section comes with its own example code listing. These can be found in
-the examples/ directory of the source libbitcoin package.
-
-* :ref:`priv.cpp <examples_priv>` generates new private keys, shows a Bitcoin address and sign or
- verify data using the private key.
-* :ref:`determ.cpp <examples_determ>` shows working with deterministic wallets, generating both
- public and private keys.
-* :ref:`initchain.cpp <examples_initchain>`, initialize :class:`leveldb_blockchain` by creating a
- blank new database and adding the genesis block at height 0.
-* :ref:`display-last.cpp <examples_display-last>` fetches and displays the last
- block in a blockchain database.
-* :ref:`balance.cpp <examples_balance>` displays the balance of an address
- passed in as a command line argument.
-* :ref:`satoshiwords.cpp <examples_satoshiwords>` displays the genesis block
- message from Satoshi.
-* :ref:`accept.cpp <examples_accept>` listens for connections on port 8333,
- displaying the version's user agent.
-* :ref:`connect.cpp <examples_connect>` connects to localhost on port 8333,
- and sends a single version message.
-* :ref:`proto.cpp <examples_proto>` joins to the p2p Bitcoin network.
-* :ref:`txrad.cpp <examples_txrad>` implements a simple transaction radar.
-* :ref:`fullnode.cpp <examples_fullnode>` is a full node Bitcoin implementation. Blocks and
- unconfirmed transactions are validated.
-
-To run the examples invoke ``make`` in the ``examples/`` directory.
-::
-
- $ cd examples/
- $ make
-
diff --git a/doc/sphinx/make.bat b/doc/sphinx/make.bat
deleted file mode 100644
index bca4809..0000000
--- a/doc/sphinx/make.bat
+++ /dev/null
@@ -1,190 +0,0 @@
-@ECHO OFF
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set BUILDDIR=_build
-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
-set I18NSPHINXOPTS=%SPHINXOPTS% .
-if NOT "%PAPER%" == "" (
- set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
- set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
-)
-
-if "%1" == "" goto help
-
-if "%1" == "help" (
- :help
- echo.Please use `make ^<target^>` where ^<target^> is one of
- echo. html to make standalone HTML files
- echo. dirhtml to make HTML files named index.html in directories
- echo. singlehtml to make a single large HTML file
- echo. pickle to make pickle files
- echo. json to make JSON files
- echo. htmlhelp to make HTML files and a HTML help project
- echo. qthelp to make HTML files and a qthelp project
- echo. devhelp to make HTML files and a Devhelp project
- echo. epub to make an epub
- echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
- echo. text to make text files
- echo. man to make manual pages
- echo. texinfo to make Texinfo files
- echo. gettext to make PO message catalogs
- echo. changes to make an overview over all changed/added/deprecated items
- echo. linkcheck to check all external links for integrity
- echo. doctest to run all doctests embedded in the documentation if enabled
- goto end
-)
-
-if "%1" == "clean" (
- for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
- del /q /s %BUILDDIR%\*
- goto end
-)
-
-if "%1" == "html" (
- %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/html.
- goto end
-)
-
-if "%1" == "dirhtml" (
- %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
- goto end
-)
-
-if "%1" == "singlehtml" (
- %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
- goto end
-)
-
-if "%1" == "pickle" (
- %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can process the pickle files.
- goto end
-)
-
-if "%1" == "json" (
- %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can process the JSON files.
- goto end
-)
-
-if "%1" == "htmlhelp" (
- %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can run HTML Help Workshop with the ^
-.hhp project file in %BUILDDIR%/htmlhelp.
- goto end
-)
-
-if "%1" == "qthelp" (
- %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can run "qcollectiongenerator" with the ^
-.qhcp project file in %BUILDDIR%/qthelp, like this:
- echo.^> qcollectiongenerator %BUILDDIR%\qthelp\libbitcoin.qhcp
- echo.To view the help file:
- echo.^> assistant -collectionFile %BUILDDIR%\qthelp\libbitcoin.ghc
- goto end
-)
-
-if "%1" == "devhelp" (
- %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished.
- goto end
-)
-
-if "%1" == "epub" (
- %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The epub file is in %BUILDDIR%/epub.
- goto end
-)
-
-if "%1" == "latex" (
- %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
- goto end
-)
-
-if "%1" == "text" (
- %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The text files are in %BUILDDIR%/text.
- goto end
-)
-
-if "%1" == "man" (
- %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The manual pages are in %BUILDDIR%/man.
- goto end
-)
-
-if "%1" == "texinfo" (
- %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
- goto end
-)
-
-if "%1" == "gettext" (
- %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
- goto end
-)
-
-if "%1" == "changes" (
- %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
- if errorlevel 1 exit /b 1
- echo.
- echo.The overview file is in %BUILDDIR%/changes.
- goto end
-)
-
-if "%1" == "linkcheck" (
- %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
- if errorlevel 1 exit /b 1
- echo.
- echo.Link check complete; look for any errors in the above output ^
-or in %BUILDDIR%/linkcheck/output.txt.
- goto end
-)
-
-if "%1" == "doctest" (
- %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
- if errorlevel 1 exit /b 1
- echo.
- echo.Testing of doctests in the sources finished, look at the ^
-results in %BUILDDIR%/doctest/output.txt.
- goto end
-)
-
-:end
diff --git a/doc/sphinx/network.rst b/doc/sphinx/network.rst
deleted file mode 100644
index ce7803f..0000000
--- a/doc/sphinx/network.rst
+++ /dev/null
@@ -1,566 +0,0 @@
-.. _tut-network:
-
-****************
-Network Protocol
-****************
-
-The Bitcoin protocol was defined by the software released by Satoshi.
-But as Satoshi left the project and the ecosystem began to diversify,
-the BIP process was created to document and reach consensus on protocol
-changes.
-
-`BIP 14 <https://en.bitcoin.it/wiki/BIP_0014>`_ adds a user agent field
-to version handshake messages in the Bitcoin protocol. The format of the
-user agent field is::
-
- /Name:Version/Name:Version/.../
-
-Reading the user agent fields from Bitcoin nodes is a useful way to gather
-information about clients such as their version or the codebase they are using.
-By reading user agents from the network we can gather statistics about the
-general health of the Bitcoin network.
-
-Simple Network Application
-==========================
-
-Inside :ref:`examples/accept.cpp <examples_accept>` is a simple program that
-waits for a connection and displays that node's user agent field.
-::
-
- $ cd examples/
- $ make
- $ ./accept
-
-The daemon will be running on localhost and accepting connections from port
-8333 (the standard Bitcoin network port).
-
-The :class:`network` service offers an interface for connecting to remote
-nodes. Calling :func:`network::connect` will attempt to establish a connection
-calling the handler once the operation is complete.
-::
-
- threadpool pool(1);
- network net(pool);
- net.connect("localhost", 8333, connect_started);
-
-The completion handler is called once the connection is established.
-The :class:`channel_ptr` is our connection to the node, at which point
-we can begin sending.
-::
-
- void connect_started(const std::error_code& ec, channel_ptr node);
-
-During the first stage of a connection between 2 nodes, they will swap
-version messages and version acknowledgement messages. This is the
-initialization handshake in the Bitcoin protocol. Before anything happens,
-the handshake protocol should be completed.
-
-We define a version message with several fields filled in. The interesting line
-is where we set the user agent. Anything is possible in this field, but
-`BIP 14 <https://en.bitcoin.it/wiki/BIP_0014>`_ specifies a specific format
-for this field.
-::
-
- // Create our version message we want to send.
- // Fill in a bunch of fields.
- version_type version;
- version.version = 60000;
- version.services = 1;
- version.address_me.services = version.services;
- version.address_me.ip =
- ip_address_type{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x01};
- version.address_me.port = 8333;
- version.address_you.services = version.services;
- version.address_you.ip =
- ip_address_type{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x01};
- version.address_you.port = 8333;
- // Set the user agent.
- version.user_agent = "/libbitcoin/connect-test/";
- version.start_height = 0;
- version.nonce = rand();
-
-We then send the message by calling :func:`channel::send` on the
-:class:`channel_ptr` object.
-::
-
- // Begin the send.
- // Calls version_sent callback when complete.
- node->send(version, std::bind(version_sent, _1, node));
-
-See :ref:`examples_connect` for the full source code.
-
-Accept Connections
-------------------
-
-To accept connections, we begin a listen operation which returns an
-:class:`acceptor_ptr`. Then we call :func:`acceptor::accept` which calls
-our provided callback when a new connection is made to our node.
-::
-
- net.listen(8333, listening_started);
-
-::
-
- void listening_started(const std::error_code& ec, acceptor_ptr accept)
- {
- // ...
- // Accept first connection.
- accept->accept(accepted_connection);
- }
-
- void accepted_connection(const std::error_code& ec, channel_ptr node)
- {
- // ...
- }
-
-This initiates the accept, but once a connection is established, the
-:class:`acceptor` stops. We therefore need to call :func:`acceptor::accept`
-to keep listening for new connections.
-
-We pass the :class:`acceptor_ptr` by binding it as an argument to the callback
-for when a new connection is accepted.
-::
-
- void listening_started(const std::error_code& ec, acceptor_ptr accept)
- {
- // ...
- // Accept first connection.
- accept->accept(
- std::bind(accepted_connection, _1, _2, accept));
- }
-
- void accepted_connection(const std::error_code& ec, channel_ptr node,
- acceptor_ptr accept)
- {
- // ...
- log_info() << "Accepted connection!";
- // Keep accepting more connections.
- accept->accept(
- std::bind(accepted_connection, _1, _2, accept));
- }
-
-We want to be notified of version messages from the host and display the
-user agent.
-
-.. cpp:function:: void channel::subscribe_version(receive_version_handler handle_receive)
-
- Subscribe to version messages from the node. Unsubscribes when the message
- is received. To stay subscribed, call this method again inside the
- receiving handler.
- ::
-
- void handle_receive(
- const std::error_code& ec, // Status of operation
- const version_type& tx // Version message
- );
-
-We use this method to receive a single version message, and print the
-user agent field.
-::
-
- void accepted_connection(const std::error_code& ec, channel_ptr node,
- acceptor_ptr accept)
- {
- if (ec)
- {
- log_error() << "Accept: " << ec.message();
- return;
- }
- log_info() << "Accepted connection!";
- // Now we need to keep it alive otherwise the connection is closed.
- node->subscribe_version(
- std::bind(version_received, _1, _2, node));
- // Keep accepting more connections.
- accept->accept(
- std::bind(accepted_connection, _1, _2, accept));
- }
-
- void version_received(const std::error_code& ec, const version_type& version,
- channel_ptr node)
- {
- // error::service_stopped means the connection was closed.
- if (ec == error::service_stopped)
- return;
- else if (ec)
- {
- log_error() << "Version message: " << ec.message();
- return;
- }
- log_info() << "User agent: " << version.user_agent;
- }
-
-See :ref:`examples_connect` for the full source code.
-
-handshake Service
------------------
-
-Before a node will respond to your traffic, you must complete the version
-handshake which is swapping a verack (version acknowledgement) with their
-version, and giving a version and getting a verack in response.
-
-We can do this ourselves, but then there are other tasks like fetching our
-IP address (which is done from a few websites). We can only speculate why
-Satoshi decided to require such a strange task. libbitcoin stays faithful
-to the Bitcoin protocol by Satoshi and conforms to this requirement.
-
-For this libbitcoin provides a :class:`handshake` service which performs
-the composed operation of doing the initial handshake.
-
-If you're not interested in the process of creating your own network
-connection channel and then calling the :class:`handshake` service, then
-use the :ref:`composed operation<composed_operations>` :func:`connect`.
-
-Network Services
-================
-
-Here is a list of the network-related services present in ``<bitcoin/network/*.hpp>``.
-
-* :class:`channel`: a basic communication channel to a node. Allows you to
- send and receive messages from Bitcoin nodes (see
- ``<bitcoin/primitives.hpp>``).
-* :class:`acceptor`: allows you to accept inbound connections from other nodes.
-* :class:`network`: creates connections and spawns :class:`acceptor` instances.
-* :class:`handshake`: handles the initialization handshake.
-* :class:`hosts`: stores a list of all nodes and allows random fetches from that list.
-* :class:`protocol`: handles the node discovery mechanism, negotiation
- through the protocol and managing a consistent number of connections.
-
-:class:`protocol` is the class most developers will use to create a bunch of
-connections to the network and manage them.
-
-.. cpp:function:: void protocol::subscribe_channel(channel_handler handle_channel)
-
- Subscribe to new connections established to other nodes.
- This method must be called again to stay subscribed as
- handlers are deregistered after being called.
-
- When this protocol service is stopped, any subscribed handlers
- will be called with the :class:`std::error_code` set to
- :class:`error::service_stopped`.
- ::
-
- void handle_channel(
- const std::error_code& ec, // Status of operation
- channel_ptr node // Communication channel to new node
- );
-
-.. cpp:function:: void protocol::fetch_connection_count(fetch_connection_count_handler handle_fetch)
-
- Fetch the number of connections we have to the network.
- ::
-
- void handle_fetch(
- const std::error_code& ec, // Status of operation
- size_t connection_count
- );
-
-.. cpp:function:: void protocol::broadcast<Message>(const Message& packet)
-
- Broadcast packet to all our connected nodes.
-
-.. _tut-protocol:
-
-Join the Peer To Peer Network
-=============================
-
-We start with a simple program which connects to random Bitcoin nodes in
-the network. It displays the connection count every second.
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- // We don't have a database open, and aren't doing any critical file
- // operations so we aren't worried about exiting suddenly.
- void check_error(const std::error_code& ec)
- {
- if (!ec)
- return;
- log_fatal() << ec.message();
- exit(-1);
- }
-
- void handle_start(const std::error_code& ec)
- {
- check_error(ec);
- log_debug() << "Started.";
- }
-
- void display_number_of_connections(
- const std::error_code& ec, size_t connection_count)
- {
- check_error(ec);
- log_debug() << connection_count << " CONNECTIONS";
- }
-
- // Needed for the C callback capturing the signals.
- bool stopped = false;
- void signal_handler(int sig)
- {
- log_info() << "Caught signal: " << sig;
- stopped = true;
- }
-
- int main()
- {
- threadpool pool(1);
- // Create dependencies for our protocol object.
- hosts hst(pool);
- handshake hs(pool);
- network net(pool);
- // protocol service.
- protocol prot(pool, hst, hs, net);
- // Perform node discovery if needed and then creating connections.
- prot.start(handle_start);
- // Catch C signals for stopping the program.
- signal(SIGABRT, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
- while (!stopped)
- {
- prot.fetch_connection_count(display_number_of_connections);
- sleep(1);
- }
- // Safely close down.
- pool.stop();
- pool.join();
- return 0;
- }
-
-For notifications about new connections, :func:`protocol::subscribe_channel`
-calls a given notification handler when a new channel becomes available.
-::
-
- // ...
- prot.start(handle_start);
- // Notify us of new connections.
- // We can subscribe to protocol at any time after start() is called.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot)));
-
-We pass the :class:`protocol` service in by reference and resubscribe.
-:func:`connection_started` is *continuously* notified of new
-communication channels when they are opened.
-::
-
- void connection_started(channel_ptr node, protocol& prot)
- {
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- log_info() << "Connection established.";
- // Resubscribe to new nodes.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot)));
- }
-
-See :ref:`examples_proto` for the full source code.
-
-Transaction Radar
------------------
-
-Transactions can be traced throughout the network by maintaining nodes
-with high connectivity. This is how a *transaction radar* works.
-It monitors 100 nodes and gives a % propagation for a transaction
-depending on how many of those nodes report back a particular transaction.
-When 100 nodes have reported the transaction, the radar says it is propagated 100%.
-This can also be used to triangulate the origin of new transactions.
-
-We will implement a simple version which keeps track of transaction hashes
-and their relay count (the number of notifications for this transaction).
-Old items will be cleaned out once their timestamp expires. We have a method
-to display.
-::
-
- // Watches transactions. Keeps a view count per seen tx hash, and
- // cleans up old expired tx hashes.
- class tx_watch
- : public async_strand
- {
- public:
- tx_watch(threadpool& pool, time_t timeout=200);
-
- // Push a seen tx hash. If this entry exists then the count
- // will be incremented.
- // Else create a new entry in our list.
- void push(const hash_digest& tx_hash);
- // Cleans up expired items. We could make this implicitly called
- // by push() or display(), but single use methods with no side-effects
- // is better code design.
- void cleanup();
- // Display transactions and their count. A better design would be to
- // separate the view from the model and instead provide a method which
- // fetches a copy of our list, but we keep it simple here.
- void display();
-
- private:
- struct entry_count
- {
- hash_digest tx_hash;
- size_t count;
- // Timestamp of when transaction hash was first seen.
- time_t timest;
- };
-
- typedef std::vector<entry_count> entry_list;
-
- // The public methods push these methods to the threadpool to be
- // executed and then return immediately.
- // async_strand::queue() is a helper method which posts the work
- // to the threadpool and serializes access.
- // No 2 operations posted through the same async_strand using queue()
- // will execute at the same time.
- void do_push(const hash_digest& tx_hash);
- void do_cleanup();
- void do_display();
-
- entry_list entries_;
- // Time until an entry is ready to be removed.
- time_t timeout_;
- };
-
-The implementation for this class is standard C++. We try to find the
-relevant entry when :func:`push` is called, otherwise we create a new one.
-:func:`cleanup` looks for expired items and erases them. :func:`display`
-orders the entry table and displays the top 20 items.
-
-Note the usage of :class:`async_strand` which depends on :class:`threadpool`.
-It provides a :func:`async_strand::queue` method which executes callbacks
-asynchronously. Callbacks called in the same :class:`async_strand` will
-**not** execute in parallel. In this way race conditions are avoided around
-shared class members without the use of locks. If an :class:`async_strand`
-is busy then the :class:`threadpool` will simply execute another operation
-that doesn't conflict.
-::
-
- tx_watch::tx_watch(threadpool& pool, time_t timeout)
- : async_strand(pool), timeout_(timeout)
- {
- }
-
- void tx_watch::push(const hash_digest& tx_hash)
- {
- queue(std::bind(&tx_watch::do_push, this, tx_hash));
- // Returns immediately.
- }
- void tx_watch::do_push(const hash_digest& tx_hash)
- {
- // If tx_hash is found then increment count...
- bool is_found = false;
- for (entry_count& entry: entries_)
- if (entry.tx_hash == tx_hash)
- {
- ++entry.count;
- is_found = true;
- }
- // Else create a new entry with a count of 1.
- if (!is_found)
- entries_.push_back({tx_hash, 1, time(nullptr)});
- }
-
- void tx_watch::cleanup()
- {
- queue(std::bind(&tx_watch::do_cleanup, this));
- }
- void tx_watch::do_cleanup()
- {
- // Erase entries where timest is older than (now - timeout_) seconds.
- time_t current_time = time(nullptr);
- auto erase_pred =
- [&](const entry_count& entry)
- {
- return (current_time - entry.timest) > timeout_;
- };
- auto erase_begin =
- std::remove_if(entries_.begin(), entries_.end(), erase_pred);
- // If we have old entries to delete then erase them.
- if (erase_begin != entries_.end())
- entries_.erase(erase_begin);
- }
-
- void tx_watch::display()
- {
- queue(std::bind(&tx_watch::do_display, this));
- }
- void tx_watch::do_display()
- {
- // Sort entries by count. Highest numbers at the top.
- std::sort(entries_.begin(), entries_.end(),
- [](const entry_count& entry_a, const entry_count& entry_b)
- {
- return entry_a.count > entry_b.count;
- });
- // Display the first 20 entries.
- for (size_t i = 0; i < 20 && i < entries_.size(); ++i)
- {
- const entry_count& entry = entries_[i];
- log_info() << entry.tx_hash << " " << entry.count;
- }
- }
-
-We now tie this in with our code above. When a new connection is started,
-we subscribe to inventory packets originating from that node. For every
-inventory packet sent by that node, we read off the transaction hashes and
-add it to our :class:`tx_watch` object.
-::
-
- void connection_started(channel_ptr node, protocol& prot, tx_watch& watch);
- void inventory_received(const std::error_code& ec, const inventory_type& inv,
- channel_ptr node, tx_watch& watch);
-
- void connection_started(channel_ptr node, protocol& prot, tx_watch& watch)
- {
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- log_info() << "Connection established.";
- // Subscribe to inventory packets.
- node->subscribe_inventory(
- std::bind(inventory_received, _1, _2, node, std::ref(watch)));
- // Resubscribe to new nodes.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot), std::ref(watch)));
- }
-
- void inventory_received(const std::error_code& ec, const inventory_type& inv,
- channel_ptr node, tx_watch& watch)
- {
- check_error(ec);
- // Loop through inventory hashes.
- for (const inventory_vector_type& ivec: inv.inventories)
- {
- // We're only interested in transactions. Discard everything else.
- if (ivec.type != inventory_type_id::transaction)
- continue;
- watch.push(ivec.hash);
- }
- // Resubscribe to inventory packets.
- node->subscribe_inventory(
- std::bind(inventory_received, _1, _2, node, std::ref(watch)));
- }
-
-In the main runloop, we display the transaction radar table periodically.
-::
-
- // Our table tracking transaction counts.
- tx_watch watch(pool, 200);
- // Notify us of new connections.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot), std::ref(watch)));
- // ...
- while (!stopped)
- {
- watch.cleanup();
- watch.display();
- sleep(10);
- }
-
-See :ref:`examples_txrad` for the full source code.
-
diff --git a/doc/sphinx/offlinetx.rst b/doc/sphinx/offlinetx.rst
deleted file mode 100644
index 37e10e2..0000000
--- a/doc/sphinx/offlinetx.rst
+++ /dev/null
@@ -1,27 +0,0 @@
-.. _tut-offlinetx:
-
-********************
-Offline Transactions
-********************
-
-Building The Transaction
-========================
-
-Examining A Transaction
------------------------
-
-Script
-------
-
-Serializing Transaction
------------------------
-
-Broadcasting Signed Transaction
-===============================
-
-Deserializing Raw Data
-----------------------
-
-Connect, Wait And Broadcast
----------------------------
-
diff --git a/doc/sphinx/overview.rst b/doc/sphinx/overview.rst
deleted file mode 100644
index 98b7711..0000000
--- a/doc/sphinx/overview.rst
+++ /dev/null
@@ -1,361 +0,0 @@
-.. _tut-overview:
-
-********
-Overview
-********
-
-Rationale
-=========
-
-As libbitcoin is an asynchronous *toolkit*, there is no one way of developing
-programs - it is up to the individual author. Different approaches are better
-for different situations.
-
-Core Concepts and Functionality
-===============================
-
-Basic libbitcoin Anatomy
-------------------------
-
-Before using libbitcoin it may be useful to get a conceptual picture of the
-various parts of libbitcoin, your program, and how they work together.
-
-libbitcoin is centered around various components that provide critical
-infrastructure for bitcoin functionality. These components are called
-*services*. Services run inside their own thread contexts and can exist in
-multiple threads. Interacting with a service is done through their interface.
-
-Services implement thread-safe interfaces as a strict rule. Tasks are submitted
-to services and upon completion, your program will be notified. Services are
-self contained units and are locally encapsulated. They implement an interface
-for which various implementations may exist- the blockchain service has an
-implementation for `LevelDB <http://code.google.com/p/leveldb/>`_.
-
-There are two basic service actions in libbitcoin:
-
-* **Operation**. Perform operation. Notified upon completion.
-* **Subscribe**. Subscribe to possible event. Notified upon event.
-
-All methods on services return immediately.
-
-Broadly speaking the main services in libbitcoin can be divided down three
-lines into network, blockchain and supporting services.
-
-Network services
-^^^^^^^^^^^^^^^^
-
-these services are concerned with the network side of things.
-
-* :class:`channel`
-* :class:`network`
-* :class:`protocol`
-* :class:`hosts`
-* :class:`handshake`
-
-Blockchain services
-^^^^^^^^^^^^^^^^^^^
-
-Bitcoin's blockchain is usually disk oriented. Backends all implement the
-:class:`blockchain` interface allowing programs to utilise backends using the same code.
-
-* :class:`blockchain` (abstract interface for blockchain backends)
-* :class:`bdb_blockchain`
-* :class:`leveldb_blockchain`
-
-Supporting services
-^^^^^^^^^^^^^^^^^^^
-
-These services utilise other services and provide additional functionality.
-They can be thought of as wrapper services composed of other services.
-
-* :class:`poller`
-* :class:`transaction_pool`
-* :class:`session`
-
-Threadpools and Services
-------------------------
-
-Theory
-^^^^^^
-
-When calling a method on a service to initiate an action, your program is
-submitting a piece of work to that service’s proactor engine to complete.
-Once the program is ready, it will take that piece of work from the queue,
-complete it and then call the completion handler passed to it.
-
-.. image:: img/operations.png
-
-This program calls send on the :class:`network` service passing a data
-type to be sent, and a completion handler. The send function call returns
-immediately and the program continues on.
-
-The task gets submitted to the service. Once the
-service is ready and has completed its previous tasks,
-it awakens and grabs the latest piece of work from the queue (send object).
-
-The :class:`network` service sends the packet to the bitcoin network asynchronously.
-Upon completion it calls the completion handler passed to it, and fetches the
-next piece of work to complete. The program continues on from where it left off.
-
-Note that this service can exist in multiple threads, and it may be
-performing another piece of work while doing this send. Scalability is resolved
-in this way by having services able to run with any defined number of threads
-using a :class:`threadpool` object.
-
-Practice
-^^^^^^^^
-
-Services are objects inside libbitcoin that perform asynchronous operations
-like doing a long disk operation or calling other services. Their constructor
-accepts a :class:`threadpool` object.
-
-Work that is submitted to the services is added to that :class:`threadpool`,
-and will be queued in that context.
-
-::
-
- // Define 2 threadpools with 6 threads in total.
- // disk_pool has 4 threads, and net_pool has 2.
- // Operations submitted to net_pool will only run in those 2 threads
- // spawned by net_pool.
- threadpool disk_pool(4), net_pool(2);
- // This blockchain service will submit work to disk_pool
- blockchain chain(disk_pool);
- // Completion handler.
- auto blockchain_started = [](
- const std::error_code&)
- {
- // Check whether the status was successful.
- if (ec)
- log_error() << "Starting blockchain: " << ec.message();
- // ... do stuff
- };
- // Invoke the call. Returns immediately.
- chain.start("database/", blockchain_started);
-
-Data Types
-----------
-
-These core types are used around the library in multiple places where
-working with hashes or raw data chunks.
-
-.. cpp:type:: data_chunk
-
- Raw bytes. A chunk of data. This type is equivalent to
- ``std::vector<uint8_t>``.
-
-.. cpp:type:: hash_digest
-
- 32 byte result of a SHA256 hash. Same type as ``std::array<uint8_t, 32>``.
-
-.. cpp:type:: short_hash
-
- 20 byte result of a RIPEMD hash. Typically used for decoded
- Bitcoin addresses (RIPEMD hash of public key). Same as
- ``std::array<uint8_t, 20>``.
-
-Additionally helper functions exist for working with these types.
-
-.. cpp:function:: void extend_data<D, T>(D& chunk, const T& other)
-
- Insert *other* at the end of *chunk*.
-
-.. cpp:function:: T cast_chunk<T>(data_chunk chunk, bool reverse=false)
-.. cpp:function:: data_chunk uncast_type<T>(T value, bool reverse=false)
-
- Convert chunk to and from different integer types. i.e
- ``cast_chunk<uint32_t>(chunk)`` converts *chunk* into a 4 byte
- integer. Assumes ``chunk.size() >= 4`` bytes.
-
-.. cpp:function:: std::string encode_hex<T>(T data)
-
- Encode *data* into a hex string.
- ::
-
- hash_digest block_hash = hash_block_header(genesis_block());
- // Displays 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
- std::cout << encode_hex(block_hash) << std::endl;
-
-.. cpp:function:: data_chunk decode_hex(std::string byte_stream)
-
- Decode hex string into raw data.
-
-.. cpp:function:: HashType decode_hex_digest<HashType>(std::string byte_stream)
-
- Decode hex string into a hash type (either :type:`hash_digest` or
- :type:`short_hash`).
-
-Logging
--------
-
-libbitcoin internally uses its own logging system. There are five
-:class:`log_level`.
-::
-
- log_debug() << "Internal debug output.";
- log_info() << "Info to user.";
- log_warning() << "Warnings.";
- log_error() << "Errors.";
- log_fatal() << "Fatal errors.";
-
-The log output can be redirected for a :class:`log_level` using
-:func:`log_X::set_output_function`. The output function follows this
-format::
-
- void output(log_level level, const std::string& domain,
- const std::string& body);
-
-By defining a custom function and using :func:`std::bind`, we can send
-output of a certain :class:`log_level` to a file.
-See :ref:`examples_fullnode` for a demonstration.
-::
-
- std::ofstream outfile("debug.log");
- log_debug().set_output_function(
- std::bind(output_to_file, std::ref(outfile), _1, _2, _3));
-
-:func:`log_X` functions optionally take a ``domain`` argument. This specifies
-the context where the message originates from.
-::
-
- #define LOG_NETWORK "network"
-
- ...
-
- log_debug(LOG_NETWORK) << "Forcing disconnect due to timeout.";
-
-std::error_code
----------------
-
-libbitcoin generally does not use exceptions, instead relying on
-:class:`std::error_code` objects. Objects of this type hold an error code value.
-::
-
- #include <bitcoin/bitcoin.hpp>
- #include <iostream>
-
- int main()
- {
- // error_code without a value.
- std::error_code ec;
- if (!ec)
- std::cout << "std::error_code is not set." << std::endl;
- // Now set a value.
- ec = bc::error::operation_failed;
- if (ec)
- std::cout << "std::error_code value: " << ec.message() << std::endl;
- return 0;
- }
-
-Output::
-
- std::error_code is not set.
- std::error_code value: Operation failed
-
-std::bind
----------
-
-:func:`std::bind` is for `partial function application <http://en.wikipedia.org/wiki/Partial_application>`_.
-
-Suppose you have a function object f which takes 3 arguments::
-
- f(a, b, c)
-
-You want a new function object which only takes two arguments, defined as::
-
- g(a, b) = f(a, 4, b)
-
-``g`` is a "partial application" of the function ``f``: the middle argument has already
-been specified, and there are two left to go.
-
-You can use ``std::bind`` to get ``g``::
-
- auto g = std::bind(f, _1, 4, _2);
-
-This enables libbitcoin methods that expect one function type to be mapped
-to different methods that expect different or additional arguments.
-:func:`std::bind` allows data to be bound to a function only for the duration of
-that function object.
-::
-
- #include <functional>
- #include <iostream>
-
- using std::placeholders::_1;
-
- int add(int x, int y)
- {
- return x + y;
- }
-
- int main()
- {
- // add is a function that takes two integers and returns their sum.
- // add5 is defined as a functor of one argument, denoted _1, that calls
- // add on its argument with the constant 5 as the first argument.
- auto add5 = std::bind(add, 5, _1);
- std::cout << add5(2) << std::endl;
- return 0;
- }
-
-To bind class methods, pass the class pointer in as the second argument::
-
- std::bind(&my_class::foo, this, _1, _2, "somedata", _3);
-
-If you want to keep the object alive until the end of the function object,
-then pass an :class:`std::shared_ptr` instead. You can use :func:`shared_from_this`
-to return an object's :class:`std::shared_ptr` if needed. See
-`here <http://en.cppreference.com/w/cpp/memory/enable_shared_from_this>`_ for
-info on :class:`std::enable_shared_from_this`.
-
-The equivalent using C++ lambdas of above would be::
-
- auto add5 = [](int y)
- {
- return add(5, y);
- };
-
- // If using shared_from_this() then use the line below and
- // pass in this_ptr instead of this.
- // auto this_ptr = shared_from_this();
- // And use this_ptr->foo(...) instead.
- auto bar = [this](int x, data_chunk d, int y)
- {
- return foo(x, d, "somedata", y);
- };
-
-std::promise and std::future
-----------------------------
-
-The class :class:`std::promise` provides a facility to store a value that is
-later acquired asynchronously via a :class:`std::future` object, that the
-:class:`std::promise` can supply.
-
-:class:`std::promise` and :class:`std::future` enable you to turn asynchronous methods
-into synchronous ones. libbitcoin makes extensive use of completion handlers
-to signal the result of a method invocation. Combining these classes enables
-you to block in the same thread of control until the result is returned.
-::
-
- std::promise<std::error_code> ec_promise;
- // Completion handler called when blockchain is started.
- auto blockchain_started_handler =
- [&ec_promise](const std::error_code& ec)
- {
- ec_promise.set_value(ec);
- };
- chain.start("database", blockchain_started_handler);
- // Block until ec_promise value is set in the handler.
- std::error_code ec = ec_promise.get_future().get();
- if (ec)
- std::cerr << "Error starting blockchain: " << ec.message() << std::endl;
-
-A promise is a vehicle for passing the return value from the thread executing
-a function to the thread that cashes in on the function future.
-
-A future is the synchronization object constructed around the receiving end of
-the promise channel.
-
-So, if you want to use a future, you end up with a promise that you use to get
-the result of the asynchronous processing.
-
diff --git a/doc/sphinx/quickstart.rst b/doc/sphinx/quickstart.rst
deleted file mode 100644
index 1c422ba..0000000
--- a/doc/sphinx/quickstart.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. _tut-quickstart:
-
-**********
-Quickstart
-**********
-
-::
-
- #include <bitcoin/bitcoin.hpp>
- using namespace bc;
-
- int main()
- {
- block_type blk = genesis_block();
- std::cout << encode_hex(hash_block_header(blk.header)) << std::endl;
- return 0;
- }
-
-::
-
- $ g++ -o test main.cpp $(pkg-config --cflags --libs libbitcoin)
- $ ./test
- 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
-
diff --git a/doc/style b/doc/style
deleted file mode 100644
index bf90615..0000000
--- a/doc/style
+++ /dev/null
@@ -1,75 +0,0 @@
-Max of 80 characters. 4 space indents.
-
-Variables, functions, class-names, enums, typedefs are lowercase. Macros are uppercase. Private class member variables are suffixed with an _
-
-Each line should be indented by either 1 or 2 levels on the next line, and 1 line for each successive indent.
-
-If you're going more than 3 levels deep with each new line of code, then generally you are doing something wrong and code should be siphoned off into functions. Always prefer: flat over nested, dumb over clever, slow+clear over fast+obtuse.
-
-Functions should never be defined in headers. Always in the implementation unless it's required to be in every translation unit (i.e template or constexpr functions).
-
-Format for header file:
-
- #ifndef LIBBITCOIN_FOO_H
- #define LIBBITCOIN_FOO_H
-
- // system includes
-
- // bitcoin includes
-
- namespace libbitcoin {
-
- class foo
- : public blaa
- {
- public:
- // typedefs
-
- // functions logically grouped into blocks
-
- // variables
-
- private:
- // same as for public block
- };
-
- } // libbitcoin
-
- #endif
-
-Format for cpp file:
-
- #include <bitcoin/foo.hpp>
-
- // system includes
-
- // bitcoin includes
-
- namespace libbitcon {
-
- } // libbitcoin
-
-
-Every { occupies a newline except for namespaces.
-
-Spaces between all operators: x = 5 * 8 + 4 * 2 ... If the order is confusing then use brackets: x = (5 * 8) + (4 * 2). Each : ; (in for loops) or , has a space after them.
-
-All flow control should always happen on new lines.
-
- // Bad
- if (blaa) do_foo();
-
- // Good
- if (blaa)
- do_foo();
-
- // Bad
- something(); another_thing(); yadayada();
-
- // Good
- something();
- another_thing();
- yadayada();
-
-It's nice if function names read like a sentence when used: write_to_stream(data_packet); or say_hello_to(my_friend);
-
diff --git a/examples/Makefile b/examples/Makefile
deleted file mode 100644
index 0deb20f..0000000
--- a/examples/Makefile
+++ /dev/null
@@ -1,76 +0,0 @@
-CXXFLAGS=$(shell pkg-config --cflags libbitcoin) -ggdb
-LIBS=$(shell pkg-config --libs libbitcoin)
-
-default: all
-
-balance.o: balance.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-balance: balance.o
- $(CXX) -o $@ $< $(LIBS)
-
-txrad.o: txrad.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-txrad: txrad.o
- $(CXX) -o $@ $< $(LIBS)
-
-connect.o: connect.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-connect: connect.o
- $(CXX) -o $@ $< $(LIBS)
-
-accept.o: accept.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-accept: accept.o
- $(CXX) -o $@ $< $(LIBS)
-
-satoshiwords.o: satoshiwords.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-satoshiwords: satoshiwords.o
- $(CXX) -o $@ $< $(LIBS)
-
-initchain.o: initchain.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-initchain: initchain.o
- $(CXX) -o $@ $< $(LIBS)
-
-priv.o: priv.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-priv: priv.o
- $(CXX) -o $@ $< $(LIBS)
-
-fullnode.o: fullnode.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-fullnode: fullnode.o
- $(CXX) -o $@ $< $(LIBS)
-
-query-stealth.o: query-stealth.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-query-stealth: query-stealth.o
- $(CXX) -o $@ $< $(LIBS)
-
-display-last.o: display-last.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-display-last: display-last.o
- $(CXX) -o $@ $< $(LIBS)
-
-proto.o: proto.cpp
- $(CXX) -o $@ -c $< $(CXXFLAGS)
-
-proto: proto.o
- $(CXX) -o $@ $< $(LIBS)
-
-all: balance priv initchain fullnode display-last satoshiwords connect accept proto txrad query-stealth
-
-clean:
- rm -f accept balance connect determ display-last fullnode query-stealth initchain priv proto satoshiwords txrad
- rm -f *.o
diff --git a/examples/README b/examples/README
deleted file mode 100644
index 5c66c8e..0000000
--- a/examples/README
+++ /dev/null
@@ -1,10 +0,0 @@
-Run these commands to start the fullnode after installing libbitcoin:
-
- $ make
- $ mkdir blockchain
- $ ./initchain blockchain
- $ screen -S fullnode
- $ ./fullnode
- ... press CTRL-A, D
- $ ./blocks.sh
-
diff --git a/examples/accept.cpp b/examples/accept.cpp
deleted file mode 100644
index 69284a3..0000000
--- a/examples/accept.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-/*
- Accept connections from Bitcoin nodes on port 8333.
-*/
-#include <bitcoin/bitcoin.hpp>
-
-#ifdef _WIN32
-#include <iostream>
-#endif
-
-using namespace bc;
-
-using std::placeholders::_1;
-using std::placeholders::_2;
-
-// Listening has started.
-// Wait to accept a connection.
-void listening_started(const std::error_code& ec, acceptor_ptr accept);
-// Connection to another Bitcoin node has been established.
-// Wait for version message.
-void accepted_connection(const std::error_code& ec, channel_ptr node,
- acceptor_ptr accept);
-// Version message received.
-// Display the user agent.
-void version_received(const std::error_code& ec, const version_type& version,
- channel_ptr node);
-void node_stopped(const std::error_code& ec);
-
-void listening_started(const std::error_code& ec, acceptor_ptr accept)
-{
- if (ec)
- {
- log_error() << "Listen: " << ec.message();
- return;
- }
- // Accept first connection.
- accept->accept(
- std::bind(accepted_connection, _1, _2, accept));
-}
-
-void accepted_connection(const std::error_code& ec, channel_ptr node,
- acceptor_ptr accept)
-{
- if (ec)
- {
- log_error() << "Accept: " << ec.message();
- return;
- }
- log_info() << "Accepted connection!";
- node->subscribe_stop(node_stopped);
- // Now we need to keep it alive otherwise the connection is closed.
- node->subscribe_version(
- std::bind(version_received, _1, _2, node));
- // Keep accepting more connections.
- accept->accept(
- std::bind(accepted_connection, _1, _2, accept));
-}
-
-void version_received(const std::error_code& ec, const version_type& version,
- channel_ptr node)
-{
- // error::service_stopped means the connection was closed.
- if (ec == error::service_stopped)
- return;
- else if (ec)
- {
- log_error() << "Version message: " << ec.message();
- return;
- }
- log_info() << "User agent: " << version.user_agent;
-}
-
-void node_stopped(const std::error_code& ec)
-{
- if (ec == error::service_stopped)
- log_info() << "Connection closed.";
- else if (ec)
- log_error() << "Connection closed: " << ec.message();
-}
-
-int main()
-{
- threadpool pool(4);
- network net(pool);
- net.listen(8333, listening_started);
- std::cin.get();
- pool.stop();
- pool.join();
- return 0;
-}
-
diff --git a/examples/balance.cpp b/examples/balance.cpp
deleted file mode 100644
index 70e6502..0000000
--- a/examples/balance.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-blockchain* c = nullptr;
-std::string addr;
-
-void blockchain_started(const std::error_code& ec);
-void history_fetched(const std::error_code& ec,
- const blockchain::history_list& history);
-
-void blockchain_started(const std::error_code& ec)
-{
- if (ec)
- {
- log_error() << "Blockchain failed to start: " << ec.message();
- return;
- }
- log_info() << "Blockchain started.";
- payment_address payaddr;
- if (!payaddr.set_encoded(addr))
- {
- log_fatal() << "Invalid address";
- return;
- }
- c->fetch_history(payaddr, history_fetched);
-}
-
-void history_fetched(const std::error_code& ec,
- const blockchain::history_list& history)
-{
- if (ec)
- {
- log_error() << "Failed to fetch history: " << ec.message();
- return;
- }
-#define LOG_RESULT "result"
- uint64_t total_recv = 0, balance = 0;
- for (const auto& row: history)
- {
- uint64_t value = row.value;
- BITCOIN_ASSERT(value >= 0);
- total_recv += value;
- if (row.spend.hash == null_hash)
- balance += value;
- }
- log_debug(LOG_RESULT) << "Queried " << history.size()
- << " outpoints, values and their spends.";
- log_debug(LOG_RESULT) << "Total received: " << total_recv;
- log_debug(LOG_RESULT) << "Balance: " << balance;
- log_info(LOG_RESULT) << "History fetched";
-}
-
-int main(int argc, char** argv)
-{
- if (argc != 2)
- {
- log_info() << "Usage: balance ADDRESS";
- return -1;
- }
- addr = argv[1];
- threadpool pool(1);
- leveldb_blockchain chain(pool);
- c = &chain;
- chain.start("blockchain", blockchain_started);
- pool.shutdown();
- pool.join();
- chain.stop();
- return 0;
-}
-
diff --git a/examples/blocks.sh b/examples/blocks.sh
deleted file mode 100755
index ab3397e..0000000
--- a/examples/blocks.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
-#
-# This file is part of libbitcoin.
-#
-# libbitcoin is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License with
-# additional permissions to the one published by the Free Software
-# Foundation, either version 3 of the License, or (at your option)
-# any later version. For more information see LICENSE.
-#
-# 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/>.
-#
-watch -n 0.5 "grep Block debug.log | tail -n 20"
-
diff --git a/examples/connect.cpp b/examples/connect.cpp
deleted file mode 100644
index 649919b..0000000
--- a/examples/connect.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-/*
- Connect to a Bitcoin node on localhost, port 8333.
-*/
-#ifdef _MSC_VER
-#include <iostream>
-#endif
-
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-using std::placeholders::_1;
-
-// Connection is established.
-// Send version message to remote host.
-void connect_started(const std::error_code& ec, channel_ptr node);
-// Verson message finished sending.
-// Program completed.
-void version_sent(const std::error_code& ec, channel_ptr node);
-
-void connect_started(const std::error_code& ec, channel_ptr node)
-{
- if (ec)
- {
- log_error() << "Connect: " << ec.message();
- return;
- }
- // Create our version message we want to send.
- // Fill in a bunch of fields.
- version_type version;
- version.version = 60000;
- version.services = 1;
- version.address_me.services = version.services;
- version.address_me.ip =
- ip_address_type{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x01};
- version.address_me.port = 8333;
- version.address_you.services = version.services;
- version.address_you.ip =
- ip_address_type{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x01};
- version.address_you.port = 8333;
- // Set the user agent.
- version.user_agent = "/libbitcoin/connect-test/";
- version.start_height = 0;
- version.nonce = rand();
- // Begin the send.
- // Calls version_sent callback when complete.
- node->send(version, std::bind(version_sent, _1, node));
-}
-
-void version_sent(const std::error_code& ec, channel_ptr node)
-{
- if (ec)
- log_error() << "Sending version: " << ec.message();
- else
- log_info() << "Version sent.";
-}
-
-int main()
-{
- threadpool pool(1);
- network net(pool);
- net.connect("localhost", 8333, connect_started);
- std::cin.get();
- pool.stop();
- pool.join();
- return 0;
-}
-
diff --git a/examples/display-last.cpp b/examples/display-last.cpp
deleted file mode 100644
index f852bf3..0000000
--- a/examples/display-last.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-/*
- Display info from the last block in our blockchain at "./blockchain/"
-*/
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-blockchain* chain = nullptr;
-
-// Completion handler for when the blockchain has finished initializing.
-void blockchain_started(const std::error_code& ec);
-// Fetch the last block now that we have the height.
-void height_fetched(const std::error_code& ec, size_t last_height);
-// Result: print the block header.
-void display_block_header(const std::error_code& ec,
- const block_header_type& header);
-
-void blockchain_started(const std::error_code& ec)
-{
- // std::error_code's can be tested like bools, and
- // compared against specific error enums.
- // See <bitcoin/error.hpp> for a full list of them.
- if (ec)
- {
- log_error() << "Blockchain failed to start: " << ec.message();
- return;
- }
- // Blockchain has safely started.
- log_info() << "Blockchain started.";
- // chain should've been set inside main().
- assert(chain);
- // Begin fetching the last height number.
- chain->fetch_last_height(height_fetched);
-}
-
-void height_fetched(const std::error_code& ec, size_t last_height)
-{
- if (ec)
- {
- log_error() << "Failed to fetch last height: " << ec.message();
- return;
- }
- // Display the block number.
- log_info() << "height: " << last_height;
- assert(chain);
- // Begin fetching the block header.
- chain->fetch_block_header(last_height, display_block_header);
-}
-
-// This is not the full block, only the header.
-// For the full block use fetch_block() instead.
-void display_block_header(const std::error_code& ec,
- const block_header_type& header)
-{
- if (ec)
- {
- log_error() << "Failure fetching block header: " << ec.message();
- return;
- }
- // 32 byte std::array of uint8_t
- const hash_digest& blk_hash = hash_block_header(header);
- // Encode block hash into a pretty hex string.
- log_info() << "hash: " << encode_hex(blk_hash);
- // Display a few fields from the block header.
- // See <bitcoin/primitives.hpp> for the definition of block_type.
- log_info() << "version: " << header.version;
- // hash_digest can be used directly in log_info(),
- // implicity calling encode_hex() on the hash_digest.
- log_info() << "previous_block_hash: " << header.previous_block_hash;
- log_info() << "merkle: " << header.merkle;
- log_info() << "timestamp: " << header.timestamp;
- log_info() << "bits: " << header.bits;
- log_info() << "nonce: " << header.nonce;
- // A goodbye message.
- log_info() << "Finished.";
-}
-
-int main()
-{
- // Define a threadpool with 1 thread.
- threadpool pool(1);
- // Create a LevelDB blockchain.
- leveldb_blockchain ldb_chain(pool);
- // Initialize our global 'chain' pointer from above.
- chain = &ldb_chain;
- // Start the database using its implementation specific method.
- ldb_chain.start("blockchain", blockchain_started);
- // Don't wait after all current operations have completed.
- pool.shutdown();
- // Join them one by one.
- pool.join();
- // Finally stop the blockchain safely now everything has stopped.
- ldb_chain.stop();
- return 0;
-}
-
diff --git a/examples/fullnode.cpp b/examples/fullnode.cpp
deleted file mode 100644
index 5ddf225..0000000
--- a/examples/fullnode.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-/*
- Full node implementation. Expects the blockchain to be present in
- "./blockchain/" and initialized using ./initchain
-*/
-#include <future>
-#ifdef _MSC_VER
-#include <iostream>
-#endif
-
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-using std::placeholders::_1;
-using std::placeholders::_2;
-using std::placeholders::_3;
-
-void log_to_file(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
-{
- if (body.empty())
- return;
- file << level_repr(level);
- if (!domain.empty())
- file << " [" << domain << "]";
- file << ": " << body << std::endl;
-}
-void log_to_both(std::ostream& device, std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
-{
- if (body.empty())
- return;
- std::ostringstream output;
- output << level_repr(level);
- if (!domain.empty())
- output << " [" << domain << "]";
- output << ": " << body;
- device << output.str() << std::endl;
- file << output.str() << std::endl;
-}
-
-void output_file(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
-{
- log_to_file(file, level, domain, body);
-}
-void output_both(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
-{
- log_to_both(std::cout, file, level, domain, body);
-}
-
-void error_file(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
-{
- log_to_file(file, level, domain, body);
-}
-void error_both(std::ofstream& file, log_level level,
- const std::string& domain, const std::string& body)
-{
- log_to_both(std::cerr, file, level, domain, body);
-}
-
-class fullnode
-{
-public:
- fullnode();
- void start();
- // Should only be called from the main thread.
- // It's an error to join() a thread from inside it.
- void stop();
-
- blockchain& chain();
- transaction_indexer& indexer();
-
-private:
- void handle_start(const std::error_code& ec);
-
- // New connection has been started.
- // Subscribe to new transaction messages from the network.
- void connection_started(const std::error_code& ec, channel_ptr node);
- // New transaction message from the network.
- // Attempt to validate it by storing it in the transaction pool.
- void recv_tx(const std::error_code& ec,
- const transaction_type& tx, channel_ptr node);
- // Result of store operation in transaction pool.
- void new_unconfirm_valid_tx(
- const std::error_code& ec, const index_list& unconfirmed,
- const transaction_type& tx);
-
- // Threadpools
- threadpool net_pool_, disk_pool_, mem_pool_;
- // Services
- hosts hosts_;
- handshake handshake_;
- network network_;
- protocol protocol_;
- leveldb_blockchain chain_;
- poller poller_;
- transaction_pool txpool_;
- transaction_indexer txidx_;
- // Mac OSX needs the bc:: namespace qualifier to compile.
- // Other systems should be OK.
- bc::session session_;
-};
-
-fullnode::fullnode()
- // Threadpools and the number of threads they spawn.
- // 6 threads spawned in total.
- : net_pool_(1), disk_pool_(4), mem_pool_(1),
- // Networking related services.
- hosts_(net_pool_), handshake_(net_pool_), network_(net_pool_),
- protocol_(net_pool_, hosts_, handshake_, network_),
- // Blockchain database service.
- chain_(disk_pool_),
- // Poll new blocks, and transaction memory pool.
- poller_(mem_pool_, chain_), txpool_(mem_pool_, chain_), txidx_(mem_pool_),
- // Session manager service. Convenience wrapper.
- session_(net_pool_, {
- handshake_, protocol_, chain_, poller_, txpool_})
-{
-}
-
-void fullnode::start()
-{
- // Subscribe to new connections.
- protocol_.subscribe_channel(
- std::bind(&fullnode::connection_started, this, _1, _2));
- // Start blockchain. Must finish before any operations
- // are performed on the database (or they will fail).
- std::promise<std::error_code> ec_promise;
- auto blockchain_started =
- [&ec_promise](const std::error_code& ec)
- {
- ec_promise.set_value(ec);
- };
- chain_.start("blockchain", blockchain_started);
- std::error_code ec = ec_promise.get_future().get();
- if (ec)
- {
- log_error() << "Problem starting blockchain: " << ec.message();
- return;
- }
- // Start transaction pool
- txpool_.start();
- // Fire off app.
- auto handle_start =
- std::bind(&fullnode::handle_start, this, _1);
- session_.start(handle_start);
-}
-
-void fullnode::stop()
-{
- std::promise<std::error_code> ec_promise;
- auto session_stopped =
- [&ec_promise](const std::error_code& ec)
- {
- ec_promise.set_value(ec);
- };
- session_.stop(session_stopped);
- std::error_code ec = ec_promise.get_future().get();
- if (ec)
- log_error() << "Problem stopping session: " << ec.message();
-
- // Stop threadpools.
- net_pool_.stop();
- disk_pool_.stop();
- mem_pool_.stop();
- // Join threadpools. Wait for them to finish.
- net_pool_.join();
- disk_pool_.join();
- mem_pool_.join();
-
- // Safely close blockchain database.
- chain_.stop();
-}
-
-blockchain& fullnode::chain()
-{
- return chain_;
-}
-transaction_indexer& fullnode::indexer()
-{
- return txidx_;
-}
-
-void fullnode::handle_start(const std::error_code& ec)
-{
- if (ec)
- log_error() << "fullnode: " << ec.message();
-}
-
-void fullnode::connection_started(const std::error_code& ec, channel_ptr node)
-{
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- // Subscribe to transaction messages from this node.
- node->subscribe_transaction(
- std::bind(&fullnode::recv_tx, this, _1, _2, node));
- // Stay subscribed to new connections.
- protocol_.subscribe_channel(
- std::bind(&fullnode::connection_started, this, _1, _2));
-}
-
-void fullnode::recv_tx(const std::error_code& ec,
- const transaction_type& tx, channel_ptr node)
-{
- if (ec)
- {
- log_error() << "Receive transaction: " << ec.message();
- return;
- }
- auto handle_deindex = [](const std::error_code& ec)
- {
- if (ec)
- log_error() << "Deindex error: " << ec.message();
- };
- // Called when the transaction becomes confirmed in a block.
- auto handle_confirm = [this, tx, handle_deindex](
- const std::error_code& ec)
- {
- log_debug() << "handle_confirm ec = " << ec.message()
- << " " << hash_transaction(tx);
- if (ec)
- log_error() << "Confirm error ("
- << hash_transaction(tx) << "): " << ec.message();
- txidx_.deindex(tx, handle_deindex);
- };
- // Validate the transaction from the network.
- // Attempt to store in the transaction pool and check the result.
- txpool_.store(tx, handle_confirm,
- std::bind(&fullnode::new_unconfirm_valid_tx, this, _1, _2, tx));
- // Resubscribe to transaction messages from this node.
- node->subscribe_transaction(
- std::bind(&fullnode::recv_tx, this, _1, _2, node));
-}
-
-void fullnode::new_unconfirm_valid_tx(
- const std::error_code& ec, const index_list& unconfirmed,
- const transaction_type& tx)
-{
- auto handle_index = [](const std::error_code& ec)
- {
- if (ec)
- log_error() << "Index error: " << ec.message();
- };
- const hash_digest& tx_hash = hash_transaction(tx);
- if (ec)
- {
- log_warning()
- << "Error storing memory pool transaction "
- << tx_hash << ": " << ec.message();
- }
- else
- {
- auto l = log_debug();
- l << "Accepted transaction ";
- if (!unconfirmed.empty())
- {
- l << "(Unconfirmed inputs";
- for (auto idx: unconfirmed)
- l << " " << idx;
- l << ") ";
- }
- l << tx_hash;
- txidx_.index(tx, handle_index);
- }
-}
-
-void history_fetched(const std::error_code& ec,
- const blockchain::history_list& history)
-{
- if (ec)
- {
- log_error() << "Failed to fetch history: " << ec.message();
- return;
- }
- log_info() << "Query fine.";
- for (const auto& row: history)
- {
- log_info() << "output: " << row.output
- << " height: " << row.output_height;
- log_info() << "value: " << row.value;
- auto l = log_info();
- l << "spend: ";
- if (row.spend.hash == null_hash)
- l << "Unspent";
- else
- l << row.spend << " height: " << row.spend_height;
- }
-}
-
-int main()
-{
- std::ofstream outfile("debug.log"), errfile("error.log");
- log_debug().set_output_function(
- std::bind(output_file, std::ref(outfile), _1, _2, _3));
- log_info().set_output_function(
- std::bind(output_both, std::ref(outfile), _1, _2, _3));
- log_warning().set_output_function(
- std::bind(error_file, std::ref(errfile), _1, _2, _3));
- log_error().set_output_function(
- std::bind(error_both, std::ref(errfile), _1, _2, _3));
- log_fatal().set_output_function(
- std::bind(error_both, std::ref(errfile), _1, _2, _3));
-
- fullnode app;
- app.start();
- while (true)
- {
- std::string addr;
- std::getline(std::cin, addr);
- if (addr == "stop")
- break;
- payment_address payaddr;
- if (!payaddr.set_encoded(addr))
- {
- log_error() << "Skipping invalid Bitcoin address.";
- continue;
- }
- fetch_history(app.chain(), app.indexer(),
- payaddr, history_fetched);
- }
- app.stop();
-
- return 0;
-}
-
diff --git a/examples/initchain.cpp b/examples/initchain.cpp
deleted file mode 100644
index 3a7b453..0000000
--- a/examples/initchain.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
-Create a new leveldb blockchain database.
-*/
-#include <iostream>
-
-#ifndef LEVELDB_ENABLED
-
-int main()
-{
- std::cerr << "initchain: The feature is not supported in this build." << std::endl;
- return 1;
-}
-
-#else
-
-#include <future>
-#include <bitcoin/bitcoin.hpp>
-
-using namespace bc;
-
-void create_file(const std::string& filename, size_t filesize)
-{
- std::ofstream file(filename, std::ios::binary | std::ios::trunc);
- constexpr size_t chunk_size = 100000;
- std::vector<char> random_buffer(chunk_size);
- for (size_t i = 0; i < filesize; i += chunk_size)
- file.write(random_buffer.data(), chunk_size);
-}
-
-void initialize_new_stealth_database(const std::string& filename)
-{
- create_file(filename, 100000000);
- mmfile file(filename);
- auto serial = make_serializer(file.data());
- serial.write_4_bytes(1);
- // should last us a decade
- size_t max_header_rows = 10000;
- serial.write_4_bytes(max_header_rows);
- serial.write_4_bytes(0);
- for (size_t i = 0; i < max_header_rows; ++i)
- serial.write_4_bytes(0);
-}
-
-int main(int argc, char** argv)
-{
- if (argc != 2)
- {
- std::cerr << "initchain: No directory specified." << std::endl;
- return 1;
- }
- const std::string dbpath = argv[1];
- // Create custom databases first.
- initialize_new_stealth_database(dbpath + "/stealth.db");
- // Threadpool context containing 1 thread.
- threadpool pool(1);
- // leveldb_blockchain operations execute in pool's thread.
- leveldb_blockchain chain(pool);
- // Completion handler for starting the leveldb_blockchain.
- // Does nothing.
- auto blockchain_start = [](const std::error_code& ec) {};
- // Start blockchain with a database path.
- chain.start(dbpath, blockchain_start);
- // First block is the genesis block.
- block_type first_block = genesis_block();
- std::promise<std::error_code> ec_promise;
- // Completion handler for import method.
- auto import_finished =
- [&ec_promise](const std::error_code& ec)
- {
- ec_promise.set_value(ec);
- };
- // Import the genesis block at height 0.
- // Doesn't validate or perform checks on the block.
- chain.import(first_block, 0, import_finished);
- // Wait until std::error_code is set by
- // import_finished completion handler.
- std::error_code ec = ec_promise.get_future().get();
- if (ec)
- {
- log_error() << "Importing genesis block failed: " << ec.message();
- return -1;
- }
- log_info() << "Imported genesis block "
- << hash_block_header(first_block.header);
- // All threadpools stopping in parallel...
- pool.stop();
- // ... Make them all join main thread and wait until they finish.
- pool.join();
- // Now safely close leveldb_blockchain.
- chain.stop();
- return 0;
-}
-
-#endif
diff --git a/examples/priv.cpp b/examples/priv.cpp
deleted file mode 100644
index 61cf55c..0000000
--- a/examples/priv.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-/*
- Demonstration of private keys.
-*/
-#include <iostream>
-#include <sstream>
-
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-void display_help()
-{
- puts("Usage: priv [COMMAND] [ARGS]...");
- puts("");
- puts("The priv commands are:");
- puts(" new\t\tGenerate a new private key and output to STDOUT");
- puts(" sign\t\tSign the next argument using the private key in STDIN");
- puts(" verify\tVerify the next argument using the private key in STDIN");
- puts(" address\tshow the associated bitcoin address");
-}
-
-void error_exit(const char* message, int status=1)
-{
- std::cerr << "priv: " << message << std::endl;
- exit(status);
-}
-
-int new_keypair()
-{
- elliptic_curve_key ec;
- if (!ec.new_keypair())
- error_exit("could not create new key pair");
- secret_parameter raw_private_key = ec.secret();
- std::cout << std::string(raw_private_key.begin(), raw_private_key.end());
- return 0;
-}
-
-int sign(const std::string input_data, const std::string raw_private_key)
-{
- hash_digest digest = decode_hex_digest<hash_digest>(input_data);
- hash_digest privkey = decode_hex_digest<hash_digest>(raw_private_key);
- elliptic_curve_key ec;
- if (!ec.set_secret(privkey))
- error_exit("bad private key");
- log_info() << encode_hex(ec.sign(digest));
- return 0;
-}
-
-int verify(const std::string input_data, const std::string& signature_data,
- const std::string raw_private_key)
-{
- hash_digest digest = decode_hex_digest<hash_digest>(input_data);
- data_chunk signature = decode_hex(signature_data);
- hash_digest privkey = decode_hex_digest<hash_digest>(raw_private_key);
- elliptic_curve_key ec;
- if (!ec.set_secret(privkey))
- error_exit("bad private key");
- log_info() << (ec.verify(digest, signature) ? '1' : '0');
- return 0;
-}
-
-int address(const std::string raw_private_key)
-{
- hash_digest privkey = decode_hex_digest<hash_digest>(raw_private_key);
- elliptic_curve_key ec;
- if (!ec.set_secret(privkey))
- error_exit("bad private key");
- payment_address address;
- set_public_key(address, ec.public_key());
- log_info() << address.encoded();
- return 0;
-}
-
-std::string read_private_key()
-{
- std::istreambuf_iterator<char> it(std::cin);
- std::istreambuf_iterator<char> end;
- return std::string(it, end);
-}
-
-int main(int argc, char** argv)
-{
- if (argc < 2)
- {
- display_help();
- return 0;
- }
- std::string command = argv[1];
- size_t number_args = argc - 2, arg_index = 2;
- if (command == "new")
- return new_keypair();
- else if (command == "sign")
- {
- if (number_args != 1)
- error_exit("sign requires argument data");
- std::string input_data = argv[arg_index];
- return sign(input_data, read_private_key());
- }
- else if (command == "verify")
- {
- if (number_args != 2)
- error_exit("verify requires argument data and signature");
- std::string input_data = argv[arg_index],
- signature = argv[arg_index + 1];
- return verify(input_data, signature, read_private_key());
- }
- else if (command == "address")
- return address(read_private_key());
- else
- error_exit("not a valid command. See priv help text.");
- // Should never happen!
- return 1;
-}
-
diff --git a/examples/proto.cpp b/examples/proto.cpp
deleted file mode 100644
index f3ecdfb..0000000
--- a/examples/proto.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-/*
- Join the Bitcoin network.
-*/
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-using std::placeholders::_1;
-using std::placeholders::_2;
-
-// We don't have a database open, and aren't doing any critical file
-// operations so we aren't worried about exiting suddenly.
-void check_error(const std::error_code& ec)
-{
- if (!ec)
- return;
- log_fatal() << ec.message();
- exit(-1);
-}
-
-// Needed for the C callback capturing the signals.
-bool stopped = false;
-void signal_handler(int sig)
-{
- log_info() << "Caught signal: " << sig;
- stopped = true;
-}
-
-// Started protocol. Node discovery complete.
-void handle_start(const std::error_code& ec);
-// After number of connections is fetched, this completion handler is called
-// and the number of connections is displayed.
-void display_number_of_connections(
- const std::error_code& ec, size_t connection_count);
-
-void handle_start(const std::error_code& ec)
-{
- check_error(ec);
- log_debug() << "Started.";
-}
-
-void display_number_of_connections(
- const std::error_code& ec, size_t connection_count)
-{
- check_error(ec);
- log_debug() << connection_count << " CONNECTIONS";
-}
-
-void connection_started(const std::error_code& ec, channel_ptr node,
- protocol& prot)
-{
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- log_info() << "Connection established.";
- // Resubscribe to new nodes.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot)));
-}
-
-int main()
-{
- threadpool pool(1);
- // Create dependencies for our protocol object.
- hosts hst(pool);
- handshake hs(pool);
- network net(pool);
- // protocol service.
- protocol prot(pool, hst, hs, net);
- // Perform node discovery if needed and then creating connections.
- prot.start(handle_start);
- // Notify us of new connections.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot)));
- // Catch C signals for stopping the program.
- signal(SIGABRT, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
- while (!stopped)
- {
- prot.fetch_connection_count(display_number_of_connections);
- std::this_thread::sleep_for(std::chrono::seconds(1));
- }
- // Safely close down.
- pool.stop();
- pool.join();
- return 0;
-}
-
diff --git a/examples/query-stealth.cpp b/examples/query-stealth.cpp
deleted file mode 100644
index 27ac145..0000000
--- a/examples/query-stealth.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-blockchain* chain = nullptr;
-
-// Completion handler for when the blockchain has finished initializing.
-void blockchain_started(const std::error_code& ec);
-// Results for stealth query passed here.
-void stealth_fetched(const std::error_code& ec,
- const blockchain::stealth_list& stealth_results);
-
-void blockchain_started(const std::error_code& ec)
-{
- // std::error_code's can be tested like bools, and
- // compared against specific error enums.
- // See <bitcoin/error.hpp> for a full list of them.
- if (ec)
- {
- log_error() << "Blockchain failed to start: " << ec.message();
- return;
- }
- // Blockchain has safely started.
- log_info() << "Blockchain started.";
- // chain should've been set inside main().
- assert(chain);
- // Construct stealth query prefix.
- stealth_prefix prefix{2, 0x691cf48b};
- // Begin fetching the stealth results.
- chain->fetch_stealth(prefix, stealth_fetched);
-}
-
-void stealth_fetched(const std::error_code& ec,
- const blockchain::stealth_list& stealth_results)
-{
- if (ec)
- {
- log_error() << "Stealth fetch failed: " << ec.message();
- return;
- }
- for (const blockchain::stealth_row& row: stealth_results)
- log_debug() << "ephemkey: " << row.ephemkey
- << " address: " << row.address.encoded()
- << " tx_hash: " << row.transaction_hash;
-}
-
-int main()
-{
- // Define a threadpool with 1 thread.
- threadpool pool(1);
- // Create a LevelDB blockchain.
- leveldb_blockchain ldb_chain(pool);
- // Initialize our global 'chain' pointer from above.
- chain = &ldb_chain;
- // Start the database using its implementation specific method.
- ldb_chain.start("blockchain", blockchain_started);
- // Don't wait after all current operations have completed.
- pool.shutdown();
- // Join them one by one.
- pool.join();
- // Finally stop the blockchain safely now everything has stopped.
- ldb_chain.stop();
- return 0;
-}
-
diff --git a/examples/satoshiwords.cpp b/examples/satoshiwords.cpp
deleted file mode 100644
index 373ff68..0000000
--- a/examples/satoshiwords.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-/*
- Display the genesis block message by Satoshi.
-*/
-#ifdef _MSC_VER
-#include <iostream>
-#endif
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-int main()
-{
- // Create genesis block.
- block_type genblk = genesis_block();
- // Genesis block contains a single coinbase transaction.
- assert(genblk.transactions.size() == 1);
- // Get first transaction in block (coinbase).
- const transaction_type& coinbase_tx = genblk.transactions[0];
- // Coinbase tx has a single input.
- assert(coinbase_tx.inputs.size() == 1);
- const transaction_input_type& coinbase_input = coinbase_tx.inputs[0];
- // Convert the input script to its raw format.
- const data_chunk& raw_block_message = save_script(coinbase_input.script);
- // Convert this to an std::string.
- std::string message;
- message.resize(raw_block_message.size());
- std::copy(raw_block_message.begin(), raw_block_message.end(),
- message.begin());
- // Display the genesis block message.
- std::cout << message << std::endl;
- return 0;
-}
-
diff --git a/examples/txrad.cpp b/examples/txrad.cpp
deleted file mode 100644
index 5d28140..0000000
--- a/examples/txrad.cpp
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-/*
- Transaction radar.
-*/
-#include <bitcoin/bitcoin.hpp>
-using namespace bc;
-
-using std::placeholders::_1;
-using std::placeholders::_2;
-
-// Watches transactions. Keeps a view count per seen tx hash, and
-// cleans up old expired tx hashes.
-class tx_watch
- : public async_strand
-{
-public:
- tx_watch(threadpool& pool, time_t timeout=200);
-
- // Push a seen tx hash. If this entry exists then the count
- // will be incremented.
- // Else create a new entry in our list.
- void push(const hash_digest& tx_hash);
- // Cleans up expired items. We could make this implicitly called
- // by push() or display(), but single use methods with no side-effects
- // is better code design.
- void cleanup();
- // Display transactions and their count. A better design would be to
- // separate the view from the model and instead provide a method which
- // fetches a copy of our list, but we keep it simple here.
- void display();
-
-private:
- struct entry_count
- {
- hash_digest tx_hash;
- size_t count;
- // Timestamp of when transaction hash was first seen.
- time_t timest;
- };
-
- typedef std::vector<entry_count> entry_list;
-
- // The public methods push these methods to the threadpool to be
- // executed and then return immediately.
- // async_strand::queue() is a helper method which posts the work
- // to the threadpool and serializes access.
- // No 2 operations posted through the same async_strand using queue()
- // will execute at the same time.
- void do_push(const hash_digest& tx_hash);
- void do_cleanup();
- void do_display();
-
- entry_list entries_;
- // Time until an entry is ready to be removed.
- time_t timeout_;
-};
-
-tx_watch::tx_watch(threadpool& pool, time_t timeout)
- : async_strand(pool), timeout_(timeout)
-{
-}
-
-void tx_watch::push(const hash_digest& tx_hash)
-{
- queue(std::bind(&tx_watch::do_push, this, tx_hash));
- // Returns immediately.
-}
-void tx_watch::do_push(const hash_digest& tx_hash)
-{
- // If tx_hash is found then increment count...
- bool is_found = false;
- for (entry_count& entry: entries_)
- if (entry.tx_hash == tx_hash)
- {
- ++entry.count;
- is_found = true;
- }
- // Else create a new entry with a count of 1.
- if (!is_found)
- entries_.push_back({tx_hash, 1, time(nullptr)});
-}
-
-void tx_watch::cleanup()
-{
- queue(std::bind(&tx_watch::do_cleanup, this));
-}
-void tx_watch::do_cleanup()
-{
- // Erase entries where timest is older than (now - timeout_) seconds.
- time_t current_time = time(nullptr);
- auto erase_pred =
- [&](const entry_count& entry)
- {
- return (current_time - entry.timest) > timeout_;
- };
- auto erase_begin =
- std::remove_if(entries_.begin(), entries_.end(), erase_pred);
- // If we have old entries to delete then erase them.
- if (erase_begin != entries_.end())
- entries_.erase(erase_begin);
-}
-
-void tx_watch::display()
-{
- queue(std::bind(&tx_watch::do_display, this));
-}
-void tx_watch::do_display()
-{
- // Sort entries by count. Highest numbers at the top.
- std::sort(entries_.begin(), entries_.end(),
- [](const entry_count& entry_a, const entry_count& entry_b)
- {
- return entry_a.count > entry_b.count;
- });
- // Display the first 20 entries.
- for (size_t i = 0; i < 20 && i < entries_.size(); ++i)
- {
- const entry_count& entry = entries_[i];
- log_info() << entry.tx_hash << " " << entry.count;
- }
-}
-
-// We don't have a database open, and aren't doing any critical file
-// operations so we aren't worried about exiting suddenly.
-void check_error(const std::error_code& ec)
-{
- if (!ec)
- return;
- log_fatal() << ec.message();
- exit(-1);
-}
-
-// Needed for the C callback capturing the signals.
-bool stopped = false;
-void signal_handler(int sig)
-{
- log_info() << "Caught signal: " << sig;
- stopped = true;
-}
-
-// Started protocol. Node discovery complete.
-void handle_start(const std::error_code& ec)
-{
- check_error(ec);
- log_debug() << "Started.";
-}
-
-void connection_started(const std::error_code& ec, channel_ptr node,
- protocol& prot, tx_watch& watch);
-void inventory_received(const std::error_code& ec, const inventory_type& inv,
- channel_ptr node, tx_watch& watch);
-
-void connection_started(const std::error_code& ec, channel_ptr node,
- protocol& prot, tx_watch& watch)
-{
- if (ec)
- {
- log_warning() << "Couldn't start connection: " << ec.message();
- return;
- }
- log_info() << "Connection established.";
- // Subscribe to inventory packets.
- node->subscribe_inventory(
- std::bind(inventory_received, _1, _2, node, std::ref(watch)));
- // Resubscribe to new nodes.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot), std::ref(watch)));
-}
-
-void inventory_received(const std::error_code& ec, const inventory_type& inv,
- channel_ptr node, tx_watch& watch)
-{
- check_error(ec);
- // Loop through inventory hashes.
- for (const inventory_vector_type& ivec: inv.inventories)
- {
- // We're only interested in transactions. Discard everything else.
- if (ivec.type != inventory_type_id::transaction)
- continue;
- watch.push(ivec.hash);
- }
- // Resubscribe to inventory packets.
- node->subscribe_inventory(
- std::bind(inventory_received, _1, _2, node, std::ref(watch)));
-}
-
-int main()
-{
- threadpool pool(4);
- // Create dependencies for our protocol object.
- hosts hst(pool);
- handshake hs(pool);
- network net(pool);
- // protocol service.
- protocol prot(pool, hst, hs, net);
- // Perform node discovery if needed and then creating connections.
- prot.start(handle_start);
- // Our table tracking transaction counts.
- tx_watch watch(pool, 200);
- // Notify us of new connections.
- prot.subscribe_channel(
- std::bind(connection_started, _1, _2, std::ref(prot), std::ref(watch)));
- // Catch C signals for stopping the program.
- signal(SIGABRT, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
- while (!stopped)
- {
- watch.cleanup();
- watch.display();
- std::this_thread::sleep_for(std::chrono::seconds(10));
- }
- // Safely close down.
- pool.stop();
- pool.join();
- return 0;
-}
-
diff --git a/include/bitcoin/Makefile.am b/include/bitcoin/Makefile.am
deleted file mode 100644
index 85fb7f2..0000000
--- a/include/bitcoin/Makefile.am
+++ /dev/null
@@ -1,72 +0,0 @@
-bitcoin_includedir = $(includedir)/bitcoin
-bitcoin_include_HEADERS = \
- define.hpp \
- transaction_indexer.hpp \
- satoshi_serialize.hpp \
- getx_responder.hpp \
- error.hpp \
- validate.hpp \
- primitives.hpp \
- script.hpp \
- address.hpp \
- transaction.hpp \
- stealth.hpp \
- constants.hpp \
- block.hpp \
- bitcoin.hpp \
- types.hpp \
- session.hpp \
- format.hpp \
- transaction_pool.hpp \
- threadpool.hpp \
- poller.hpp \
- version.hpp
-
-bitcoin_impl_serialize_includedir = $(includedir)/bitcoin/impl/serialize
-bitcoin_impl_serialize_include_HEADERS = \
- impl/serialize/misc.ipp \
- impl/serialize/block.ipp
-
-bitcoin_blockchain_includedir = $(includedir)/bitcoin/blockchain
-bitcoin_blockchain_include_HEADERS = \
- blockchain/blockchain.hpp \
- blockchain/organizer.hpp
-
-bitcoin_blockchain_database_includedir = $(includedir)/bitcoin/blockchain/database
-bitcoin_blockchain_database_include_HEADERS = \
- blockchain/database/stealth_database.hpp
-
-if DO_LEVELDB
-bitcoin_blockchain_include_HEADERS += \
- blockchain/leveldb_blockchain.hpp
-endif
-
-bitcoin_network_includedir = $(includedir)/bitcoin/network
-bitcoin_network_include_HEADERS = \
- network/channel.hpp \
- network/network.hpp \
- network/handshake.hpp \
- network/shared_const_buffer.hpp \
- network/hosts.hpp \
- network/protocol.hpp
-
-bitcoin_util_includedir = $(includedir)/bitcoin/utility
-bitcoin_util_include_HEADERS = \
- utility/async_parallel.hpp \
- utility/elliptic_curve_key.hpp \
- utility/sha256.hpp \
- utility/serializer.hpp \
- utility/assert.hpp \
- utility/big_number.hpp \
- utility/mmfile.hpp \
- utility/base58.hpp \
- utility/ripemd.hpp \
- utility/subscriber.hpp \
- utility/logger.hpp \
- utility/weak_bind.hpp \
- utility/timed_section.hpp
-
-bitcoin_impl_utility_includedir = $(includedir)/bitcoin/impl/utility
-bitcoin_impl_utility_include_HEADERS = \
- impl/utility/serializer.ipp
-
diff --git a/include/bitcoin/address.hpp b/include/bitcoin/address.hpp
deleted file mode 100644
index 34d4fc8..0000000
--- a/include/bitcoin/address.hpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#ifndef LIBBITCOIN_ADDRESS_HPP
-#define LIBBITCOIN_ADDRESS_HPP
-
-#include <bitcoin/constants.hpp>
-#include <bitcoin/types.hpp>
-#include <bitcoin/script.hpp>
-
-namespace libbitcoin {
-
-/**
- * A class for handling Bitcoin addresses. Supports encoding and decoding
- * Bitcoin string addresses.
- *
- * To validate a Bitcoin address we can try to set a string address.
- *
- * @code
- * payment_address payaddr;
- * if (!payaddr.set_encoded("155GwFbFET2HCT6r6jHAHUoxc897sSdjaq"))
- * // Address is invalid
- * @endcode
- *
- * To check whether a payment_address has successfully been set, the
- * hash value can be compared to null_short_hash (defined in constants.hpp).
- *
- * @code
- * if (payaddr.version() == payment_address::invalid_version)
- * // This payment_address is empty.
- * @endcode
- */
-class payment_address
-{
-public:
-#ifdef ENABLE_TESTNET
- enum
- {
- pubkey_version = 0x6f,
- script_version = 0xc4,
- wif_version = 0xef,
- invalid_version = 0xff
- };
-#else
- enum
- {
- pubkey_version = 0x00,
- script_version = 0x05,
- wif_version = 0x80,
- invalid_version = 0xff
- };
-#endif
- payment_address();
- payment_address(uint8_t version, const short_hash& hash);
- payment_address(const std::string& encoded_address);
-
- void set(uint8_t version, const short_hash& hash);
-
- uint8_t version() const;
- const short_hash& hash() const;
-
- bool set_encoded(const std::string& encoded_address);
- std::string encoded() const;
-
-private:
- uint8_t version_ = invalid_version;
- short_hash hash_ = null_short_hash;
-};
-
-void set_public_key_hash(payment_address& address,
- const short_hash& pubkey_hash);
-void set_script_hash(payment_address& address,
- const short_hash& script_hash);
-
-void set_public_key(payment_address& address, const data_chunk& public_key);
-void set_script(payment_address& address, const script_type& eval_script);
-
-/**
- * Extract a Bitcoin address from an input or output script.
- * Returns false on failure.
- */
-bool extract(payment_address& address, const script_type& script);
-
-bool operator==(const payment_address& lhs, const payment_address& rhs);
-
-} // namespace libbitcoin
-
-// Allow payment_address to be in indexed in std::*map classes.
-namespace std
-{
- template <>
- struct hash<libbitcoin::payment_address>
- {
- size_t operator()(const libbitcoin::payment_address& payaddr) const
- {
- using libbitcoin::short_hash;
- using libbitcoin::short_hash_size;
- std::string raw_addr;
- raw_addr.resize(short_hash_size + 1);
- raw_addr[0] = payaddr.version();
- const short_hash& addr_hash = payaddr.hash();
- std::copy(addr_hash.begin(), addr_hash.end(),
- raw_addr.begin() + 1);
- std::hash<std::string> hash_fn;
- return hash_fn(raw_addr);
- }
- };
-}
-
-#endif
-
diff --git a/include/bitcoin/bitcoin.hpp b/include/bitcoin/bitcoin.hpp
deleted file mode 100644
index 7189371..0000000
--- a/include/bitcoin/bitcoin.hpp
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#ifndef LIBBITCOIN_BITCOIN_HPP
-#define LIBBITCOIN_BITCOIN_HPP
-
-/**
- * @mainpage libbitcoin API dox
- *
- * @section intro_sec Introduction
- *
- * libbitcoin is a bitcoin library targeted towards high end use.
- * The library places a heavy focus around asychronicity. This enables a
- * big scope for future scalability as each component has its own
- * thread pool. By increasing the number of threads for that component
- * the library is able to scale outwards across CPU cores. This will be
- * vital in the future as the demands of the bitcoin network grow.
- *
- * Another core design principle is libbitcoin is not a framework, but
- * a toolkit. Frameworks hinder development during the latter stages of
- * a development cycle, enforce one style of coding and do not work well
- * with other frameworks. By contrast, we have gone to great pains to make
- * libbitcoin function as an independent set of mutual components with no
- * dependencies between them.
- *
- * @section overview_sec Overview
- *
- * Broadly speaking the main services in libbitcoin can be divided down
- * three lines.
- *
- * @subsection network Network services
- *
- * These services are concerned with the network side of things.
- *
- * - @link libbitcoin::channel channel @endlink
- * - @link libbitcoin::network network @endlink
- * - @link libbitcoin::protocol protocol @endlink
- * - @link libbitcoin::hosts hosts @endlink
- * - @link libbitcoin::handshake handshake @endlink
- *
- * @subsection blockchain Blockchain service
- *
- * Bitcoin's blockchain is usually disk oriented. Backends all implement
- * the blockchain interface allowing programs to utilise backends using the
- * same code.
- *
- * - @link libbitcoin::blockchain blockchain @endlink (abstract interface
- for blockchain backends)
- * - @link libbitcoin::bdb_blockchain bdb_blockchain @endlink
- * - @link libbitcoin::leveldb_blockchain leveldb_blockchain @endlink
- *
- * @subsection supporting Supporting services
- *
- * These services utilise other services and provide additional
- * functionality. They can be thought of as composed services.
- *
- * - @link libbitcoin::poller poller @endlink
- * - @link libbitcoin::transaction_pool transaction_pool @endlink
- * - @link libbitcoin::session session @endlink
- *
- * @section primitive Primitive
- *
- * libbitcoin operates around primitives. Each primitive corresponds to
- * one of the messages in the bitcoin network protocol.
- *
- * These primitives make up the corpus of libbitcoin.
- *
- * - @link libbitcoin::version_type version_type @endlink
- * - @link libbitcoin::verack_type verack_type @endlink
- * - @link libbitcoin::address_type address_type @endlink
- * - @link libbitcoin::inventory_type inventory_type @endlink
- * - @link libbitcoin::get_data_type get_data_type @endlink
- * - @link libbitcoin::get_blocks_type get_blocks_type @endlink
- * - @link libbitcoin::transaction_type transaction_type @endlink
- * - @link libbitcoin::block_type block_type @endlink
- * - @link libbitcoin::get_address_type get_address_type @endlink
- * - @link libbitcoin::ping_type ping_type @endlink
- * - @link libbitcoin::pong_type pong_type @endlink
- *
- * @section base Foundational
- *
- * These classes provide foundational functionality that is widely used.
- *
- * - @link libbitcoin::serializer serializer @endlink /
- * @link libbitcoin::deserializer deserializer @endlink
- * - @link libbitcoin::script script @endlink
- * - @link libbitcoin::payment_address payment_address @endlink
- * - @link libbitcoin::elliptic_curve_key elliptic_curve_key @endlink
- * - @link libbitcoin::big_number big_number @endlink
- * - @link libbitcoin::threadpool threadpool @endlink
- *
- * @section useful-funcs Useful functions
- *
- * In accordance with C++ principles of encapsulation, operations which
- * wrap or compose other operations are not provided as member functions,
- * but as free functions.
- *
- * This minimises intrusion of class interfaces and provides a clear
- * separation as a matter of API design choice.
- *
- * @subsection transaction Transaction
- *
- * - @link libbitcoin::hash_transaction hash_transaction @endlink
- * - @link libbitcoin::generate_merkle_root generate_merkle_root @endlink
- * - @link libbitcoin::previous_output_is_null previous_output_is_null @endlink
- * - @link libbitcoin::is_coinbase is_coinbase @endlink
- * - @link libbitcoin::total_output_value total_output_value @endlink
- *
- * @subsection block Block
- *
- * - @link libbitcoin::hash_block_header hash_block_header @endlink
- * - @link libbitcoin::block_value block_value @endlink
- * - @link libbitcoin::block_work block_work @endlink
- * - @link libbitcoin::block_locator_indices block_locator_indices @endlink
- * - @link libbitcoin::genesis_block genesis_block @endlink
- *
- * @subsection blockchain Blockchain
- *
- * - @link libbitcoin::fetch_block fetch_block @endlink
- *
- * @subsection format Format
- *
- * - @link libbitcoin::encode_hex pretty_hex @endlink
- * - @link libbitcoin::decode_hex bytes_from_pretty @endlink
- * - @link libbitcoin::decode_hex_digest hash_from_pretty @endlink
- * - @link libbitcoin::extend_data extend_data @endlink
- * - @link libbitcoin::cast_chunk cast_chunk @endlink
- * - @link libbitcoin::uncast_chunk uncast_chunk @endlink
- *
- * @subsection hashing Hashing
- *
- * - @link libbitcoin::generate_ripemd_hash generate_ripemd_hash @endlink
- * - @link libbitcoin::generate_sha256_hash generate_sha256_hash @endlink
- * - @link libbitcoin::generate_sha256_checksum generate_sha256_checksum @endlink
- *
- * @subsection base58 Base58
- *
- * - @link libbitcoin::encode_base58 encode_base58 @endlink
- * - @link libbitcoin::decode_base58 decode_base58 @endlink
- *
- * @author Amir Taaki <amir@unsystem.net>
- *
- */
-
-// Convenience header that includes everything
-// Not to be used internally. For API users.
-#include <bitcoin/error.hpp>
-#include <bitcoin/address.hpp>
-#include <bitcoin/network/channel.hpp>
-#include <bitcoin/network/shared_const_buffer.hpp>
-#include <bitcoin/network/network.hpp>
-#include <bitcoin/network/hosts.hpp>
-#include <bitcoin/network/handshake.hpp>
-#include <bitcoin/block.hpp>
-#include <bitcoin/session.hpp>
-#include <bitcoin/poller.hpp>
-#include <bitcoin/format.hpp>
-#include <bitcoin/validate.hpp>
-#include <bitcoin/constants.hpp>
-#include <bitcoin/getx_responder.hpp>
-#include <bitcoin/types.hpp>
-#include <bitcoin/primitives.hpp>
-#include <bitcoin/blockchain/organizer.hpp>
-#include <bitcoin/blockchain/blockchain.hpp>
-#include <bitcoin/utility/async_parallel.hpp>
-#include <bitcoin/utility/elliptic_curve_key.hpp>
-#include <bitcoin/utility/assert.hpp>
-#include <bitcoin/utility/ripemd.hpp>
-#include <bitcoin/utility/logger.hpp>
-#include <bitcoin/utility/sha256.hpp>
-#include <bitcoin/utility/base58.hpp>
-#include <bitcoin/utility/big_number.hpp>
-#include <bitcoin/utility/mmfile.hpp>
-#include <bitcoin/utility/serializer.hpp>
-#include <bitcoin/utility/subscriber.hpp>
-#include <bitcoin/utility/weak_bind.hpp>
-#include <bitcoin/script.hpp>
-#include <bitcoin/stealth.hpp>
-#include <bitcoin/transaction.hpp>
-#include <bitcoin/transaction_pool.hpp>
-#include <bitcoin/transaction_indexer.hpp>
-#include <bitcoin/network/protocol.hpp>
-#include <bitcoin/threadpool.hpp>
-#ifdef LEVELDB_ENABLED
- #include <bitcoin/blockchain/leveldb_blockchain.hpp>
-#endif
-
-namespace bc = libbitcoin;
-
-#endif
-
diff --git a/include/bitcoin/block.hpp b/include/bitcoin/block.hpp
deleted file mode 100644
index 0993030..0000000
--- a/include/bitcoin/block.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#ifndef LIBBITCOIN_BLOCK_HPP
-#define LIBBITCOIN_BLOCK_HPP
-
-#include <bitcoin/primitives.hpp>
-#include <bitcoin/utility/big_number.hpp>
-
-namespace libbitcoin {
-
-enum class block_status
-{
- orphan,
- confirmed,
- rejected
-};
-
-struct block_info
-{
- block_status status;
- size_t height;
-};
-
-bool operator==(
- const block_header_type& block_a, const block_header_type& block_b);
-
-uint64_t block_value(size_t height);
-big_number block_work(uint32_t bits);
-
-hash_digest hash_block_header(const block_header_type& header);
-
-index_list block_locator_indexes(int top_height);
-
-block_type genesis_block();
-
-} // namespace libbitcoin
-
-#endif
-
diff --git a/include/bitcoin/blockchain/blockchain.hpp b/include/bitcoin/blockchain/blockchain.hpp
deleted file mode 100644
index 7df88ac..0000000
--- a/include/bitcoin/blockchain/blockchain.hpp
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#ifndef LIBBITCOIN_BLOCKCHAIN_BLOCKCHAIN_HPP
-#define LIBBITCOIN_BLOCKCHAIN_BLOCKCHAIN_HPP
-
-/**
- * Represents an interface to a blockchain backend.
- */
-
-#include <boost/utility.hpp>
-#include <functional>
-
-#include <bitcoin/block.hpp>
-#include <bitcoin/error.hpp>
-#include <bitcoin/primitives.hpp>
-#include <bitcoin/address.hpp>
-#include <bitcoin/transaction.hpp>
-#include <bitcoin/stealth.hpp>
-
-namespace libbitcoin {
-
-class blockchain
-{
-public:
- typedef std::function<void (const std::error_code&, block_info)>
- store_block_handler;
-
- typedef std::function<void (const std::error_code&)> import_block_handler;
-
- template <typename Message>
- using fetch_handler = std::function<
- void (const std::error_code&, const Message&)>;
-
- typedef fetch_handler<block_header_type> fetch_handler_block_header;
-
- typedef fetch_handler<hash_digest_list>
- fetch_handler_block_transaction_hashes;
-
- typedef fetch_handler<size_t> fetch_handler_block_height;
-
- typedef fetch_handler<size_t> fetch_handler_last_height;
-
- typedef fetch_handler<block_locator_type>
- fetch_handler_block_locator;
-
- typedef fetch_handler<transaction_type> fetch_handler_transaction;
-
- typedef std::function<
- void (const std::error_code&, size_t, size_t)>
- fetch_handler_transaction_index;
-
- typedef fetch_handler<input_point> fetch_handler_spend;
-
- struct history_row
- {
- output_point output;
- size_t output_height;
- uint64_t value;
- input_point spend;
- size_t spend_height;
- };
- typedef std::vector<history_row> history_list;
- typedef std::function<void (const std::error_code&, const history_list&)>
- fetch_handler_history;
-
- struct stealth_row
- {
- data_chunk ephemkey;
- payment_address address;
- hash_digest transaction_hash;
- };
- typedef std::vector<stealth_row> stealth_list;
- typedef std::function<void (const std::error_code&, const stealth_list&)>
- fetch_handler_stealth;
-
- typedef std::vector<std::shared_ptr<block_type>> block_list;
- typedef std::function<
- void (const std::error_code&, size_t,
- const block_list&, const block_list&)> reorganize_handler;
-
- virtual ~blockchain() {};
-
- /**
- * Store a new block.
- *
- * Subscriber is notified exactly once of changes to the blockchain
- * and needs to re-subscribe to continue being notified.
- *
- * @param[in] block Block to store
- * @param[in] handle_store Completion handler for store operation.
- * @code
- * void handle_store(
- * const std::error_code& ec, // Status of operation
- * block_info info // Status and height of block
- * );
- * @endcode
- */
- virtual void store(const block_type& block,
- store_block_handler handle_store) = 0;
-
- /**
- * Store a new block directly without validating it.
- * No checks are done. Importing an already stored block
- * is undefined.
- *
- * @param[in] import_block Block to store
- * @param[in] height Height of block
- * @param[in] handle_import Completion handler for import operation.
- * @code
- * void handle_import(
- * const std::error_code& ec // Status of operation
- * );
- * @encode
- */
- virtual void import(const block_type& import_block, size_t height,
- import_block_handler handle_import) = 0;
-
- /**
- * Fetches the block header by height.
- *
- * @param[in] height Height of block to fetch
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const block_header_type& blk // Block header
- * );
- * @endcode
- */
- virtual void fetch_block_header(size_t height,
- fetch_handler_block_header handle_fetch) = 0;
-
- /**
- * Fetches the block header by hash.
- *
- * @param[in] block_hash Hash of block
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const block_header_type& blk // Block header
- * );
- * @endcode
- */
- virtual void fetch_block_header(const hash_digest& block_hash,
- fetch_handler_block_header handle_fetch) = 0;
-
- /**
- * Fetches list of transaction hashes in a block by height.
- *
- * @param[in] height Height of block containing transactions.
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const hash_digest_list& hashes // List of hashes
- * );
- * @endcode
- */
- virtual void fetch_block_transaction_hashes(size_t height,
- fetch_handler_block_transaction_hashes handle_fetch) = 0;
-
- /**
- * Fetches list of transaction hashes in a block by block hash.
- *
- * @param[in] block_hash Hash of block
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const hash_digest_list& hashes // List of hashes
- * );
- * @endcode
- */
- virtual void fetch_block_transaction_hashes(const hash_digest& block_hash,
- fetch_handler_block_transaction_hashes handle_fetch) = 0;
-
- /**
- * Fetches the height of a block given its hash.
- *
- * @param[in] block_hash Hash of block
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * size_t block_height // Height of block
- * );
- * @endcode
- */
- virtual void fetch_block_height(const hash_digest& block_hash,
- fetch_handler_block_height handle_fetch) = 0;
-
- /**
- * Fetches the height of the last block in our blockchain.
- *
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * size_t block_height // Height of last block
- * );
- * @endcode
- */
- virtual void fetch_last_height(fetch_handler_last_height handle_fetch) = 0;
-
- /**
- * Fetches a transaction by hash.
- *
- * @param[in] transaction_hash Transaction's hash
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const transaction_type& tx // Transaction
- * );
- * @endcode
- */
- virtual void fetch_transaction(const hash_digest& transaction_hash,
- fetch_handler_transaction handle_fetch) = 0;
-
- /**
- * Fetch the block height that contains a transaction and its index
- * within a block.
- *
- * @param[in] transaction_hash Transaction's hash
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * size_t block_height, // Height of block containing
- * // the transaction.
- * size_t index // Index of transaction within
- * // the block.
- * );
- * @endcode
- */
- virtual void fetch_transaction_index(
- const hash_digest& transaction_hash,
- fetch_handler_transaction_index handle_fetch) = 0;
-
- // fetch of inputs and outputs is a future possibility
- // for now use fetch_transaction and lookup input/output
-
- /**
- * Fetches a corresponding spend of an output.
- *
- * @param[in] outpoint Representation of an output.
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const input_point& inpoint // Spend of output
- * );
- * @endcode
- */
- virtual void fetch_spend(const output_point& outpoint,
- fetch_handler_spend handle_fetch) = 0;
-
- /**
- * Fetches the output points, output values, corresponding input point
- * spends and the block heights associated with a Bitcoin address.
- * The returned history is a list of rows with the following fields:
- *
- * @code
- * struct history_row
- * {
- * output_point output;
- * size_t output_height;
- * uint64_t value;
- * input_point spend;
- * size_t spend_height;
- * };
- * @endcode
- *
- * If an output is unspent then the input spend hash will be equivalent
- * to null_hash.
- *
- * @code
- * if (history.spend.hash == null_hash)
- * // The history.output point is unspent.
- * @endcode
- *
- * Summing the list of values for unspent outpoints gives the balance
- * for an address.
- *
- * @param[in] address Bitcoin address
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @param[in] from_height Starting block height for history.
- * Useful to filter entries or to fetch
- * the history in chunks.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const blockchain::history_list& history // History
- * );
- * @endcode
- */
- virtual void fetch_history(const payment_address& address,
- fetch_handler_history handle_fetch, size_t from_height=0) = 0;
-
- /**
- * Fetch possible stealth results. These results can then be iterated
- * to discover new payments belonging to a particular stealth address.
- * This is for recipient privacy.
- * The result is a list of rows with the following fields:
- *
- * @code
- * struct stealth_row
- * {
- * data_chunk ephemkey;
- * payment_address address;
- * hash_digest transaction_hash;
- * };
- * @endcode
- *
- * The prefix is a special value that can be adjusted to provide
- * greater precision at the expense of deniability.
- *
- * from_height is not guaranteed to only return results from that
- * height, and may also include results from earlier blocks.
- * It is provided as an optimisation. All results at and after
- * from_height are guaranteed to be returned however.
- *
- * @param[in] prefix Stealth prefix information.
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @param[in] from_height Starting block height for stealth results.
- *
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const blockchain::stealth_list& stealth_rows // Stealth result rows
- * );
- * @endcode
- */
- virtual void fetch_stealth(const stealth_prefix& prefix,
- fetch_handler_stealth handle_fetch, size_t from_height=0) = 0;
-
- /**
- * Be notified of the next blockchain change.
- *
- * Subscriber is notified exactly once of changes to the blockchain
- * and needs to re-subscribe to continue being notified.
- *
- * @param[in] handle_reorganize Notification handler for changes
- * @code
- * void handle_reorganize(
- * const std::error_code& ec, // Status of operation
- * size_t fork_point, // Index where blockchain forks
- * const block_list& added, // New blocks added to blockchain
- * const block_list& removed // Blocks removed (empty if none)
- * );
- * @endcode
- */
- virtual void subscribe_reorganize(
- reorganize_handler handle_reorganize) = 0;
-};
-
-typedef std::function<void (const std::error_code&, const block_type&)>
- blockchain_fetch_handler_block;
-
-/**
- * Fetch a block by height.
- *
- * If the blockchain reorganises, operation may fail halfway.
- *
- * @param[in] chain Blockchain service
- * @param[in] height Height of block to fetch.
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const block_type& blk // Block header
- * );
- * @endcode
- */
-void fetch_block(blockchain& chain, size_t height,
- blockchain_fetch_handler_block handle_fetch);
-
-/**
- * Fetch a block by hash.
- *
- * If the blockchain reorganises, operation may fail halfway.
- *
- * @param[in] chain Blockchain service
- * @param[in] block_hash Hash of block to fetch.
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const block_type& blk // Block header
- * );
- * @endcode
- */
-void fetch_block(blockchain& chain, const hash_digest& block_hash,
- blockchain_fetch_handler_block handle_fetch);
-
-typedef std::function<
- void (const std::error_code&, const block_locator_type&)>
- blockchain_fetch_handler_block_locator;
-
-/**
- * Creates a block_locator object used to download the blockchain.
- *
- * @param[in] handle_fetch Completion handler for fetch operation.
- * @code
- * void handle_fetch(
- * const std::error_code& ec, // Status of operation
- * const block_locator_type& loc // Block locator object
- * );
- * @endcode
- */
-void fetch_block_locator(blockchain& chain,
- blockchain_fetch_handler_block_locator handle_fetch);
-
-typedef std::function<void (const std::error_code&,
- const output_point_list&, const input_point_list&)>
- blockchain_fetch_handler_history;
-
-} // namespace libbitcoin
-
-#endif
-
diff --git a/include/bitcoin/blockchain/database/stealth_database.hpp b/include/bitcoin/blockchain/database/stealth_database.hpp
deleted file mode 100644
index 6d7d11e..0000000
--- a/include/bitcoin/blockchain/database/stealth_database.hpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#ifndef LIBBITCOIN_STEALTH_DATABASE_HPP
-#define LIBBITCOIN_STEALTH_DATABASE_HPP
-
-#include <stdint.h>
-#include <functional>
-#include <bitcoin/utility/mmfile.hpp>
-
-namespace libbitcoin {
-
-// https://wiki.unsystem.net/index.php/DarkWallet/Stealth#Database_file_format
-
-class stealth_database
-{
-public:
- typedef std::function<void (uint8_t*)> write_function;
- typedef std::function<void (const uint8_t*)> read_function;
-
- stealth_database(mmfile& file);
- void store(write_function write);
- void sync(uint32_t block_height);
-
- // Linearly scans all entries from offset calculated using from_height.
- // Repeatedly call read() with each entry until we reach the end.
- void scan(read_function read, uint32_t from_height);
-
-private:
- uint64_t calculate_entry_offset(uint32_t index);
- void advise_kernel();
-
- // sync() sub-methods
- void add_header_entry_index(uint32_t block_height);
- void modify_entries_count();
- void reset();
-
- // scan() sub-methods
- uint32_t read_start_entry_index(uint32_t from_height);
- void read_entry(uint32_t entry_index, read_function read);
-
- mmfile& file_;
- // Sector offsets
- uint64_t metadata_sector_ = 0;
- uint64_t header_sector_;
- uint64_t entries_sector_;
- // Metadata
- uint32_t version_;
- uint32_t max_header_rows_;
- uint32_t entries_count_;
-
- // store() increments this
- // sync() resets to 0
- size_t entries_written_count_ = 0;
-};
-
-} // namespace libbitcoin
-
-#endif \ No newline at end of file
diff --git a/include/bitcoin/blockchain/leveldb_blockchain.hpp b/include/bitcoin/blockchain/leveldb_blockchain.hpp
deleted file mode 100644
index 8eb7128..0000000
--- a/include/bitcoin/blockchain/leveldb_blockchain.hpp
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#ifndef LIBBITCOIN_BLOCKCHAIN_LEVELDB_BLOCKCHAIN_HPP
-#define LIBBITCOIN_BLOCKCHAIN_LEVELDB_BLOCKCHAIN_HPP
-
-#include <atomic>
-#include <boost/interprocess/sync/file_lock.hpp>
-#include <leveldb/db.h>
-#include <bitcoin/blockchain/blockchain.hpp>
-#include <bitcoin/blockchain/organizer.hpp>
-#include <bitcoin/blockchain/database/stealth_database.hpp>
-#include <bitcoin/utility/subscriber.hpp>
-#include <bitcoin/threadpool.hpp>
-
-namespace libbitcoin {
-
-class leveldb_common;
-typedef std::shared_ptr<leveldb_common> leveldb_common_ptr;
-
-class leveldb_blockchain
- : public blockchain
-{
-public:
- // Used by internal components so need public definition here
- typedef subscriber<
- const std::error_code&, size_t, const block_list&, const block_list&>
- reorganize_subscriber_type;
-
- typedef std::function<void (const std::error_code)> start_handler;
-
- leveldb_blockchain(threadpool& pool);
- ~leveldb_blockchain();
-
- // Non-copyable
- leveldb_blockchain(const leveldb_blockchain&) = delete;
- void operator=(const leveldb_blockchain&) = delete;
-
- void start(const std::string& prefix, start_handler handle_start);
- void stop();
-
- void store(const block_type& block,
- store_block_handler handle_store);
- void import(const block_type& block, size_t height,
- import_block_handler handle_import);
-
- // fetch block header by height
- void fetch_block_header(size_t height,
- fetch_handler_block_header handle_fetch);
- // fetch block header by hash
- void fetch_block_header(const hash_digest& block_hash,
- fetch_handler_block_header handle_fetch);
- // fetch transaction hashes in block by height
- void fetch_block_transaction_hashes(size_t height,
- fetch_handler_block_transaction_hashes handle_fetch);
- // fetch transaction hashes in block by hash
- void fetch_block_transaction_hashes(const hash_digest& block_hash,
- fetch_handler_block_transaction_hashes handle_fetch);
- // fetch height of block by hash
- void fetch_block_height(const hash_digest& block_hash,
- fetch_handler_block_height handle_fetch);
- // fetch height of latest block
- void fetch_last_height(fetch_handler_last_height handle_fetch);
- // fetch transaction by hash
- void fetch_transaction(const hash_digest& transaction_hash,
- fetch_handler_transaction handle_fetch);
- // fetch height and offset within block of transaction by hash
- void fetch_transaction_index(const hash_digest& transaction_hash,
- fetch_handler_transaction_index handle_fetch);
- // fetch spend of an output point
- void fetch_spend(const output_point& outpoint,
- fetch_handler_spend handle_fetch);
- // fetch outputs, values and spends for an address.
- void fetch_history(const payment_address& address,
- fetch_handler_history handle_fetch, size_t from_height=0);
- // fetch stealth results.
- void fetch_stealth(const stealth_prefix& prefix,
- fetch_handler_stealth handle_fetch, size_t from_height=0);
-
- void subscribe_reorganize(reorganize_handler handle_reorganize);
-
-private:
- typedef std::atomic<size_t> seqlock_type;
- typedef std::unique_ptr<leveldb::DB> database_ptr;
- typedef std::unique_ptr<leveldb::Comparator> comparator_ptr;
- typedef std::unique_ptr<mmfile> mmfile_ptr;
- typedef std::unique_ptr<stealth_database> stealth_db_ptr;
-
- typedef std::function<bool (size_t)> perform_read_functor;
-
- bool initialize(const std::string& prefix);
-
- void begin_write();
-
- template <typename Handler, typename... Args>
- void finish_write(Handler handler, Args&&... args)
- {
- ++seqlock_;
- // seqlock is now even again.
- BITCOIN_ASSERT(seqlock_ % 2 == 0);
- handler(std::forward<Args>(args)...);
- }
-
- void do_store(const block_type& block,
- store_block_handler handle_store);
- void do_import(const block_type& block, size_t height,
- import_block_handler handle_import);
-
- // Uses sequence looks to try to read shared data.
- // Try to initiate asynchronous read operation. If it fails then
- // sleep for a small amount of time and then retry read operation.
- void fetch(perform_read_functor perform_read);
-
- template <typename Handler, typename... Args>
- bool finish_fetch(size_t slock, Handler handler, Args&&... args)
- {
- if (slock != seqlock_)
- return false;
- handler(std::forward<Args>(args)...);
- return true;
- }
-
- bool fetch_block_header_by_height(size_t height,
- fetch_handler_block_header handle_fetch, size_t slock);
- bool fetch_block_header_by_hash(const hash_digest& block_hash,
- fetch_handler_block_header handle_fetch, size_t slock);
- bool do_fetch_block_height(const hash_digest& block_hash,
- fetch_handler_block_height handle_fetch, size_t slock);
- bool do_fetch_last_height(
- fetch_handler_last_height handle_fetch, size_t slock);
- bool do_fetch_transaction(const hash_digest& transaction_hash,
- fetch_handler_transaction handle_fetch, size_t slock);
- bool do_fetch_transaction_index(const hash_digest& transaction_hash,
- fetch_handler_transaction_index handle_fetch, size_t slock);
- bool do_fetch_spend(const output_point& outpoint,
- fetch_handler_spend handle_fetch, size_t slock);
- bool do_fetch_history(const payment_address& address,
- fetch_handler_history handle_fetch, size_t from_height, size_t slock);
- bool do_fetch_stealth(const stealth_prefix& prefix,
- fetch_handler_stealth handle_fetch, size_t from_height, size_t slock);
-
- io_service& ios_;
- // Queue for writes to the blockchain.
- async_strand strand_;
- // Queue for serializing reorganization handler calls.
- async_strand reorg_strand_;
- // Lock the database directory with a file lock.
- boost::interprocess::file_lock flock_;
- // seqlock used for writes.
- seqlock_type seqlock_;
-
- // Comparator to order blocks by height logically.
- // Otherwise the last block in the database
- // might not be the largest height in our blockchain.
- comparator_ptr height_comparator_;
- leveldb::Options open_options_;
-
- // Blocks indexed by height.
- // block height -> block header + list(tx_hashes)
- database_ptr db_block_;
- // Block heights indexed by hash (a secondary lookup table).
- // block hash -> block height
- database_ptr db_block_hash_;
- // Transactions indexed by hash.
- // tx hash -> tx height + tx index + tx
- database_ptr db_tx_;
- // Lookup whether an output point is spent.
- // Value is the input point spend.
- // outpoint -> inpoint spend
- database_ptr db_spend_;
-
- // Address to list of output points + values
- database_ptr db_credit_;
- // Address to list of spend input points.
- database_ptr db_debit_;
-
- // Custom databases.
- // Stealth database. See <bitcoin/database/stealth_database.hpp>
- // https://wiki.unsystem.net/index.php/DarkWallet/Stealth#Database_file_format
- mmfile_ptr stealth_file_;
- stealth_db_ptr db_stealth_;
-
- leveldb_common_ptr common_;
- // Organize stuff
- orphans_pool_ptr orphans_;
- chain_keeper_ptr chain_;
- organizer_ptr organize_;
-
- reorganize_subscriber_type::ptr reorganize_subscriber_;
-};
-
-} // namespace libbitcoin
-
-#endif
-
diff --git a/include/bitcoin/blockchain/organizer.hpp b/include/bitcoin/blockchain/organizer.hpp
deleted file mode 100644
index a620c31..0000000
--- a/include/bitcoin/blockchain/organizer.hpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#ifndef LIBBITCOIN_BLOCKCHAIN_ORGANIZER_HPP
-#define LIBBITCOIN_BLOCKCHAIN_ORGANIZER_HPP
-
-#include <memory>
-#include <boost/circular_buffer.hpp>
-#include <bitcoin/block.hpp>
-#include <bitcoin/primitives.hpp>
-#include <bitcoin/blockchain/blockchain.hpp>
-#include <bitcoin/utility/big_number.hpp>
-
-namespace libbitcoin {
-
-// Metadata + block
-class block_detail
-{
-public:
- block_detail(const block_type& actual_block);
- block_detail(const block_header_type& header);
- block_type& actual();
- const block_type& actual() const;
- std::shared_ptr<block_type> actual_ptr() const;
- void mark_processed();
- bool is_processed();
- const hash_digest& hash() const;
- void set_info(const block_info& replace_info);
- const block_info& info() const;
- void set_errc(const std::error_code& ec);
- const std::error_code& errc() const;
-private:
- std::shared_ptr<block_type> actual_block_;
- const hash_digest block_hash_;
- bool processed_ = false;
-
- // Syntax change is woraround for compiler bug as of VS2013 C++11 NOV CTP:
- // http://connect.microsoft.com/VisualStudio/feedback/details/792161/constructor-initializer-list-does-not-support-braced-init-list-form
- // block_info info_{block_status::orphan, 0};
- block_info info_ = block_info{block_status::orphan, 0};
-
- std::error_code ec_;
-};
-
-typedef std::shared_ptr<block_detail> block_detail_ptr;
-typedef std::vector<block_detail_ptr> block_detail_list;
-
-// An unordered memory pool for orphan blocks
-class orphans_pool
-{
-public:
- orphans_pool(size_t pool_size);
- bool add(block_detail_ptr incoming_block);
- block_detail_list trace(block_detail_ptr end_block);
- block_detail_list unprocessed();
- void remove(block_detail_ptr remove_block);
-private:
- boost::circular_buffer<block_detail_ptr> pool_;
-};
-
-typedef std::shared_ptr<orphans_pool> orphans_pool_ptr;
-
-// The actual blockchain is encapsulated by this
-class chain_keeper
-{
-public:
- virtual void start() = 0;
- // Must be able to call stop() twice without problems
- virtual void stop() = 0;
-
- virtual void add(block_detail_ptr incoming_block) = 0;
- virtual int find_index(const hash_digest& search_block_hash) = 0;
- virtual big_number end_slice_difficulty(size_t slice_begin_index) = 0;
- virtual bool end_slice(size_t slice_begin_index,
- block_detail_list& sliced_blocks) = 0;
-};
-
-typedef std::shared_ptr<chain_keeper> chain_keeper_ptr;
-
-// Structure which organises the blocks from the orphan pool to the blockchain
-class organizer
-{
-public:
- organizer(orphans_pool_ptr orphans, chain_keeper_ptr chain);
-
- void start();
-
-protected:
- virtual std::error_code verify(size_t fork_index,
- const block_detail_list& orphan_chain, size_t orphan_index) = 0;
- virtual void reorganize_occured(
- size_t fork_point,
- const blockchain::block_list& arrivals,
- const blockchain::block_list& replaced) = 0;
-
-private:
- void process(block_detail_ptr process_block);
- void replace_chain(size_t fork_index, block_detail_list& orphan_chain);
- void clip_orphans(block_detail_list& orphan_chain,
- size_t orphan_index, const std::error_code& invalid_reason);
- void notify_reorganize(
- size_t fork_point,
- const block_detail_list& orphan_chain,
- const block_detail_list& replaced_slice);
-
- orphans_pool_ptr orphans_;
- chain_keeper_ptr chain_;
-
- block_detail_list process_queue_;
-};
-
-typedef std::shared_ptr<organizer> organizer_ptr;
-
-} // namespace libbitcoin
-
-#endif
-
diff --git a/include/bitcoin/constants.hpp b/include/bitcoin/constants.hpp
deleted file mode 100644
index 2fdd8a3..0000000
--- a/include/bitcoin/constants.hpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
- *
- * This file is part of libbitcoin.
- *
- * libbitcoin is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License with
- * additional permissions to the one published by the Free Software
- * Foundation, either version 3 of the License, or (at your option)
- * any later version. For more information see LICENSE.
- *
- * 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/>.
- */
-#ifndef LIBBITCOIN_CONSTANTS_HPP
-#define LIBBITCOIN_CONSTANTS_HPP
-
-#include <cstdint>
-
-#include <bitcoin/utility/big_number.hpp>
-
-namespace libbitcoin {
-
-constexpr uint32_t protocol_version = 60000;
-
-constexpr uint64_t block_reward = 50;
-// 210000 ~ 4 years / 10 minutes
-constexpr uint64_t reward_interval = 210000;
-
-constexpr size_t coinbase_maturity = 100;
-
-#ifdef ENABLE_TESTNET
-constexpr uint32_t protocol_port = 18333;
-#else
-constexpr uint32_t protocol_port = 8333;
-#endif
-
-// Threshold for nLockTime: below this value it is
-// interpreted as block number, otherwise as UNIX timestamp.
-// Tue Nov 5 00:53:20 1985 UTC
-constexpr uint32_t locktime_threshold = 500000000;
-
-constexpr uint64_t max_money_recursive(uint64_t current)
-{
- return (current > 0) ?
- current + max_money_recursive(current >> 1) : 0;
-}
-
-constexpr uint64_t coin_price(uint64_t value=1)
-{
- return value * 100000000;
-}
-
-constexpr uint64_t max_money()