6 #ifndef BITCOIN_SCRIPT_SCRIPT_H
7 #define BITCOIN_SCRIPT_SCRIPT_H
22 #include <type_traits>
68 return std::vector<unsigned char>(in.begin(), in.end());
244 explicit CScriptNum(
const std::vector<unsigned char>& vch,
bool fRequireMinimal,
247 if (vch.size() > nMaxNumSize) {
250 if (fRequireMinimal && vch.size() > 0) {
257 if ((vch.back() & 0x7f) == 0) {
263 if (vch.size() <= 1 || (vch[vch.size() - 2] & 0x80) == 0) {
312 assert(rhs == 0 || (rhs > 0 &&
m_value <= std::numeric_limits<int64_t>::max() - rhs) ||
313 (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs));
320 assert(rhs == 0 || (rhs > 0 &&
m_value >= std::numeric_limits<int64_t>::min() + rhs) ||
321 (rhs < 0 &&
m_value <= std::numeric_limits<int64_t>::max() + rhs));
334 if (
m_value > std::numeric_limits<int>::max())
335 return std::numeric_limits<int>::max();
336 else if (
m_value < std::numeric_limits<int>::min())
337 return std::numeric_limits<int>::min();
343 std::vector<unsigned char>
getvch()
const
348 static std::vector<unsigned char>
serialize(
const int64_t& value)
351 return std::vector<unsigned char>();
353 std::vector<unsigned char> result;
354 const bool neg = value < 0;
355 uint64_t absvalue = neg ? ~static_cast<uint64_t>(value) + 1 :
static_cast<uint64_t
>(value);
359 result.push_back(absvalue & 0xff);
373 if (result.back() & 0x80)
374 result.push_back(neg ? 0x80 : 0);
376 result.back() |= 0x80;
382 static int64_t
set_vch(
const std::vector<unsigned char>& vch)
388 for (
size_t i = 0; i != vch.size(); ++i)
389 result |=
static_cast<int64_t
>(vch[i]) << 8*i;
393 if (vch.back() & 0x80)
394 return -((int64_t)(result & ~(0x80ULL << (8 * (vch.size() - 1)))));
418 if (n == -1 || (n >= 1 && n <= 16))
435 CScript(std::vector<unsigned char>::const_iterator pbegin, std::vector<unsigned char>::const_iterator pend) :
CScriptBase(pbegin, pend) { }
445 explicit CScript(
const std::vector<unsigned char>& b) =
delete;
454 if (opcode < 0 || opcode > 0xff)
455 throw std::runtime_error(
"CScript::operator<<(): invalid opcode");
472 else if (b.size() <= 0xff)
477 else if (b.size() <= 0xffff)
482 insert(
end(), _data, _data +
sizeof(_data));
489 insert(
end(), _data, _data +
sizeof(_data));
511 return (
int)opcode - (int)(
OP_1 - 1);
515 assert(n >= 0 && n <= 16);
538 bool IsWitnessProgram(
int& version, std::vector<unsigned char>& program)
const;
569 std::vector<std::vector<unsigned char> >
stack;
596 template<
typename... Ts>
602 ([&
ret, &cnt] (Ts&& input) {
603 if constexpr (std::is_same_v<std::remove_cv_t<std::remove_reference_t<Ts>>,
CScript>) {
606 ret = std::forward<Ts>(input);
608 ret.insert(
ret.end(), input.begin(), input.end());
615 } (std::forward<Ts>(inputs)), ...);
Serialized script, used inside transaction inputs and outputs.
CScript & operator<<(const std::vector< unsigned char > &b) LIFETIMEBOUND
CScript(const_iterator pbegin, const_iterator pend)
bool IsPayToScriptHash() const
bool IsUnspendable() const
Returns whether the script is guaranteed to fail at execution, regardless of the initial stack.
CScript(const CScriptNum &b)
CScript & operator<<(const CScriptNum &b) LIFETIMEBOUND
CScript & operator<<(const CScript &b)=delete
Delete non-existent operator to defend against future introduction.
CScript & operator<<(opcodetype opcode) LIFETIMEBOUND
SERIALIZE_METHODS(CScript, obj)
CScript(std::vector< unsigned char >::const_iterator pbegin, std::vector< unsigned char >::const_iterator pend)
static int DecodeOP_N(opcodetype opcode)
Encode/decode small integers:
bool IsPayToWitnessScriptHash() const
CScript & operator<<(int64_t b) LIFETIMEBOUND
unsigned int GetSigOpCount(bool fAccurate) const
Pre-version-0.6, Bitcoin always counted CHECKMULTISIGs as 20 sigops.
bool HasValidOps() const
Check if the script contains valid OP_CODES.
CScript(const std::vector< unsigned char > &b)=delete
bool GetOp(const_iterator &pc, opcodetype &opcodeRet) const
CScript(const unsigned char *pbegin, const unsigned char *pend)
CScript & push_int64(int64_t n)
bool GetOp(const_iterator &pc, opcodetype &opcodeRet, std::vector< unsigned char > &vchRet) const
bool IsWitnessProgram(int &version, std::vector< unsigned char > &program) const
static opcodetype EncodeOP_N(int n)
A reference to a CScript: the Hash160 of its serialization.
CScriptID(const uint160 &in)
CScriptNum & operator&=(const int64_t &rhs)
CScriptNum operator-(const int64_t &rhs) const
CScriptNum operator+(const int64_t &rhs) const
static std::vector< unsigned char > serialize(const int64_t &value)
CScriptNum operator-(const CScriptNum &rhs) const
CScriptNum & operator+=(const CScriptNum &rhs)
bool operator==(const CScriptNum &rhs) const
bool operator<=(const CScriptNum &rhs) const
bool operator==(const int64_t &rhs) const
bool operator<(const int64_t &rhs) const
CScriptNum(const std::vector< unsigned char > &vch, bool fRequireMinimal, const size_t nMaxNumSize=nDefaultMaxNumSize)
CScriptNum & operator+=(const int64_t &rhs)
static const size_t nDefaultMaxNumSize
CScriptNum operator&(const int64_t &rhs) const
CScriptNum operator&(const CScriptNum &rhs) const
bool operator>=(const int64_t &rhs) const
CScriptNum & operator-=(const CScriptNum &rhs)
bool operator<=(const int64_t &rhs) const
CScriptNum(const int64_t &n)
Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers.
CScriptNum & operator=(const int64_t &rhs)
bool operator!=(const int64_t &rhs) const
bool operator>=(const CScriptNum &rhs) const
bool operator>(const int64_t &rhs) const
static int64_t set_vch(const std::vector< unsigned char > &vch)
std::vector< unsigned char > getvch() const
CScriptNum operator-() const
bool operator!=(const CScriptNum &rhs) const
CScriptNum & operator-=(const int64_t &rhs)
CScriptNum & operator&=(const CScriptNum &rhs)
CScriptNum operator+(const CScriptNum &rhs) const
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
iterator insert(iterator pos, const T &value)
void push_back(const T &value)
scriptnum_error(const std::string &str)
static void WriteLE16(unsigned char *ptr, uint16_t x)
static void WriteLE32(unsigned char *ptr, uint32_t x)
static constexpr int64_t VALIDATION_WEIGHT_PER_SIGOP_PASSED
static const unsigned int LOCKTIME_THRESHOLD
static const unsigned int MAX_OPCODE
std::string GetOpName(opcodetype opcode)
prevector< 28, unsigned char > CScriptBase
We use a prevector for the script to reduce the considerable memory overhead of vectors in cases wher...
bool CheckMinimalPush(const std::vector< unsigned char > &data, opcodetype opcode)
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE
std::vector< unsigned char > ToByteVector(const T &in)
static const int MAX_SCRIPT_SIZE
opcodetype
Script opcodes.
static constexpr unsigned int MAX_PUBKEYS_PER_MULTI_A
The limit of keys in OP_CHECKSIGADD-based scripts.
bool GetScriptOp(CScriptBase::const_iterator &pc, CScriptBase::const_iterator end, opcodetype &opcodeRet, std::vector< unsigned char > *pvchRet)
static const int MAX_STACK_SIZE
bool IsOpSuccess(const opcodetype &opcode)
Test for OP_SUCCESSx opcodes as defined by BIP342.
static const int MAX_OPS_PER_SCRIPT
static constexpr int64_t VALIDATION_WEIGHT_OFFSET
CScript BuildScript(Ts &&... inputs)
Build a script by concatenating other scripts, or any argument accepted by CScript::operator<<.
static const int MAX_PUBKEYS_PER_MULTISIG
static const uint32_t LOCKTIME_MAX
static constexpr unsigned int ANNEX_TAG
std::string ToString() const
std::vector< std::vector< unsigned char > > stack