diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 7db343df6..5c52bdbd0 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -149,21 +149,24 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) { - if ( (pushport= juint(argjson,"push")) == 0 ) - pushport = argport + 1; - if ( (subport= juint(argjson,"sub")) == 0 ) - subport = argport + 2; - if ( (peer= LP_peerfind((uint32_t)calc_ipbits(ipaddr),argport)) != 0 ) + if ( strcmp(ipaddr,"127.0.0.1") != 0 && port >= 1000 ) { - if ( (otherpeers= jint(argjson,"numpeers")) > peer->numpeers ) - peer->numpeers = otherpeers; - if ( (othernumutxos= jint(argjson,"numutxos")) > peer->numutxos ) + if ( (pushport= juint(argjson,"push")) == 0 ) + pushport = argport + 1; + if ( (subport= juint(argjson,"sub")) == 0 ) + subport = argport + 2; + if ( (peer= LP_peerfind((uint32_t)calc_ipbits(ipaddr),argport)) != 0 ) { - printf("change.(%s) numutxos.%d -> %d mynumutxos.%d\n",peer->ipaddr,peer->numutxos,othernumutxos,LP_mypeer->numutxos); - peer->numutxos = othernumutxos; - } - //printf("peer.(%s) found (%d %d) (%d %d) (%s)\n",peer->ipaddr,peer->numpeers,peer->numutxos,otherpeers,othernumutxos,jprint(argjson,0)); - } else LP_addpeer(LP_mypeer,LP_mypubsock,ipaddr,argport,pushport,subport,jdouble(argjson,"profit"),jint(argjson,"numpeers"),jint(argjson,"numutxos")); + if ( (otherpeers= jint(argjson,"numpeers")) > peer->numpeers ) + peer->numpeers = otherpeers; + if ( (othernumutxos= jint(argjson,"numutxos")) > peer->numutxos ) + { + printf("change.(%s) numutxos.%d -> %d mynumutxos.%d\n",peer->ipaddr,peer->numutxos,othernumutxos,LP_mypeer->numutxos); + peer->numutxos = othernumutxos; + } + //printf("peer.(%s) found (%d %d) (%d %d) (%s)\n",peer->ipaddr,peer->numpeers,peer->numutxos,otherpeers,othernumutxos,jprint(argjson,0)); + } else LP_addpeer(LP_mypeer,LP_mypubsock,ipaddr,argport,pushport,subport,jdouble(argjson,"profit"),jint(argjson,"numpeers"),jint(argjson,"numutxos")); + } if ( strcmp(method,"getpeers") == 0 ) retstr = LP_peers(); else if ( strcmp(method,"getutxos") == 0 && (coin= jstr(argjson,"coin")) != 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 5e95b876d..cde7e1707 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -257,12 +257,14 @@ int32_t LP_peersparse(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipa subport = argport + 2; argipbits = (uint32_t)calc_ipbits(argipaddr); if ( (peer= LP_peerfind(argipbits,argport)) == 0 ) - peer = LP_addpeer(mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); - if ( peer != 0 ) { - peer->lasttime = now; - if ( strcmp(argipaddr,destipaddr) == 0 && destport == argport && peer->numpeers < n ) - peer->numpeers = n; + peer = LP_addpeer(mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); + if ( peer != 0 ) + { + peer->lasttime = now; + if ( strcmp(argipaddr,destipaddr) == 0 && destport == argport && peer->numpeers < n ) + peer->numpeers = n; + } } } } @@ -351,24 +353,27 @@ void LP_peersquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr peer = LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport); if ( peer != 0 && peer->errors > 0 ) return; - if ( (retstr= issue_LP_getpeers(destipaddr,destport,myipaddr,myport,myprofit,mypeer->numpeers,mypeer->numutxos)) != 0 ) + if ( (retstr= issue_LP_getpeers(destipaddr,destport,myipaddr,myport,myprofit,mypeer!=0?mypeer->numpeers:0,mypeer!=0?mypeer->numutxos:0)) != 0 ) { //printf("got.(%s)\n",retstr); now = (uint32_t)time(NULL); LP_peersparse(mypeer,mypubsock,destipaddr,destport,retstr,now); free(retstr); - HASH_ITER(hh,LP_peerinfos,peer,tmp) + if ( mypeer != 0 ) { - if ( peer->lasttime != now ) + HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("{%s:%u %.6f} ",peer->ipaddr,peer->port,peer->profitmargin); - flag++; - if ( (retstr= issue_LP_notify(destipaddr,destport,peer->ipaddr,peer->port,peer->profitmargin,peer->numpeers,0)) != 0 ) - free(retstr); + if ( peer->lasttime != now ) + { + printf("{%s:%u %.6f} ",peer->ipaddr,peer->port,peer->profitmargin); + flag++; + if ( (retstr= issue_LP_notify(destipaddr,destport,peer->ipaddr,peer->port,peer->profitmargin,peer->numpeers,0)) != 0 ) + free(retstr); + } } + if ( flag != 0 ) + printf(" <- missing peers\n"); } - if ( flag != 0 ) - printf(" <- missing peers\n"); } else if ( peer != 0 ) peer->errors++; } @@ -638,7 +643,7 @@ struct iguana_info *LP_coinfind(char *symbol) return(coin); } -uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symbol,char *passphrase,char *wifstr) +uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symbol,char *passphrase,char *wifstr,int32_t amclient) { char coinaddr[64],*script; cJSON *array,*item,*retjson; bits256 txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; bits256 privkey,pubkey; uint8_t pubkey33[33],tmptype,rmd160[20]; struct iguana_info *coin = LP_coinfind(symbol); if ( coin == 0 ) @@ -659,7 +664,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb } bitcoin_addr2rmd160(&tmptype,rmd160,coinaddr); LP_privkeyadd(privkey,rmd160); - if ( (array= LP_listunspent(symbol,coinaddr)) != 0 ) + if ( amclient == 0 && (array= LP_listunspent(symbol,coinaddr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { @@ -707,132 +712,157 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb return(total); } -void LPinit(uint16_t myport,uint16_t mypull,uint16_t mypub,double profitmargin,char *passphrase) +void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,int32_t pullsock,uint16_t myport,int32_t amclient,char *passphrase,double profitmargin) { - char *myipaddr=0,*retstr; long filesize,n; int32_t len,timeout,maxsize,recvsize,nonz,i,lastn,pullsock=-1,pubsock=-1; struct LP_peerinfo *peer,*tmp,*mypeer=0; char pushaddr[128],subaddr[128]; void *ptr; cJSON *argjson; - OS_randombytes((void *)&n,sizeof(n)); - srand((int32_t)n); - portable_mutex_init(&LP_peermutex); - portable_mutex_init(&LP_utxomutex); - portable_mutex_init(&LP_commandmutex); - if ( profitmargin == 0. || profitmargin == 0.01 ) - { - profitmargin = 0.01 + (double)(rand() % 100)/10000; - printf("default profit margin %f\n",profitmargin); - } - if ( system("curl -s4 checkip.amazonaws.com > /tmp/myipaddr") == 0 ) + char *retstr; int32_t i,len,recvsize,nonz,lastn; struct LP_peerinfo *peer,*tmp; void *ptr; cJSON *argjson; + for (i=0; i>>>>>>>> myipaddr.%s (%s %s)\n",myipaddr,pushaddr,subaddr); - if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) - { - if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) - { - timeout = 10; - nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 1; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 1; - maxsize = 1024 * 1024; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); - } - else - { - printf("error binding to (%s).%d (%s).%d\n",pushaddr,pullsock,subaddr,pubsock); - if ( pullsock >= 0 ) - nn_close(pullsock), pullsock = -1; - if ( pubsock >= 0 ) - nn_close(pubsock), pubsock = -1; - } - } else printf("error getting sockets %d %d\n",pullsock,pubsock); - LP_mypubsock = pubsock; - LP_mypeer = mypeer = LP_addpeer(mypeer,pubsock,myipaddr,myport,0,0,profitmargin,0,0); - //printf("my ipaddr.(%s) peers.(%s)\n",ipaddr,retstr!=0?retstr:""); - for (i=0; i 25 ) - continue; - LP_peersquery(mypeer,pubsock,default_LPnodes[i],myport,myipaddr,myport,profitmargin); - } - } else printf("error getting myipaddr\n"); - } else printf("error issuing curl\n"); - if ( myipaddr == 0 || mypeer == 0 ) - { - printf("couldnt get myipaddr or null mypeer.%p\n",mypeer); - exit(-1); + if ( amclient == 0 && (rand() % 100) > 25 ) + continue; + LP_peersquery(mypeer,pubsock,default_LPnodes[i],myport,mypeer!=0?mypeer->ipaddr:"127.0.0.1",myport,profitmargin); } if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); exit(-1); } - LP_coinfind("BTC"); LP_coinfind("LTC"); LP_coinfind("KMD"); LP_coinfind("USD"); LP_coinfind("REVS"); LP_coinfind("JUMBLR"); - LP_privkey_init(mypeer,pubsock,"BTC",passphrase,""); - LP_privkey_init(mypeer,pubsock,"KMD",passphrase,""); - printf("utxos.(%s)\n",LP_utxos(mypeer,"",10000)); - while ( 1 ) + LP_coinfind("BTC"); LP_coinfind("LTC"); LP_coinfind("KMD"); + LP_coinfind("USD"); LP_coinfind("REVS"); LP_coinfind("JUMBLR"); + if ( amclient != 0 ) { - nonz = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { - if ( peer->numpeers != mypeer->numpeers || (rand() % 10) == 0 ) - { - if ( peer->numpeers != mypeer->numpeers ) - printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,mypeer->numpeers); - if ( strcmp(peer->ipaddr,myipaddr) != 0 ) - LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport,profitmargin); - } - if ( peer->numutxos != mypeer->numutxos ) + printf("%s:%u ",peer->ipaddr,peer->port); + } + printf("peers\n"); + while ( 1 ) + { + sleep(1); + } + } + else + { + LP_privkey_init(mypeer,pubsock,"BTC",passphrase,"",amclient); + LP_privkey_init(mypeer,pubsock,"KMD",passphrase,"",amclient); + while ( 1 ) + { + nonz = 0; + HASH_ITER(hh,LP_peerinfos,peer,tmp) { - lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; - if ( lastn < 0 ) - lastn = LP_PROPAGATION_SLACK * 2; - printf("%s numutxos.%d vs %d lastn.%d\n",peer->ipaddr,peer->numutxos,mypeer->numutxos,lastn); - if ( strcmp(peer->ipaddr,myipaddr) != 0 ) - LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,myipaddr,myport,profitmargin); + if ( peer->numpeers != mypeer->numpeers || (rand() % 10) == 0 ) + { + if ( peer->numpeers != mypeer->numpeers ) + printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,mypeer->numpeers); + if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) + LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,mypeer->ipaddr,myport,profitmargin); + } + if ( peer->numutxos != mypeer->numutxos ) + { + lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; + if ( lastn < 0 ) + lastn = LP_PROPAGATION_SLACK * 2; + printf("%s numutxos.%d vs %d lastn.%d\n",peer->ipaddr,peer->numutxos,mypeer->numutxos,lastn); + if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) + LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer->ipaddr,myport,profitmargin); + } + while ( peer->subsock >= 0 && (recvsize= nn_recv(peer->subsock,&ptr,NN_MSG,0)) >= 0 ) + { + nonz++; + if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) + { + portable_mutex_lock(&LP_commandmutex); + if ( (retstr= stats_JSON(argjson,"127.0.0.1",mypubport)) != 0 ) + { + printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + free(retstr); + } + portable_mutex_unlock(&LP_commandmutex); + free_json(argjson); + } else printf("error parsing.(%s)\n",(char *)ptr); + if ( ptr != 0 ) + nn_freemsg(ptr), ptr = 0; + } } - while ( peer->subsock >= 0 && (recvsize= nn_recv(peer->subsock,&ptr,NN_MSG,0)) >= 0 ) + while ( pullsock >= 0 && (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { + len = (int32_t)strlen((char *)ptr) + 1; portable_mutex_lock(&LP_commandmutex); - if ( (retstr= stats_JSON(argjson,"127.0.0.1",mypub)) != 0 ) - { - printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); - free(retstr); - } + LP_command(mypeer,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin); portable_mutex_unlock(&LP_commandmutex); free_json(argjson); - } else printf("error parsing.(%s)\n",(char *)ptr); + } if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } + if ( nonz == 0 ) + sleep(mypeer->numpeers + 1); + } + } +} + +void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient) +{ + char *myipaddr=0; long filesize,n; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128]; + OS_randombytes((void *)&n,sizeof(n)); + srand((int32_t)n); + portable_mutex_init(&LP_peermutex); + portable_mutex_init(&LP_utxomutex); + portable_mutex_init(&LP_commandmutex); + if ( amclient == 0 ) + { + if ( profitmargin == 0. || profitmargin == 0.01 ) + { + profitmargin = 0.01 + (double)(rand() % 100)/100000; + printf("default profit margin %f\n",profitmargin); } - while ( pullsock >= 0 && (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + if ( system("curl -s4 checkip.amazonaws.com > /tmp/myipaddr") == 0 ) { - nonz++; - if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) + if ( (myipaddr= OS_filestr(&filesize,"/tmp/myipaddr")) != 0 && myipaddr[0] != 0 ) { - len = (int32_t)strlen((char *)ptr) + 1; - portable_mutex_lock(&LP_commandmutex); - LP_command(mypeer,mypub,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin); - portable_mutex_unlock(&LP_commandmutex); - free_json(argjson); - } - if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; + n = strlen(myipaddr); + if ( myipaddr[n-1] == '\n' ) + myipaddr[--n] = 0; + pullsock = pubsock = -1; + nanomsg_tcpname(pushaddr,myipaddr,mypullport); + nanomsg_tcpname(subaddr,myipaddr,mypubport); + printf(">>>>>>>>> myipaddr.%s (%s %s)\n",myipaddr,pushaddr,subaddr); + if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) + { + if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) + { + timeout = 10; + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + maxsize = 1024 * 1024; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + } + else + { + printf("error binding to (%s).%d (%s).%d\n",pushaddr,pullsock,subaddr,pubsock); + if ( pullsock >= 0 ) + nn_close(pullsock), pullsock = -1; + if ( pubsock >= 0 ) + nn_close(pubsock), pubsock = -1; + } + } else printf("error getting sockets %d %d\n",pullsock,pubsock); + LP_mypubsock = pubsock; + LP_mypeer = mypeer = LP_addpeer(mypeer,pubsock,myipaddr,myport,0,0,profitmargin,0,0); + //printf("my ipaddr.(%s) peers.(%s)\n",ipaddr,retstr!=0?retstr:""); + } else printf("error getting myipaddr\n"); + } else printf("error issuing curl\n"); + if ( myipaddr == 0 || mypeer == 0 ) + { + printf("couldnt get myipaddr or null mypeer.%p\n",mypeer); + exit(-1); } - if ( nonz == 0 ) - sleep(mypeer->numpeers + 1); + printf("utxos.(%s)\n",LP_utxos(mypeer,"",10000)); } + LP_mainloop(mypeer,mypubport,pubsock,pullsock,myport,amclient,passphrase,profitmargin); } /*#ifdef __APPLE__ diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 99bdb7ada..1ffef2e92 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -798,8 +798,12 @@ void marketmaker(double minask,double maxbid,char *baseaddr,char *reladdr,double void LP_main(void *ptr) { - double profitmargin = 0.01; char *passphrase = ptr; - LPinit(7779,7780,7781,profitmargin,passphrase); + char *passphrase; double profitmargin; cJSON *argjson = ptr; + if ( (passphrase= jstr(argjson,"passphrase")) != 0 ) + { + profitmargin = jdouble(argjson,"profitmargin"); + LPinit(7779,7780,7781,profitmargin,passphrase,jint(argjson,"client")); + } } int main(int argc, const char * argv[]) @@ -809,17 +813,17 @@ int main(int argc, const char * argv[]) cJSON *retjson,*loginjson; int32_t i; if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { - minask = jdouble(retjson,"minask"); - maxbid = jdouble(retjson,"maxbid"); - profitmargin = jdouble(retjson,"profitmargin"); if ( (passphrase= jstr(retjson,"passphrase")) == 0 ) - passphrase = "test"; - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_main,(void *)clonestr(passphrase)) != 0 ) + jaddstr(retjson,"passphrase","test"); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_main,(void *)retjson) != 0 ) { - printf("error launching LP_main %f\n",profitmargin); + printf("error launching LP_main (%s)\n",jprint(retjson,0)); exit(-1); } else printf("(%s) launched.(%s)\n",argv[1],passphrase); getchar(); + profitmargin = jdouble(retjson,"profitmargin"); + minask = jdouble(retjson,"minask"); + maxbid = jdouble(retjson,"maxbid"); maxexposure = jdouble(retjson,"maxexposure"); incrratio = jdouble(retjson,"lotratio"); start_base = jdouble(retjson,"start_base");