From 5c6b1680dcd920525aa2e3562c84e36b31394e2a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 24 Jul 2019 04:18:43 -1100 Subject: [PATCH] Protocol changes: txproof with hash block and list funds with filter --- src/komodo_nSPV.h | 4 ++-- src/komodo_nSPV_defs.h | 4 ++-- src/komodo_nSPV_fullnode.h | 40 ++++++++++++++++++++++++------------- src/komodo_nSPV_superlite.h | 8 ++++++-- src/komodo_nSPV_wallet.h | 6 ++++-- src/wallet/rpcdump.cpp | 12 +++++------ 6 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/komodo_nSPV.h b/src/komodo_nSPV.h index edd02af8b..9b23cb018 100644 --- a/src/komodo_nSPV.h +++ b/src/komodo_nSPV.h @@ -101,7 +101,7 @@ int32_t NSPV_rwutxosresp(int32_t rwflag,uint8_t *serialized,struct NSPV_utxosres len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->total),&ptr->total); len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->interest),&ptr->interest); len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->nodeheight),&ptr->nodeheight); - len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->pad32),&ptr->pad32); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->filter),&ptr->filter); len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->CCflag),&ptr->CCflag); len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->skipcount),&ptr->skipcount); if ( rwflag != 0 ) @@ -159,7 +159,7 @@ int32_t NSPV_rwtxidsresp(int32_t rwflag,uint8_t *serialized,struct NSPV_txidsres len += NSPV_rwtxidresp(rwflag,&serialized[len],&ptr->txids[i]); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->nodeheight),&ptr->nodeheight); - len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->pad32),&ptr->pad32); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->filter),&ptr->filter); len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->CCflag),&ptr->CCflag); len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->skipcount),&ptr->skipcount); if ( rwflag != 0 ) diff --git a/src/komodo_nSPV_defs.h b/src/komodo_nSPV_defs.h index 71865c208..122a43e9c 100644 --- a/src/komodo_nSPV_defs.h +++ b/src/komodo_nSPV_defs.h @@ -78,7 +78,7 @@ struct NSPV_utxosresp struct NSPV_utxoresp *utxos; char coinaddr[64]; int64_t total,interest; - int32_t nodeheight,skipcount,pad32; + int32_t nodeheight,skipcount,filter; uint16_t numutxos,CCflag; }; @@ -93,7 +93,7 @@ struct NSPV_txidsresp { struct NSPV_txidresp *txids; char coinaddr[64]; - int32_t nodeheight,skipcount,pad32; + int32_t nodeheight,skipcount,filter; uint16_t numtxids,CCflag; }; diff --git a/src/komodo_nSPV_fullnode.h b/src/komodo_nSPV_fullnode.h index 3597201e6..1db5d8b0e 100644 --- a/src/komodo_nSPV_fullnode.h +++ b/src/komodo_nSPV_fullnode.h @@ -139,7 +139,7 @@ int32_t NSPV_getinfo(struct NSPV_inforesp *ptr,int32_t reqheight) } else return(-1); } -int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC,int32_t skipcount) // check mempool +int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC,int32_t skipcount,uint32_t filter) { int64_t total = 0,interest=0; uint32_t locktime; int32_t ind=0,tipheight,maxlen,txheight,n = 0,len = 0; std::vector > unspentOutputs; @@ -198,7 +198,7 @@ int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC return(0); } -int32_t NSPV_getaddresstxids(struct NSPV_txidsresp *ptr,char *coinaddr,bool isCC,int32_t skipcount) +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; std::vector > txids; @@ -551,23 +551,29 @@ void komodo_nSPVreq(CNode *pfrom,std::vector request) // received a req //fprintf(stderr,"utxos: %u > %u, ind.%d, len.%d\n",timestamp,pfrom->prevtimes[ind],ind,len); if ( timestamp > pfrom->prevtimes[ind] ) { - struct NSPV_utxosresp U; char coinaddr[64]; - if ( len < 64 && (request[1] == len-3 || request[1] == len-7) ) + struct NSPV_utxosresp U; + if ( len < 64+5 && (request[1] == len-3 || request[1] == len-7 || request[1] == len-11) ) { - int32_t skipcount = 0; uint8_t isCC = 0; + int32_t skipcount = 0; char coinaddr[64]; uint8_t filter; uint8_t isCC = 0; memcpy(coinaddr,&request[2],request[1]); coinaddr[request[1]] = 0; if ( request[1] == len-3 ) isCC = (request[len-1] != 0); - else + else if ( request[1] == len-7 ) { isCC = (request[len-5] != 0); iguana_rwnum(0,&request[len-4],sizeof(skipcount),&skipcount); } + else + { + isCC = (request[len-9] != 0); + iguana_rwnum(0,&request[len-4],sizeof(skipcount),&skipcount); + iguana_rwnum(0,&request[len-4],sizeof(filter),&filter); + } if ( isCC != 0 ) - fprintf(stderr,"%s isCC.%d skipcount.%d\n",coinaddr,isCC,skipcount); + fprintf(stderr,"utxos %s isCC.%d skipcount.%d filter.%x\n",coinaddr,isCC,skipcount,filter); memset(&U,0,sizeof(U)); - if ( (slen= NSPV_getaddressutxos(&U,coinaddr,isCC,skipcount)) > 0 ) + if ( (slen= NSPV_getaddressutxos(&U,coinaddr,isCC,skipcount,filter)) > 0 ) { response.resize(1 + slen); response[0] = NSPV_UTXOSRESP; @@ -585,23 +591,29 @@ void komodo_nSPVreq(CNode *pfrom,std::vector request) // received a req { if ( timestamp > pfrom->prevtimes[ind] ) { - struct NSPV_txidsresp T; char coinaddr[64]; - if ( len < 64+5 && (request[1] == len-3 || request[1] == len-7) ) + struct NSPV_txidsresp T; + if ( len < 64+5 && (request[1] == len-3 || request[1] == len-7 || request[1] == len-11) ) { - int32_t skipcount = 0; uint8_t isCC = 0; + int32_t skipcount = 0; char coinaddr[64]; uint32_t filter; uint8_t isCC = 0; memcpy(coinaddr,&request[2],request[1]); coinaddr[request[1]] = 0; if ( request[1] == len-3 ) isCC = (request[len-1] != 0); - else + else if ( request[1] == len-7 ) { isCC = (request[len-5] != 0); iguana_rwnum(0,&request[len-4],sizeof(skipcount),&skipcount); } + else + { + isCC = (request[len-9] != 0); + iguana_rwnum(0,&request[len-4],sizeof(skipcount),&skipcount); + iguana_rwnum(0,&request[len-4],sizeof(filter),&filter); + } //if ( isCC != 0 ) - fprintf(stderr,"%s isCC.%d skipcount.%d\n",coinaddr,isCC,skipcount); + fprintf(stderr,"txids %s isCC.%d skipcount.%d filter.%d\n",coinaddr,isCC,skipcount,filter); memset(&T,0,sizeof(T)); - if ( (slen= NSPV_getaddresstxids(&T,coinaddr,isCC,skipcount)) > 0 ) + if ( (slen= NSPV_getaddresstxids(&T,coinaddr,isCC,skipcount,filter)) > 0 ) { //fprintf(stderr,"slen.%d\n",slen); response.resize(1 + slen); diff --git a/src/komodo_nSPV_superlite.h b/src/komodo_nSPV_superlite.h index e9c0c20b6..d7f11c41b 100644 --- a/src/komodo_nSPV_superlite.h +++ b/src/komodo_nSPV_superlite.h @@ -403,6 +403,7 @@ UniValue NSPV_utxosresp_json(struct NSPV_utxosresp *ptr) result.push_back(Pair("balance",(double)ptr->total/COIN)); if ( ASSETCHAINS_SYMBOL[0] == 0 ) result.push_back(Pair("interest",(double)ptr->interest/COIN)); + result.push_back(Pair("filter",(int64_t)ptr->filter)); result.push_back(Pair("lastpeer",NSPV_lastpeer)); return(result); } @@ -433,6 +434,7 @@ UniValue NSPV_txidsresp_json(struct NSPV_txidsresp *ptr) result.push_back(Pair("isCC",ptr->CCflag)); result.push_back(Pair("height",(int64_t)ptr->nodeheight)); result.push_back(Pair("numtxids",(int64_t)ptr->numtxids)); + result.push_back(Pair("filter",(int64_t)ptr->filter)); result.push_back(Pair("lastpeer",NSPV_lastpeer)); return(result); } @@ -580,7 +582,7 @@ uint32_t NSPV_blocktime(int32_t hdrheight) return(0); } -UniValue NSPV_addressutxos(char *coinaddr,int32_t CCflag,int32_t skipcount) +UniValue NSPV_addressutxos(char *coinaddr,int32_t CCflag,int32_t skipcount,int32_t filter) { UniValue result(UniValue::VOBJ); uint8_t msg[512]; int32_t i,iter,slen,len = 0; //fprintf(stderr,"utxos %s NSPV addr %s\n",coinaddr,NSPV_address.c_str()); @@ -601,6 +603,7 @@ UniValue NSPV_addressutxos(char *coinaddr,int32_t CCflag,int32_t skipcount) memcpy(&msg[len],coinaddr,slen), len += slen; msg[len++] = (CCflag != 0); len += iguana_rwnum(1,&msg[len],sizeof(skipcount),&skipcount); + len += iguana_rwnum(1,&msg[len],sizeof(filter),&filter); for (iter=0; iter<3; iter++) if ( NSPV_req(0,msg,len,NODE_ADDRINDEX,msg[0]>>1) != 0 ) { @@ -617,7 +620,7 @@ UniValue NSPV_addressutxos(char *coinaddr,int32_t CCflag,int32_t skipcount) return(result); } -UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount) +UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount,int32_t filter) { 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 ) @@ -637,6 +640,7 @@ UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount) memcpy(&msg[len],coinaddr,slen), len += slen; msg[len++] = (CCflag != 0); len += iguana_rwnum(1,&msg[len],sizeof(skipcount),&skipcount); + len += iguana_rwnum(1,&msg[len],sizeof(filter),&filter); //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 c8a6748e3..b0901d813 100644 --- a/src/komodo_nSPV_wallet.h +++ b/src/komodo_nSPV_wallet.h @@ -514,13 +514,15 @@ void NSPV_txids2CCtxids(struct NSPV_txidsresp *ptr,std::vector > &outputs,char *coinaddr,bool ccflag) { - NSPV_addressutxos(coinaddr,ccflag,0); + int32_t filter = 0; + NSPV_addressutxos(coinaddr,ccflag,0,filter); NSPV_utxos2CCunspents(&NSPV_utxosresult,outputs); } void NSPV_CCtxids(std::vector > &txids,char *coinaddr,bool ccflag) { - NSPV_addresstxids(coinaddr,ccflag,0); + int32_t filter = 0; + NSPV_addresstxids(coinaddr,ccflag,0,filter); NSPV_txids2CCtxids(&NSPV_txidsresult,txids); } diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index d8bed23dd..5fa7dee9d 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -976,8 +976,8 @@ extern int32_t KOMODO_NSPV; 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); -UniValue NSPV_addressutxos(char *coinaddr,int32_t CCflag,int32_t skipcount); +UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount,int32_t filter); +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); UniValue NSPV_spend(char *srcaddr,char *destaddr,int64_t satoshis); @@ -1028,7 +1028,7 @@ UniValue nspv_listunspent(const UniValue& params, bool fHelp) if ( params.size() == 0 ) { if ( NSPV_address.size() != 0 ) - return(NSPV_addressutxos((char *)NSPV_address.c_str(),0,0)); + return(NSPV_addressutxos((char *)NSPV_address.c_str(),0,0,0)); else throw runtime_error("nspv_listunspent [address [isCC [skipcount]]]\n"); } if ( params.size() >= 1 ) @@ -1037,7 +1037,7 @@ UniValue nspv_listunspent(const UniValue& params, bool fHelp) CCflag = atoi((char *)params[1].get_str().c_str()); if ( params.size() == 3 ) skipcount = atoi((char *)params[2].get_str().c_str()); - return(NSPV_addressutxos((char *)params[0].get_str().c_str(),CCflag,skipcount)); + return(NSPV_addressutxos((char *)params[0].get_str().c_str(),CCflag,skipcount,0)); } else throw runtime_error("nspv_listunspent [address [isCC [skipcount]]]\n"); } @@ -1073,7 +1073,7 @@ UniValue nspv_listtransactions(const UniValue& params, bool fHelp) if ( params.size() == 0 ) { if ( NSPV_address.size() != 0 ) - return(NSPV_addresstxids((char *)NSPV_address.c_str(),0,0)); + return(NSPV_addresstxids((char *)NSPV_address.c_str(),0,0,0)); else throw runtime_error("nspv_listtransactions [address [isCC [skipcount]]]\n"); } if ( params.size() >= 1 ) @@ -1083,7 +1083,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)); + return(NSPV_addresstxids((char *)params[0].get_str().c_str(),CCflag,skipcount,0)); } else throw runtime_error("nspv_listtransactions [address [isCC [skipcount]]]\n"); }