HARDFORK: fix address authority
Accounts that use address_auths rather than key_auths would fail to recognize a properly signed transaction. This is only relevant to genesis accounts for imported collateral positions.
This commit is contained in:
parent
738abf03af
commit
a3082897ae
1 changed files with 44 additions and 0 deletions
|
|
@ -114,6 +114,42 @@ struct sign_state
|
|||
return itr->second = true;
|
||||
}
|
||||
|
||||
optional<map<address,public_key_type>> available_address_sigs;
|
||||
optional<map<address,public_key_type>> provided_address_sigs;
|
||||
|
||||
bool signed_by( const address& a ) {
|
||||
if( !available_address_sigs ) {
|
||||
available_address_sigs = std::map<address,public_key_type>();
|
||||
provided_address_sigs = std::map<address,public_key_type>();
|
||||
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() )
|
||||
|
|
|
|||
Loading…
Reference in a new issue