dcrd/blockchain
Dave Collins eea386e4e9
blockchain: Implement v2 block filter storage.
This modifies the chain logic to create and store version 2 block
filters for all new blocks and also adds code to migrate the database to
retroactively create and store the v2 filters for all historical blocks.

Since this requires a database upgrade and the next release of the
software will include a vote to change the consensus rules, this also
takes the opportunity to unmark all blocks previously marked as having
failed validation so they are eligible for validation again under what
will likely become new consensus rules.  This ensures clients that did
not update prior to new rules activating are able to automatically
recover under the new rules without having to download the entire chain
again.

The following is a high level overview of the changes:

- Introduce a new database bucket to house v2 block filters
- Make UtxoViewpoint satisfy the PrevScripter interface so it may be
  used as a source previous scripts when creating filters
- Create and store the new filters in the db when connecting blocks
- Introduce exported function named FilterByBlockHash to retrieve the
  new block filters so they are available to be served in the future
- Implement database migration code to retroactively create the new
  filters for all historical blocks
  - Bump the chain database version to 6
  - Introduce code to allow spent txout entries from the spend journal
    to be used as a source of previous scripts to significantly optimize
    the filter creation as compared to what would be required to
    reconstruct all the utxo views as of each block
  - Mark all blocks that failed validation under the current consensus
    rules as eligible for validation again
- Export a new constant named HeaderCmtFilterIndex which indicates the
  header proof index for the upcoming filter header commitment
2019-10-12 12:05:59 -05:00
..
chaingen build: Replace TravisCI with CI via Github actions. 2019-09-20 19:59:04 -05:00
fullblocktests chaincfg: Introduce agenda for header cmtmts vote. 2019-10-12 12:03:25 -05:00
indexers build: Replace TravisCI with CI via Github actions. 2019-09-20 19:59:04 -05:00
internal blockchain: Implement v2 block filter storage. 2019-10-12 12:05:59 -05:00
stake build: Replace TravisCI with CI via Github actions. 2019-09-20 19:59:04 -05:00
standalone blockchain/standalone: Add inclusion proof funcs. 2019-10-12 12:05:58 -05:00
testdata multi: Only use module-scoped data in tests. 2018-08-16 15:08:07 -05:00
accept.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
agendas_test.go multi: Implement combined merkle root and vote. 2019-10-12 12:05:57 -05:00
bench_test.go blockchain: Consolidate tests into the main package. 2018-02-25 19:01:57 -06:00
blockindex_test.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
blockindex.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
chain_test.go release: Introduce blockchain v2 module. 2019-08-08 13:10:22 -05:00
chain.go blockchain: Implement v2 block filter storage. 2019-10-12 12:05:59 -05:00
chainio_test.go multi: Correct typos. 2019-08-22 10:20:03 -05:00
chainio.go blockchain: Implement v2 block filter storage. 2019-10-12 12:05:59 -05:00
chainquery.go multi: Break blockchain dependency on dcrjson. 2018-10-10 16:44:20 -05:00
chainview_test.go multi: Correct typos. 2019-08-16 17:37:58 -05:00
chainview.go multi: Correct typos. 2019-08-22 10:20:03 -05:00
checkpoints.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
common_test.go multi: Correct typos. 2019-08-16 17:37:58 -05:00
compress_test.go blockchain: Rework to use new db interface. 2016-08-18 15:42:18 -04:00
compress.go multi: Use secp256k1/v2 module. 2019-10-08 10:14:13 -05:00
difficulty_test.go blockchain: Remove deprecated code. 2019-08-08 13:10:21 -05:00
difficulty.go multi: remove unused funcs and vars 2019-09-05 10:13:18 -05:00
doc.go blockchain: Update doc.go to reflect reality. 2019-08-08 13:10:19 -05:00
error_test.go multi: Cleanup and optimize tx input check code. 2018-09-26 09:23:03 -05:00
error.go blockchain: Implement v2 block filter storage. 2019-10-12 12:05:59 -05:00
example_test.go multi: Correct typos. 2019-08-16 17:37:58 -05:00
fullblocks_test.go release: Introduce blockchain v2 module. 2019-08-08 13:10:22 -05:00
fullblocksstakeversion_test.go release: Introduce blockchain v2 module. 2019-08-08 13:10:22 -05:00
go.mod multi: Implement combined merkle root and vote. 2019-10-12 12:05:57 -05:00
go.sum multi: Use secp256k1/v2 module. 2019-10-08 10:14:13 -05:00
headercmt.go blockchain: Implement v2 block filter storage. 2019-10-12 12:05:59 -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 multi: Correct typos. 2019-08-22 10:20:03 -05:00
process.go multi: Correct typos. 2019-08-22 10:20:03 -05:00
prune.go chain: Remove memory block node pruning. 2017-09-18 13:43:48 -05:00
README.md build: Replace TravisCI with CI via Github actions. 2019-09-20 19:59:04 -05:00
scriptval.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
sequencelock_test.go multi: Correct typos. 2019-08-16 17:37:58 -05:00
sequencelock.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
stakeext.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
stakenode.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
stakeversion_test.go blockchain: Use lastest major version deps. 2019-08-08 13:10:20 -05:00
stakeversion.go multi: Remove unused code. 2018-10-31 21:50:09 -04:00
subsidy.go blockchain: Remove deprecated code. 2019-08-08 13:10:21 -05:00
thresholdstate_test.go multi: Correct typos. 2019-08-22 10:20:03 -05:00
thresholdstate.go multi: Implement combined merkle root and vote. 2019-10-12 12:05:57 -05: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: Implement v2 block filter storage. 2019-10-12 12:05:59 -05:00
utxoviewpoint.go blockchain: Implement v2 block filter storage. 2019-10-12 12:05:59 -05:00
validate_test.go multi: Correct typos. 2019-08-16 17:37:58 -05:00
validate.go multi: Implement combined merkle root and vote. 2019-10-12 12:05:57 -05:00
votebits_test.go multi: Correct typos. 2019-08-22 10:20:03 -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
  • Save the most recent orphan blocks for a limited time in case their parent blocks become available
  • Stop processing if the block is an orphan as the rest of the processing depends on the block's position within the block chain
  • 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.