diff options
author | Gregory Maxwell <greg@xiph.org> | 2013-08-28 02:15:39 -0700 |
---|---|---|
committer | Gregory Maxwell <greg@xiph.org> | 2013-09-17 10:56:54 -0700 |
commit | d6eb259953699f5bea208ff41a0967d8ea513a70 (patch) | |
tree | 84dfb0bff2f5e9ffb28d3e638487927b813bf50e /src/wallet.cpp | |
parent | bb7d0fc12fcfbb2a91e39cb49f2a0873344dbae0 (diff) |
[Fee logic] Don't count txins for priority to encourage sweeping.
This changes the priority calculation to not include the size of per-txin
data including up to 110 bytes of scriptsig so that transactions which
sweep up extra UTXO don't lose priority relative to ones that don't.
I'd toyed with some other variations, but it seems like any formulation
which results in an incentive stronger than making them not count will
sometimes create incentives to add extra outputs so that you have
extra inputs to consume later. The maximum credit is limited so that
users don't lose the disincentive to stuff random data in their
transactions, the limit of 110 is based on the size of a P2SH
redemption with a compressed public key.
This shouldn't need a staged deployment because the priority is not
used as a relay criteria, only a mining criteria.
Diffstat (limited to 'src/wallet.cpp')
-rw-r--r-- | src/wallet.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/wallet.cpp b/src/wallet.cpp index ddfd71efda..012dbef80a 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -1300,7 +1300,15 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, strFailReason = _("Transaction too large"); return false; } - dPriority /= nBytes; + unsigned int nTxSizeMod = nBytes; + // See miner.c's dPriority logic for the matching network-node side code. + BOOST_FOREACH(const CTxIn& txin, (*(CTransaction*)&wtxNew).vin) + { + unsigned int offset = 41U + min(110U, (unsigned int)txin.scriptSig.size()); + if (nTxSizeMod > offset) + nTxSizeMod -= offset; + } + dPriority /= nTxSizeMod; // Check that enough fee is included int64 nPayFee = nTransactionFee * (1 + (int64)nBytes / 1000); |