README

bchd

Build Status Go Report Card ISC License GoDoc

bchd is an alternative full node bitcoin cash implementation written in Go (golang).

This project is a port of the btcd codebase to Bitcoin Cash. It provides a high powered and reliable blockchain server which makes it a suitable backend to serve blockchain data to lite clients and block explorers or to power your local wallet.

bchd does not include any wallet functionality by design as it makes the codebase more modular and easy to maintain. The bchwallet is a separate application that provides a secure Bitcoin Cash wallet that communicates with your running bchd instance via the API.

Table of Contents

Requirements

Go 1.12.17 or newer.

Install

Install Pre-built Packages

The easiest way to run the server is to download a pre-built binary. You can find binaries of our latest release for each operating system at the releases page.

Build from Source

If you prefer to install from source do the following:

  • Install Go according to the installation instructions here: http://golang.org/doc/install

  • Run the following commands to obtain bchd, all dependencies, and install it:

go get github.com/gcash/bchd

This will download the source code into your GOPATH and compile bchd and install it in your path.

For developers if you wish to place the working directory outside your GOPATH you can do so with Go >=1.12.x as follows:

mkdir workspace
cd workspace
git clone https://github.com/gcash/bchd.git
cd bchd
go install (or build or run, etc)

Dependencies will be automatically installed to $GOPATH/pkg/mod.

If you are a bchd contributor and would like to change the default config file (bchd.conf), make any changes to sample-bchd.conf and then run the following commands:

go-bindata sample-bchd.conf  # requires github.com/go-bindata/go-bindata/
gofmt -s -w bindata.go

Getting Started

To start bchd with default options just run:

./bchd

You'll find a large number of runtime options with the help flag. All of them can also be set in a config file. See the sample config file for an example of how to use it.

./bchd --help

You can use the common json RPC interface through the bchctl command:

./bchctl --help

./bchctl --listcommands

Bchd separates the node and the wallet. Commands for the wallet will work when you are also running bchwallet:

./bchctl -u username -P password --wallet getnewaddress

Docker

Building and running bchd in docker is quite painless. To build the image:

docker build . -t bchd

To run the image:

docker run bchd

To run bchctl and connect to your bchd instance:

# Find the running bchd container.
docker ps

# Exec bchctl.
docker exec <container> bchctl <command>

Documentation

The documentation is a work-in-progress. It is located in the docs folder.

Contributing

Contributions are definitely welcome! Please read the contributing guidelines before starting.

Security Disclosures

To report security issues please contact:

Chris Pacia (ctpacia@gmail.com) - GPG Fingerprint: 0150 2502 DD3A 928D CE52 8CB9 B895 6DBF EE7C 105C

or

Josh Ellithorpe (quest@mac.com) - GPG Fingerprint: B6DE 3514 E07E 30BB 5F40 8D74 E49B 7E00 0022 8DDD

License

bchd is licensed under the copyfree ISC License.

Documentation

Overview

    bchd is a full-node bitcoin cash implementation written in Go.

    The default options are sane for most users. This means bchd will work 'out of the box' for most users. However, there are also a wide variety of flags that can be used to control it.

    The following section provides a usage overview which enumerates the flags. An interesting point to note is that the long form of all of these options (except -C) can be specified in a configuration file that is automatically parsed when bchd starts up. By default, the configuration file is located at ~/.bchd/bchd.conf on POSIX-style operating systems and %LOCALAPPDATA%\bchd\bchd.conf on Windows. The -C (--configfile) flag, as shown below, can be used to override this location.

    Usage:

    bchd [OPTIONS]
    

    Application Options:

    -V, --version             Display version information and exit
    -C, --configfile=         Path to configuration file
    -b, --datadir=            Directory to store data
        --logdir=             Directory to log output.
    -a, --addpeer=            Add a peer to connect with at startup
        --connect=            Connect only to the specified peers at startup
        --nolisten            Disable listening for incoming connections -- NOTE:
                              Listening is automatically disabled if the --connect
                              or --proxy options are used without also specifying
                              listen interfaces via --listen
        --listen=             Add an interface/port to listen for connections
                              (default all interfaces port: 8333, testnet: 18333)
        --maxpeers=           Max number of inbound and outbound peers (125)
        --nobanning           Disable banning of misbehaving peers
        --banduration=        How long to ban misbehaving peers.  Valid time units
                              are {s, m, h}.  Minimum 1 second (24h0m0s)
        --banthreshold=       Maximum allowed ban score before disconnecting and
                              banning misbehaving peers.
        --whitelist=          Add an IP network or IP that will not be banned.
                              (eg. 192.168.1.0/24 or ::1)
    -u, --rpcuser=            Username for RPC connections
    -P, --rpcpass=            Password for RPC connections
        --rpclimituser=       Username for limited RPC connections
        --rpclimitpass=       Password for limited RPC connections
        --rpclisten=          Add an interface/port to listen for RPC connections
                              (default port: 8334, testnet: 18334)
        --rpccert=            File containing the certificate file
        --rpckey=             File containing the certificate key
        --rpcmaxclients=      Max number of RPC clients for standard connections
                              (10)
        --rpcmaxwebsockets=   Max number of RPC websocket connections (25)
        --rpcquirks           Mirror some JSON-RPC quirks of Bitcoin Core -- NOTE:
                              Discouraged unless interoperability issues need to
                              be worked around
        --norpc               Disable built-in RPC server -- NOTE: The RPC server
                              is disabled by default if no rpcuser/rpcpass or
                              rpclimituser/rpclimitpass is specified
        --notls               Disable TLS for the RPC server -- NOTE: This is only
                              allowed if the RPC server is bound to localhost
        --nodnsseed           Disable DNS seeding for peers
        --externalip=         Add an ip to the list of local addresses we claim to
                              listen on to peers
        --proxy=              Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)
        --proxyuser=          Username for proxy server
        --proxypass=          Password for proxy server
        --onion=              Connect to tor hidden services via SOCKS5 proxy
                              (eg. 127.0.0.1:9050)
        --onionuser=          Username for onion proxy server
        --onionpass=          Password for onion proxy server
        --noonion             Disable connecting to tor hidden services
        --torisolation        Enable Tor stream isolation by randomizing user
                              credentials for each connection.
        --testnet             Use the test network
        --regtest             Use the regression test network
        --simnet              Use the simulation test network
        --addcheckpoint=      Add a custom checkpoint.  Format: '<height>:<hash>'
        --nocheckpoints       Disable built-in checkpoints.  Don't do this unless
                              you know what you're doing.
        --uacomment=          Comment to add to the user agent --
                              See BIP 14 for more information.
        --dbtype=             Database backend to use for the Block Chain (ffldb)
        --profile=            Enable HTTP profiling on given port -- NOTE port
                              must be between 1024 and 65536
        --cpuprofile=         Write CPU profile to the specified file
    -d, --debuglevel=         Logging level for all subsystems {trace, debug,
                              info, warn, error, critical} -- You may also specify
                              <subsystem>=<level>,<subsystem2>=<level>,... to set
                              the log level for individual subsystems -- Use show
                              to list available subsystems (info)
        --upnp                Use UPnP to map our listening port outside of NAT
        --minrelaytxfee=      The minimum transaction fee in BCH/kB to be
                              considered a non-zero fee.
        --limitfreerelay=     Limit relay of transactions with no transaction fee
                              to the given amount in thousands of bytes per
                              minute (15)
        --norelaypriority     Do not require free or low-fee transactions to have
                              high priority for relaying
        --maxorphantx=        Max number of orphan transactions to keep in memory
                              (100)
        --generate            Generate (mine) bitcoins using the CPU
        --miningaddr=         Add the specified payment address to the list of
                              addresses to use for generated blocks -- At least
                              one address is required if the generate option is
                              set
        --blockminsize=       Mininum block size in bytes to be used when creating
                              a block
        --blockmaxsize=       Maximum block size in bytes to be used when creating
                              a block (750000)
        --blockprioritysize=  Size in bytes for high-priority/low-fee transactions
                              when creating a block (50000)
        --nopeerbloomfilters  Disable bloom filtering support.
        --nocfilters          Disable committed filtering (CF) support.
        --sigcachemaxsize=    The maximum number of entries in the signature
                              verification cache.
        --blocksonly          Do not accept transactions from remote peers.
        --relaynonstd         Relay non-standard transactions regardless of the
                              default settings for the active network.
        --rejectnonstd        Reject non-standard transactions regardless of the
                              default settings for the active network.
    

    Help Options:

    -h, --help           Show this help message
    

    Directories

    Path Synopsis
    Package addrmgr implements concurrency safe Bitcoin Cash address manager.
    Package addrmgr implements concurrency safe Bitcoin Cash address manager.
    Package bchec implements support for the elliptic curves needed for bitcoin.
    Package bchec implements support for the elliptic curves needed for bitcoin.
    pb
    Package blockchain implements bitcoin block handling and chain selection rules.
    Package blockchain implements bitcoin block handling and chain selection rules.
    fullblocktests
    Package fullblocktests provides a set of block consensus validation tests.
    Package fullblocktests provides a set of block consensus validation tests.
    indexers
    Package indexers implements optional block chain indexes.
    Package indexers implements optional block chain indexes.
    Package btcjson provides primitives for working with the bitcoin JSON-RPC API.
    Package btcjson provides primitives for working with the bitcoin JSON-RPC API.
    Package chaincfg defines chain configuration parameters.
    Package chaincfg defines chain configuration parameters.
    chainhash
    Package chainhash provides abstracted hash functionality.
    Package chainhash provides abstracted hash functionality.
    cmd
    Package connmgr implements a generic Bitcoin network connection manager.
    Package connmgr implements a generic Bitcoin network connection manager.
    Package database provides a block and metadata storage database.
    Package database provides a block and metadata storage database.
    ffldb
    Package ffldb implements a driver for the database package that uses leveldb for the backing metadata and flat files for block storage.
    Package ffldb implements a driver for the database package that uses leveldb for the backing metadata and flat files for block storage.
    rpctest
    Package rpctest provides a btcd-specific RPC testing harness crafting and executing integration tests by driving a `bchd` instance via the `RPC` interface.
    Package rpctest provides a btcd-specific RPC testing harness crafting and executing integration tests by driving a `bchd` instance via the `RPC` interface.
    Package mempool provides a policy-enforced pool of unmined bitcoin cash transactions.
    Package mempool provides a policy-enforced pool of unmined bitcoin cash transactions.
    Package netsync implements a concurrency safe block syncing protocol.
    Package netsync implements a concurrency safe block syncing protocol.
    Package peer provides a common base for creating and managing Bitcoin cash network peers.
    Package peer provides a common base for creating and managing Bitcoin cash network peers.
    Package rpcclient implements a websocket-enabled Bitcoin JSON-RPC client.
    Package rpcclient implements a websocket-enabled Bitcoin JSON-RPC client.
    Package txscript implements the bitcoin transaction script language.
    Package txscript implements the bitcoin transaction script language.
    Package wire implements the bitcoin wire protocol.
    Package wire implements the bitcoin wire protocol.