diff --git a/contracts/eosio.system/common.hpp b/contracts/eosio.system/common.hpp index 0266ab94c026b6994442a107851cd0b239857f31..d7c92df1da0377effe989155c5183f659816e12e 100644 --- a/contracts/eosio.system/common.hpp +++ b/contracts/eosio.system/common.hpp @@ -18,17 +18,22 @@ namespace eosiosystem { struct eosio_parameters : eosio::blockchain_parameters { uint32_t inflation_rate = 0; // inflation coefficient * 10000 (i.e. inflation in percent * 100) uint32_t storage_reserve_ratio = 1000; // ratio * 1000 + + EOSLIB_SERIALIZE_DERIVED( eosio_parameters, eosio::blockchain_parameters, (inflation_rate)(storage_reserve_ratio) + (storage_reserve_ratio) ) + }; + + struct eosio_global_state : eosio_parameters { uint64_t total_storage_bytes_reserved = 0; system_token_type total_storage_stake; - EOSLIB_SERIALIZE_DERIVED( eosio_parameters, eosio::blockchain_parameters, (inflation_rate)(storage_reserve_ratio) - (storage_reserve_ratio)(total_storage_bytes_reserved)(total_storage_stake) ) + EOSLIB_SERIALIZE_DERIVED( eosio_global_state, eosio_parameters, (total_storage_bytes_reserved)(total_storage_stake) ) }; - typedef eosio::singleton eosio_parameters_singleton; + typedef eosio::singleton global_state_singleton; - static eosio_parameters& get_default_parameters() { - static eosio_parameters dp; + static eosio_global_state& get_default_parameters() { + static eosio_global_state dp; get_blockchain_parameters(&dp); return dp; } diff --git a/contracts/eosio.system/delegate_bandwith.hpp b/contracts/eosio.system/delegate_bandwith.hpp index a5e3726c791bf6ef3ed4a6494cd9adcd2dff6b1f..917f331253e77544db634cbaec61c17095f9b449 100644 --- a/contracts/eosio.system/delegate_bandwith.hpp +++ b/contracts/eosio.system/delegate_bandwith.hpp @@ -33,7 +33,7 @@ namespace eosiosystem { using currency = typename common::currency; using system_token_type = typename common::system_token_type; using eosio_parameters = typename common::eosio_parameters; - using eosio_parameters_singleton = typename common::eosio_parameters_singleton; + using global_state_singleton = typename common::global_state_singleton; struct total_resources { account_name owner; @@ -113,7 +113,7 @@ namespace eosiosystem { //eosio_assert( is_account( del.receiver ), "can only delegate resources to an existing account" ); - auto parameters = eosio_parameters_singleton::exists() ? eosio_parameters_singleton::get() + auto parameters = global_state_singleton::exists() ? global_state_singleton::get() : common::get_default_parameters(); auto token_supply = currency::get_total_supply();//.quantity; @@ -174,7 +174,7 @@ namespace eosiosystem { parameters.total_storage_bytes_reserved += storage_bytes; parameters.total_storage_stake += del.stake_storage_quantity; - eosio_parameters_singleton::set(parameters); + global_state_singleton::set(parameters); } // delegatebw static void on( const undelegatebw& del ) { @@ -221,10 +221,10 @@ namespace eosiosystem { /// TODO: implement / enforce time delays on withdrawing currency::inline_transfer( SystemAccount, del.from, asset( static_cast( total_refund.quantity )), "unstake bandwidth" ); - auto parameters = eosio_parameters_singleton::get(); + auto parameters = global_state_singleton::get(); parameters.total_storage_bytes_reserved -= del.unstake_storage_bytes; parameters.total_storage_stake -= storage_stake_decrease; - eosio_parameters_singleton::set( parameters ); + global_state_singleton::set( parameters ); } // undelegatebw }; } diff --git a/contracts/eosio.system/eosio.system.abi b/contracts/eosio.system/eosio.system.abi index ce271a11a92e76c774e508ea7d433b43ce1d338d..e4740bbe57d951e30c27aaf7e5d4dcd4669bf671 100644 --- a/contracts/eosio.system/eosio.system.abi +++ b/contracts/eosio.system/eosio.system.abi @@ -75,12 +75,40 @@ {"name":"storage_stake", "type":"uint64"}, {"name":"storage_bytes", "type":"uint64"} ] + },{ + "name": "eosio_parameters", + "base": "", + "fields": [ + {"name":"target_block_size", "type":"uint32"}, + {"name":"max_block_size", "type":"uint32"}, + {"name":"target_block_acts_per_scope", "type":"uint32"}, + {"name":"max_block_acts_per_scope", "type":"uint32"}, + {"name":"target_block_acts", "type":"uint32"}, + {"name":"max_block_acts", "type":"uint32"}, + {"name":"max_storage_size", "type":"uint64"}, + {"name":"max_transaction_lifetime", "type":"uint32"}, + {"name":"max_transaction_exec_time", "type":"uint32"}, + {"name":"max_authority_depth", "type":"uint16"}, + {"name":"max_inline_depth", "type":"uint16"}, + {"name":"max_inline_action_size", "type":"uint32"}, + {"name":"max_generated_transaction_size", "type":"uint32"}, + {"name":"inflation_rate", "type":"uint32"}, + {"name":"storage_reserve_ratio", "type":"uint32"}, + ] + },,{ + "name": "eosio_global_state", + "base": "eosio_parameters", + "fields": [ + {"name":"total_storage_bytes_reserved", "type":"uint64"}, + {"name":"total_storage_stake", "type":"uint64"} + ] },{ "name": "regproducer", "base": "", "fields": [ - {"name":"producer", "type":"account_name"}, - {"name":"producer_key", "type":"bytes"} + {"name":"producer", "type":"account_name"}, + {"name":"producer_key", "type":"bytes"}, + {"name":"prefs", "type":"eosio_parameters"} ] },{ "name": "stakevote", diff --git a/contracts/eosio.system/eosio.system.hpp b/contracts/eosio.system/eosio.system.hpp index 6846b3c38ef0633884d339582600b2d8456d6188..e6e2763e7760060b4a025f22c31f74287b515f67 100644 --- a/contracts/eosio.system/eosio.system.hpp +++ b/contracts/eosio.system/eosio.system.hpp @@ -35,7 +35,7 @@ namespace eosiosystem { typename delegate_bandwith::undelegatebw, typename voting::register_proxy, typename voting::unregister_proxy, - typename voting::register_producer, + typename voting::regproducer, typename voting::vote_producer, typename voting::stakevote, typename voting::unstakevote, diff --git a/contracts/eosio.system/voting.hpp b/contracts/eosio.system/voting.hpp index a7f59e4a86f5f66d9cea437732e075a6c150a64a..01e746a0441f696c53ebccb43fae85af83a42f61 100644 --- a/contracts/eosio.system/voting.hpp +++ b/contracts/eosio.system/voting.hpp @@ -36,7 +36,7 @@ namespace eosiosystem { using currency = typename common::currency; using system_token_type = typename common::system_token_type; using eosio_parameters = typename common::eosio_parameters; - using eosio_parameters_singleton = typename common::eosio_parameters_singleton; + using global_state_singleton = typename common::global_state_singleton; static constexpr uint32_t max_unstake_requests = 10; static constexpr uint32_t unstake_pay_period = 7*24*3600; // one per week @@ -51,7 +51,7 @@ namespace eosiosystem { uint64_t primary_key()const { return owner; } uint128_t by_votes()const { return total_votes; } - bool active() const { return packed_key.size() == 4 + 33 /*serialized key size*/; } + bool active() const { return packed_key.size() == sizeof(public_key); } EOSLIB_SERIALIZE( producer_info, (owner)(total_votes)(prefs)(packed_key) ) }; @@ -81,12 +81,12 @@ namespace eosiosystem { typedef eosio::multi_index< N(voters), voter_info> voters_table; - ACTION( SystemAccount, register_producer ) { + ACTION( SystemAccount, regproducer ) { account_name producer; bytes producer_key; eosio_parameters prefs; - EOSLIB_SERIALIZE( register_producer, (producer)(producer_key)(prefs) ) + EOSLIB_SERIALIZE( regproducer, (producer)(producer_key)(prefs) ) }; /** @@ -97,39 +97,24 @@ namespace eosiosystem { * @pre authority of producer to register * */ - static void on( const register_producer& reg ) { + static void on( const regproducer& reg ) { require_auth( reg.producer ); producers_table producers_tbl( SystemAccount, SystemAccount ); - const auto* existing = producers_tbl.find( reg.producer ); - eosio_assert( !existing, "producer already registered" ); - - producers_tbl.emplace( reg.producer, [&]( producer_info& info ){ - info.owner = reg.producer; - info.total_votes = 0; - info.prefs = reg.prefs; - info.packed_key = reg.producer_key; - }); - } - - ACTION( SystemAccount, change_eosio_parameters ) { - account_name producer; - bytes producer_key; - eosio_parameters prefs; - - EOSLIB_SERIALIZE( register_producer, (producer)(producer_key)(prefs) ) - }; + const auto* prod = producers_tbl.find( reg.producer ); - static void on( const change_eosio_parameters& change) { - require_auth( change.producer ); - - producers_table producers_tbl( SystemAccount, SystemAccount ); - const auto* prod = producers_tbl.find( change.producer ); - eosio_assert( bool(prod), "producer is not registered" ); - - producers_tbl.update( *prod, change.producer, [&]( producer_info& info ){ - info.prefs = change.prefs; - }); + if ( prod ) { + producers_tbl.update( *prod, reg.producer, [&]( producer_info& info ){ + info.prefs = reg.prefs; + }); + } else { + producers_tbl.emplace( reg.producer, [&]( producer_info& info ){ + info.owner = reg.producer; + info.total_votes = 0; + info.prefs = reg.prefs; + info.packed_key = reg.producer_key; + }); + } } ACTION( SystemAccount, stakevote ) { @@ -208,8 +193,9 @@ namespace eosiosystem { if ( it->active() ) { schedule.producers.emplace_back(); schedule.producers.back().producer_name = it->owner; + eosio_assert( sizeof(schedule.producers) == it->packed_key.size(), "size mismatch" ); std::copy(it->packed_key.begin(), it->packed_key.end(), - schedule.producers.back().block_signing_key.begin()); + schedule.producers); target_block_size[n] = it->prefs.target_block_size; max_block_size[n] = it->prefs.max_block_size; @@ -243,7 +229,7 @@ namespace eosiosystem { set_active_producers( packed_schedule.data(), packed_schedule.size() ); size_t median = n/2; - auto parameters = eosio_parameters_singleton::get(); + auto parameters = global_state_singleton::get(); parameters.target_block_size = target_block_size[median]; parameters.max_block_size = max_block_size[median]; @@ -267,7 +253,7 @@ namespace eosiosystem { set_blockchain_parameters(¶meters); - eosio_parameters_singleton::set( parameters ); + global_state_singleton::set( parameters ); } static void on( const stakevote& sv ) { diff --git a/contracts/eosiolib/privileged.hpp b/contracts/eosiolib/privileged.hpp index bbf1f35b6ee6a50c677476cd1a4dc84d6080cd70..eae84dd4eff57c34ddd5221e3e8a4fbc3eb7db64 100644 --- a/contracts/eosiolib/privileged.hpp +++ b/contracts/eosiolib/privileged.hpp @@ -1,6 +1,7 @@ #pragma once #include "privileged.h" #include "serialize.hpp" +#include "types.h" namespace eosio { struct blockchain_parameters : ::blockchain_parameters { @@ -13,15 +14,15 @@ namespace eosio { }; struct producer_key { - account_name producer_name; - std::array block_signing_key; + account_name producer_name; + public_key block_signing_key; EOSLIB_SERIALIZE( producer_key, (producer_name)(block_signing_key) ) }; struct producer_schedule { uint32_t version = 0; ///< sequentially incrementing version number - vector producers; + std::vector producers; EOSLIB_SERIALIZE( producer_schedule, (version)(producers) ) };