struct CC_info

This commit is contained in:
jl777
2019-01-19 23:12:28 -11:00
parent 607f47588b
commit 4223d927ad
2 changed files with 678 additions and 677 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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;
} }