Implement signature verification in CheckTransaction
This commit is contained in:
19
src/main.cpp
19
src/main.cpp
@@ -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");
|
||||||
|
|||||||
11
src/pubkey.h
11
src/pubkey.h
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user