diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -486,7 +486,7 @@ tx.vout.erase(tx.vout.begin() + outIdx); } -static const unsigned int N_SIGHASH_OPTS = 6; +static const unsigned int N_SIGHASH_OPTS = 12; static const struct { const char *flagStr; int flags; @@ -497,6 +497,15 @@ {"ALL|ANYONECANPAY", SIGHASH_ALL | SIGHASH_ANYONECANPAY}, {"NONE|ANYONECANPAY", SIGHASH_NONE | SIGHASH_ANYONECANPAY}, {"SINGLE|ANYONECANPAY", SIGHASH_SINGLE | SIGHASH_ANYONECANPAY}, + {"ALL|FORKID", SIGHASH_ALL | SIGHASH_FORKID}, + {"NONE|FORKID", SIGHASH_NONE | SIGHASH_FORKID}, + {"SINGLE|FORKID", SIGHASH_SINGLE | SIGHASH_FORKID}, + {"ALL|FORKID|ANYONECANPAY", + SIGHASH_ALL | SIGHASH_FORKID | SIGHASH_ANYONECANPAY}, + {"NONE|FORKID|ANYONECANPAY", + SIGHASH_NONE | SIGHASH_FORKID | SIGHASH_ANYONECANPAY}, + {"SINGLE|FORKID|ANYONECANPAY", + SIGHASH_SINGLE | SIGHASH_FORKID | SIGHASH_ANYONECANPAY}, }; static bool findSighashFlags(int &flags, const std::string &flagStr) { @@ -548,7 +557,7 @@ } static void MutateTxSign(CMutableTransaction &tx, const std::string &flagStr) { - int nHashType = SIGHASH_ALL; + int nHashType = SIGHASH_ALL | SIGHASH_FORKID; if ((flagStr.size() > 0) && !findSighashFlags(nHashType, flagStr)) { throw std::runtime_error("unknown sighash flag/sign option"); @@ -651,7 +660,9 @@ const CKeyStore &keystore = tempKeystore; - bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE); + bool fHashSingle = + ((nHashType & ~(SIGHASH_ANYONECANPAY | SIGHASH_FORKID)) == + SIGHASH_SINGLE); // Sign what we can: for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { @@ -684,7 +695,8 @@ UpdateTransaction(mergedTx, i, sigdata); if (!VerifyScript( - txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, + txin.scriptSig, prevPubKey, + STANDARD_SCRIPT_VERIFY_FLAGS | SCRIPT_ENABLE_SIGHASH_FORKID, MutableTransactionSignatureChecker(&mergedTx, i, amount))) { fComplete = false; }