if (5 + nLenR >= vchSig.size())
return error("Non-canonical signature: S length misplaced");
unsigned int nLenS = vchSig[5+nLenR];
- if ((unsigned long)(nLenR + nLenS + (fWithHashType ? 7 : 6)) != vchSig.size())
+ if ((nLenR + nLenS + (fWithHashType ? 7 : 6)) != vchSig.size())
return error("Non-canonical signature: R+S length mismatch");
const unsigned char *R = &vchSig[4];
// Standard tx, sender provides pubkey, receiver adds signature
mTemplates.insert(make_pair(TX_PUBKEY, CScript() << OP_PUBKEY << OP_CHECKSIG));
- if (GetTime() > SMALLDATA_SWITCH_TIME)
+ if (fTestNet || GetTime() > SMALLDATA_SWITCH_TIME)
{
// Malleable pubkey tx hack, sender provides generated pubkey combined with R parameter. The R parameter is dropped before checking a signature.
mTemplates.insert(make_pair(TX_PUBKEY_DROP, CScript() << OP_PUBKEY << OP_PUBKEY << OP_DROP << OP_CHECKSIG));
case TX_PUBKEY_DROP:
{
CPubKey key = CPubKey(vSolutions[0]);
- if (keystore.HaveKey(key.GetID()))
+ CPubKey R = CPubKey(vSolutions[1]);
+ if (keystore.CheckOwnership(key, R))
return MINE_SPENDABLE;
- else
- {
- CPubKey R = CPubKey(vSolutions[1]);
- if (keystore.CheckOwnership(key, R))
- return MINE_SPENDABLE;
- }
}
break;
case TX_PUBKEYHASH:
if (!Solver(scriptPubKey, whichType, vSolutions))
return false;
- if (whichType == TX_PUBKEY || whichType == TX_PUBKEY_DROP)
+ if (whichType == TX_PUBKEY)
{
addressRet = CPubKey(vSolutions[0]).GetID();
return true;
if (!Solver(scriptPubKey, typeRet, vSolutions))
return false;
if (typeRet == TX_NULL_DATA)
+ {
+ nRequiredRet = 0;
return true;
+ }
if (typeRet == TX_MULTISIG)
{
else
{
nRequiredRet = 1;
+ if (typeRet == TX_PUBKEY_DROP)
+ return true;
CTxDestination address;
if (!ExtractDestination(scriptPubKey, address))
return false;
boost::apply_visitor(CScriptVisitor(this), dest);
}
+void CScript::SetDestination(const CPubKey& R, CPubKey& pubKeyVariant)
+{
+ this->clear();
+ *this << pubKeyVariant << R << OP_DROP << OP_CHECKSIG;
+}
+
+
void CScript::SetMultisig(int nRequired, const std::vector<CKey>& keys)
{
this->clear();