Abstract DecodeHexBlk and BIP22ValidationResult functions out of submitblock

This commit is contained in:
Luke Dashjr 2014-10-30 02:56:33 +00:00
parent 132ea9b48f
commit 3dcbb9b6b4
3 changed files with 41 additions and 21 deletions

View file

@ -8,6 +8,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
class CBlock;
class CScript; class CScript;
class CTransaction; class CTransaction;
class uint256; class uint256;
@ -16,6 +17,7 @@ class UniValue;
// core_read.cpp // core_read.cpp
extern CScript ParseScript(std::string s); extern CScript ParseScript(std::string s);
extern bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx); extern bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx);
extern bool DecodeHexBlk(CBlock&, const std::string& strHexBlk);
extern uint256 ParseHashUV(const UniValue& v, const std::string& strName); extern uint256 ParseHashUV(const UniValue& v, const std::string& strName);
extern std::vector<unsigned char> ParseHexUV(const UniValue& v, const std::string& strName); extern std::vector<unsigned char> ParseHexUV(const UniValue& v, const std::string& strName);

View file

@ -4,6 +4,7 @@
#include "core_io.h" #include "core_io.h"
#include "core/block.h"
#include "core/transaction.h" #include "core/transaction.h"
#include "script/script.h" #include "script/script.h"
#include "serialize.h" #include "serialize.h"
@ -108,6 +109,23 @@ bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx)
return true; return true;
} }
bool DecodeHexBlk(CBlock& block, const std::string& strHexBlk)
{
if (!IsHex(strHexBlk))
return false;
std::vector<unsigned char> blockData(ParseHex(strHexBlk));
CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION);
try {
ssBlock >> block;
}
catch (const std::exception &) {
return false;
}
return true;
}
uint256 ParseHashUV(const UniValue& v, const string& strName) uint256 ParseHashUV(const UniValue& v, const string& strName)
{ {
string strHex; string strHex;

View file

@ -283,6 +283,25 @@ Value prioritisetransaction(const Array& params, bool fHelp)
} }
// NOTE: Assumes a conclusive result; if result is inconclusive, it must be handled by caller
static Value BIP22ValidationResult(const CValidationState& state)
{
if (state.IsValid())
return Value::null;
std::string strRejectReason = state.GetRejectReason();
if (state.IsError())
throw JSONRPCError(RPC_VERIFY_ERROR, strRejectReason);
if (state.IsInvalid())
{
if (strRejectReason.empty())
return "rejected";
return strRejectReason;
}
// Should be impossible
return "valid?";
}
Value getblocktemplate(const Array& params, bool fHelp) Value getblocktemplate(const Array& params, bool fHelp)
{ {
if (fHelp || params.size() > 1) if (fHelp || params.size() > 1)
@ -566,15 +585,9 @@ Value submitblock(const Array& params, bool fHelp)
+ HelpExampleRpc("submitblock", "\"mydata\"") + HelpExampleRpc("submitblock", "\"mydata\"")
); );
vector<unsigned char> blockData(ParseHex(params[0].get_str()));
CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION);
CBlock pblock; CBlock pblock;
try { if (!DecodeHexBlk(pblock, params[0].get_str()))
ssBlock >> pblock;
}
catch (const std::exception &) {
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed"); throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
}
CValidationState state; CValidationState state;
submitblock_StateCatcher sc(pblock.GetHash()); submitblock_StateCatcher sc(pblock.GetHash());
@ -587,20 +600,7 @@ Value submitblock(const Array& params, bool fHelp)
return "inconclusive"; return "inconclusive";
state = sc.state; state = sc.state;
} }
if (state.IsError()) return BIP22ValidationResult(state);
{
std::string strRejectReason = state.GetRejectReason();
throw JSONRPCError(RPC_VERIFY_ERROR, strRejectReason);
}
if (state.IsInvalid())
{
std::string strRejectReason = state.GetRejectReason();
if (strRejectReason.empty())
return "rejected";
return strRejectReason;
}
return Value::null;
} }
Value estimatefee(const Array& params, bool fHelp) Value estimatefee(const Array& params, bool fHelp)