mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 12:32:48 +01:00
Merge bitcoin#14636: Avoid using numeric_limits for sequence numbers and lock times (#4296)
Merges bitcoin/bitcoin#14636: Avoid using numeric_limits for sequence numbers and lock times. 535203075e Avoid using numeric_limits for sequence numbers and lock times (Russell Yanofsky) bafb921507 Remove duplicated code (Hennadii Stepanov) e4dc39b3bc Replace platform dependent type with proper const (Hennadii Stepanov) Pull request description: Switches to named constants, because numeric_limits calls can be harder to read and less portable. Change was suggested by jamesob in https://github.com/bitcoin/bitcoin/pull/10973#discussion_r213473620 There are no changes in behavior except on some platforms we don't support (ILP64, IP16L32, I16LP32), where `SignalsOptInRBF` and `MutateTxAddInput` functions would now work correctly.
This commit is contained in:
parent
b79c3e01ed
commit
59cfd5263a
@ -237,7 +237,7 @@ static void MutateTxAddInput(CMutableTransaction& tx, const std::string& strInpu
|
|||||||
throw std::runtime_error("invalid TX input vout '" + strVout + "'");
|
throw std::runtime_error("invalid TX input vout '" + strVout + "'");
|
||||||
|
|
||||||
// extract the optional sequence number
|
// extract the optional sequence number
|
||||||
uint32_t nSequenceIn=std::numeric_limits<unsigned int>::max();
|
uint32_t nSequenceIn = CTxIn::SEQUENCE_FINAL;
|
||||||
if (vStrInputParts.size() > 2)
|
if (vStrInputParts.size() > 2)
|
||||||
nSequenceIn = std::stoul(vStrInputParts[2]);
|
nSequenceIn = std::stoul(vStrInputParts[2]);
|
||||||
|
|
||||||
|
@ -400,10 +400,9 @@ CMutableTransaction ConstructTransaction(const UniValue& inputs_in, const UniVal
|
|||||||
UniValue outputs = outputs_is_obj ? outputs_in.get_obj() : outputs_in.get_array();
|
UniValue outputs = outputs_is_obj ? outputs_in.get_obj() : outputs_in.get_array();
|
||||||
|
|
||||||
CMutableTransaction rawTx;
|
CMutableTransaction rawTx;
|
||||||
|
|
||||||
if (!locktime.isNull()) {
|
if (!locktime.isNull()) {
|
||||||
int64_t nLockTime = locktime.get_int64();
|
int64_t nLockTime = locktime.get_int64();
|
||||||
if (nLockTime < 0 || nLockTime > std::numeric_limits<uint32_t>::max())
|
if (nLockTime < 0 || nLockTime > LOCKTIME_MAX)
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, locktime out of range");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, locktime out of range");
|
||||||
rawTx.nLockTime = nLockTime;
|
rawTx.nLockTime = nLockTime;
|
||||||
}
|
}
|
||||||
@ -421,13 +420,13 @@ CMutableTransaction ConstructTransaction(const UniValue& inputs_in, const UniVal
|
|||||||
if (nOutput < 0)
|
if (nOutput < 0)
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive");
|
||||||
|
|
||||||
uint32_t nSequence = (rawTx.nLockTime ? std::numeric_limits<uint32_t>::max() - 1 : std::numeric_limits<uint32_t>::max());
|
uint32_t nSequence = (rawTx.nLockTime ? CTxIn::SEQUENCE_FINAL - 1 : CTxIn::SEQUENCE_FINAL);
|
||||||
|
|
||||||
// set the sequence number if passed in the parameters object
|
// set the sequence number if passed in the parameters object
|
||||||
const UniValue& sequenceObj = find_value(o, "sequence");
|
const UniValue& sequenceObj = find_value(o, "sequence");
|
||||||
if (sequenceObj.isNum()) {
|
if (sequenceObj.isNum()) {
|
||||||
int64_t seqNr64 = sequenceObj.get_int64();
|
int64_t seqNr64 = sequenceObj.get_int64();
|
||||||
if (seqNr64 < 0 || seqNr64 > std::numeric_limits<uint32_t>::max())
|
if (seqNr64 < 0 || seqNr64 > CTxIn::SEQUENCE_FINAL)
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, sequence number is out of range");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, sequence number is out of range");
|
||||||
else
|
else
|
||||||
nSequence = (uint32_t)seqNr64;
|
nSequence = (uint32_t)seqNr64;
|
||||||
|
@ -38,6 +38,12 @@ static const int MAX_STACK_SIZE = 1000;
|
|||||||
// otherwise as UNIX timestamp.
|
// otherwise as UNIX timestamp.
|
||||||
static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
|
static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
|
||||||
|
|
||||||
|
// Maximum nLockTime. Since a lock time indicates the last invalid timestamp, a
|
||||||
|
// transaction with this lock time will never be valid unless lock time
|
||||||
|
// checking is disabled (by setting all input sequence numbers to
|
||||||
|
// SEQUENCE_FINAL).
|
||||||
|
static const uint32_t LOCKTIME_MAX = 0xFFFFFFFFU;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
std::vector<unsigned char> ToByteVector(const T& in)
|
std::vector<unsigned char> ToByteVector(const T& in)
|
||||||
{
|
{
|
||||||
|
@ -170,7 +170,6 @@ BOOST_AUTO_TEST_CASE(findearliestatleast_edge_test)
|
|||||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(-1)->nHeight, 0);
|
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(-1)->nHeight, 0);
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(std::numeric_limits<int64_t>::min())->nHeight, 0);
|
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(std::numeric_limits<int64_t>::min())->nHeight, 0);
|
||||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(std::numeric_limits<unsigned int>::min())->nHeight, 0);
|
|
||||||
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(-int64_t(std::numeric_limits<unsigned int>::max()) - 1)->nHeight, 0);
|
BOOST_CHECK_EQUAL(chain.FindEarliestAtLeast(-int64_t(std::numeric_limits<unsigned int>::max()) - 1)->nHeight, 0);
|
||||||
BOOST_CHECK(!chain.FindEarliestAtLeast(std::numeric_limits<int64_t>::max()));
|
BOOST_CHECK(!chain.FindEarliestAtLeast(std::numeric_limits<int64_t>::max()));
|
||||||
BOOST_CHECK(!chain.FindEarliestAtLeast(std::numeric_limits<unsigned int>::max()));
|
BOOST_CHECK(!chain.FindEarliestAtLeast(std::numeric_limits<unsigned int>::max()));
|
||||||
|
Loading…
Reference in New Issue
Block a user