Discourage fee sniping with nLockTime
This commit is contained in:
parent
fe36e031cd
commit
ba7fcc8de0
1 changed files with 27 additions and 1 deletions
|
@ -1347,6 +1347,28 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend,
|
|||
wtxNew.BindWallet(this);
|
||||
CMutableTransaction txNew;
|
||||
|
||||
// Discourage fee sniping.
|
||||
//
|
||||
// However because of a off-by-one-error in previous versions we need to
|
||||
// neuter it by setting nLockTime to at least one less than nBestHeight.
|
||||
// Secondly currently propagation of transactions created for block heights
|
||||
// corresponding to blocks that were just mined may be iffy - transactions
|
||||
// aren't re-accepted into the mempool - we additionally neuter the code by
|
||||
// going ten blocks back. Doesn't yet do anything for sniping, but does act
|
||||
// to shake out wallet bugs like not showing nLockTime'd transactions at
|
||||
// all.
|
||||
txNew.nLockTime = std::max(0, chainActive.Height() - 10);
|
||||
|
||||
// Secondly occasionally randomly pick a nLockTime even further back, so
|
||||
// that transactions that are delayed after signing for whatever reason,
|
||||
// e.g. high-latency mix networks and some CoinJoin implementations, have
|
||||
// better privacy.
|
||||
if (GetRandInt(10) == 0)
|
||||
txNew.nLockTime = std::max(0, (int)txNew.nLockTime - GetRandInt(100));
|
||||
|
||||
assert(txNew.nLockTime <= (unsigned int)chainActive.Height());
|
||||
assert(txNew.nLockTime < LOCKTIME_THRESHOLD);
|
||||
|
||||
{
|
||||
LOCK2(cs_main, cs_wallet);
|
||||
{
|
||||
|
@ -1440,8 +1462,12 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, CAmount> >& vecSend,
|
|||
reservekey.ReturnKey();
|
||||
|
||||
// Fill vin
|
||||
//
|
||||
// Note how the sequence number is set to max()-1 so that the
|
||||
// nLockTime set above actually works.
|
||||
BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
|
||||
txNew.vin.push_back(CTxIn(coin.first->GetHash(),coin.second));
|
||||
txNew.vin.push_back(CTxIn(coin.first->GetHash(),coin.second,CScript(),
|
||||
std::numeric_limits<unsigned int>::max()-1));
|
||||
|
||||
// Sign
|
||||
int nIn = 0;
|
||||
|
|
Loading…
Reference in a new issue