mirror of
https://github.com/monero-project/monero.git
synced 2025-08-08 10:02:22 -04:00
Support median block size > 4 GB
add a 128/64 division routine so we can use a > 32 bit median block size in calculations
This commit is contained in:
parent
b60cf6a938
commit
be82c40703
6 changed files with 174 additions and 14 deletions
|
@ -3223,8 +3223,8 @@ uint64_t Blockchain::get_dynamic_base_fee(uint64_t block_reward, size_t median_b
|
|||
if (version >= HF_VERSION_PER_BYTE_FEE)
|
||||
{
|
||||
lo = mul128(block_reward, DYNAMIC_FEE_REFERENCE_TRANSACTION_WEIGHT, &hi);
|
||||
div128_32(hi, lo, min_block_weight, &hi, &lo);
|
||||
div128_32(hi, lo, median_block_weight, &hi, &lo);
|
||||
div128_64(hi, lo, min_block_weight, &hi, &lo, NULL, NULL);
|
||||
div128_64(hi, lo, median_block_weight, &hi, &lo, NULL, NULL);
|
||||
assert(hi == 0);
|
||||
lo /= 5;
|
||||
return lo;
|
||||
|
@ -3234,12 +3234,7 @@ uint64_t Blockchain::get_dynamic_base_fee(uint64_t block_reward, size_t median_b
|
|||
|
||||
uint64_t unscaled_fee_base = (fee_base * min_block_weight / median_block_weight);
|
||||
lo = mul128(unscaled_fee_base, block_reward, &hi);
|
||||
static_assert(DYNAMIC_FEE_PER_KB_BASE_BLOCK_REWARD % 1000000 == 0, "DYNAMIC_FEE_PER_KB_BASE_BLOCK_REWARD must be divisible by 1000000");
|
||||
static_assert(DYNAMIC_FEE_PER_KB_BASE_BLOCK_REWARD / 1000000 <= std::numeric_limits<uint32_t>::max(), "DYNAMIC_FEE_PER_KB_BASE_BLOCK_REWARD is too large");
|
||||
|
||||
// divide in two steps, since the divisor must be 32 bits, but DYNAMIC_FEE_PER_KB_BASE_BLOCK_REWARD isn't
|
||||
div128_32(hi, lo, DYNAMIC_FEE_PER_KB_BASE_BLOCK_REWARD / 1000000, &hi, &lo);
|
||||
div128_32(hi, lo, 1000000, &hi, &lo);
|
||||
div128_64(hi, lo, DYNAMIC_FEE_PER_KB_BASE_BLOCK_REWARD, &hi, &lo, NULL, NULL);
|
||||
assert(hi == 0);
|
||||
|
||||
// quantize fee up to 8 decimals
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue