set<pair<COutPoint, unsigned int> > setStakeSeen;
uint256 hashGenesisBlock = hashGenesisBlockOfficial;
static CBigNum bnProofOfWorkLimit(~uint256(0) >> 20);
+static CBigNum bnProofOfStakeLimit(~uint256(0) >> 30);
static CBigNum bnInitialHashTarget(~uint256(0) >> 20);
unsigned int nStakeMinAge = STAKE_MIN_AGE;
int nCoinbaseMaturity = COINBASE_MATURITY_PPC;
unsigned int static GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake)
{
+ CBigNum bnTargetLimit = (fProofOfStake && CBlockIndex::IsSuperMajority(3, pindexLast, 950, 1000)) ? bnProofOfStakeLimit : bnProofOfWorkLimit;
+
if (pindexLast == NULL)
- return bnProofOfWorkLimit.GetCompact(); // genesis block
+ return bnTargetLimit.GetCompact(); // genesis block
const CBlockIndex* pindexPrev = GetLastBlockIndex(pindexLast, fProofOfStake);
if (pindexPrev->pprev == NULL)
bnNew *= ((nInterval - 1) * nTargetSpacing + nActualSpacing + nActualSpacing);
bnNew /= ((nInterval + 1) * nTargetSpacing);
- if (bnNew > bnProofOfWorkLimit)
- bnNew = bnProofOfWorkLimit;
+ if (bnNew > bnTargetLimit)
+ bnNew = bnTargetLimit;
return bnNew.GetCompact();
}
// See BIP30 and http://r6.ca/blog/20120206T005236Z.html for more information.
// This logic is not necessary for memory pool transactions, as AcceptToMemoryPool
// already refuses previously-known transaction id's entirely.
- // This rule applies to all blocks whose timestamp is after March 15, 2012, 0:00 UTC.
- // On testnet it is enabled as of februari 20, 2012, 0:00 UTC.
- if (pindex->nTime > 1331769600 || (fTestNet && pindex->nTime > 1329696000))
+ BOOST_FOREACH(CTransaction& tx, vtx)
{
- BOOST_FOREACH(CTransaction& tx, vtx)
+ CTxIndex txindexOld;
+ if (txdb.ReadTxIndex(tx.GetHash(), txindexOld))
{
- CTxIndex txindexOld;
- if (txdb.ReadTxIndex(tx.GetHash(), txindexOld))
- {
- BOOST_FOREACH(CDiskTxPos &pos, txindexOld.vSpent)
- if (pos.IsNull())
- return false;
- }
+ BOOST_FOREACH(CDiskTxPos &pos, txindexOld.vSpent)
+ if (pos.IsNull())
+ return false;
}
}
- // BIP16 didn't become active until Apr 1 2012 (Feb 15 on testnet)
- int64 nBIP16SwitchTime = fTestNet ? 1329264000 : 1333238400;
- bool fStrictPayToScriptHash = (pindex->nTime >= nBIP16SwitchTime);
+ // BIP16 always active
+ bool fStrictPayToScriptHash = true;
//// issue here: it doesn't know the version
unsigned int nTxPos = pindex->nBlockPos + ::GetSerializeSize(CBlock(), SER_DISK, CLIENT_VERSION) - (2 * GetSizeOfCompactSize(0)) + GetSizeOfCompactSize(vtx.size());
if (!Checkpoints::CheckSync(hash, pindexPrev))
return error("AcceptBlock() : rejected by synchronized checkpoint");
+ // Reject block.nVersion < 3 blocks when 95% (75% on testnet) of the network has upgraded:
+ if (nVersion < 3)
+ {
+ if ((!fTestNet && CBlockIndex::IsSuperMajority(3, pindexPrev, 950, 1000)) || (fTestNet && CBlockIndex::IsSuperMajority(3, pindexPrev, 75, 100)))
+ {
+ return error("CheckBlock() : rejected nVersion < 3 block");
+ }
+ }
+
if(nHeight > 0)
{
CScript expect = CScript() << nHeight;
// ppcoin: should not enter safe mode for longer invalid chain
// ppcoin: if sync-checkpoint is too old do not enter safe mode
- if (Checkpoints::IsSyncCheckpointTooOld(60 * 60 * 24 * 10) && !fTestNet)
+ if (Checkpoints::IsSyncCheckpointTooOld(60 * 60 * 24 * 10) && !fTestNet && !IsInitialBlockDownload())
{
nPriority = 100;
strStatusBar = "WARNING: Checkpoint is too old. Wait for block chain to download, or notify developers.";
void SetNull()
{
- nVersion = 2;
+ nVersion = 3;
hashPrevBlock = 0;
hashMerkleRoot = 0;
nTime = 0;
return (nFlags & BLOCK_PROOF_OF_STAKE);
}
+ static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned int nRequired, unsigned int nToCheck)
+ {
+ unsigned int nFound = 0;
+ for (unsigned int i = 0; i < nToCheck && nFound < nRequired && pstart != NULL; i++)
+ {
+ if (pstart->nVersion >= minVersion)
+ ++nFound;
+ pstart = pstart->pprev;
+ }
+ return (nFound >= nRequired);
+ }
+
void SetProofOfStake()
{
nFlags |= BLOCK_PROOF_OF_STAKE;
public:
uint256 hashPrev;
uint256 hashNext;
+ int nProtocolVersion;
CDiskBlockIndex()
{
hashPrev = 0;
hashNext = 0;
+ nProtocolVersion = PROTOCOL_VERSION;
}
explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
READWRITE(nMoneySupply);
READWRITE(nFlags);
READWRITE(nStakeModifier);
+ READWRITE(nProtocolVersion);
if (IsProofOfStake())
{
READWRITE(prevoutStake);
// ppcoin version - intended for display purpose ONLY
#define PPCOIN_VERSION_MAJOR 0
#define PPCOIN_VERSION_MINOR 3
-#define PPCOIN_VERSION_REVISION 2
+#define PPCOIN_VERSION_REVISION 3
#define PPCOIN_VERSION_BUILD 0
//
// network protocol versioning
//
-static const int PROTOCOL_VERSION = 60003;
+static const int PROTOCOL_VERSION = 60004;
// earlier versions not supported as of Feb 2012, and are disconnected
// NOTE: as of bitcoin v0.6 message serialization (vSend, vRecv) still