diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index 2650d47c..ab0947b7 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -588,6 +588,8 @@ void database::_apply_block( const signed_block& next_block ) _current_block_num = next_block_num; _current_trx_in_block = 0; + _current_op_in_trx = 0; + _current_virtual_op = 0; for( const auto& trx : next_block.transactions ) { @@ -597,8 +599,16 @@ void database::_apply_block( const signed_block& next_block ) * for transactions when validating broadcast transactions or * when building a block. */ + apply_transaction( trx, skip ); + // For real operations which are explicitly included in a transaction, virtual_op is 0. + // For VOPs derived directly from a real op, + // use the real op's (block_num,trx_in_block,op_in_trx), virtual_op starts from 1. + // For VOPs created after processed all transactions, + // trx_in_block = the_block.trsanctions.size(), virtual_op starts from 0. ++_current_trx_in_block; + _current_op_in_trx = 0; + _current_virtual_op = 0; } if (global_props.parameters.witness_schedule_algorithm == GRAPHENE_WITNESS_SCHEDULED_ALGORITHM) @@ -707,8 +717,10 @@ processed_transaction database::_apply_transaction(const signed_transaction& trx //Finally process the operations processed_transaction ptrx(trx); _current_op_in_trx = 0; + _current_virtual_op = 0; for( const auto& op : ptrx.operations ) { + _current_virtual_op = 0; eval_state.operation_results.emplace_back(apply_operation(eval_state, op)); ++_current_op_in_trx; } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index af50a94b..cf6299e6 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -529,7 +529,7 @@ namespace graphene { namespace chain { uint32_t _current_block_num = 0; uint16_t _current_trx_in_block = 0; uint16_t _current_op_in_trx = 0; - uint16_t _current_virtual_op = 0; + uint32_t _current_virtual_op = 0; vector _vote_tally_buffer; vector _witness_count_histogram_buffer; diff --git a/libraries/chain/include/graphene/chain/operation_history_object.hpp b/libraries/chain/include/graphene/chain/operation_history_object.hpp index eae8a01e..d8b90b58 100644 --- a/libraries/chain/include/graphene/chain/operation_history_object.hpp +++ b/libraries/chain/include/graphene/chain/operation_history_object.hpp @@ -61,7 +61,7 @@ namespace graphene { namespace chain { /** the operation within the transaction */ uint16_t op_in_trx = 0; /** any virtual operations implied by operation in block */ - uint16_t virtual_op = 0; + uint32_t virtual_op = 0; }; /**