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

Commit

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

Expand Down
8 changes: 6 additions & 2 deletions libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <eosio/chain/generated_transaction_object.hpp>
#include <eosio/chain/transaction_object.hpp>
#include <eosio/chain/reversible_block_object.hpp>
#include <eosio/chain/genesis_intrinsics.hpp>

#include <eosio/chain/protocol_feature_manager.hpp>
#include <eosio/chain/authorization_manager.hpp>
Expand Down Expand Up @@ -792,12 +793,15 @@ struct controller_impl {

const auto& tapos_block_summary = db.get<block_summary_object>(1);
db.modify( tapos_block_summary, [&]( auto& bs ) {
bs.block_id = head->id;
bs.block_id = head->id;
});

conf.genesis.initial_configuration.validate();
db.create<global_property_object>([&](auto& gpo ){
gpo.configuration = conf.genesis.initial_configuration;
gpo.configuration = conf.genesis.initial_configuration;
for( const auto& i : genesis_intrinsics ) {
gpo.add_intrinsic_to_whitelist( i );
}
});
db.create<dynamic_global_property_object>([](auto&){});

Expand Down
231 changes: 231 additions & 0 deletions libraries/chain/genesis_intrinsics.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
/**
* @file
* @copyright defined in eos/LICENSE
*/

#include <eosio/chain/genesis_intrinsics.hpp>

namespace eosio { namespace chain {

const std::vector<const char*> genesis_intrinsics = {
"__ashrti3",
"__lshlti3",
"__lshrti3",
"__ashlti3",
"__divti3",
"__udivti3",
"__modti3",
"__umodti3",
"__multi3",
"__addtf3",
"__subtf3",
"__multf3",
"__divtf3",
"__eqtf2",
"__netf2",
"__getf2",
"__gttf2",
"__lttf2",
"__letf2",
"__cmptf2",
"__unordtf2",
"__negtf2",
"__floatsitf",
"__floatunsitf",
"__floatditf",
"__floatunditf",
"__floattidf",
"__floatuntidf",
"__floatsidf",
"__extendsftf2",
"__extenddftf2",
"__fixtfti",
"__fixtfdi",
"__fixtfsi",
"__fixunstfti",
"__fixunstfdi",
"__fixunstfsi",
"__fixsfti",
"__fixdfti",
"__fixunssfti",
"__fixunsdfti",
"__trunctfdf2",
"__trunctfsf2",
"is_feature_active",
"activate_feature",
"get_resource_limits",
"set_resource_limits",
"set_proposed_producers",
"get_blockchain_parameters_packed",
"set_blockchain_parameters_packed",
"is_privileged",
"set_privileged",
"get_active_producers",
"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_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",
"db_get_i64",
"db_next_i64",
"db_previous_i64",
"db_find_i64",
"db_lowerbound_i64",
"db_upperbound_i64",
"db_end_i64",
"assert_recover_key",
"recover_key",
"assert_sha256",
"assert_sha1",
"assert_sha512",
"assert_ripemd160",
"sha1",
"sha256",
"sha512",
"ripemd160",
"check_transaction_authorization",
"check_permission_authorization",
"get_permission_last_used",
"get_account_creation_time",
"current_time",
"publication_time",
"abort",
"eosio_assert",
"eosio_assert_message",
"eosio_assert_code",
"eosio_exit",
"read_action_data",
"action_data_size",
"current_receiver",
"require_recipient",
"require_auth",
"require_auth2",
"has_auth",
"is_account",
"prints",
"prints_l",
"printi",
"printui",
"printi128",
"printui128",
"printsf",
"printdf",
"printqf",
"printn",
"printhex",
"read_transaction",
"transaction_size",
"expiration",
"tapos_block_prefix",
"tapos_block_num",
"get_action",
"send_inline",
"send_context_free_inline",
"send_deferred",
"cancel_deferred",
"get_context_free_data",
"memcpy",
"memmove",
"memcmp",
"memset"
};

} } // namespace eosio::chain
14 changes: 14 additions & 0 deletions libraries/chain/include/eosio/chain/genesis_intrinsics.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

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

#include <vector>

namespace eosio { namespace chain {

extern const std::vector<const char*> genesis_intrinsics;

} } // namespace eosio::chain
35 changes: 28 additions & 7 deletions libraries/chain/include/eosio/chain/global_property_object.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,33 @@ namespace eosio { namespace chain {
*/
class global_property_object : public chainbase::object<global_property_object_type, global_property_object>
{
OBJECT_CTOR(global_property_object, (proposed_schedule)(preactivated_protocol_features))
OBJECT_CTOR(global_property_object, (proposed_schedule)(preactivated_protocol_features)(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;
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;
};


Expand Down Expand Up @@ -83,5 +103,6 @@ FC_REFLECT(eosio::chain::dynamic_global_property_object,
)

FC_REFLECT(eosio::chain::global_property_object,
(proposed_schedule_block_num)(proposed_schedule)(configuration)(preactivated_protocol_features)
(proposed_schedule_block_num)(proposed_schedule)(configuration)
(preactivated_protocol_features)(whitelisted_intrinsics)
)
4 changes: 3 additions & 1 deletion libraries/chain/include/eosio/chain/types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

#include <chainbase/chainbase.hpp>

#include <fc/container/flat_fwd.hpp>
#include <fc/interprocess/container.hpp>
#include <fc/io/varint.hpp>
#include <fc/io/enum_type.hpp>
#include <fc/crypto/sha224.hpp>
Expand Down Expand Up @@ -95,6 +95,8 @@ namespace eosio { namespace chain {
using shared_vector = boost::interprocess::vector<T, allocator<T>>;
template<typename T>
using shared_set = boost::interprocess::set<T, std::less<T>, allocator<T>>;
template<typename K, typename V>
using shared_flat_multimap = boost::interprocess::flat_multimap< K, V, std::less<K>, allocator< std::pair<K,V> > >;

/**
* For bugs in boost interprocess we moved our blob data to shared_string
Expand Down
Loading

0 comments on commit 2d4d0d3

Please sign in to comment.