Skip count

This commit is contained in:
jl777
2019-07-13 04:07:32 -11:00
parent ff034b0c12
commit 95fb3ae324

View File

@@ -139,7 +139,7 @@ int32_t NSPV_getinfo(struct NSPV_inforesp *ptr,int32_t reqheight)
} else return(-1); } else return(-1);
} }
int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC) // check mempool int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC,int32_t skipcount) // check mempool
{ {
int64_t total = 0,interest=0; uint32_t locktime; int32_t tipheight,maxlen,txheight,n = 0,len = 0; int64_t total = 0,interest=0; uint32_t locktime; int32_t tipheight,maxlen,txheight,n = 0,len = 0;
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs; std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
@@ -155,28 +155,31 @@ int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC
ptr->utxos = (struct NSPV_utxoresp *)calloc(ptr->numutxos,sizeof(*ptr->utxos)); ptr->utxos = (struct NSPV_utxoresp *)calloc(ptr->numutxos,sizeof(*ptr->utxos));
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
{ {
ptr->utxos[n].txid = it->first.txhash; // if gettxout is != null to handle mempool
ptr->utxos[n].vout = (int32_t)it->first.index;
ptr->utxos[n].satoshis = it->second.satoshis;
ptr->utxos[n].height = it->second.blockHeight;
if ( ASSETCHAINS_SYMBOL[0] == 0 && it->second.satoshis >= 10*COIN )
{ {
ptr->utxos[n].extradata = komodo_accrued_interest(&txheight,&locktime,ptr->utxos[n].txid,ptr->utxos[n].vout,ptr->utxos[n].height,ptr->utxos[n].satoshis,tipheight); if ( n >= skipcount )
interest += ptr->utxos[n].extradata; {
ptr->utxos[n].txid = it->first.txhash;
ptr->utxos[n].vout = (int32_t)it->first.index;
ptr->utxos[n].satoshis = it->second.satoshis;
ptr->utxos[n].height = it->second.blockHeight;
if ( ASSETCHAINS_SYMBOL[0] == 0 && it->second.satoshis >= 10*COIN )
{
ptr->utxos[n].extradata = komodo_accrued_interest(&txheight,&locktime,ptr->utxos[n].txid,ptr->utxos[n].vout,ptr->utxos[n].height,ptr->utxos[n].satoshis,tipheight);
interest += ptr->utxos[n].extradata;
}
total += it->second.satoshis;
}
n++;
} }
total += it->second.satoshis;
n++;
} }
if ( len < maxlen ) if ( len < maxlen )
{ {
len = (int32_t)(sizeof(*ptr) + sizeof(*ptr->utxos)*ptr->numutxos - sizeof(ptr->utxos)); len = (int32_t)(sizeof(*ptr) + sizeof(*ptr->utxos)*ptr->numutxos - sizeof(ptr->utxos));
//fprintf(stderr,"getaddressutxos for %s -> n.%d:%d total %.8f interest %.8f len.%d\n",coinaddr,n,ptr->numutxos,dstr(total),dstr(interest),len); //fprintf(stderr,"getaddressutxos for %s -> n.%d:%d total %.8f interest %.8f len.%d\n",coinaddr,n,ptr->numutxos,dstr(total),dstr(interest),len);
if ( n == ptr->numutxos ) ptr->total = total;
{ ptr->interest = interest;
ptr->total = total; return(len);
ptr->interest = interest;
return(len);
}
} }
} }
if ( ptr->utxos != 0 ) if ( ptr->utxos != 0 )
@@ -185,7 +188,7 @@ int32_t NSPV_getaddressutxos(struct NSPV_utxosresp *ptr,char *coinaddr,bool isCC
return(0); return(0);
} }
int32_t NSPV_getaddresstxids(struct NSPV_txidsresp *ptr,char *coinaddr,bool isCC) int32_t NSPV_getaddresstxids(struct NSPV_txidsresp *ptr,char *coinaddr,bool isCC,int32_t skipcount)
{ {
int32_t maxlen,txheight,n = 0,len = 0; int32_t maxlen,txheight,n = 0,len = 0;
std::vector<std::pair<CAddressIndexKey, CAmount> > txids; std::vector<std::pair<CAddressIndexKey, CAmount> > txids;
@@ -197,20 +200,21 @@ int32_t NSPV_getaddresstxids(struct NSPV_txidsresp *ptr,char *coinaddr,bool isCC
ptr->CCflag = isCC; ptr->CCflag = isCC;
if ( (ptr->numtxids= (int32_t)txids.size()) >= 0 && ptr->numtxids < maxlen ) if ( (ptr->numtxids= (int32_t)txids.size()) >= 0 && ptr->numtxids < maxlen )
{ {
// scan mempool add to end
ptr->txids = (struct NSPV_txidresp *)calloc(ptr->numtxids,sizeof(*ptr->txids)); ptr->txids = (struct NSPV_txidresp *)calloc(ptr->numtxids,sizeof(*ptr->txids));
for (std::vector<std::pair<CAddressIndexKey, CAmount> >::const_iterator it=txids.begin(); it!=txids.end(); it++) for (std::vector<std::pair<CAddressIndexKey, CAmount> >::const_iterator it=txids.begin(); it!=txids.end(); it++)
{ {
ptr->txids[n].txid = it->first.txhash; if ( n >= skipcount )
ptr->txids[n].vout = (int32_t)it->first.index; {
ptr->txids[n].satoshis = (int64_t)it->second; ptr->txids[n].txid = it->first.txhash;
ptr->txids[n].height = (int64_t)it->first.blockHeight; ptr->txids[n].vout = (int32_t)it->first.index;
ptr->txids[n].satoshis = (int64_t)it->second;
ptr->txids[n].height = (int64_t)it->first.blockHeight;
}
n++; n++;
} }
if ( len < maxlen ) len = (int32_t)(sizeof(*ptr) + sizeof(*ptr->txids)*ptr->numtxids - sizeof(ptr->txids));
{ return(len);
len = (int32_t)(sizeof(*ptr) + sizeof(*ptr->txids)*ptr->numtxids - sizeof(ptr->txids));
return(len);
}
} }
if ( ptr->txids != 0 ) if ( ptr->txids != 0 )
free(ptr->txids); free(ptr->txids);
@@ -403,17 +407,22 @@ void komodo_nSPVreq(CNode *pfrom,std::vector<uint8_t> request) // received a req
if ( timestamp > pfrom->prevtimes[ind] ) if ( timestamp > pfrom->prevtimes[ind] )
{ {
struct NSPV_utxosresp U; char coinaddr[64]; struct NSPV_utxosresp U; char coinaddr[64];
if ( len < 64 && (request[1] == len-2 || request[1] == len-3) ) if ( len < 64 && (request[1] == len-3 || request[1] == len-7) )
{ {
uint8_t isCC = 0; int32_t skipcount = 0; uint8_t isCC = 0;
memcpy(coinaddr,&request[2],request[1]); memcpy(coinaddr,&request[2],request[1]);
coinaddr[request[1]] = 0; coinaddr[request[1]] = 0;
if ( request[1] == len-3 ) if ( request[1] == len-3 )
isCC = (request[len-1] != 0); isCC = (request[len-1] != 0);
else
{
isCC = (request[len-5] != 0);
iguana_rwnum(0,&request[len-4],sizeof(skipcount),&skipcount);
}
if ( isCC != 0 ) if ( isCC != 0 )
fprintf(stderr,"%s isCC.%d\n",coinaddr,isCC); fprintf(stderr,"%s isCC.%d skipcount.%d\n",coinaddr,isCC,skipcount);
memset(&U,0,sizeof(U)); memset(&U,0,sizeof(U));
if ( (slen= NSPV_getaddressutxos(&U,coinaddr,isCC)) > 0 ) if ( (slen= NSPV_getaddressutxos(&U,coinaddr,isCC,skipcount)) > 0 )
{ {
response.resize(1 + slen); response.resize(1 + slen);
response[0] = NSPV_UTXOSRESP; response[0] = NSPV_UTXOSRESP;
@@ -432,17 +441,22 @@ void komodo_nSPVreq(CNode *pfrom,std::vector<uint8_t> request) // received a req
if ( timestamp > pfrom->prevtimes[ind] ) if ( timestamp > pfrom->prevtimes[ind] )
{ {
struct NSPV_txidsresp T; char coinaddr[64]; struct NSPV_txidsresp T; char coinaddr[64];
if ( len < 64 && (request[1] == len-2 || request[1] == len-3) ) if ( len < 64 && (request[1] == len-3 || request[1] == len-7) )
{ {
uint8_t isCC = 0; int32_t skipcount = 0; uint8_t isCC = 0;
memcpy(coinaddr,&request[2],request[1]); memcpy(coinaddr,&request[2],request[1]);
coinaddr[request[1]] = 0; coinaddr[request[1]] = 0;
if ( request[1] == len-3 ) if ( request[1] == len-3 )
isCC = (request[len-1] != 0); isCC = (request[len-1] != 0);
if ( isCC != 0 ) else
fprintf(stderr,"%s isCC.%d\n",coinaddr,isCC); {
isCC = (request[len-5] != 0);
iguana_rwnum(0,&request[len-4],sizeof(skipcount),&skipcount);
}
//if ( isCC != 0 )
fprintf(stderr,"%s isCC.%d skipcount.%d\n",coinaddr,isCC,skipcount);
memset(&T,0,sizeof(T)); memset(&T,0,sizeof(T));
if ( (slen= NSPV_getaddresstxids(&T,coinaddr,isCC)) > 0 ) if ( (slen= NSPV_getaddresstxids(&T,coinaddr,isCC,skipcount)) > 0 )
{ {
response.resize(1 + slen); response.resize(1 + slen);
response[0] = NSPV_TXIDSRESP; response[0] = NSPV_TXIDSRESP;