Skip to content

Commit

Permalink
GH-1523 Add hs_finalizer_set_extension and refactor to prevent inclus…
Browse files Browse the repository at this point in the history
…ion of bls12-381 headers in header files.
  • Loading branch information
heifner committed Aug 31, 2023
1 parent 2c478df commit c6aa358
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 40 deletions.
1 change: 1 addition & 0 deletions libraries/chain/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ add_library( eosio_chain
${CHAIN_WEBASSEMBLY_SOURCES}

authority.cpp
finalizer_set.cpp
trace.cpp
transaction_metadata.cpp
protocol_state_object.cpp
Expand Down
27 changes: 27 additions & 0 deletions libraries/chain/finalizer_set.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include <eosio/chain/finalizer_set.hpp>
#include <eosio/chain/finalizer_authority.hpp>
#include <fc/crypto/bls_public_key.hpp>

namespace eosio::chain {

/**
* These definitions are all here to avoid including bls_public_key.hpp which includes <bls12-381/bls12-381.hpp>
* and pulls in bls12-381 types. This keeps bls12-381 out of libtester.
*/

finalizer_set::finalizer_set() = default;
finalizer_set::~finalizer_set() = default;

finalizer_set::finalizer_set(const finalizer_set&) = default;
finalizer_set::finalizer_set(finalizer_set&&) = default;

finalizer_set& finalizer_set::operator=(const finalizer_set&) = default;
finalizer_set& finalizer_set::operator=(finalizer_set&&) = default;

auto finalizer_set::operator<=>(const finalizer_set&) const = default;


hs_finalizer_set_extension::hs_finalizer_set_extension(const finalizer_set& s)
: finalizer_set(s) {}

} /// eosio::chain
19 changes: 19 additions & 0 deletions libraries/chain/include/eosio/chain/finalizer_authority.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once

#include <fc/crypto/bls_public_key.hpp>
#include <string>

namespace eosio::chain {

struct finalizer_authority {

std::string description;
uint64_t fweight = 0; // weight that this finalizer's vote has for meeting fthreshold
fc::crypto::blslib::bls_public_key public_key;

auto operator<=>(const finalizer_authority&) const = default;
};

} /// eosio::chain

FC_REFLECT( eosio::chain::finalizer_authority, (description)(fweight)(public_key) )
70 changes: 30 additions & 40 deletions libraries/chain/include/eosio/chain/finalizer_set.hpp
Original file line number Diff line number Diff line change
@@ -1,59 +1,49 @@
#pragma once

#include <eosio/chain/config.hpp>
#include <eosio/chain/types.hpp>
#include <chainbase/chainbase.hpp>
#include <eosio/chain/authority.hpp>
#include <eosio/chain/snapshot.hpp>

#include <fc/crypto/bls_public_key.hpp>

namespace eosio::chain {

struct finalizer_authority {

std::string description;
uint64_t fweight = 0; // weight that this finalizer's vote has for meeting fthreshold
fc::crypto::blslib::bls_public_key public_key;

friend bool operator == ( const finalizer_authority& lhs, const finalizer_authority& rhs ) {
return tie( lhs.description, lhs.fweight, lhs.public_key ) == tie( rhs.description, rhs.fweight, rhs.public_key );
}
friend bool operator != ( const finalizer_authority& lhs, const finalizer_authority& rhs ) {
return !(lhs == rhs);
}
};
struct finalizer_authority;

struct finalizer_set {
finalizer_set() = default;
finalizer_set();
~finalizer_set();

finalizer_set(const finalizer_set&);
finalizer_set(finalizer_set&&);

finalizer_set( uint32_t version, uint64_t fthreshold, std::initializer_list<finalizer_authority> finalizers )
:version(version)
,fthreshold(fthreshold)
,finalizers(finalizers)
{}
finalizer_set& operator=(const finalizer_set&);
finalizer_set& operator=(finalizer_set&&);

uint32_t version = 0; ///< sequentially incrementing version number
uint64_t fthreshold = 0; // vote fweight threshold to finalize blocks
vector<finalizer_authority> finalizers; // Instant Finality voter set

friend bool operator == ( const finalizer_set& a, const finalizer_set& b )
{
if( a.version != b.version ) return false;
if( a.fthreshold != b.fthreshold ) return false;
if ( a.finalizers.size() != b.finalizers.size() ) return false;
for( uint32_t i = 0; i < a.finalizers.size(); ++i )
if( ! (a.finalizers[i] == b.finalizers[i]) ) return false;
return true;
}

friend bool operator != ( const finalizer_set& a, const finalizer_set& b )
{
return !(a==b);
}
auto operator<=>(const finalizer_set&) const;
};

using finalizer_set_ptr = std::shared_ptr<finalizer_set>;

/**
* Block Header Extension Compatibility
*/
struct hs_finalizer_set_extension : finalizer_set {

static constexpr uint16_t extension_id() { return 2; } // TODO 3 instead?
static constexpr bool enforce_unique() { return true; }

hs_finalizer_set_extension() = default;
hs_finalizer_set_extension(const hs_finalizer_set_extension&) = default;
hs_finalizer_set_extension( hs_finalizer_set_extension&& ) = default;

hs_finalizer_set_extension& operator=(const hs_finalizer_set_extension&) = default;
hs_finalizer_set_extension& operator=(hs_finalizer_set_extension&&) = default;

hs_finalizer_set_extension(const finalizer_set& s);
};

} /// eosio::chain

FC_REFLECT( eosio::chain::finalizer_authority, (description)(fweight)(public_key) )
FC_REFLECT( eosio::chain::finalizer_set, (version)(fthreshold)(finalizers) )
FC_REFLECT_DERIVED( eosio::chain::hs_finalizer_set_extension, (eosio::chain::finalizer_set), )

0 comments on commit c6aa358

Please sign in to comment.