Skip to content

Commit

Permalink
persist store some block's blockroot_merkle in block extension per 64…
Browse files Browse the repository at this point in the history
… blocks and

ibc_plugin use block_log.dat to find fit block's blockroot_merkle if need.
  • Loading branch information
vonhenry committed Mar 29, 2019
1 parent 9c06404 commit 6a45d96
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 35 deletions.
6 changes: 5 additions & 1 deletion libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,11 @@ struct controller_impl {
db.commit( s->block_num );

if( append_to_blog ) {
blog.append(s->block);
block_state bs = *s;
if ( bs.block_num % 64 == 0 ){
bs.block->block_extensions.emplace_back(std::make_pair(0xF,fc::raw::pack(bs.blockroot_merkle))); // used by ibc_plugin
}
blog.append(bs.block);
}

const auto& ubi = reversible_blocks.get_index<reversible_block_index,by_num>();
Expand Down
69 changes: 35 additions & 34 deletions plugins/ibc_plugin/ibc_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2028,14 +2028,14 @@ namespace eosio { namespace ibc {
blockroot_merkle_cache.erase( blockroot_merkle_cache.begin() );
}

static constexpr uint32_t range = ( 1 << 10 ) * 4; // about 30 minutes
if ( block->block_num % range == 0 ){
ilog("push block ${n}'s block_merkle to chain contract",("n",block->block_num ));
blockroot_merkle_type par;
par.block_num = block->block_num;
par.merkle = block->blockroot_merkle;
chain_contract->blockmerkle( par );
}
// static constexpr uint32_t range = ( 1 << 10 ) * 4; // about 30 minutes
// if ( block->block_num % range == 0 ){
// ilog("push block ${n}'s block_merkle to chain contract",("n",block->block_num ));
// blockroot_merkle_type par;
// par.block_num = block->block_num;
// par.merkle = block->blockroot_merkle;
// chain_contract->blockmerkle( par );
// }
}

void ibc_plugin_impl::accepted_confirmation(const header_confirmation& head) {
Expand Down Expand Up @@ -2389,39 +2389,42 @@ namespace eosio { namespace ibc {
ret_msg.blockroot_merkle = mkl;
ret_msg.headers.push_back( *sbp );
} else { // when node restart
ilog("didn't find block_state of number ${n} in forkdb, calculate it by known blockroot_merkles",("n",check_num));

chain_contract->get_blkrtmkls_tb();
blockroot_merkle_type walk_point;
ilog("didn't find blockroot_merkle of block ${n} in cache, calculate it by known blockroot_merkles",("n",check_num));

for ( auto brtm : chain_contract->history_blockroot_merkles ) {
if ( walk_point.block_num < brtm.block_num && brtm.block_num <= check_num ){
walk_point = brtm;
blockroot_merkle_type walk_point;
walk_point.block_num = start_num - ( start_num % 64 );
auto sbp = chain_plug->chain().fetch_block_by_number(walk_point.block_num);
if ( sbp == signed_block_ptr() ){
elog("block ${n} not exist", ("n", start_num));
return;
}
bool has_merkle_extension = false;
for( auto& ext : sbp->block_extensions ){
if ( ext.first == 0xF && ext.second.size() > 0 ){
has_merkle_extension = true;
walk_point.merkle = fc::raw::unpack<incremental_merkle>( ext.second );
break;
}
}

if ( walk_point.block_num == 0 ){
elog("can not find fit blockroot_merkle to calculation blockroot_merkle of blcok ${n}", ("n",check_num));
if ( ! has_merkle_extension ){
elog("didn't find blockroot_merkle of block ${n} in block_log.dat, can't calculate block ${m}'s blockroot_merkle",("n",walk_point.block_num )("m",check_num));
return;
} else {
dlog("calculate block ${n}'s blockroot_merkle from block ${m}",("n",check_num)("m",walk_point.block_num ));
}

ilog("find block ${b} with fit blockroot_merkle",("b",walk_point.block_num));
uint32_t count = check_num - walk_point.block_num;
for( uint32_t i = 0; i < count; ++i ){
walk_point.merkle.append( chain_plug->chain().get_block_id_for_num( walk_point.block_num ) );
walk_point.block_num++;
}

static const uint32_t max_interval_blocks = BlocksPerSecond * 3600 * 24 ; // 1 hours * 24
if ( check_num - walk_point.block_num <= max_interval_blocks ){
while( walk_point.block_num < check_num ){
walk_point.merkle.append( chain_plug->chain().get_block_id_for_num( walk_point.block_num ) );
walk_point.block_num += 1;
}
if (walk_point.block_num == check_num ){
ret_msg.blockroot_merkle = walk_point.merkle;
ret_msg.headers.push_back( *(chain_plug->chain().fetch_block_by_number(walk_point.block_num)) );
} else {
elog("internal error, calculate blockroot_merkle of block ${n} failed", ("n",check_num));
return;
}
if (walk_point.block_num == check_num ){
ret_msg.blockroot_merkle = walk_point.merkle;
ret_msg.headers.push_back( *(chain_plug->chain().fetch_block_by_number(walk_point.block_num)) );
} else {
elog("available block are too far apart, check_num ${n1}, start_point_num${n2}",("n1",check_num)("n2",walk_point.block_num));
elog("internal error, calculate blockroot_merkle of block ${n} failed", ("n",check_num));
return;
}
}
Expand Down Expand Up @@ -2662,8 +2665,6 @@ namespace eosio { namespace ibc {
return blockroot_merkle_cache[ block_num - blockroot_merkle_cache.begin()->block_num ].merkle;
}



incremental_merkle mkl;
mkl._node_count = 0;
return mkl;
Expand Down

0 comments on commit 6a45d96

Please sign in to comment.