Skip to content

blockchain: Overhaul and update to sync to btcd.#284

Merged
cjepson merged 3 commits intodecred:masterfrom
cjepson:cj_060616blockchain2
Aug 23, 2016
Merged

blockchain: Overhaul and update to sync to btcd.#284
cjepson merged 3 commits intodecred:masterfrom
cjepson:cj_060616blockchain2

Conversation

@cjepson
Copy link
Contributor

@cjepson cjepson commented Jul 7, 2016

Before merging, the following components will be synced in from btcd:

  • Database architectural overhaul
  • Integration of the new database and updating of the underlying consensus code
  • Make the database more easily upgradeable by tracking version of the database and the script compression algorithm
  • Integration of the new indexers for transactions, the address index, and a new address index tracking ever used addresses
  • Removal of the old database and replacing it with the new database everywhere in the codebase

After this is complete, work can begin on overhauling the ticket memory database so that instead uses the new ticket treap.

@cjepson cjepson force-pushed the cj_060616blockchain2 branch from b67d01f to 8dec241 Compare July 7, 2016 20:05
@jcvernaleo
Copy link
Member

I've been trying to test this on one of my testnet nodes (bitrig, i3, slow spinning disk).
IBD took a few hours (not bad for that machine). Since I didn't have my wallet on the correct commit I went back to master and it took about 12 minutes to resync the ticket db.
Got my wallet correct the next day and I restarted daemon on this branch. So the block db is about 1 day behind and it needed to resync the ticket db (after I deleted the old file). It has been on the line:

13:53:15 2016-07-13 [INF] STKE: Db non-empty, resyncing ticket DB

for the last 18 hours. That is longer than an IDB would take so I tend to think something is wrong.

@jcvernaleo jcvernaleo added this to the v0.3.0 milestone Jul 22, 2016
@marcopeereboom marcopeereboom modified the milestones: future, v0.3.0 Jul 29, 2016
@cjepson cjepson force-pushed the cj_060616blockchain2 branch from 0019ddc to 76f0cdc Compare August 9, 2016 19:10
@marcopeereboom marcopeereboom modified the milestones: 0.4.0, future Aug 10, 2016
// First, check the cache.
s.subsidyCacheLock.RLock()
if cachedValue, existsInCache := s.subsidyCache[iteration]; existsInCache {
subsidy := cachedValue
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cachedValue is already a copy, so there is no need to copy it again. You can just delete this and do:

    s.subsidyCacheLock.RUnlock()
    return cachedValue

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, I'd just make this consistent with the code below by only doing the unlock once around the assignments:

s.subsidyCacheLock.RLock()
cachedValue, existsInCache := s.subsidyCache[iteration];
s.subsidyCacheLock.RUnlock()
if existsInCache {
    return cachedValue
}

@cjepson cjepson force-pushed the cj_060616blockchain2 branch 2 times, most recently from 2aeb057 to 209e6a6 Compare August 12, 2016 16:31
This commit is the first stage of several that are planned to convert
the blockchain package into a concurrent safe package that will
ultimately allow support for multi-peer download and concurrent chain
processing.  The goal is to update btcd proper after each step so it can
take advantage of the enhancements as they are developed.

In addition to the aforementioned benefit, this staged approach has been
chosen since it is absolutely critical to maintain consensus.
Separating the changes into several stages makes it easier for reviewers
to logically follow what is happening and therefore helps prevent
consensus bugs.  Naturally there are significant automated tests to help
prevent consensus issues as well.

The main focus of this stage is to convert the blockchain package to use
the new database interface and implement the chain-related functionality
which it no longer handles.  It also aims to improve efficiency in
various areas by making use of the new database and chain capabilities.

The following is an overview of the chain changes:

- Update to use the new database interface
- Add chain-related functionality that the old database used to handle
  - Main chain structure and state
  - Transaction spend tracking
- Implement a new pruned unspent transaction output (utxo) set
  - Provides efficient direct access to the unspent transaction outputs
  - Uses a domain specific compression algorithm that understands the
    standard transaction scripts in order to significantly compress them
  - Removes reliance on the transaction index and paves the way toward
    eventually enabling block pruning
- Modify the New function to accept a Config struct instead of
  inidividual parameters
- Replace the old TxStore type with a new UtxoViewpoint type that makes
  use of the new pruned utxo set
- Convert code to treat the new UtxoViewpoint as a rolling view that is
  used between connects and disconnects to improve efficiency
- Make best chain state always set when the chain instance is created
  - Remove now unnecessary logic for dealing with unset best state
- Make all exported functions concurrent safe
  - Currently using a single chain state lock as it provides a straight
    forward and easy to review path forward however this can be improved
    with more fine grained locking
- Optimize various cases where full blocks were being loaded when only
  the header is needed to help reduce the I/O load
- Add the ability for callers to get a snapshot of the current best
  chain stats in a concurrent safe fashion
  - Does not block callers while new blocks are being processed
- Make error messages that reference transaction outputs consistently
  use <transaction hash>:<output index>
- Introduce a new AssertError type an convert internal consistency
  checks to use it
- Update tests and examples to reflect the changes
- Add a full suite of tests to ensure correct functionality of the new
  code

The following is an overview of the btcd changes:

- Update to use the new database and chain interfaces
- Temporarily remove all code related to the transaction index
- Temporarily remove all code related to the address index
- Convert all code that uses transaction stores to use the new utxo
  view
- Rework several calls that required the block manager for safe
  concurrency to use the chain package directly now that it is
  concurrent safe
- Change all calls to obtain the best hash to use the new best state
  snapshot capability from the chain package
- Remove workaround for limits on fetching height ranges since the new
  database interface no longer imposes them
- Correct the gettxout RPC handler to return the best chain hash as
  opposed the hash the txout was found in
- Optimize various RPC handlers:
  - Change several of the RPC handlers to use the new chain snapshot
    capability to avoid needlessly loading data
  - Update several handlers to use new functionality to avoid accessing
    the block manager so they are able to return the data without
    blocking when the server is busy processing blocks
  - Update non-verbose getblock to avoid deserialization and
    serialization overhead
  - Update getblockheader to request the block height directly from
    chain and only load the header
  - Update getdifficulty to use the new cached data from chain
  - Update getmininginfo to use the new cached data from chain
  - Update non-verbose getrawtransaction to avoid deserialization and
    serialization overhead
  - Update gettxout to use the new utxo store versus loading
    full transactions using the transaction index

The following is an overview of the utility changes:
- Update addblock to use the new database and chain interfaces
- Update findcheckpoint to use the new database and chain interfaces
- Remove the dropafter utility which is no longer supported

NOTE: The transaction index and address index will be reimplemented in
another commit.
This introduces a new indexing infrastructure for supporting optional
indexes using the new database and blockchain infrastructure along with
two concrete indexer implementations which provide both a
transaction-by-hash and a transaction-by-address index.

The new infrastructure is mostly separated into a package named indexers
which is housed under the blockchain package.  In order to support this,
a new interface named IndexManager has been introduced in the blockchain
package which provides methods to be notified when the chain has been
initialized and when blocks are connected and disconnected from the main
chain.  A concrete implementation of an index manager is provided by the
new indexers package.

The new indexers package also provides a new interface named Indexer
which allows the index manager to manage concrete index implementations
which conform to the interface.

The following is high level overview of the main index infrastructure
changes:

- Define a new IndexManager interface in the blockchain package and
  modify the package to make use of the interface when specified
- Create a new indexers package
  - Provides an Index interface which allows concrete indexes to plugin
    to an index manager
  - Provides a concrete IndexManager implementation
    - Handles the lifecycle of all indexes it manages
    - Tracks the index tips
    - Handles catching up disabled indexes that have been reenabled
    - Handles reorgs while the index was disabled
    - Invokes the appropriate methods for all managed indexes to allow
      them to index and deindex the blocks and transactions
  - Implement a transaction-by-hash index
    - Makes use of internal block IDs to save a significant amount of
      space and indexing costs over the old transaction index format
  - Implement a transaction-by-address index
    - Makes use of a leveling scheme in order to provide a good tradeoff
      between space required and indexing costs
- Supports enabling and disabling indexes at will
- Support the ability to drop indexes if they are no longer desired

The following is an overview of the btcd changes:

- Add a new index logging subsystem
- Add new options --txindex and --addrindex in order to enable the
  optional indexes
  - NOTE: The transaction index will automatically be enabled when the
    address index is enabled because it depends on it
- Add new options --droptxindex and --dropaddrindex to allow the indexes
  to be removed
  - NOTE: The address index will also be removed when the transaction
    index is dropped because it depends on it
- Update getrawtransactions RPC to make use of the transaction index
- Reimplement the searchrawtransaction RPC that makes use of the address
  index
- Update sample-btcd.conf to include sample usage for the new optional
  index flags
@cjepson cjepson force-pushed the cj_060616blockchain2 branch from f2b3c46 to 4788638 Compare August 18, 2016 19:42
@jolan
Copy link
Contributor

jolan commented Aug 19, 2016

Mining against this fine.

tACK

@jcvernaleo
Copy link
Member

Thanks to the flaky machine I run a testnet node on, I was able to test how this deals with an unclean shutdown and unlike the early version, it seems to have recovered just fine now.

@jrick
Copy link
Member

jrick commented Aug 23, 2016

I'm in favor of merging this in now so long as the associated dcrrpcclient fix goes in as well so dcrctl remains usable. Too many things blocked on this reaching master and no blocking errors have been discovered from it yet.

@marcopeereboom
Copy link
Member

I want to move forward on this. As long as this sits on a branch it'll not get enough attention and get tested properly.

@alexlyp
Copy link
Member

alexlyp commented Aug 23, 2016

have tested extensively and everything seems stable, but have not been able to review all code. Since much of it was extensively reviewed upstream in btcd, I am very confident in it's quality. We should be able to shake out any further issues before it is packaged for release.

This commit removes the old database package, moves the new package into
its place, and updates all imports accordingly.
@cjepson cjepson force-pushed the cj_060616blockchain2 branch from f42221a to 3740feb Compare August 23, 2016 21:41
@cjepson cjepson merged commit 12ed21d into decred:master Aug 23, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants