diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2013-10-19 23:05:04 -0700 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2013-10-19 23:05:04 -0700 |
commit | bd48a4fe492b46708a0397c6330f06fcc80aee0b (patch) | |
tree | 1bac0297ba887a4b65499ca1d92f388687de2e4c /src | |
parent | f90b690a0d5fb147080da4ecdab1a99ce0b72042 (diff) | |
parent | d6eb259953699f5bea208ff41a0967d8ea513a70 (diff) |
Merge pull request #2945 from gmaxwell/fee-logic_encourage_sweeping
[Fee logic] Don't count txins for priority to encourage sweeping.
Diffstat (limited to 'src')
-rw-r--r-- | src/miner.cpp | 16 | ||||
-rw-r--r-- | src/wallet.cpp | 10 |
2 files changed, 23 insertions, 3 deletions
diff --git a/src/miner.cpp b/src/miner.cpp index e9c1d9aff9..83684fa349 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -238,9 +238,21 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) } if (fMissingInputs) continue; - // Priority is sum(valuein * age) / txsize + // Priority is sum(valuein * age) / modified_txsize unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); - dPriority /= nTxSize; + unsigned int nTxSizeMod = nTxSize; + // In order to avoid disincentivizing cleaning up the UTXO set we don't count + // the constant overhead for each txin and up to 110 bytes of scriptSig (which + // is enough to cover a compressed pubkey p2sh redemption) for priority. + // Providing any more cleanup incentive than making additional inputs free would + // risk encouraging people to create junk outputs to redeem later. + BOOST_FOREACH(const CTxIn& txin, tx.vin) + { + unsigned int offset = 41U + min(110U, (unsigned int)txin.scriptSig.size()); + if (nTxSizeMod > offset) + nTxSizeMod -= offset; + } + dPriority /= nTxSizeMod; // This is a more accurate fee-per-kilobyte than is used by the client code, because the // client code rounds up the size to the nearest 1K. That's good, because it gives an diff --git a/src/wallet.cpp b/src/wallet.cpp index 03d79406d8..6f61cfc734 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); |