Abstract DecodeHexBlk and BIP22ValidationResult functions out of submitblock
This commit is contained in:
parent
132ea9b48f
commit
3dcbb9b6b4
3 changed files with 41 additions and 21 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue