diff --git a/libraries/chain/protocol/transaction.cpp b/libraries/chain/protocol/transaction.cpp index 86c8a2108e..c0740d2e8b 100644 --- a/libraries/chain/protocol/transaction.cpp +++ b/libraries/chain/protocol/transaction.cpp @@ -114,6 +114,42 @@ struct sign_state return itr->second = true; } + optional> available_address_sigs; + optional> provided_address_sigs; + + bool signed_by( const address& a ) { + if( !available_address_sigs ) { + available_address_sigs = std::map(); + provided_address_sigs = std::map(); + for( auto& item : available_keys ) { + (*available_address_sigs)[ address(pts_address(item, false, 56) ) ] = item; + (*available_address_sigs)[ address(pts_address(item, true, 56) ) ] = item; + (*available_address_sigs)[ address(pts_address(item, false, 0) ) ] = item; + (*available_address_sigs)[ address(pts_address(item, true, 0) ) ] = item; + (*available_address_sigs)[ address(item) ] = item; + } + for( auto& item : provided_signatures ) { + (*provided_address_sigs)[ address(pts_address(item.first, false, 56) ) ] = item.first; + (*provided_address_sigs)[ address(pts_address(item.first, true, 56) ) ] = item.first; + (*provided_address_sigs)[ address(pts_address(item.first, false, 0) ) ] = item.first; + (*provided_address_sigs)[ address(pts_address(item.first, true, 0) ) ] = item.first; + (*provided_address_sigs)[ address(item.first) ] = item.first; + } + } + auto itr = provided_address_sigs->find(a); + if( itr == provided_address_sigs->end() ) + { + auto aitr = available_address_sigs->find(a); + if( aitr != available_address_sigs->end() ) { + auto pk = available_keys.find(aitr->second); + if( pk != available_keys.end() ) + return provided_signatures[aitr->second] = true; + return false; + } + } + return provided_signatures[itr->second] = true; + } + bool check_authority( account_id_type id ) { if( approved_by.find(id) != approved_by.end() ) return true; @@ -138,6 +174,14 @@ struct sign_state return true; } + for( const auto& k : auth.address_auths ) + if( signed_by( k.first ) ) + { + total_weight += k.second; + if( total_weight >= auth.weight_threshold ) + return true; + } + for( const auto& a : auth.account_auths ) { if( approved_by.find(a.first) == approved_by.end() )