Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
justfortest2 committed Jun 30, 2020
1 parent 9caac3d commit cf833bb
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 12 deletions.
9 changes: 9 additions & 0 deletions ibc.chain/include/ibc.chain/block_header.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@

namespace eosio {

// typedef std::tuple<uint16_t, std::vector<char>> extension;
// typedef std::vector<extension> extensions_type;

struct block_header {
block_timestamp timestamp;
name producer;
Expand All @@ -27,6 +30,7 @@ namespace eosio {
block_id_type id() const;
uint32_t block_num() const { return num_from_id(previous) + 1; }
static uint32_t num_from_id(const capi_checksum256& id);
std::optional<eosio::producer_schedule> get_ext_new_producers( uint16_t ext_id ) const;

EOSLIB_SERIALIZE(block_header, (timestamp)(producer)(confirmed)(previous)(transaction_mroot)(action_mroot)
(schedule_version)(new_producers)(header_extensions))
Expand Down Expand Up @@ -64,6 +68,11 @@ namespace eosio {
EOSLIB_SERIALIZE( producer_authority_schedule, (version)(producers) )
};

struct producer_schedule_change_extension : producer_authority_schedule {
static constexpr uint16_t extension_id() { return 1; }
EOSLIB_SERIALIZE_DERIVED( producer_schedule_change_extension, producer_authority_schedule, )
};

} /// namespace eosio


18 changes: 18 additions & 0 deletions ibc.chain/src/block_header.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,22 @@ namespace eosio {
return u.result;
}

std::optional<eosio::producer_schedule> block_header::get_ext_new_producers( uint16_t new_prd_ext_id ) const {
for ( auto ext : header_extensions ){
if ( std::get<0>(ext) == new_prd_ext_id ){
producer_schedule_change_extension sche_ext = unpack<producer_schedule_change_extension>( std::get<1>(ext) );

producer_schedule downgraded_producers;
downgraded_producers.version = sche_ext.version;
for (const auto &p : sche_ext.producers) {
std::visit([&downgraded_producers, &p](const auto& auth){
downgraded_producers.producers.emplace_back(producer_key{p.producer_name, auth.keys.front().key});
}, p.authority);
}
return downgraded_producers;
}
}
return std::optional<eosio::producer_schedule>();
}

} /// namespace eosio
39 changes: 27 additions & 12 deletions ibc.chain/src/ibc.chain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,12 +173,17 @@ namespace eosio {
/**
* Notes:
* the last section must be valid
* the header should not have header.new_producers and schedule_version consist with the last valid lwc section
* the header should not have new_producers and schedule_version consist with the last valid lwc section
* the header block number should greater then the last block number of last section
*/
void chain::new_section( const signed_block_header& header,
const incremental_merkle& blockroot_merkle ){
eosio_assert( !header.new_producers, "section root header can not contain new_producers" );

auto new_producers = header.new_producers;
if ( _wtmsig_st.activated ){
new_producers = header.get_ext_new_producers( _wtmsig_st.ext_id );
}
eosio_assert( ! new_producers, "section root header can not contain new_producers" );

auto header_block_num = header.block_num();

Expand Down Expand Up @@ -333,9 +338,14 @@ namespace eosio {
bhs.pending_schedule_id = last_bhs.pending_schedule_id;
}

// handle header.new_producers
if ( header.new_producers ){ // has new producers
eosio_assert( header.new_producers->version == header.schedule_version + 1, " header.new_producers version invalid" );
auto new_producers = header.new_producers;
if ( _wtmsig_st.activated ){
new_producers = header.get_ext_new_producers( _wtmsig_st.ext_id );
}

// handle new_producers
if ( new_producers ){ // has new producers
eosio_assert( new_producers->version == header.schedule_version + 1, "new_producers version invalid" );

_sections.modify( last_section, same_payer, [&]( auto& r ) {
r.valid = false;
Expand All @@ -345,8 +355,8 @@ namespace eosio {
auto new_schedule_id = _prodsches.available_primary_key();
_prodsches.emplace( _self, [&]( auto& r ) {
r.id = new_schedule_id;
r.schedule = *header.new_producers;
r.schedule_hash = get_schedule_hash( *header.new_producers );
r.schedule = *new_producers;
r.schedule_hash = get_schedule_hash( *new_producers );
});

if ( _prodsches.rbegin()->id - _prodsches.begin()->id >= prodsches_max_records ){
Expand Down Expand Up @@ -626,7 +636,7 @@ namespace eosio {
push_header( headers.front(), blockroot_merkle );
headers.erase( headers.begin() );
for ( const auto & header : headers ){
eosio_assert( !header.new_producers,"only the first block header can contain new_producers");
eosio_assert( !header.new_producers,"only the first block header can contain new_producers"); // bos chain
remove_header_if_exist( header.block_num() );
push_header( header );
}
Expand Down Expand Up @@ -746,14 +756,19 @@ namespace eosio {
}
bhs.pending_schedule_id = last_bhs.pending_schedule_id;

if ( header.new_producers ){
eosio_assert( header.new_producers->version == header.schedule_version + 1, " header.new_producers version invalid" );
auto new_producers = header.new_producers;
if ( _wtmsig_st.activated ){
new_producers = header.get_ext_new_producers( _wtmsig_st.ext_id );
}

if ( new_producers ){
eosio_assert( new_producers->version == header.schedule_version + 1, "new_producers version invalid" );

auto new_schedule_id = _prodsches.available_primary_key();
_prodsches.emplace( _self, [&]( auto& r ) {
r.id = new_schedule_id;
r.schedule = *header.new_producers;
r.schedule_hash = get_schedule_hash( *header.new_producers );
r.schedule = *new_producers;
r.schedule_hash = get_schedule_hash( *new_producers );
});

if ( _prodsches.rbegin()->id - _prodsches.begin()->id >= prodsches_max_records ){
Expand Down

0 comments on commit cf833bb

Please sign in to comment.