|
|
|
@ -1645,6 +1645,86 @@ Value getwork(const Array& params, bool fHelp)
@@ -1645,6 +1645,86 @@ Value getwork(const Array& params, bool fHelp)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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" |
|
|
|
|
" \"time\" : timestamp appropriate for next block\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, "Bitcoin is not connected!"); |
|
|
|
|
|
|
|
|
|
if (IsInitialBlockDownload()) |
|
|
|
|
throw JSONRPCError(-10, "Bitcoin 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(reservekey); |
|
|
|
|
if (!pblock) |
|
|
|
|
throw JSONRPCError(-7, "Out of memory"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Update nTime
|
|
|
|
|
pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); |
|
|
|
|
pblock->nNonce = 0; |
|
|
|
|
|
|
|
|
|
Array transactions; |
|
|
|
|
BOOST_FOREACH(CTransaction tx, pblock->vtx) { |
|
|
|
|
if(tx.IsCoinBase()) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
CDataStream ssTx; |
|
|
|
|
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("time", (int64_t)pblock->nTime)); |
|
|
|
|
result.push_back(Pair("bits", (int64_t)pblock->nBits)); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
// Parse parameters
|
|
|
|
|
CDataStream ssBlock(ParseHex(params[0].get_str())); |
|
|
|
|
CBlock pblock; |
|
|
|
|
ssBlock >> pblock; |
|
|
|
|
|
|
|
|
|
return ProcessBlock(NULL, &pblock); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1698,6 +1778,7 @@ pair<string, rpcfn_type> pCallTable[] =
@@ -1698,6 +1778,7 @@ pair<string, rpcfn_type> pCallTable[] =
|
|
|
|
|
make_pair("getwork", &getwork), |
|
|
|
|
make_pair("listaccounts", &listaccounts), |
|
|
|
|
make_pair("settxfee", &settxfee), |
|
|
|
|
make_pair("getmemorypool", &getmemorypool), |
|
|
|
|
}; |
|
|
|
|
map<string, rpcfn_type> mapCallTable(pCallTable, pCallTable + sizeof(pCallTable)/sizeof(pCallTable[0])); |
|
|
|
|
|
|
|
|
@ -1723,6 +1804,7 @@ string pAllowInSafeMode[] =
@@ -1723,6 +1804,7 @@ string pAllowInSafeMode[] =
|
|
|
|
|
"walletlock", |
|
|
|
|
"validateaddress", |
|
|
|
|
"getwork", |
|
|
|
|
"getmemorypool", |
|
|
|
|
}; |
|
|
|
|
set<string> setAllowInSafeMode(pAllowInSafeMode, pAllowInSafeMode + sizeof(pAllowInSafeMode)/sizeof(pAllowInSafeMode[0])); |
|
|
|
|
|
|
|
|
@ -2138,7 +2220,7 @@ void ThreadRPCServer2(void* parg)
@@ -2138,7 +2220,7 @@ void ThreadRPCServer2(void* parg)
|
|
|
|
|
if (valMethod.type() != str_type) |
|
|
|
|
throw JSONRPCError(-32600, "Method must be a string"); |
|
|
|
|
string strMethod = valMethod.get_str(); |
|
|
|
|
if (strMethod != "getwork") |
|
|
|
|
if (strMethod != "getwork" && strMethod != "getmemorypool") |
|
|
|
|
printf("ThreadRPCServer method=%s\n", strMethod.c_str()); |
|
|
|
|
|
|
|
|
|
// Parse params
|
|
|
|
|