From 9d5d781a15162f3a146da01e2d01940e0e9ba82f Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Fri, 4 Mar 2022 21:36:24 +0000 Subject: [PATCH] libzcash_script: Add more granular errors to the new APIs --- src/script/zcash_script.cpp | 42 +++++++++++++++++++++++-------------- src/script/zcash_script.h | 1 + 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/script/zcash_script.cpp b/src/script/zcash_script.cpp index ff71289a8..edd457d55 100644 --- a/src/script/zcash_script.cpp +++ b/src/script/zcash_script.cpp @@ -134,30 +134,30 @@ void* zcash_script_new_precomputed_tx_v5( unsigned int allPrevOutputsLen, zcash_script_error* err) { + CTransaction tx; try { TxInputStream stream(SER_NETWORK, PROTOCOL_VERSION, txTo, txToLen); - CTransaction tx; stream >> tx; if (GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) != txToLen) { set_error(err, zcash_script_ERR_TX_SIZE_MISMATCH); return nullptr; } - - try { - auto preTx = new PrecomputedTransaction(tx, allPrevOutputs, allPrevOutputsLen); - // Deserializing the tx did not error. - set_error(err, zcash_script_ERR_OK); - return preTx; - } catch (const std::exception&) { - // We had some error when parsing allPrevOutputs inside the - // PrecomputedTransactionData constructor. - set_error(err, zcash_script_ERR_ALL_PREV_OUTPUTS_DESERIALIZE); - return nullptr; - } } catch (const std::exception&) { set_error(err, zcash_script_ERR_TX_DESERIALIZE); // Error deserializing return nullptr; } + + try { + auto preTx = new PrecomputedTransaction(tx, allPrevOutputs, allPrevOutputsLen); + // Deserializing the tx did not error. + set_error(err, zcash_script_ERR_OK); + return preTx; + } catch (const std::exception&) { + // We had some error when parsing allPrevOutputs inside the + // PrecomputedTransactionData constructor. + set_error(err, zcash_script_ERR_ALL_PREV_OUTPUTS_DESERIALIZE); + return nullptr; + } } void zcash_script_free_precomputed_tx(void* pre_preTx) @@ -239,15 +239,20 @@ int zcash_script_verify_v5( uint32_t consensusBranchId, zcash_script_error* err) { + CTransaction tx; try { TxInputStream stream(SER_NETWORK, PROTOCOL_VERSION, txTo, txToLen); - CTransaction tx; stream >> tx; if (nIn >= tx.vin.size()) return set_error(err, zcash_script_ERR_TX_INDEX); if (GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION) != txToLen) return set_error(err, zcash_script_ERR_TX_SIZE_MISMATCH); + } catch (const std::exception&) { + return set_error(err, zcash_script_ERR_TX_DESERIALIZE); // Error deserializing + } + std::vector prevOutputs; + try { // TODO: we can swap this second deserialization for an FFI call by // fetching this through PrecomputedTransactionData. Simplicity for now. CDataStream sAllPrevOutputs( @@ -255,12 +260,17 @@ int zcash_script_verify_v5( reinterpret_cast(allPrevOutputs + allPrevOutputsLen), SER_NETWORK, PROTOCOL_VERSION); - std::vector prevOutputs; sAllPrevOutputs >> prevOutputs; if (!(tx.IsCoinBase() ? prevOutputs.empty() : tx.vin.size() == prevOutputs.size())) { return set_error(err, zcash_script_ERR_ALL_PREV_OUTPUTS_SIZE_MISMATCH); } + } catch (const std::exception&) { + // We had some error when parsing allPrevOutputs inside the + // PrecomputedTransactionData constructor. + return set_error(err, zcash_script_ERR_ALL_PREV_OUTPUTS_DESERIALIZE); + } + try { // Regardless of the verification result, the tx did not error. set_error(err, zcash_script_ERR_OK); PrecomputedTransactionData txdata(tx, allPrevOutputs, allPrevOutputsLen); @@ -272,7 +282,7 @@ int zcash_script_verify_v5( consensusBranchId, NULL); } catch (const std::exception&) { - return set_error(err, zcash_script_ERR_TX_DESERIALIZE); // Error deserializing + return set_error(err, zcash_script_ERR_VERIFY_SCRIPT); // Error during script verification } } diff --git a/src/script/zcash_script.h b/src/script/zcash_script.h index dd6bc4997..51ed657ea 100644 --- a/src/script/zcash_script.h +++ b/src/script/zcash_script.h @@ -45,6 +45,7 @@ typedef enum zcash_script_error_t zcash_script_ERR_TX_VERSION, zcash_script_ERR_ALL_PREV_OUTPUTS_SIZE_MISMATCH, zcash_script_ERR_ALL_PREV_OUTPUTS_DESERIALIZE, + zcash_script_ERR_VERIFY_SCRIPT, } zcash_script_error; /** Script verification flags */