Changeset View
Changeset View
Standalone View
Standalone View
src/script/sign.h
// Copyright (c) 2009-2010 Satoshi Nakamoto | // Copyright (c) 2009-2010 Satoshi Nakamoto | ||||
// Copyright (c) 2009-2016 The Bitcoin Core developers | // Copyright (c) 2009-2016 The Bitcoin Core developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#ifndef BITCOIN_SCRIPT_SIGN_H | #ifndef BITCOIN_SCRIPT_SIGN_H | ||||
#define BITCOIN_SCRIPT_SIGN_H | #define BITCOIN_SCRIPT_SIGN_H | ||||
#include <script/interpreter.h> | #include <script/interpreter.h> | ||||
#include <script/sighashtype.h> | #include <script/sighashtype.h> | ||||
class CKey; | |||||
class CKeyID; | class CKeyID; | ||||
class CKeyStore; | |||||
class CMutableTransaction; | class CMutableTransaction; | ||||
class CScript; | class CScript; | ||||
class CScriptID; | |||||
class CTransaction; | class CTransaction; | ||||
/** An interface to be implemented by keystores that support signing. */ | |||||
class SigningProvider { | |||||
public: | |||||
virtual ~SigningProvider() {} | |||||
virtual bool GetCScript(const CScriptID &scriptid, | |||||
CScript &script) const = 0; | |||||
virtual bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const = 0; | |||||
virtual bool GetKey(const CKeyID &address, CKey &key) const = 0; | |||||
}; | |||||
/** Virtual base class for signature creators. */ | /** Virtual base class for signature creators. */ | ||||
class BaseSignatureCreator { | class BaseSignatureCreator { | ||||
protected: | protected: | ||||
const CKeyStore *keystore; | const SigningProvider *m_provider; | ||||
public: | public: | ||||
explicit BaseSignatureCreator(const CKeyStore *keystoreIn) | explicit BaseSignatureCreator(const SigningProvider *provider) | ||||
: keystore(keystoreIn) {} | : m_provider(provider) {} | ||||
const CKeyStore &KeyStore() const { return *keystore; }; | const SigningProvider &Provider() const { return *m_provider; } | ||||
virtual ~BaseSignatureCreator() {} | virtual ~BaseSignatureCreator() {} | ||||
virtual const BaseSignatureChecker &Checker() const = 0; | virtual const BaseSignatureChecker &Checker() const = 0; | ||||
/** Create a singular (non-script) signature. */ | /** Create a singular (non-script) signature. */ | ||||
virtual bool CreateSig(std::vector<uint8_t> &vchSig, const CKeyID &keyid, | virtual bool CreateSig(std::vector<uint8_t> &vchSig, const CKeyID &keyid, | ||||
const CScript &scriptCode) const = 0; | const CScript &scriptCode) const = 0; | ||||
}; | }; | ||||
/** A signature creator for transactions. */ | /** A signature creator for transactions. */ | ||||
class TransactionSignatureCreator : public BaseSignatureCreator { | class TransactionSignatureCreator : public BaseSignatureCreator { | ||||
const CTransaction *txTo; | const CTransaction *txTo; | ||||
unsigned int nIn; | unsigned int nIn; | ||||
Amount amount; | Amount amount; | ||||
SigHashType sigHashType; | SigHashType sigHashType; | ||||
const TransactionSignatureChecker checker; | const TransactionSignatureChecker checker; | ||||
public: | public: | ||||
TransactionSignatureCreator(const CKeyStore *keystoreIn, | TransactionSignatureCreator(const SigningProvider *provider, | ||||
const CTransaction *txToIn, unsigned int nInIn, | const CTransaction *txToIn, unsigned int nInIn, | ||||
const Amount amountIn, | const Amount amountIn, | ||||
SigHashType sigHashTypeIn = SigHashType()); | SigHashType sigHashTypeIn = SigHashType()); | ||||
const BaseSignatureChecker &Checker() const override { return checker; } | const BaseSignatureChecker &Checker() const override { return checker; } | ||||
bool CreateSig(std::vector<uint8_t> &vchSig, const CKeyID &keyid, | bool CreateSig(std::vector<uint8_t> &vchSig, const CKeyID &keyid, | ||||
const CScript &scriptCode) const override; | const CScript &scriptCode) const override; | ||||
}; | }; | ||||
class MutableTransactionSignatureCreator : public TransactionSignatureCreator { | class MutableTransactionSignatureCreator : public TransactionSignatureCreator { | ||||
CTransaction tx; | CTransaction tx; | ||||
public: | public: | ||||
MutableTransactionSignatureCreator(const CKeyStore *keystoreIn, | MutableTransactionSignatureCreator(const SigningProvider *provider, | ||||
const CMutableTransaction *txToIn, | const CMutableTransaction *txToIn, | ||||
unsigned int nInIn, | unsigned int nInIn, | ||||
const Amount amountIn, | const Amount amountIn, | ||||
SigHashType sigHashTypeIn) | SigHashType sigHashTypeIn) | ||||
: TransactionSignatureCreator(keystoreIn, &tx, nInIn, amountIn, | : TransactionSignatureCreator(provider, &tx, nInIn, amountIn, | ||||
sigHashTypeIn), | sigHashTypeIn), | ||||
tx(*txToIn) {} | tx(*txToIn) {} | ||||
}; | }; | ||||
/** A signature creator that just produces 72-byte empty signatures. */ | /** A signature creator that just produces 72-byte empty signatures. */ | ||||
class DummySignatureCreator : public BaseSignatureCreator { | class DummySignatureCreator : public BaseSignatureCreator { | ||||
public: | public: | ||||
explicit DummySignatureCreator(const CKeyStore *keystoreIn) | explicit DummySignatureCreator(const SigningProvider *provider) | ||||
: BaseSignatureCreator(keystoreIn) {} | : BaseSignatureCreator(provider) {} | ||||
const BaseSignatureChecker &Checker() const override; | const BaseSignatureChecker &Checker() const override; | ||||
bool CreateSig(std::vector<uint8_t> &vchSig, const CKeyID &keyid, | bool CreateSig(std::vector<uint8_t> &vchSig, const CKeyID &keyid, | ||||
const CScript &scriptCode) const override; | const CScript &scriptCode) const override; | ||||
}; | }; | ||||
struct SignatureData { | struct SignatureData { | ||||
CScript scriptSig; | CScript scriptSig; | ||||
SignatureData() {} | SignatureData() {} | ||||
explicit SignatureData(const CScript &script) : scriptSig(script) {} | explicit SignatureData(const CScript &script) : scriptSig(script) {} | ||||
}; | }; | ||||
/** Produce a script signature using a generic signature creator. */ | /** Produce a script signature using a generic signature creator. */ | ||||
bool ProduceSignature(const BaseSignatureCreator &creator, | bool ProduceSignature(const BaseSignatureCreator &creator, | ||||
const CScript &scriptPubKey, SignatureData &sigdata); | const CScript &scriptPubKey, SignatureData &sigdata); | ||||
/** Produce a script signature for a transaction. */ | /** Produce a script signature for a transaction. */ | ||||
bool SignSignature(const CKeyStore &keystore, const CScript &fromPubKey, | bool SignSignature(const SigningProvider &provider, const CScript &fromPubKey, | ||||
CMutableTransaction &txTo, unsigned int nIn, | CMutableTransaction &txTo, unsigned int nIn, | ||||
const Amount amount, SigHashType sigHashType); | const Amount amount, SigHashType sigHashType); | ||||
bool SignSignature(const CKeyStore &keystore, const CTransaction &txFrom, | bool SignSignature(const SigningProvider &provider, const CTransaction &txFrom, | ||||
CMutableTransaction &txTo, unsigned int nIn, | CMutableTransaction &txTo, unsigned int nIn, | ||||
SigHashType sigHashType); | SigHashType sigHashType); | ||||
/** Combine two script signatures using a generic signature checker, | /** Combine two script signatures using a generic signature checker, | ||||
* intelligently, possibly with OP_0 placeholders. */ | * intelligently, possibly with OP_0 placeholders. */ | ||||
SignatureData CombineSignatures(const CScript &scriptPubKey, | SignatureData CombineSignatures(const CScript &scriptPubKey, | ||||
const BaseSignatureChecker &checker, | const BaseSignatureChecker &checker, | ||||
const SignatureData &scriptSig1, | const SignatureData &scriptSig1, | ||||
Show All 10 Lines |