13 #include <test/data/sighash.json.h>
22 #include <boost/test/unit_test.hpp>
29 if (nIn >= txTo.
vin.size())
40 for (
unsigned int i = 0; i < txTmp.
vin.size(); i++)
42 txTmp.
vin[nIn].scriptSig = scriptCode;
51 for (
unsigned int i = 0; i < txTmp.
vin.size(); i++)
53 txTmp.
vin[i].nSequence = 0;
58 unsigned int nOut = nIn;
59 if (nOut >= txTmp.
vout.size())
63 txTmp.
vout.resize(nOut+1);
64 for (
unsigned int i = 0; i < nOut; i++)
65 txTmp.
vout[i].SetNull();
68 for (
unsigned int i = 0; i < txTmp.
vin.size(); i++)
70 txTmp.
vin[i].nSequence = 0;
76 txTmp.
vin[0] = txTmp.
vin[nIn];
82 ss << txTmp << nHashType;
90 for (
int i=0; i<ops; i++)
102 for (
int in = 0; in < ins; in++) {
122 #if defined(PRINT_SIGHASH_JSON)
124 std::cout <<
"\t[\"raw_transaction, script, input_index, hashType, signature_hash (result)\"],\n";
125 int nRandomTests = 500;
127 int nRandomTests = 50000;
129 for (
int i=0; i<nRandomTests; i++) {
140 #if defined(PRINT_SIGHASH_JSON)
144 std::cout <<
"\t[\"" ;
145 std::cout <<
HexStr(ss) <<
"\", \"";
146 std::cout <<
HexStr(scriptCode) <<
"\", ";
147 std::cout << nIn <<
", ";
148 std::cout << nHashType <<
", \"";
149 std::cout << sho.
GetHex() <<
"\"]";
150 if (i+1 != nRandomTests) {
157 #if defined(PRINT_SIGHASH_JSON)
165 UniValue tests =
read_json(std::string(json_tests::sighash, json_tests::sighash +
sizeof(json_tests::sighash)));
167 for (
unsigned int idx = 0; idx < tests.
size(); idx++) {
169 std::string strTest = test.
write();
172 BOOST_ERROR(
"Bad test: " << strTest);
175 if (test.
size() == 1)
continue;
177 std::string raw_tx, raw_script, sigHashHex;
186 raw_script = test[1].
get_str();
187 nIn = test[2].
getInt<
int>();
188 nHashType = test[3].
getInt<
int>();
189 sigHashHex = test[4].
get_str();
198 std::vector<unsigned char> raw =
ParseHex(raw_script);
199 scriptCode.
insert(scriptCode.
end(), raw.begin(), raw.end());
201 BOOST_ERROR(
"Bad test, couldn't deserialize data: " << strTest);
206 BOOST_CHECK_MESSAGE(sh.
GetHex() == sigHashHex, strTest);
Serialized script, used inside transaction inputs and outputs.
The basic transaction that is broadcasted on the network and contained in blocks.
const std::vector< CTxIn > vin
An input of a transaction.
An output of a transaction.
uint256 GetHash()
Compute the double-SHA256 hash of all data written to this object.
const std::string & get_str() const
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
std::string GetHex() const
iterator insert(iterator pos, const T &value)
BOOST_AUTO_TEST_SUITE_END()
int FindAndDelete(CScript &script, const CScript &b)
uint256 SignatureHash(const CScript &scriptCode, const T &txTo, unsigned int nIn, int nHashType, const CAmount &amount, SigVersion sigversion, const PrecomputedTransactionData *cache)
@ BASE
Bare scripts and BIP16 P2SH-wrapped redeemscripts.
UniValue read_json(const std::string &jsondata)
#define BOOST_CHECK(expr)
static const int SERIALIZE_TRANSACTION_NO_WITNESS
A flag that is ORed into the protocol version to designate that a transaction should be (un)serialize...
std::shared_ptr< const CTransaction > CTransactionRef
opcodetype
Script opcodes.
static uint256 SignatureHashOld(CScript scriptCode, const CTransaction &txTo, unsigned int nIn, int nHashType)
static void RandomTransaction(CMutableTransaction &tx, bool fSingle)
BOOST_AUTO_TEST_CASE(sighash_test)
static void RandomScript(CScript &script)
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
A mutable version of CTransaction.
std::vector< CTxOut > vout
static CAmount InsecureRandMoneyAmount()
static uint64_t InsecureRandRange(uint64_t range)
static uint256 InsecureRand256()
static uint64_t InsecureRandBits(int bits)
static uint32_t InsecureRand32()
static bool InsecureRandBool()
bool CheckTransaction(const CTransaction &tx, TxValidationState &state)
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
static const int PROTOCOL_VERSION
network protocol versioning