From 691b8708f1bbbab2df2163ad17d9d0b6a2abb67f Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Wed, 21 Feb 2018 19:28:52 -0300 Subject: [PATCH] Komodo CC aux callback has access to transaction via checker --- src/Makefile.am | 2 ++ src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 8 ++++++++ src/komodo_cryptoconditions.h | 7 ------- src/script/interpreter.cpp | 32 ++++++++++++++++++++------------ src/script/interpreter.h | 14 ++++++++++---- 6 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 src/komodo_cryptoconditions.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 815d75d4c..4ec21614d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -336,6 +336,7 @@ libbitcoin_common_a_SOURCES = \ script/script_error.cpp \ script/sign.cpp \ script/standard.cpp \ + komodo_cryptoconditions.cpp \ $(BITCOIN_CORE_H) \ $(LIBZCASH_H) @@ -505,6 +506,7 @@ libzcashconsensus_la_SOURCES = \ script/zcashconsensus.cpp \ script/interpreter.cpp \ script/script.cpp \ + komodo_cryptoconditions.cpp \ uint256.cpp \ utilstrencodings.cpp diff --git a/src/cryptoconditions b/src/cryptoconditions index 6b859e63a..e33203ae3 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 6b859e63a2bce5107f9b888823f2709a13dd3c26 +Subproject commit e33203ae3430d2682a4eb734ceaf63791eb0eb6d diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp new file mode 100644 index 000000000..a7fcf9f99 --- /dev/null +++ b/src/komodo_cryptoconditions.cpp @@ -0,0 +1,8 @@ + +#include "cryptoconditions/include/cryptoconditions.h" +#include "script/interpreter.h" + + +int CryptoConditionChecker::CheckAuxCondition(const CC *cond) const { + return true; +} diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index 3cfc15e12..42cf3b077 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -9,11 +9,4 @@ static bool IsCryptoConditionsEnabled() { return 0 != ASSETCHAINS_CC; } -/* - * Method stub for aux conditions. Unimplemented, thus fails if an aux condition is encountered. - */ -static int komodoCCAux(CC *cond, void *context) { - return 0; -} - #endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 1e5c7ec79..689dcf204 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -949,18 +949,15 @@ bool EvalScript(vector >& stack, const CScript& script, un valtype& vchFulfillment = stacktop(-2); valtype& vchCondition = stacktop(-1); - char *fulfillmentBin = (char*) vchFulfillment.data(); - CC *cond = cc_readFulfillmentBinary(fulfillmentBin, vchFulfillment.size()); + CC *cond = cc_readFulfillmentBinary((unsigned char*)vchFulfillment.data(), + vchFulfillment.size()); if (!cond) { return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); } - char *condBin = (char*) &vchCondition[0]; - // TODO: Should nHashType be hardcoded? - // Other types use the last byte of the signature - char *msg = (char*) checker.GetMessage(script, SIGHASH_ALL).begin(); + bool fSuccess = checker.CheckCryptoCondition(cond, vchCondition, script); - bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size(), komodoCCAux, NULL); + cc_free(cond); popstack(stack); popstack(stack); @@ -1155,6 +1152,22 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn return true; } +extern "C" +{ + static int komodoCCAux(CC *cond, void *transactionSignatureChecker); +} + +static int komodoCCAux(CC *cond, void *checker) { + return ((CryptoConditionChecker*)checker)->CheckAuxCondition(cond); +} + +bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const +{ + uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); + return cc_verify(cond, (const unsigned char*)&message, 32, + condBin.data(), condBin.size(), komodoCCAux, (void*)this); +} + bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) const { // There are two times of nLockTime: lock-by-blockheight @@ -1191,11 +1204,6 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con return true; } -uint256 TransactionSignatureChecker::GetMessage(const CScript& scriptCode, int nHashType) const -{ - return SignatureHash(scriptCode, *txTo, nIn, nHashType); -} - bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) { diff --git a/src/script/interpreter.h b/src/script/interpreter.h index fad2d9a91..90c50eff6 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -8,6 +8,7 @@ #include "script_error.h" #include "primitives/transaction.h" +#include "komodo_cryptoconditions.h" #include #include @@ -102,10 +103,9 @@ public: return false; } - virtual uint256 GetMessage(const CScript& scriptCode, int nHashType) const + virtual bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const { - uint256 blob; - return blob; + return false; } virtual ~BaseSignatureChecker() {} @@ -124,7 +124,7 @@ public: TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; - uint256 GetMessage(const CScript& scriptCode, int nHashType) const; + bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker @@ -139,4 +139,10 @@ public: bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); +class CryptoConditionChecker : public TransactionSignatureChecker +{ +public: + int CheckAuxCondition(const CC *cond) const; +}; + #endif // BITCOIN_SCRIPT_INTERPRETER_H