Go to file
Dave Collins c6b5f6df0d
blockchain: Refactor db main chain idx to blk idx.
This refactors the code that relies on the database main chain index to
use the in-memory block index now that the full index is in memory.

This is a major optimization for several functions because they no
longer have to first consult the database (which is incredibly slow in
many cases due to the way leveldb splits all of the information across
files) to perform lookups and determine if blocks are in the main chain.

It should also be noted that even though the main chain index is no
longer used as of this commit, the code which writes the main chain
index entries to the database in connectBlock, disconnectBlock, and
createChainState have not been removed because, once that is done, it
will no longer be possible to downgrade and thus those changes must be
performed along with a database migration and associated version bump.

An overview of the changes are as follows:

- Update all code which previously used the db to use the main chain by
  height map instead
- Update several internal functions which previously accepted the
  hash to instead accept the block node as the parameter
  - Rename fetchMainChainBlockByHash to fetchMainChainBlockByNode
  - Rename fetchBlockByHash to fetchBlockByNode
  - Rename dbFetchBlockByHash to dbFetchBlockByNode
  - Update all callers to use the new names and semantics
- Optimize HeaderByHeight to use block index/height map instead of db
  - Move to chain.go since it no longer involves database I/O
- Optimize BlockByHash to use block index instead of db
  - Move to chain.go since it no longer involves database I/O
- Optimize BlockByHeight to use block index/height map instead of db
  - Move to chain.go since it no longer involves database I/O
- Optimize MainChainHasBlock to use block index instead of db
  - Move to chain.go since it no longer involves database I/O
  - Removed error return since it can no longer fail
- Optimize BlockHeightByHash to use block index instead of db
  - Move to chain.go since it no longer involves database I/O
- Optimize BlockHashByHeight to use block index instead of db
  - Move to chain.go since it no longer involves database I/O
- Optimize HeightRange to use block index instead of db
  - Move to chain.go since it no longer involves database I/O
- Remove several unused functions related to the main chain index
  - dbFetchHeaderByHash
  - DBFetchHeaderByHeight
  - dbFetchBlockByHeight
  - DBFetchBlockByHeight
  - dbMainChainHasBlock
  - DBMainChainHasBlock
- Rework IsCheckpointCandidate to use block index
- Modify the upgrade code to expose the old dbFetchBlockByHeight
  function only in the local scope since upgrades require the ability to
  read the old format
- Update indexers to fetch the blocks themselves while only querying
  chain for chain-related details
2018-07-06 11:44:21 -05:00
addrmgr addrmgr: skip never-successful addresses 2018-06-26 19:13:31 -05:00
blockchain blockchain: Refactor db main chain idx to blk idx. 2018-07-06 11:44:21 -05:00
certgen multi: Define vgo modules. 2018-05-25 15:38:16 -05:00
chaincfg multi: Remove unused secp256k1 sig parse parameter. 2018-07-04 12:27:34 -05:00
cmd multi: Use saner permissions saving certs. 2018-06-05 10:32:33 -05:00
connmgr multi: Define vgo modules. 2018-05-25 15:38:16 -05:00
database multi: Define vgo modules. 2018-05-25 15:38:16 -05:00
dcrec multi: Remove unused secp256k1 sig parse parameter. 2018-07-04 12:27:34 -05:00
dcrjson dcrjson: Ready GetStakeInfoResult for SPV wallets. 2018-07-03 10:10:51 -04:00
dcrutil multi: Continue conversion from chainec to dcrec. 2018-07-04 11:21:43 -04:00
docs multi: add amount field to TransactionInput. 2018-06-21 23:54:42 +00:00
gcs multi: Define vgo modules. 2018-05-25 15:38:16 -05:00
hdkeychain multi: Continue conversion from chainec to dcrec. 2018-07-04 11:21:43 -04:00
limits docs: document packages and fix typo 2018-01-08 16:04:45 -06:00
mempool multi: Continue conversion from chainec to dcrec. 2018-07-04 11:21:43 -04:00
mining multi: Define vgo modules. 2018-05-25 15:38:16 -05:00
peer peer: Improve net address service adverts. 2018-06-04 18:17:34 -05:00
release Add example service files. 2017-03-23 02:07:08 -05:00
rpcclient rpcclient: Implement fmt.Stringer for Client 2018-06-14 16:45:52 -05:00
rpctest multi: add valueIn parameter to wire.NewTxIn. 2018-06-15 19:13:41 -05:00
sampleconfig config: Fix typo 2018-06-09 15:20:44 -05:00
txscript multi: Remove unused secp256k1 sig parse parameter. 2018-07-04 12:27:34 -05:00
wire multi: add valueIn parameter to wire.NewTxIn. 2018-06-15 19:13:41 -05:00
.dockerignore Run testing and linting in a Dockerfile. 2017-05-30 11:39:19 -04:00
.gitignore Improve gitignore. 2017-10-11 14:52:00 -05:00
.travis.yml travis: test in docker container 2018-02-18 10:27:18 -06:00
blocklogger.go multi: Replace btclog with slog. 2018-05-23 14:22:10 -05:00
blockmanager.go multi: add specialized rebroadcast handling for stake txs. 2018-07-05 23:20:00 -05:00
CHANGES multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
config.go multi: Replace btclog with slog. 2018-05-23 14:22:10 -05:00
cpuminer.go cpuminer: Use header for extra nonce. 2018-03-05 12:59:32 -06:00
dcrd.go main: Correct mem profile error message. 2018-05-03 08:17:12 +08:00
doc.go multi: Remove everything to do about bloom filters. 2018-05-01 11:43:32 -05:00
Dockerfile-1.9 travis: simplify Docker files 2018-06-11 01:01:51 -05:00
Dockerfile-1.10 travis: simplify Docker files 2018-06-11 01:01:51 -05:00
go.mod build: Update some vgo dependencies to use tags. 2018-05-24 11:18:33 -05:00
go.modverify build: Update some vgo dependencies to use tags. 2018-05-24 11:18:33 -05:00
Gopkg.lock build: Update some vgo dependencies to use tags. 2018-05-24 11:18:33 -05:00
Gopkg.toml build: Update some vgo dependencies to use tags. 2018-05-24 11:18:33 -05:00
ipc.go travis: add ineffassign linter 2017-12-01 09:14:04 -05:00
LICENSE multi: Add initial committed filter (CF) support 2018-03-30 13:52:12 -04:00
log.go multi: Replace btclog with slog. 2018-05-23 14:22:10 -05:00
mining_test.go mining_test: add edge conditions from btcd. 2017-08-31 00:28:36 -05:00
mining.go blockchain: Combine block by hash functions. 2018-07-02 14:25:30 -05:00
miningerror.go blockchain: Rework to use new db interface. 2016-08-18 15:42:18 -04:00
networkparams_test.go main: verify network pow limits 2018-06-15 16:54:59 -05:00
params.go multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
README.md Adjust README.md for new Go version 2018-03-01 20:15:08 -06:00
rpcserver_test.go rpctest: Gate rpctest-based behind a build tag. 2017-07-26 12:43:26 -05:00
rpcserver.go blockchain: Refactor db main chain idx to blk idx. 2018-07-06 11:44:21 -05:00
rpcserverhelp_test.go blockchain: Rework to use new db interface. 2016-08-18 15:42:18 -04:00
rpcserverhelp.go multi: add amount field to TransactionInput. 2018-06-21 23:54:42 +00:00
rpcwebsocket.go rpc: Use upstream gorilla/websocket. 2018-05-23 19:35:36 -05:00
run_tests.sh travis: test in docker container 2018-02-18 10:27:18 -06:00
server.go multi: add specialized rebroadcast handling for stake txs. 2018-07-05 23:20:00 -05:00
service_windows.go multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
signal.go dcrd: Simplify shutdown signal handling logic sync. 2016-11-18 12:06:55 -06:00
signalsigterm.go Add pipes for parent process IPC. (#311) 2016-08-31 10:45:16 -04:00
upnp.go multi: Error descriptions are in lower case. 2017-09-08 18:03:59 +02:00
version.go release: Bump for v1.2.0. 2018-03-07 13:19:37 -06:00

dcrd

Build Status ISC License GoDoc

dcrd is a Decred full node implementation written in Go (golang).

This acts as a chain daemon for the Decred cryptocurrency. dcrd maintains the entire past transactional ledger of Decred and allows relaying of transactions to other Decred nodes across the world. To read more about Decred please see the project documentation.

Note: To send or receive funds and join Proof-of-Stake mining, you will also need dcrwallet.

This project is currently under active development and is in a Beta state. It is extremely stable and has been in production use since February 2016.

It is forked from btcd which is a bitcoin full node implementation written in Go. btcd is a ongoing project under active development. Because dcrd is constantly synced with btcd codebase, it will get the benefit of btcd's ongoing upgrades to peer and connection handling, database optimization and other blockchain related technology improvements.

Requirements

Go 1.9 or newer.

Getting Started

  • dcrd (and utilities) will now be installed in either $GOROOT/bin or $GOPATH/bin depending on your configuration. If you did not already add the bin directory to your system path during Go installation, we recommend you do so now.

Updating

Windows

Install a newer MSI

Linux/BSD/MacOSX/POSIX - Build from Source

  • Dep

    Dep is used to manage project dependencies and provide reproducible builds. To install:

    go get -u github.com/golang/dep/cmd/dep

Unfortunately, the use of dep prevents a handy tool such as go get from automatically downloading, building, and installing the source in a single command. Instead, the latest project and dependency sources must be first obtained manually with git and dep, and then go is used to build and install the project.

Getting the source:

For a first time installation, the project and dependency sources can be obtained manually with git and dep (create directories as needed):

git clone https://github.com/decred/dcrd $GOPATH/src/github.com/decred/dcrd
cd $GOPATH/src/github.com/decred/dcrd
dep ensure
go install . ./cmd/...

To update an existing source tree, pull the latest changes and install the matching dependencies:

cd $GOPATH/src/github.com/decred/dcrd
git pull
dep ensure
go install . ./cmd/...

For more information about Decred and how to set up your software please go to our docs page at docs.decred.org.

Docker

All tests and linters may be run in a docker container using the script run_tests.sh. This script defaults to using the current supported version of go. You can run it with the major version of Go you would like to use as the only arguement to test a previous on a previous version of Go (generally Decred supports the current version of Go and the previous one).

./run_tests.sh 1.9

To run the tests locally without docker:

./run_tests.sh local

Contact

If you have any further questions you can find us at:

  • irc.freenode.net (channel #decred)
  • webchat
  • forum.decred.org
  • decred.slack.com

Issue Tracker

The integrated github issue tracker is used for this project.

Documentation

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

License

dcrd is licensed under the copyfree ISC License.