本文整理汇总了C++中transaction_evaluation_state类的典型用法代码示例。如果您正苦于以下问题:C++ transaction_evaluation_state类的具体用法?C++ transaction_evaluation_state怎么用?C++ transaction_evaluation_state使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了transaction_evaluation_state类的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: evaluate
void user_auction_claim_operation::evaluate( transaction_evaluation_state& eval_state )
{ try {
FC_ASSERT( !"This operation is not enabled yet!" );
auto chain = eval_state._current_state;
auto obj = chain->get_object_record( this->auction_id );
FC_ASSERT( obj.valid(), "No such auction." );
auto auction = obj->as<user_auction_record>();
FC_ASSERT( auction.is_complete( *chain ), "Auction is not over yet." );
if( this->claim_balance )
{
FC_ASSERT( NOT auction.balance_claimed,
"Those auction winnings have already been claimed." );
eval_state.check_update_permission( auction.beneficiary );
eval_state.add_balance( auction.previous_bid );
auction.balance_claimed = true;
}
if( this->claim_object ) // set the item's owner to the winner
{
FC_ASSERT( NOT auction.object_claimed, "That object has already been claimed." );
eval_state.check_update_permission( auction.previous_bidder );
auto item = chain->get_object_record( auction.item );
FC_ASSERT( item->owner_object == auction._id, "An auction was being held for an item owned by someone else?");
item->owner_object = auction.previous_bidder;
chain->store_object_record( *item );
auction.object_claimed = true;
}
chain->store_object_record( object_record( auction ) );
} FC_CAPTURE_AND_RETHROW( (eval_state)(*this) ) }
开发者ID:NameShares,项目名称:nameshares,代码行数:29,代码来源:auction_operations.cpp
示例2: evaluate
void ad_operation::evaluate( transaction_evaluation_state& eval_state )const
{ try {
if( this->amount.amount <= 0 )
FC_CAPTURE_AND_THROW( negative_deposit, (amount) );
FC_ASSERT( !message.empty() );
FC_ASSERT( amount.asset_id == 0 );
const size_t message_kb = (message.size() / 1024) + 1;
const share_type required_fee = message_kb * BTS_BLOCKCHAIN_MIN_AD_FEE;
FC_ASSERT( amount.amount >= required_fee, "Message of size ${s} KiB requires at least ${a} satoshis to be pay!",
("s",message_kb)("a",required_fee) );
// half of the note fees goto collected fees(delegate pay), other go to ad owner
eval_state.min_fees[amount.asset_id] += required_fee;
FC_ASSERT( owner_account_id != 0 );
const oaccount_record owner_account_rec = eval_state.pending_state()->get_account_record( abs( this->owner_account_id ) );
FC_ASSERT( owner_account_rec.valid() );
auto owner_address = owner_account_rec->active_address();
auto ad_income_balance = eval_state.pending_state()->get_balance_record(withdraw_condition( withdraw_with_signature(owner_address), 0 ).get_address());
if( !ad_income_balance )
ad_income_balance = balance_record( owner_address, asset(0, 0), 0 );
auto ad_pay = amount.amount - required_fee;
ad_income_balance->balance += ad_pay;
ad_income_balance->last_update = eval_state.pending_state()->now();
ad_income_balance->deposit_date = eval_state.pending_state()->now();
eval_state.pending_state()->store_balance_record( *ad_income_balance );
eval_state.sub_balance( asset(ad_pay, amount.asset_id) );
// checking the signature of the publisher.
FC_ASSERT( publisher_account_id != 0 );
const oaccount_record publisher_account_rec = eval_state.pending_state()->get_account_record( abs( this->publisher_account_id ) );
FC_ASSERT( publisher_account_rec.valid() );
eval_state.check_signature( publisher_account_rec->active_key() );
ad_record record;
record.index.account_id = owner_account_id;
record.index.transaction_id = eval_state.trx.id();
record.publisher_id = publisher_account_id;
record.amount = amount;
record.message = message;
record.signer = message_signature;
// the message must be signed by the claimed publisher account
FC_ASSERT( publisher_account_rec->active_key() == record.signer_key() );
FC_ASSERT( !eval_state.pending_state()->get_ad_record( record.index ).valid() );
eval_state.pending_state()->store_ad_record( std::move( record ) );
} FC_CAPTURE_AND_RETHROW( (*this) ) }
开发者ID:tony8898,项目名称:dac_play,代码行数:57,代码来源:balance_operations.cpp
示例3: validate_name_output
void transaction_validator::validate_name_output( const trx_output& out,
transaction_evaluation_state& state,
const block_evaluation_state_ptr& block_state )
{
auto claim = out.as<claim_name_output>();
block_state->add_name_output( claim );
if( !state.has_name_input( claim ) )
{
auto name_rec = _db->lookup_name( claim.name );
FC_ASSERT( !name_rec );
}
FC_ASSERT( out.amount.unit == 0 );
state.add_output_asset( out.amount );
}
开发者ID:suykerbuyk,项目名称:bitshares_toolkit,代码行数:14,代码来源:transaction_validator.cpp
示例4: validate_signature_input
void transaction_validator::validate_signature_input( const meta_trx_input& in,
transaction_evaluation_state& state,
const block_evaluation_state_ptr& block_state )
{
auto claim = in.output.as<claim_by_signature_output>();
FC_ASSERT( state.has_signature( claim.owner ), "", ("owner",claim.owner)("sigs",state.sigs) );
state.add_input_asset( in.output.amount );
if( in.output.amount.unit == 0 )
{
accumulate_votes( in.output.amount.get_rounded_amount(), in.source.block_num, state );
block_state->add_input_delegate_votes( in.delegate_id, in.output.amount );
block_state->add_output_delegate_votes( state.trx.vote, in.output.amount );
}
}
开发者ID:suykerbuyk,项目名称:bitshares_toolkit,代码行数:15,代码来源:transaction_validator.cpp
示例5: evaluate
void data_operation::evaluate( transaction_evaluation_state& eval_state )const
{
#ifndef WIN32
#warning [SOFTFORK] Remove this check after BTS_V0_9_0_FORK_BLOCK_NUM has passed
#endif
FC_ASSERT( eval_state.pending_state()->get_head_block_num() >= BTS_V0_9_0_FORK_BLOCK_NUM );
}
开发者ID:BitMoneta,项目名称:bitshares,代码行数:7,代码来源:data_operations.cpp
示例6: evaluate
void burn_operation::evaluate( transaction_evaluation_state& eval_state )
{ try {
if( message.size() )
FC_ASSERT( amount.asset_id == 0 );
if( amount.asset_id == 0 )
{
FC_ASSERT( amount.amount >= BTS_BLOCKCHAIN_MIN_BURN_FEE, "",
("amount",amount)
("BTS_BLOCKCHAIN_MIN_BURN_FEE",BTS_BLOCKCHAIN_MIN_BURN_FEE) );
}
oasset_record asset_rec = eval_state._current_state->get_asset_record( amount.asset_id );
FC_ASSERT( asset_rec.valid() );
FC_ASSERT( !asset_rec->is_market_issued() );
asset_rec->current_share_supply -= this->amount.amount;
eval_state.sub_balance( address(), this->amount );
eval_state._current_state->store_asset_record( *asset_rec );
if( account_id != 0 ) // you can offer burnt offerings to God if you like... otherwise it must be an account
{
// TODO: support burning to any OBJECT ID not just accounts
const oaccount_record account_rec = eval_state._current_state->get_account_record( abs( this->account_id ) );
FC_ASSERT( account_rec.valid() );
}
eval_state._current_state->store_burn_record( burn_record( burn_record_key( {account_id, eval_state.trx.id()} ),
burn_record_value( {amount,message,message_signature} ) ) );
} FC_CAPTURE_AND_RETHROW( (*this) ) }
开发者ID:NameShares,项目名称:nameshares,代码行数:30,代码来源:balance_operations.cpp
示例7: evaluate
void domain_update_signin_operation::evaluate( transaction_evaluation_state& eval_state )
{
auto odomain_rec = eval_state._current_state->get_domain_record( this->domain_name );
auto now = eval_state._current_state->now().sec_since_epoch();
FC_ASSERT( odomain_rec.valid(), "Trying to update domain which does not exist" );
FC_ASSERT( odomain_rec->get_true_state(now) == domain_record::owned,
"Attempting to update a domain which is not in 'owned' state");
FC_ASSERT( eval_state.check_signature( odomain_rec->owner ), "Update not signed by owner" );
odomain_rec->signin_key = this->signin_key;
odomain_rec->last_update = eval_state._current_state->now().sec_since_epoch();
eval_state._current_state->store_domain_record( *odomain_rec );
}
开发者ID:tmptest1,项目名称:keyid,代码行数:12,代码来源:dns_operations.cpp
示例8: evaluate
void add_collateral_operation::evaluate( transaction_evaluation_state& eval_state )
{
FC_ASSERT(!"Not implemented for this DAC.\n");
if( this->cover_index.order_price == price() )
FC_CAPTURE_AND_THROW( zero_price, (cover_index.order_price) );
if( this->amount == 0 )
FC_CAPTURE_AND_THROW( zero_amount );
if( this->amount < 0 )
FC_CAPTURE_AND_THROW( negative_deposit );
asset delta_amount = this->get_amount();
eval_state.sub_balance( address(), delta_amount );
// update collateral and call price
auto current_cover = eval_state._current_state->get_collateral_record( this->cover_index );
if( NOT current_cover )
FC_CAPTURE_AND_THROW( unknown_market_order, (cover_index) );
current_cover->collateral_balance += delta_amount.amount;
// changing the payoff balance changes the call price... so we need to remove the old record
// and insert a new one.
eval_state._current_state->store_collateral_record( this->cover_index, collateral_record() );
auto new_call_price = asset(current_cover->payoff_balance, delta_amount.asset_id) /
asset((current_cover->collateral_balance*3)/4, 0);
eval_state._current_state->store_collateral_record( market_index_key( new_call_price, this->cover_index.owner),
*current_cover );
auto market_stat = eval_state._current_state->get_market_status( cover_index.order_price.quote_asset_id, cover_index.order_price.base_asset_id );
FC_ASSERT( market_stat, "this should be valid for there to even be a position to cover" );
market_stat->ask_depth += delta_amount.amount;
eval_state._current_state->store_market_status( *market_stat );
}
开发者ID:fanfu13,项目名称:DNS,代码行数:38,代码来源:market_operations.cpp
示例9: on_evaluate
transaction_summary transaction_validator::on_evaluate( transaction_evaluation_state& state,
const block_evaluation_state_ptr& block_state )
{
transaction_summary sum;
state.inputs = _db->fetch_inputs( state.trx.inputs );
auto trx_delegate = _db->lookup_delegate( state.trx.vote );
FC_ASSERT( !!trx_delegate, "unable to find delegate id ${id}", ("id",state.trx.vote) );
/** make sure inputs are unique */
std::unordered_set<output_reference> unique_inputs;
for( auto in : state.trx.inputs )
{
FC_ASSERT( unique_inputs.insert( in.output_ref ).second,
"transaction references same output more than once.", ("trx",state.trx) )
}
/** validate all inputs */
for( auto in : state.inputs )
{
FC_ASSERT( !in.meta_output.is_spent(), "", ("trx",state.trx) );
validate_input( in, state, block_state );
}
/** validate all inputs */
for( auto out : state.trx.outputs )
validate_output( out, state, block_state );
state.balance_assets();
sum.valid_votes = state.valid_votes;
sum.invalid_votes = state.invalid_votes;
sum.spent = state.spent;
sum.fees = state.get_total_in(0) - state.get_total_out(0);
if( state.get_required_fees() >= 0 )
{
FC_ASSERT( sum.fees >= state.get_required_fees(0), "",
("fees",sum.fees)("required",state.get_required_fees()));
}
return sum;
}
开发者ID:suykerbuyk,项目名称:bitshares_toolkit,代码行数:42,代码来源:transaction_validator.cpp
示例10: switch
void withdraw_operation::evaluate_v3( transaction_evaluation_state& eval_state )
{ try {
if( eval_state._current_state->get_head_block_num() < BTS_V0_4_15_FORK_BLOCK_NUM )
return evaluate_v2( eval_state );
if( this->amount <= 0 )
FC_CAPTURE_AND_THROW( negative_deposit, (amount) );
obalance_record current_balance_record = eval_state._current_state->get_balance_record( this->balance_id );
if( !current_balance_record )
FC_CAPTURE_AND_THROW( unknown_balance_record, (balance_id) );
if( this->amount > current_balance_record->balance ) // Some withdraw conditions require extra checks (e.g. vesting condition)
FC_CAPTURE_AND_THROW( insufficient_funds,
(current_balance_record)
(amount)
(current_balance_record->balance - amount) );
switch( (withdraw_condition_types)current_balance_record->condition.type )
{
case withdraw_signature_type:
{
auto owner = current_balance_record->condition.as<withdraw_with_signature>().owner;
if( !eval_state.check_signature( owner ) )
FC_CAPTURE_AND_THROW( missing_signature, (owner) );
break;
}
default:
FC_CAPTURE_AND_THROW( invalid_withdraw_condition, (current_balance_record->condition) );
}
// update delegate vote on withdrawn account..
if( current_balance_record->condition.asset_id == 0 && current_balance_record->condition.delegate_slate_id )
eval_state.adjust_vote( current_balance_record->condition.delegate_slate_id, -this->amount );
auto asset_rec = eval_state._current_state->get_asset_record( current_balance_record->condition.asset_id );
FC_ASSERT( asset_rec.valid() );
if( asset_rec->is_market_issued() )
{
auto yield = current_balance_record->calculate_yield_v1( eval_state._current_state->now(),
current_balance_record->balance,
asset_rec->collected_fees,
asset_rec->current_share_supply );
if( yield.amount > 0 )
{
asset_rec->collected_fees -= yield.amount;
current_balance_record->balance += yield.amount;
current_balance_record->deposit_date = eval_state._current_state->now();
eval_state.yield[current_balance_record->condition.asset_id] += yield.amount;
eval_state._current_state->store_asset_record( *asset_rec );
}
}
current_balance_record->balance -= this->amount;
current_balance_record->last_update = eval_state._current_state->now();
eval_state._current_state->store_balance_record( *current_balance_record );
eval_state.add_balance( asset(this->amount, current_balance_record->condition.asset_id) );
} FC_CAPTURE_AND_RETHROW( (*this) ) }
开发者ID:ProDataLab,项目名称:bitshares,代码行数:62,代码来源:balance_operations_v3.cpp
示例11: validate_pts_signature_output
void transaction_validator::validate_pts_signature_output( const trx_output& out,
transaction_evaluation_state& state,
const block_evaluation_state_ptr& block_state )
{
state.add_output_asset( out.amount );
}
开发者ID:suykerbuyk,项目名称:bitshares_toolkit,代码行数:6,代码来源:transaction_validator.cpp
示例12: validate_domain_output
void dns_transaction_validator::validate_domain_output(const trx_output& out, transaction_evaluation_state& state)
{
auto dns_state = dynamic_cast<dns_tx_evaluation_state&>(state);
FC_ASSERT( ! dns_state.seen_domain_output,
"More than one domain claim output in one tx: ${tx}", ("tx", state.trx) );
dns_state.seen_domain_output = true;
// "name" and "value" length limits
auto dns_out = out.as<claim_domain_output>();
dns_db* db = dynamic_cast<dns_db*>(_db);
FC_ASSERT( db != nullptr );
/* If we haven't seen a domain input then the only valid output is a new
* domain auction.
*/
if (! dns_state.seen_domain_input)
{
// name doesn't already exist (not in DB OR older than 1 year)
if ( db->has_dns_record(dns_out.name) )
{
auto old_record = db->get_dns_record(dns_out.name);
auto old_tx_id = old_record.last_update_ref.trx_hash;
auto block_num = db->fetch_trx_num(old_tx_id).block_num;
auto current_block = db->head_block_num();
if (current_block - block_num < BTS_BLOCKCHAIN_BLOCKS_PER_YEAR)
{
FC_ASSERT(!"Name already exists (and is younger than 1 block-year)");
}
}
FC_ASSERT(dns_out.flags == claim_domain_output::for_auction,
"New auction started with for_auction flag not set");
return;
}
/* Otherwise, the transaction must have a domain input and it must exist
* in the database, and it can't be expired
*/
//TODO do this just from the input without looking into the DB?
FC_ASSERT( db->has_dns_record(dns_out.name),
"Transaction references a name that doesn't exist");
auto old_record = db->get_dns_record(dns_out.name);
auto old_tx_id = old_record.last_update_ref.trx_hash;
auto block_num = db->fetch_trx_num(old_tx_id).block_num;
auto current_block = db->head_block_num();
auto block_age = current_block - block_num;
FC_ASSERT( block_age < BTS_BLOCKCHAIN_BLOCKS_PER_YEAR,
"Domain transaction references an expired domain as an input");
FC_ASSERT(dns_out.name == dns_state.dns_claimed.name,
"bid transaction refers to different input and output names");
// case on state of claimed output
// * if auction is over (not_for_sale OR output is older than 3 days)
if (dns_out.flags == claim_domain_output::not_for_sale
|| block_age >= 3 * BTS_BLOCKCHAIN_BLOCKS_PER_DAY)
{
// If you're the owner, do whatever you like!
if (! state.has_signature(dns_out.owner) )
{
FC_ASSERT(false, "Domain tx requiring signature doesn't have it: ${tx}",
("tx", state.trx));
}
} else {
// Currently in an auction
FC_ASSERT(dns_out.flags == claim_domain_output::for_auction,
"bid made without keeping for_auction flag");
//TODO use macros in dns_config.hpp instead of hard-coded constants
//TODO restore
FC_ASSERT(out.amount.get_rounded_amount() >=
(11 * dns_state.claimed.amount.get_rounded_amount()) / 10,
"Bid was too small: ${trx}", ("trx", state.trx) );
// half of difference goes to fee
dns_state.add_required_fees((out.amount - dns_state.claimed.amount) / 2);
// check for output to past owner
bool found = false;
for (auto other_out : state.trx.outputs)
{
bool right_claim = other_out.claim_func == claim_by_signature;
bool enough = (other_out.amount ==
dns_state.claimed.amount + (out.amount - dns_state.claimed.amount / 2));
bool to_owner = right_claim &&
other_out.as<claim_by_signature_output>().owner == dns_state.dns_claimed.owner;
if (right_claim && enough && to_owner)
{
found = true;
break;
}
}
if (!found)
{
FC_ASSERT(!"Bid did not pay enough to previous owner");
}
}
//.........这里部分代码省略.........
开发者ID:vipjeffreylee,项目名称:bitshares_toolkit,代码行数:101,代码来源:dns_transaction_validator.cpp
注:本文中的transaction_evaluation_state类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论