[BREAKGLASS] Append-only mirror of github.com/seedhammer/dcrd
Go to file
Donald Adu-Poku 2c146946bc mempool: Optimize orphan map limiting.
This optimizes the way in which the mempool oprhan map is limited in the
same way the server block manager maps were previously optimized.

Previously the code would read a cryptographically random value large
enough to construct a hash, find the first entry larger than that value,
and evict it.

That approach is quite inefficient and could easily become a
bottleneck when processing transactions due to the need to read from a
source such as /dev/urandom and all of the subsequent hash comparisons.

Luckily, strong cryptographic randomness is not needed here. The primary
intent of limiting the maps is to control memory usage with a secondary
concern of making it difficult for adversaries to force eviction of
specific entries.

Consequently, this changes the code to make use of the pseudorandom
iteration order of Go's maps along with the preimage resistance of the
hashing function to provide the desired functionality.  It has
previously been discussed that the specific pseudorandom iteration order
is not guaranteed by the Go spec even though in practice that is how it
is implemented.  This is not a concern however because even if the
specific compiler doesn't implement that, the preimage resistance of the
hashing function alone is enough.

The following is a before and after comparison of the function for both
speed and memory allocations:

benchmark                    old ns/op     new ns/op     delta
----------------------------------------------------------------
BenchmarkLimitNumOrphans     3727          243           -93.48%

benchmark                    old allocs    new allocs    delta
-----------------------------------------------------------------
BenchmarkLimitNumOrphans     4             0             -100.00%
2018-03-03 23:51:56 +00:00
addrmgr addrmgr: Improve test coverage. 2018-03-01 22:05:29 -06:00
blockchain chaingen: Track expected blk heights separately. 2018-03-01 20:13:56 -06:00
bloom docs: document packages and fix typo 2018-01-08 16:04:45 -06:00
certgen certgen: Add doc.go and README.md (#883) 2017-10-11 11:32:50 -04:00
chaincfg mempool: Rename RelayNonStd config option. 2018-02-14 15:55:22 +00:00
cmd multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
connmgr connmgr: convert state to atomic 2018-02-13 14:50:33 -06:00
database multi: fix some maligned linter warnings 2018-02-13 14:50:33 -06:00
dcrec multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
dcrjson multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
dcrutil multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
docs docs: document how to use go test -coverprofile 2018-03-01 20:26:39 -06:00
hdkeychain multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
limits docs: document packages and fix typo 2018-01-08 16:04:45 -06:00
mempool mempool: Optimize orphan map limiting. 2018-03-03 23:51:56 +00:00
mining mining/mempool: Move priority code to mining pkg. 2018-03-03 00:18:01 -06:00
peer multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
release Add example service files. 2017-03-23 02:07:08 -05:00
rpcclient multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
rpctest multi: fix some maligned linter warnings 2018-02-13 14:50:33 -06:00
sampleconfig multi: Rename BIP0111Version to NodeBloomVersion. 2018-03-02 22:29:14 -06:00
txscript multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
wire multi: Rename BIP0111Version to NodeBloomVersion. 2018-03-02 22:29:14 -06:00
.dockerignore Run testing and linting in a Dockerfile. 2017-05-30 11:39:19 -04:00
.gitignore Import dcrutil repo under dcrutil directory. 2017-10-11 21:29:08 -04:00
.travis.yml travis: test in docker container 2018-02-18 10:27:18 -06:00
blocklogger.go Merge remaining dcrutil code into a dcrd package. 2017-10-11 22:06:36 -04:00
blockmanager.go multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
CHANGES multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
config.go Expand ~ to correct home directory on all OSes. 2018-02-22 20:35:44 -06:00
cpuminer.go Merge remaining dcrutil code into a dcrd package. 2017-10-11 22:06:36 -04:00
dcrd.go blockchain/indexers: Allow interrupts. 2018-02-18 11:18:52 -06:00
doc.go multi: Properly capitalize Decred. 2018-03-01 17:41:35 -06:00
Dockerfile-1.9 travis: test in docker container 2018-02-18 10:27:18 -06:00
Dockerfile-1.10 travis: test in docker container 2018-02-18 10:27:18 -06:00
Gopkg.lock dep: sync 2018-02-26 19:33:48 -06:00
Gopkg.toml dep: sync 2018-02-26 19:33:48 -06:00
ipc.go travis: add ineffassign linter 2017-12-01 09:14:04 -05:00
LICENSE Import dcrutil repo under dcrutil directory. 2017-10-11 21:29:08 -04:00
log.go multi: remove unused funcs and vars 2017-12-07 21:46:25 -06:00
mining_test.go mining_test: add edge conditions from btcd. 2017-08-31 00:28:36 -05:00
mining.go mining/mempool: Move priority code to mining pkg. 2018-03-03 00:18:01 -06:00
miningerror.go blockchain: Rework to use new db interface. 2016-08-18 15:42:18 -04: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 rpcserver: Add dcrd version info to getversion RPC. 2018-03-01 19:41:07 -06:00
rpcserverhelp_test.go blockchain: Rework to use new db interface. 2016-08-18 15:42:18 -04:00
rpcserverhelp.go rpcserver: Correct getblockheader result text. 2018-03-02 00:13:47 -06:00
rpcwebsocket.go multi: fix misspell linter warnings 2018-02-18 12:26:52 -06:00
run_tests.sh travis: test in docker container 2018-02-18 10:27:18 -06:00
server.go multi: Rename BIP0111Version to NodeBloomVersion. 2018-03-02 22:29:14 -06: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 build: Correct semver build handling. 2018-03-01 19:41:05 -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.