Implement BIP 23 Block Proposal
This commit is contained in:
parent
3dcbb9b6b4
commit
9765a50cbd
1 changed files with 33 additions and 0 deletions
|
@ -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));
|
||||||
|
|
Loading…
Reference in a new issue