|
|
@ -379,6 +379,36 @@ Value getblocktemplate(const Array& params, bool fHelp) |
|
|
|
else |
|
|
|
else |
|
|
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode"); |
|
|
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode"); |
|
|
|
lpval = find_value(oparam, "longpollid"); |
|
|
|
lpval = find_value(oparam, "longpollid"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (strMode == "proposal") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
const Value& dataval = find_value(oparam, "data"); |
|
|
|
|
|
|
|
if (dataval.type() != str_type) |
|
|
|
|
|
|
|
throw JSONRPCError(RPC_TYPE_ERROR, "Missing data String key for proposal"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CBlock block; |
|
|
|
|
|
|
|
if (!DecodeHexBlk(block, dataval.get_str())) |
|
|
|
|
|
|
|
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint256 hash = block.GetHash(); |
|
|
|
|
|
|
|
BlockMap::iterator mi = mapBlockIndex.find(hash); |
|
|
|
|
|
|
|
if (mi != mapBlockIndex.end()) { |
|
|
|
|
|
|
|
CBlockIndex *pindex = mi->second; |
|
|
|
|
|
|
|
if (pindex->IsValid(BLOCK_VALID_SCRIPTS)) |
|
|
|
|
|
|
|
return "duplicate"; |
|
|
|
|
|
|
|
if (pindex->nStatus & BLOCK_FAILED_MASK) |
|
|
|
|
|
|
|
return "duplicate-invalid"; |
|
|
|
|
|
|
|
return "duplicate-inconclusive"; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CBlockIndex* const pindexPrev = chainActive.Tip(); |
|
|
|
|
|
|
|
// TestBlockValidity only supports blocks built on the current Tip
|
|
|
|
|
|
|
|
if (block.hashPrevBlock != pindexPrev->GetBlockHash()) |
|
|
|
|
|
|
|
return "inconclusive-not-best-prevblk"; |
|
|
|
|
|
|
|
CValidationState state; |
|
|
|
|
|
|
|
TestBlockValidity(state, block, pindexPrev, false, true); |
|
|
|
|
|
|
|
return BIP22ValidationResult(state); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (strMode != "template") |
|
|
|
if (strMode != "template") |
|
|
@ -481,6 +511,8 @@ Value getblocktemplate(const Array& params, bool fHelp) |
|
|
|
UpdateTime(pblock, pindexPrev); |
|
|
|
UpdateTime(pblock, pindexPrev); |
|
|
|
pblock->nNonce = 0; |
|
|
|
pblock->nNonce = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const Array aCaps = boost::assign::list_of("proposal"); |
|
|
|
|
|
|
|
|
|
|
|
Array transactions; |
|
|
|
Array transactions; |
|
|
|
map<uint256, int64_t> setTxIndex; |
|
|
|
map<uint256, int64_t> setTxIndex; |
|
|
|
int i = 0; |
|
|
|
int i = 0; |
|
|
@ -527,6 +559,7 @@ Value getblocktemplate(const Array& params, bool fHelp) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Object result; |
|
|
|
Object result; |
|
|
|
|
|
|
|
result.push_back(Pair("capabilities", aCaps)); |
|
|
|
result.push_back(Pair("version", pblock->nVersion)); |
|
|
|
result.push_back(Pair("version", pblock->nVersion)); |
|
|
|
result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex())); |
|
|
|
result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex())); |
|
|
|
result.push_back(Pair("transactions", transactions)); |
|
|
|
result.push_back(Pair("transactions", transactions)); |
|
|
|