diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index e293d6926..6180cd12b 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -91,7 +91,7 @@ void WaitForShutdown(boost::thread_group* threadGroup) //fprintf(stderr,"call passport iteration\n"); if ( ASSETCHAINS_SYMBOL[0] == 0 ) { - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) komodo_passport_iteration(); for (i=0; i<10; i++) { diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index d26b4b7ad..1ee338628 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -56,7 +56,7 @@ one other technical note is that komodod has the insight-explorer extensions bui #define CC_BURNPUBKEY "02deaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddeaddead" #define CC_MAXVINS 1024 -#define CC_REQUIREMENTS_MSG (KOMODO_NSPV!=0?"to use CC contracts you need to nspv_login first\n":"to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n") +#define CC_REQUIREMENTS_MSG (KOMODO_NSPV_SUPERLITE?"to use CC contracts you need to nspv_login first\n":"to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n") #define SMALLVAL 0.000000000000001 #define SATOSHIDEN ((uint64_t)100000000L) @@ -292,6 +292,7 @@ extern std::vector NULL_pubkeys; std::string FinalizeCCTx(uint64_t skipmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret,std::vector pubkeys = NULL_pubkeys); void SetCCunspents(std::vector > &unspentOutputs,char *coinaddr,bool CCflag = true); void SetCCtxids(std::vector > &addressIndex,char *coinaddr,bool CCflag = true); +void SetCCtxids_NSPV(std::vector > &addressIndex,char *coinaddr,bool ccflag, uint8_t evalcode, uint256 filtertxid); int64_t NSPV_AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs,struct NSPV_CCmtxinfo *ptr); int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs); int64_t AddNormalinputs2(CMutableTransaction &mtx,int64_t total,int32_t maxinputs); diff --git a/src/cc/CCtokens.cpp b/src/cc/CCtokens.cpp index 07b9efbb1..9627e4547 100644 --- a/src/cc/CCtokens.cpp +++ b/src/cc/CCtokens.cpp @@ -957,7 +957,7 @@ UniValue TokenInfo(uint256 tokenid) result.push_back(Pair("error", "cant find tokenid")); return(result); } - if ( KOMODO_NSPV <= 0 && hashBlock.IsNull()) { + if ( KOMODO_NSPV_FULLNODE && hashBlock.IsNull()) { result.push_back(Pair("result", "error")); result.push_back(Pair("error", "the transaction is still in mempool")); return(result); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 8692be7da..9e20540be 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -162,7 +162,7 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran utxovout = mtx.vin[i].prevout.n; if ( vintx.vout[utxovout].scriptPubKey.IsPayToCryptoCondition() == 0 ) { - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { if ( SignTx(mtx,i,vintx.vout[utxovout].nValue,vintx.vout[utxovout].scriptPubKey) == 0 ) fprintf(stderr,"signing error for vini.%d of %llx\n",i,(long long)vinimask); @@ -340,11 +340,12 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran void NSPV_CCunspents(std::vector > &unspentOutputs,char *coinaddr,bool ccflag); void NSPV_CCtxids(std::vector > &txids,char *coinaddr,bool ccflag); +void NSPV_CCtxids(std::vector > &txids,char *coinaddr,bool ccflag,uint8_t evalcode,uint256 filtertxid); void SetCCunspents(std::vector > &unspentOutputs,char *coinaddr,bool ccflag) { int32_t type=0,i,n; char *ptr; std::string addrstr; uint160 hashBytes; std::vector > addresses; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { NSPV_CCunspents(unspentOutputs,coinaddr,ccflag); return; @@ -368,7 +369,7 @@ void SetCCunspents(std::vector > &addressIndex,char *coinaddr,bool ccflag) { int32_t type=0,i,n; char *ptr; std::string addrstr; uint160 hashBytes; std::vector > addresses; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { NSPV_CCtxids(addressIndex,coinaddr,ccflag); return; @@ -389,6 +390,16 @@ void SetCCtxids(std::vector > &addressIndex } } +void SetCCtxids_NSPV(std::vector > &addressIndex,char *coinaddr,bool ccflag, uint8_t evalcode, uint256 filtertxid) +{ + if ( KOMODO_NSPV_SUPERLITE ) + { + NSPV_CCtxids(addressIndex,coinaddr,ccflag,evalcode,filtertxid); + return; + } + else SetCCtxids(addressIndex,coinaddr,ccflag); +} + int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout,int32_t CCflag) { uint256 txid; std::vector > unspentOutputs; @@ -555,7 +566,7 @@ int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t * int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs) { int32_t abovei,belowi,ind,vout,i,n = 0; int64_t sum,threshold,above,below; int64_t remains,nValue,totalinputs = 0; uint256 txid,hashBlock; std::vector vecOutputs; CTransaction tx; struct CC_utxo *utxos,*up; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) return(NSPV_AddNormalinputs(mtx,mypk,total,maxinputs,&NSPV_U)); #ifdef ENABLE_WALLET assert(pwalletMain != NULL); @@ -652,7 +663,7 @@ int64_t AddNormalinputs2(CMutableTransaction &mtx,int64_t total,int32_t maxinput { int32_t abovei,belowi,ind,vout,i,n = 0; int64_t sum,threshold,above,below; int64_t remains,nValue,totalinputs = 0; char coinaddr[64]; uint256 txid,hashBlock; CTransaction tx; struct CC_utxo *utxos,*up; std::vector > unspentOutputs; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) return(NSPV_AddNormalinputs(mtx,pubkey2pk(Mypubkey()),total,maxinputs,&NSPV_U)); utxos = (struct CC_utxo *)calloc(CC_MAXVINS,sizeof(*utxos)); if ( maxinputs > CC_MAXVINS ) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index b2125d3a4..145eef906 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -450,7 +450,7 @@ extern uint32_t NSPV_logintime; bool Myprivkey(uint8_t myprivkey[]) { char coinaddr[64],checkaddr[64]; std::string strAddress; char *dest; int32_t i,n; CBitcoinAddress address; CKeyID keyID; CKey vchSecret; uint8_t buf33[33]; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { if ( NSPV_logintime == 0 || time(NULL) > NSPV_logintime+NSPV_AUTOLOGOUT ) { @@ -590,7 +590,7 @@ int32_t NSPV_coinaddr_inmempool(char const *logcategory,char *coinaddr,uint8_t C int32_t myIs_coinaddr_inmempoolvout(char const *logcategory,char *coinaddr) { int32_t i,n; char destaddr[64]; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) return(NSPV_coinaddr_inmempool(logcategory,coinaddr,1)); BOOST_FOREACH(const CTxMemPoolEntry &e,mempool.mapTx) { @@ -619,7 +619,7 @@ int32_t myGet_mempool_txs(std::vector &txs,uint8_t evalcode,uint8_ { int i=0; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { CTransaction tx; uint256 hashBlock; @@ -673,7 +673,7 @@ bool komodo_txnotarizedconfirmed(uint256 txid) CBlockIndex *pindex; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; - if (KOMODO_NSPV!=0) + if ( KOMODO_NSPV_SUPERLITE ) { if ( NSPV_myGetTransaction(txid,tx,hashBlock,txheight,currentheight) == 0 ) { diff --git a/src/cc/channels.cpp b/src/cc/channels.cpp index 9545090c1..5e7acc6b6 100644 --- a/src/cc/channels.cpp +++ b/src/cc/channels.cpp @@ -846,7 +846,7 @@ UniValue ChannelsInfo(uint256 channeltxid) result.push_back(Pair("Amount (satoshi)",i64tostr(param1*param2))); } GetCCaddress(cp,CCaddr,mypk); - SetCCtxids(addressIndex,CCaddr,true); + SetCCtxids_NSPV(addressIndex,CCaddr,true,EVAL_CHANNELS,opentxid); for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) { if (myGetTransaction(it->first.txhash,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 0 && it->second==CC_MARKER_VALUE && diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 1f0b9d59f..2a2168de8 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -629,12 +629,10 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction & return eval->Invalid("deposit amount greater then bind total supply"); else if (komodo_txnotarizedconfirmed(deposittxid) == false) return eval->Invalid("gatewaysdeposit tx is not yet confirmed(notarised)!"); - else if (IsCCInput(tx.vin[0].scriptSig) != 0) - return eval->Invalid("vin.0 is normal for gatewaysclaim!"); - else if (tx.vin.size()>2) + else if (tx.vin.size()>0) { - i=1; - while (i<=tx.vin.size()-2) + i=0; + while (iInvalid("vin."+std::to_string(i)+" is CC for gatewaysclaim!"); i++; @@ -1108,20 +1106,15 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl); return(""); } - if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) + if ((inputs=AddGatewaysInputs(cp, mtx, gatewayspk, bindtxid, amount, 60)) > 0) { - if ((inputs=AddGatewaysInputs(cp, mtx, gatewayspk, bindtxid, amount, 60)) > 0) - { - if ( inputs > amount ) CCchange = (inputs - amount); - mtx.vin.push_back(CTxIn(deposittxid,0,CScript())); - mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS,amount,destpub)); - if ( CCchange != 0 ) mtx.vout.push_back(MakeTokensCC1vout(EVAL_GATEWAYS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysClaimOpRet('C',tokenid,bindtxid,refcoin,deposittxid,destpub,amount))); - } + if ( inputs > amount ) CCchange = (inputs - amount); + mtx.vin.push_back(CTxIn(deposittxid,0,CScript())); + mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS,amount,destpub)); + if ( CCchange != 0 ) mtx.vout.push_back(MakeTokensCC1vout(EVAL_GATEWAYS,CCchange,gatewayspk)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysClaimOpRet('C',tokenid,bindtxid,refcoin,deposittxid,destpub,amount))); } - CCerror = strprintf("cant find enough inputs or mismatched total"); - LOGSTREAM("gatewayscc",CCLOG_INFO, stream << CCerror << std::endl); - return(""); + return ""; } std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 01be01199..2d4e7804c 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -641,6 +641,7 @@ bool OraclesDataValidate(struct CCcontract_info *cp,Eval* eval,const CTransactio int32_t GetLatestTimestamp(int32_t height) { + if ( KOMODO_NSPV_SUPERLITE ) return (NSPV_blocktime(height)); return(komodo_heightstamp(height)); } @@ -793,7 +794,7 @@ int64_t LifetimeOraclesFunds(struct CCcontract_info *cp,uint256 oracletxid,CPubK char coinaddr[64]; CPubKey pk; int64_t total=0,num; uint256 txid,hashBlock,subtxid; CTransaction subtx; std::vector > addressIndex; GetCCaddress(cp,coinaddr,publisher); - SetCCtxids(addressIndex,coinaddr,true); + SetCCtxids_NSPV(addressIndex,coinaddr,true,EVAL_ORACLES,oracletxid); //fprintf(stderr,"scan lifetime of %s\n",coinaddr); for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) { diff --git a/src/cc/pegs.cpp b/src/cc/pegs.cpp index 6a31a3810..3ffc25a11 100644 --- a/src/cc/pegs.cpp +++ b/src/cc/pegs.cpp @@ -1234,7 +1234,7 @@ UniValue PegsAccountHistory(uint256 pegstxid) mypk = pubkey2pk(Mypubkey()); pegspk = GetUnspendable(cp,0); GetCCaddress1of2(cp,coinaddr,mypk,pegspk); - SetCCtxids(txids,coinaddr,true); + SetCCtxids_NSPV(txids,coinaddr,true,EVAL_PEGS,pegstxid); for (std::vector >::const_iterator it=txids.begin(); it!=txids.end(); it++) { txid = it->first.txhash; diff --git a/src/chain.h b/src/chain.h index f6c2bf980..167e69af7 100644 --- a/src/chain.h +++ b/src/chain.h @@ -620,7 +620,7 @@ public: READWRITE(VARINT(nTx)); // These values only serialized when -zindex enabled - if(fZindex) { + if((s.GetType() & SER_DISK) && fZindex) { READWRITE(VARINT(nShieldedTx)); READWRITE(VARINT(nShieldingTx)); READWRITE(VARINT(nDeshieldingTx)); diff --git a/src/consensus/upgrades.cpp b/src/consensus/upgrades.cpp index e23137a7b..b75e0c002 100644 --- a/src/consensus/upgrades.cpp +++ b/src/consensus/upgrades.cpp @@ -21,6 +21,14 @@ extern int32_t KOMODO_NSPV; #define NSPV_BRANCHID 0x76b809bb +#ifndef KOMODO_NSPV_FULLNODE +#define KOMODO_NSPV_FULLNODE (KOMODO_NSPV <= 0) +#endif // !KOMODO_NSPV_FULLNODE + +#ifndef KOMODO_NSPV_SUPERLITE +#define KOMODO_NSPV_SUPERLITE (KOMODO_NSPV > 0) +#endif // !KOMODO_NSPV_SUPERLITE + /** * General information about each network upgrade. * Ordered by Consensus::UpgradeIndex. @@ -101,7 +109,7 @@ int CurrentEpoch(int nHeight, const Consensus::Params& params) { uint32_t CurrentEpochBranchId(int nHeight, const Consensus::Params& params) { - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) return(NSPV_BRANCHID); return NetworkUpgradeInfo[CurrentEpoch(nHeight, params)].nBranchId; } diff --git a/src/init.cpp b/src/init.cpp index 079a3ae8d..57fe31c5c 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1089,7 +1089,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) RegisterAllCoreRPCCommands(tableRPC); #ifdef ENABLE_WALLET bool fDisableWallet = GetBoolArg("-disablewallet", false); - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { fDisableWallet = true; nLocalServices = 0; @@ -1170,7 +1170,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) // Option to startup with mocktime set (used for regression testing): SetMockTime(GetArg("-mocktime", 0)); // SetMockTime(0) is a no-op - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { if (GetBoolArg("-peerbloomfilters", true)) nLocalServices |= NODE_BLOOM; @@ -1331,7 +1331,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) libsnark::inhibit_profiling_info = true; libsnark::inhibit_profiling_counters = true; - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { // Initialize Zcash circuit parameters ZC_LoadParams(chainparams); @@ -1512,7 +1512,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) } #endif - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { std::vector vImportFiles; threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles)); diff --git a/src/komodo.h b/src/komodo.h index 4de6ee4f3..3176f6592 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -67,9 +67,14 @@ void komodo_currentheight_set(int32_t height) sp->CURRENT_HEIGHT = height; } +extern struct NSPV_inforesp NSPV_inforesult; int32_t komodo_currentheight() { char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp; + if ( KOMODO_NSPV_SUPERLITE ) + { + return (NSPV_inforesult.height); + } if ( (sp= komodo_stateptr(symbol,dest)) != 0 ) return(sp->CURRENT_HEIGHT); else return(0); diff --git a/src/komodo_defs.h b/src/komodo_defs.h index b7b5c9da7..db4702920 100644 --- a/src/komodo_defs.h +++ b/src/komodo_defs.h @@ -345,4 +345,11 @@ arith_uint256 komodo_adaptivepow_target(int32_t height,arith_uint256 bnTarget,ui uint256 Parseuint256(const char *hexstr); +#ifndef KOMODO_NSPV_FULLNODE +#define KOMODO_NSPV_FULLNODE (KOMODO_NSPV <= 0) +#endif // !KOMODO_NSPV_FULLNODE +#ifndef KOMODO_NSPV_SUPERLITE +#define KOMODO_NSPV_SUPERLITE (KOMODO_NSPV > 0) +#endif // !KOMODO_NSPV_SUPERLITE + #endif diff --git a/src/komodo_nSPV_defs.h b/src/komodo_nSPV_defs.h index 3f1016bb3..a24639e86 100644 --- a/src/komodo_nSPV_defs.h +++ b/src/komodo_nSPV_defs.h @@ -17,7 +17,7 @@ #ifndef KOMODO_NSPV_DEFSH #define KOMODO_NSPV_DEFSH -#define NSPV_PROTOCOL_VERSION 0x00000002 +#define NSPV_PROTOCOL_VERSION 0x00000003 #define NSPV_POLLITERS 200 #define NSPV_POLLMICROS 50000 #define NSPV_MAXVINS 64 diff --git a/src/komodo_nSPV_fullnode.h b/src/komodo_nSPV_fullnode.h index 64e87ea21..3856caf12 100644 --- a/src/komodo_nSPV_fullnode.h +++ b/src/komodo_nSPV_fullnode.h @@ -172,7 +172,7 @@ int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC { // if gettxout is != null to handle mempool { - if ( n >= skipcount ) + if ( n >= skipcount && myIsutxo_spentinmempool(ignoretxid,ignorevin,it->first.txhash,(int32_t)it->first.index) == 0 ) { ptr->utxos[ind].txid = it->first.txhash; ptr->utxos[ind].vout = (int32_t)it->first.index; @@ -208,8 +208,13 @@ int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC int32_t NSPV_getaddresstxids(struct NSPV_txidsresp *ptr,char *coinaddr,bool isCC,int32_t skipcount,uint32_t filter) { - int32_t maxlen,txheight,ind=0,n = 0,len = 0; + int32_t maxlen,txheight,ind=0,n = 0,len = 0; CTransaction tx; uint256 hashBlock,filtertxid; std::vector > txids; + if (ptr->txids!=0) + { + filtertxid=ptr->txids[0].txid; + free(ptr->txids); + } SetCCtxids(txids,coinaddr,isCC); ptr->nodeheight = chainActive.LastTip()->GetHeight(); maxlen = MAX_BLOCK_SIZE(ptr->nodeheight) - 512; @@ -231,6 +236,32 @@ int32_t NSPV_getaddresstxids(struct NSPV_txidsresp *ptr,char *coinaddr,bool isCC { if ( n >= skipcount ) { + if (filter&0xFF!=0) + { + myGetTransaction(it->first.txhash,tx,hashBlock); + std::vector> oprets; uint256 tokenid,txid; + std::vector vopret,vOpretExtra; uint8_t *script,e,f,tokenevalcode; + std::vector pubkeys; + + if (DecodeTokenOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,tokenevalcode,tokenid,pubkeys,oprets)!=0 && GetOpretBlob(oprets, OPRETID_CHANNELSDATA, vOpretExtra) && tokenevalcode==EVAL_TOKENS && vOpretExtra.size()>0) + { + vopret=vOpretExtra; + } + else GetOpReturnData(tx.vout[tx.vout.size()-1].scriptPubKey, vopret); + script = (uint8_t *)vopret.data(); + if ( vopret.size() > 2 && script[0]==filter&0xFF ) + { + switch (filter&0xFF) + { + case EVAL_CHANNELS:EVAL_PEGS:EVAL_ORACLES: + E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> txid;); + if (txid!=filtertxid && e==filter&0xFF) continue; + break; + default: + break; + } + } + } ptr->txids[ind].txid = it->first.txhash; ptr->txids[ind].vout = (int32_t)it->first.index; ptr->txids[ind].satoshis = (int64_t)it->second; @@ -250,10 +281,11 @@ int32_t NSPV_getaddresstxids(struct NSPV_txidsresp *ptr,char *coinaddr,bool isCC return(0); } -int32_t NSPV_mempoolfuncs(int32_t *vindexp,std::vector &txids,char *coinaddr,bool isCC,uint8_t funcid,uint256 txid,int32_t vout) +int32_t NSPV_mempoolfuncs(bits256 *satoshisp,int32_t *vindexp,std::vector &txids,char *coinaddr,bool isCC,uint8_t funcid,uint256 txid,int32_t vout) { int32_t num = 0,vini = 0,vouti = 0; uint8_t evalcode=0,func=0; std::vector vopret; char destaddr[64]; *vindexp = -1; + memset(satoshisp,0,sizeof(*satoshisp)); if ( mempool.size() == 0 ) return(0); if ( funcid == NSPV_MEMPOOL_CCEVALCODE ) @@ -323,6 +355,8 @@ int32_t NSPV_mempoolfuncs(int32_t *vindexp,std::vector &txids,char *coi { txids.push_back(hash); *vindexp = vouti; + if ( num < 4 ) + satoshisp->ulongs[num] = txout.nValue; num++; } } @@ -336,14 +370,14 @@ int32_t NSPV_mempoolfuncs(int32_t *vindexp,std::vector &txids,char *coi int32_t NSPV_mempooltxids(struct NSPV_mempoolresp *ptr,char *coinaddr,uint8_t isCC,uint8_t funcid,uint256 txid,int32_t vout) { - std::vector txids; uint256 tmp,tmpdest; int32_t i,len = 0; + std::vector txids; bits256 satoshis; uint256 tmp,tmpdest; int32_t i,len = 0; ptr->nodeheight = chainActive.LastTip()->GetHeight(); strncpy(ptr->coinaddr,coinaddr,sizeof(ptr->coinaddr)-1); ptr->CCflag = isCC; ptr->txid = txid; ptr->vout = vout; ptr->funcid = funcid; - if ( NSPV_mempoolfuncs(&ptr->vindex,txids,coinaddr,isCC,funcid,txid,vout) >= 0 ) + if ( NSPV_mempoolfuncs(&satoshis,&ptr->vindex,txids,coinaddr,isCC,funcid,txid,vout) >= 0 ) { if ( (ptr->numtxids= (int32_t)txids.size()) >= 0 ) { @@ -356,6 +390,11 @@ int32_t NSPV_mempooltxids(struct NSPV_mempoolresp *ptr,char *coinaddr,uint8_t is iguana_rwbignum(0,(uint8_t *)&tmp,sizeof(*ptr->txids),(uint8_t *)&ptr->txids[i]); } } + if ( funcid == NSPV_MEMPOOL_ADDRESS ) + { + memcpy(&tmp,&satoshis,sizeof(tmp)); + iguana_rwbignum(0,(uint8_t *)&tmp,sizeof(ptr->txid),(uint8_t *)&ptr->txid); + } len = (int32_t)(sizeof(*ptr) + sizeof(*ptr->txids)*ptr->numtxids - sizeof(ptr->txids)); return(len); } @@ -413,46 +452,48 @@ int32_t NSPV_sendrawtransaction(struct NSPV_broadcastresp *ptr,uint8_t *data,int int32_t NSPV_gettxproof(struct NSPV_txproof *ptr,int32_t vout,uint256 txid,int32_t height) { int32_t flag = 0,len = 0; CTransaction _tx; uint256 hashBlock; CBlock block; CBlockIndex *pindex; - if ( (ptr->tx= NSPV_getrawtx(_tx,hashBlock,&ptr->txlen,txid)) == 0 ) - return(-1); - ptr->txid = txid; - ptr->vout = vout; - ptr->hashblock = hashBlock; - if ( height == 0 ) - ptr->height = komodo_blockheight(hashBlock); - else + ptr->height = -1; + if ( (ptr->tx= NSPV_getrawtx(_tx,hashBlock,&ptr->txlen,txid)) != 0 ) { - ptr->height = height; - if ( (pindex= komodo_chainactive(height)) != 0 && komodo_blockload(block,pindex) == 0 ) + ptr->txid = txid; + ptr->vout = vout; + ptr->hashblock = hashBlock; + if ( height == 0 ) + ptr->height = komodo_blockheight(hashBlock); + else { - BOOST_FOREACH(const CTransaction&tx, block.vtx) + ptr->height = height; + if ( (pindex= komodo_chainactive(height)) != 0 && komodo_blockload(block,pindex) == 0 ) { - if ( tx.GetHash() == txid ) + BOOST_FOREACH(const CTransaction&tx, block.vtx) { - flag = 1; - break; + if ( tx.GetHash() == txid ) + { + flag = 1; + break; + } } - } - if ( flag != 0 ) - { - set setTxids; - CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION); - setTxids.insert(txid); - CMerkleBlock mb(block, setTxids); - ssMB << mb; - std::vector proof(ssMB.begin(), ssMB.end()); - ptr->txprooflen = (int32_t)proof.size(); - //fprintf(stderr,"%s txproof.(%s)\n",txid.GetHex().c_str(),HexStr(proof).c_str()); - if ( ptr->txprooflen > 0 ) + if ( flag != 0 ) { - ptr->txproof = (uint8_t *)calloc(1,ptr->txprooflen); - memcpy(ptr->txproof,&proof[0],ptr->txprooflen); + set setTxids; + CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION); + setTxids.insert(txid); + CMerkleBlock mb(block, setTxids); + ssMB << mb; + std::vector proof(ssMB.begin(), ssMB.end()); + ptr->txprooflen = (int32_t)proof.size(); + //fprintf(stderr,"%s txproof.(%s)\n",txid.GetHex().c_str(),HexStr(proof).c_str()); + if ( ptr->txprooflen > 0 ) + { + ptr->txproof = (uint8_t *)calloc(1,ptr->txprooflen); + memcpy(ptr->txproof,&proof[0],ptr->txprooflen); + } + //fprintf(stderr,"gettxproof slen.%d\n",(int32_t)(sizeof(*ptr) - sizeof(ptr->tx) - sizeof(ptr->txproof) + ptr->txlen + ptr->txprooflen)); } - //fprintf(stderr,"gettxproof slen.%d\n",(int32_t)(sizeof(*ptr) - sizeof(ptr->tx) - sizeof(ptr->txproof) + ptr->txlen + ptr->txprooflen)); } } + ptr->unspentvalue = CCgettxout(txid,vout,1,1); } - ptr->unspentvalue = CCgettxout(txid,vout,1,1); return(sizeof(*ptr) - sizeof(ptr->tx) - sizeof(ptr->txproof) + ptr->txlen + ptr->txprooflen); } diff --git a/src/komodo_nSPV_superlite.h b/src/komodo_nSPV_superlite.h index 37f1c3c44..b5f3b4ca1 100644 --- a/src/komodo_nSPV_superlite.h +++ b/src/komodo_nSPV_superlite.h @@ -214,7 +214,7 @@ void komodo_nSPVresp(CNode *pfrom,std::vector response) // received a r CNode *NSPV_req(CNode *pnode,uint8_t *msg,int32_t len,uint64_t mask,int32_t ind) { int32_t n,flag = 0; CNode *pnodes[64]; uint32_t timestamp = (uint32_t)time(NULL); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) return(0); if ( pnode == 0 ) { @@ -243,7 +243,7 @@ CNode *NSPV_req(CNode *pnode,uint8_t *msg,int32_t len,uint64_t mask,int32_t ind) std::vector request; request.resize(len); memcpy(&request[0],msg,len); - if ( (0) && KOMODO_NSPV > 0 ) + if ( (0) && KOMODO_NSPV_SUPERLITE ) fprintf(stderr,"pushmessage [%d] len.%d\n",msg[0],len); pnode->PushMessage("getnSPV",request); pnode->prevtimes[ind] = timestamp; @@ -279,7 +279,7 @@ void komodo_nSPV(CNode *pto) // polling loop from SendMessages return; if ( pto->prevtimes[NSPV_INFO>>1] > timestamp ) pto->prevtimes[NSPV_INFO>>1] = 0; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { if ( timestamp > NSPV_lastinfo + ASSETCHAINS_BLOCKTIME/2 && timestamp > pto->prevtimes[NSPV_INFO>>1] + 2*ASSETCHAINS_BLOCKTIME/3 ) { @@ -355,7 +355,7 @@ UniValue NSPV_getinfo_json(struct NSPV_inforesp *ptr) { UniValue result(UniValue::VOBJ); int32_t expiration; uint32_t timestamp = (uint32_t)time(NULL); result.push_back(Pair("result","success")); - result.push_back(Pair("nSPV",KOMODO_NSPV!=0?"superlite":"fullnode")); + result.push_back(Pair("nSPV",KOMODO_NSPV==-1?"disabled":(KOMODO_NSPV_SUPERLITE?"superlite":"fullnode"))); if ( NSPV_address.size() != 0 ) { result.push_back(Pair("address",NSPV_address)); @@ -537,7 +537,7 @@ UniValue NSPV_login(char *wifstr) result.push_back(Pair("address",NSPV_address)); result.push_back(Pair("pubkey",HexStr(pubkey))); strcpy(NSPV_pubkeystr,HexStr(pubkey).c_str()); - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) decode_hex(NOTARY_PUBKEY33,33,NSPV_pubkeystr); result.push_back(Pair("wifprefix",(int64_t)data[0])); result.push_back(Pair("compressed",(int64_t)(data[len-5] == 1))); @@ -621,7 +621,7 @@ UniValue NSPV_addressutxos(char *coinaddr,int32_t CCflag,int32_t skipcount,int32 return(result); } -UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount,int32_t filter) +UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount,int32_t filter, uint256 filtertxid) { UniValue result(UniValue::VOBJ); uint8_t msg[512]; int32_t i,iter,slen,len = 0; if ( NSPV_txidsresult.nodeheight >= NSPV_inforesult.height && strcmp(coinaddr,NSPV_txidsresult.coinaddr) == 0 && CCflag == NSPV_txidsresult.CCflag && skipcount == NSPV_txidsresult.skipcount ) @@ -642,6 +642,11 @@ UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount,int32 msg[len++] = (CCflag != 0); len += iguana_rwnum(1,&msg[len],sizeof(skipcount),&skipcount); len += iguana_rwnum(1,&msg[len],sizeof(filter),&filter); + if (filtertxid!=zeroid) + { + NSPV_txidsresult.txids = (struct NSPV_txidresp *)malloc(sizeof(NSPV_txidsresult.txids)); + NSPV_txidsresult.txids[0].txid=filtertxid; + } //fprintf(stderr,"skipcount.%d\n",skipcount); for (iter=0; iter<3; iter++) if ( NSPV_req(0,msg,len,NODE_ADDRINDEX,msg[0]>>1) != 0 ) diff --git a/src/komodo_nSPV_wallet.h b/src/komodo_nSPV_wallet.h index bacb5f42f..336d40fc6 100644 --- a/src/komodo_nSPV_wallet.h +++ b/src/komodo_nSPV_wallet.h @@ -452,12 +452,12 @@ int64_t NSPV_AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total mtx.nVersionGroupId = SAPLING_VERSION_GROUP_ID; mtx.nVersion = SAPLING_TX_VERSION; Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG); - if ( strcmp(ptr->U.coinaddr,coinaddr) != 0 ) - { + // if ( strcmp(ptr->U.coinaddr,coinaddr) != 0 ) + // { NSPV_addressutxos(coinaddr,CCflag,0,0); NSPV_utxosresp_purge(&ptr->U); NSPV_utxosresp_copy(&ptr->U,&NSPV_utxosresult); - } + // } fprintf(stderr,"%s numutxos.%d\n",ptr->U.coinaddr,ptr->U.numutxos); memset(ptr->used,0,sizeof(ptr->used)); return(NSPV_addinputs(ptr->used,mtx,total,maxinputs,ptr->U.utxos,ptr->U.numutxos)); @@ -522,7 +522,14 @@ void NSPV_CCunspents(std::vector > &txids,char *coinaddr,bool ccflag) { int32_t filter = 0; - NSPV_addresstxids(coinaddr,ccflag,0,filter); + NSPV_addresstxids(coinaddr,ccflag,0,filter,zeroid); + NSPV_txids2CCtxids(&NSPV_txidsresult,txids); +} + +void NSPV_CCtxids(std::vector > &txids,char *coinaddr,bool ccflag, uint8_t evalcode,uint256 filtertxid) +{ + int32_t filter = evalcode; + NSPV_addresstxids(coinaddr,ccflag,0,filter,filtertxid); NSPV_txids2CCtxids(&NSPV_txidsresult,txids); } diff --git a/src/main.cpp b/src/main.cpp index 880cffa85..a339648df 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2228,7 +2228,7 @@ bool myAddtomempool(CTransaction &tx, CValidationState *pstate, bool fSkipExpiry bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock) { memset(&hashBlock,0,sizeof(hashBlock)); - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { int64_t rewardsum = 0; int32_t i,retval,txheight,currentheight,height=0,vout = 0; for (i=0; i 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { int64_t rewardsum = 0; int32_t i,retval,height=0,vout = 0; for (i=0; i 0 ) + if ( KOMODO_NSPV_SUPERLITE ) return(true); if ( KOMODO_STOPAT != 0 && pindex->GetHeight() > KOMODO_STOPAT ) return(false); @@ -4012,7 +4012,7 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) { void FlushStateToDisk() { CValidationState state; - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) FlushStateToDisk(state, FLUSH_STATE_ALWAYS); } @@ -4163,7 +4163,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { if ((i == (block.vtx.size() - 1)) && (ASSETCHAINS_STAKED != 0 && (komodo_isPoS((CBlock *)&block,pindexDelete->GetHeight(),true) != 0))) { #ifdef ENABLE_WALLET - if ( !GetBoolArg("-disablewallet", false) && KOMODO_NSPV <= 0 ) + if ( !GetBoolArg("-disablewallet", false) && KOMODO_NSPV_FULLNODE ) pwalletMain->EraseFromWallet(tx.GetHash()); #endif } @@ -4268,7 +4268,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * // Get the current commitment tree SproutMerkleTree oldSproutTree; SaplingMerkleTree oldSaplingTree; - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { assert(pcoinsTip->GetSproutAnchorAt(pcoinsTip->GetBestAnchor(SPROUT), oldSproutTree)); assert(pcoinsTip->GetSaplingAnchorAt(pcoinsTip->GetBestAnchor(SAPLING), oldSaplingTree)); @@ -4297,13 +4297,13 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * mapBlockSource.erase(pindexNew->GetBlockHash()); nTime3 = GetTimeMicros(); nTimeConnectTotal += nTime3 - nTime2; LogPrint("bench", " - Connect total: %.2fms [%.2fs]\n", (nTime3 - nTime2) * 0.001, nTimeConnectTotal * 0.000001); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) assert(view.Flush()); } int64_t nTime4 = GetTimeMicros(); nTimeFlush += nTime4 - nTime3; LogPrint("bench", " - Flush: %.2fms [%.2fs]\n", (nTime4 - nTime3) * 0.001, nTimeFlush * 0.000001); // Write the chain state to disk, if necessary. - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) return false; @@ -4319,7 +4319,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * // Update chainActive & related variables. UpdateTip(pindexNew); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { // Tell wallet about transactions that went from mempool // to conflicted: @@ -4347,7 +4347,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * komodo_broadcast(pblock,8); else if ( ASSETCHAINS_SYMBOL[0] != 0 ) komodo_broadcast(pblock,4);*/ - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { if ( ASSETCHAINS_CBOPRET != 0 ) komodo_pricesupdate(pindexNew->GetHeight(),pblock); @@ -6717,7 +6717,7 @@ bool InitBlockIndex() { if (!ActivateBestChain(true, state, &block)) return error("LoadBlockIndex(): genesis block cannot be activated"); // Force a chainstate write so that when we VerifyDB in a moment, it doesn't check stale data - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) return FlushStateToDisk(state, FLUSH_STATE_ALWAYS); else return(true); } catch (const std::runtime_error& e) { @@ -7277,7 +7277,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { const CChainParams& chainparams = Params(); LogPrint("net", "received: %s (%u bytes) peer=%d\n", SanitizeString(strCommand), vRecv.size(), pfrom->id); - //if ( KOMODO_NSPV > 0 ) + //if ( KOMODO_NSPV_SUPERLITE ) //if ( strCommand != "version" && strCommand != "verack" ) // fprintf(stderr, "recv: %s (%u bytes) peer=%d\n", SanitizeString(strCommand).c_str(), (int32_t)vRecv.size(), (int32_t)pfrom->GetId()); if (mapArgs.count("-dropmessagestest") && GetRand(atoi(mapArgs["-dropmessagestest"])) == 0) @@ -7452,7 +7452,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { pfrom->SetRecvVersion(min(pfrom->nVersion, PROTOCOL_VERSION)); - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { if ( (pfrom->nServices & NODE_NSPV) == 0 ) { @@ -7662,7 +7662,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } else if (strCommand == "nSPV") { - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { std::vector payload; vRecv >> payload; @@ -7670,7 +7670,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } return(true); } - else if ( KOMODO_NSPV > 0 ) + else if ( KOMODO_NSPV_SUPERLITE ) return(true); else if (strCommand == "inv") { @@ -8460,7 +8460,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) } state.fShouldBan = false; } - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { komodo_nSPV(pto); return(true); @@ -8671,7 +8671,7 @@ extern "C" const char* getDataDir() CMutableTransaction CreateNewContextualCMutableTransaction(const Consensus::Params& consensusParams, int nHeight) { CMutableTransaction mtx; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { mtx.fOverwintered = true; mtx.nExpiryHeight = 0; diff --git a/src/net.cpp b/src/net.cpp index 255d5efd5..00ba44434 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -445,6 +445,13 @@ void CNode::CloseSocketDisconnect() } extern int32_t KOMODO_NSPV; +#ifndef KOMODO_NSPV_FULLNODE +#define KOMODO_NSPV_FULLNODE (KOMODO_NSPV <= 0) +#endif // !KOMODO_NSPV_FULLNODE + +#ifndef KOMODO_NSPV_SUPERLITE +#define KOMODO_NSPV_SUPERLITE (KOMODO_NSPV > 0) +#endif // !KOMODO_NSPV_SUPERLITE void CNode::PushVersion() { @@ -1843,7 +1850,7 @@ bool StopNode() for (int i=0; ipost(); - if (KOMODO_NSPV <= 0 && fAddressesInitialized) + if (KOMODO_NSPV_FULLNODE && fAddressesInitialized) { DumpAddresses(); fAddressesInitialized = false; diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 8bd0f3d43..ecc5cd848 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -397,7 +397,7 @@ bool NSPV_inmempool(uint256 txid); bool myIsutxo_spentinmempool(uint256 &spenttxid,int32_t &spentvini,uint256 txid,int32_t vout) { int32_t vini = 0; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) return(NSPV_spentinmempool(spenttxid,spentvini,txid,vout)); BOOST_FOREACH(const CTxMemPoolEntry &e,mempool.mapTx) { @@ -421,7 +421,7 @@ bool myIsutxo_spentinmempool(uint256 &spenttxid,int32_t &spentvini,uint256 txid, bool mytxid_inmempool(uint256 txid) { - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { } diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index 050d42ace..f7b6659c5 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -243,7 +243,7 @@ UniValue getinfo(const UniValue& params, bool fHelp) obj.push_back(Pair("prevMoMheight", prevMoMheight)); obj.push_back(Pair("notarizedhash", notarized_hash.ToString())); obj.push_back(Pair("notarizedtxid", notarized_desttxid.ToString())); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { txid_height = notarizedtxid_height(ASSETCHAINS_SYMBOL[0] != 0 ? (char *)"KMD" : (char *)"BTC",(char *)notarized_desttxid.ToString().c_str(),&kmdnotarized_height); if ( txid_height > 0 ) diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index 343673bd4..1594043a8 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -374,7 +374,7 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry) const CTxOut& txout = tx.vout[i]; UniValue out(UniValue::VOBJ); out.push_back(Pair("value", ValueFromAmount(txout.nValue))); - if ( KOMODO_NSPV <= 0 && ASSETCHAINS_SYMBOL[0] == 0 && tx.nLockTime >= 500000000 && (tipindex= chainActive.LastTip()) != 0 ) + if ( KOMODO_NSPV_FULLNODE && ASSETCHAINS_SYMBOL[0] == 0 && tx.nLockTime >= 500000000 && (tipindex= chainActive.LastTip()) != 0 ) { int64_t interest; int32_t txheight; uint32_t locktime; interest = komodo_accrued_interest(&txheight,&locktime,tx.GetHash(),i,0,txout.nValue,(int32_t)tipindex->GetHeight()); @@ -1366,7 +1366,7 @@ UniValue sendrawtransaction(const UniValue& params, bool fHelp) bool fOverrideFees = false; if (params.size() > 1) fOverrideFees = params[1].get_bool(); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { CCoinsViewCache &view = *pcoinsTip; const CCoins* existingCoins = view.AccessCoins(hashTx); diff --git a/src/script/sign.cpp b/src/script/sign.cpp index e6ac9fffa..d1d24b3d0 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -37,6 +37,13 @@ typedef vector valtype; extern uint8_t ASSETCHAINS_TXPOW; extern char NSPV_wifstr[],NSPV_pubkeystr[]; extern int32_t KOMODO_NSPV; +#ifndef KOMODO_NSPV_FULLNODE +#define KOMODO_NSPV_FULLNODE (KOMODO_NSPV <= 0) +#endif // !KOMODO_NSPV_FULLNODE +#ifndef KOMODO_NSPV_SUPERLITE +#define KOMODO_NSPV_SUPERLITE (KOMODO_NSPV > 0) +#endif // !KOMODO_NSPV_SUPERLITE + uint256 SIG_TXHASH; TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {} @@ -53,7 +60,7 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, } } SIG_TXHASH = hash; - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) key = DecodeSecret(NSPV_wifstr); else if (pprivKey) key = *pprivKey; @@ -74,7 +81,7 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, return false; } vchSig = CCSigVec(cc); - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) memset((uint8_t *)key.begin(),0,32); return true; } @@ -100,7 +107,7 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, } vchSig.push_back((unsigned char)nHashType); - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) memset((uint8_t *)key.begin(),0,32); return true; } @@ -381,7 +388,7 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP } else { - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) { CPubKey vch; creator.KeyStore().GetPubKey(keyID, vch); diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 2d39de120..18262eb96 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -973,10 +973,17 @@ UniValue z_exportviewingkey(const UniValue& params, bool fHelp) } extern int32_t KOMODO_NSPV; +#ifndef KOMODO_NSPV_FULLNODE +#define KOMODO_NSPV_FULLNODE (KOMODO_NSPV <= 0) +#endif // !KOMODO_NSPV_FULLNODE +#ifndef KOMODO_NSPV_SUPERLITE +#define KOMODO_NSPV_SUPERLITE (KOMODO_NSPV > 0) +#endif // !KOMODO_NSPV_SUPERLITE +uint256 zeroid; UniValue NSPV_getinfo_req(int32_t reqht); UniValue NSPV_login(char *wifstr); UniValue NSPV_logout(); -UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount,int32_t filter); +UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount,int32_t filter, uint256 filtertxid); UniValue NSPV_addressutxos(char *coinaddr,int32_t CCflag,int32_t skipcount,int32_t filter); UniValue NSPV_mempooltxids(char *coinaddr,int32_t CCflag,uint8_t funcid,uint256 txid,int32_t vout); UniValue NSPV_broadcast(char *hex); @@ -993,7 +1000,7 @@ UniValue nspv_getinfo(const UniValue& params, bool fHelp) int32_t reqht = 0; if ( fHelp || params.size() > 1 ) throw runtime_error("nspv_getinfo [hdrheight]\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); if ( params.size() == 1 ) reqht = atoi((char *)params[0].get_str().c_str()); @@ -1004,7 +1011,7 @@ UniValue nspv_logout(const UniValue& params, bool fHelp) { if ( fHelp || params.size() != 0 ) throw runtime_error("nspv_logout\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); return(NSPV_logout()); } @@ -1013,7 +1020,7 @@ UniValue nspv_login(const UniValue& params, bool fHelp) { if ( fHelp || params.size() != 1 ) throw runtime_error("nspv_login wif\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); return(NSPV_login((char *)params[0].get_str().c_str())); } @@ -1023,7 +1030,7 @@ UniValue nspv_listunspent(const UniValue& params, bool fHelp) int32_t skipcount = 0,CCflag = 0; if ( fHelp || params.size() > 3 ) throw runtime_error("nspv_listunspent [address [isCC [skipcount]]]\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); if ( params.size() == 0 ) { @@ -1048,7 +1055,7 @@ UniValue nspv_mempool(const UniValue& params, bool fHelp) memset(&txid,0,sizeof(txid)); if ( fHelp || params.size() > 5 ) throw runtime_error("nspv_mempool func(0 all, 1 address recv, 2 txid/vout spent, 3 txid inmempool) address isCC [txid vout]]]\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); funcid = atoi((char *)params[0].get_str().c_str()); coinaddr = (char *)params[1].get_str().c_str(); @@ -1068,12 +1075,12 @@ UniValue nspv_listtransactions(const UniValue& params, bool fHelp) int32_t skipcount = 0,CCflag = 0; if ( fHelp || params.size() > 3 ) throw runtime_error("nspv_listtransactions [address [isCC [skipcount]]]\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); if ( params.size() == 0 ) { if ( NSPV_address.size() != 0 ) - return(NSPV_addresstxids((char *)NSPV_address.c_str(),0,0,0)); + return(NSPV_addresstxids((char *)NSPV_address.c_str(),0,0,0,zeroid)); else throw runtime_error("nspv_listtransactions [address [isCC [skipcount]]]\n"); } if ( params.size() >= 1 ) @@ -1083,7 +1090,7 @@ UniValue nspv_listtransactions(const UniValue& params, bool fHelp) if ( params.size() == 3 ) skipcount = atoi((char *)params[2].get_str().c_str()); //fprintf(stderr,"call txids cc.%d skip.%d\n",CCflag,skipcount); - return(NSPV_addresstxids((char *)params[0].get_str().c_str(),CCflag,skipcount,0)); + return(NSPV_addresstxids((char *)params[0].get_str().c_str(),CCflag,skipcount,0,zeroid)); } else throw runtime_error("nspv_listtransactions [address [isCC [skipcount]]]\n"); } @@ -1093,7 +1100,7 @@ UniValue nspv_spentinfo(const UniValue& params, bool fHelp) uint256 txid; int32_t vout; if ( fHelp || params.size() != 2 ) throw runtime_error("nspv_spentinfo txid vout\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); txid = Parseuint256((char *)params[0].get_str().c_str()); vout = atoi((char *)params[1].get_str().c_str()); @@ -1105,7 +1112,7 @@ UniValue nspv_notarizations(const UniValue& params, bool fHelp) int32_t height; if ( fHelp || params.size() != 1 ) throw runtime_error("nspv_notarizations height\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); height = atoi((char *)params[0].get_str().c_str()); return(NSPV_notarizations(height)); @@ -1116,7 +1123,7 @@ UniValue nspv_hdrsproof(const UniValue& params, bool fHelp) int32_t prevheight,nextheight; if ( fHelp || params.size() != 2 ) throw runtime_error("nspv_hdrsproof prevheight nextheight\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); prevheight = atoi((char *)params[0].get_str().c_str()); nextheight = atoi((char *)params[1].get_str().c_str()); @@ -1128,7 +1135,7 @@ UniValue nspv_txproof(const UniValue& params, bool fHelp) uint256 txid; int32_t height; if ( fHelp || params.size() != 2 ) throw runtime_error("nspv_txproof txid height\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); txid = Parseuint256((char *)params[0].get_str().c_str()); height = atoi((char *)params[1].get_str().c_str()); @@ -1140,7 +1147,7 @@ UniValue nspv_spend(const UniValue& params, bool fHelp) uint64_t satoshis; if ( fHelp || params.size() != 2 ) throw runtime_error("nspv_spend address amount\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); if ( NSPV_address.size() == 0 ) throw runtime_error("to nspv_send you need an active nspv_login\n"); @@ -1155,7 +1162,7 @@ UniValue nspv_broadcast(const UniValue& params, bool fHelp) { if ( fHelp || params.size() != 1 ) throw runtime_error("nspv_broadcast hex\n"); - if ( KOMODO_NSPV <= 0 ) + if ( KOMODO_NSPV_FULLNODE ) throw runtime_error("-nSPV=1 must be set to use nspv\n"); return(NSPV_broadcast((char *)params[0].get_str().c_str())); } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 9c8565bf6..c77c4e18d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -162,7 +162,7 @@ void OS_randombytes(unsigned char *x,long xlen); UniValue getnewaddress(const UniValue& params, bool fHelp) { - if ( KOMODO_NSPV <= 0 && !EnsureWalletIsAvailable(fHelp) ) + if ( KOMODO_NSPV_FULLNODE && !EnsureWalletIsAvailable(fHelp) ) return NullUniValue; if (fHelp || params.size() > 1) @@ -178,7 +178,7 @@ UniValue getnewaddress(const UniValue& params, bool fHelp) + HelpExampleRpc("getnewaddress", "") ); - if ( KOMODO_NSPV > 0 ) + if ( KOMODO_NSPV_SUPERLITE ) { UniValue result(UniValue::VOBJ); uint8_t priv32[32]; #ifndef __WIN32 @@ -2974,7 +2974,7 @@ UniValue listunspent(const UniValue& params, bool fHelp) uint64_t komodo_interestsum() { #ifdef ENABLE_WALLET - if ( ASSETCHAINS_SYMBOL[0] == 0 && GetBoolArg("-disablewallet", false) == 0 && KOMODO_NSPV <= 0 ) + if ( ASSETCHAINS_SYMBOL[0] == 0 && GetBoolArg("-disablewallet", false) == 0 && KOMODO_NSPV_FULLNODE ) { uint64_t interest,sum = 0; int32_t txheight; uint32_t locktime; vector vecOutputs; @@ -7002,7 +7002,7 @@ UniValue faucetfund(const UniValue& params, bool fHelp) if ( fHelp || params.size() > 1 ) throw runtime_error("faucetfund amount\n"); funds = atof(params[0].get_str().c_str()) * COIN + 0.00000000499999; - if ( (0) && KOMODO_NSPV > 0 ) + if ( (0) && KOMODO_NSPV_SUPERLITE ) { char coinaddr[64]; struct CCcontract_info *cp,C; CTxOut v; cp = CCinit(&C,EVAL_FAUCET);