struct CC_info
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -340,39 +340,39 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP
|
|||||||
|
|
||||||
switch (whichTypeRet)
|
switch (whichTypeRet)
|
||||||
{
|
{
|
||||||
case TX_NONSTANDARD:
|
case TX_NONSTANDARD:
|
||||||
case TX_NULL_DATA:
|
case TX_NULL_DATA:
|
||||||
return false;
|
|
||||||
case TX_PUBKEY:
|
|
||||||
keyID = CPubKey(vSolutions[0]).GetID();
|
|
||||||
return Sign1(keyID, creator, scriptPubKey, ret, consensusBranchId);
|
|
||||||
case TX_PUBKEYHASH:
|
|
||||||
keyID = CKeyID(uint160(vSolutions[0]));
|
|
||||||
if (!Sign1(keyID, creator, scriptPubKey, ret, consensusBranchId))
|
|
||||||
return false;
|
return false;
|
||||||
else
|
case TX_PUBKEY:
|
||||||
{
|
keyID = CPubKey(vSolutions[0]).GetID();
|
||||||
CPubKey vch;
|
return Sign1(keyID, creator, scriptPubKey, ret, consensusBranchId);
|
||||||
creator.KeyStore().GetPubKey(keyID, vch);
|
case TX_PUBKEYHASH:
|
||||||
ret.push_back(ToByteVector(vch));
|
keyID = CKeyID(uint160(vSolutions[0]));
|
||||||
}
|
if (!Sign1(keyID, creator, scriptPubKey, ret, consensusBranchId))
|
||||||
return true;
|
return false;
|
||||||
case TX_SCRIPTHASH:
|
else
|
||||||
if (creator.KeyStore().GetCScript(uint160(vSolutions[0]), scriptRet)) {
|
{
|
||||||
ret.push_back(std::vector<unsigned char>(scriptRet.begin(), scriptRet.end()));
|
CPubKey vch;
|
||||||
|
creator.KeyStore().GetPubKey(keyID, vch);
|
||||||
|
ret.push_back(ToByteVector(vch));
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
case TX_SCRIPTHASH:
|
||||||
return false;
|
if (creator.KeyStore().GetCScript(uint160(vSolutions[0]), scriptRet)) {
|
||||||
|
ret.push_back(std::vector<unsigned char>(scriptRet.begin(), scriptRet.end()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
case TX_CRYPTOCONDITION:
|
case TX_CRYPTOCONDITION:
|
||||||
return SignStepCC(creator, scriptPubKey, vSolutions, ret, consensusBranchId);
|
return SignStepCC(creator, scriptPubKey, vSolutions, ret, consensusBranchId);
|
||||||
|
|
||||||
case TX_MULTISIG:
|
case TX_MULTISIG:
|
||||||
ret.push_back(valtype()); // workaround CHECKMULTISIG bug
|
ret.push_back(valtype()); // workaround CHECKMULTISIG bug
|
||||||
return (SignN(vSolutions, creator, scriptPubKey, ret, consensusBranchId));
|
return (SignN(vSolutions, creator, scriptPubKey, ret, consensusBranchId));
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -431,13 +431,13 @@ void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const Signatur
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SignSignature(
|
bool SignSignature(
|
||||||
const CKeyStore &keystore,
|
const CKeyStore &keystore,
|
||||||
const CScript& fromPubKey,
|
const CScript& fromPubKey,
|
||||||
CMutableTransaction& txTo,
|
CMutableTransaction& txTo,
|
||||||
unsigned int nIn,
|
unsigned int nIn,
|
||||||
const CAmount& amount,
|
const CAmount& amount,
|
||||||
int nHashType,
|
int nHashType,
|
||||||
uint32_t consensusBranchId)
|
uint32_t consensusBranchId)
|
||||||
{
|
{
|
||||||
assert(nIn < txTo.vin.size());
|
assert(nIn < txTo.vin.size());
|
||||||
|
|
||||||
@@ -451,12 +451,12 @@ bool SignSignature(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SignSignature(
|
bool SignSignature(
|
||||||
const CKeyStore &keystore,
|
const CKeyStore &keystore,
|
||||||
const CTransaction& txFrom,
|
const CTransaction& txFrom,
|
||||||
CMutableTransaction& txTo,
|
CMutableTransaction& txTo,
|
||||||
unsigned int nIn,
|
unsigned int nIn,
|
||||||
int nHashType,
|
int nHashType,
|
||||||
uint32_t consensusBranchId)
|
uint32_t consensusBranchId)
|
||||||
{
|
{
|
||||||
assert(nIn < txTo.vin.size());
|
assert(nIn < txTo.vin.size());
|
||||||
CTxIn& txin = txTo.vin[nIn];
|
CTxIn& txin = txTo.vin[nIn];
|
||||||
@@ -467,8 +467,8 @@ bool SignSignature(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
|
static vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
|
||||||
const vector<valtype>& vSolutions,
|
const vector<valtype>& vSolutions,
|
||||||
const vector<valtype>& sigs1, const vector<valtype>& sigs2, uint32_t consensusBranchId)
|
const vector<valtype>& sigs1, const vector<valtype>& sigs2, uint32_t consensusBranchId)
|
||||||
{
|
{
|
||||||
// Combine all the signatures we've got:
|
// Combine all the signatures we've got:
|
||||||
set<valtype> allsigs;
|
set<valtype> allsigs;
|
||||||
@@ -523,102 +523,102 @@ static vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSi
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
struct Stacks
|
struct Stacks
|
||||||
{
|
{
|
||||||
std::vector<valtype> script;
|
std::vector<valtype> script;
|
||||||
|
|
||||||
Stacks() {}
|
Stacks() {}
|
||||||
explicit Stacks(const std::vector<valtype>& scriptSigStack_) : script(scriptSigStack_) {}
|
explicit Stacks(const std::vector<valtype>& scriptSigStack_) : script(scriptSigStack_) {}
|
||||||
explicit Stacks(const SignatureData& data, uint32_t consensusBranchId) {
|
explicit Stacks(const SignatureData& data, uint32_t consensusBranchId) {
|
||||||
EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), consensusBranchId);
|
EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), consensusBranchId);
|
||||||
}
|
}
|
||||||
|
|
||||||
SignatureData Output() const {
|
SignatureData Output() const {
|
||||||
SignatureData result;
|
SignatureData result;
|
||||||
result.scriptSig = PushAll(script);
|
result.scriptSig = PushAll(script);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
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 vector<valtype>& vSolutions,
|
||||||
Stacks sigs1, Stacks sigs2, uint32_t consensusBranchId)
|
Stacks sigs1, Stacks sigs2, uint32_t consensusBranchId)
|
||||||
{
|
{
|
||||||
switch (txType)
|
switch (txType)
|
||||||
{
|
{
|
||||||
case TX_NONSTANDARD:
|
case TX_NONSTANDARD:
|
||||||
case TX_NULL_DATA:
|
case TX_NULL_DATA:
|
||||||
// Don't know anything about this, assume bigger one is correct:
|
// Don't know anything about this, assume bigger one is correct:
|
||||||
if (sigs1.script.size() >= sigs2.script.size())
|
if (sigs1.script.size() >= sigs2.script.size())
|
||||||
return sigs1;
|
return sigs1;
|
||||||
return sigs2;
|
|
||||||
case TX_PUBKEY:
|
|
||||||
case TX_PUBKEYHASH:
|
|
||||||
case TX_CRYPTOCONDITION:
|
|
||||||
// Signatures are bigger than placeholders or empty scripts:
|
|
||||||
if (sigs1.script.empty() || sigs1.script[0].empty())
|
|
||||||
return sigs2;
|
return sigs2;
|
||||||
return sigs1;
|
case TX_PUBKEY:
|
||||||
case TX_SCRIPTHASH:
|
case TX_PUBKEYHASH:
|
||||||
if (sigs1.script.empty() || sigs1.script.back().empty())
|
case TX_CRYPTOCONDITION:
|
||||||
return sigs2;
|
// Signatures are bigger than placeholders or empty scripts:
|
||||||
else if (sigs2.script.empty() || sigs2.script.back().empty())
|
if (sigs1.script.empty() || sigs1.script[0].empty())
|
||||||
|
return sigs2;
|
||||||
return sigs1;
|
return sigs1;
|
||||||
else
|
case TX_SCRIPTHASH:
|
||||||
{
|
if (sigs1.script.empty() || sigs1.script.back().empty())
|
||||||
// Recur to combine:
|
return sigs2;
|
||||||
valtype spk = sigs1.script.back();
|
else if (sigs2.script.empty() || sigs2.script.back().empty())
|
||||||
CScript pubKey2(spk.begin(), spk.end());
|
return sigs1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Recur to combine:
|
||||||
|
valtype spk = sigs1.script.back();
|
||||||
|
CScript pubKey2(spk.begin(), spk.end());
|
||||||
|
|
||||||
txnouttype txType2;
|
txnouttype txType2;
|
||||||
vector<vector<unsigned char> > vSolutions2;
|
vector<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();
|
||||||
Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, consensusBranchId);
|
Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, consensusBranchId);
|
||||||
result.script.push_back(spk);
|
result.script.push_back(spk);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
case TX_MULTISIG:
|
case TX_MULTISIG:
|
||||||
return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, consensusBranchId));
|
return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, consensusBranchId));
|
||||||
default:
|
default:
|
||||||
return Stacks();
|
return Stacks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
|
SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
|
||||||
const SignatureData& scriptSig1, const SignatureData& scriptSig2,
|
const SignatureData& scriptSig1, const SignatureData& scriptSig2,
|
||||||
uint32_t consensusBranchId)
|
uint32_t consensusBranchId)
|
||||||
{
|
{
|
||||||
txnouttype txType;
|
txnouttype txType;
|
||||||
vector<vector<unsigned char> > vSolutions;
|
vector<vector<unsigned char> > vSolutions;
|
||||||
Solver(scriptPubKey, txType, vSolutions);
|
Solver(scriptPubKey, txType, vSolutions);
|
||||||
|
|
||||||
return CombineSignatures(
|
return CombineSignatures(
|
||||||
scriptPubKey, checker, txType, vSolutions,
|
scriptPubKey, checker, txType, vSolutions,
|
||||||
Stacks(scriptSig1, consensusBranchId),
|
Stacks(scriptSig1, consensusBranchId),
|
||||||
Stacks(scriptSig2, consensusBranchId),
|
Stacks(scriptSig2, consensusBranchId),
|
||||||
consensusBranchId).Output();
|
consensusBranchId).Output();
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
/** Dummy signature checker which accepts all signatures. */
|
/** Dummy signature checker which accepts all signatures. */
|
||||||
class DummySignatureChecker : public BaseSignatureChecker
|
class DummySignatureChecker : public BaseSignatureChecker
|
||||||
{
|
|
||||||
public:
|
|
||||||
DummySignatureChecker() {}
|
|
||||||
|
|
||||||
bool CheckSig(
|
|
||||||
const std::vector<unsigned char>& scriptSig,
|
|
||||||
const std::vector<unsigned char>& vchPubKey,
|
|
||||||
const CScript& scriptCode,
|
|
||||||
uint32_t consensusBranchId) const
|
|
||||||
{
|
{
|
||||||
return true;
|
public:
|
||||||
}
|
DummySignatureChecker() {}
|
||||||
};
|
|
||||||
const DummySignatureChecker dummyChecker;
|
bool CheckSig(
|
||||||
|
const std::vector<unsigned char>& scriptSig,
|
||||||
|
const std::vector<unsigned char>& vchPubKey,
|
||||||
|
const CScript& scriptCode,
|
||||||
|
uint32_t consensusBranchId) const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const DummySignatureChecker dummyChecker;
|
||||||
}
|
}
|
||||||
|
|
||||||
const BaseSignatureChecker& DummySignatureCreator::Checker() const
|
const BaseSignatureChecker& DummySignatureCreator::Checker() const
|
||||||
@@ -627,12 +627,12 @@ const BaseSignatureChecker& DummySignatureCreator::Checker() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool DummySignatureCreator::CreateSig(
|
bool DummySignatureCreator::CreateSig(
|
||||||
std::vector<unsigned char>& vchSig,
|
std::vector<unsigned char>& vchSig,
|
||||||
const CKeyID& keyid,
|
const CKeyID& keyid,
|
||||||
const CScript& scriptCode,
|
const CScript& scriptCode,
|
||||||
uint32_t consensusBranchId,
|
uint32_t consensusBranchId,
|
||||||
CKey *key,
|
CKey *key,
|
||||||
void *extraData) const
|
void *extraData) const
|
||||||
{
|
{
|
||||||
// Create a dummy signature that is a valid DER-encoding
|
// Create a dummy signature that is a valid DER-encoding
|
||||||
vchSig.assign(72, '\000');
|
vchSig.assign(72, '\000');
|
||||||
@@ -647,3 +647,4 @@ bool DummySignatureCreator::CreateSig(
|
|||||||
vchSig[6 + 33 + 32] = SIGHASH_ALL;
|
vchSig[6 + 33 + 32] = SIGHASH_ALL;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user