45 if (str.size() && !
IsHex(str))
throw std::runtime_error(
"Non-hex input '" + str +
"'");
60 }
catch (
const std::ios_base::failure&) {
61 throw std::runtime_error(
"Tx deserialization failure");
68 if (!
univalue.isArray())
throw std::runtime_error(
"Prevouts must be array");
70 for (
size_t i = 0; i <
univalue.size(); ++i) {
74 }
catch (
const std::ios_base::failure&) {
75 throw std::runtime_error(
"Prevout invalid format");
77 prevouts.push_back(std::move(txout));
84 if (!
univalue.isArray())
throw std::runtime_error(
"Script witness is not array");
86 for (
size_t i = 0; i <
univalue.size(); ++i) {
93const std::map<std::string, script_verify_flag_name>
FLAG_NAMES = {
103std::vector<script_verify_flags>
AllFlags()
105 std::vector<script_verify_flags>
ret;
107 for (
unsigned int i = 0; i < 128; ++i) {
132 if (str.empty())
return 0;
135 std::vector<std::string>
words = SplitString(str,
',');
139 if (it ==
FLAG_NAMES.end())
throw std::runtime_error(
"Unknown verification flag " +
word);
146void Test(
const std::string& str)
149 if (!test.
read(str) || !test.
isObject())
throw std::runtime_error(
"Non-object test input");
153 if (
prevouts.size() != tx.
vin.size())
throw std::runtime_error(
"Incorrect number of prevouts");
155 if (idx >= tx.
vin.size())
throw std::runtime_error(
"Invalid index");
159 if (test.
exists(
"success")) {
160 tx.
vin[idx].scriptSig =
ScriptFromHex(test[
"success"][
"scriptSig"].get_str());
174 if (test.
exists(
"failure")) {
175 tx.
vin[idx].scriptSig =
ScriptFromHex(test[
"failure"][
"scriptSig"].get_str());
193 if (buffer.size() < 2 || buffer.back() !=
'\n' || buffer[buffer.size() - 2] !=
',')
return;
194 const std::string str((
const char*)buffer.data(), buffer.size() - 2);
197 }
catch (
const std::runtime_error&) {
Serialized script, used inside transaction inputs and outputs.
An output of a transaction.
Minimal stream for reading from an existing byte array by std::span.
bool read(std::string_view raw)
bool exists(const std::string &key) const
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness *witness, script_verify_flags flags, const BaseSignatureChecker &checker, ScriptError *serror)
@ ASSERT_FAIL
Abort execution through assertion failure (for consensus code)
@ SCRIPT_VERIFY_NULLDUMMY
@ SCRIPT_VERIFY_CHECKSEQUENCEVERIFY
@ SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY
std::vector< std::string > SplitString(std::string_view str, char sep)
static constexpr TransactionSerParams TX_NO_WITNESS
static CScript ScriptFromHex(const std::string &str)
static CMutableTransaction TxFromHex(const std::string &str)
script_verify_flags ParseScriptFlags(std::string strFlags)
static std::vector< CTxOut > TxOutsFromJSON(const UniValue &univalue)
static CScriptWitness ScriptWitnessFromJSON(const UniValue &univalue)
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
A mutable version of CTransaction.
void Init(const T &tx, std::vector< CTxOut > &&spent_outputs, bool force=false)
Initialize this PrecomputedTransactionData with transaction data.
bool IsHex(std::string_view str)
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.