Browse Source

Introduce MAX_BIP125_RBF_SEQUENCE constant

0.15
Luke Dashjr 8 years ago
parent
commit
b005bf21a7
  1. 3
      src/bitcoin-tx.cpp
  2. 2
      src/policy/rbf.h
  3. 5
      src/rpc/rawtransaction.cpp
  4. 3
      src/wallet/wallet.cpp

3
src/bitcoin-tx.cpp

@ -13,6 +13,7 @@
#include "core_io.h" #include "core_io.h"
#include "keystore.h" #include "keystore.h"
#include "policy/policy.h" #include "policy/policy.h"
#include "policy/rbf.h"
#include "primitives/transaction.h" #include "primitives/transaction.h"
#include "script/script.h" #include "script/script.h"
#include "script/sign.h" #include "script/sign.h"
@ -215,7 +216,7 @@ static void MutateTxRBFOptIn(CMutableTransaction& tx, const std::string& strInId
int cnt = 0; int cnt = 0;
for (CTxIn& txin : tx.vin) { for (CTxIn& txin : tx.vin) {
if (strInIdx == "" || cnt == inIdx) { if (strInIdx == "" || cnt == inIdx) {
txin.nSequence = std::numeric_limits<unsigned int>::max() - 2; txin.nSequence = MAX_BIP125_RBF_SEQUENCE;
} }
++cnt; ++cnt;
} }

2
src/policy/rbf.h

@ -7,6 +7,8 @@
#include "txmempool.h" #include "txmempool.h"
static const uint32_t MAX_BIP125_RBF_SEQUENCE = 0xfffffffd;
enum RBFTransactionState { enum RBFTransactionState {
RBF_TRANSACTIONSTATE_UNKNOWN, RBF_TRANSACTIONSTATE_UNKNOWN,
RBF_TRANSACTIONSTATE_REPLACEABLE_BIP125, RBF_TRANSACTIONSTATE_REPLACEABLE_BIP125,

5
src/rpc/rawtransaction.cpp

@ -14,6 +14,7 @@
#include "merkleblock.h" #include "merkleblock.h"
#include "net.h" #include "net.h"
#include "policy/policy.h" #include "policy/policy.h"
#include "policy/rbf.h"
#include "primitives/transaction.h" #include "primitives/transaction.h"
#include "rpc/server.h" #include "rpc/server.h"
#include "script/script.h" #include "script/script.h"
@ -359,7 +360,7 @@ UniValue createrawtransaction(const JSONRPCRequest& request)
uint32_t nSequence; uint32_t nSequence;
if (rbfOptIn) { if (rbfOptIn) {
nSequence = std::numeric_limits<uint32_t>::max() - 2; nSequence = MAX_BIP125_RBF_SEQUENCE;
} else if (rawTx.nLockTime) { } else if (rawTx.nLockTime) {
nSequence = std::numeric_limits<uint32_t>::max() - 1; nSequence = std::numeric_limits<uint32_t>::max() - 1;
} else { } else {
@ -372,7 +373,7 @@ UniValue createrawtransaction(const JSONRPCRequest& request)
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 > std::numeric_limits<uint32_t>::max()) {
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 if (seqNr64 <= std::numeric_limits<uint32_t>::max() - 2 && request.params.size() > 3 && request.params[3].isFalse()) { } else if (seqNr64 <= MAX_BIP125_RBF_SEQUENCE && request.params.size() > 3 && request.params[3].isFalse()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter combination: Sequence number contradicts optintorbf option"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter combination: Sequence number contradicts optintorbf option");
} else { } else {
nSequence = (uint32_t)seqNr64; nSequence = (uint32_t)seqNr64;

3
src/wallet/wallet.cpp

@ -2685,9 +2685,10 @@ bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletT
// and in the spirit of "smallest possible change from prior // and in the spirit of "smallest possible change from prior
// behavior." // behavior."
bool rbf = coinControl ? coinControl->signalRbf : fWalletRbf; bool rbf = coinControl ? coinControl->signalRbf : fWalletRbf;
const uint32_t nSequence = rbf ? MAX_BIP125_RBF_SEQUENCE : (std::numeric_limits<unsigned int>::max() - 1);
for (const auto& coin : setCoins) for (const auto& coin : setCoins)
txNew.vin.push_back(CTxIn(coin.outpoint,CScript(), txNew.vin.push_back(CTxIn(coin.outpoint,CScript(),
std::numeric_limits<unsigned int>::max() - (rbf ? 2 : 1))); nSequence));
// Fill in dummy signatures for fee calculation. // Fill in dummy signatures for fee calculation.
if (!DummySignTx(txNew, setCoins)) { if (!DummySignTx(txNew, setCoins)) {

Loading…
Cancel
Save