@@ -279,7 +279,6 @@ bool CLASS::get_height(size_t& out, const hash_digest& key) const NOEXCEPT
279279TEMPLATE
280280bool CLASS::get_height (size_t & out, const header_link& link) const NOEXCEPT
281281{
282- // Use get_height(..., key) in place of get(to_header(key)).
283282 const auto height = get_height (link);
284283 if (height >= height_link::terminal)
285284 return false ;
@@ -347,86 +346,20 @@ bool CLASS::get_tx_spend(uint64_t& out, const tx_link& link) const NOEXCEPT
347346TEMPLATE
348347bool CLASS::get_tx_fee (uint64_t & out, const tx_link& link) const NOEXCEPT
349348{
350- #if defined(SLOW_FEES)
351- const auto tx = get_transaction (link, false );
352- if (!tx)
353- return false ;
354-
355- // Prevent coinbase populate failure.
356- if (tx->is_coinbase ())
357- {
358- out = zero;
359- return true ;
360- }
361-
362- if (!populate_without_metadata (*tx))
363- return false ;
364-
365- out = tx->fee ();
366- return true ;
367- #elif defined(FAST_FEES)
368- table::transaction::get_coinbase tx{};
369- if (!store_.tx .get (link, tx))
370- return false ;
371-
372- // Prevent coinbase overspend failure.
373- if (tx.coinbase )
374- {
375- out = zero;
376- return true ;
377- }
378-
379- uint64_t value{}, spend{};
380- if (!get_tx_value (value, link) || !get_tx_spend (spend, link) ||
381- spend > value)
382- return false ;
383-
384- out = value - spend;
385- return true ;
386- #else // FASTER_FEES
387- table::transaction::get_puts tx{};
388- if (!store_.tx .get (link, tx))
349+ uint64_t value{};
350+ if (!get_tx_value (value, link))
389351 return false ;
390352
391- // Shortcircuit coinbase prevout read.
392- if (tx.coinbase )
393- {
394- out = zero;
353+ // Zero input implies either zero output or coinbase (both zero).
354+ if (is_zero (value))
395355 return true ;
396- }
397-
398- uint64_t value{};
399- auto point_fk = tx.points_fk ;
400- for (size_t index{}; index < tx.ins_count ; ++index)
401- {
402- table::point::get_composed point{};
403- if (!store_.point .get (point_fk++, point))
404- return false ;
405-
406- uint64_t one_value{};
407- if (!get_value (one_value, to_output (point.key ))) return false ;
408- value = system::ceilinged_add (value, one_value);
409- }
410-
411- table::outs::record outs{};
412- outs.out_fks .resize (tx.outs_count );
413- if (!store_.outs .get (tx.outs_fk , outs))
414- return false ;
415356
416357 uint64_t spend{};
417- for (const auto & output_fk: outs.out_fks )
418- {
419- uint64_t one_spend{};
420- if (!get_value (one_spend, output_fk)) return false ;
421- spend = system::ceilinged_add (spend, one_spend);
422- }
423-
424- if (spend > value)
358+ if (!get_tx_spend (spend, link) || spend > value)
425359 return false ;
426360
427361 out = value - spend;
428362 return true ;
429- #endif // SLOW_FEES
430363}
431364
432365TEMPLATE
@@ -490,49 +423,16 @@ bool CLASS::get_block_spend(uint64_t& out,
490423}
491424
492425TEMPLATE
493- bool CLASS::get_block_fee (uint64_t & out, const header_link& link) const NOEXCEPT
426+ bool CLASS::get_block_fee (uint64_t & out,
427+ const header_link& link) const NOEXCEPT
494428{
495- #if defined(SLOW_FEES)
496- const auto block = get_block (link, false );
497- if (!block || !populate_without_metadata (*block))
498- return false ;
499-
500- out = block->fees ();
501- return true ;
502- #elif defined(FAST_FEES)
503429 uint64_t value{}, spend{};
504430 if (!get_block_value (value, link) || !get_block_spend (spend, link) ||
505431 spend > value)
506432 return false ;
507433
508434 out = value - spend;
509435 return true ;
510- #else // FASTER_FEES
511- table::txs::get_txs txs{};
512- if (!store_.txs .at (to_txs (link), txs) || (txs.tx_fks .size () < one))
513- return false ;
514-
515- std::atomic_bool fail{};
516- const auto begin = std::next (txs.tx_fks .begin ());
517- constexpr auto parallel = poolstl::execution::par;
518- constexpr auto relaxed = std::memory_order_relaxed;
519-
520- out = std::transform_reduce (parallel, begin, txs.tx_fks .end (), 0_u64,
521- [](uint64_t left, uint64_t right) NOEXCEPT
522- {
523- return system::ceilinged_add (left, right);
524- },
525- [&](const auto & tx_fk) NOEXCEPT
526- {
527- uint64_t fee{};
528- if (!fail.load (relaxed) && !get_tx_fee (fee, tx_fk))
529- fail.store (true , relaxed);
530-
531- return fee;
532- });
533-
534- return !fail.load (relaxed);
535- #endif // SLOW_FEES
536436}
537437
538438} // namespace database
0 commit comments