Merge branch 'develop' into GRPH-73-fix-block-id-forks
This commit is contained in:
commit
589005515b
5 changed files with 58 additions and 11 deletions
|
|
@ -119,9 +119,9 @@ set<account_id_type> account_member_index::get_account_members(const account_obj
|
|||
result.insert(auth.first);
|
||||
return result;
|
||||
}
|
||||
set<public_key_type> account_member_index::get_key_members(const account_object& a)const
|
||||
set<public_key_type, account_member_index::key_compare> account_member_index::get_key_members(const account_object& a)const
|
||||
{
|
||||
set<public_key_type> result;
|
||||
set<public_key_type, key_compare> result;
|
||||
for( auto auth : a.owner.key_auths )
|
||||
result.insert(auth.first);
|
||||
for( auto auth : a.active.key_auths )
|
||||
|
|
@ -213,7 +213,7 @@ void account_member_index::object_modified(const object& after)
|
|||
|
||||
|
||||
{
|
||||
set<public_key_type> after_key_members = get_key_members(a);
|
||||
set<public_key_type, key_compare> after_key_members = get_key_members(a);
|
||||
|
||||
vector<public_key_type> removed; removed.reserve(before_key_members.size());
|
||||
std::set_difference(before_key_members.begin(), before_key_members.end(),
|
||||
|
|
|
|||
|
|
@ -681,9 +681,14 @@ processed_transaction database::_apply_transaction(const signed_transaction& trx
|
|||
|
||||
auto& trx_idx = get_mutable_index_type<transaction_index>();
|
||||
const chain_id_type& chain_id = get_chain_id();
|
||||
auto trx_id = trx.id();
|
||||
FC_ASSERT( (skip & skip_transaction_dupe_check) ||
|
||||
trx_idx.indices().get<by_trx_id>().find(trx_id) == trx_idx.indices().get<by_trx_id>().end() );
|
||||
transaction_id_type trx_id;
|
||||
|
||||
if( !(skip & skip_transaction_dupe_check) )
|
||||
{
|
||||
trx_id = trx.id();
|
||||
FC_ASSERT( trx_idx.indices().get<by_trx_id>().find(trx_id) == trx_idx.indices().get<by_trx_id>().end() );
|
||||
}
|
||||
|
||||
transaction_evaluation_state eval_state(this);
|
||||
const chain_parameters& chain_parameters = get_global_properties().parameters;
|
||||
eval_state._trx = &trx;
|
||||
|
|
@ -717,7 +722,7 @@ processed_transaction database::_apply_transaction(const signed_transaction& trx
|
|||
//Insert transaction into unique transactions database.
|
||||
if( !(skip & skip_transaction_dupe_check) )
|
||||
{
|
||||
create<transaction_object>([&](transaction_object& transaction) {
|
||||
create<transaction_object>([&trx_id,&trx](transaction_object& transaction) {
|
||||
transaction.trx_id = trx_id;
|
||||
transaction.trx = trx;
|
||||
});
|
||||
|
|
|
|||
|
|
@ -278,6 +278,25 @@ namespace graphene { namespace chain {
|
|||
*/
|
||||
class account_member_index : public secondary_index
|
||||
{
|
||||
/* std::less::operator() is less efficient so using key_compare here.
|
||||
* Let assume that it has two keys key1 and key2 and we want to insert key3.
|
||||
* the insert function needs to first call std::less::operator() with key1 and key3.
|
||||
* Assume std::less::operator()(key1, key3) returns false.
|
||||
* It has to call std::less::operator() again with the keys switched,
|
||||
* std::less::operator()(key3, key1), to decide whether key1 is equal to key3 or
|
||||
* key3 is greater than key1. There are two calls to std::less::operator() to make
|
||||
* a decision if the first call returns false.
|
||||
* std::map::insert and std::set used key_compare,
|
||||
* there would be sufficient information to make the right decision using just one call.
|
||||
*/
|
||||
class key_compare {
|
||||
public:
|
||||
inline bool operator()( const public_key_type& a, const public_key_type& b )const
|
||||
{
|
||||
return a.key_data < b.key_data;
|
||||
}
|
||||
};
|
||||
|
||||
public:
|
||||
virtual void object_inserted( const object& obj ) override;
|
||||
virtual void object_removed( const object& obj ) override;
|
||||
|
|
@ -287,18 +306,18 @@ namespace graphene { namespace chain {
|
|||
|
||||
/** given an account or key, map it to the set of accounts that reference it in an active or owner authority */
|
||||
map< account_id_type, set<account_id_type> > account_to_account_memberships;
|
||||
map< public_key_type, set<account_id_type> > account_to_key_memberships;
|
||||
map< public_key_type, set<account_id_type>, key_compare > account_to_key_memberships;
|
||||
/** some accounts use address authorities in the genesis block */
|
||||
map< address, set<account_id_type> > account_to_address_memberships;
|
||||
|
||||
|
||||
protected:
|
||||
set<account_id_type> get_account_members( const account_object& a )const;
|
||||
set<public_key_type> get_key_members( const account_object& a )const;
|
||||
set<public_key_type, key_compare> get_key_members( const account_object& a )const;
|
||||
set<address> get_address_members( const account_object& a )const;
|
||||
|
||||
set<account_id_type> before_account_members;
|
||||
set<public_key_type> before_key_members;
|
||||
set<public_key_type, key_compare> before_key_members;
|
||||
set<address> before_address_members;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -230,8 +230,16 @@ namespace graphene { namespace chain {
|
|||
share_type settlement_fund;
|
||||
///@}
|
||||
|
||||
/// The time when @ref current_feed would expire
|
||||
time_point_sec feed_expiration_time()const
|
||||
{ return current_feed_publication_time + options.feed_lifetime_sec; }
|
||||
{
|
||||
uint32_t current_feed_seconds = current_feed_publication_time.sec_since_epoch();
|
||||
if( std::numeric_limits<uint32_t>::max() - current_feed_seconds <= options.feed_lifetime_sec )
|
||||
return time_point_sec::maximum();
|
||||
else
|
||||
return current_feed_publication_time + options.feed_lifetime_sec;
|
||||
}
|
||||
|
||||
bool feed_is_expired_before_hardfork_615(time_point_sec current_time)const
|
||||
{ return feed_expiration_time() >= current_time; }
|
||||
bool feed_is_expired(time_point_sec current_time)const
|
||||
|
|
|
|||
|
|
@ -540,4 +540,19 @@ BOOST_AUTO_TEST_CASE( merkle_root )
|
|||
BOOST_CHECK( block.calculate_merkle_root() == c(dO) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Reproduces https://github.com/bitshares/bitshares-core/issues/888 and tests fix for it.
|
||||
*/
|
||||
BOOST_AUTO_TEST_CASE( bitasset_feed_expiration_test )
|
||||
{
|
||||
time_point_sec now = fc::time_point::now();
|
||||
|
||||
asset_bitasset_data_object o;
|
||||
|
||||
o.current_feed_publication_time = now - fc::hours(1);
|
||||
o.options.feed_lifetime_sec = std::numeric_limits<uint32_t>::max() - 1;
|
||||
|
||||
BOOST_CHECK( !o.feed_is_expired( now ) );
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
|
|
|||
Loading…
Reference in a new issue