From 7e1dcb383cdb1b064e583b87b2e806b413e7b8f4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 May 2016 18:31:26 -0500 Subject: [PATCH] test --- crypto777/inet.c | 3 ++- iguana/exchanges777.h | 2 +- iguana/iguana777.c | 14 +++++++++----- iguana/iguana777.h | 6 ++++-- iguana/iguana_accept.c | 31 +++++++++++++++++++++++-------- iguana/iguana_exchanges.c | 2 -- iguana/iguana_instantdex.c | 28 +++++++++++++++++++++++++++- iguana/iguana_peers.c | 2 ++ 8 files changed, 68 insertions(+), 20 deletions(-) diff --git a/crypto777/inet.c b/crypto777/inet.c index 4ca687a67..87113f392 100755 --- a/crypto777/inet.c +++ b/crypto777/inet.c @@ -404,7 +404,8 @@ uint64_t calc_ipbits(char *ip_port) expand_ipbits(ipaddr2,ipbits); if ( ipbits != 0 && strcmp(ipaddr,ipaddr2) != 0 ) { - printf("calc_ipbits error: (%s) -> %llx -> (%s)\n",ip_port,(long long)ipbits,ipaddr);//, getchar(); + if ( ipaddr[0] != 0 ) + printf("calc_ipbits error: (%s) -> %llx -> (%s)\n",ip_port,(long long)ipbits,ipaddr);//, getchar(); ipbits = 0; } } diff --git a/iguana/exchanges777.h b/iguana/exchanges777.h index c67d45551..0cd0f1a90 100755 --- a/iguana/exchanges777.h +++ b/iguana/exchanges777.h @@ -108,7 +108,7 @@ struct exchange_request struct instantdex_offer { char base[24],rel[24]; - uint64_t price64,basevolume64,offer64; + int64_t price64,basevolume64; uint64_t offer64; uint32_t expiration,nonce; char myside,acceptdir,minperc,pad; }; diff --git a/iguana/iguana777.c b/iguana/iguana777.c index c1428f139..891523145 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -15,6 +15,7 @@ #include "iguana777.h" +#include "exchanges777.h" #include "secp256k1/include/secp256k1.h" #include "secp256k1/include/secp256k1_schnorr.h" #include "secp256k1/include/secp256k1_rangeproof.h" @@ -141,10 +142,11 @@ double iguana_metric(struct iguana_peer *addr,uint32_t now,double decay) return(metric); } -int32_t iguana_peermetrics(struct iguana_info *coin) +int32_t iguana_peermetrics(struct supernet_info *myinfo,struct iguana_info *coin) { - int32_t i,ind,n; double *sortbuf,sum; uint32_t now; struct iguana_peer *addr,*slowest = 0; + struct exchange_info *exchange; int32_t i,ind,n; double *sortbuf,sum; uint32_t now; struct iguana_peer *addr,*slowest = 0; //printf("peermetrics\n"); + exchange = exchanges777_find("bitcoin"); sortbuf = mycalloc('s',coin->MAXPEERS,sizeof(double)*2); coin->peers.mostreceived = 0; now = (uint32_t)time(NULL); @@ -159,6 +161,8 @@ int32_t iguana_peermetrics(struct iguana_info *coin) //printf("[%.0f %.0f] ",addr->recvblocks,addr->recvtotal); sortbuf[n*2 + 0] = iguana_metric(addr,now,.995); sortbuf[n*2 + 1] = i; + if ( exchange != 0 && addr->supernet != 0 ) + instantdex_inv2data(myinfo,coin,addr,exchange); n++; } if ( n > 0 ) @@ -213,10 +217,10 @@ void *iguana_kviAddriterator(struct iguana_info *coin,struct iguanakv *kv,struct return(0); } -uint32_t iguana_updatemetrics(struct iguana_info *coin) +uint32_t iguana_updatemetrics(struct supernet_info *myinfo,struct iguana_info *coin) { char fname[512],tmpfname[512],oldfname[512],ipaddr[64]; int32_t i,j; struct iguana_peer *addr,*tmpaddr; FILE *fp; - iguana_peermetrics(coin); + iguana_peermetrics(myinfo,coin); sprintf(fname,"%s/%s_peers.txt",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); sprintf(oldfname,"%s/%s_oldpeers.txt",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(oldfname); sprintf(tmpfname,"%s/%s/peers.txt",GLOBAL_TMPDIR,coin->symbol), OS_compatible_path(tmpfname); @@ -711,7 +715,7 @@ void iguana_coinloop(void *arg) if ( now > coin->peers.lastmetrics+10 ) { //fprintf(stderr,"metrics\n"); - coin->peers.lastmetrics = iguana_updatemetrics(coin); // ranks peers + coin->peers.lastmetrics = iguana_updatemetrics(myinfo,coin); // ranks peers } if ( coin->longestchain+10000 > coin->blocks.maxbits ) iguana_recvalloc(coin,coin->longestchain + 100000); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 94447ba8f..164fe7b58 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -548,7 +548,7 @@ struct bitcoin_spend // peers int32_t iguana_verifypeer(struct iguana_info *coin,void *key,void *value,int32_t itemind,int32_t itemsize); -int32_t iguana_peermetrics(struct iguana_info *coin); +int32_t iguana_peermetrics(struct supernet_info *myinfo,struct iguana_info *coin); void iguana_peersloop(void *arg); int32_t iguana_queue_send(struct iguana_info *coin,struct iguana_peer *addr,int32_t delay,uint8_t *serialized,char *cmd,int32_t len,int32_t getdatablock,int32_t forceflag); uint32_t iguana_rwiAddrind(struct iguana_info *coin,int32_t rwflag,struct iguana_iAddr *iA,uint32_t ind); @@ -562,7 +562,7 @@ void iguana_shutdownpeers(struct iguana_info *coin,int32_t forceflag); void iguana_acceptloop(void *args); void iguana_recvloop(void *args); int32_t iguana_send(struct iguana_info *coin,struct iguana_peer *addr,uint8_t *serialized,int32_t len); -uint32_t iguana_updatemetrics(struct iguana_info *coin); +uint32_t iguana_updatemetrics(struct supernet_info *myinfo,struct iguana_info *coin); void *iguana_peeralloc(struct iguana_info *coin,struct iguana_peer *addr,int32_t datalen); int64_t iguana_peerfree(struct iguana_info *coin,struct iguana_peer *addr,void *ptr,int32_t datalen); int64_t iguana_peerallocated(struct iguana_info *coin,struct iguana_peer *addr); @@ -975,6 +975,8 @@ int32_t iguana_parsevinobj(struct supernet_info *myinfo,struct iguana_info *coin int64_t iguana_availunspents(struct supernet_info *myinfo,uint64_t **unspentsp,int32_t *nump,struct iguana_info *coin,int32_t minconf,char *account,void *ptr,int32_t maxsize); char *iguana_signunspents(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *signedtxidp,int32_t *completedp,cJSON *txobj,uint64_t satoshis,char *changeaddr,uint64_t txfee,uint64_t *unspents,int32_t num); bits256 iguana_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); +int32_t iguana_inv2packet(uint8_t *serialized,int32_t maxsize,int32_t type,bits256 *hashes,int32_t n); +int32_t instantdex_inv2data(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_peer *addr,struct exchange_info *exchange); extern int32_t HDRnet,netBLOCKS; diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 7586bf3bb..609895f95 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -228,14 +228,8 @@ int32_t iguana_process_msgrequestQ(struct supernet_info *myinfo,struct iguana_in { if ( (ap= instantdex_quotefind(myinfo,coin,msg->addr,msg->hash2)) == 0 ) { - if ( GETBIT(ap->peerhas,msg->addr->addrind) == 0 ) - { - if ( (len= instantdex_quoterequest(myinfo,coin,&coin->blockspace[sizeof(struct iguana_msghdr)],sizeof(coin->blockspace),msg->addr,msg->hash2)) > 0 ) - { - iguana_queue_send(coin,msg->addr,0,coin->blockspace,"quote",len,0,0); - SETBIT(ap->peerhas,msg->addr->addrind); - } - } + if ( (len= instantdex_quoterequest(myinfo,coin,&coin->blockspace[sizeof(struct iguana_msghdr)],sizeof(coin->blockspace),msg->addr,msg->hash2)) > 0 ) + iguana_queue_send(coin,msg->addr,0,coin->blockspace,"quote",len,0,0); } } } @@ -263,6 +257,27 @@ int32_t iguana_peerdatarequest(struct iguana_info *coin,struct iguana_peer *addr return(len); } +int32_t iguana_inv2packet(uint8_t *serialized,int32_t maxsize,int32_t type,bits256 *hashes,int32_t n) +{ + int32_t i,len = sizeof(struct iguana_msghdr); uint64_t x = n; + memset(serialized,0,len); + len += iguana_rwvarint(1,&serialized[len],&x); + //for (i=0; i<10; i++) + // printf("%02x ",data[i]); + //printf("x.%d recvlen.%d\n",(int32_t)x,recvlen); + if ( x < IGUANA_MAXINV ) + { + for (i=0; i maxsize ) + return(-1); + return(len); +} + int32_t iguana_peerhdrrequest(struct iguana_info *coin,uint8_t *serialized,int32_t maxsize,struct iguana_peer *addr,bits256 hash2) { int32_t len=0,i,flag=0,height,hdrsi,bundlei,bundlesize,firstvout,retval=-1; struct iguana_block *block; struct iguana_msgblock msgB; bits256 checkhash2; struct iguana_bundle *bp; diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index b9545ceb3..663e15b4e 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -968,8 +968,6 @@ THREE_STRINGS_AND_THREE_INTS(InstantDEX,orderbook,exchange,base,rel,depth,allfie struct exchange_info *ptr; if ( remoteaddr == 0 ) { - if ( myinfo->expiration == 0 ) - return(clonestr("{\"error\":\"need to unlock wallet\"}")); if ( exchange != 0 && exchange[0] != 0 ) { if ( (ptr= exchanges777_info(exchange,1,json,remoteaddr)) != 0 ) diff --git a/iguana/iguana_instantdex.c b/iguana/iguana_instantdex.c index 9c94cb49e..e3570d1c5 100755 --- a/iguana/iguana_instantdex.c +++ b/iguana/iguana_instantdex.c @@ -793,6 +793,32 @@ bits256 instantdex_encodehash(char *base,char *rel,int64_t price,uint64_t orderi return(encodedhash); } +int32_t instantdex_inv2data(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_peer *addr,struct exchange_info *exchange) +{ + struct instantdex_accept PAD,*ap; uint32_t now,n=0,len; bits256 hashes[100]; uint8_t serialized[100*36 + 1024]; + if ( exchange == 0 ) + return(0); + now = (uint32_t)time(NULL); + memset(&PAD,0,sizeof(PAD)); + queue_enqueue("acceptableQ",&exchange->acceptableQ,&PAD.DL,0); + while ( (ap= queue_dequeue(&exchange->acceptableQ,0)) != 0 && ap != &PAD ) + { + if ( now < ap->offer.expiration && ap->dead == 0 ) + { + if ( n < sizeof(hashes)/sizeof(*hashes) && GETBIT(ap->peerhas,addr->addrind) == 0 ) + hashes[n++] = instantdex_encodehash(ap->offer.base,ap->offer.rel,ap->offer.price64*instantdex_bidaskdir(&ap->offer),ap->orderid); + queue_enqueue("acceptableQ",&exchange->acceptableQ,&ap->DL,0); + } else free(ap); + } + if ( n > 0 ) + { + len = iguana_inv2packet(serialized,sizeof(serialized),MSG_QUOTE,hashes,n); + printf("Send inv2[%d] -> (%s)\n",n,addr->ipaddr); + return(iguana_queue_send(coin,addr,0,serialized,"inv2",len,0,0)); + } + return(-1); +} + struct instantdex_accept *instantdex_quotefind(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_peer *addr,bits256 encodedhash) { char base[9],rel[9]; int64_t pricetoshis; uint64_t orderid; @@ -820,7 +846,7 @@ int32_t instantdex_quote(struct supernet_info *myinfo,struct iguana_info *coin,s orderhash = instantdex_rwoffer(0,&checklen,serialized,&A.offer); if ( checklen == recvlen ) { - encodedhash = instantdex_encodehash(A.offer.base,A.offer.rel,A.offer.price64,A.orderid); + encodedhash = instantdex_encodehash(A.offer.base,A.offer.rel,A.offer.price64 * instantdex_bidaskdir(&A.offer),A.orderid); if ( (ap= instantdex_quotefind(myinfo,coin,addr,encodedhash)) == 0 ) { init_hexbytes_noT(hexstr,serialized,recvlen); diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index f530af97d..7fac071a7 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -819,6 +819,8 @@ uint32_t iguana_possible_peer(struct iguana_info *coin,char *ipaddr) return((uint32_t)time(NULL)); if ( strncmp("0.0.0",ipaddr,5) != 0 && strcmp("0.0.255.255",ipaddr) != 0 && strcmp("1.0.0.0",ipaddr) != 0 ) { + if ( ipaddr[strlen(ipaddr)-1] == ':' ) + ipaddr[strlen(ipaddr)-1] = 0; if ( (ipbits= calc_ipbits(ipaddr)) != 0 ) { expand_ipbits(checkaddr,ipbits);