mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 21:12:48 +01:00
Merge #8363: Rename "block cost" to "block weight"
2c06bae
Rename "block cost" to "block weight" (Suhas Daftuar)
This commit is contained in:
commit
ca7550e128
@ -1065,12 +1065,12 @@ class SegWitTest(BitcoinTestFramework):
|
|||||||
assert_equal(wit_block.serialize(False), non_wit_block.serialize())
|
assert_equal(wit_block.serialize(False), non_wit_block.serialize())
|
||||||
assert_equal(wit_block.serialize(True), block.serialize(True))
|
assert_equal(wit_block.serialize(True), block.serialize(True))
|
||||||
|
|
||||||
# Test size, vsize, cost
|
# Test size, vsize, weight
|
||||||
rpc_details = self.nodes[0].getblock(block.hash, True)
|
rpc_details = self.nodes[0].getblock(block.hash, True)
|
||||||
assert_equal(rpc_details["size"], len(block.serialize(True)))
|
assert_equal(rpc_details["size"], len(block.serialize(True)))
|
||||||
assert_equal(rpc_details["strippedsize"], len(block.serialize(False)))
|
assert_equal(rpc_details["strippedsize"], len(block.serialize(False)))
|
||||||
cost = 3*len(block.serialize(False)) + len(block.serialize(True))
|
weight = 3*len(block.serialize(False)) + len(block.serialize(True))
|
||||||
assert_equal(rpc_details["cost"], cost)
|
assert_equal(rpc_details["weight"], weight)
|
||||||
|
|
||||||
# Upgraded node should not ask for blocks from unupgraded
|
# Upgraded node should not ask for blocks from unupgraded
|
||||||
block4 = self.build_next_block(nVersion=4)
|
block4 = self.build_next_block(nVersion=4)
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
/** The maximum allowed size for a serialized block, in bytes (only for buffer size limits) */
|
/** The maximum allowed size for a serialized block, in bytes (only for buffer size limits) */
|
||||||
static const unsigned int MAX_BLOCK_SERIALIZED_SIZE = 4000000;
|
static const unsigned int MAX_BLOCK_SERIALIZED_SIZE = 4000000;
|
||||||
/** The maximum allowed cost for a block, see BIP 141 (network rule) */
|
/** The maximum allowed weight for a block, see BIP 141 (network rule) */
|
||||||
static const unsigned int MAX_BLOCK_COST = 4000000;
|
static const unsigned int MAX_BLOCK_WEIGHT = 4000000;
|
||||||
/** The maximum allowed size for a block excluding witness data, in bytes (network rule) */
|
/** The maximum allowed size for a block excluding witness data, in bytes (network rule) */
|
||||||
static const unsigned int MAX_BLOCK_BASE_SIZE = 1000000;
|
static const unsigned int MAX_BLOCK_BASE_SIZE = 1000000;
|
||||||
/** The maximum allowed number of signature check operations in a block (network rule) */
|
/** The maximum allowed number of signature check operations in a block (network rule) */
|
||||||
|
@ -452,7 +452,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
|||||||
strUsage += HelpMessageOpt("-mempoolreplacement", strprintf(_("Enable transaction replacement in the memory pool (default: %u)"), DEFAULT_ENABLE_REPLACEMENT));
|
strUsage += HelpMessageOpt("-mempoolreplacement", strprintf(_("Enable transaction replacement in the memory pool (default: %u)"), DEFAULT_ENABLE_REPLACEMENT));
|
||||||
|
|
||||||
strUsage += HelpMessageGroup(_("Block creation options:"));
|
strUsage += HelpMessageGroup(_("Block creation options:"));
|
||||||
strUsage += HelpMessageOpt("-blockmaxcost=<n>", strprintf(_("Set maximum BIP141 block cost (default: %d)"), DEFAULT_BLOCK_MAX_COST));
|
strUsage += HelpMessageOpt("-blockmaxweight=<n>", strprintf(_("Set maximum BIP141 block weight (default: %d)"), DEFAULT_BLOCK_MAX_WEIGHT));
|
||||||
strUsage += HelpMessageOpt("-blockmaxsize=<n>", strprintf(_("Set maximum block size in bytes (default: %d)"), DEFAULT_BLOCK_MAX_SIZE));
|
strUsage += HelpMessageOpt("-blockmaxsize=<n>", strprintf(_("Set maximum block size in bytes (default: %d)"), DEFAULT_BLOCK_MAX_SIZE));
|
||||||
strUsage += HelpMessageOpt("-blockprioritysize=<n>", strprintf(_("Set maximum size of high-priority/low-fee transactions in bytes (default: %d)"), DEFAULT_BLOCK_PRIORITY_SIZE));
|
strUsage += HelpMessageOpt("-blockprioritysize=<n>", strprintf(_("Set maximum size of high-priority/low-fee transactions in bytes (default: %d)"), DEFAULT_BLOCK_PRIORITY_SIZE));
|
||||||
if (showDebug)
|
if (showDebug)
|
||||||
|
12
src/main.cpp
12
src/main.cpp
@ -694,8 +694,8 @@ bool AddOrphanTx(const CTransaction& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(c
|
|||||||
// have been mined or received.
|
// have been mined or received.
|
||||||
// 100 orphans, each of which is at most 99,999 bytes big is
|
// 100 orphans, each of which is at most 99,999 bytes big is
|
||||||
// at most 10 megabytes of orphans and somewhat more byprev index (in the worst case):
|
// at most 10 megabytes of orphans and somewhat more byprev index (in the worst case):
|
||||||
unsigned int sz = GetTransactionCost(tx);
|
unsigned int sz = GetTransactionWeight(tx);
|
||||||
if (sz >= MAX_STANDARD_TX_COST)
|
if (sz >= MAX_STANDARD_TX_WEIGHT)
|
||||||
{
|
{
|
||||||
LogPrint("mempool", "ignoring large orphan tx (size: %u, hash: %s)\n", sz, hash.ToString());
|
LogPrint("mempool", "ignoring large orphan tx (size: %u, hash: %s)\n", sz, hash.ToString());
|
||||||
return false;
|
return false;
|
||||||
@ -3596,13 +3596,13 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn
|
|||||||
}
|
}
|
||||||
|
|
||||||
// After the coinbase witness nonce and commitment are verified,
|
// After the coinbase witness nonce and commitment are verified,
|
||||||
// we can check if the block cost passes (before we've checked the
|
// we can check if the block weight passes (before we've checked the
|
||||||
// coinbase witness, it would be possible for the cost to be too
|
// coinbase witness, it would be possible for the weight to be too
|
||||||
// large by filling up the coinbase witness, which doesn't change
|
// large by filling up the coinbase witness, which doesn't change
|
||||||
// the block hash, so we couldn't mark the block as permanently
|
// the block hash, so we couldn't mark the block as permanently
|
||||||
// failed).
|
// failed).
|
||||||
if (GetBlockCost(block) > MAX_BLOCK_COST) {
|
if (GetBlockWeight(block) > MAX_BLOCK_WEIGHT) {
|
||||||
return state.DoS(100, error("ContextualCheckBlock(): cost limit failed"), REJECT_INVALID, "bad-blk-cost");
|
return state.DoS(100, error("ContextualCheckBlock(): weight limit failed"), REJECT_INVALID, "bad-blk-weight");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -155,7 +155,7 @@ typedef boost::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
|
|||||||
extern BlockMap mapBlockIndex;
|
extern BlockMap mapBlockIndex;
|
||||||
extern uint64_t nLastBlockTx;
|
extern uint64_t nLastBlockTx;
|
||||||
extern uint64_t nLastBlockSize;
|
extern uint64_t nLastBlockSize;
|
||||||
extern uint64_t nLastBlockCost;
|
extern uint64_t nLastBlockWeight;
|
||||||
extern const std::string strMessageMagic;
|
extern const std::string strMessageMagic;
|
||||||
extern CWaitableCriticalSection csBestBlock;
|
extern CWaitableCriticalSection csBestBlock;
|
||||||
extern CConditionVariable cvBlockChange;
|
extern CConditionVariable cvBlockChange;
|
||||||
|
@ -45,7 +45,7 @@ using namespace std;
|
|||||||
|
|
||||||
uint64_t nLastBlockTx = 0;
|
uint64_t nLastBlockTx = 0;
|
||||||
uint64_t nLastBlockSize = 0;
|
uint64_t nLastBlockSize = 0;
|
||||||
uint64_t nLastBlockCost = 0;
|
uint64_t nLastBlockWeight = 0;
|
||||||
|
|
||||||
class ScoreCompare
|
class ScoreCompare
|
||||||
{
|
{
|
||||||
@ -77,30 +77,30 @@ BlockAssembler::BlockAssembler(const CChainParams& _chainparams)
|
|||||||
: chainparams(_chainparams)
|
: chainparams(_chainparams)
|
||||||
{
|
{
|
||||||
// Block resource limits
|
// Block resource limits
|
||||||
// If neither -blockmaxsize or -blockmaxcost is given, limit to DEFAULT_BLOCK_MAX_*
|
// If neither -blockmaxsize or -blockmaxweight is given, limit to DEFAULT_BLOCK_MAX_*
|
||||||
// If only one is given, only restrict the specified resource.
|
// If only one is given, only restrict the specified resource.
|
||||||
// If both are given, restrict both.
|
// If both are given, restrict both.
|
||||||
nBlockMaxCost = DEFAULT_BLOCK_MAX_COST;
|
nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
|
||||||
nBlockMaxSize = DEFAULT_BLOCK_MAX_SIZE;
|
nBlockMaxSize = DEFAULT_BLOCK_MAX_SIZE;
|
||||||
bool fCostSet = false;
|
bool fWeightSet = false;
|
||||||
if (mapArgs.count("-blockmaxcost")) {
|
if (mapArgs.count("-blockmaxweight")) {
|
||||||
nBlockMaxCost = GetArg("-blockmaxcost", DEFAULT_BLOCK_MAX_COST);
|
nBlockMaxWeight = GetArg("-blockmaxweight", DEFAULT_BLOCK_MAX_WEIGHT);
|
||||||
nBlockMaxSize = MAX_BLOCK_SERIALIZED_SIZE;
|
nBlockMaxSize = MAX_BLOCK_SERIALIZED_SIZE;
|
||||||
fCostSet = true;
|
fWeightSet = true;
|
||||||
}
|
}
|
||||||
if (mapArgs.count("-blockmaxsize")) {
|
if (mapArgs.count("-blockmaxsize")) {
|
||||||
nBlockMaxSize = GetArg("-blockmaxsize", DEFAULT_BLOCK_MAX_SIZE);
|
nBlockMaxSize = GetArg("-blockmaxsize", DEFAULT_BLOCK_MAX_SIZE);
|
||||||
if (!fCostSet) {
|
if (!fWeightSet) {
|
||||||
nBlockMaxCost = nBlockMaxSize * WITNESS_SCALE_FACTOR;
|
nBlockMaxWeight = nBlockMaxSize * WITNESS_SCALE_FACTOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Limit cost to between 4K and MAX_BLOCK_COST-4K for sanity:
|
// Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity:
|
||||||
nBlockMaxCost = std::max((unsigned int)4000, std::min((unsigned int)(MAX_BLOCK_COST-4000), nBlockMaxCost));
|
nBlockMaxWeight = std::max((unsigned int)4000, std::min((unsigned int)(MAX_BLOCK_WEIGHT-4000), nBlockMaxWeight));
|
||||||
// Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity:
|
// Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity:
|
||||||
nBlockMaxSize = std::max((unsigned int)1000, std::min((unsigned int)(MAX_BLOCK_SERIALIZED_SIZE-1000), nBlockMaxSize));
|
nBlockMaxSize = std::max((unsigned int)1000, std::min((unsigned int)(MAX_BLOCK_SERIALIZED_SIZE-1000), nBlockMaxSize));
|
||||||
|
|
||||||
// Whether we need to account for byte usage (in addition to cost usage)
|
// Whether we need to account for byte usage (in addition to weight usage)
|
||||||
fNeedSizeAccounting = (nBlockMaxSize < MAX_BLOCK_SERIALIZED_SIZE-1000);
|
fNeedSizeAccounting = (nBlockMaxSize < MAX_BLOCK_SERIALIZED_SIZE-1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +110,7 @@ void BlockAssembler::resetBlock()
|
|||||||
|
|
||||||
// Reserve space for coinbase tx
|
// Reserve space for coinbase tx
|
||||||
nBlockSize = 1000;
|
nBlockSize = 1000;
|
||||||
nBlockCost = 4000;
|
nBlockWeight = 4000;
|
||||||
nBlockSigOpsCost = 400;
|
nBlockSigOpsCost = 400;
|
||||||
fIncludeWitness = false;
|
fIncludeWitness = false;
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ CBlockTemplate* BlockAssembler::CreateNewBlock(const CScript& scriptPubKeyIn)
|
|||||||
|
|
||||||
nLastBlockTx = nBlockTx;
|
nLastBlockTx = nBlockTx;
|
||||||
nLastBlockSize = nBlockSize;
|
nLastBlockSize = nBlockSize;
|
||||||
nLastBlockCost = nBlockCost;
|
nLastBlockWeight = nBlockWeight;
|
||||||
LogPrintf("CreateNewBlock(): total size %u txs: %u fees: %ld sigops %d\n", nBlockSize, nBlockTx, nFees, nBlockSigOpsCost);
|
LogPrintf("CreateNewBlock(): total size %u txs: %u fees: %ld sigops %d\n", nBlockSize, nBlockTx, nFees, nBlockSigOpsCost);
|
||||||
|
|
||||||
// Create coinbase transaction.
|
// Create coinbase transaction.
|
||||||
@ -223,8 +223,8 @@ void BlockAssembler::onlyUnconfirmed(CTxMemPool::setEntries& testSet)
|
|||||||
|
|
||||||
bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost)
|
bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost)
|
||||||
{
|
{
|
||||||
// TODO: switch to cost-based accounting for packages instead of vsize-based accounting.
|
// TODO: switch to weight-based accounting for packages instead of vsize-based accounting.
|
||||||
if (nBlockCost + WITNESS_SCALE_FACTOR * packageSize >= nBlockMaxCost)
|
if (nBlockWeight + WITNESS_SCALE_FACTOR * packageSize >= nBlockMaxWeight)
|
||||||
return false;
|
return false;
|
||||||
if (nBlockSigOpsCost + packageSigOpsCost >= MAX_BLOCK_SIGOPS_COST)
|
if (nBlockSigOpsCost + packageSigOpsCost >= MAX_BLOCK_SIGOPS_COST)
|
||||||
return false;
|
return false;
|
||||||
@ -257,17 +257,17 @@ bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& packa
|
|||||||
|
|
||||||
bool BlockAssembler::TestForBlock(CTxMemPool::txiter iter)
|
bool BlockAssembler::TestForBlock(CTxMemPool::txiter iter)
|
||||||
{
|
{
|
||||||
if (nBlockCost + iter->GetTxCost() >= nBlockMaxCost) {
|
if (nBlockWeight + iter->GetTxWeight() >= nBlockMaxWeight) {
|
||||||
// If the block is so close to full that no more txs will fit
|
// If the block is so close to full that no more txs will fit
|
||||||
// or if we've tried more than 50 times to fill remaining space
|
// or if we've tried more than 50 times to fill remaining space
|
||||||
// then flag that the block is finished
|
// then flag that the block is finished
|
||||||
if (nBlockCost > nBlockMaxCost - 400 || lastFewTxs > 50) {
|
if (nBlockWeight > nBlockMaxWeight - 400 || lastFewTxs > 50) {
|
||||||
blockFinished = true;
|
blockFinished = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Once we're within 4000 cost of a full block, only look at 50 more txs
|
// Once we're within 4000 weight of a full block, only look at 50 more txs
|
||||||
// to try to fill the remaining space.
|
// to try to fill the remaining space.
|
||||||
if (nBlockCost > nBlockMaxCost - 4000) {
|
if (nBlockWeight > nBlockMaxWeight - 4000) {
|
||||||
lastFewTxs++;
|
lastFewTxs++;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -315,7 +315,7 @@ void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
|
|||||||
if (fNeedSizeAccounting) {
|
if (fNeedSizeAccounting) {
|
||||||
nBlockSize += ::GetSerializeSize(iter->GetTx(), SER_NETWORK, PROTOCOL_VERSION);
|
nBlockSize += ::GetSerializeSize(iter->GetTx(), SER_NETWORK, PROTOCOL_VERSION);
|
||||||
}
|
}
|
||||||
nBlockCost += iter->GetTxCost();
|
nBlockWeight += iter->GetTxWeight();
|
||||||
++nBlockTx;
|
++nBlockTx;
|
||||||
nBlockSigOpsCost += iter->GetSigOpCost();
|
nBlockSigOpsCost += iter->GetSigOpCost();
|
||||||
nFees += iter->GetFee();
|
nFees += iter->GetFee();
|
||||||
|
@ -141,11 +141,11 @@ private:
|
|||||||
|
|
||||||
// Configuration parameters for the block size
|
// Configuration parameters for the block size
|
||||||
bool fIncludeWitness;
|
bool fIncludeWitness;
|
||||||
unsigned int nBlockMaxCost, nBlockMaxSize;
|
unsigned int nBlockMaxWeight, nBlockMaxSize;
|
||||||
bool fNeedSizeAccounting;
|
bool fNeedSizeAccounting;
|
||||||
|
|
||||||
// Information on the current status of the block
|
// Information on the current status of the block
|
||||||
uint64_t nBlockCost;
|
uint64_t nBlockWeight;
|
||||||
uint64_t nBlockSize;
|
uint64_t nBlockSize;
|
||||||
uint64_t nBlockTx;
|
uint64_t nBlockTx;
|
||||||
uint64_t nBlockSigOpsCost;
|
uint64_t nBlockSigOpsCost;
|
||||||
|
@ -64,8 +64,8 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason)
|
|||||||
// almost as much to process as they cost the sender in fees, because
|
// almost as much to process as they cost the sender in fees, because
|
||||||
// computing signature hashes is O(ninputs*txsize). Limiting transactions
|
// computing signature hashes is O(ninputs*txsize). Limiting transactions
|
||||||
// to MAX_STANDARD_TX_SIZE mitigates CPU exhaustion attacks.
|
// to MAX_STANDARD_TX_SIZE mitigates CPU exhaustion attacks.
|
||||||
unsigned int sz = GetTransactionCost(tx);
|
unsigned int sz = GetTransactionWeight(tx);
|
||||||
if (sz >= MAX_STANDARD_TX_COST) {
|
if (sz >= MAX_STANDARD_TX_WEIGHT) {
|
||||||
reason = "tx-size";
|
reason = "tx-size";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -151,12 +151,12 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t GetVirtualTransactionSize(int64_t nCost)
|
int64_t GetVirtualTransactionSize(int64_t nWeight)
|
||||||
{
|
{
|
||||||
return (nCost + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
|
return (nWeight + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t GetVirtualTransactionSize(const CTransaction& tx)
|
int64_t GetVirtualTransactionSize(const CTransaction& tx)
|
||||||
{
|
{
|
||||||
return GetVirtualTransactionSize(GetTransactionCost(tx));
|
return GetVirtualTransactionSize(GetTransactionWeight(tx));
|
||||||
}
|
}
|
||||||
|
@ -18,10 +18,10 @@ class CCoinsViewCache;
|
|||||||
static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000;
|
static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000;
|
||||||
/** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
|
/** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
|
||||||
static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 0;
|
static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 0;
|
||||||
/** Default for -blockmaxcost, which control the range of block costs the mining code will create **/
|
/** Default for -blockmaxweight, which controls the range of block weights the mining code will create **/
|
||||||
static const unsigned int DEFAULT_BLOCK_MAX_COST = 3000000;
|
static const unsigned int DEFAULT_BLOCK_MAX_WEIGHT = 3000000;
|
||||||
/** The maximum size for transactions we're willing to relay/mine */
|
/** The maximum weight for transactions we're willing to relay/mine */
|
||||||
static const unsigned int MAX_STANDARD_TX_COST = 400000;
|
static const unsigned int MAX_STANDARD_TX_WEIGHT = 400000;
|
||||||
/** Maximum number of signature check operations in an IsStandard() P2SH script */
|
/** Maximum number of signature check operations in an IsStandard() P2SH script */
|
||||||
static const unsigned int MAX_P2SH_SIGOPS = 15;
|
static const unsigned int MAX_P2SH_SIGOPS = 15;
|
||||||
/** The maximum number of sigops we're willing to relay/mine in a single tx */
|
/** The maximum number of sigops we're willing to relay/mine in a single tx */
|
||||||
@ -66,8 +66,8 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason);
|
|||||||
*/
|
*/
|
||||||
bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
|
bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
|
||||||
|
|
||||||
/** Compute the virtual transaction size (cost reinterpreted as bytes). */
|
/** Compute the virtual transaction size (weight reinterpreted as bytes). */
|
||||||
int64_t GetVirtualTransactionSize(int64_t nCost);
|
int64_t GetVirtualTransactionSize(int64_t nWeight);
|
||||||
int64_t GetVirtualTransactionSize(const CTransaction& tx);
|
int64_t GetVirtualTransactionSize(const CTransaction& tx);
|
||||||
|
|
||||||
#endif // BITCOIN_POLICY_POLICY_H
|
#endif // BITCOIN_POLICY_POLICY_H
|
||||||
|
@ -32,11 +32,11 @@ std::string CBlock::ToString() const
|
|||||||
return s.str();
|
return s.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t GetBlockCost(const CBlock& block)
|
int64_t GetBlockWeight(const CBlock& block)
|
||||||
{
|
{
|
||||||
// This implements the cost = (stripped_size * 4) + witness_size formula,
|
// This implements the weight = (stripped_size * 4) + witness_size formula,
|
||||||
// using only serialization with and without witness data. As witness_size
|
// using only serialization with and without witness data. As witness_size
|
||||||
// is equal to total_size - stripped_size, this formula is identical to:
|
// is equal to total_size - stripped_size, this formula is identical to:
|
||||||
// cost = (stripped_size * 3) + total_size.
|
// weight = (stripped_size * 3) + total_size.
|
||||||
return ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR - 1) + ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION);
|
return ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR - 1) + ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ struct CBlockLocator
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Compute the consensus-critical block cost (see BIP 141). */
|
/** Compute the consensus-critical block weight (see BIP 141). */
|
||||||
int64_t GetBlockCost(const CBlock& tx);
|
int64_t GetBlockWeight(const CBlock& tx);
|
||||||
|
|
||||||
#endif // BITCOIN_PRIMITIVES_BLOCK_H
|
#endif // BITCOIN_PRIMITIVES_BLOCK_H
|
||||||
|
@ -121,7 +121,7 @@ unsigned int CTransaction::CalculateModifiedSize(unsigned int nTxSize) const
|
|||||||
// Providing any more cleanup incentive than making additional inputs free would
|
// Providing any more cleanup incentive than making additional inputs free would
|
||||||
// risk encouraging people to create junk outputs to redeem later.
|
// risk encouraging people to create junk outputs to redeem later.
|
||||||
if (nTxSize == 0)
|
if (nTxSize == 0)
|
||||||
nTxSize = (GetTransactionCost(*this) + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
|
nTxSize = (GetTransactionWeight(*this) + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
|
||||||
for (std::vector<CTxIn>::const_iterator it(vin.begin()); it != vin.end(); ++it)
|
for (std::vector<CTxIn>::const_iterator it(vin.begin()); it != vin.end(); ++it)
|
||||||
{
|
{
|
||||||
unsigned int offset = 41U + std::min(110U, (unsigned int)it->scriptSig.size());
|
unsigned int offset = 41U + std::min(110U, (unsigned int)it->scriptSig.size());
|
||||||
@ -149,7 +149,7 @@ std::string CTransaction::ToString() const
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t GetTransactionCost(const CTransaction& tx)
|
int64_t GetTransactionWeight(const CTransaction& tx)
|
||||||
{
|
{
|
||||||
return ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR -1) + ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
return ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * (WITNESS_SCALE_FACTOR -1) + ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
}
|
}
|
||||||
|
@ -459,7 +459,7 @@ struct CMutableTransaction
|
|||||||
uint256 GetHash() const;
|
uint256 GetHash() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Compute the cost of a transaction, as defined by BIP 141 */
|
/** Compute the weight of a transaction, as defined by BIP 141 */
|
||||||
int64_t GetTransactionCost(const CTransaction &tx);
|
int64_t GetTransactionWeight(const CTransaction &tx);
|
||||||
|
|
||||||
#endif // BITCOIN_PRIMITIVES_TRANSACTION_H
|
#endif // BITCOIN_PRIMITIVES_TRANSACTION_H
|
||||||
|
@ -101,7 +101,7 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx
|
|||||||
result.push_back(Pair("confirmations", confirmations));
|
result.push_back(Pair("confirmations", confirmations));
|
||||||
result.push_back(Pair("strippedsize", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS)));
|
result.push_back(Pair("strippedsize", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS)));
|
||||||
result.push_back(Pair("size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION)));
|
result.push_back(Pair("size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION)));
|
||||||
result.push_back(Pair("cost", (int)::GetBlockCost(block)));
|
result.push_back(Pair("weight", (int)::GetBlockWeight(block)));
|
||||||
result.push_back(Pair("height", blockindex->nHeight));
|
result.push_back(Pair("height", blockindex->nHeight));
|
||||||
result.push_back(Pair("version", block.nVersion));
|
result.push_back(Pair("version", block.nVersion));
|
||||||
result.push_back(Pair("versionHex", strprintf("%08x", block.nVersion)));
|
result.push_back(Pair("versionHex", strprintf("%08x", block.nVersion)));
|
||||||
@ -559,7 +559,7 @@ UniValue getblock(const UniValue& params, bool fHelp)
|
|||||||
" \"confirmations\" : n, (numeric) The number of confirmations, or -1 if the block is not on the main chain\n"
|
" \"confirmations\" : n, (numeric) The number of confirmations, or -1 if the block is not on the main chain\n"
|
||||||
" \"size\" : n, (numeric) The block size\n"
|
" \"size\" : n, (numeric) The block size\n"
|
||||||
" \"strippedsize\" : n, (numeric) The block size excluding witness data\n"
|
" \"strippedsize\" : n, (numeric) The block size excluding witness data\n"
|
||||||
" \"cost\" : n (numeric) The block cost\n"
|
" \"weight\" : n (numeric) The block weight (BIP 141)\n"
|
||||||
" \"height\" : n, (numeric) The block height or index\n"
|
" \"height\" : n, (numeric) The block height or index\n"
|
||||||
" \"version\" : n, (numeric) The block version\n"
|
" \"version\" : n, (numeric) The block version\n"
|
||||||
" \"versionHex\" : \"00000000\", (string) The block version formatted in hexadecimal\n"
|
" \"versionHex\" : \"00000000\", (string) The block version formatted in hexadecimal\n"
|
||||||
|
@ -224,7 +224,7 @@ UniValue getmininginfo(const UniValue& params, bool fHelp)
|
|||||||
"{\n"
|
"{\n"
|
||||||
" \"blocks\": nnn, (numeric) The current block\n"
|
" \"blocks\": nnn, (numeric) The current block\n"
|
||||||
" \"currentblocksize\": nnn, (numeric) The last block size\n"
|
" \"currentblocksize\": nnn, (numeric) The last block size\n"
|
||||||
" \"currentblockcost\": nnn, (numeric) The last block cost\n"
|
" \"currentblockweight\": nnn, (numeric) The last block weight\n"
|
||||||
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
||||||
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
||||||
" \"errors\": \"...\" (string) Current errors\n"
|
" \"errors\": \"...\" (string) Current errors\n"
|
||||||
@ -243,7 +243,7 @@ UniValue getmininginfo(const UniValue& params, bool fHelp)
|
|||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
obj.push_back(Pair("blocks", (int)chainActive.Height()));
|
obj.push_back(Pair("blocks", (int)chainActive.Height()));
|
||||||
obj.push_back(Pair("currentblocksize", (uint64_t)nLastBlockSize));
|
obj.push_back(Pair("currentblocksize", (uint64_t)nLastBlockSize));
|
||||||
obj.push_back(Pair("currentblockcost", (uint64_t)nLastBlockCost));
|
obj.push_back(Pair("currentblockweight", (uint64_t)nLastBlockWeight));
|
||||||
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
|
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
|
||||||
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
||||||
obj.push_back(Pair("errors", GetWarnings("statusbar")));
|
obj.push_back(Pair("errors", GetWarnings("statusbar")));
|
||||||
@ -358,7 +358,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
|
|||||||
" ],\n"
|
" ],\n"
|
||||||
" \"fee\": n, (numeric) difference in value between transaction inputs and outputs (in Satoshis); for coinbase transactions, this is a negative Number of the total collected block fees (ie, not including the block subsidy); if key is not present, fee is unknown and clients MUST NOT assume there isn't one\n"
|
" \"fee\": n, (numeric) difference in value between transaction inputs and outputs (in Satoshis); for coinbase transactions, this is a negative Number of the total collected block fees (ie, not including the block subsidy); if key is not present, fee is unknown and clients MUST NOT assume there isn't one\n"
|
||||||
" \"sigops\" : n, (numeric) total SigOps cost, as counted for purposes of block limits; if key is not present, sigop cost is unknown and clients MUST NOT assume it is zero\n"
|
" \"sigops\" : n, (numeric) total SigOps cost, as counted for purposes of block limits; if key is not present, sigop cost is unknown and clients MUST NOT assume it is zero\n"
|
||||||
" \"cost\" : n, (numeric) total transaction size cost, as counted for purposes of block limits\n"
|
" \"weight\" : n, (numeric) total transaction weight, as counted for purposes of block limits\n"
|
||||||
" \"required\" : true|false (boolean) if provided and true, this transaction must be in the final block\n"
|
" \"required\" : true|false (boolean) if provided and true, this transaction must be in the final block\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
@ -377,7 +377,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
|
|||||||
" \"noncerange\" : \"00000000ffffffff\", (string) A range of valid nonces\n"
|
" \"noncerange\" : \"00000000ffffffff\", (string) A range of valid nonces\n"
|
||||||
" \"sigoplimit\" : n, (numeric) cost limit of sigops in blocks\n"
|
" \"sigoplimit\" : n, (numeric) cost limit of sigops in blocks\n"
|
||||||
" \"sizelimit\" : n, (numeric) limit of block size\n"
|
" \"sizelimit\" : n, (numeric) limit of block size\n"
|
||||||
" \"costlimit\" : n, (numeric) limit of block cost\n"
|
" \"weightlimit\" : n, (numeric) limit of block weight\n"
|
||||||
" \"curtime\" : ttt, (numeric) current timestamp in seconds since epoch (Jan 1 1970 GMT)\n"
|
" \"curtime\" : ttt, (numeric) current timestamp in seconds since epoch (Jan 1 1970 GMT)\n"
|
||||||
" \"bits\" : \"xxx\", (string) compressed target of next block\n"
|
" \"bits\" : \"xxx\", (string) compressed target of next block\n"
|
||||||
" \"height\" : n (numeric) The height of the next block\n"
|
" \"height\" : n (numeric) The height of the next block\n"
|
||||||
@ -575,7 +575,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
|
|||||||
int index_in_template = i - 1;
|
int index_in_template = i - 1;
|
||||||
entry.push_back(Pair("fee", pblocktemplate->vTxFees[index_in_template]));
|
entry.push_back(Pair("fee", pblocktemplate->vTxFees[index_in_template]));
|
||||||
entry.push_back(Pair("sigops", pblocktemplate->vTxSigOpsCost[index_in_template]));
|
entry.push_back(Pair("sigops", pblocktemplate->vTxSigOpsCost[index_in_template]));
|
||||||
entry.push_back(Pair("cost", GetTransactionCost(tx)));
|
entry.push_back(Pair("weight", GetTransactionWeight(tx)));
|
||||||
|
|
||||||
transactions.push_back(entry);
|
transactions.push_back(entry);
|
||||||
}
|
}
|
||||||
@ -659,7 +659,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
|
|||||||
result.push_back(Pair("noncerange", "00000000ffffffff"));
|
result.push_back(Pair("noncerange", "00000000ffffffff"));
|
||||||
result.push_back(Pair("sigoplimit", (int64_t)MAX_BLOCK_SIGOPS_COST));
|
result.push_back(Pair("sigoplimit", (int64_t)MAX_BLOCK_SIGOPS_COST));
|
||||||
result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SERIALIZED_SIZE));
|
result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SERIALIZED_SIZE));
|
||||||
result.push_back(Pair("costlimit", (int64_t)MAX_BLOCK_COST));
|
result.push_back(Pair("weightlimit", (int64_t)MAX_BLOCK_WEIGHT));
|
||||||
result.push_back(Pair("curtime", pblock->GetBlockTime()));
|
result.push_back(Pair("curtime", pblock->GetBlockTime()));
|
||||||
result.push_back(Pair("bits", strprintf("%08x", pblock->nBits)));
|
result.push_back(Pair("bits", strprintf("%08x", pblock->nBits)));
|
||||||
result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1)));
|
result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1)));
|
||||||
|
@ -28,7 +28,7 @@ CTxMemPoolEntry::CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee,
|
|||||||
hadNoDependencies(poolHasNoInputsOf), inChainInputValue(_inChainInputValue),
|
hadNoDependencies(poolHasNoInputsOf), inChainInputValue(_inChainInputValue),
|
||||||
spendsCoinbase(_spendsCoinbase), sigOpCost(_sigOpsCost), lockPoints(lp)
|
spendsCoinbase(_spendsCoinbase), sigOpCost(_sigOpsCost), lockPoints(lp)
|
||||||
{
|
{
|
||||||
nTxCost = GetTransactionCost(_tx);
|
nTxWeight = GetTransactionWeight(_tx);
|
||||||
nModSize = _tx.CalculateModifiedSize(GetTxSize());
|
nModSize = _tx.CalculateModifiedSize(GetTxSize());
|
||||||
nUsageSize = RecursiveDynamicUsage(*tx) + memusage::DynamicUsage(tx);
|
nUsageSize = RecursiveDynamicUsage(*tx) + memusage::DynamicUsage(tx);
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ void CTxMemPoolEntry::UpdateLockPoints(const LockPoints& lp)
|
|||||||
|
|
||||||
size_t CTxMemPoolEntry::GetTxSize() const
|
size_t CTxMemPoolEntry::GetTxSize() const
|
||||||
{
|
{
|
||||||
return GetVirtualTransactionSize(nTxCost);
|
return GetVirtualTransactionSize(nTxWeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the given tx for any in-mempool descendants.
|
// Update the given tx for any in-mempool descendants.
|
||||||
|
@ -78,7 +78,7 @@ class CTxMemPoolEntry
|
|||||||
private:
|
private:
|
||||||
std::shared_ptr<const CTransaction> tx;
|
std::shared_ptr<const CTransaction> tx;
|
||||||
CAmount nFee; //!< Cached to avoid expensive parent-transaction lookups
|
CAmount nFee; //!< Cached to avoid expensive parent-transaction lookups
|
||||||
size_t nTxCost; //!< ... and avoid recomputing tx cost (also used for GetTxSize())
|
size_t nTxWeight; //!< ... and avoid recomputing tx weight (also used for GetTxSize())
|
||||||
size_t nModSize; //!< ... and modified size for priority
|
size_t nModSize; //!< ... and modified size for priority
|
||||||
size_t nUsageSize; //!< ... and total memory usage
|
size_t nUsageSize; //!< ... and total memory usage
|
||||||
int64_t nTime; //!< Local time when entering the mempool
|
int64_t nTime; //!< Local time when entering the mempool
|
||||||
@ -122,7 +122,7 @@ public:
|
|||||||
double GetPriority(unsigned int currentHeight) const;
|
double GetPriority(unsigned int currentHeight) const;
|
||||||
const CAmount& GetFee() const { return nFee; }
|
const CAmount& GetFee() const { return nFee; }
|
||||||
size_t GetTxSize() const;
|
size_t GetTxSize() const;
|
||||||
size_t GetTxCost() const { return nTxCost; }
|
size_t GetTxWeight() const { return nTxWeight; }
|
||||||
int64_t GetTime() const { return nTime; }
|
int64_t GetTime() const { return nTime; }
|
||||||
unsigned int GetHeight() const { return entryHeight; }
|
unsigned int GetHeight() const { return entryHeight; }
|
||||||
bool WasClearAtEntry() const { return hadNoDependencies; }
|
bool WasClearAtEntry() const { return hadNoDependencies; }
|
||||||
|
@ -2356,7 +2356,7 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
|
|||||||
*static_cast<CTransaction*>(&wtxNew) = CTransaction(txNew);
|
*static_cast<CTransaction*>(&wtxNew) = CTransaction(txNew);
|
||||||
|
|
||||||
// Limit size
|
// Limit size
|
||||||
if (GetTransactionCost(txNew) >= MAX_STANDARD_TX_COST)
|
if (GetTransactionWeight(txNew) >= MAX_STANDARD_TX_WEIGHT)
|
||||||
{
|
{
|
||||||
strFailReason = _("Transaction too large");
|
strFailReason = _("Transaction too large");
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user