From f70f613924ce2e572f40f0e4bb5112b880277f8d Mon Sep 17 00:00:00 2001 From: Sunny King Date: Tue, 31 Jul 2012 23:15:29 +0100 Subject: [PATCH] PPCoin: Limit the merging of coins into coinstake (to about 10K) Help promote proof-of-stake generation in early stages --- src/main.cpp | 2 +- src/main.h | 1 + src/wallet.cpp | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 283a1cc..b84bcfb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -822,7 +822,7 @@ uint256 WantedByOrphan(const CBlock* pblockOrphan) int64 static GetProofOfWorkReward(unsigned int nBits) { - CBigNum bnSubsidyLimit = 9999 * COIN; // subsidy amount for difficulty 1 + CBigNum bnSubsidyLimit = MAX_MINT_PROOF_OF_WORK; CBigNum bnTarget; bnTarget.SetCompact(nBits); CBigNum bnTargetLimit = bnProofOfWorkLimit; diff --git a/src/main.h b/src/main.h index 72faeee..5f60a8a 100644 --- a/src/main.h +++ b/src/main.h @@ -35,6 +35,7 @@ static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100; static const int64 MIN_TX_FEE = 10000; static const int64 MIN_RELAY_TX_FEE = 10000; static const int64 MAX_MONEY = 2000000000 * COIN; +static const int64 MAX_MINT_PROOF_OF_WORK = 9999 * COIN; inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); } static const int COINBASE_MATURITY = 100; // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp. diff --git a/src/wallet.cpp b/src/wallet.cpp index a24a1d0..c4e568c 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -1256,10 +1256,18 @@ bool CWallet::CreateCoinStake(unsigned int nBits, CTransaction& txNew) return false; BOOST_FOREACH(PAIRTYPE(const CWalletTx*, unsigned int) pcoin, setCoins) { + // Attempt to add more inputs of the same key if (pcoin.first->vout[pcoin.second].scriptPubKey == txNew.vout[1].scriptPubKey && pcoin.first->GetHash() != txNew.vin[0].prevout.hash) { + // Stop adding more inputs if value is already pretty significant + if (nCredit > MAX_MINT_PROOF_OF_WORK) + break; + // Stop adding inputs if reached reserve limit if (nCredit + pcoin.first->vout[pcoin.second].nValue > nBalance - nReserveBalance) break; + // Do not add additional significant input + if (pcoin.first->vout[pcoin.second].nValue > MAX_MINT_PROOF_OF_WORK) + continue; txNew.vin.push_back(CTxIn(pcoin.first->GetHash(), pcoin.second)); nCredit += pcoin.first->vout[pcoin.second].nValue; vwtxPrev.push_back(pcoin.first); @@ -1283,6 +1291,13 @@ bool CWallet::CreateCoinStake(unsigned int nBits, CTransaction& txNew) if (!SignSignature(*this, *pcoin, txNew, nIn++)) return error("CreateCoinStake : failed to sign coinstake"); } + + // Limit size + unsigned int nBytes = ::GetSerializeSize(txNew, SER_NETWORK, PROTOCOL_VERSION); + if (nBytes >= MAX_BLOCK_SIZE_GEN/5) + return false; + + // Successfully generated coinstake return true; } -- 1.7.1