From d365e555f4028f07f4eec534933bf45fb8b2cd3a Mon Sep 17 00:00:00 2001
From: pbattu123
Date: Wed, 19 Jun 2019 11:16:43 -0300
Subject: [PATCH] virtual-op-fix for deterministic virtual_op number
---
libraries/chain/db_block.cpp | 12 ++++++++++++
libraries/chain/include/graphene/chain/database.hpp | 2 +-
.../graphene/chain/operation_history_object.hpp | 2 +-
3 files changed, 14 insertions(+), 2 deletions(-)
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;
};
/**