#98 Add signature verification

This commit is contained in:
Daniel Larimer 2015-06-28 15:34:52 -04:00
parent 4695405c52
commit 73d55c2d94
2 changed files with 34 additions and 0 deletions

View file

@ -435,6 +435,24 @@ processed_transaction database::apply_transaction( const signed_transaction& trx
return result;
}
struct signature_check_visitor
{
typedef void result_type;
const signed_transaction& trx;
signature_check_visitor( const signed_transaction& t ):trx(t){}
template<typename T>
result_type operator()( const T& o )const{}
result_type operator()( const balance_claim_operation& o )const
{
for( auto& owner : o.owners )
FC_ASSERT( trx.extra_signatures.find(owner) != trx.extra_signatures.end() );
}
};
processed_transaction database::_apply_transaction( const signed_transaction& trx )
{ try {
uint32_t skip = get_node_properties().skip_flags;
@ -459,6 +477,16 @@ processed_transaction database::_apply_transaction( const signed_transaction& tr
("key_address",sig.first(*this).key_address())
("addr", address(fc::ecc::public_key( sig.second, trx.digest() ))) );
}
for( const auto& sig : trx.extra_signatures )
{
FC_ASSERT( sig.first == address(fc::ecc::public_key( sig.second, trx.digest() )), "",
("trx",trx)
("digest",trx.digest())
("sig.first",sig.first)
("addr", address(fc::ecc::public_key( sig.second, trx.digest() ))) );
}
trx.visit( signature_check_visitor(trx) );
}
//If we're skipping tapos check, but not dupe check, assume all transactions have maximum expiration time.

View file

@ -127,6 +127,12 @@ namespace graphene { namespace chain {
for( auto& op : operations )
op.visit( std::forward<Visitor>( visitor ) );
}
template<typename Visitor>
void visit( Visitor&& visitor )const
{
for( auto& op : operations )
op.visit( std::forward<Visitor>( visitor ) );
}
protected:
// Intentionally unreflected: does not go on wire