Implement `GetUnpaidActionCount` and `GetWeightRatio` for ZIP 317.
Signed-off-by: Daira Emma Hopwood <daira@jacaranda.org>
This commit is contained in:
parent
6cb4c9e144
commit
c111bff3d7
|
@ -244,6 +244,7 @@ BITCOIN_CORE_H = \
|
||||||
httprpc.h \
|
httprpc.h \
|
||||||
httpserver.h \
|
httpserver.h \
|
||||||
init.h \
|
init.h \
|
||||||
|
int128.h \
|
||||||
key.h \
|
key.h \
|
||||||
key_constants.h \
|
key_constants.h \
|
||||||
key_io.h \
|
key_io.h \
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright (c) 2023 The Zcash developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or https://www.opensource.org/licenses/mit-license.php .
|
||||||
|
|
||||||
|
#ifndef ZCASH_INT128_H
|
||||||
|
#define ZCASH_INT128_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
// <cstdint> will define INT128_MAX iff (in some future world) it provides int128_t.
|
||||||
|
// Otherwise use the __int128 extension which is supported in clang and gcc.
|
||||||
|
#ifndef INT128_MAX
|
||||||
|
typedef __int128 int128_t;
|
||||||
|
#define INT128_MAX (std::numeric_limits<int128_t>::max())
|
||||||
|
#define INT128_MIN (std::numeric_limits<int128_t>::min())
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <cstdint> will define UINT128_MAX iff (in some future world) it provides uint128_t.
|
||||||
|
// Otherwise use the __uint128_t extension which is supported in clang and gcc.
|
||||||
|
#ifndef UINT128_MAX
|
||||||
|
typedef __uint128_t uint128_t;
|
||||||
|
#define UINT128_MAX (std::numeric_limits<uint128_t>::max())
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // ZCASH_INT128_H
|
|
@ -17,6 +17,8 @@
|
||||||
#include "util/moneystr.h"
|
#include "util/moneystr.h"
|
||||||
#include "validationinterface.h"
|
#include "validationinterface.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
#include "mempool_limit.h"
|
||||||
|
#include "zip317.h"
|
||||||
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
|
@ -298,6 +300,27 @@ void CTxMemPoolEntry::SetDirty()
|
||||||
nModFeesWithDescendants = GetModifiedFee();
|
nModFeesWithDescendants = GetModifiedFee();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t CTxMemPoolEntry::GetUnpaidActionCount() const
|
||||||
|
{
|
||||||
|
if (tx->IsCoinBase()) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return std::max(
|
||||||
|
int64_t {0},
|
||||||
|
(int64_t) std::max(GRACE_ACTIONS, tx->GetLogicalActionCount()) - (GetModifiedFee() / MARGINAL_FEE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a fixed-point representation of the entry's weight ratio, where 1 is represented by WEIGHT_RATIO_SCALE.
|
||||||
|
int128_t CTxMemPoolEntry::GetWeightRatio() const
|
||||||
|
{
|
||||||
|
// ensure that the result will always be nonzero
|
||||||
|
static_assert(WEIGHT_RATIO_SCALE > MAX_MONEY);
|
||||||
|
return std::min(
|
||||||
|
(int128_t {WEIGHT_RATIO_SCALE} * std::max(CAmount {1}, GetModifiedFee())) / tx->GetConventionalFee(),
|
||||||
|
int128_t {WEIGHT_RATIO_SCALE} * WEIGHT_RATIO_CAP);
|
||||||
|
}
|
||||||
|
|
||||||
void CTxMemPoolEntry::UpdateState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount)
|
void CTxMemPoolEntry::UpdateState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount)
|
||||||
{
|
{
|
||||||
if (!IsDirty()) {
|
if (!IsDirty()) {
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
|
#include "int128.h"
|
||||||
#include "amount.h"
|
#include "amount.h"
|
||||||
#include "coins.h"
|
#include "coins.h"
|
||||||
#include "mempool_limit.h"
|
#include "mempool_limit.h"
|
||||||
|
@ -87,6 +88,15 @@ public:
|
||||||
const CTransaction& GetTx() const { return *this->tx; }
|
const CTransaction& GetTx() const { return *this->tx; }
|
||||||
std::shared_ptr<const CTransaction> GetSharedTx() const { return this->tx; }
|
std::shared_ptr<const CTransaction> GetSharedTx() const { return this->tx; }
|
||||||
const CAmount& GetFee() const { return nFee; }
|
const CAmount& GetFee() const { return nFee; }
|
||||||
|
|
||||||
|
// Return the number of unpaid actions calculated according to ZIP 317.
|
||||||
|
// <https://zips.z.cash/zip-0317#recommended-algorithm-for-block-template-construction>
|
||||||
|
size_t GetUnpaidActionCount() const;
|
||||||
|
|
||||||
|
// Return a fixed-point representation of the entry's weight ratio according
|
||||||
|
// to ZIP 317, where 1 is represented by WEIGHT_RATIO_SCALE.
|
||||||
|
int128_t GetWeightRatio() const;
|
||||||
|
|
||||||
size_t GetTxSize() const { return nTxSize; }
|
size_t GetTxSize() const { return nTxSize; }
|
||||||
int64_t GetTime() const { return nTime; }
|
int64_t GetTime() const { return nTime; }
|
||||||
unsigned int GetHeight() const { return nHeight; }
|
unsigned int GetHeight() const { return nHeight; }
|
||||||
|
|
Loading…
Reference in New Issue