fix(nano): non-idempotent indexes handling #1313
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
There's a bug in the index handling of nano contracts. There's a method called
nc_update_add()
in theIndexesManager
that updates indexes according to contract's actions and executed syscalls. This method was called in theupdate()
method of that class every time the nano tx was affected by an update in the consensus. Instead, it should be called only once, when the contract executes.Without this fix, index handling would happen more than once, which is problematic for some syscalls. For example, if a contract creates a token TKA, the amount of TKA is added to the tokens index and the amount of HTR deposit is removed. When the tx is spent, it would be considered a
txs_affected
in the consensus, causing the index to be updated again. This would drift the index values away from the expected ones, doubling the amount of created TKA and deposited HTR.Acceptance Criteria
IndexesManager.nc_update_add
call fromIndexesManager.update
toBlockConsensusAlgorithm._nc_execute_calls
.IndexesManager.nc_update_add
tohandle_contract_execution
andnc_update_remove
tohandle_contract_unexecution
.master
, but passes on this branch.Checklist
master
, confirm this code is production-ready and can be included in future releases as soon as it gets merged