Please sign in to comment.
blockchain: Reverse utxo set semantics.
This modifies the way the unspent transaction output set is handled to reverse its current semantics so that it is optimized for the typical case, provides simpler handling, and resolves various issues with the previous approach. In addition, it updates the transaction, address, and existsaddress indexes to no longer remove entries from blocks that have been disapproved as, in all cases, the data still exists in the blockchain and thus should be queryable via the indexes even though there is special handling applied which treats them as if they did not exist in certain regards. Prior to this change, transactions in the regular tree were not applied to the utxo set until the next block was processed and did not vote against them. However, that approach has several undesirable consequences such as temporarily "invisible" utxos that are actually spendable, disapproved transactions missing from indexes even though they are still in the blockchain, and poor performance characteristics. In a certain sense, the previous approach could be viewed as the transactions not being valid until they were approved, however, that is not really true because it was (and still is) perfectly acceptable to spend utxos created by transactions in the regular tree of the same block so long as they come before the transactions that spend them. Further, utxos from a transaction in the regular tree of a block can be spent in the next block so long as that block does not disapprove them, which further illustrates that the utxos are actually valid unless they are disapproved. Consequently, this modifies that behavior to instead make the utxo set always track the most recent block and remove the regular transactions in the parent when a block votes against them. This approach is significantly more efficient for the normal case where the previous block is not disapproved by its successor. Also, the terminology is changed in several places to refer to disapproved blocks and transaction trees as opposed to invalid, because invalid implies the tree/block is malformed or does not follow the consensus rules. On the contrary, when a block votes against its parent, it is only voting against regular transaction tree of the parent. Both the block and transaction tree are still valid in that case, only the regular transaction tree is treated as if it never existed in terms of effects on the utxo set and duplicate transaction semantics. High level overview of changes: - Modify the utxo viewpoint to reverse semantics as previously described - Remove all code related to stake viewpoints - Change all block connection code in the viewpoint to first undo all transactions in the regular tree of the parent block if the current one disapproves it then connect all of the stake txns followed by the regular transactions in the block - NOTE: The order here is important since stake transactions are not allowed to spend outputs from the regular transactions in the same block as the next block might disapprove them - Change all block disconnection code in the viewpoint to first undo all the transactions in the regular and stake trees of the block being disconnected, and then resurrect the regular transactions in the parent block if the block being disconnected disapproved of it - Introduce a new type named viewFilteredSet for handling sets filtered by transactions that already exist in a view - Introduce a function on the viewpoint for specifically fetching the inputs to the regular transactions - Update mempool block connection and disconnection code to match the new semantics - Update all tests to handle the new semantics - Modify the best state number of transactions to include all transactions in all blocks regardless of disapproval because they still had to be processed and still exist in the blockchain - Remove include recent block parameter from mempool.FetchTransaction since the utxoset now always includes the latest block - This also has the side effect of correcting some unexpected results such as coinbases in the most recent block being incorrectly reported as having zero confirmations - Modify mempool utxo fetch logic to use a cached disapproved view, when needed, rather than recreating the view for every new transaction added to it - Update spend journal to include all transactions in the block instead of only stake transactions from the current block and regular transactions from the parent block - Modify tx and address indexes to store the block index of each tx along with its location within the files and update the query functions to return the information as well - Change the tx, address, and existsaddress indexes to index all transactions regardless of their disapproval - This also corrects several issues such as the inability to query and retrieve transactions that exist in a disapproved block - Update all RPC commands that return verbose transaction information to set that newly available block index information properly - Rename IsRegTxTreeKnownDisapproved in the mining.TxSource interface to IsRegTxTreeKnownDisapproved - NOTE: This will require a major bump to the mining module before the next release - Rename several utxoView instances to view for consistency - Rename several variables that dealt with disapproved trees from names that contained Invalid to ones that contain Disapproved NOTE: This does not yet have database migration code and thus will require a full chain download. It will exit with error in the case you attempt to run it against an existing v4 database. The new database it creates will be v5, so attempting to run an older version will reject the new database to prevent corruption. The database migration will be added in a separate commit.
- Loading branch information...
Showing with 954 additions and 1,150 deletions.
- +76 −109 blockchain/chain.go
- +7 −13 blockchain/chainio.go
- +57 −75 blockchain/indexers/addrindex.go
- +1 −1 blockchain/indexers/addrindex_test.go
- +42 −21 blockchain/indexers/existsaddrindex.go
- +44 −63 blockchain/indexers/manager.go
- +80 −56 blockchain/indexers/txindex.go
- +2 −6 blockchain/internal/progresslog/blocklogger.go
- +6 −0 blockchain/upgrade.go
- +389 −566 blockchain/utxoviewpoint.go
- +67 −100 blockchain/validate.go
- +2 −15 blockchain/validate_test.go
- +142 −76 blockmanager.go
- +10 −27 mempool/mempool.go
- +6 −6 mining.go
- +5 −4 mining/mining.go
- +17 −11 rpcserver.go
- +1 −1 server.go
Oops, something went wrong.