|
|
@ -14,8 +14,6 @@ |
|
|
|
|
|
|
|
|
|
|
|
#include <boost/foreach.hpp> |
|
|
|
#include <boost/foreach.hpp> |
|
|
|
|
|
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef std::vector<unsigned char> valtype; |
|
|
|
typedef std::vector<unsigned char> valtype; |
|
|
|
|
|
|
|
|
|
|
|
TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {} |
|
|
|
TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {} |
|
|
@ -39,14 +37,14 @@ bool TransactionSignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, |
|
|
|
|
|
|
|
|
|
|
|
static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion) |
|
|
|
static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion) |
|
|
|
{ |
|
|
|
{ |
|
|
|
vector<unsigned char> vchSig; |
|
|
|
std::vector<unsigned char> vchSig; |
|
|
|
if (!creator.CreateSig(vchSig, address, scriptCode, sigversion)) |
|
|
|
if (!creator.CreateSig(vchSig, address, scriptCode, sigversion)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
ret.push_back(vchSig); |
|
|
|
ret.push_back(vchSig); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static bool SignN(const vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion) |
|
|
|
static bool SignN(const std::vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int nSigned = 0; |
|
|
|
int nSigned = 0; |
|
|
|
int nRequired = multisigdata.front()[0]; |
|
|
|
int nRequired = multisigdata.front()[0]; |
|
|
@ -73,7 +71,7 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP |
|
|
|
uint160 h160; |
|
|
|
uint160 h160; |
|
|
|
ret.clear(); |
|
|
|
ret.clear(); |
|
|
|
|
|
|
|
|
|
|
|
vector<valtype> vSolutions; |
|
|
|
std::vector<valtype> vSolutions; |
|
|
|
if (!Solver(scriptPubKey, whichTypeRet, vSolutions)) |
|
|
|
if (!Solver(scriptPubKey, whichTypeRet, vSolutions)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
@ -125,7 +123,7 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static CScript PushAll(const vector<valtype>& values) |
|
|
|
static CScript PushAll(const std::vector<valtype>& values) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CScript result; |
|
|
|
CScript result; |
|
|
|
BOOST_FOREACH(const valtype& v, values) { |
|
|
|
BOOST_FOREACH(const valtype& v, values) { |
|
|
@ -228,12 +226,12 @@ bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutab |
|
|
|
return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType); |
|
|
|
return SignSignature(keystore, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker, |
|
|
|
static std::vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker, |
|
|
|
const vector<valtype>& vSolutions, |
|
|
|
const std::vector<valtype>& vSolutions, |
|
|
|
const vector<valtype>& sigs1, const vector<valtype>& sigs2, SigVersion sigversion) |
|
|
|
const std::vector<valtype>& sigs1, const std::vector<valtype>& sigs2, SigVersion sigversion) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Combine all the signatures we've got:
|
|
|
|
// Combine all the signatures we've got:
|
|
|
|
set<valtype> allsigs; |
|
|
|
std::set<valtype> allsigs; |
|
|
|
BOOST_FOREACH(const valtype& v, sigs1) |
|
|
|
BOOST_FOREACH(const valtype& v, sigs1) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!v.empty()) |
|
|
|
if (!v.empty()) |
|
|
@ -249,7 +247,7 @@ static vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSi |
|
|
|
assert(vSolutions.size() > 1); |
|
|
|
assert(vSolutions.size() > 1); |
|
|
|
unsigned int nSigsRequired = vSolutions.front()[0]; |
|
|
|
unsigned int nSigsRequired = vSolutions.front()[0]; |
|
|
|
unsigned int nPubKeys = vSolutions.size()-2; |
|
|
|
unsigned int nPubKeys = vSolutions.size()-2; |
|
|
|
map<valtype, valtype> sigs; |
|
|
|
std::map<valtype, valtype> sigs; |
|
|
|
BOOST_FOREACH(const valtype& sig, allsigs) |
|
|
|
BOOST_FOREACH(const valtype& sig, allsigs) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (unsigned int i = 0; i < nPubKeys; i++) |
|
|
|
for (unsigned int i = 0; i < nPubKeys; i++) |
|
|
@ -306,7 +304,7 @@ struct Stacks |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, |
|
|
|
static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, |
|
|
|
const txnouttype txType, const vector<valtype>& vSolutions, |
|
|
|
const txnouttype txType, const std::vector<valtype>& vSolutions, |
|
|
|
Stacks sigs1, Stacks sigs2, SigVersion sigversion) |
|
|
|
Stacks sigs1, Stacks sigs2, SigVersion sigversion) |
|
|
|
{ |
|
|
|
{ |
|
|
|
switch (txType) |
|
|
|
switch (txType) |
|
|
@ -340,7 +338,7 @@ static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignature |
|
|
|
CScript pubKey2(spk.begin(), spk.end()); |
|
|
|
CScript pubKey2(spk.begin(), spk.end()); |
|
|
|
|
|
|
|
|
|
|
|
txnouttype txType2; |
|
|
|
txnouttype txType2; |
|
|
|
vector<vector<unsigned char> > vSolutions2; |
|
|
|
std::vector<std::vector<unsigned char> > vSolutions2; |
|
|
|
Solver(pubKey2, txType2, vSolutions2); |
|
|
|
Solver(pubKey2, txType2, vSolutions2); |
|
|
|
sigs1.script.pop_back(); |
|
|
|
sigs1.script.pop_back(); |
|
|
|
sigs2.script.pop_back(); |
|
|
|
sigs2.script.pop_back(); |
|
|
@ -360,7 +358,7 @@ static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignature |
|
|
|
// Recur to combine:
|
|
|
|
// Recur to combine:
|
|
|
|
CScript pubKey2(sigs1.witness.back().begin(), sigs1.witness.back().end()); |
|
|
|
CScript pubKey2(sigs1.witness.back().begin(), sigs1.witness.back().end()); |
|
|
|
txnouttype txType2; |
|
|
|
txnouttype txType2; |
|
|
|
vector<valtype> vSolutions2; |
|
|
|
std::vector<valtype> vSolutions2; |
|
|
|
Solver(pubKey2, txType2, vSolutions2); |
|
|
|
Solver(pubKey2, txType2, vSolutions2); |
|
|
|
sigs1.witness.pop_back(); |
|
|
|
sigs1.witness.pop_back(); |
|
|
|
sigs1.script = sigs1.witness; |
|
|
|
sigs1.script = sigs1.witness; |
|
|
@ -383,7 +381,7 @@ SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignature |
|
|
|
const SignatureData& scriptSig1, const SignatureData& scriptSig2) |
|
|
|
const SignatureData& scriptSig1, const SignatureData& scriptSig2) |
|
|
|
{ |
|
|
|
{ |
|
|
|
txnouttype txType; |
|
|
|
txnouttype txType; |
|
|
|
vector<vector<unsigned char> > vSolutions; |
|
|
|
std::vector<std::vector<unsigned char> > vSolutions; |
|
|
|
Solver(scriptPubKey, txType, vSolutions); |
|
|
|
Solver(scriptPubKey, txType, vSolutions); |
|
|
|
|
|
|
|
|
|
|
|
return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SIGVERSION_BASE).Output(); |
|
|
|
return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SIGVERSION_BASE).Output(); |
|
|
|