Commit Graph

319 Commits

Author SHA1 Message Date
Dave Collins
a0bdb17891
chaingen: Add revocation generation infrastructure.
This adds infrastructure to track missed votes and automatically
generate revocations for them along with a new assertion helper named
AssertTipNumRevocations which, as it name suggests, allows the caller to
assert the header commits to the specified number of revocations.

This will be useful for porting the rest of the block validation tests
to the fullblocktests framework.
2018-03-05 12:40:36 -06:00
Dave Collins
03f77993bd
blockchain: Support testnet stake diff estimation.
Currently, the stake difficulty estimation function for algorithm
defined in DCP0001 only works with mainnet due to a limitation of only
working when the interval size is less than or equal to the ticket
maturity.

This generalizes the function to work with all values of interval size
and ticket maturity and adds a full suite of tests using the testnet
parameters to ensure proper functionality.

Of particular note is the case when the current height is before the
ticket maturity floor since that means some of the tickets being
estimated will mature during the interval and that there can be no
non-estimated immature tickets.

This also implies that, unlike when the ticket maturity is greater than
or equal to the interval size, the estimate may not exactly match the
real final value when given the exact same number of tickets to estimate
as real purchased tickets in the remainder of the interval depending on
whether or not the current height is before the ticket maturity floor.
This is the case because the number of real tickets that end up being
purchased before the maturity floor may not match the estimated
assumption of max tickets per block.
2018-03-05 12:07:58 -06:00
Donald Adu-Poku
365a0db683 chaingen: Track expected blk heights separately. 2018-03-01 20:13:56 -06:00
Markus Richter
1e42b8524d multi: Properly capitalize Decred.
Decred is inconsistencly capitalized in the code base,
change all occurences of decred to Decred.
2018-03-01 17:41:35 -06:00
Dave Collins
2b8bde41ea
blockchain: Remove unused GetTopBlock function. 2018-03-01 12:41:48 -06:00
Dave Collins
6573428e11
multi: Implement getchaintips JSON-RPC.
This implements the getchaintips JSON-RPC and updates the associated
JSON-RPC API documentation accordingly.

It should be noted that until the entire block index is loaded into
memory, the chain tips tracking currently only works with tips that have
been seen since the daemon was started.
2018-03-01 12:29:36 -06:00
Dave Collins
c9cfd21a1b
blockchain: Cache tip and parent at init.
This modifies the startup logic to cache the tip and parent blocks in
the main chain block cache at initialization time which is desirable
because all of the transactions which come in to the mempool need access
to the these blocks to construct their utxo views due to the potential
for invalidation of the outputs in the previous block through voting.

Without caching them, the blocks end up being loaded from the database
again every time a new transaction enters the mempool until the blocks
eventually get cached when a new block is connected which is majorly
inefficient.
2018-03-01 12:05:18 -06:00
Donald Adu-Poku
60c7bc0e10 blockchain: move block validation rule tests into fullblocktests (2/x).
This PR moves the following block validation rule tests to
fullblocktests.

- `ErrBlockOneOutputs`
  - Create a premine block with one premine output removed.
  - Create a premine block with a bad spend script.
  - Create a premine block with an incorrect pay to amount.

- `ErrVotesMismatch`
  - Create block with a header that commits to more votes than the block
actually contains.

- `ErrIncongruentVotebit`
  - Attempt to add block with incorrect votebits set.
    - 4x Voters, 2x Nay 2x Yea, but block header says Yea
    - 3x Voters, 2x Nay 1x Yea, but block header says Yea
    - 3x Voters, 1x Nay 2x Yea, but block header says Nay
- `ErrSStxCommitment`
  - Attempt to add block with a bad ticket purchase commitment.

- `ErrSSGenPayeeOuts`
  - Attempt to add a block with a bad vote payee output.
  - Attempt to add a block with an incorrect vote payee output amount.

- `ErrBadCoinbaseFraudProof`
  - Create block with an invalid coinbase transaction.

- `ErrFraudBlockIndex`
  - Create block with an invalid transaction block height.

- `ErrFraudAmountIn`
  - Create block with an invalid transaction amount.

- `ErrExpiredTx`
  - Create block with an expired transaction.

- `ErrBadBlockHeight`
  - Create block with an invalid block height.

- `ErrPoolSize`
  - Create block with an invalid ticket pool size.

- `ErrInvalidFinalState`
  - Create block with an invalid final state.

- `ErrScriptMalformed`
  - Create block with a malformed spend script.
2018-02-28 20:43:28 -06:00
Dave Collins
f2f0ec5866
blockchain: Add tests for chain tip tracking.
This adds code to test the chain tip tracking functionality of the block
index.
2018-02-28 10:55:51 -06:00
Dave Collins
1a583c75b7
blockchain: Simplify chain tip tracking.
This simplifies the recently added chain tip tracking by allowing the
block index to handle it when a node is added to it.

This is possible since the block index does not support nodes that do
not connect to an existing node (with the exception of the genesis
block), and thus all new nodes are either extending an existing chain or
are on a side chain, but in either case, are a new chain tip.  In the
case the node is extending a chain, the parent is no longer a tip so it
can be removed.
2018-02-27 21:26:21 -06:00
Dave Collins
d4e73ee358
blockchain: Remove unused threshold serialization.
This removes the unused threshold state serialization code and
associated tests that appear to be left over from initial development
but were never needed due to other caches used.
2018-02-27 00:55:13 -06:00
Dave Collins
1172773907
chaingen: Accept mungers for create premine block.
This modifies the CreatePremineBlock in chaingen to accept mungers
similar to NextBlock.
2018-02-26 17:55:19 -06:00
Dave Collins
1510308810
blockchain: Simplify voter version calculation.
This simplifies, optimizes, and improves the robustness of the voter
version calculation as follows:

- Modifies calcVoterVersion to make use of the AncestorNode function to directly
  iterate back to the end of the prevoius stake version interval instead
  of manually adjusting and calling findStakeVersionPriorNode.
- Adds an optimization to skip any attempts to count votes before stake
  validation height since there can't possibly be any votes prior to
  that point.
- Modifies calcVoterVersionInterval to explicitly assert the assumptions
  at the beginning of the function to prevent invalid behavior instead
  of only commenting them and then indirectly asserting it via the total
  number of found votes.
2018-02-26 13:40:47 -06:00
Dave Collins
1d39c089f9
blockchain: Switch tip generation to chain tips.
This modifies the TipGeneration function to use the new chain tip
functionality in order to determine the entire generation of blocks
stemming from the current tip as opposed to the children.
2018-02-26 13:06:52 -06:00
Dave Collins
c5168a0394
blockchain: Add chain tip tracking.
This adds logic to keep track of all known chain tips.  Currently, this
will only work with chain tips that have been seen since the daemon was
loaded, however, when moving to the full block index in memory, it will
pick end up tracking all chain tips in the block index.

Also, note that nothing makes use of the functionality as of this commit
yet.  It will be useful in the future to allow things such as removal of
the more expensive per-node children tracking, mining code improvements,
and enhanced fork-related interrogation ability.
2018-02-26 12:58:35 -06:00
Dave Collins
479bfdead8
blockchain: Reduce GetGeneration to TipGeneration.
This replaces the GetGeneration function which allowed getting the
entire generation (all children stemming from the same parent) of an
arbitrary bock with TipGeneration which only returns the same
information for the tip block.

This is being done because the function is only used for mining purposes
to get the generation of the current tip.  The code is simplified by
reducing its scope to its actual purpose as an initial benefit.  It also
provides much better optimization opportunities later.
2018-02-26 11:41:01 -06:00
Dave Collins
5d06f6b858
fullblocktests: Use new exported IsSolved func. 2018-02-25 21:19:17 -06:00
Dave Collins
71922ca909
chaingen: Export func to check if block is solved.
This adds a new exported function named IsSolved which allows consumers
of chaingen to easily check if a block is solved according to the target
difficulty specified by the bits in its header.
2018-02-25 21:14:03 -06:00
Dave Collins
111dfdafb6
fullblocktests: Improve vote on wrong block tests.
This improves the test which checks for votes on the wrong block by
creating a new commitment script and testing 3 different scenarios:

- Ticket that commits to the parent of the correct block to ensure that
  the code under test is not just failing due to a hash that doesn't
  exist
- Ticket that commits to the correct block hash and wrong block height
- Ticket the commits to the correct block height and wrong block hash
2018-02-25 19:21:55 -06:00
Dave Collins
6512184190
chaingen: Export vote commitment script function.
This exports the VoteCommitmentScript function so callers can make use
of it to create new vote commitment scripts.
2018-02-25 19:21:54 -06:00
Dave Collins
8c69c29d69
blockchain: Consolidate tests into the main package.
Putting the test code in the same package makes it easier for forks
since they don't have to change the import paths as much and it also
gets rid of the need for internal_test.go to bridge.
2018-02-25 19:01:57 -06:00
Dave Collins
1f66f20be7
chaingen: Break dependency on blockchain.
This copies the minor bits of code referenced by chaingen from
blockchain to break the dependency on the blockchain package.

The intent of chaingen is that it is totally separate code from
the blockchain package so that accidental consensus changes are much
more difficult to slip through.
2018-02-25 16:26:34 -06:00
Dave Collins
6c07fdb361
blockchain: Remove duplicate val tests.
This removes some tests from validate_test.go that are already tested by
the dynamic full blocks tests.
2018-02-25 16:14:14 -06:00
Dave Collins
0aa73c02b4
chaingen: Prevent dup block names in NextBlock.
This modifies the chaingen test harness to error when a duplicate block
name is provided to NextBlock to help prevent misuse.

It also orrects a couple of comment typos.
2018-02-25 16:00:06 -06:00
Dave Collins
b661ebdfd5
blockchain: Remove redundant stake ver calc func.
This removes the calcStakeVersionByNode in favor of just using
calcStakeVersion directly since the latter already takes the node and
the former is a simple pass through with no additional handling.
2018-02-25 15:42:09 -06:00
Dave Collins
7cd713dddf
fullblocktests: Cleanup after refactor.
This corrects various comment issues introduced with the name refactor
as well as a few block names.
2018-02-24 20:12:36 -06:00
Donald Adu-Poku
6da8225f09 blockchain: move block validation rule tests into fullblocktests. 2018-02-25 02:03:59 +00:00
Dave Collins
ea1d3750ba
blockchain: Remove dry run flag.
This switches block template proposal checks over to use
CheckConnectBlock now that all of the core checks needed for block
templates is included there, and, more importantly, removes the the
BFDryRun flag since it was only used to test block template proposals
and it is much simpler to allow the main chain processing paths to run
without the complication of selectively processing code for dry run
behavior.
2018-02-24 12:53:05 -06:00
Dave Collins
b275711967
blockchain: Remove superfluous test checks.
This removes a couple of checks that are already tested via the dynamic
full block tests and thus do not need to be tested again.
2018-02-24 02:58:27 -06:00
Dave Collins
1492e551ca
blockchain: Use chaingen for forced reorg tests.
This replaces and improves the tests for the ForceHeadReorganization
function with new tests based on the dynamic chaingen infrastructure
versus uses static test data that gets out of date as data structures
change and is much more difficult to update.

It also removes the now unused static reorgto180.bz2 test data.
2018-02-23 21:01:02 -06:00
Dave Collins
7a9ce1ed6a
blockchain: Remove superfluous reorg tests.
This removes a couple of the reorganization tests that rely on static
test data since that logic is much better handled by the dynamic full
block tests and thus is no longer needed.
2018-02-23 20:49:07 -06:00
Dave Collins
3d5646e54f
blockchain: Limit GetStakeVersions count.
This modifies GetStakeVersions to limit the requested count based on the
height of the requested block instead of the entire height of the chain.
2018-02-23 17:00:15 -06:00
Dave Collins
b4d9d44a88
blockchain: Refactor block idx entry serialization.
This modifies the newly added block index serialization code to use a
separate structure as opposed to working with block nodes directly.

This approach is more desirable because it provides better separation
and more robust code against changes to the block node structure itself
and it avoids complications dealing with non-serialized fields such as
parent and child pointers.
2018-02-23 14:36:08 -06:00
Dave Collins
51fc707778
blockchain: Lookup child in force head reorg.
This modifies the forceHeadReorganization function to lookup the child
node directly from the index instead of looping through all of the
children looking for it.
2018-02-23 14:18:45 -06:00
Dave Collins
7056c67835
blockchain: Migrate to new block index and use it.
This adds code to migrate the existing block index in ffldb to the new
format managed by the blockchain package and updates the code to use the
new infrastructure.
2018-02-22 13:57:23 -06:00
Dave Collins
132eb4b150
blockchain: Add block validation status to index.
This adds a new field to the block node struct named status that
consists of bit flags for keeping tracking of the validation state of
each block.  The status is only stored in memory as of this commit, but
it will be stored as a part of the block index in the upcoming block
index migration code.

Since the field will be updated after node creation, this also
introduces some new functions for interacting with the status field in a
concurrent-safe fashion.

This is largely based on upstream commits 2492af0 and fb0d13c; however,
it does not include some of the logic in the reorganization paths those
commits include as that approach doesn't match the intended direction
this package is moving towards.
2018-02-22 13:57:15 -06:00
Dave Collins
b20abce609
blockchain: Infrastructure to manage block index.
This adds infrastructure necessary for blockchain to independently
manage and persist a full block index in a bucket.  Note that the
new infrastructure is not used yet as it will be integrated in future
commits after migrating existing databases has been done.

The purpose of this infrastructure is to significantly speed up startup
time which currently has to load a bunch of the most recent blocks in
order to rebuild the stake state and also to pave the way towards being
able to have the full block index in memory allows for a lot of
optimizations and greatly simplified code.

This also includes a full suite of tests to ensure proper serialization
and deserialization functionality.
2018-02-22 01:34:19 -06:00
Dave Collins
d8c1ea3345
blockchain: Simplify add/remove node logic.
This simplifies and consolidates the logic for adding and removing nodes
to and from the block index by moving the initial add into
maybeAcceptBlock just after the node is created, adding the child
connection logic to the AddNode function, and introducing a RemoveNode
function that is called in dry run mode which undoes the aforementioned
changes.

In addition to being simpler logic to follow, it helps make it clear
that all blocks which are written to the database end up with a block
index entry, even if they ultimately fail to connect.
2018-02-22 01:33:03 -06:00
Dave Collins
79689af3a8
blockchain: Correct error stringer tests.
This adds missing error entries to the tests and also adds an additional
check to ensure that all possibilities are tested to prevent drift in the
future.
2018-02-21 18:26:54 -06:00
Dave Collins
17f957ff54
blockchain: Calculate the lottery IV on demand.
This provides a function to calculate the lottery initialization vector
for a node on demand versus calculating it at node creation time and
storing the result.

This is being done because it saves an additional 32 bytes in the block
node structure and the ultimate goal is to move towards having all block
nodes in memory to greatly simplify and optimize the code.  Since there
will be a lot of nodes in memory, these extra bytes can add up to
significant savings.
2018-02-21 16:44:54 -06:00
Dave Collins
0536ed4db6
blockchain: Combine ErrDoubleSpend & ErrMissingTx.
This replaces the ErrDoubleSpend and ErrMissingTx error codes with a
single error code named ErrMissingTxOut and updates the relevant errors
and expected test results accordingly.

Once upon a time, the code relied on a transaction index, so it was able
to definitively differentiate between a transaction output that
legitimately did not exist and one that had already been spent.

However, since the code now uses a pruned utxoset, it is no longer
possible to reliably differentiate since once all outputs of a
transaction are spent, it is removed from the utxoset completely.
Consequently, a missing transaction could be either because the
transaction never existed or because it is fully spent.

Also, while here, consistently use the LookupEntry function on the
UtxoView instead of directly accessing the internal map as intended.
2018-02-21 14:01:05 -06:00
Dave Collins
cb40146dc7
blockchain: Accept parent in blockNode constructor.
This modifies the newBlockNode function to accept the parent as an
argument to automatically connect the newly created node.  When it is
not nil, the work sum will automatically be summed and the parent of the
new node will be set accordingly.

This simplifies the block node construction a bit and allows some
redundant code to be removed.  It also paves the way for easier simpler
full block index construction in the future.
2018-02-18 20:45:22 -06:00
Dave Collins
ca9ff29d9f
blockchain: Separate node ticket info population.
This separates the logic for populating the stake information in a block
node from the construction of the node in order to better delineate the
difference between the two and to pave the way for that information to
be stored separately in the database versus needing to load full blocks
to retrieve it.
2018-02-18 20:45:20 -06:00
Dave Collins
cc6f0cbff4
blockchain: Do not accept orphans/genesis block.
This modifies the code in maybeAcceptBlock to return an error if there
is no previous entry in the block index for a given block indicating it
is either an orphan or the genesis block.

The function should never be called in either circumstance since the
genesis block is valid by definition and orphans are handled prior to
calling the function.
2018-02-18 20:25:21 -06:00
David Hill
39e5af860b stake: optimize FindSpentTicketsInBlock slightly 2018-02-18 19:07:49 -06:00
Dave Collins
babc40a722
blockchain: Remove old version information.
This removes the legacy version details from the database to ensure that
loading older versions of the software after the database has been
upgraded fails as desired.

This is important because otherwise, the database could actually be
using a new version that has been upgraded via the new scheme, but old
software would still see this old information and believe the database
was still on that older version.
2018-02-18 12:33:07 -06:00
David Hill
5fc31ca578 multi: fix misspell linter warnings 2018-02-18 12:26:52 -06:00
Dave Collins
1a62f72f40
blockchain/indexers: Allow interrupts.
This propagates the interrupt channel through to blockchain and the
indexers so that it is possible to interrupt long-running operations
such as catching up indexes.
2018-02-18 11:18:52 -06:00
Dave Collins
a0fc0806ec
blockchain: Don't require chain for db upgrades.
This modifies the database upgrade logic to avoid needing the chain and
moves it earlier in the initialization process just after the initial
database creation (if needed), but prior the final struct instance
population from the database.

It is much simpler logic to have an already upgraded database prior to
populating the initial chain state so all of the initial setup happens
in one place.
2018-02-18 11:18:27 -06:00
Dave Collins
eaa59edc88
blockchain: Rework database versioning.
This modifies the database versioning to use separate keys within the
version bucket for each component in order to simplify upgrade logic.

Having a single key for the various versions of the database components
makes it difficult to use because the version isn't known until the data
is read, however, modifying the format necessarily means the version is
needed before that point to know which format to read.

While here, it uses a uint64 to store the date instead of a uint32 so
the timestamp continues to work past 2106.

Also, it removes the upgrade started logic since it should be possible
to stop in the middle of an upgrade and resume later.  Forcing a
completely new database to be created because an upgrade was stopped in
the middle is not ideal.
2018-02-18 11:17:08 -06:00