adding extra indexing of accounts by address auths
This commit is contained in:
parent
2f0065d593
commit
4228360409
3 changed files with 86 additions and 26 deletions
|
|
@ -1090,17 +1090,38 @@ namespace graphene { namespace app {
|
||||||
*/
|
*/
|
||||||
vector<vector<account_id_type>> database_api::get_key_references( vector<public_key_type> keys )const
|
vector<vector<account_id_type>> database_api::get_key_references( vector<public_key_type> keys )const
|
||||||
{
|
{
|
||||||
|
wdump( (keys) );
|
||||||
vector< vector<account_id_type> > final_result;
|
vector< vector<account_id_type> > final_result;
|
||||||
final_result.reserve(keys.size());
|
final_result.reserve(keys.size());
|
||||||
|
|
||||||
for( auto& key : keys )
|
for( auto& key : keys )
|
||||||
{
|
{
|
||||||
|
address a1( pts_address(key, false, 56) );
|
||||||
|
address a2( pts_address(key, true, 56) );
|
||||||
|
address a3( pts_address(key, false, 0) );
|
||||||
|
address a4( pts_address(key, true, 0) );
|
||||||
|
address a5( key );
|
||||||
|
|
||||||
const auto& idx = _db.get_index_type<account_index>();
|
const auto& idx = _db.get_index_type<account_index>();
|
||||||
const auto& aidx = dynamic_cast<const primary_index<account_index>&>(idx);
|
const auto& aidx = dynamic_cast<const primary_index<account_index>&>(idx);
|
||||||
const auto& refs = aidx.get_secondary_index<graphene::chain::account_member_index>();
|
const auto& refs = aidx.get_secondary_index<graphene::chain::account_member_index>();
|
||||||
auto itr = refs.account_to_key_memberships.find(key);
|
auto itr = refs.account_to_key_memberships.find(key);
|
||||||
vector<account_id_type> result;
|
vector<account_id_type> result;
|
||||||
|
|
||||||
|
for( auto& a : {a1,a2,a3,a4,a5} )
|
||||||
|
{
|
||||||
|
auto itr = refs.account_to_address_memberships.find(a);
|
||||||
|
if( itr != refs.account_to_address_memberships.end() )
|
||||||
|
{
|
||||||
|
result.reserve( itr->second.size() );
|
||||||
|
for( auto item : itr->second )
|
||||||
|
{
|
||||||
|
wdump((a)(item)(item(_db).name));
|
||||||
|
result.push_back(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( itr != refs.account_to_key_memberships.end() )
|
if( itr != refs.account_to_key_memberships.end() )
|
||||||
{
|
{
|
||||||
result.reserve( itr->second.size() );
|
result.reserve( itr->second.size() );
|
||||||
|
|
|
||||||
|
|
@ -140,6 +140,13 @@ set<public_key_type> account_member_index::get_key_members(const account_object&
|
||||||
result.insert(auth.first);
|
result.insert(auth.first);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
set<address> account_member_index::get_address_members(const account_object& a)const
|
||||||
|
{
|
||||||
|
set<address> result;
|
||||||
|
for( auto auth : a.owner.address_auths )
|
||||||
|
result.insert(auth.first);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void account_member_index::object_inserted(const object& obj)
|
void account_member_index::object_inserted(const object& obj)
|
||||||
{
|
{
|
||||||
|
|
@ -153,6 +160,10 @@ void account_member_index::object_inserted(const object& obj)
|
||||||
auto key_members = get_key_members(a);
|
auto key_members = get_key_members(a);
|
||||||
for( auto item : key_members )
|
for( auto item : key_members )
|
||||||
account_to_key_memberships[item].insert(obj.id);
|
account_to_key_memberships[item].insert(obj.id);
|
||||||
|
|
||||||
|
auto address_members = get_address_members(a);
|
||||||
|
for( auto item : address_members )
|
||||||
|
account_to_address_memberships[item].insert(obj.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void account_member_index::object_removed(const object& obj)
|
void account_member_index::object_removed(const object& obj)
|
||||||
|
|
@ -163,6 +174,11 @@ void account_member_index::object_removed(const object& obj)
|
||||||
auto key_members = get_key_members(a);
|
auto key_members = get_key_members(a);
|
||||||
for( auto item : key_members )
|
for( auto item : key_members )
|
||||||
account_to_key_memberships[item].erase( obj.id );
|
account_to_key_memberships[item].erase( obj.id );
|
||||||
|
|
||||||
|
auto address_members = get_address_members(a);
|
||||||
|
for( auto item : address_members )
|
||||||
|
account_to_address_memberships[item].erase( obj.id );
|
||||||
|
|
||||||
auto account_members = get_account_members(a);
|
auto account_members = get_account_members(a);
|
||||||
for( auto item : account_members )
|
for( auto item : account_members )
|
||||||
account_to_account_memberships[item].erase( obj.id );
|
account_to_account_memberships[item].erase( obj.id );
|
||||||
|
|
@ -175,6 +191,7 @@ void account_member_index::about_to_modify(const object& before)
|
||||||
assert( dynamic_cast<const account_object*>(&before) ); // for debug only
|
assert( dynamic_cast<const account_object*>(&before) ); // for debug only
|
||||||
const account_object& a = static_cast<const account_object&>(before);
|
const account_object& a = static_cast<const account_object&>(before);
|
||||||
before_key_members = get_key_members(a);
|
before_key_members = get_key_members(a);
|
||||||
|
before_address_members = get_address_members(a);
|
||||||
before_account_members = get_account_members(a);
|
before_account_members = get_account_members(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -182,47 +199,65 @@ void account_member_index::object_modified(const object& after)
|
||||||
{
|
{
|
||||||
assert( dynamic_cast<const account_object*>(&after) ); // for debug only
|
assert( dynamic_cast<const account_object*>(&after) ); // for debug only
|
||||||
const account_object& a = static_cast<const account_object&>(after);
|
const account_object& a = static_cast<const account_object&>(after);
|
||||||
set<account_id_type> after_account_members = get_account_members(a);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
vector<account_id_type> removed; removed.reserve(before_account_members.size());
|
set<account_id_type> after_account_members = get_account_members(a);
|
||||||
std::set_difference(before_account_members.begin(), before_account_members.end(),
|
vector<account_id_type> removed; removed.reserve(before_account_members.size());
|
||||||
after_account_members.begin(), after_account_members.end(),
|
std::set_difference(before_account_members.begin(), before_account_members.end(),
|
||||||
std::inserter(removed, removed.end()));
|
after_account_members.begin(), after_account_members.end(),
|
||||||
|
std::inserter(removed, removed.end()));
|
||||||
|
|
||||||
for( auto itr = removed.begin(); itr != removed.end(); ++itr )
|
for( auto itr = removed.begin(); itr != removed.end(); ++itr )
|
||||||
account_to_account_memberships[*itr].erase(after.id);
|
account_to_account_memberships[*itr].erase(after.id);
|
||||||
|
|
||||||
vector<object_id_type> added; added.reserve(after_account_members.size());
|
vector<object_id_type> added; added.reserve(after_account_members.size());
|
||||||
std::set_difference(after_account_members.begin(), after_account_members.end(),
|
std::set_difference(after_account_members.begin(), after_account_members.end(),
|
||||||
before_account_members.begin(), before_account_members.end(),
|
before_account_members.begin(), before_account_members.end(),
|
||||||
std::inserter(added, added.end()));
|
std::inserter(added, added.end()));
|
||||||
|
|
||||||
for( auto itr = added.begin(); itr != added.end(); ++itr )
|
for( auto itr = added.begin(); itr != added.end(); ++itr )
|
||||||
account_to_account_memberships[*itr].insert(after.id);
|
account_to_account_memberships[*itr].insert(after.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
set<public_key_type> 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(),
|
||||||
|
after_key_members.begin(), after_key_members.end(),
|
||||||
|
std::inserter(removed, removed.end()));
|
||||||
|
|
||||||
|
for( auto itr = removed.begin(); itr != removed.end(); ++itr )
|
||||||
|
account_to_key_memberships[*itr].erase(after.id);
|
||||||
|
|
||||||
|
vector<public_key_type> added; added.reserve(after_key_members.size());
|
||||||
|
std::set_difference(after_key_members.begin(), after_key_members.end(),
|
||||||
|
before_key_members.begin(), before_key_members.end(),
|
||||||
|
std::inserter(added, added.end()));
|
||||||
|
|
||||||
|
for( auto itr = added.begin(); itr != added.end(); ++itr )
|
||||||
|
account_to_key_memberships[*itr].insert(after.id);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
set<public_key_type> after_key_members = get_key_members(a);
|
set<address> after_address_members = get_address_members(a);
|
||||||
|
|
||||||
vector<public_key_type> removed; removed.reserve(before_key_members.size());
|
vector<address> removed; removed.reserve(before_address_members.size());
|
||||||
std::set_difference(before_key_members.begin(), before_key_members.end(),
|
std::set_difference(before_address_members.begin(), before_address_members.end(),
|
||||||
after_key_members.begin(), after_key_members.end(),
|
after_address_members.begin(), after_address_members.end(),
|
||||||
std::inserter(removed, removed.end()));
|
std::inserter(removed, removed.end()));
|
||||||
|
|
||||||
for( auto itr = removed.begin(); itr != removed.end(); ++itr )
|
for( auto itr = removed.begin(); itr != removed.end(); ++itr )
|
||||||
account_to_key_memberships[*itr].erase(after.id);
|
account_to_address_memberships[*itr].erase(after.id);
|
||||||
|
|
||||||
vector<public_key_type> added; added.reserve(after_key_members.size());
|
vector<address> added; added.reserve(after_address_members.size());
|
||||||
std::set_difference(after_key_members.begin(), after_key_members.end(),
|
std::set_difference(after_address_members.begin(), after_address_members.end(),
|
||||||
before_key_members.begin(), before_key_members.end(),
|
before_address_members.begin(), before_address_members.end(),
|
||||||
std::inserter(added, added.end()));
|
std::inserter(added, added.end()));
|
||||||
|
|
||||||
for( auto itr = added.begin(); itr != added.end(); ++itr )
|
for( auto itr = added.begin(); itr != added.end(); ++itr )
|
||||||
account_to_key_memberships[*itr].insert(after.id);
|
account_to_address_memberships[*itr].insert(after.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -250,14 +250,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 */
|
/** 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< 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> > account_to_key_memberships;
|
||||||
|
/** some accounts use address authorities in the genesis block */
|
||||||
|
map< address, set<account_id_type> > account_to_address_memberships;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
set<account_id_type> get_account_members( const account_object& a )const;
|
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> 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<account_id_type> before_account_members;
|
||||||
set<public_key_type> before_key_members;
|
set<public_key_type> before_key_members;
|
||||||
|
set<address> before_address_members;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue