aboutsummaryrefslogtreecommitdiff
path: root/src/consensus
diff options
context:
space:
mode:
authorGregory Maxwell <greg@xiph.org>2017-06-17 00:18:42 +0000
committerGregory Maxwell <greg@xiph.org>2017-07-14 19:24:17 +0000
commit3babbcb48786372d4b22171674c4cc5a6220c294 (patch)
tree099fab1403b69a6da62d222fbf8b2d45f0c12fa7 /src/consensus
parente4fcbf797ed3b472d352ac3794ec82f581209c50 (diff)
Remove confusing MAX_BLOCK_BASE_SIZE.
Some people keep thinking that MAX_BLOCK_BASE_SIZE is a separate size limit from the weight limit when it fact it is superfluous, and used in early tests before the witness data has been validated or just to compute worst case sizes. The size checks that use it would not behave any differently consensus wise if they were eliminated completely. Its correct value is not independently settable but is a function of the weight limit and weight formula. This patch just eliminates it and uses the scale factor as required to compute the worse case constants. It also moves the weight factor out of primitives into consensus, which is a more logical place for it.
Diffstat (limited to 'src/consensus')
-rw-r--r--src/consensus/consensus.h14
-rw-r--r--src/consensus/tx_verify.cpp2
-rw-r--r--src/consensus/validation.h18
3 files changed, 25 insertions, 9 deletions
diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h
index 58b2ed4b3e..a1bb99a802 100644
--- a/src/consensus/consensus.h
+++ b/src/consensus/consensus.h
@@ -6,25 +6,23 @@
#ifndef BITCOIN_CONSENSUS_CONSENSUS_H
#define BITCOIN_CONSENSUS_CONSENSUS_H
+#include <stdlib.h>
#include <stdint.h>
/** The maximum allowed size for a serialized block, in bytes (only for buffer size limits) */
static const unsigned int MAX_BLOCK_SERIALIZED_SIZE = 4000000;
/** The maximum allowed weight for a block, see BIP 141 (network rule) */
static const unsigned int MAX_BLOCK_WEIGHT = 4000000;
-/**
- * The maximum allowed size for a block excluding witness data, in bytes (network rule).
- * This parameter is largely superfluous because it is directly implied by the above block
- * weight limit, even when BIP 141 is not active. It continues to exist for use in
- * various early tests that run before the witness data has been checked.
- * All tests related to it could be removed without breaking consensus compatibility.
- */
-static const unsigned int MAX_BLOCK_BASE_SIZE = 1000000;
/** The maximum allowed number of signature check operations in a block (network rule) */
static const int64_t MAX_BLOCK_SIGOPS_COST = 80000;
/** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */
static const int COINBASE_MATURITY = 100;
+static const int WITNESS_SCALE_FACTOR = 4;
+
+static const size_t MIN_TRANSACTION_WEIGHT = WITNESS_SCALE_FACTOR * 60; // 60 is the lower bound for the size of a valid serialized CTransaction
+static const size_t MIN_SERIALIZEABLE_TRANSACTION_WEIGHT = WITNESS_SCALE_FACTOR * 10; // 10 is the lower bound for the size of a serialized CTransaction
+
/** Flags for nSequence and nLockTime locks */
enum {
/* Interpret sequence numbers as relative lock-time constraints. */
diff --git a/src/consensus/tx_verify.cpp b/src/consensus/tx_verify.cpp
index 0671cbc132..0a71915d1d 100644
--- a/src/consensus/tx_verify.cpp
+++ b/src/consensus/tx_verify.cpp
@@ -164,7 +164,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fChe
if (tx.vout.empty())
return state.DoS(10, false, REJECT_INVALID, "bad-txns-vout-empty");
// Size limits (this doesn't take the witness into account, as that hasn't been checked for malleability)
- if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) > MAX_BLOCK_BASE_SIZE)
+ if (::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT)
return state.DoS(100, false, REJECT_INVALID, "bad-txns-oversize");
// Check for negative or overflow output values
diff --git a/src/consensus/validation.h b/src/consensus/validation.h
index 8fc3ef1b66..5494ce40ea 100644
--- a/src/consensus/validation.h
+++ b/src/consensus/validation.h
@@ -7,6 +7,10 @@
#define BITCOIN_CONSENSUS_VALIDATION_H
#include <string>
+#include "version.h"
+#include "consensus/consensus.h"
+#include "primitives/transaction.h"
+#include "primitives/block.h"
/** "reject" message codes */
static const unsigned char REJECT_MALFORMED = 0x01;
@@ -85,4 +89,18 @@ public:
std::string GetDebugMessage() const { return strDebugMessage; }
};
+static inline 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);
+}
+
+static inline int64_t GetBlockWeight(const CBlock& block)
+{
+ // This implements the weight = (stripped_size * 4) + witness_size formula,
+ // using only serialization with and without witness data. As witness_size
+ // is equal to total_size - stripped_size, this formula is identical to:
+ // 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);
+}
+
#endif // BITCOIN_CONSENSUS_VALIDATION_H