Browse Source

Merge pull request #425 from jl777/spvdex

Spvdex
etomic
jl777 7 years ago
committed by GitHub
parent
commit
d44ea1c976
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      crypto777/bitcoind_RPC.c
  2. 2
      crypto777/iguana_utils.c
  3. 5
      iguana/exchanges/LP_commands.c
  4. 2
      iguana/exchanges/LP_include.h
  5. 127
      iguana/exchanges/LP_nativeDEX.c
  6. 6
      iguana/exchanges/LP_network.c
  7. 3
      iguana/exchanges/LP_portfolio.c
  8. 3
      iguana/exchanges/LP_prices.c
  9. 2
      iguana/exchanges/LP_remember.c
  10. 1
      iguana/exchanges/LP_rpc.c
  11. 4
      iguana/exchanges/LP_signatures.c
  12. 2
      iguana/exchanges/LP_transaction.c
  13. 2
      iguana/exchanges/install
  14. 3
      iguana/exchanges/millis
  15. 12
      iguana/exchanges/mnzservers
  16. 32
      iguana/exchanges/stats.c

4
crypto777/bitcoind_RPC.c

@ -55,7 +55,9 @@ char *post_process_bitcoind_RPC(char *debugstr,char *command,char *rpcstr,char *
long i,j,len; long i,j,len;
char *retstr = 0; char *retstr = 0;
cJSON *json,*result,*error; cJSON *json,*result,*error;
usleep(2500); #ifdef FROM_MARKETMAKER
usleep(5000);
#endif
//printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC.%s.[%s]\n",debugstr,command,rpcstr); //printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC.%s.[%s]\n",debugstr,command,rpcstr);
if ( command == 0 || rpcstr == 0 || rpcstr[0] == 0 ) if ( command == 0 || rpcstr == 0 || rpcstr[0] == 0 )
{ {

2
crypto777/iguana_utils.c

@ -303,7 +303,7 @@ struct iguana_thread *iguana_launch(struct iguana_info *coin,char *name,iguana_f
coin->Launched[t->type]++; coin->Launched[t->type]++;
retval = OS_thread_create(&t->handle,NULL,(void *)iguana_launcher,(void *)t); retval = OS_thread_create(&t->handle,NULL,(void *)iguana_launcher,(void *)t);
if ( retval != 0 ) if ( retval != 0 )
printf("error launching %s\n",t->name); printf("error launching %s retval.%d errno.%d\n",t->name,retval,errno);
while ( (t= queue_dequeue(&TerminateQ)) != 0 ) while ( (t= queue_dequeue(&TerminateQ)) != 0 )
{ {
if ( (rand() % 100000) == 0 && coin != 0 ) if ( (rand() % 100000) == 0 && coin != 0 )

5
iguana/exchanges/LP_commands.c

@ -199,6 +199,11 @@ bot_resume(botid)\n\
printf("DEBUG stop\n"); printf("DEBUG stop\n");
exit(0); exit(0);
} }
else if ( strcmp(method,"millis") == 0 )
{
LP_millistats_update(0);
return(clonestr("{\"result\":\"success\"}"));
}
else if ( strcmp(method,"getmessages") == 0 ) else if ( strcmp(method,"getmessages") == 0 )
{ {
if ( (retjson= LP_getmessages(jint(argjson,"firsti"),jint(argjson,"num"))) != 0 ) if ( (retjson= LP_getmessages(jint(argjson,"firsti"),jint(argjson,"num"))) != 0 )

2
iguana/exchanges/LP_include.h

@ -54,7 +54,7 @@ void emscripten_usleep(int32_t x); // returns immediate, no sense for sleeping
#define DPOW_MIN_ASSETCHAIN_SIGS 11 #define DPOW_MIN_ASSETCHAIN_SIGS 11
#define LP_ENCRYPTED_MAXSIZE (4096 + 2 + crypto_box_NONCEBYTES + crypto_box_ZEROBYTES) #define LP_ENCRYPTED_MAXSIZE (4096 + 2 + crypto_box_NONCEBYTES + crypto_box_ZEROBYTES)
#define LP_MAXPUBKEY_ERRORS 3 #define LP_MAXPUBKEY_ERRORS 10
#define PSOCK_KEEPALIVE 3600 #define PSOCK_KEEPALIVE 3600
#define MAINLOOP_PERSEC 100 #define MAINLOOP_PERSEC 100
#define MAX_PSOCK_PORT 60000 #define MAX_PSOCK_PORT 60000

127
iguana/exchanges/LP_nativeDEX.c

@ -24,6 +24,54 @@
// BCH signing // BCH signing
#include <stdio.h> #include <stdio.h>
struct LP_millistats
{
double lastmilli,millisum,threshold;
uint32_t count;
char name[64];
} LP_psockloop_stats,LP_reserved_msgs_stats,utxosQ_loop_stats,command_rpcloop_stats,queue_loop_stats,prices_loop_stats,LP_coinsloop_stats,LP_coinsloopBTC_stats,LP_coinsloopKMD_stats,LP_pubkeysloop_stats,LP_privkeysloop_stats,LP_swapsloop_stats;
extern int32_t IAMLP;
void LP_millistats_update(struct LP_millistats *mp)
{
double elapsed,millis;
if ( mp == 0 )
{
if ( IAMLP != 0 )
{
mp = &LP_psockloop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
}
mp = &LP_reserved_msgs_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &utxosQ_loop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &command_rpcloop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &queue_loop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &prices_loop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &LP_coinsloop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &LP_coinsloopBTC_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &LP_coinsloopKMD_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &LP_pubkeysloop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &LP_privkeysloop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
mp = &LP_swapsloop_stats, printf("%32s lag %10.2f millis, threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,OS_milliseconds() - mp->lastmilli,mp->threshold,mp->millisum/(mp->count > 0 ? mp->count: 1),mp->count);
}
else
{
if ( mp->lastmilli == 0. )
mp->lastmilli = OS_milliseconds();
else
{
mp->count++;
millis = OS_milliseconds();
elapsed = (millis - mp->lastmilli);
mp->millisum += elapsed;
if ( mp->threshold != 0. && elapsed > mp->threshold )
{
printf("%32s elapsed %10.2f millis > threshold %10.2f, ave %10.2f millis, count.%u\n",mp->name,elapsed,mp->threshold,mp->millisum/mp->count,mp->count);
}
mp->lastmilli = millis;
}
}
}
#include "LP_include.h" #include "LP_include.h"
portable_mutex_t LP_peermutex,LP_UTXOmutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex,LP_networkmutex,LP_psockmutex,LP_coinmutex,LP_messagemutex,LP_portfoliomutex,LP_electrummutex,LP_butxomutex,LP_reservedmutex,LP_nanorecvsmutex,LP_tradebotsmutex; portable_mutex_t LP_peermutex,LP_UTXOmutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex,LP_networkmutex,LP_psockmutex,LP_coinmutex,LP_messagemutex,LP_portfoliomutex,LP_electrummutex,LP_butxomutex,LP_reservedmutex,LP_nanorecvsmutex,LP_tradebotsmutex;
int32_t LP_canbind; int32_t LP_canbind;
@ -33,6 +81,7 @@ struct LP_peerinfo *LP_peerinfos,*LP_mypeer;
struct LP_forwardinfo *LP_forwardinfos; struct LP_forwardinfo *LP_forwardinfos;
struct iguana_info *LP_coins; struct iguana_info *LP_coins;
struct LP_pubkeyinfo *LP_pubkeyinfos; struct LP_pubkeyinfo *LP_pubkeyinfos;
#include "LP_network.c" #include "LP_network.c"
char *activecoins[] = { "BTC", "KMD" }; char *activecoins[] = { "BTC", "KMD" };
@ -40,7 +89,10 @@ char GLOBAL_DBDIR[] = { "DB" };
char LP_myipaddr[64],LP_publicaddr[64],USERHOME[512] = { "/root" }; char LP_myipaddr[64],LP_publicaddr[64],USERHOME[512] = { "/root" };
char LP_gui[16] = { "cli" }; char LP_gui[16] = { "cli" };
char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", };//"5.9.253.204" }; // char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203",
//"51.15.203.171", "51.15.86.136", "51.15.94.249", "51.15.80.18", "51.15.91.40", "51.15.54.2", "51.15.86.31", "51.15.82.29", "51.15.89.155",
};//"5.9.253.204" }; //
//uint32_t LP_deadman_switch; //uint32_t LP_deadman_switch;
uint16_t LP_fixed_pairport,LP_publicport; uint16_t LP_fixed_pairport,LP_publicport;
@ -165,6 +217,7 @@ char *LP_process_message(void *ctx,char *typestr,char *myipaddr,int32_t pubsock,
if ( duplicate != 0 ) if ( duplicate != 0 )
dup++; dup++;
else uniq++; else uniq++;
portable_mutex_lock(&LP_commandmutex);
if ( (rand() % 10000) == 0 ) if ( (rand() % 10000) == 0 )
printf("%s dup.%d (%u / %u) %.1f%% encrypted.%d recv.%u [%02x %02x] vs %02x %02x\n",typestr,duplicate,dup,dup+uniq,(double)100*dup/(dup+uniq),encrypted,crc32,ptr[0],ptr[1],crc32&0xff,(crc32>>8)&0xff); printf("%s dup.%d (%u / %u) %.1f%% encrypted.%d recv.%u [%02x %02x] vs %02x %02x\n",typestr,duplicate,dup,dup+uniq,(double)100*dup/(dup+uniq),encrypted,crc32,ptr[0],ptr[1],crc32&0xff,(crc32>>8)&0xff);
if ( duplicate == 0 ) if ( duplicate == 0 )
@ -245,21 +298,18 @@ char *LP_process_message(void *ctx,char *typestr,char *myipaddr,int32_t pubsock,
} }
else else
{ {
portable_mutex_lock(&LP_commandmutex);
if ( (retstr= LP_command_process(ctx,myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvlen - len)) != 0 ) if ( (retstr= LP_command_process(ctx,myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvlen - len)) != 0 )
{ {
} }
portable_mutex_unlock(&LP_commandmutex);
//printf("%.3f %s LP_command_process\n",OS_milliseconds()-millis,jstr(argjson,"method")); //printf("%.3f %s LP_command_process\n",OS_milliseconds()-millis,jstr(argjson,"method"));
} }
free_json(argjson); free_json(argjson);
} }
} }
} //else printf("DUPLICATE.(%s)\n",(char *)ptr); } //else printf("DUPLICATE.(%s)\n",(char *)ptr);
portable_mutex_unlock(&LP_commandmutex);
if ( jsonstr != 0 && (void *)jsonstr != (void *)ptr && encrypted == 0 ) if ( jsonstr != 0 && (void *)jsonstr != (void *)ptr && encrypted == 0 )
free(jsonstr); free(jsonstr);
if ( ptr != 0 )
nn_freemsg(ptr), ptr = 0;
return(retstr); return(retstr);
} }
@ -271,21 +321,16 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int
while ( nonz < maxdepth && recvlen > 0 ) while ( nonz < maxdepth && recvlen > 0 )
{ {
nonz++; nonz++;
#ifndef FROM_JS
memset(&pfd,0,sizeof(pfd)); memset(&pfd,0,sizeof(pfd));
pfd.fd = sock; pfd.fd = sock;
pfd.events = NN_POLLIN; pfd.events = NN_POLLIN;
if ( nn_poll(&pfd,1,1) != 1 ) if ( nn_poll(&pfd,1,1) != 1 )
break; break;
#endif
if ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) > 0 ) if ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) > 0 )
{ {
methodstr[0] = 0; methodstr[0] = 0;
if ( 1 ) if ( 0 )
{ {
#ifdef FROM_JS
printf("%s RECV.(%s)\n",typestr,(char *)ptr);
#endif
cJSON *recvjson; char *mstr;//,*cstr; cJSON *recvjson; char *mstr;//,*cstr;
if ( (recvjson= cJSON_Parse((char *)ptr)) != 0 ) if ( (recvjson= cJSON_Parse((char *)ptr)) != 0 )
{ {
@ -297,10 +342,7 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int
free_json(recvjson); free_json(recvjson);
} }
} }
#ifdef FROM_JS int32_t validreq = 0;
else printf("%s got recv.%d\n",typestr,recvlen);
#endif
int32_t validreq = 0; double millis = OS_milliseconds();
if ( strlen((char *)ptr)+sizeof(bits256) <= recvlen ) if ( strlen((char *)ptr)+sizeof(bits256) <= recvlen )
{ {
if ( LP_magic_check(ptr,recvlen,remoteaddr) <= 0 ) if ( LP_magic_check(ptr,recvlen,remoteaddr) <= 0 )
@ -320,22 +362,20 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int
Broadcaststr = 0; Broadcaststr = 0;
if ( (argjson= cJSON_Parse(str)) != 0 ) if ( (argjson= cJSON_Parse(str)) != 0 )
{ {
if ( jobj(argjson,"method") != 0 && strcmp("connect",jstr(argjson,"method")) == 0 ) portable_mutex_lock(&LP_commandmutex);
printf("self.(%s)\n",str);
if ( LP_tradecommand(ctx,myipaddr,pubsock,argjson,0,0) <= 0 ) if ( LP_tradecommand(ctx,myipaddr,pubsock,argjson,0,0) <= 0 )
{ {
portable_mutex_lock(&LP_commandmutex);
if ( (retstr= stats_JSON(ctx,myipaddr,pubsock,argjson,remoteaddr,0)) != 0 ) if ( (retstr= stats_JSON(ctx,myipaddr,pubsock,argjson,remoteaddr,0)) != 0 )
free(retstr); free(retstr);
portable_mutex_unlock(&LP_commandmutex);
} }
portable_mutex_unlock(&LP_commandmutex);
free_json(argjson); free_json(argjson);
} }
free(str); free(str);
} }
if ( OS_milliseconds()-millis > 1000 )
printf("%.3f LP_process_message (%s)\n",OS_milliseconds()-millis,methodstr);
} }
if ( ptr != 0 )
nn_freemsg(ptr), ptr = 0;
} }
} }
} }
@ -382,8 +422,11 @@ void command_rpcloop(void *myipaddr)
{ {
int32_t nonz = 0; void *ctx; int32_t nonz = 0; void *ctx;
ctx = bitcoin_ctx(); ctx = bitcoin_ctx();
strcpy(command_rpcloop_stats.name,"command_rpcloop");
command_rpcloop_stats.threshold = 1000.;
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&command_rpcloop_stats);
nonz = LP_nanomsg_recvs(ctx); nonz = LP_nanomsg_recvs(ctx);
//if ( LP_mybussock >= 0 ) //if ( LP_mybussock >= 0 )
// nonz += LP_sock_check("BUS",ctx,origipaddr,-1,LP_mybussock); // nonz += LP_sock_check("BUS",ctx,origipaddr,-1,LP_mybussock);
@ -400,8 +443,11 @@ void command_rpcloop(void *myipaddr)
void utxosQ_loop(void *myipaddr) void utxosQ_loop(void *myipaddr)
{ {
strcpy(utxosQ_loop_stats.name,"utxosQ_loop");
utxosQ_loop_stats.threshold = 50.;
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&utxosQ_loop_stats);
if ( LP_utxosQ_process() == 0 ) if ( LP_utxosQ_process() == 0 )
usleep(10000); usleep(10000);
} }
@ -493,8 +539,28 @@ int32_t LP_utxos_sync(struct LP_peerinfo *peer)
void LP_coinsloop(void *_coins) void LP_coinsloop(void *_coins)
{ {
struct LP_address *ap=0,*atmp; cJSON *retjson; struct LP_address_utxo *up,*tmp; struct iguana_info *coin,*ctmp; char str[65]; struct electrum_info *ep,*backupep=0; bits256 zero; int32_t oldht,j,nonz; char *coins = _coins; struct LP_address *ap=0,*atmp; cJSON *retjson; struct LP_address_utxo *up,*tmp; struct iguana_info *coin,*ctmp; char str[65]; struct electrum_info *ep,*backupep=0; bits256 zero; int32_t oldht,j,nonz; char *coins = _coins;
if ( strcmp("BTC",coins) == 0 )
{
strcpy(LP_coinsloopBTC_stats.name,"BTC coin loop");
LP_coinsloopBTC_stats.threshold = 2000.;
}
else if ( strcmp("KMD",coins) == 0 )
{
strcpy(LP_coinsloopKMD_stats.name,"KMD coin loop");
LP_coinsloopKMD_stats.threshold = 1000.;
}
else
{
strcpy(LP_coinsloop_stats.name,"other coins loop");
LP_coinsloop_stats.threshold = 500.;
}
while ( 1 ) while ( 1 )
{ {
if ( strcmp("BTC",coins) == 0 )
LP_millistats_update(&LP_coinsloopBTC_stats);
else if ( strcmp("KMD",coins) == 0 )
LP_millistats_update(&LP_coinsloopKMD_stats);
else LP_millistats_update(&LP_coinsloop_stats);
nonz = 0; nonz = 0;
HASH_ITER(hh,LP_coins,coin,ctmp) // firstrefht,firstscanht,lastscanht HASH_ITER(hh,LP_coins,coin,ctmp) // firstrefht,firstscanht,lastscanht
{ {
@ -635,9 +701,6 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int
if ( strcmp(peer->ipaddr,myipaddr) != 0 ) if ( strcmp(peer->ipaddr,myipaddr) != 0 )
{ {
nonz++; nonz++;
#ifdef FROM_JS
if ( (rand() % 100) == 0 )
#endif
LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport); LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport);
peer->diduquery = 0; peer->diduquery = 0;
LP_peer_pricesquery(peer); LP_peer_pricesquery(peer);
@ -650,9 +713,6 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int
{ {
peer->diduquery = now; peer->diduquery = now;
nonz++; nonz++;
#ifdef FROM_JS
if ( (rand() % 100) == 0 )
#endif
if ( (retstr= issue_LP_notify(peer->ipaddr,peer->port,"127.0.0.1",0,numpeers,G.LP_sessionid,G.LP_myrmd160str,G.LP_mypub25519)) != 0 ) if ( (retstr= issue_LP_notify(peer->ipaddr,peer->port,"127.0.0.1",0,numpeers,G.LP_sessionid,G.LP_myrmd160str,G.LP_mypub25519)) != 0 )
free(retstr); free(retstr);
peer->needping = 0; peer->needping = 0;
@ -764,9 +824,12 @@ void LP_initpeers(int32_t pubsock,struct LP_peerinfo *mypeer,char *myipaddr,uint
void LP_pubkeysloop(void *ctx) void LP_pubkeysloop(void *ctx)
{ {
static uint32_t lasttime; static uint32_t lasttime;
strcpy(LP_pubkeysloop_stats.name,"LP_pubkeysloop");
LP_pubkeysloop_stats.threshold = 5000.;
sleep(10); sleep(10);
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&LP_pubkeysloop_stats);
if ( time(NULL) > lasttime+60 ) if ( time(NULL) > lasttime+60 )
{ {
//printf("LP_pubkeysloop %u\n",(uint32_t)time(NULL)); //printf("LP_pubkeysloop %u\n",(uint32_t)time(NULL));
@ -779,9 +842,12 @@ void LP_pubkeysloop(void *ctx)
void LP_privkeysloop(void *ctx) void LP_privkeysloop(void *ctx)
{ {
strcpy(LP_privkeysloop_stats.name,"LP_privkeysloop");
LP_privkeysloop_stats.threshold = (LP_ORDERBOOK_DURATION * .8 * 1000) + 10000;
sleep(20); sleep(20);
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&LP_privkeysloop_stats);
LP_counter += 1000; LP_counter += 1000;
//printf("LP_privkeysloop %u\n",LP_counter); //printf("LP_privkeysloop %u\n",LP_counter);
LP_privkey_updates(ctx,LP_mypubsock,0); LP_privkey_updates(ctx,LP_mypubsock,0);
@ -792,13 +858,17 @@ void LP_privkeysloop(void *ctx)
void LP_swapsloop(void *ignore) void LP_swapsloop(void *ignore)
{ {
char *retstr; char *retstr;
strcpy(LP_swapsloop_stats.name,"LP_swapsloop");
LP_swapsloop_stats.threshold = 605000.;
sleep(50); sleep(50);
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&LP_swapsloop_stats);
LP_counter += 10000; LP_counter += 10000;
//printf("LP_swapsloop %u\n",LP_counter); //printf("LP_swapsloop %u\n",LP_counter);
if ( (retstr= basilisk_swapentry(0,0)) != 0 ) if ( (retstr= basilisk_swapentry(0,0)) != 0 )
free(retstr); free(retstr);
LP_millistats_update(0);
sleep(600); sleep(600);
} }
} }
@ -807,8 +877,11 @@ void LP_reserved_msgs(void *ignore)
{ {
bits256 zero; int32_t flag; struct nn_pollfd pfd; bits256 zero; int32_t flag; struct nn_pollfd pfd;
memset(zero.bytes,0,sizeof(zero)); memset(zero.bytes,0,sizeof(zero));
strcpy(LP_reserved_msgs_stats.name,"LP_reserved_msgs");
LP_reserved_msgs_stats.threshold = 50.;
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&LP_reserved_msgs_stats);
if ( num_Reserved_msgs[0] > 0 || num_Reserved_msgs[1] > 0 ) if ( num_Reserved_msgs[0] > 0 || num_Reserved_msgs[1] > 0 )
{ {
flag = 0; flag = 0;

6
iguana/exchanges/LP_network.c

@ -268,8 +268,11 @@ int32_t LP_peerindsock(int32_t *peerindp)
void queue_loop(void *arg) void queue_loop(void *arg)
{ {
struct LP_queue *ptr,*tmp; int32_t sentbytes,nonz,flag,duplicate,n=0; struct LP_queue *ptr,*tmp; int32_t sentbytes,nonz,flag,duplicate,n=0;
strcpy(queue_loop_stats.name,"queue_loop");
queue_loop_stats.threshold = 500.;
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&queue_loop_stats);
nonz = 0; nonz = 0;
//printf("LP_Q.%p next.%p prev.%p\n",LP_Q,LP_Q!=0?LP_Q->next:0,LP_Q!=0?LP_Q->prev:0); //printf("LP_Q.%p next.%p prev.%p\n",LP_Q,LP_Q!=0?LP_Q->next:0,LP_Q!=0?LP_Q->prev:0);
n = 0; n = 0;
@ -474,8 +477,11 @@ void LP_psockloop(void *_ptr) // printouts seem to be needed for forwarding to w
{ {
static struct nn_pollfd *pfds; static struct nn_pollfd *pfds;
int32_t i,n,nonz,iter,retval,sentbytes,size=0,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; char keepalive[512]; int32_t i,n,nonz,iter,retval,sentbytes,size=0,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; char keepalive[512];
strcpy(LP_psockloop_stats.name,"LP_psockloop");
LP_psockloop_stats.threshold = 200.;
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&LP_psockloop_stats);
now = (uint32_t)time(NULL); now = (uint32_t)time(NULL);
if ( buf != 0 && ptr != 0 && sendsock >= 0 ) if ( buf != 0 && ptr != 0 && sendsock >= 0 )
{ {

3
iguana/exchanges/LP_portfolio.c

@ -589,8 +589,11 @@ int32_t LP_portfolio_order(struct LP_portfoliotrade *trades,int32_t max,cJSON *a
void prices_loop(void *ctx) void prices_loop(void *ctx)
{ {
char *retstr; cJSON *retjson,*array; char *buycoin,*sellcoin; struct iguana_info *buy,*sell; uint32_t requestid,quoteid; int32_t i,n,m; struct LP_portfoliotrade trades[256]; struct LP_priceinfo *btcpp; char *retstr; cJSON *retjson,*array; char *buycoin,*sellcoin; struct iguana_info *buy,*sell; uint32_t requestid,quoteid; int32_t i,n,m; struct LP_portfoliotrade trades[256]; struct LP_priceinfo *btcpp;
strcpy(prices_loop_stats.name,"prices_loop");
prices_loop_stats.threshold = 91000.;
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&prices_loop_stats);
LP_tradebots_timeslice(ctx); LP_tradebots_timeslice(ctx);
if ( (btcpp= LP_priceinfofind("BTC")) == 0 ) if ( (btcpp= LP_priceinfofind("BTC")) == 0 )
{ {

3
iguana/exchanges/LP_prices.c

@ -366,9 +366,6 @@ void LP_peer_pricesquery(struct LP_peerinfo *peer)
peer->needping = (uint32_t)time(NULL); peer->needping = (uint32_t)time(NULL);
if ( (retstr= issue_LP_getprices(peer->ipaddr,peer->port)) != 0 ) if ( (retstr= issue_LP_getprices(peer->ipaddr,peer->port)) != 0 )
{ {
#ifdef FROM_JS
printf("%s\n",retstr);
#endif
if ( (array= cJSON_Parse(retstr)) != 0 ) if ( (array= cJSON_Parse(retstr)) != 0 )
{ {
if ( is_cJSON_Array(array) && (n= cJSON_GetArraySize(array)) > 0 ) if ( is_cJSON_Array(array) && (n= cJSON_GetArraySize(array)) > 0 )

2
iguana/exchanges/LP_remember.c

@ -839,7 +839,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti
srcAdest = srcBdest = destAdest = destBdest = 0; srcAdest = srcBdest = destAdest = destBdest = 0;
if ( rswap.bobcoin[0] == 0 || rswap.alicecoin[0] == 0 || strcmp(rswap.bobcoin,rswap.src) != 0 || strcmp(rswap.alicecoin,rswap.dest) != 0 ) if ( rswap.bobcoin[0] == 0 || rswap.alicecoin[0] == 0 || strcmp(rswap.bobcoin,rswap.src) != 0 || strcmp(rswap.alicecoin,rswap.dest) != 0 )
{ {
printf("legacy DB SWAPS files BOB.(%s) Alice.(%s) src.(%s) dest.(%s)\n",rswap.bobcoin,rswap.alicecoin,rswap.src,rswap.dest); printf("legacy DB SWAPS.(%u %u) %llu files BOB.(%s) Alice.(%s) src.(%s) dest.(%s)\n",rswap.requestid,rswap.quoteid,(long long)rswap.aliceid,rswap.bobcoin,rswap.alicecoin,rswap.src,rswap.dest);
return(cJSON_Parse("{\"error\":\"mismatched bob/alice vs src/dest coins??\"}")); return(cJSON_Parse("{\"error\":\"mismatched bob/alice vs src/dest coins??\"}"));
} }
alice = LP_coinfind(rswap.alicecoin); alice = LP_coinfind(rswap.alicecoin);

1
iguana/exchanges/LP_rpc.c

@ -25,6 +25,7 @@ char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url)
maxerrs = LP_MAXPEER_ERRORS; maxerrs = LP_MAXPEER_ERRORS;
if ( peer == 0 || (peer->errors < maxerrs || peer->good >= LP_MINPEER_GOOD) ) if ( peer == 0 || (peer->errors < maxerrs || peer->good >= LP_MINPEER_GOOD) )
{ {
//printf("issue.(%s)\n",url);
if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) == 0 ) if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) == 0 )
{ {
if ( peer != 0 ) if ( peer != 0 )

4
iguana/exchanges/LP_signatures.c

@ -286,11 +286,11 @@ int32_t LP_utxos_sigcheck(uint32_t timestamp,char *sigstr,char *pubsecpstr,bits2
if ( memcmp(pub33,pubsecp,33) != 0 || retval != 0 ) if ( memcmp(pub33,pubsecp,33) != 0 || retval != 0 )
{ {
static uint32_t counter; static uint32_t counter;
if ( counter++ < 10 ) if ( counter++ <= LP_MAXPUBKEY_ERRORS )
{ {
if ( pubp != 0 ) if ( pubp != 0 )
pubp->numerrors++; pubp->numerrors++;
if ( pubp != 0 && pubp->numerrors > 1 ) if ( pubp != 0 && pubp->numerrors > LP_MAXPUBKEY_ERRORS/2 )
printf("LP_utxos_sigcheck failure.%d, probably from %s with older version\n",pubp!=0?pubp->numerrors:-1,bits256_str(str,pubkey)); printf("LP_utxos_sigcheck failure.%d, probably from %s with older version\n",pubp!=0?pubp->numerrors:-1,bits256_str(str,pubkey));
} }
retval = -1; retval = -1;

2
iguana/exchanges/LP_transaction.c

@ -651,7 +651,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch
else if ( value == satoshis && (double)txfee/value < 0.001 ) else if ( value == satoshis && (double)txfee/value < 0.001 )
{ {
satoshis = value - txfee; satoshis = value - txfee;
printf("emergency txfee allocation from value %.8f identical to satoshis: %.8f txfee %.8f\n",dstr(value),dstr(satoshis),dstr(txfee)); printf("txfee allocation from value %.8f identical to satoshis: %.8f txfee %.8f\n",dstr(value),dstr(satoshis),dstr(txfee));
} }
else else
{ {

2
iguana/exchanges/install

@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
cp bot_buy bot_list bot_pause bot_resume bot_sell bot_settings bot_status bot_stop guistats pubkeystats pendings coinswaps baserelswaps setpassphrase notarizations getrawtransaction parselog statsdisp m_js trust trusted setconfirms balance listunspent electrum snapshot_balance snapshot_loop secretaddresses dividends snapshot goals goal portfolio autoprice deletemessages getmessages debug buy sell bestfit orderbook client run_osx client_osx run coins disable enable myprice myprices getcoins getpeers getpeersIP getprices help inv setprice status ../dexscripts cp stop millis mnzservers bot_buy bot_list bot_pause bot_resume bot_sell bot_settings bot_status bot_stop guistats pubkeystats pendings coinswaps baserelswaps setpassphrase notarizations getrawtransaction parselog statsdisp m_js trust trusted setconfirms balance listunspent electrum snapshot_balance snapshot_loop secretaddresses dividends snapshot goals goal portfolio autoprice deletemessages getmessages debug buy sell bestfit orderbook client run_osx client_osx run coins disable enable myprice myprices getcoins getpeers getpeersIP getprices help inv setprice status ../dexscripts
cp coins.json .. cp coins.json ..
cd ../dexscripts cd ../dexscripts
#cp ../exchanges/passphrase ../exchanges/userpass . #cp ../exchanges/passphrase ../exchanges/userpass .

3
iguana/exchanges/millis

@ -0,0 +1,3 @@
#!/bin/bash
source userpass
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"millis\"}"

12
iguana/exchanges/mnzservers

@ -0,0 +1,12 @@
#!/bin/bash
source userpass
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"b4a6361506d847817205a8e51374eb129fc33c3b5466235afdbc65f2291ffb4c\",\"method\":\"trust\",\"trust\":1}"
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"bd0c69da4ec3ed61613734f9f681f846fde5d8efc894c82dafbeeb7a01844872\",\"method\":\"trust\",\"trust\":1}"
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"8f7782b532808a30a1fe6ffc1fa3c55fea6d734f000763fa88d42ccfed60d213\",\"method\":\"trust\",\"trust\":1}"
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"d80a74847cd60899afdd673570f8b698e4089e5ad4d6e9e205b5e5891ec0c84f\",\"method\":\"trust\",\"trust\":1}"
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"322e236db07484b31aea9400a6f3f5ed972e29c6d4115c63aaedaa541d41e758\",\"method\":\"trust\",\"trust\":1}"
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"8579b74435093690d3d7680ecdac0dd1b892dc5ecd4fb603f0e22fd003176342\",\"method\":\"trust\",\"trust\":1}"
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"c4e3c95bd9612cce3fe1cfcc0a0e9c625bab7e4b83bc68f0ede73633e6a8c17f\",\"method\":\"trust\",\"trust\":1}"
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"43467b51e07fae3b19101fca7fe1bf250d34c8deecfd493c723f87d5eda1a64b\",\"method\":\"trust\",\"trust\":1}"
curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"e900c42a0d883d098f382b59cf5655dd1d92b2c94f6580095a4f6382514f7a59\",\"method\":\"trust\",\"trust\":1}"

32
iguana/exchanges/stats.c

@ -219,7 +219,7 @@ int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port)
return(-1); return(-1);
} }
} }
if ( listen(sock,64) != 0 ) if ( listen(sock,512) != 0 )
{ {
printf("listen(%s) port.%d failed: %s sock.%d. errno.%d\n",hostname,port,strerror(errno),sock,errno); printf("listen(%s) port.%d failed: %s sock.%d. errno.%d\n",hostname,port,strerror(errno),sock,errno);
if ( sock >= 0 ) if ( sock >= 0 )
@ -728,34 +728,42 @@ void LP_rpc_processreq(void *_ptr)
} }
free(space); free(space);
free(jsonbuf); free(jsonbuf);
closesocket(sock);
} }
void stats_rpcloop(void *args) void stats_rpcloop(void *args)
{ {
uint16_t port; int32_t sock,bindsock; socklen_t clilen; struct sockaddr_in cli_addr; uint32_t ipbits; uint64_t arg64; void *arg64ptr; static uint32_t counter;
uint16_t port; int32_t sock,bindsock=-1; socklen_t clilen; struct sockaddr_in cli_addr; uint32_t ipbits; uint64_t arg64; void *arg64ptr;
if ( (port= *(uint16_t *)args) == 0 ) if ( (port= *(uint16_t *)args) == 0 )
port = 7779; port = 7779;
RPC_port = port; RPC_port = port;
while ( (bindsock= iguana_socket(1,"0.0.0.0",port)) < 0 ) /*while ( (bindsock= iguana_socket(1,"0.0.0.0",port)) < 0 )
{ {
//if ( coin->MAXPEERS == 1 ) //if ( coin->MAXPEERS == 1 )
// break; // break;
//exit(-1); //exit(-1);
sleep(3); sleep(3);
} }
printf(">>>>>>>>>> DEX stats 127.0.0.1:%d bind sock.%d DEX stats API enabled <<<<<<<<<\n",port,bindsock); printf(">>>>>>>>>> DEX stats 127.0.0.1:%d bind sock.%d DEX stats API enabled <<<<<<<<<\n",port,bindsock);*/
while ( bindsock >= 0 ) while ( 1 )
{ {
if ( bindsock < 0 )
{
while ( (bindsock= iguana_socket(1,"0.0.0.0",port)) < 0 )
usleep(10000);
if ( counter++ < 1 )
printf(">>>>>>>>>> DEX stats 127.0.0.1:%d bind sock.%d DEX stats API enabled <<<<<<<<<\n",port,bindsock);
}
clilen = sizeof(cli_addr); clilen = sizeof(cli_addr);
sock = accept(bindsock,(struct sockaddr *)&cli_addr,&clilen); sock = accept(bindsock,(struct sockaddr *)&cli_addr,&clilen);
if ( sock < 0 ) if ( sock < 0 )
{ {
//printf("iguana_rpcloop ERROR on accept usock.%d errno %d %s\n",sock,errno,strerror(errno)); printf("iguana_rpcloop ERROR on accept usock.%d errno %d %s\n",sock,errno,strerror(errno));
close(bindsock);
bindsock = -1;
continue; continue;
} }
memcpy(&ipbits,&cli_addr.sin_addr.s_addr,sizeof(ipbits)); memcpy(&ipbits,&cli_addr.sin_addr.s_addr,sizeof(ipbits));
//printf("remote RPC request from (%s) %x\n",remoteaddr,ipbits);
arg64 = ((uint64_t)ipbits << 32) | (sock & 0xffffffff); arg64 = ((uint64_t)ipbits << 32) | (sock & 0xffffffff);
arg64ptr = malloc(sizeof(arg64)); arg64ptr = malloc(sizeof(arg64));
memcpy(arg64ptr,&arg64,sizeof(arg64)); memcpy(arg64ptr,&arg64,sizeof(arg64));
@ -763,12 +771,18 @@ void stats_rpcloop(void *args)
{ {
LP_rpc_processreq((void *)&arg64); LP_rpc_processreq((void *)&arg64);
free(arg64ptr); free(arg64ptr);
//char remoteaddr[64];
//expand_ipbits(remoteaddr,ipbits);
//printf("finished RPC request from (%s) %x\n",remoteaddr,ipbits);
} }
else if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_rpc_processreq,arg64ptr) != 0 ) else if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_rpc_processreq,arg64ptr) != 0 )
{ {
printf("error launching rpc handler on port %d\n",port); printf("error launching rpc handler on port %d\n",port);
// yes, small leak per command
} }
// yes, small leak per command close(bindsock);
closesocket(sock);
bindsock = iguana_socket(1,"0.0.0.0",port);
} }
} }

Loading…
Cancel
Save