Skip to content
This repository has been archived by the owner on Aug 2, 2022. It is now read-only.

Commit

Permalink
bug fixes and improvements #6437
Browse files Browse the repository at this point in the history
  • Loading branch information
arhag committed Feb 28, 2019
1 parent 2d4d0d3 commit feb6456
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 87 deletions.
1 change: 1 addition & 0 deletions libraries/chain/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ add_library( eosio_chain
protocol_feature_activation.cpp
protocol_feature_manager.cpp
genesis_intrinsics.cpp
whitelisted_intrinsics.cpp
${HEADERS}
)

Expand Down
3 changes: 2 additions & 1 deletion libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <eosio/chain/transaction_object.hpp>
#include <eosio/chain/reversible_block_object.hpp>
#include <eosio/chain/genesis_intrinsics.hpp>
#include <eosio/chain/whitelisted_intrinsics.hpp>

#include <eosio/chain/protocol_feature_manager.hpp>
#include <eosio/chain/authorization_manager.hpp>
Expand Down Expand Up @@ -800,7 +801,7 @@ struct controller_impl {
db.create<global_property_object>([&](auto& gpo ){
gpo.configuration = conf.genesis.initial_configuration;
for( const auto& i : genesis_intrinsics ) {
gpo.add_intrinsic_to_whitelist( i );
add_intrinsic_to_whitelist( gpo.whitelisted_intrinsics, i );
}
});
db.create<dynamic_global_property_object>([](auto&){});
Expand Down
50 changes: 0 additions & 50 deletions libraries/chain/genesis_intrinsics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,56 +111,6 @@ const std::vector<const char*> genesis_intrinsics = {
"db_idx_long_double_end",
"db_idx_long_double_next",
"db_idx_long_double_previous",
"db_idx64_store",
"db_idx64_remove",
"db_idx64_update",
"db_idx64_find_primary",
"db_idx64_find_secondary",
"db_idx64_lowerbound",
"db_idx64_upperbound",
"db_idx64_end",
"db_idx64_next",
"db_idx64_previous",
"db_idx128_store",
"db_idx128_remove",
"db_idx128_update",
"db_idx128_find_primary",
"db_idx128_find_secondary",
"db_idx128_lowerbound",
"db_idx128_upperbound",
"db_idx128_end",
"db_idx128_next",
"db_idx128_previous",
"db_idx256_store",
"db_idx256_remove",
"db_idx256_update",
"db_idx256_find_primary",
"db_idx256_find_secondary",
"db_idx256_lowerbound",
"db_idx256_upperbound",
"db_idx256_end",
"db_idx256_next",
"db_idx256_previous",
"db_idx_double_store",
"db_idx_double_remove",
"db_idx_double_update",
"db_idx_double_find_primary",
"db_idx_double_find_secondary",
"db_idx_double_lowerbound",
"db_idx_double_upperbound",
"db_idx_double_end",
"db_idx_double_next",
"db_idx_double_previous",
"db_idx_long_double_store",
"db_idx_long_double_remove",
"db_idx_long_double_update",
"db_idx_long_double_find_primary",
"db_idx_long_double_find_secondary",
"db_idx_long_double_lowerbound",
"db_idx_long_double_upperbound",
"db_idx_long_double_end",
"db_idx_long_double_next",
"db_idx_long_double_previous",
"db_store_i64",
"db_update_i64",
"db_remove_i64",
Expand Down
31 changes: 7 additions & 24 deletions libraries/chain/include/eosio/chain/global_property_object.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <eosio/chain/chain_config.hpp>
#include <eosio/chain/producer_schedule.hpp>
#include <eosio/chain/incremental_merkle.hpp>
#include <eosio/chain/whitelisted_intrinsics.hpp>
#include <chainbase/chainbase.hpp>
#include "multi_index_includes.hpp"

Expand All @@ -29,30 +30,12 @@ namespace eosio { namespace chain {
OBJECT_CTOR(global_property_object, (proposed_schedule)(preactivated_protocol_features)(whitelisted_intrinsics))

public:

inline void add_intrinsic_to_whitelist( const char* name ) {
uint64_t h = static_cast<uint64_t>( std::hash<std::string>{}( std::string(name) ) );
whitelisted_intrinsics.emplace( std::piecewise_construct,
std::forward_as_tuple( h ),
std::forward_as_tuple( name, whitelisted_intrinsics.get_allocator() )
);
}

inline void add_intrinsic_to_whitelist( const std::string& name ) {
uint64_t h = static_cast<uint64_t>( std::hash<std::string>{}( name ) );
whitelisted_intrinsics.emplace( std::piecewise_construct,
std::forward_as_tuple( h ),
std::forward_as_tuple( name.c_str(), name.size(),
whitelisted_intrinsics.get_allocator() )
);
}

id_type id;
optional<block_num_type> proposed_schedule_block_num;
shared_producer_schedule_type proposed_schedule;
chain_config configuration;
shared_vector<digest_type> preactivated_protocol_features;
shared_flat_multimap<uint64_t, shared_string> whitelisted_intrinsics;
id_type id;
optional<block_num_type> proposed_schedule_block_num;
shared_producer_schedule_type proposed_schedule;
chain_config configuration;
shared_vector<digest_type> preactivated_protocol_features;
whitelisted_intrinsics_type whitelisted_intrinsics;
};


Expand Down
17 changes: 5 additions & 12 deletions libraries/chain/include/eosio/chain/wasm_interface.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once
#include <eosio/chain/types.hpp>
#include <eosio/chain/whitelisted_intrinsics.hpp>
#include <eosio/chain/exceptions.hpp>
#include "Runtime/Linker.h"
#include "Runtime/Runtime.h"
Expand All @@ -26,7 +27,7 @@ namespace eosio { namespace chain {

root_resolver() {}

root_resolver( const shared_flat_multimap<uint64_t, shared_string>& whitelisted_intrinsics )
root_resolver( const whitelisted_intrinsics_type& whitelisted_intrinsics )
:whitelisted_intrinsics(&whitelisted_intrinsics)
{}

Expand All @@ -44,16 +45,8 @@ namespace eosio { namespace chain {
"importing from module that is not 'env': ${module}.${export}",
("module",mod_name)("export",export_name) );

// Only consider imports that are in the whitelisted set of intrinsics:
uint64_t hash = static_cast<uint64_t>( std::hash<string>{}( export_name ) );
auto itr = whitelisted_intrinsics->lower_bound( hash );
fail = true;
for( const auto end = whitelisted_intrinsics->end(); itr != end && itr->first == hash; ++itr ) {
if( itr->second.compare( 0, itr->second.size(), export_name.c_str(), export_name.size() ) == 0 ) {
fail = false;
break;
}
}
// Only consider imports that are in the whitelisted set of intrinsics
fail = !is_intrinsic_whitelisted( *whitelisted_intrinsics, export_name );
}

// Try to resolve an intrinsic first.
Expand All @@ -67,7 +60,7 @@ namespace eosio { namespace chain {
} FC_CAPTURE_AND_RETHROW( (mod_name)(export_name) ) }

protected:
const shared_flat_multimap<uint64_t, shared_string>* whitelisted_intrinsics = nullptr;
const whitelisted_intrinsics_type* whitelisted_intrinsics = nullptr;
};
} }

Expand Down
22 changes: 22 additions & 0 deletions libraries/chain/include/eosio/chain/whitelisted_intrinsics.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

/**
* @file
* @copyright defined in eos/LICENSE
*/
#pragma once

#include <eosio/chain/types.hpp>

namespace eosio { namespace chain {

using whitelisted_intrinsics_type = shared_flat_multimap<uint64_t, shared_string>;

// TODO: Improve performance by using std::string_view when we switch to C++17.

bool is_intrinsic_whitelisted( const whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name );

void add_intrinsic_to_whitelist( whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name );

void remove_intrinsic_from_whitelist( whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name );

} } // namespace eosio::chain
83 changes: 83 additions & 0 deletions libraries/chain/whitelisted_intrinsics.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/**
* @file
* @copyright defined in eos/LICENSE
*/
#include <eosio/chain/whitelisted_intrinsics.hpp>
#include <eosio/chain/exceptions.hpp>

namespace eosio { namespace chain {

template<typename Iterator>
bool find_intrinsic_helper( uint64_t h, const std::string& name, Iterator& itr, const Iterator& end ) {
for( ; itr != end && itr->first == h; ++itr ) {
if( itr->second.compare( 0, itr->second.size(), name.c_str(), name.size() ) == 0 ) {
return true;
}
}

return false;
}

whitelisted_intrinsics_type::iterator
find_intrinsic( whitelisted_intrinsics_type& whitelisted_intrinsics, uint64_t h, const std::string& name )
{
auto itr = whitelisted_intrinsics.lower_bound( h );
const auto end = whitelisted_intrinsics.end();

if( !find_intrinsic_helper( h, name, itr, end ) )
return end;

return itr;
}

whitelisted_intrinsics_type::const_iterator
find_intrinsic( const whitelisted_intrinsics_type& whitelisted_intrinsics, uint64_t h, const std::string& name )
{
auto itr = whitelisted_intrinsics.lower_bound( h );
const auto end = whitelisted_intrinsics.end();

if( !find_intrinsic_helper( h, name, itr, end ) )
return end;

return itr;
}

bool is_intrinsic_whitelisted( const whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name )
{
uint64_t h = static_cast<uint64_t>( std::hash<std::string>{}( name ) );
auto itr = whitelisted_intrinsics.lower_bound( h );
const auto end = whitelisted_intrinsics.end();

return find_intrinsic_helper( h, name, itr, end );
}


void add_intrinsic_to_whitelist( whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name )
{
uint64_t h = static_cast<uint64_t>( std::hash<std::string>{}( name ) );
auto itr = find_intrinsic( whitelisted_intrinsics, h, name );
EOS_ASSERT( itr == whitelisted_intrinsics.end(), database_exception,
"cannot add intrinsic '${name}' since it already exists in the whitelist",
("name", name)
);

whitelisted_intrinsics.emplace( std::piecewise_construct,
std::forward_as_tuple( h ),
std::forward_as_tuple( name.c_str(), name.size(),
whitelisted_intrinsics.get_allocator() )
);
}

void remove_intrinsic_from_whitelist( whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name )
{
uint64_t h = static_cast<uint64_t>( std::hash<std::string>{}( name ) );
auto itr = find_intrinsic( whitelisted_intrinsics, h, name );
EOS_ASSERT( itr != whitelisted_intrinsics.end(), database_exception,
"cannot remove intrinsic '${name}' since it does not exist in the whitelist",
("name", name)
);

whitelisted_intrinsics.erase( itr );
}

} }

0 comments on commit feb6456

Please sign in to comment.