From 4228360409a7dcced0ea8adfcaf32b2ec0597ab2 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Thu, 20 Aug 2015 15:19:15 -0400 Subject: [PATCH] adding extra indexing of accounts by address auths --- libraries/app/api.cpp | 21 +++++ libraries/chain/account_object.cpp | 89 +++++++++++++------ .../include/graphene/chain/account_object.hpp | 4 + 3 files changed, 87 insertions(+), 27 deletions(-) diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index c0625711a8..ef7f3a1317 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -1090,17 +1090,38 @@ namespace graphene { namespace app { */ vector> database_api::get_key_references( vector keys )const { + wdump( (keys) ); vector< vector > final_result; final_result.reserve(keys.size()); 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(); const auto& aidx = dynamic_cast&>(idx); const auto& refs = aidx.get_secondary_index(); auto itr = refs.account_to_key_memberships.find(key); vector 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() ) { result.reserve( itr->second.size() ); diff --git a/libraries/chain/account_object.cpp b/libraries/chain/account_object.cpp index 387ad917cc..bd670c1261 100644 --- a/libraries/chain/account_object.cpp +++ b/libraries/chain/account_object.cpp @@ -140,6 +140,13 @@ set account_member_index::get_key_members(const account_object& result.insert(auth.first); return result; } +set
account_member_index::get_address_members(const account_object& a)const +{ + set
result; + for( auto auth : a.owner.address_auths ) + result.insert(auth.first); + return result; +} 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); for( auto item : key_members ) 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) @@ -163,6 +174,11 @@ void account_member_index::object_removed(const object& obj) auto key_members = get_key_members(a); for( auto item : key_members ) 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); for( auto item : account_members ) 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(&before) ); // for debug only const account_object& a = static_cast(before); before_key_members = get_key_members(a); + before_address_members = get_address_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(&after) ); // for debug only const account_object& a = static_cast(after); - set after_account_members = get_account_members(a); { - vector removed; removed.reserve(before_account_members.size()); - std::set_difference(before_account_members.begin(), before_account_members.end(), - after_account_members.begin(), after_account_members.end(), - std::inserter(removed, removed.end())); + set after_account_members = get_account_members(a); + vector removed; removed.reserve(before_account_members.size()); + std::set_difference(before_account_members.begin(), before_account_members.end(), + after_account_members.begin(), after_account_members.end(), + std::inserter(removed, removed.end())); + + for( auto itr = removed.begin(); itr != removed.end(); ++itr ) + account_to_account_memberships[*itr].erase(after.id); + + vector added; added.reserve(after_account_members.size()); + std::set_difference(after_account_members.begin(), after_account_members.end(), + before_account_members.begin(), before_account_members.end(), + std::inserter(added, added.end())); + + for( auto itr = added.begin(); itr != added.end(); ++itr ) + account_to_account_memberships[*itr].insert(after.id); + } - for( auto itr = removed.begin(); itr != removed.end(); ++itr ) - account_to_account_memberships[*itr].erase(after.id); - vector added; added.reserve(after_account_members.size()); - std::set_difference(after_account_members.begin(), after_account_members.end(), - before_account_members.begin(), before_account_members.end(), - std::inserter(added, added.end())); + { + set after_key_members = get_key_members(a); - for( auto itr = added.begin(); itr != added.end(); ++itr ) - account_to_account_memberships[*itr].insert(after.id); - } + vector 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 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 after_key_members = get_key_members(a); + set
after_address_members = get_address_members(a); - vector 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())); + vector
removed; removed.reserve(before_address_members.size()); + std::set_difference(before_address_members.begin(), before_address_members.end(), + after_address_members.begin(), after_address_members.end(), + std::inserter(removed, removed.end())); - for( auto itr = removed.begin(); itr != removed.end(); ++itr ) - account_to_key_memberships[*itr].erase(after.id); + for( auto itr = removed.begin(); itr != removed.end(); ++itr ) + account_to_address_memberships[*itr].erase(after.id); - vector 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())); + vector
added; added.reserve(after_address_members.size()); + std::set_difference(after_address_members.begin(), after_address_members.end(), + before_address_members.begin(), before_address_members.end(), + std::inserter(added, added.end())); - for( auto itr = added.begin(); itr != added.end(); ++itr ) - account_to_key_memberships[*itr].insert(after.id); + for( auto itr = added.begin(); itr != added.end(); ++itr ) + account_to_address_memberships[*itr].insert(after.id); } } diff --git a/libraries/chain/include/graphene/chain/account_object.hpp b/libraries/chain/include/graphene/chain/account_object.hpp index cb4f61c766..675f11b8e2 100644 --- a/libraries/chain/include/graphene/chain/account_object.hpp +++ b/libraries/chain/include/graphene/chain/account_object.hpp @@ -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 */ map< account_id_type, set > account_to_account_memberships; map< public_key_type, set > account_to_key_memberships; + /** some accounts use address authorities in the genesis block */ + map< address, set > account_to_address_memberships; protected: set get_account_members( const account_object& a )const; set get_key_members( const account_object& a )const; + set
get_address_members( const account_object& a )const; set before_account_members; set before_key_members; + set
before_address_members; }; /**