Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
sysio::chain::transaction_context Class Reference

#include <transaction_context.hpp>

Collaboration diagram for sysio::chain::transaction_context:

Public Member Functions

 transaction_context (controller &c, const packed_transaction &t, transaction_checktime_timer &&timer, fc::time_point start=fc::time_point::now(), bool read_only=false)
 
 ~transaction_context ()
 
void init_for_implicit_trx (uint64_t initial_net_usage=0)
 
void init_for_input_trx (uint64_t packed_trx_unprunable_size, uint64_t packed_trx_prunable_size)
 
void init_for_deferred_trx (fc::time_point published)
 
void exec ()
 
void finalize ()
 
void squash ()
 
void undo ()
 
void add_net_usage (uint64_t u)
 
void check_net_usage () const
 
void checktime () const
 
template<typename DigestType >
DigestType hash_with_checktime (const char *data, uint32_t datalen) const
 
void pause_billing_timer ()
 
void resume_billing_timer ()
 
uint32_t update_billed_cpu_time (fc::time_point now)
 
std::tuple< int64_t, int64_t, bool, bool > max_bandwidth_billed_accounts_can_pay (bool force_elastic_limits=false) const
 
void validate_referenced_accounts (const transaction &trx, bool enforce_actor_whitelist_blacklist) const
 record_transaction
 

Public Attributes

controllercontrol
 Fields:
 
const packed_transactionpacked_trx
 
std::optional< chainbase::database::sessionundo_session
 
transaction_trace_ptr trace
 
fc::time_point start
 
fc::time_point published
 
vector< digest_typeexecuted_action_receipt_digests
 
flat_set< account_namebill_to_accounts
 
flat_set< account_namevalidate_ram_usage
 
uint64_t initial_max_billable_cpu = 0
 the maximum number of virtual CPU instructions of the transaction that can be safely billed to the billable accounts
 
fc::microseconds delay
 
bool is_input = false
 
bool apply_context_free = true
 
bool enforce_whiteblacklist = true
 
fc::time_point block_deadline = fc::time_point::maximum()
 
fc::microseconds leeway = fc::microseconds( config::default_subjective_cpu_leeway_us )
 
int64_t billed_cpu_time_us = 0
 
int64_t subjective_cpu_bill_us = 0
 
bool explicit_billed_cpu_time = false
 
transaction_checktime_timer transaction_timer
 
const bool is_read_only
 

Friends

struct controller_impl
 
class apply_context
 

Detailed Description

Definition at line 32 of file transaction_context.hpp.

Constructor & Destructor Documentation

◆ transaction_context()

sysio::chain::transaction_context::transaction_context ( controller & c,
const packed_transaction & t,
transaction_checktime_timer && timer,
fc::time_point start = fc::time_point::now(),
bool read_only = false )

Definition at line 47 of file transaction_context.cpp.

52 :control(c)
53 ,packed_trx(t)
55 ,trace(std::make_shared<transaction_trace>())
56 ,start(s)
57 ,transaction_timer(std::move(tmr))
59 ,net_usage(trace->net_usage)
60 ,pseudo_start(s)
61 {
62 if (!c.skip_db_sessions()) {
63 undo_session.emplace(c.mutable_db().start_undo_session(true));
64 }
65 trace->id = packed_trx.id();
66 trace->block_num = c.head_block_num() + 1;
67 trace->block_time = c.pending_block_time();
68 trace->producer_block_id = c.pending_producer_block_id();
69
70 if(auto dm_logger = control.get_deep_mind_logger())
71 {
72 dm_logger->on_start_transaction();
73 }
74 }
deep_mind_handler * get_deep_mind_logger() const
const packed_transaction & packed_trx
transaction_checktime_timer transaction_timer
std::optional< chainbase::database::session > undo_session
@ read_only
const transaction_id_type & id() const
char * s
Here is the call graph for this function:

◆ ~transaction_context()

sysio::chain::transaction_context::~transaction_context ( )

Definition at line 76 of file transaction_context.cpp.

77 {
78 if(auto dm_logger = control.get_deep_mind_logger())
79 {
80 dm_logger->on_end_transaction();
81 }
82 }
Here is the call graph for this function:

Member Function Documentation

◆ add_net_usage()

void sysio::chain::transaction_context::add_net_usage ( uint64_t u)
inline

Definition at line 57 of file transaction_context.hpp.

57{ net_usage += u; check_net_usage(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_net_usage()

void sysio::chain::transaction_context::check_net_usage ( ) const

Definition at line 404 of file transaction_context.cpp.

404 {
405 if (!control.skip_trx_checks()) {
406 if( BOOST_UNLIKELY(net_usage > eager_net_limit) ) {
407 if ( net_limit_due_to_block ) {
408 SYS_THROW( block_net_usage_exceeded,
409 "not enough space left in block: ${net_usage} > ${net_limit}",
410 ("net_usage", net_usage)("net_limit", eager_net_limit) );
411 } else if (net_limit_due_to_greylist) {
412 SYS_THROW( greylist_net_usage_exceeded,
413 "greylisted transaction net usage is too high: ${net_usage} > ${net_limit}",
414 ("net_usage", net_usage)("net_limit", eager_net_limit) );
415 } else {
416 SYS_THROW( tx_net_usage_exceeded,
417 "transaction net usage is too high: ${net_usage} > ${net_limit}",
418 ("net_usage", net_usage)("net_limit", eager_net_limit) );
419 }
420 }
421 }
422 }
#define SYS_THROW(exc_type, FORMAT,...)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ checktime()

void sysio::chain::transaction_context::checktime ( ) const

Definition at line 424 of file transaction_context.cpp.

424 {
425 if(BOOST_LIKELY(transaction_timer.expired == false))
426 return;
427
428 auto now = fc::time_point::now();
429 if( explicit_billed_cpu_time || deadline_exception_code == deadline_exception::code_value ) {
430 SYS_THROW( deadline_exception, "deadline exceeded ${billing_timer}us",
431 ("billing_timer", now - pseudo_start)("now", now)("deadline", _deadline)("start", start) );
432 } else if( deadline_exception_code == block_cpu_usage_exceeded::code_value ) {
433 SYS_THROW( block_cpu_usage_exceeded,
434 "not enough time left in block to complete executing transaction ${billing_timer}us",
435 ("now", now)("deadline", _deadline)("start", start)("billing_timer", now - pseudo_start) );
436 } else if( deadline_exception_code == tx_cpu_usage_exceeded::code_value ) {
437 if (cpu_limit_due_to_greylist) {
438 SYS_THROW( greylist_cpu_usage_exceeded,
439 "greylisted transaction was executing for too long ${billing_timer}us",
440 ("now", now)("deadline", _deadline)("start", start)("billing_timer", now - pseudo_start) );
441 } else {
442 SYS_THROW( tx_cpu_usage_exceeded,
443 "transaction was executing for too long ${billing_timer}us",
444 ("now", now)("deadline", _deadline)("start", start)("billing_timer", now - pseudo_start) );
445 }
446 } else if( deadline_exception_code == leeway_deadline_exception::code_value ) {
447 SYS_THROW( leeway_deadline_exception,
448 "the transaction was unable to complete by deadline, "
449 "but it is possible it could have succeeded if it were allowed to run to completion ${billing_timer}",
450 ("now", now)("deadline", _deadline)("start", start)("billing_timer", now - pseudo_start) );
451 }
452 SYS_ASSERT( false, transaction_exception, "unexpected deadline exception code ${code}", ("code", deadline_exception_code) );
453 }
#define SYS_ASSERT(expr, exc_type, FORMAT,...)
Definition exceptions.hpp:7
static time_point now()
Definition time.cpp:14
key Invalid authority Invalid transaction Invalid block ID Invalid packed transaction Invalid chain ID Invalid symbol Signature type is not a currently activated type Block can not be found Unlinkable block Block does not guarantee concurrent execution without conflicts Block exhausted allowed resources Block is from the future Block is not signed by expected producer Block includes an ill formed protocol feature activation extension Block includes an ill formed additional block signature extension transaction_exception
Here is the call graph for this function:
Here is the caller graph for this function:

◆ exec()

void sysio::chain::transaction_context::exec ( )

Definition at line 313 of file transaction_context.cpp.

313 {
314 SYS_ASSERT( is_initialized, transaction_exception, "must first initialize" );
315
316 const transaction& trx = packed_trx.get_transaction();
317 if( apply_context_free ) {
318 for( const auto& act : trx.context_free_actions ) {
319 schedule_action( act, act.account, true, 0, 0 );
320 }
321 }
322
323 if( delay == fc::microseconds() ) {
324 for( const auto& act : trx.actions ) {
325 schedule_action( act, act.account, false, 0, 0 );
326 }
327 }
328
329 auto& action_traces = trace->action_traces;
330 uint32_t num_original_actions_to_execute = action_traces.size();
331 for( uint32_t i = 1; i <= num_original_actions_to_execute; ++i ) {
332 execute_action( i, 0 );
333 }
334
335 if( delay != fc::microseconds() ) {
336 schedule_transaction();
337 }
338 }
unsigned int uint32_t
Definition stdint.h:126
const transaction & get_transaction() const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ finalize()

void sysio::chain::transaction_context::finalize ( )

Definition at line 340 of file transaction_context.cpp.

340 {
341 SYS_ASSERT( is_initialized, transaction_exception, "must first initialize" );
342
343 if( is_input ) {
344 const transaction& trx = packed_trx.get_transaction();
346 for( const auto& act : trx.actions ) {
347 for( const auto& auth : act.authorization ) {
348 am.update_permission_usage( am.get_permission(auth) );
349 }
350 }
351 }
352
353 // auto& rl = control.get_mutable_resource_limits_manager();
354 // for( auto a : validate_ram_usage ) {
355 // rl.verify_account_ram_usage( a );
356 // }
357
358 // // Calculate the new highest network usage and CPU time that all of the billed accounts can afford to be billed
359 // int64_t account_net_limit = 0;
360 // int64_t account_cpu_limit = 0;
361 // bool greylisted_net = false, greylisted_cpu = false;
362 // std::tie( account_net_limit, account_cpu_limit, greylisted_net, greylisted_cpu) = max_bandwidth_billed_accounts_can_pay();
363 // net_limit_due_to_greylist |= greylisted_net;
364 // cpu_limit_due_to_greylist |= greylisted_cpu;
365
366 // // Possibly lower net_limit to what the billed accounts can pay
367 // if( static_cast<uint64_t>(account_net_limit) <= net_limit ) {
368 // // NOTE: net_limit may possibly not be objective anymore due to net greylisting, but it should still be no greater than the truly objective net_limit
369 // net_limit = static_cast<uint64_t>(account_net_limit);
370 // net_limit_due_to_block = false;
371 // }
372
373 // // Possibly lower objective_duration_limit to what the billed accounts can pay
374 // if( account_cpu_limit <= objective_duration_limit.count() ) {
375 // // NOTE: objective_duration_limit may possibly not be objective anymore due to cpu greylisting, but it should still be no greater than the truly objective objective_duration_limit
376 // objective_duration_limit = fc::microseconds(account_cpu_limit);
377 // billing_timer_exception_code = tx_cpu_usage_exceeded::code_value;
378 // }
379
380 net_usage = ((net_usage + 7)/8)*8; // Round up to nearest multiple of word size (8 bytes)
381
382 eager_net_limit = net_limit;
384
385 auto now = fc::time_point::now();
386 trace->elapsed = now - start;
387
389
390 // validate_cpu_usage_to_bill( billed_cpu_time_us, account_cpu_limit, true );
391 // auto& rl = control.get_mutable_resource_limits_manager();
392 // rl.add_transaction_usage( bill_to_accounts, static_cast<uint64_t>(billed_cpu_time_us), net_usage,
393 // block_timestamp_type(control.pending_block_time()).slot ); // Should never fail
394 }
authorization_manager & get_mutable_authorization_manager()
uint32_t update_billed_cpu_time(fc::time_point now)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ hash_with_checktime()

template<typename DigestType >
DigestType sysio::chain::transaction_context::hash_with_checktime ( const char * data,
uint32_t datalen ) const
inline

Definition at line 64 of file transaction_context.hpp.

64 {
65 const size_t bs = sysio::chain::config::hashing_checktime_block_size;
66 typename DigestType::encoder enc;
67 while ( datalen > bs ) {
68 enc.write( data, bs );
69 data += bs;
70 datalen -= bs;
71 checktime();
72 }
73 enc.write( data, datalen );
74 return enc.result();
75 }
CK_ULONG datalen
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_for_deferred_trx()

void sysio::chain::transaction_context::init_for_deferred_trx ( fc::time_point published)

Definition at line 296 of file transaction_context.cpp.

297 {
298 const transaction& trx = packed_trx.get_transaction();
299 if( (trx.expiration.sec_since_epoch() != 0) && (trx.transaction_extensions.size() > 0) ) {
300 disallow_transaction_extensions( "no transaction extensions supported yet for deferred transactions" );
301 }
302 // If (trx.expiration.sec_since_epoch() == 0) then it was created after NO_DUPLICATE_DEFERRED_ID activation,
303 // and so validation of its extensions was done either in:
304 // * apply_context::schedule_deferred_transaction for contract-generated transactions;
305 // * or transaction_context::init_for_input_trx for delayed input transactions.
306
307 published = p;
308 trace->scheduled = true;
309 apply_context_free = false;
310 init( 0 );
311 }
const mie::Vuint & p
Definition bn.cpp:27
void init()
Definition lib_test.cpp:3
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_for_implicit_trx()

void sysio::chain::transaction_context::init_for_implicit_trx ( uint64_t initial_net_usage = 0)

Definition at line 244 of file transaction_context.cpp.

245 {
246 const transaction& trx = packed_trx.get_transaction();
247 if( trx.transaction_extensions.size() > 0 ) {
248 disallow_transaction_extensions( "no transaction extensions supported yet for implicit transactions" );
249 }
250
252 init( initial_net_usage);
253 }
time_point pending_block_time() const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_for_input_trx()

void sysio::chain::transaction_context::init_for_input_trx ( uint64_t packed_trx_unprunable_size,
uint64_t packed_trx_prunable_size )

checks for dupes

Definition at line 255 of file transaction_context.cpp.

257 {
258 const transaction& trx = packed_trx.get_transaction();
259 if( trx.transaction_extensions.size() > 0 ) {
260 disallow_transaction_extensions( "no transaction extensions supported yet for input transactions" );
261 }
262
263 const auto& cfg = control.get_global_properties().configuration;
264
265 uint64_t discounted_size_for_pruned_data = packed_trx_prunable_size;
266 if( cfg.context_free_discount_net_usage_den > 0
267 && cfg.context_free_discount_net_usage_num < cfg.context_free_discount_net_usage_den )
268 {
269 discounted_size_for_pruned_data *= cfg.context_free_discount_net_usage_num;
270 discounted_size_for_pruned_data = ( discounted_size_for_pruned_data + cfg.context_free_discount_net_usage_den - 1)
271 / cfg.context_free_discount_net_usage_den; // rounds up
272 }
273
274 uint64_t initial_net_usage = static_cast<uint64_t>(cfg.base_per_transaction_net_usage)
275 + packed_trx_unprunable_size + discounted_size_for_pruned_data;
276
277
278 if( trx.delay_sec.value > 0 ) {
279 // If delayed, also charge ahead of time for the additional net usage needed to retire the delayed transaction
280 // whether that be by successfully executing, soft failure, hard failure, or expiration.
281 initial_net_usage += static_cast<uint64_t>(cfg.base_per_transaction_net_usage)
282 + static_cast<uint64_t>(config::transaction_id_net_usage);
283 }
284
286 is_input = true;
287 if (!control.skip_trx_checks()) {
291 }
292 init( initial_net_usage);
293 record_transaction( packed_trx.id(), trx.expiration );
294 }
const global_property_object & get_global_properties() const
bool is_producing_block() const
void validate_expiration(const transaction &t) const
void validate_tapos(const transaction &t) const
void validate_referenced_accounts(const transaction &trx, bool enforce_actor_whitelist_blacklist) const
record_transaction
unsigned __int64 uint64_t
Definition stdint.h:136
Here is the call graph for this function:
Here is the caller graph for this function:

◆ max_bandwidth_billed_accounts_can_pay()

std::tuple< int64_t, int64_t, bool, bool > sysio::chain::transaction_context::max_bandwidth_billed_accounts_can_pay ( bool force_elastic_limits = false) const

Definition at line 574 of file transaction_context.cpp.

574 {
575 // Assumes rl.update_account_usage( bill_to_accounts, block_timestamp_type(control.pending_block_time()).slot ) was already called prior
576
577 // Calculate the new highest network usage and CPU time that all of the billed accounts can afford to be billed
579 const static int64_t large_number_no_overflow = std::numeric_limits<int64_t>::max()/2;
580 int64_t account_net_limit = large_number_no_overflow;
581 int64_t account_cpu_limit = large_number_no_overflow;
582 bool greylisted_net = false;
583 bool greylisted_cpu = false;
584
585 uint32_t specified_greylist_limit = control.get_greylist_limit();
586 for( const auto& a : bill_to_accounts ) {
587 uint32_t greylist_limit = config::maximum_elastic_resource_multiplier;
588 if( !force_elastic_limits && control.is_producing_block() ) {
590 greylist_limit = 1;
591 } else {
592 greylist_limit = specified_greylist_limit;
593 }
594 }
595 auto [net_limit, net_was_greylisted] = rl.get_account_net_limit(a, greylist_limit);
596 if( net_limit >= 0 ) {
597 account_net_limit = std::min( account_net_limit, net_limit );
598 greylisted_net |= net_was_greylisted;
599 }
600 auto [cpu_limit, cpu_was_greylisted] = rl.get_account_cpu_limit(a, greylist_limit);
601 if( cpu_limit >= 0 ) {
602 account_cpu_limit = std::min( account_cpu_limit, cpu_limit );
603 greylisted_cpu |= cpu_was_greylisted;
604 }
605 }
606
607 SYS_ASSERT( (!force_elastic_limits && control.is_producing_block()) || (!greylisted_cpu && !greylisted_net),
608 transaction_exception, "greylisted when not producing block" );
609
610 return std::make_tuple(account_net_limit, account_cpu_limit, greylisted_net, greylisted_cpu);
611 }
uint32_t get_greylist_limit() const
bool is_resource_greylisted(const account_name &name) const
resource_limits_manager & get_mutable_resource_limits_manager()
flat_set< account_name > bill_to_accounts
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition pointer.h:1181
signed __int64 int64_t
Definition stdint.h:135
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pause_billing_timer()

void sysio::chain::transaction_context::pause_billing_timer ( )

Definition at line 455 of file transaction_context.cpp.

455 {
456 if( explicit_billed_cpu_time || pseudo_start == fc::time_point() ) return; // either irrelevant or already paused
457
458 paused_time = fc::time_point::now();
459 billed_time = paused_time - pseudo_start;
460 pseudo_start = fc::time_point();
462 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ resume_billing_timer()

void sysio::chain::transaction_context::resume_billing_timer ( )

Definition at line 464 of file transaction_context.cpp.

464 {
465 if( explicit_billed_cpu_time || pseudo_start != fc::time_point() ) return; // either irrelevant or already running
466
467 auto now = fc::time_point::now();
468 auto paused = now - paused_time;
469
470 pseudo_start = now - billed_time;
471 _deadline += paused;
472
473 // do not allow to go past block wall clock deadline
474 if( block_deadline < _deadline ) {
475 deadline_exception_code = deadline_exception::code_value;
476 _deadline = block_deadline;
477 }
478
479 transaction_timer.start(_deadline);
480 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ squash()

void sysio::chain::transaction_context::squash ( )

Definition at line 396 of file transaction_context.cpp.

396 {
397 if (undo_session) undo_session->squash();
398 }
Here is the caller graph for this function:

◆ undo()

void sysio::chain::transaction_context::undo ( )

Definition at line 400 of file transaction_context.cpp.

400 {
401 if (undo_session) undo_session->undo();
402 }
Here is the caller graph for this function:

◆ update_billed_cpu_time()

uint32_t sysio::chain::transaction_context::update_billed_cpu_time ( fc::time_point now)

Definition at line 565 of file transaction_context.cpp.

565 {
566 if( explicit_billed_cpu_time ) return static_cast<uint32_t>(billed_cpu_time_us);
567
568 const auto& cfg = control.get_global_properties().configuration;
569 billed_cpu_time_us = std::max( (now - pseudo_start).count(), static_cast<int64_t>(cfg.min_transaction_cpu_usage) );
570
571 return static_cast<uint32_t>(billed_cpu_time_us);
572 }
int * count
Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_referenced_accounts()

void sysio::chain::transaction_context::validate_referenced_accounts ( const transaction & trx,
bool enforce_actor_whitelist_blacklist ) const

Definition at line 739 of file transaction_context.cpp.

739 {
740 const auto& db = control.db();
741 const auto& auth_manager = control.get_authorization_manager();
742
743 for( const auto& a : trx.context_free_actions ) {
744 auto* code = db.find<account_object, by_name>(a.account);
745 SYS_ASSERT( code != nullptr, transaction_exception,
746 "action's code account '${account}' does not exist", ("account", a.account) );
747 SYS_ASSERT( a.authorization.size() == 0, transaction_exception,
748 "context-free actions cannot have authorizations" );
749 }
750
751 flat_set<account_name> actors;
752
753 bool one_auth = false;
754 for( const auto& a : trx.actions ) {
755 auto* code = db.find<account_object, by_name>(a.account);
756 SYS_ASSERT( code != nullptr, transaction_exception,
757 "action's code account '${account}' does not exist", ("account", a.account) );
758 for( const auto& auth : a.authorization ) {
759 one_auth = true;
760 auto* actor = db.find<account_object, by_name>(auth.actor);
761 SYS_ASSERT( actor != nullptr, transaction_exception,
762 "action's authorizing actor '${account}' does not exist", ("account", auth.actor) );
763 SYS_ASSERT( auth_manager.find_permission(auth) != nullptr, transaction_exception,
764 "action's authorizations include a non-existent permission: ${permission}",
765 ("permission", auth) );
766 if( enforce_actor_whitelist_blacklist )
767 actors.insert( auth.actor );
768 }
769 }
770 SYS_ASSERT( one_auth || is_read_only, tx_no_auths, "transaction must have at least one authorization" );
771
772 if( enforce_actor_whitelist_blacklist ) {
773 control.check_actor_list( actors );
774 }
775 }
const chainbase::database & db() const
const authorization_manager & get_authorization_manager() const
void check_actor_list(const flat_set< account_name > &actors) const
Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Symbol Documentation

◆ apply_context

friend class apply_context
friend

Definition at line 89 of file transaction_context.hpp.

◆ controller_impl

friend struct controller_impl
friend

Definition at line 88 of file transaction_context.hpp.

Member Data Documentation

◆ apply_context_free

bool sysio::chain::transaction_context::apply_context_free = true

Definition at line 140 of file transaction_context.hpp.

◆ bill_to_accounts

flat_set<account_name> sysio::chain::transaction_context::bill_to_accounts

Definition at line 132 of file transaction_context.hpp.

◆ billed_cpu_time_us

int64_t sysio::chain::transaction_context::billed_cpu_time_us = 0

Definition at line 145 of file transaction_context.hpp.

◆ block_deadline

fc::time_point sysio::chain::transaction_context::block_deadline = fc::time_point::maximum()

Definition at line 143 of file transaction_context.hpp.

◆ control

controller& sysio::chain::transaction_context::control

Definition at line 122 of file transaction_context.hpp.

◆ delay

fc::microseconds sysio::chain::transaction_context::delay

Definition at line 138 of file transaction_context.hpp.

◆ enforce_whiteblacklist

bool sysio::chain::transaction_context::enforce_whiteblacklist = true

Definition at line 141 of file transaction_context.hpp.

◆ executed_action_receipt_digests

vector<digest_type> sysio::chain::transaction_context::executed_action_receipt_digests

Definition at line 131 of file transaction_context.hpp.

◆ explicit_billed_cpu_time

bool sysio::chain::transaction_context::explicit_billed_cpu_time = false

Definition at line 147 of file transaction_context.hpp.

◆ initial_max_billable_cpu

uint64_t sysio::chain::transaction_context::initial_max_billable_cpu = 0

Definition at line 136 of file transaction_context.hpp.

◆ is_input

bool sysio::chain::transaction_context::is_input = false

Definition at line 139 of file transaction_context.hpp.

◆ is_read_only

const bool sysio::chain::transaction_context::is_read_only

Definition at line 151 of file transaction_context.hpp.

◆ leeway

fc::microseconds sysio::chain::transaction_context::leeway = fc::microseconds( config::default_subjective_cpu_leeway_us )

Definition at line 144 of file transaction_context.hpp.

◆ packed_trx

const packed_transaction& sysio::chain::transaction_context::packed_trx

Definition at line 123 of file transaction_context.hpp.

◆ published

fc::time_point sysio::chain::transaction_context::published

Definition at line 128 of file transaction_context.hpp.

◆ start

fc::time_point sysio::chain::transaction_context::start

Definition at line 126 of file transaction_context.hpp.

◆ subjective_cpu_bill_us

int64_t sysio::chain::transaction_context::subjective_cpu_bill_us = 0

Definition at line 146 of file transaction_context.hpp.

◆ trace

transaction_trace_ptr sysio::chain::transaction_context::trace

Definition at line 125 of file transaction_context.hpp.

◆ transaction_timer

transaction_checktime_timer sysio::chain::transaction_context::transaction_timer

Definition at line 149 of file transaction_context.hpp.

◆ undo_session

std::optional<chainbase::database::session> sysio::chain::transaction_context::undo_session

Definition at line 124 of file transaction_context.hpp.

◆ validate_ram_usage

flat_set<account_name> sysio::chain::transaction_context::validate_ram_usage

Definition at line 133 of file transaction_context.hpp.


The documentation for this class was generated from the following files: