15 #include <boost/foreach.hpp> 19 typedef std::vector<unsigned char>
valtype;
30 if (!
key.Sign(hash, vchSig))
32 vchSig.push_back((
unsigned char)
nHashType);
38 vector<unsigned char> vchSig;
39 if (!creator.
CreateSig(vchSig, address, scriptCode))
41 scriptSigRet << vchSig;
48 int nRequired = multisigdata.front()[0];
49 for (
unsigned int i = 1; i < multisigdata.size()-1 && nSigned < nRequired; i++)
51 const valtype& pubkey = multisigdata[i];
53 if (
Sign1(keyID, creator, scriptCode, scriptSigRet))
56 return nSigned==nRequired;
70 vector<valtype> vSolutions;
71 if (!
Solver(scriptPubKey, whichTypeRet, vSolutions))
82 return Sign1(keyID, creator, scriptPubKey, scriptSigRet);
85 if (!
Sign1(keyID, creator, scriptPubKey, scriptSigRet))
99 return (
SignN(vSolutions, creator, scriptPubKey, scriptSigRet));
107 if (!
SignStep(creator, fromPubKey, scriptSig, whichType))
122 if (!fSolved)
return false;
131 assert(nIn < txTo.
vin.size());
142 assert(nIn < txTo.
vin.size());
144 assert(txin.prevout.n < txFrom.
vout.size());
145 const CTxOut& txout = txFrom.
vout[txin.prevout.n];
147 return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, nHashType);
153 BOOST_FOREACH(
const valtype& v, values)
159 const vector<valtype>& vSolutions,
160 const vector<valtype>& sigs1,
const vector<valtype>& sigs2)
163 set<valtype> allsigs;
164 BOOST_FOREACH(
const valtype& v, sigs1)
169 BOOST_FOREACH(
const valtype& v, sigs2)
176 assert(vSolutions.size() > 1);
177 unsigned int nSigsRequired = vSolutions.front()[0];
178 unsigned int nPubKeys = vSolutions.size()-2;
179 map<valtype, valtype> sigs;
180 BOOST_FOREACH(
const valtype& sig, allsigs)
182 for (
unsigned int i = 0; i < nPubKeys; i++)
184 const valtype& pubkey = vSolutions[i+1];
185 if (sigs.count(pubkey))
188 if (checker.
CheckSig(sig, pubkey, scriptPubKey))
196 unsigned int nSigsHave = 0;
198 for (
unsigned int i = 0; i < nPubKeys && nSigsHave < nSigsRequired; i++)
200 if (sigs.count(vSolutions[i+1]))
202 result << sigs[vSolutions[i+1]];
207 for (
unsigned int i = nSigsHave; i < nSigsRequired; i++)
214 const txnouttype txType,
const vector<valtype>& vSolutions,
215 vector<valtype>& sigs1, vector<valtype>& sigs2)
222 if (sigs1.size() >= sigs2.size())
228 if (sigs1.empty() || sigs1[0].empty())
232 if (sigs1.empty() || sigs1.back().empty())
234 else if (sigs2.empty() || sigs2.back().empty())
240 CScript pubKey2(spk.begin(), spk.end());
243 vector<vector<unsigned char> > vSolutions2;
244 Solver(pubKey2, txType2, vSolutions2);
252 return CombineMultisig(scriptPubKey, checker, vSolutions, sigs1, sigs2);
269 vector<vector<unsigned char> > vSolutions;
270 Solver(scriptPubKey, txType, vSolutions);
272 vector<valtype> stack1;
274 vector<valtype> stack2;
277 return CombineSignatures(scriptPubKey, checker, txType, vSolutions, stack1, stack2);
285 DummySignatureChecker() {}
287 bool CheckSig(
const std::vector<unsigned char>& scriptSig,
const std::vector<unsigned char>& vchPubKey,
const CScript& scriptCode)
const 292 const DummySignatureChecker dummyChecker;
303 vchSig.assign(72,
'\000');
309 vchSig[4 + 33] = 0x02;
311 vchSig[6 + 33] = 0x01;
bool CreateSig(std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode) const
bool CreateSig(std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode) const
virtual bool CheckSig(const std::vector< unsigned char > &scriptSig, const std::vector< unsigned char > &vchPubKey, const CScript &scriptCode) const
iterator insert(iterator pos, const T &value)
TransactionSignatureCreator(const CKeyStore *keystoreIn, const CTransaction *txToIn, unsigned int nInIn, int nHashTypeIn=SIGHASH_ALL)
static bool SignStep(const BaseSignatureCreator &creator, const CScript &scriptPubKey, CScript &scriptSigRet, txnouttype &whichTypeRet)
static bool Sign1(const CKeyID &address, const BaseSignatureCreator &creator, const CScript &scriptCode, CScript &scriptSigRet)
virtual bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const =0
static CScript CombineSignatures(const CScript &scriptPubKey, const BaseSignatureChecker &checker, const txnouttype txType, const vector< valtype > &vSolutions, vector< valtype > &sigs1, vector< valtype > &sigs2)
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const =0
static CScript PushAll(const vector< valtype > &values)
static CScript CombineMultisig(const CScript &scriptPubKey, const BaseSignatureChecker &checker, const vector< valtype > &vSolutions, const vector< valtype > &sigs1, const vector< valtype > &sigs2)
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
const CTransaction * txTo
const BaseSignatureChecker & Checker() const
def SignatureHash(script, txTo, inIdx, hashtype)
bool EvalScript(vector< vector< unsigned char > > &stack, const CScript &script, unsigned int flags, const BaseSignatureChecker &checker, ScriptError *serror)
virtual bool CreateSig(std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode) const =0
const CKeyStore * keystore
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, unsigned int flags, const BaseSignatureChecker &checker, ScriptError *serror)
static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS
vector< unsigned char > valtype
virtual const BaseSignatureChecker & Checker() const =0
virtual bool GetKey(const CKeyID &address, CKey &keyOut) const =0
const std::vector< CTxOut > vout
std::vector< unsigned char > valtype
bool ProduceSignature(const BaseSignatureCreator &creator, const CScript &fromPubKey, CScript &scriptSig)
bool Solver(const CScript &scriptPubKey, txnouttype &typeRet, vector< vector< unsigned char > > &vSolutionsRet)
bool SignSignature(const CKeyStore &keystore, const CScript &fromPubKey, CMutableTransaction &txTo, unsigned int nIn, int nHashType)
const CKeyStore & KeyStore() const
std::vector< unsigned char > ToByteVector(const T &in)
static bool SignN(const vector< valtype > &multisigdata, const BaseSignatureCreator &creator, const CScript &scriptCode, CScript &scriptSigRet)