mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 14:38:29 +01:00
Add sighash tests from data file
This commit is contained in:
@@ -3,9 +3,20 @@
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <iostream>
|
||||
|
||||
#include "main.h"
|
||||
#include "util.h"
|
||||
#include "serialize.h"
|
||||
#include "version.h"
|
||||
#include "data/sighash.json.h"
|
||||
|
||||
#include "json/json_spirit_reader_template.h"
|
||||
#include "json/json_spirit_utils.h"
|
||||
#include "json/json_spirit_writer_template.h"
|
||||
|
||||
using namespace json_spirit;
|
||||
extern Array read_json(const std::string& jsondata);
|
||||
|
||||
extern uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType);
|
||||
|
||||
@@ -103,7 +114,6 @@ void static RandomTransaction(CTransaction &tx, bool fSingle) {
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(sighash_tests)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(sighash_test)
|
||||
{
|
||||
seed_insecure_rand(false);
|
||||
@@ -115,10 +125,54 @@ BOOST_AUTO_TEST_CASE(sighash_test)
|
||||
CScript scriptCode;
|
||||
RandomScript(scriptCode);
|
||||
int nIn = insecure_rand() % txTo.vin.size();
|
||||
BOOST_CHECK(SignatureHash(scriptCode, txTo, nIn, nHashType) ==
|
||||
SignatureHashOld(scriptCode, txTo, nIn, nHashType));
|
||||
|
||||
uint256 sh, sho;
|
||||
sho = SignatureHashOld(scriptCode, txTo, nIn, nHashType);
|
||||
sh = SignatureHash(scriptCode, txTo, nIn, nHashType);
|
||||
BOOST_CHECK(sh == sho);
|
||||
}
|
||||
}
|
||||
|
||||
// Goal: check that SignatureHash generates correct hash
|
||||
|
||||
BOOST_AUTO_TEST_CASE(sighash_from_data)
|
||||
{
|
||||
Array tests = read_json(std::string(json_tests::sighash, json_tests::sighash + sizeof(json_tests::sighash)));
|
||||
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
std::string strTest = write_string(tv, false);
|
||||
if (test.size() < 1) // Allow for extra stuff (useful for comments)
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
continue;
|
||||
}
|
||||
if (test.size() == 1) continue; // comment
|
||||
|
||||
std::string raw_tx = test[0].get_str();
|
||||
std::string raw_script = test[1].get_str();
|
||||
int nIn = test[2].get_int();
|
||||
int nHashType = test[3].get_int();
|
||||
std::string sigHashHex = test[4].get_str();
|
||||
|
||||
uint256 sh;
|
||||
CDataStream stream(ParseHex(raw_tx), SER_NETWORK, PROTOCOL_VERSION);
|
||||
CTransaction tx;
|
||||
stream >> tx;
|
||||
|
||||
CValidationState state;
|
||||
BOOST_CHECK_MESSAGE(CheckTransaction(tx, state), strTest);
|
||||
BOOST_CHECK(state.IsValid());
|
||||
|
||||
CScript scriptCode = CScript();
|
||||
std::vector<unsigned char> raw = ParseHex(raw_script);
|
||||
scriptCode.insert(scriptCode.end(), raw.begin(), raw.end());
|
||||
|
||||
sh = SignatureHash(scriptCode, tx, nIn, nHashType);
|
||||
|
||||
BOOST_CHECK_MESSAGE(sh.GetHex() == sigHashHex, strTest);
|
||||
}
|
||||
}
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user