dcrd/blockchain
Dave Collins 4da12163dc
blockchain: Make checkpoints configurable.
This modifies blockchain to expose a new field named Checkpoints in the
Config struct which allows the checkpoints to use to be specified by the
caller instead of assuming the checkpoint associated with the current
chain parameters.  This allows the caller to customize the checkpoints
as it sees fit, such as adding custom checkpoints or removing default
checkpoints.

In addition, this removes the DisableCheckpoints function in favor of
the caller simply configuring the chain instance without checkpoints
when they're disabled and updates the code to remove the associated flag
accordingly.  This produces simpler code and is faster since the mutex
that was required to protect the aforementioned flag is no longer
required.

Finally, this also paves the way to significantly simplify the
checkpoint finding logic and make further progress towards the overall
effort to decouple the connection code from the download logic.
2019-12-05 21:46:40 -06:00
..
chaingen multi: Updates for staticcheck results. 2019-10-31 15:14:35 -05:00
fullblocktests blockchain: Separate processing order tests. 2019-11-19 11:52:39 -06:00
indexers indexers: convert to contexts 2019-11-19 11:19:32 -06:00
internal blockchain: Implement v2 block filter storage. 2019-10-12 12:05:59 -05:00
stake multi: remove whitespace 2019-11-21 18:31:30 -06:00
standalone blockchain/standalone: Prepare v1.1.0. 2019-10-15 10:50:30 -05:00
testdata multi: Only use module-scoped data in tests. 2018-08-16 15:08:07 -05:00
accept.go stake: Start v3 module dev cycle. 2019-10-24 22:10:39 -05:00
agendas_test.go stake: Start v3 module dev cycle. 2019-10-24 22:10:39 -05:00
bench_test.go blockchain: Use skip list for ancestor traversal. 2019-11-23 04:17:55 -06:00
blockindex_test.go blockchain: Use skip list for ancestor traversal. 2019-11-23 04:17:55 -06:00
blockindex.go blockchain: Use skip list for ancestor traversal. 2019-11-23 04:17:55 -06:00
chain_test.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
chain.go blockchain: Make checkpoints configurable. 2019-12-05 21:46:40 -06:00
chainio_test.go blockchain: Rename KnownValid to HasValidated. 2019-11-19 11:48:29 -06:00
chainio.go blockchain: Rename KnownValid to HasValidated. 2019-11-19 11:48:29 -06:00
chainquery.go blockchain: Rename KnownValid to HasValidated. 2019-11-19 11:48:29 -06:00
chainview_test.go blockchain: removed unused params 2019-10-28 11:49:54 -05:00
chainview.go blockchain: Use skip list for ancestor traversal. 2019-11-23 04:17:55 -06:00
checkpoints.go blockchain: Make checkpoints configurable. 2019-12-05 21:46:40 -06:00
common_test.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
compress_test.go blockchain: Rework to use new db interface. 2016-08-18 15:42:18 -04:00
compress.go stake: Start v3 module dev cycle. 2019-10-24 22:10:39 -05:00
difficulty_test.go blockchain: Remove deprecated code. 2019-08-08 13:10:21 -05:00
difficulty.go blockchain: Remove easiest diff checkpoint checks. 2019-12-05 21:43:39 -06:00
doc.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
error_test.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
error.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
example_test.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
fullblocks_test.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
fullblocksstakeversion_test.go blockchain: Start v3 module dev cycle. 2019-10-24 21:15:06 -05:00
go.mod multi: Introduce initial sync min known chain work. 2019-11-19 18:09:00 -06:00
go.sum dcrutil: Start v3 module dev cycle. 2019-10-24 19:13:26 -05:00
headercmt_test.go multi: Implement header commitments and vote. 2019-10-12 12:06:02 -05:00
headercmt.go dcrutil: Start v3 module dev cycle. 2019-10-24 19:13:26 -05:00
log.go blockchain: Remove deprecated code. 2019-08-08 13:10:21 -05:00
mediantime_test.go blockchain: Consolidate tests into the main package. 2018-02-25 19:01:57 -06:00
mediantime.go multi: Correct typos. 2019-08-16 17:37:58 -05:00
notifications.go dcrutil: Start v3 module dev cycle. 2019-10-24 19:13:26 -05:00
process_test.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
process.go blockchain: Remove easiest diff checkpoint checks. 2019-12-05 21:43:39 -06:00
prune.go chain: Remove memory block node pruning. 2017-09-18 13:43:48 -05:00
README.md multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
scriptval.go blockchain: replace scriptval quit channel with context 2019-10-30 20:21:48 -05:00
sequencelock_test.go blockchain: removed unused params 2019-10-28 11:49:54 -05:00
sequencelock.go stake: Start v3 module dev cycle. 2019-10-24 22:10:39 -05:00
stakeext.go multi: resolve todos. 2019-10-27 16:34:24 -05:00
stakenode.go stake: Start v3 module dev cycle. 2019-10-24 22:10:39 -05:00
stakeversion_test.go blockchain: removed unused params 2019-10-28 11:49:54 -05:00
stakeversion.go blockchain: removed unused params 2019-10-28 11:49:54 -05:00
subsidy.go stake: Start v3 module dev cycle. 2019-10-24 22:10:39 -05:00
thresholdstate_test.go blockchain: Start v3 module dev cycle. 2019-10-24 21:15:06 -05:00
thresholdstate.go blockchain: Rename KnownValid to HasValidated. 2019-11-19 11:48:29 -06:00
timesorter_test.go blockchain: Consolidate tests into the main package. 2018-02-25 19:01:57 -06:00
timesorter.go multi: Correct typos. 2019-08-16 17:37:58 -05:00
upgrade.go blockchain: Rename KnownValid to HasValidated. 2019-11-19 11:48:29 -06:00
utxoviewpoint.go multi: add gettxoutsetinfo JSON-RPC. 2019-10-29 11:00:40 -05:00
validate_test.go multi: Decouple orphan handling from blockchain. 2019-12-05 21:38:29 -06:00
validate.go blockchain: Make checkpoints configurable. 2019-12-05 21:46:40 -06:00
votebits_test.go stake: Start v3 module dev cycle. 2019-10-24 22:10:39 -05:00
votebits.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00

blockchain

Build Status ISC License GoDoc

Package blockchain implements Decred block handling and chain selection rules. The test coverage is currently only around 60%, but will be increasing over time. See test_coverage.txt for the gocov coverage report. Alternatively, if you are running a POSIX OS, you can run the cov_report.sh script for a real-time report. Package blockchain is licensed under the liberal ISC license.

There is an associated blog post about the release of this package here.

This package has intentionally been designed so it can be used as a standalone package for any projects needing to handle processing of blocks into the decred block chain.

Installation and Updating

$ go get -u github.com/decred/dcrd/blockchain

Decred Chain Processing Overview

Before a block is allowed into the block chain, it must go through an intensive series of validation rules. The following list serves as a general outline of those rules to provide some intuition into what is going on under the hood, but is by no means exhaustive:

  • Reject duplicate blocks
  • Perform a series of sanity checks on the block and its transactions such as verifying proof of work, timestamps, number and character of transactions, transaction amounts, script complexity, and merkle root calculations
  • Compare the block against predetermined checkpoints for expected timestamps and difficulty based on elapsed time since the checkpoint
  • Perform a series of more thorough checks that depend on the block's position within the block chain such as verifying block difficulties adhere to difficulty retarget rules, timestamps are after the median of the last several blocks, all transactions are finalized, checkpoint blocks match, and block versions are in line with the previous blocks
  • Determine how the block fits into the chain and perform different actions accordingly in order to ensure any side chains which have higher difficulty than the main chain become the new main chain
  • When a block is being connected to the main chain (either through reorganization of a side chain to the main chain or just extending the main chain), perform further checks on the block's transactions such as verifying transaction duplicates, script complexity for the combination of connected scripts, coinbase maturity, double spends, and connected transaction values
  • Run the transaction scripts to verify the spender is allowed to spend the coins
  • Insert the block into the block database

Examples

  • ProcessBlock Example Demonstrates how to create a new chain instance and use ProcessBlock to attempt to add a block to the chain. This example intentionally attempts to insert a duplicate genesis block to illustrate how an invalid block is handled.

License

Package blockchain is licensed under the copyfree ISC License.