// Copyright (c) 2010 Satoshi Nakamoto
// Copyright (c) 2009-2012 The Bitcoin developers
-// Copyright (c) 2011-2012 The PPCoin developers
-// Copyright (c) 2012-2013 The NovaCoin developers
+// Copyright (c) 2011-2013 The PPCoin developers
+// Copyright (c) 2013 NovaCoin Developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
extern Value dumpprivkey(const Array& params, bool fHelp);
extern Value importprivkey(const Array& params, bool fHelp);
-extern CBigNum bnProofOfWorkLimit;
-
Object JSONRPCError(int code, const string& message)
{
Object error;
result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex()));
if (blockindex->pnext)
result.push_back(Pair("nextblockhash", blockindex->pnext->GetBlockHash().GetHex()));
+ result.push_back(Pair("flags", strprintf("%s%s", blockindex->IsProofOfStake()? "proof-of-stake" : "proof-of-work", blockindex->GeneratedStakeModifier()? " stake-modifier": "")));
+ result.push_back(Pair("proofhash", blockindex->IsProofOfStake()? blockindex->hashProofOfStake.GetHex() : blockindex->GetBlockHash().GetHex()));
+ result.push_back(Pair("entropybit", (int)blockindex->GetStakeEntropyBit()));
+ result.push_back(Pair("modifier", strprintf("%016"PRI64x, blockindex->nStakeModifier)));
+ result.push_back(Pair("modifierchecksum", strprintf("%08x", blockindex->nStakeModifierChecksum)));
Array txinfo;
BOOST_FOREACH (const CTransaction& tx, block.vtx)
{
{
string msg = "addmultisigaddress <nrequired> <'[\"key\",\"key\"]'> [account]\n"
"Add a nrequired-to-sign multisignature address to the wallet\"\n"
- "each key is a novacoin address or hex-encoded public key\n"
+ "each key is a bitcoin address or hex-encoded public key\n"
"If [account] is specified, assign address to [account].";
throw runtime_error(msg);
}
return ret;
}
+Value validatepubkey(const Array& params, bool fHelp)
+{
+ if (fHelp || !params.size() || params.size() > 2)
+ throw runtime_error(
+ "validatepubkey <novacoinpubkey>\n"
+ "Return information about <novacoinpubkey>.");
+
+ std::vector<unsigned char> vchPubKey = ParseHex(params[0].get_str());
+ bool isValid;
+
+ if(vchPubKey.size() == 33) // Compressed key
+ isValid = (vchPubKey[0] == 0x02 || vchPubKey[0] == 0x03);
+ else if(vchPubKey.size() == 65) // Uncompressed key
+ isValid = vchPubKey[0] == 0x04;
+ else
+ isValid = false;
+
+ CBitcoinAddress address(vchPubKey);
+ isValid = isValid ? address.IsValid() : false;
+
+ Object ret;
+ ret.push_back(Pair("isvalid", isValid));
+ if (isValid)
+ {
+ // Call Hash160ToAddress() so we always return current ADDRESSVERSION
+ // version of the address:
+ string currentAddress = address.ToString();
+ ret.push_back(Pair("address", currentAddress));
+ if (pwalletMain->HaveKey(address))
+ {
+ ret.push_back(Pair("ismine", true));
+ CKey key;
+ key.SetPubKey(vchPubKey);
+ ret.push_back(Pair("iscompressed", key.IsCompressed()));
+ }
+ else
+ ret.push_back(Pair("ismine", false));
+ if (pwalletMain->mapAddressBook.count(address))
+ ret.push_back(Pair("account", pwalletMain->mapAddressBook[address]));
+ }
+ return ret;
+}
+
+
Value getwork(const Array& params, bool fHelp)
{
if (fHelp || params.size() > 1)
}
}
-Value getmemorypool(const Array& params, bool fHelp)
-{
- if (fHelp || params.size() > 1)
- throw runtime_error(
- "getmemorypool [data]\n"
- "If [data] is not specified, returns data needed to construct a block to work on:\n"
- " \"version\" : block version\n"
- " \"previousblockhash\" : hash of current highest block\n"
- " \"transactions\" : contents of non-coinbase transactions that should be included in the next block\n"
- " \"coinbasevalue\" : maximum allowable input to coinbase transaction, including the generation award and transaction fees\n"
- " \"coinbaseflags\" : data that should be included in coinbase so support for new features can be judged\n"
- " \"time\" : timestamp appropriate for next block\n"
- " \"mintime\" : minimum timestamp appropriate for next block\n"
- " \"curtime\" : current timestamp\n"
- " \"bits\" : compressed target of next block\n"
- "If [data] is specified, tries to solve the block and returns true if it was successful.");
-
- if (params.size() == 0)
- {
- if (vNodes.empty())
- throw JSONRPCError(-9, "NovaCoin is not connected!");
-
- if (IsInitialBlockDownload())
- throw JSONRPCError(-10, "NovaCoin is downloading blocks...");
-
- static CReserveKey reservekey(pwalletMain);
-
- // Update block
- static unsigned int nTransactionsUpdatedLast;
- static CBlockIndex* pindexPrev;
- static int64 nStart;
- static CBlock* pblock;
- if (pindexPrev != pindexBest ||
- (nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 5))
- {
- nTransactionsUpdatedLast = nTransactionsUpdated;
- pindexPrev = pindexBest;
- nStart = GetTime();
-
- // Create new block
- if(pblock)
- delete pblock;
- pblock = CreateNewBlock(pwalletMain);
- if (!pblock)
- throw JSONRPCError(-7, "Out of memory");
- }
-
- // Update nTime
- pblock->UpdateTime(pindexPrev);
- pblock->nNonce = 0;
-
- Array transactions;
- BOOST_FOREACH(CTransaction tx, pblock->vtx) {
- if(tx.IsCoinBase() || tx.IsCoinStake())
- continue;
-
- CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
- ssTx << tx;
-
- transactions.push_back(HexStr(ssTx.begin(), ssTx.end()));
- }
-
- Object result;
- result.push_back(Pair("version", pblock->nVersion));
- result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex()));
- result.push_back(Pair("transactions", transactions));
- result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0].vout[0].nValue));
- result.push_back(Pair("coinbaseflags", HexStr(COINBASE_FLAGS.begin(), COINBASE_FLAGS.end())));
- result.push_back(Pair("time", (int64_t)pblock->nTime));
- result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1));
- result.push_back(Pair("curtime", (int64_t)GetAdjustedTime()));
- result.push_back(Pair("bits", HexBits(pblock->nBits)));
-
- return result;
- }
- else
- {
- // Parse parameters
- CDataStream ssBlock(ParseHex(params[0].get_str()), SER_NETWORK, PROTOCOL_VERSION);
- CBlock pblock;
- ssBlock >> pblock;
-
- static CReserveKey reservekey(pwalletMain);
-
- if(!pblock.SignBlock(*pwalletMain))
- throw JSONRPCError(-100, "Unable to sign block, wallet locked?");
-
- return CheckWork(&pblock, *pwalletMain, reservekey);
- }
-}
-
-
Value getblocktemplate(const Array& params, bool fHelp)
{
if (fHelp || params.size() > 1)
return Value::null;
}
+
+Value getmemorypool(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() > 1)
+ throw runtime_error(
+ "getmemorypool [data]\n"
+ "If [data] is not specified, returns data needed to construct a block to work on:\n"
+ " \"version\" : block version\n"
+ " \"previousblockhash\" : hash of current highest block\n"
+ " \"transactions\" : contents of non-coinbase transactions that should be included in the next block\n"
+ " \"coinbasevalue\" : maximum allowable input to coinbase transaction, including the generation award and transaction fees\n"
+ " \"coinbaseflags\" : data that should be included in coinbase so support for new features can be judged\n"
+ " \"time\" : timestamp appropriate for next block\n"
+ " \"mintime\" : minimum timestamp appropriate for next block\n"
+ " \"curtime\" : current timestamp\n"
+ " \"bits\" : compressed target of next block\n"
+ "If [data] is specified, tries to solve the block and returns true if it was successful.");
+
+ if (params.size() == 0)
+ {
+ if (vNodes.empty())
+ throw JSONRPCError(-9, "NovaCoin is not connected!");
+
+ if (IsInitialBlockDownload())
+ throw JSONRPCError(-10, "NovaCoin is downloading blocks...");
+
+ static CReserveKey reservekey(pwalletMain);
+
+ // Update block
+ static unsigned int nTransactionsUpdatedLast;
+ static CBlockIndex* pindexPrev;
+ static int64 nStart;
+ static CBlock* pblock;
+ if (pindexPrev != pindexBest ||
+ (nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 5))
+ {
+ nTransactionsUpdatedLast = nTransactionsUpdated;
+ pindexPrev = pindexBest;
+ nStart = GetTime();
+
+ // Create new block
+ if(pblock)
+ delete pblock;
+ pblock = CreateNewBlock(pwalletMain);
+ if (!pblock)
+ throw JSONRPCError(-7, "Out of memory");
+ }
+
+ // Update nTime
+ pblock->UpdateTime(pindexPrev);
+ pblock->nNonce = 0;
+
+ Array transactions;
+ BOOST_FOREACH(CTransaction tx, pblock->vtx) {
+ if(tx.IsCoinBase() || tx.IsCoinStake())
+ continue;
+
+ CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
+ ssTx << tx;
+
+ transactions.push_back(HexStr(ssTx.begin(), ssTx.end()));
+ }
+
+ Object result;
+ result.push_back(Pair("version", pblock->nVersion));
+ result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex()));
+ result.push_back(Pair("transactions", transactions));
+ result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0].vout[0].nValue));
+ result.push_back(Pair("coinbaseflags", HexStr(COINBASE_FLAGS.begin(), COINBASE_FLAGS.end())));
+ result.push_back(Pair("time", (int64_t)pblock->nTime));
+ result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1));
+ result.push_back(Pair("curtime", (int64_t)GetAdjustedTime()));
+ result.push_back(Pair("bits", HexBits(pblock->nBits)));
+
+ return result;
+ }
+ else
+ {
+ // Parse parameters
+ CDataStream ssBlock(ParseHex(params[0].get_str()), SER_NETWORK, PROTOCOL_VERSION);
+ CBlock pblock;
+ ssBlock >> pblock;
+
+ static CReserveKey reservekey(pwalletMain);
+
+ if(!pblock.SignBlock(*pwalletMain))
+ throw JSONRPCError(-100, "Unable to sign block, wallet locked?");
+
+ return CheckWork(&pblock, *pwalletMain, reservekey);
+ }
+}
+
Value getnewpubkey(const Array& params, bool fHelp)
{
if (fHelp || params.size() > 1)
return HexStr(newKey.begin(), newKey.end());
}
-
Value getblockhash(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 1)
return blockToJSON(block, pblockindex, params.size() > 1 ? params[1].get_bool() : false);
}
+Value getblockbynumber(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() < 1 || params.size() > 2)
+ throw runtime_error(
+ "getblock <number> [txinfo]\n"
+ "txinfo optional to print more detailed tx info\n"
+ "Returns details of a block with given block-number.");
+
+ int nHeight = params[0].get_int();
+ if (nHeight < 0 || nHeight > nBestHeight)
+ throw runtime_error("Block number out of range.");
+
+ CBlock block;
+ CBlockIndex* pblockindex = mapBlockIndex[hashBestChain];
+ while (pblockindex->nHeight > nHeight)
+ pblockindex = pblockindex->pprev;
+
+ uint256 hash = *pblockindex->phashBlock;
+
+ pblockindex = mapBlockIndex[hash];
+ block.ReadFromDisk(pblockindex, true);
+
+ return blockToJSON(block, pblockindex, params.size() > 1 ? params[1].get_bool() : false);
+}
// ppcoin: get information of sync-checkpoint
Value getcheckpoint(const Array& params, bool fHelp)
return result;
}
+// NovaCoin: resend unconfirmed wallet transactions
+Value resendtx(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() > 1)
+ throw runtime_error(
+ "resendtx\n"
+ "Re-send unconfirmed transactions.\n"
+ );
+
+ ResendWalletTransactions();
+
+ return Value::null;
+}
+
+
// ppcoin: make a public-private key pair
Value makekeypair(const Array& params, bool fHelp)
{
{ "walletlock", &walletlock, true },
{ "encryptwallet", &encryptwallet, false },
{ "validateaddress", &validateaddress, true },
+ { "validatepubkey", &validatepubkey, true },
{ "getbalance", &getbalance, false },
{ "move", &movecmd, false },
{ "sendfrom", &sendfrom, false },
{ "addmultisigaddress", &addmultisigaddress, false },
{ "getblock", &getblock, false },
{ "getblockhash", &getblockhash, false },
+ { "getblockbynumber", &getblockbynumber, false },
{ "gettransaction", &gettransaction, false },
{ "listtransactions", &listtransactions, false },
{ "signmessage", &signmessage, false },
{ "reservebalance", &reservebalance, false},
{ "checkwallet", &checkwallet, false},
{ "repairwallet", &repairwallet, false},
+ { "resendtx", &resendtx, false},
{ "makekeypair", &makekeypair, false},
{ "sendalert", &sendalert, false},
};
ThreadSafeMessageBox(strprintf(
_("%s, you must set a rpcpassword in the configuration file:\n %s\n"
"It is recommended you use the following random password:\n"
- "rpcuser=bitcoinrpc\n"
+ "rpcuser=novarpc\n"
"rpcpassword=%s\n"
"(you do not need to remember this password)\n"
"If the file does not exist, create it with owner-readable-only file permissions.\n"),
if (strMethod == "listreceivedbyaccount" && n > 1) ConvertTo<bool>(params[1]);
if (strMethod == "getbalance" && n > 1) ConvertTo<boost::int64_t>(params[1]);
if (strMethod == "getblockhash" && n > 0) ConvertTo<boost::int64_t>(params[0]);
+ if (strMethod == "getblockbynumber" && n > 0) ConvertTo<boost::int64_t>(params[0]);
+ if (strMethod == "getblockbynumber" && n > 1) ConvertTo<bool>(params[1]);
if (strMethod == "getblock" && n > 1) ConvertTo<bool>(params[1]);
if (strMethod == "move" && n > 2) ConvertTo<double>(params[2]);
if (strMethod == "move" && n > 3) ConvertTo<boost::int64_t>(params[3]);