small refactor

This commit is contained in:
Scott Sadler
2018-03-09 09:40:31 -03:00
parent 1fe68cf52a
commit 346eb4ae25
3 changed files with 47 additions and 39 deletions

View File

@@ -2,26 +2,15 @@
#include "replacementpool.h" #include "replacementpool.h"
#include "komodo_cryptoconditions.h" #include "komodo_cryptoconditions.h"
#include "cryptoconditions/include/cryptoconditions.h" #include "cryptoconditions/include/cryptoconditions.h"
#include "script/interpreter.h"
#include "coins.h"
#define REPLACEMENT_WINDOW_BLOCKS 2 #define REPLACEMENT_WINDOW_BLOCKS 2
bool GetOpReturnData(const CScript &sig, std::vector<unsigned char> &data) /*
{ * Evaluate the validity of an Eval node
auto pc = sig.begin(); */
opcodetype opcode; bool EvalConditionValidity(const CC *cond, const CTransaction *txTo)
if (sig.GetOp(pc, opcode))
if (opcode == OP_RETURN)
if (sig.GetOp(pc, opcode, data))
return opcode > OP_0 && opcode <= OP_PUSHDATA4;
return false;
}
bool EvalConditionBool(const CC *cond, const CTransaction *txTo)
{ {
if (strcmp(cond->method, "testEval") == 0) { if (strcmp(cond->method, "testEval") == 0) {
return cond->paramsBinLength == 8 && return cond->paramsBinLength == 8 &&
@@ -35,7 +24,16 @@ bool EvalConditionBool(const CC *cond, const CTransaction *txTo)
} }
bool GetConditionPriority(const CC *cond, CTxReplacementPoolItem *rep) /*
* Evaluate the priority of an eval node.
*
* This method should set the ->priority and ->replacementWindow (in blocks)
* of the provided replacement pool item. Priority is a 64 bit unsigned int and
* 0 is invalid.
*
* This method does not need to validate, that is done separately.
*/
bool EvalConditionPriority(const CC *cond, CTxReplacementPoolItem *rep)
{ {
if (strcmp((const char*)cond->method, "testReplace") == 0) { if (strcmp((const char*)cond->method, "testReplace") == 0) {
std::vector<unsigned char> data; std::vector<unsigned char> data;
@@ -49,30 +47,18 @@ bool GetConditionPriority(const CC *cond, CTxReplacementPoolItem *rep)
} }
bool TransactionSignatureChecker::CheckEvalCondition(const CC *cond) const
{
return EvalConditionBool(cond, txTo);
}
extern "C"
{
int visitConditionPriority(CC *cond, struct CCVisitor visitor);
}
int visitConditionPriority(CC *cond, struct CCVisitor visitor) int visitConditionPriority(CC *cond, struct CCVisitor visitor)
{ {
if (cc_typeId(cond) == CC_Eval) { auto rep = (CTxReplacementPoolItem*)visitor.context;
if (GetConditionPriority(cond, (CTxReplacementPoolItem*)visitor.context)) { // visitor protocol is 1 for continue, 0 for stop
return 0; // stop return !(cc_typeId(cond) == CC_Eval && EvalConditionPriority(cond, rep));
}
}
return 1; // continue
} }
bool SetReplacementParams(CTxReplacementPoolItem &rep) /*
* Try to get replacement parameters from a transaction in &rep.
*/
bool PutReplacementParams(CTxReplacementPoolItem &rep)
{ {
// first, see if we have a cryptocondition // first, see if we have a cryptocondition
const CScript &sig = rep.tx.vin[0].scriptSig; const CScript &sig = rep.tx.vin[0].scriptSig;
@@ -82,6 +68,7 @@ bool SetReplacementParams(CTxReplacementPoolItem &rep)
opcodetype opcode; opcodetype opcode;
if (!sig.GetOp(pc, opcode, data)) return false; if (!sig.GetOp(pc, opcode, data)) return false;
CC *cond = cc_readFulfillmentBinary((unsigned char*)data.data(), data.size()); CC *cond = cc_readFulfillmentBinary((unsigned char*)data.data(), data.size());
auto wat = {1, ""};
if (!cond) return false; if (!cond) return false;
// now, see if it has a replacement node // now, see if it has a replacement node
@@ -91,3 +78,15 @@ bool SetReplacementParams(CTxReplacementPoolItem &rep)
cc_free(cond); cc_free(cond);
return !out; return !out;
} }
bool GetOpReturnData(const CScript &sig, std::vector<unsigned char> &data)
{
auto pc = sig.begin();
opcodetype opcode;
if (sig.GetOp(pc, opcode))
if (opcode == OP_RETURN)
if (sig.GetOp(pc, opcode, data))
return opcode > OP_0 && opcode <= OP_PUSHDATA4;
return false;
}

View File

@@ -3,6 +3,8 @@
#include "replacementpool.h" #include "replacementpool.h"
#include "cryptoconditions/include/cryptoconditions.h" #include "cryptoconditions/include/cryptoconditions.h"
#include "script/script.h"
extern int32_t ASSETCHAINS_CC; extern int32_t ASSETCHAINS_CC;
@@ -12,8 +14,10 @@ static bool IsCryptoConditionsEnabled() {
extern CTxReplacementPool replacementPool; extern CTxReplacementPool replacementPool;
bool EvalConditionBool(const CC *cond, const CTransaction *tx); bool EvalConditionValidity(const CC *cond, const CTransaction *tx);
bool SetReplacementParams(CTxReplacementPoolItem &rep); bool SetReplacementParams(CTxReplacementPoolItem &rep);
bool GetOpReturnData(const CScript &sig, std::vector<unsigned char> &data);
#endif /* KOMODO_CRYPTOCONDITIONS_H */ #endif /* KOMODO_CRYPTOCONDITIONS_H */

View File

@@ -1152,15 +1152,19 @@ bool TransactionSignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn
return true; return true;
} }
extern "C"
bool TransactionSignatureChecker::CheckEvalCondition(const CC *cond) const
{ {
static int komodoCCEval(CC *cond, void *transactionSignatureChecker); return EvalConditionValidity(cond, txTo);
} }
static int komodoCCEval(CC *cond, void *checker) {
static int komodoCCEval(CC *cond, void *checker)
{
return ((TransactionSignatureChecker*)checker)->CheckEvalCondition(cond); return ((TransactionSignatureChecker*)checker)->CheckEvalCondition(cond);
} }
bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector<unsigned char>& condBin, const CScript& scriptCode) const bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector<unsigned char>& condBin, const CScript& scriptCode) const
{ {
uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL);
@@ -1168,6 +1172,7 @@ bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std
condBin.data(), condBin.size(), komodoCCEval, (void*)this); condBin.data(), condBin.size(), komodoCCEval, (void*)this);
} }
bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) const bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) const
{ {
// There are two times of nLockTime: lock-by-blockheight // There are two times of nLockTime: lock-by-blockheight