From 02c68a7b8c631c58b7507f1f8a0fcbf840dd6536 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 22 Jul 2018 12:34:05 -1100 Subject: [PATCH] Faucet --- src/cc/CCinclude.h | 1 + src/cc/CCutils.cpp | 30 ++++++++++++++++++++++-- src/cc/assets.cpp | 18 +------------- src/cc/eval.cpp | 3 +-- src/cc/faucet.cpp | 58 +++++++++++++++------------------------------- 5 files changed, 50 insertions(+), 60 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 7793622b7..b36002e71 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -48,6 +48,7 @@ char *uint256_str(char *dest,uint256 txid); uint256 Parseuint256(char *hexstr); CPubKey pubkey2pk(std::vector pubkey); bool ConstrainVout(CTxOut vout,int32_t CCflag,char *cmpaddr,uint64_t nValue); +bool PreventCC(const CTransaction &tx,int32_t preventCCvins,int32_t numvins,int32_t preventCCvouts,int32_t numvouts); bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey); std::vector Mypubkey(); bool Myprivkey(uint8_t myprivkey[]); diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index b641b8813..50e2fd26b 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -56,8 +56,12 @@ char *uint256_str(char *dest,uint256 txid) uint256 Parseuint256(char *hexstr) { uint256 txid; int32_t i; std::vector txidbytes(ParseHex(hexstr)); - for (i=31; i>=0; i--) - ((uint8_t *)&txid)[31-i] = ((uint8_t *)txidbytes.data())[i]; + memset(&txid,0,sizeof(txid)); + if ( strlen(hexstr) == 64 ) + { + for (i=31; i>=0; i--) + ((uint8_t *)&txid)[31-i] = ((uint8_t *)txidbytes.data())[i]; + } return(txid); } @@ -96,6 +100,28 @@ bool ConstrainVout(CTxOut vout,int32_t CCflag,char *cmpaddr,uint64_t nValue) else return(true); } +bool PreventCC(const CTransaction &tx,int32_t preventCCvins,int32_t numvins,int32_t preventCCvouts,int32_t numvouts) +{ + int32_t i; + if ( preventCCvins >= 0 ) + { + for (i=preventCCvins; iInvalid("invalid CC vin"); + } + } + if ( preventCCvouts >= 0 ) + { + for (i=preventCCvouts; iInvalid("invalid CC vout"); + } + } + return(true); +} + std::vector Mypubkey() { extern uint8_t NOTARY_PUBKEY33[33]; diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index 2d5f8a735..d1cc23edf 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -301,23 +301,7 @@ bool AssetValidate(Eval* eval,const CTransaction &tx,int32_t numvouts,uint8_t fu fprintf(stderr,"fill validated\n"); break; } - if ( preventCCvins >= 0 ) - { - for (i=preventCCvins; iInvalid("invalid CC vin"); - } - } - if ( preventCCvouts >= 0 ) - { - for (i=preventCCvouts; iInvalid("invalid CC vout"); - } - } - return(true); + return(PreventCC(tx,preventCCvins,numvins,preventCCvouts,numvouts)); } bool ProcessAssets(Eval* eval, std::vector paramsNull,const CTransaction &ctx, unsigned int nIn) diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 60d87361f..91a507030 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -88,6 +88,7 @@ bool Eval::GetSpendsConfirmed(uint256 hash, std::vector &spends) c bool Eval::GetTxUnconfirmed(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock) const { bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock); + // there is a LOCK(cs_main) in the normal GetTransaction(), which leads to deadlocks //bool fAllowSlow = false; // Don't allow slow //return GetTransaction(hash, txOut, hashBlock, fAllowSlow); return myGetTransaction(hash, txOut,hashBlock); @@ -110,7 +111,6 @@ unsigned int Eval::GetCurrentHeight() const return chainActive.Height(); } - bool Eval::GetBlock(uint256 hash, CBlockIndex& blockIdx) const { auto r = mapBlockIndex.find(hash); @@ -122,7 +122,6 @@ bool Eval::GetBlock(uint256 hash, CBlockIndex& blockIdx) const return false; } - extern int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 3f616f221..72102f558 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -43,18 +43,20 @@ CTxOut MakeFaucetVout(CAmount nValue,CPubKey pk) return(vout); } -uint64_t IsFaucetvout(uint64_t &price,std::vector &origpubkey,CTransaction& tx,int32_t v,uint256 refassetid) +uint64_t IsFaucetvout(const CTransaction& tx,int32_t v) { + char destaddr[64]; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) - return(tx.vout[v].nValue); + { + if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,FaucetCCaddr) == 0 ) + return(tx.vout[v].nValue); + } return(0); } -#ifdef notyet - -bool FaucetExactAmounts(Eval* eval,CTransaction &tx,uint256 assetid) +bool FaucetExactAmounts(Eval* eval,const CTransaction &tx) { - CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; std::vector tmporigpubkey; uint64_t tmpprice; + CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; numvins = tx.vin.size(); numvouts = tx.vout.size(); for (i=1; iGetTxUnconfirmed(tx.vin[i].prevout.hash,vinTx,hashBlock) == 0 ) return eval->Invalid("always should find vin, but didnt"); - else if ( (assetoshis= IsFaucetvout(tmpprice,tmporigpubkey,vinTx,tx.vin[i].prevout.n,assetid)) != 0 ) + else if ( (assetoshis= IsFaucetvout(vinTx,tx.vin[i].prevout.n)) != 0 ) inputs += assetoshis; } } for (i=0; i tmporigpubkey,ignorepubkey; char destaddr[64],origaddr[64],CCaddr[64]; - fprintf(stderr,"FaucetValidate (%c)\n",funcid); + int32_t numvins,numvouts,preventCCvins,preventCCvouts; + fprintf(stderr,"FaucetValidate\n"); numvins = tx.vin.size(); + numvouts = tx.vout.size(); outputs = inputs = 0; preventCCvins = preventCCvouts = -1; if ( IsCCInput(tx.vin[0].scriptSig) != 0 ) return eval->Invalid("illegal asset vin0"); else if ( numvouts < 1 ) return eval->Invalid("no vouts"); - else if ( funcid != 'c' ) - { - if ( assetid == zero ) - return eval->Invalid("illegal assetid"); - else if ( FaucetExactAmounts(eval,tx,assetid) == false ) - eval->Invalid("asset inputs != outputs"); - } - if ( preventCCvins >= 0 ) - { - for (i=preventCCvins; iInvalid("invalid CC vin"); - } - } - if ( preventCCvouts >= 0 ) - { - for (i=preventCCvouts; iInvalid("invalid CC vout"); - } - } - return(true); + else if ( FaucetExactAmounts(eval,tx) == false ) + eval->Invalid("asset inputs != outputs"); + else return(PreventCC(tx,preventCCvins,numvins,preventCCvouts,numvouts)); } bool ProcessFaucet(Eval* eval, std::vector paramsNull,const CTransaction &ctx, unsigned int nIn) @@ -121,12 +102,11 @@ bool ProcessFaucet(Eval* eval, std::vector paramsNull,const CTransactio txid = ctx.GetHash(); if ( txid == prevtxid ) return(true); - CTransaction tx = *(CTransaction *)&ctx; if ( paramsNull.size() != 0 ) // Don't expect params return eval->Invalid("Cannot have params"); - else if ( tx.vout.size() == 0 ) + else if ( ctx.vout.size() == 0 ) return eval->Invalid("no-vouts"); - if ( FaucetValidate(eval,tx,n) != 0 ) + if ( FaucetValidate(eval,ctx,n) != 0 ) { prevtxid = txid; return(true);