Browse Source

Bugfix: submitblock: Use a temporary CValidationState to determine accurately the outcome of ProcessBlock, now that it no longer does the full block validity check

0.10
Luke Dashjr 10 years ago
parent
commit
f877aaaf16
  1. 34
      src/rpcmining.cpp

34
src/rpcmining.cpp

@ -526,6 +526,24 @@ Value getblocktemplate(const Array& params, bool fHelp) @@ -526,6 +526,24 @@ Value getblocktemplate(const Array& params, bool fHelp)
return result;
}
class submitblock_StateCatcher : public CValidationInterface
{
public:
uint256 hash;
bool found;
CValidationState state;
submitblock_StateCatcher(const uint256 &hashIn) : hash(hashIn), found(false), state() {};
protected:
virtual void BlockChecked(const CBlock& block, const CValidationState& stateIn) {
if (block.GetHash() != hash)
return;
found = true;
state = stateIn;
};
};
Value submitblock(const Array& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
@ -558,8 +576,22 @@ Value submitblock(const Array& params, bool fHelp) @@ -558,8 +576,22 @@ Value submitblock(const Array& params, bool fHelp)
}
CValidationState state;
submitblock_StateCatcher sc(pblock.GetHash());
RegisterValidationInterface(&sc);
bool fAccepted = ProcessBlock(state, NULL, &pblock);
if (!fAccepted)
UnregisterValidationInterface(&sc);
if (fAccepted)
{
if (!sc.found)
return "inconclusive";
state = sc.state;
}
if (state.IsError())
{
std::string strRejectReason = state.GetRejectReason();
throw JSONRPCError(RPC_MISC_ERROR, strRejectReason);
}
if (state.IsInvalid())
return "rejected"; // TODO: report validation state
return Value::null;

Loading…
Cancel
Save