提交 4abc2b6e 编写于 作者: P Phil Mesnier

#1329, dawn-567, bring back subsequent work done on the dawn 2.x branch, and...

#1329, dawn-567, bring back subsequent work done on the dawn 2.x branch, and add support for packed messages. block summary support to follow.
上级 1196e43f
...@@ -48,9 +48,9 @@ uint32_t chain_controller::blocks_per_round()const { ...@@ -48,9 +48,9 @@ uint32_t chain_controller::blocks_per_round()const {
} }
chain_controller::chain_controller( const chain_controller::controller_config& cfg ) chain_controller::chain_controller( const chain_controller::controller_config& cfg )
:_db( cfg.shared_memory_dir, :_db( cfg.shared_memory_dir,
(cfg.read_only ? database::read_only : database::read_write), (cfg.read_only ? database::read_only : database::read_write),
cfg.shared_memory_size), cfg.shared_memory_size),
_block_log(cfg.block_log_dir), _block_log(cfg.block_log_dir),
_limits(cfg.limits) _limits(cfg.limits)
{ {
...@@ -154,7 +154,7 @@ std::vector<block_id_type> chain_controller::get_block_ids_on_fork(block_id_type ...@@ -154,7 +154,7 @@ std::vector<block_id_type> chain_controller::get_block_ids_on_fork(block_id_type
*/ */
void chain_controller::push_block(const signed_block& new_block, uint32_t skip) void chain_controller::push_block(const signed_block& new_block, uint32_t skip)
{ try { { try {
with_skip_flags( skip, [&](){ with_skip_flags( skip, [&](){
return without_pending_transactions( [&]() { return without_pending_transactions( [&]() {
return _db.with_write_lock( [&]() { return _db.with_write_lock( [&]() {
return _push_block(new_block); return _push_block(new_block);
...@@ -255,11 +255,10 @@ transaction_trace chain_controller::push_transaction(const packed_transaction& t ...@@ -255,11 +255,10 @@ transaction_trace chain_controller::push_transaction(const packed_transaction& t
transaction_trace chain_controller::_push_transaction(const packed_transaction& trx) { transaction_trace chain_controller::_push_transaction(const packed_transaction& trx) {
transaction_metadata mtrx( trx, get_chain_id(), head_block_time()); transaction_metadata mtrx( trx, get_chain_id(), head_block_time());
check_transaction_authorization(mtrx.trx(), trx.signatures); check_transaction_authorization(mtrx.trx(), trx.signatures);
auto result = _push_transaction(std::move(mtrx)); auto result = _push_transaction(std::move(mtrx));
// notify anyone listening to pending transactions // notify anyone listening to pending transactions
on_pending_transaction(trx); on_pending_transaction(_pending_transaction_metas.back(), trx);
_pending_block->input_transactions.emplace_back(trx); _pending_block->input_transactions.emplace_back(trx);
...@@ -458,11 +457,11 @@ signed_block chain_controller::generate_block( ...@@ -458,11 +457,11 @@ signed_block chain_controller::generate_block(
}); });
} FC_CAPTURE_AND_RETHROW( (when) ) } } FC_CAPTURE_AND_RETHROW( (when) ) }
signed_block chain_controller::_generate_block( block_timestamp_type when, signed_block chain_controller::_generate_block( block_timestamp_type when,
account_name producer, account_name producer,
const private_key_type& block_signing_key ) const private_key_type& block_signing_key )
{ try { { try {
try { try {
uint32_t skip = _skip_flags; uint32_t skip = _skip_flags;
uint32_t slot_num = get_slot_at_time( when ); uint32_t slot_num = get_slot_at_time( when );
...@@ -586,7 +585,7 @@ void chain_controller::__apply_block(const signed_block& next_block) ...@@ -586,7 +585,7 @@ void chain_controller::__apply_block(const signed_block& next_block)
uint32_t skip = _skip_flags; uint32_t skip = _skip_flags;
/* /*
FC_ASSERT((skip & skip_merkle_check) FC_ASSERT((skip & skip_merkle_check)
|| next_block.transaction_merkle_root == next_block.calculate_merkle_root(), || next_block.transaction_merkle_root == next_block.calculate_merkle_root(),
"", ("next_block.transaction_merkle_root", next_block.transaction_merkle_root) "", ("next_block.transaction_merkle_root", next_block.transaction_merkle_root)
("calc",next_block.calculate_merkle_root())("next_block",next_block)("id",next_block.id())); ("calc",next_block.calculate_merkle_root())("next_block",next_block)("id",next_block.id()));
...@@ -771,13 +770,13 @@ void chain_controller::check_authorization( const vector<action>& actions, ...@@ -771,13 +770,13 @@ void chain_controller::check_authorization( const vector<action>& actions,
if (!allow_unused_signatures && (_skip_flags & skip_transaction_signatures) == false) if (!allow_unused_signatures && (_skip_flags & skip_transaction_signatures) == false)
EOS_ASSERT(checker.all_keys_used(), tx_irrelevant_sig, EOS_ASSERT(checker.all_keys_used(), tx_irrelevant_sig,
"transaction bears irrelevant signatures from these keys: ${keys}", "transaction bears irrelevant signatures from these keys: ${keys}",
("keys", checker.unused_keys())); ("keys", checker.unused_keys()));
} }
void chain_controller::check_transaction_authorization(const transaction& trx, void chain_controller::check_transaction_authorization(const transaction& trx,
const vector<signature_type>& signatures, const vector<signature_type>& signatures,
bool allow_unused_signatures)const bool allow_unused_signatures)const
{ {
check_authorization( trx.actions, trx.get_signature_keys( signatures, chain_id_type{} ), allow_unused_signatures ); check_authorization( trx.actions, trx.get_signature_keys( signatures, chain_id_type{} ), allow_unused_signatures );
} }
...@@ -819,7 +818,7 @@ void chain_controller::validate_uniqueness( const transaction& trx )const { ...@@ -819,7 +818,7 @@ void chain_controller::validate_uniqueness( const transaction& trx )const {
void chain_controller::record_transaction(const transaction& trx) { void chain_controller::record_transaction(const transaction& trx) {
//Insert transaction into unique transactions database. //Insert transaction into unique transactions database.
_db.create<transaction_object>([&](transaction_object& transaction) { _db.create<transaction_object>([&](transaction_object& transaction) {
transaction.trx_id = trx.id(); transaction.trx_id = trx.id();
transaction.expiration = trx.expiration; transaction.expiration = trx.expiration;
}); });
} }
...@@ -836,8 +835,8 @@ void chain_controller::validate_tapos(const transaction& trx)const { ...@@ -836,8 +835,8 @@ void chain_controller::validate_tapos(const transaction& trx)const {
("tapos_summary", tapos_block_summary)); ("tapos_summary", tapos_block_summary));
} }
void chain_controller::validate_referenced_accounts( const transaction& trx )const void chain_controller::validate_referenced_accounts( const transaction& trx )const
{ try { { try {
for( const auto& act : trx.actions ) { for( const auto& act : trx.actions ) {
require_account(act.account); require_account(act.account);
for (const auto& auth : act.authorization ) for (const auto& auth : act.authorization )
...@@ -890,7 +889,7 @@ const producer_object& chain_controller::validate_block_header(uint32_t skip, co ...@@ -890,7 +889,7 @@ const producer_object& chain_controller::validate_block_header(uint32_t skip, co
EOS_ASSERT(!next_block.new_producers, block_validate_exception, EOS_ASSERT(!next_block.new_producers, block_validate_exception,
"Producer changes may only occur at the end of a round."); "Producer changes may only occur at the end of a round.");
} }
const producer_object& producer = get_producer(get_scheduled_producer(get_slot_at_time(next_block.timestamp))); const producer_object& producer = get_producer(get_scheduled_producer(get_slot_at_time(next_block.timestamp)));
if(!(skip&skip_producer_signature)) if(!(skip&skip_producer_signature))
...@@ -904,7 +903,7 @@ const producer_object& chain_controller::validate_block_header(uint32_t skip, co ...@@ -904,7 +903,7 @@ const producer_object& chain_controller::validate_block_header(uint32_t skip, co
("block producer",next_block.producer)("scheduled producer",producer.owner)); ("block producer",next_block.producer)("scheduled producer",producer.owner));
} }
return producer; return producer;
} }
...@@ -917,7 +916,7 @@ void chain_controller::create_block_summary(const signed_block& next_block) { ...@@ -917,7 +916,7 @@ void chain_controller::create_block_summary(const signed_block& next_block) {
/** /**
* Takes the top config::producer_count producers by total vote excluding any producer whose * Takes the top config::producer_count producers by total vote excluding any producer whose
* block_signing_key is null. * block_signing_key is null.
*/ */
producer_schedule_type chain_controller::_calculate_producer_schedule()const { producer_schedule_type chain_controller::_calculate_producer_schedule()const {
producer_schedule_type schedule = get_global_properties().new_active_producers; producer_schedule_type schedule = get_global_properties().new_active_producers;
...@@ -934,7 +933,7 @@ producer_schedule_type chain_controller::_calculate_producer_schedule()const { ...@@ -934,7 +933,7 @@ producer_schedule_type chain_controller::_calculate_producer_schedule()const {
*/ */
const shared_producer_schedule_type& chain_controller::_head_producer_schedule()const { const shared_producer_schedule_type& chain_controller::_head_producer_schedule()const {
const auto& gpo = get_global_properties(); const auto& gpo = get_global_properties();
if( gpo.pending_active_producers.size() ) if( gpo.pending_active_producers.size() )
return gpo.pending_active_producers.back().second; return gpo.pending_active_producers.back().second;
return gpo.active_producers; return gpo.active_producers;
} }
...@@ -973,13 +972,13 @@ void chain_controller::update_global_properties(const signed_block& b) { try { ...@@ -973,13 +972,13 @@ void chain_controller::update_global_properties(const signed_block& b) { try {
active_producers_authority.accounts.push_back({{name.producer_name, config::active_name}, 1}); active_producers_authority.accounts.push_back({{name.producer_name, config::active_name}, 1});
} }
auto& po = _db.get<permission_object, by_owner>( boost::make_tuple(config::producers_account_name, auto& po = _db.get<permission_object, by_owner>( boost::make_tuple(config::producers_account_name,
config::active_name ) ); config::active_name ) );
_db.modify(po,[active_producers_authority] (permission_object& po) { _db.modify(po,[active_producers_authority] (permission_object& po) {
po.auth = active_producers_authority; po.auth = active_producers_authority;
}); });
} }
} FC_CAPTURE_AND_RETHROW() } } FC_CAPTURE_AND_RETHROW() }
void chain_controller::add_checkpoints( const flat_map<uint32_t,block_id_type>& checkpts ) { void chain_controller::add_checkpoints( const flat_map<uint32_t,block_id_type>& checkpts ) {
for (const auto& i : checkpts) for (const auto& i : checkpts)
...@@ -1019,12 +1018,12 @@ account_name chain_controller::head_block_producer() const { ...@@ -1019,12 +1018,12 @@ account_name chain_controller::head_block_producer() const {
return {}; return {};
} }
const producer_object& chain_controller::get_producer(const account_name& owner_name) const const producer_object& chain_controller::get_producer(const account_name& owner_name) const
{ try { { try {
return _db.get<producer_object, by_owner>(owner_name); return _db.get<producer_object, by_owner>(owner_name);
} FC_CAPTURE_AND_RETHROW( (owner_name) ) } } FC_CAPTURE_AND_RETHROW( (owner_name) ) }
const permission_object& chain_controller::get_permission( const permission_level& level )const const permission_object& chain_controller::get_permission( const permission_level& level )const
{ try { { try {
return _db.get<permission_object, by_owner>( boost::make_tuple(level.actor,level.permission) ); return _db.get<permission_object, by_owner>( boost::make_tuple(level.actor,level.permission) );
} FC_CAPTURE_AND_RETHROW( (level) ) } } FC_CAPTURE_AND_RETHROW( (level) ) }
...@@ -1167,7 +1166,7 @@ ProducerRound chain_controller::calculate_next_round(const signed_block& next_bl ...@@ -1167,7 +1166,7 @@ ProducerRound chain_controller::calculate_next_round(const signed_block& next_bl
EOS_ASSERT(boost::range::equal(next_block.producer_changes, changes), block_validate_exception, EOS_ASSERT(boost::range::equal(next_block.producer_changes, changes), block_validate_exception,
"Unexpected round changes in new block header", "Unexpected round changes in new block header",
("expected changes", changes)("block changes", next_block.producer_changes)); ("expected changes", changes)("block changes", next_block.producer_changes));
fc::time_point tp = (fc::time_point)next_block.timestamp; fc::time_point tp = (fc::time_point)next_block.timestamp;
utilities::rand::random rng(tp.sec_since_epoch()); utilities::rand::random rng(tp.sec_since_epoch());
rng.shuffle(schedule); rng.shuffle(schedule);
...@@ -1229,7 +1228,7 @@ void chain_controller::update_global_dynamic_data(const signed_block& b) { ...@@ -1229,7 +1228,7 @@ void chain_controller::update_global_dynamic_data(const signed_block& b) {
dgp.recent_slots_filled = uint64_t(-1); dgp.recent_slots_filled = uint64_t(-1);
else else
dgp.recent_slots_filled = 0; dgp.recent_slots_filled = 0;
dgp.block_merkle_root.append( head_block_id() ); dgp.block_merkle_root.append( head_block_id() );
}); });
_fork_db.set_max_size( _dgp.head_block_number - _dgp.last_irreversible_block_num + 1 ); _fork_db.set_max_size( _dgp.head_block_number - _dgp.last_irreversible_block_num + 1 );
...@@ -1255,7 +1254,7 @@ void chain_controller::update_last_irreversible_block() ...@@ -1255,7 +1254,7 @@ void chain_controller::update_last_irreversible_block()
vector<const producer_object*> producer_objs; vector<const producer_object*> producer_objs;
producer_objs.reserve(gpo.active_producers.producers.size()); producer_objs.reserve(gpo.active_producers.producers.size());
std::transform(gpo.active_producers.producers.begin(), std::transform(gpo.active_producers.producers.begin(),
gpo.active_producers.producers.end(), std::back_inserter(producer_objs), gpo.active_producers.producers.end(), std::back_inserter(producer_objs),
[this](const producer_key& pk) { return &get_producer(pk.producer_name); }); [this](const producer_key& pk) { return &get_producer(pk.producer_name); });
...@@ -1569,7 +1568,7 @@ void chain_controller::update_usage( transaction_metadata& meta, uint32_t act_us ...@@ -1569,7 +1568,7 @@ void chain_controller::update_usage( transaction_metadata& meta, uint32_t act_us
uint128_t used_uacts = buo.acts.value; uint128_t used_uacts = buo.acts.value;
uint128_t virtual_max_ubytes = dgpo.virtual_net_bandwidth * config::rate_limiting_precision; uint128_t virtual_max_ubytes = dgpo.virtual_net_bandwidth * config::rate_limiting_precision;
uint128_t virtual_max_uacts = dgpo.virtual_act_bandwidth * config::rate_limiting_precision; uint128_t virtual_max_uacts = dgpo.virtual_act_bandwidth * config::rate_limiting_precision;
if( !(_skip_flags & genesis_setup) ) { if( !(_skip_flags & genesis_setup) ) {
#warning TODO: restore bandwidth checks #warning TODO: restore bandwidth checks
/* setting of bandwidth currently not implemented /* setting of bandwidth currently not implemented
...@@ -1618,7 +1617,7 @@ const apply_handler* chain_controller::find_apply_handler( account_name receiver ...@@ -1618,7 +1617,7 @@ const apply_handler* chain_controller::find_apply_handler( account_name receiver
auto native_handler_scope = _apply_handlers.find( receiver ); auto native_handler_scope = _apply_handlers.find( receiver );
if( native_handler_scope != _apply_handlers.end() ) { if( native_handler_scope != _apply_handlers.end() ) {
auto handler = native_handler_scope->second.find( make_pair( scope, act ) ); auto handler = native_handler_scope->second.find( make_pair( scope, act ) );
if( handler != native_handler_scope->second.end() ) if( handler != native_handler_scope->second.end() )
return &handler->second; return &handler->second;
} }
return nullptr; return nullptr;
......
...@@ -110,7 +110,7 @@ namespace eosio { namespace chain { ...@@ -110,7 +110,7 @@ namespace eosio { namespace chain {
* This signal is emitted any time a new transaction is added to the pending * This signal is emitted any time a new transaction is added to the pending
* block state. * block state.
*/ */
signal<void(const packed_transaction&)> on_pending_transaction; signal<void(const transaction_metadata&, const packed_transaction&)> on_pending_transaction;
...@@ -128,7 +128,7 @@ namespace eosio { namespace chain { ...@@ -128,7 +128,7 @@ namespace eosio { namespace chain {
*/ */
bool is_applying_block()const { return _currently_applying_block; } bool is_applying_block()const { return _currently_applying_block; }
bool is_start_of_round( block_num_type n )const; bool is_start_of_round( block_num_type n )const;
uint32_t blocks_per_round()const; uint32_t blocks_per_round()const;
chain_id_type get_chain_id()const { return chain_id_type(); } /// TODO: make this hash of constitution chain_id_type get_chain_id()const { return chain_id_type(); } /// TODO: make this hash of constitution
...@@ -215,7 +215,7 @@ namespace eosio { namespace chain { ...@@ -215,7 +215,7 @@ namespace eosio { namespace chain {
clear_pending(); clear_pending();
/** after applying f() push previously input transactions on top */ /** after applying f() push previously input transactions on top */
auto on_exit = fc::make_scoped_exit( [&](){ auto on_exit = fc::make_scoped_exit( [&](){
for( auto& t : old_input ) { for( auto& t : old_input ) {
try { try {
if (!is_known_transaction(t.id)) if (!is_known_transaction(t.id))
...@@ -366,7 +366,7 @@ namespace eosio { namespace chain { ...@@ -366,7 +366,7 @@ namespace eosio { namespace chain {
validate_tapos(trx); validate_tapos(trx);
} FC_CAPTURE_AND_RETHROW( (trx) ) } } FC_CAPTURE_AND_RETHROW( (trx) ) }
/// Validate transaction helpers @{ /// Validate transaction helpers @{
void validate_uniqueness(const transaction& trx)const; void validate_uniqueness(const transaction& trx)const;
void validate_tapos(const transaction& trx)const; void validate_tapos(const transaction& trx)const;
......
...@@ -156,8 +156,8 @@ namespace eosio { ...@@ -156,8 +156,8 @@ namespace eosio {
request_message, request_message,
sync_request_message, sync_request_message,
block_summary_message, block_summary_message,
signed_transaction, signed_block,
signed_block>; packed_transaction>;
} // namespace eosio } // namespace eosio
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册