forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
build: add libbitcoinconsensus files and hook up the lib build
Credit BlueMatt for libbitcoinsonsensus.h/cpp
- Loading branch information
Showing
5 changed files
with
195 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
// Copyright (c) 2009-2010 Satoshi Nakamoto | ||
// Copyright (c) 2009-2014 The Bitcoin developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#include "bitcoinconsensus.h" | ||
|
||
#include "core/transaction.h" | ||
#include "script/interpreter.h" | ||
#include "version.h" | ||
|
||
namespace { | ||
|
||
/** A class that deserializes a single CTransaction one time. */ | ||
class TxInputStream | ||
{ | ||
public: | ||
TxInputStream(int nTypeIn, int nVersionIn, const unsigned char *txTo, size_t txToLen) : | ||
m_type(nTypeIn), | ||
m_version(nVersionIn), | ||
m_data(txTo), | ||
m_remaining(txToLen) | ||
{} | ||
|
||
TxInputStream& read(char* pch, size_t nSize) | ||
{ | ||
if (nSize > m_remaining) | ||
throw std::ios_base::failure(std::string(__func__) + ": end of data"); | ||
|
||
if (pch == NULL) | ||
throw std::ios_base::failure(std::string(__func__) + ": bad destination buffer"); | ||
|
||
if (m_data == NULL) | ||
throw std::ios_base::failure(std::string(__func__) + ": bad source buffer"); | ||
|
||
memcpy(pch, m_data, nSize); | ||
m_remaining -= nSize; | ||
m_data += nSize; | ||
return *this; | ||
} | ||
|
||
template<typename T> | ||
TxInputStream& operator>>(T& obj) | ||
{ | ||
::Unserialize(*this, obj, m_type, m_version); | ||
return *this; | ||
} | ||
|
||
private: | ||
const int m_type; | ||
const int m_version; | ||
const unsigned char* m_data; | ||
size_t m_remaining; | ||
}; | ||
|
||
inline int set_error(bitcoinconsensus_error* ret, bitcoinconsensus_error serror) | ||
{ | ||
if (ret) | ||
*ret = serror; | ||
return 0; | ||
} | ||
|
||
} // anon namespace | ||
|
||
int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, | ||
const unsigned char *txTo , unsigned int txToLen, | ||
unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err) | ||
{ | ||
try { | ||
TxInputStream stream(SER_NETWORK, PROTOCOL_VERSION, txTo, txToLen); | ||
CTransaction tx; | ||
stream >> tx; | ||
if (nIn >= tx.vin.size()) | ||
return set_error(err, bitcoinconsensus_ERR_TX_INDEX); | ||
if (tx.GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION) != txToLen) | ||
return set_error(err, bitcoinconsensus_ERR_TX_SIZE_MISMATCH); | ||
|
||
// Regardless of the verification result, the tx did not error. | ||
set_error(err, bitcoinconsensus_ERR_OK); | ||
|
||
return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, SignatureChecker(tx, nIn), NULL); | ||
} catch (std::exception &e) { | ||
return set_error(err, bitcoinconsensus_ERR_TX_DESERIALIZE); // Error deserializing | ||
} | ||
} | ||
|
||
unsigned int bitcoinconsensus_version() | ||
{ | ||
// Just use the API version for now | ||
return BITCOINCONSENSUS_API_VER; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// Copyright (c) 2009-2010 Satoshi Nakamoto | ||
// Copyright (c) 2009-2014 The Bitcoin developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef BITCOIN_BITCOINCONSENSUS_H | ||
#define BITCOIN_BITCOINCONSENSUS_H | ||
|
||
#if defined(BUILD_BITCOIN_INTERNAL) && defined(HAVE_CONFIG_H) | ||
#include "config/bitcoin-config.h" | ||
#if defined(_WIN32) | ||
#if defined(DLL_EXPORT) | ||
#if defined(HAVE_FUNC_ATTRIBUTE_DLLEXPORT) | ||
#define EXPORT_SYMBOL __declspec(dllexport) | ||
#else | ||
#define EXPORT_SYMBOL | ||
#endif | ||
#endif | ||
#elif defined(HAVE_FUNC_ATTRIBUTE_VISIBILITY) | ||
#define EXPORT_SYMBOL __attribute__ ((visibility ("default"))) | ||
#endif | ||
#elif defined(MSC_VER) && !defined(STATIC_LIBBITCOINCONSENSUS) | ||
#define EXPORT_SYMBOL __declspec(dllimport) | ||
#endif | ||
|
||
#ifndef EXPORT_SYMBOL | ||
#define EXPORT_SYMBOL | ||
#endif | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#define BITCOINCONSENSUS_API_VER 0 | ||
|
||
typedef enum bitcoinconsensus_error_t | ||
{ | ||
bitcoinconsensus_ERR_OK = 0, | ||
bitcoinconsensus_ERR_TX_INDEX, | ||
bitcoinconsensus_ERR_TX_SIZE_MISMATCH, | ||
bitcoinconsensus_ERR_TX_DESERIALIZE, | ||
} bitcoinconsensus_error; | ||
|
||
/** Script verification flags */ | ||
enum | ||
{ | ||
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0, | ||
bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts | ||
}; | ||
|
||
/// Returns 1 if the input nIn of the serialized transaction pointed to by | ||
/// txTo correctly spends the scriptPubKey pointed to by scriptPubKey under | ||
/// the additional constraints specified by flags. | ||
/// If not NULL, err will contain an error/success code for the operation | ||
EXPORT_SYMBOL int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, | ||
const unsigned char *txTo , unsigned int txToLen, | ||
unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err); | ||
|
||
EXPORT_SYMBOL unsigned int bitcoinconsensus_version(); | ||
|
||
#ifdef __cplusplus | ||
} // extern "C" | ||
#endif | ||
|
||
#undef EXPORT_SYMBOL | ||
|
||
#endif // BITCOIN_BITCOINCONSENSUS_H |