if (pindexBest == NULL)
return 1.0;
- int nShift = (pindexBest->nBits >> 24) & 0xff;
+ const CBlockIndex* pindexLastProofOfWork = GetLastBlockIndex(pindexBest, false);
+ int nShift = (pindexLastProofOfWork->nBits >> 24) & 0xff;
double dDiff =
- (double)0x0000ffff / (double)(pindexBest->nBits & 0x00ffffff);
+ (double)0x0000ffff / (double)(pindexLastProofOfWork->nBits & 0x00ffffff);
while (nShift < 29)
{
"Returns an object containing various state info.");
Object obj;
- obj.push_back(Pair("version", (int)VERSION));
+ obj.push_back(Pair("version", FormatFullVersion()));
obj.push_back(Pair("balance", ValueFromAmount(pwalletMain->GetBalance())));
obj.push_back(Pair("newmint", ValueFromAmount(pwalletMain->GetNewMint())));
obj.push_back(Pair("stake", ValueFromAmount(pwalletMain->GetStake())));
nStart = GetTime();
// Create new block
- pblock = CreateNewBlock(pwalletMain);
+ pblock = CreateNewBlock(pwalletMain, true);
if (!pblock)
throw JSONRPCError(-7, "Out of memory");
vNewBlock.push_back(pblock);
}
// Update nTime
- pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
+ pblock->nTime = max(pblock->GetBlockTime(), GetAdjustedTime());
pblock->nNonce = 0;
// Update nExtraNonce
pblock->nNonce = pdata->nNonce;
pblock->vtx[0].vin[0].scriptSig = mapNewBlock[pdata->hashMerkleRoot].second;
pblock->hashMerkleRoot = pblock->BuildMerkleTree();
+ if (!pblock->SignBlock(*pwalletMain))
+ throw JSONRPCError(-100, "Unable to sign block");
return CheckWork(pblock, *pwalletMain, reservekey);
}
}
-// ppcoin: reset auto checkpoint
-Value resetcheckpoint(const Array& params, bool fHelp)
-{
- if (fHelp || params.size() < 1 || params.size() > 1)
- throw runtime_error(
- "resetcheckpoint <checkpointheight>\n"
- "Reset automatic checkpoint to specified height.\n"
- "<checkpointheight> is the height of the new checkpoint block.\n");
-
- int nCheckpoint = params[0].get_int();
- if (nCheckpoint <= 0 || nCheckpoint >= nBestHeight)
- throw runtime_error(
- "invalid checkpoint height.\n"
- );
- if (nCheckpoint >= Checkpoints::nAutoCheckpoint)
- throw runtime_error(
- "new checkpoint must be earlier than current auto checkpoint.\n"
- );
- if (!Checkpoints::ResetAutoCheckpoint(nCheckpoint))
- throw runtime_error(
- "internal error - reset checkpoint failed.\n"
- );
-
- return Value::null;
-}
-
-
-// ppcoin: get branch point of alternative branch
-Value getbranchpoint(const Array& params, bool fHelp)
+// ppcoin: get information of sync-checkpoint
+Value getcheckpoint(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
- "getbranchpoint\n"
- "Returns height of branch point of alternative branch.\n");
+ "getcheckpoint\n"
+ "Show info of synchronized checkpoint.\n");
Object result;
- if (Checkpoints::nBranchPoint > 0)
- result.push_back(Pair("branchpoint", Checkpoints::nBranchPoint));
- else
- result.push_back(Pair("branchpoint", "none"));
- result.push_back(Pair("checkpoint", Checkpoints::nAutoCheckpoint));
+ CBlockIndex* pindexCheckpoint;
+
+ result.push_back(Pair("synccheckpoint", Checkpoints::hashSyncCheckpoint.ToString().c_str()));
+ pindexCheckpoint = mapBlockIndex[Checkpoints::hashSyncCheckpoint];
+ result.push_back(Pair("height", pindexCheckpoint->nHeight));
+ result.push_back(Pair("timestamp", DateTimeStrFormat("%x %H:%M:%S", pindexCheckpoint->GetBlockTime()).c_str()));
+
return result;
}
// ppcoin: make a public-private key pair
Value makekeypair(const Array& params, bool fHelp)
{
+ if (fHelp || params.size() > 1)
+ throw runtime_error(
+ "makekeypair [prefix]\n"
+ "Make a public/private key pair.\n"
+ "[prefix] is optional preferred prefix for the public key.\n");
+
+ string strPrefix = "";
+ if (params.size() > 0)
+ strPrefix = params[0].get_str();
+
CKey key;
- key.MakeNewKey();
- CPrivKey vchPrivKey = key.GetPrivKey();
+ int nCount = 0;
+ do
+ {
+ key.MakeNewKey();
+ nCount++;
+ } while (nCount < 10000 && strPrefix != HexStr(key.GetPubKey()).substr(0, strPrefix.size()));
+ if (strPrefix != HexStr(key.GetPubKey()).substr(0, strPrefix.size()))
+ return Value::null;
+
+ CPrivKey vchPrivKey = key.GetPrivKey();
Object result;
result.push_back(Pair("PrivateKey", HexStr<CPrivKey::iterator>(vchPrivKey.begin(), vchPrivKey.end())));
result.push_back(Pair("PublicKey", HexStr(key.GetPubKey())));
throw runtime_error(
"Provided checkpoint block is not on main chain\n");
}
+ else
+ {
+ checkpoint.hashCheckpoint = Checkpoints::AutoSelectSyncCheckpoint();
+ if (checkpoint.hashCheckpoint == Checkpoints::hashSyncCheckpoint)
+ throw runtime_error(
+ "Unable to select a more recent sync-checkpoint");
+ }
CDataStream sMsg;
sMsg << (CUnsignedSyncCheckpoint)checkpoint;
BOOST_FOREACH(CNode* pnode, vNodes)
checkpoint.RelayTo(pnode);
- return Value::null;
+ Object result;
+ result.push_back(Pair("checkpoint", Checkpoints::hashSyncCheckpoint.ToString().c_str()));
+ result.push_back(Pair("height", mapBlockIndex[Checkpoints::hashSyncCheckpoint]->nHeight));
+ result.push_back(Pair("timestamp", DateTimeStrFormat("%x %H:%M:%S", mapBlockIndex[Checkpoints::hashSyncCheckpoint]->GetBlockTime()).c_str()));
+ return result;
}
make_pair("settxfee", &settxfee),
make_pair("getmemorypool", &getmemorypool),
make_pair("listsinceblock", &listsinceblock),
- make_pair("resetcheckpoint", &resetcheckpoint),
- make_pair("getbranchpoint", &getbranchpoint),
+ make_pair("getcheckpoint", &getcheckpoint),
make_pair("reservebalance", &reservebalance),
make_pair("checkwallet", &checkwallet),
make_pair("repairwallet", &repairwallet),
"validateaddress",
"getwork",
"getmemorypool",
- "resetcheckpoint",
- "getbranchpoint",
+ "getcheckpoint",
};
set<string> setAllowInSafeMode(pAllowInSafeMode, pAllowInSafeMode + sizeof(pAllowInSafeMode)/sizeof(pAllowInSafeMode[0]));
params[1] = v.get_obj();
}
if (strMethod == "sendmany" && n > 2) ConvertTo<boost::int64_t>(params[2]);
- if (strMethod == "resetcheckpoint" && n > 0) ConvertTo<boost::int64_t>(params[0]);
if (strMethod == "reservebalance" && n > 0) ConvertTo<bool>(params[0]);
if (strMethod == "reservebalance" && n > 1) ConvertTo<double>(params[1]);