From cf833bbb5b164564c8a8e95963164c477f339ce5 Mon Sep 17 00:00:00 2001 From: vonhenry Date: Tue, 30 Jun 2020 13:09:59 +0800 Subject: [PATCH] update --- ibc.chain/include/ibc.chain/block_header.hpp | 9 +++++ ibc.chain/src/block_header.cpp | 18 +++++++++ ibc.chain/src/ibc.chain.cpp | 39 ++++++++++++++------ 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/ibc.chain/include/ibc.chain/block_header.hpp b/ibc.chain/include/ibc.chain/block_header.hpp index 2434b26..b890c1b 100644 --- a/ibc.chain/include/ibc.chain/block_header.hpp +++ b/ibc.chain/include/ibc.chain/block_header.hpp @@ -12,6 +12,9 @@ namespace eosio { + // typedef std::tuple> extension; + // typedef std::vector extensions_type; + struct block_header { block_timestamp timestamp; name producer; @@ -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 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)) @@ -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 diff --git a/ibc.chain/src/block_header.cpp b/ibc.chain/src/block_header.cpp index 3a3adb3..a496042 100644 --- a/ibc.chain/src/block_header.cpp +++ b/ibc.chain/src/block_header.cpp @@ -55,4 +55,22 @@ namespace eosio { return u.result; } + std::optional 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( 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(); + } + } /// namespace eosio \ No newline at end of file diff --git a/ibc.chain/src/ibc.chain.cpp b/ibc.chain/src/ibc.chain.cpp index 7c2fb08..1f7e4f9 100644 --- a/ibc.chain/src/ibc.chain.cpp +++ b/ibc.chain/src/ibc.chain.cpp @@ -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(); @@ -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; @@ -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 ){ @@ -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 ); } @@ -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 ){