Implement signature verification in CheckTransaction

This commit is contained in:
Taylor Hornby
2016-05-26 16:31:18 -06:00
parent ed6c1b5d15
commit a138f81404
4 changed files with 26 additions and 12 deletions

View File

@@ -956,13 +956,26 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state)
return state.DoS(10, error("CheckTransaction(): prevout is null"), return state.DoS(10, error("CheckTransaction(): prevout is null"),
REJECT_INVALID, "bad-txns-prevout-null"); REJECT_INVALID, "bad-txns-prevout-null");
// TODO: #966.
if (tx.vpour.size() > 0) {
static const uint256 one(uint256S("0000000000000000000000000000000000000000000000000000000000000001"));
// Empty output script.
CScript scriptCode;
uint256 dataToBeSigned = SignatureHash(scriptCode, tx, NOT_AN_INPUT, SIGHASH_ALL);
if (dataToBeSigned == one) {
return state.DoS(100, error("CheckTransaction(): error computing signature hash"),
REJECT_INVALID, "error-computing-signature-hash");
}
// Add the signature
tx.joinSplitPubKey.Verify(dataToBeSigned, tx.joinSplitSig);
}
// Ensure that zk-SNARKs verify // Ensure that zk-SNARKs verify
if (state.PerformPourVerification()) { if (state.PerformPourVerification()) {
BOOST_FOREACH(const CPourTx &pour, tx.vpour) { BOOST_FOREACH(const CPourTx &pour, tx.vpour) {
// TODO: #808 uint256 pubKeyHash = tx.joinSplitPubKey.GetZcashHash();
uint256 pubKeyHash;
if (!pour.Verify(*pzcashParams, pubKeyHash)) { if (!pour.Verify(*pzcashParams, pubKeyHash)) {
return state.DoS(100, error("CheckTransaction(): pour does not verify"), return state.DoS(100, error("CheckTransaction(): pour does not verify"),
REJECT_INVALID, "bad-txns-pour-verification-failed"); REJECT_INVALID, "bad-txns-pour-verification-failed");

View File

@@ -251,13 +251,12 @@ public:
return hash; return hash;
} }
// TODO: implement this to verify the shorter kind of signature bool Verify(const uint256& hash, const std::vector<unsigned char>& vchSig) const
// TODO: make sure to check the s value thing etc.
// TODO: this used to have "const" at the end, what does that mean??
bool Verify(const uint256& hash, const std::vector<unsigned char>& vchSig)
{ {
// TODO implement signature verification. // TODO: make sure to check the s < 0xffff.... value thing etc.
return false; // TODO: use compact signatures (maybe just use the secp256k1 API
// instead of these classes).
return pubKey.Verify(hash, vchSig);
} }
}; };

View File

@@ -1083,7 +1083,9 @@ public:
// to the transaction. // to the transaction.
// //
::Serialize(s, txTo.vpour, nType, nVersion); ::Serialize(s, txTo.vpour, nType, nVersion);
::Serialize(s, txTo.joinSplitPubKey, nType, nVersion); if (txTo.vpour.size() > 0) {
::Serialize(s, txTo.joinSplitPubKey, nType, nVersion);
}
} }
} }
}; };
@@ -1093,7 +1095,7 @@ public:
uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType) uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType)
{ {
static const uint256 one(uint256S("0000000000000000000000000000000000000000000000000000000000000001")); static const uint256 one(uint256S("0000000000000000000000000000000000000000000000000000000000000001"));
if (nIn >= txTo.vin.size()) { if (nIn >= txTo.vin.size() && nIn != NOT_AN_INPUT) {
// nIn out of range // nIn out of range
return one; return one;
} }

View File

@@ -2682,7 +2682,7 @@ Value zc_raw_pour(const json_spirit::Array& params, bool fHelp)
} }
// Add the signature // Add the signature
joinSplitPrivKey.SignCompact(dataToBeSigned, mtx.joinSplitSig); joinSplitPrivKey.Sign(dataToBeSigned, mtx.joinSplitSig);
CTransaction rawTx(mtx); CTransaction rawTx(mtx);