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"),
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
if (state.PerformPourVerification()) {
BOOST_FOREACH(const CPourTx &pour, tx.vpour) {
// TODO: #808
uint256 pubKeyHash;
uint256 pubKeyHash = tx.joinSplitPubKey.GetZcashHash();
if (!pour.Verify(*pzcashParams, pubKeyHash)) {
return state.DoS(100, error("CheckTransaction(): pour does not verify"),
REJECT_INVALID, "bad-txns-pour-verification-failed");

View File

@ -251,13 +251,12 @@ public:
return hash;
}
// TODO: implement this to verify the shorter kind of signature
// 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)
bool Verify(const uint256& hash, const std::vector<unsigned char>& vchSig) const
{
// TODO implement signature verification.
return false;
// TODO: make sure to check the s < 0xffff.... value thing etc.
// 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.
//
::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)
{
static const uint256 one(uint256S("0000000000000000000000000000000000000000000000000000000000000001"));
if (nIn >= txTo.vin.size()) {
if (nIn >= txTo.vin.size() && nIn != NOT_AN_INPUT) {
// nIn out of range
return one;
}

View File

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