void transaction_evaluation_state::evaluate( const signed_transaction& trx_arg, bool skip_signature_check, bool enforce_canonical ) { try { _skip_signature_check = skip_signature_check; try { if( _current_state->now() >= trx_arg.expiration ) { if( _current_state->now() > trx_arg.expiration || _current_state->get_head_block_num() >= BTS_V0_4_21_FORK_BLOCK_NUM ) { const auto expired_by_sec = (_current_state->now() - trx_arg.expiration).to_seconds(); FC_CAPTURE_AND_THROW( expired_transaction, (trx_arg)(_current_state->now())(expired_by_sec) ); } } if( (_current_state->now() + BTS_BLOCKCHAIN_MAX_TRANSACTION_EXPIRATION_SEC) < trx_arg.expiration ) FC_CAPTURE_AND_THROW( invalid_transaction_expiration, (trx_arg)(_current_state->now()) ); auto trx_id = trx_arg.id(); if( _current_state->is_known_transaction( trx_arg.expiration, trx_arg.digest( _chain_id ) ) ) if (_current_state->get_head_block_num() >= FORK_25) FC_CAPTURE_AND_THROW( duplicate_transaction, (trx_id) ); trx = trx_arg; if( !_skip_signature_check ) { auto digest = trx_arg.digest( _chain_id ); for( const auto& sig : trx.signatures ) { auto key = fc::ecc::public_key( sig, digest, enforce_canonical ).serialize(); signed_keys.insert( address(key) ); signed_keys.insert( address(pts_address(key,false,56) ) ); signed_keys.insert( address(pts_address(key,true,56) ) ); signed_keys.insert( address(pts_address(key,false,0) ) ); signed_keys.insert( address(pts_address(key,true,0) ) ); } } current_op_index = 0; for( const auto& op : trx.operations ) { evaluate_operation( op ); ++current_op_index; } post_evaluate(); validate_required_fee(); update_delegate_votes(); } catch ( const fc::exception& e ) { validation_error = e; throw; } } FC_RETHROW_EXCEPTIONS( warn, "", ("trx",trx_arg) ) }
void transaction_evaluation_state::evaluate( const signed_transaction& trx_arg ) { try { reset(); auto trx_id = trx_arg.id(); otransaction_location current_loc = _current_state->get_transaction_location( trx_id ); if( !!current_loc ) fail( BTS_DUPLICATE_TRANSACTION, "transaction has already been processed" ); trx = trx_arg; auto digest = trx_arg.digest(); for( auto sig : trx.signatures ) { auto key = fc::ecc::public_key( sig, digest ).serialize(); signed_keys.insert( address(key) ); signed_keys.insert( address(pts_address(key,false,56) ) ); signed_keys.insert( address(pts_address(key,true,56) ) ); signed_keys.insert( address(pts_address(key,false,0) ) ); signed_keys.insert( address(pts_address(key,true,0) ) ); } for( auto op : trx.operations ) { evaluate_operation( op ); } post_evaluate(); validate_required_fee(); update_delegate_votes(); } FC_RETHROW_EXCEPTIONS( warn, "", ("trx",trx_arg) ) }
void transaction_evaluation_state::evaluate( const signed_transaction& trx_arg, bool skip_signature_check ) { try { reset(); _skip_signature_check = skip_signature_check; try { if( trx_arg.expiration < _current_state->now() ) { auto expired_by_sec = (trx_arg.expiration - _current_state->now()).to_seconds(); FC_CAPTURE_AND_THROW( expired_transaction, (trx_arg)(_current_state->now())(expired_by_sec) ); } if( trx_arg.expiration > (_current_state->now() + BTS_BLOCKCHAIN_MAX_TRANSACTION_EXPIRATION_SEC) ) FC_CAPTURE_AND_THROW( invalid_transaction_expiration, (trx_arg)(_current_state->now()) ); auto trx_size = fc::raw::pack_size(trx_arg); if( trx_size > BTS_BLOCKCHAIN_MAX_TRANSACTION_SIZE ) FC_CAPTURE_AND_THROW( oversized_transaction, (trx_size ) ); auto trx_id = trx_arg.id(); if( _current_state->is_known_transaction( trx_id ) ) FC_CAPTURE_AND_THROW( duplicate_transaction, (trx_id) ); trx = trx_arg; if( !_skip_signature_check ) { auto digest = trx_arg.digest( _chain_id ); for( auto sig : trx.signatures ) { auto key = fc::ecc::public_key( sig, digest ).serialize(); signed_keys.insert( address(key) ); signed_keys.insert( address(pts_address(key,false,56) ) ); signed_keys.insert( address(pts_address(key,true,56) ) ); signed_keys.insert( address(pts_address(key,false,0) ) ); signed_keys.insert( address(pts_address(key,true,0) ) ); } } for( auto op : trx.operations ) { evaluate_operation( op ); } post_evaluate(); validate_required_fee(); update_delegate_votes(); } catch ( const fc::exception& e ) { validation_error = e; throw; } } FC_RETHROW_EXCEPTIONS( warn, "", ("trx",trx_arg) ) }
void transaction_evaluation_state::evaluate( const signed_transaction& trx_arg ) { try { reset(); try { if( trx_arg.expiration && *trx_arg.expiration < _current_state->now() ) FC_CAPTURE_AND_THROW( expired_transaction, (trx_arg)(_current_state->now()) ); auto trx_id = trx_arg.id(); ilog( "id: ${id}", ("id",trx_id) ); otransaction_record known_transaction= _current_state->get_transaction( trx_id ); if( known_transaction ) FC_CAPTURE_AND_THROW( duplicate_transaction, (known_transaction) ); trx = trx_arg; auto digest = trx_arg.digest( _chain_id ); for( auto sig : trx.signatures ) { auto key = fc::ecc::public_key( sig, digest ).serialize(); signed_keys.insert( address(key) ); signed_keys.insert( address(pts_address(key,false,56) ) ); signed_keys.insert( address(pts_address(key,true,56) ) ); signed_keys.insert( address(pts_address(key,false,0) ) ); signed_keys.insert( address(pts_address(key,true,0) ) ); } for( auto op : trx.operations ) { evaluate_operation( op ); } post_evaluate(); validate_required_fee(); update_delegate_votes(); } catch ( const fc::exception& e ) { validation_error = e; throw; } } FC_RETHROW_EXCEPTIONS( warn, "", ("trx",trx_arg) ) }