jl777
8 years ago
4 changed files with 337 additions and 7 deletions
@ -0,0 +1,327 @@ |
|||
/******************************************************************************
|
|||
* Copyright © 2014-2017 The SuperNET Developers. * |
|||
* * |
|||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * |
|||
* the top-level directory of this distribution for the individual copyright * |
|||
* holder information and the developer policies on copyright and licensing. * |
|||
* * |
|||
* Unless otherwise agreed in a custom licensing agreement, no part of the * |
|||
* SuperNET software, including this file may be copied, modified, propagated * |
|||
* or distributed except according to the terms contained in the LICENSE file * |
|||
* * |
|||
* Removal or modification of this copyright notice is prohibited. * |
|||
* * |
|||
******************************************************************************/ |
|||
//
|
|||
// main.c
|
|||
// stats
|
|||
//
|
|||
// Copyright © 2017 SuperNET. All rights reserved.
|
|||
//
|
|||
|
|||
#include <stdio.h> |
|||
#include <stdint.h> |
|||
#include "OS_portable.h" |
|||
#define MAX(a,b) ((a) > (b) ? (a) : (b)) |
|||
|
|||
|
|||
#define IGUANA_URL "http://127.0.0.1:7778"
|
|||
#define STATS_DESTDIR "/var/www/html" |
|||
#define STATS_DEST "/var/www/html/DEXstats.json" |
|||
|
|||
char CURRENCIES[][8] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies
|
|||
"CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", // end of currencies
|
|||
}; |
|||
|
|||
char ASSETCHAINS_SYMBOL[16] = { "KV" }; |
|||
|
|||
struct komodo_state |
|||
{ |
|||
bits256 NOTARIZED_HASH,NOTARIZED_DESTTXID; |
|||
int32_t SAVEDHEIGHT,CURRENT_HEIGHT,NOTARIZED_HEIGHT; |
|||
uint32_t SAVEDTIMESTAMP; |
|||
uint64_t deposited,issued,withdrawn,approved,redeemed,shorted; |
|||
struct notarized_checkpoint *NPOINTS; int32_t NUM_NPOINTS; |
|||
struct komodo_event **Komodo_events; int32_t Komodo_numevents; |
|||
uint32_t RTbufs[64][3]; uint64_t RTmask; |
|||
}; |
|||
|
|||
struct komodo_state KOMODO_STATE; |
|||
void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value) |
|||
{ |
|||
static bits256 zeroes; |
|||
uint32_t flags; bits256 pubkey,refpubkey,sig; int32_t i,refvaluesize,hassig,coresize,haspubkey,height,kvheight; uint16_t keylen,valuesize,newflag = 0; uint8_t *key,*valueptr,keyvalue[10000]; |
|||
iguana_rwnum(0,&opretbuf[1],sizeof(keylen),&keylen); |
|||
iguana_rwnum(0,&opretbuf[3],sizeof(valuesize),&valuesize); |
|||
iguana_rwnum(0,&opretbuf[5],sizeof(height),&height); |
|||
iguana_rwnum(0,&opretbuf[9],sizeof(flags),&flags); |
|||
key = &opretbuf[13]; |
|||
if ( keylen+13 > opretlen ) |
|||
{ |
|||
printf("komodo_kvupdate: keylen.%d + 13 > opretlen.%d\n",keylen,opretlen); |
|||
return; |
|||
} |
|||
valueptr = &key[keylen]; |
|||
coresize = (int32_t)(sizeof(flags)+sizeof(height)+sizeof(keylen)+sizeof(valuesize)+keylen+valuesize+1); |
|||
if ( opretlen == coresize || opretlen == coresize+sizeof(bits256) || opretlen == coresize+2*sizeof(bits256) ) |
|||
{ |
|||
memset(&pubkey,0,sizeof(pubkey)); |
|||
memset(&sig,0,sizeof(sig)); |
|||
if ( (haspubkey= (opretlen >= coresize+sizeof(bits256))) != 0 ) |
|||
{ |
|||
for (i=0; i<32; i++) |
|||
((uint8_t *)&pubkey)[i] = opretbuf[coresize+i]; |
|||
} |
|||
if ( (hassig= (opretlen == coresize+sizeof(bits256)*2)) != 0 ) |
|||
{ |
|||
for (i=0; i<32; i++) |
|||
((uint8_t *)&sig)[i] = opretbuf[coresize+sizeof(bits256)+i]; |
|||
} |
|||
/*if ( (refvaluesize= komodo_kvsearch((bits256 *)&refpubkey,height,&flags,&kvheight,&keyvalue[keylen],key,keylen)) >= 0 )
|
|||
{ |
|||
if ( memcmp(&zeroes,&refpubkey,sizeof(refpubkey)) != 0 ) |
|||
{ |
|||
if ( komodo_kvsigverify(keyvalue,keylen+refvaluesize,refpubkey,sig) < 0 ) |
|||
{ |
|||
//printf("komodo_kvsigverify error [%d]\n",coresize-13);
|
|||
return; |
|||
} |
|||
} |
|||
}*/ |
|||
for (i=0; i<keylen; i++) |
|||
putchar((char)key[i]); |
|||
printf(" -> "); |
|||
for (i=0; i<valuesize; i++) |
|||
putchar((char)valueptr[i]); |
|||
printf(" [%d]\n",valuesize); |
|||
} |
|||
} |
|||
|
|||
void komodo_eventadd_opreturn(struct komodo_state *sp,char *symbol,int32_t height,bits256 txid,uint64_t value,uint16_t vout,uint8_t *opretbuf,uint16_t opretlen) |
|||
{ |
|||
if ( sp != 0 ) |
|||
{ |
|||
if ( opretbuf[0] == 'K' && opretlen != 40 ) |
|||
{ |
|||
komodo_kvupdate(opretbuf,opretlen,value); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void komodo_setkmdheight(struct komodo_state *sp,int32_t kmdheight,uint32_t timestamp) |
|||
{ |
|||
if ( sp != 0 ) |
|||
{ |
|||
if ( kmdheight > sp->SAVEDHEIGHT ) |
|||
{ |
|||
sp->SAVEDHEIGHT = kmdheight; |
|||
sp->SAVEDTIMESTAMP = timestamp; |
|||
} |
|||
if ( kmdheight > sp->CURRENT_HEIGHT ) |
|||
sp->CURRENT_HEIGHT = kmdheight; |
|||
} |
|||
} |
|||
|
|||
void komodo_eventadd_kmdheight(struct komodo_state *sp,char *symbol,int32_t height,int32_t kmdheight,uint32_t timestamp) |
|||
{ |
|||
uint32_t buf[2]; |
|||
if ( kmdheight > 0 ) |
|||
{ |
|||
buf[0] = (uint32_t)kmdheight; |
|||
buf[1] = timestamp; |
|||
//komodo_eventadd(sp,height,symbol,KOMODO_EVENT_KMDHEIGHT,(uint8_t *)buf,sizeof(buf));
|
|||
if ( sp != 0 ) |
|||
komodo_setkmdheight(sp,kmdheight,timestamp); |
|||
} |
|||
else |
|||
{ |
|||
kmdheight = -kmdheight; |
|||
//komodo_eventadd(sp,height,symbol,KOMODO_EVENT_REWIND,(uint8_t *)&height,sizeof(height));
|
|||
//if ( sp != 0 )
|
|||
// komodo_event_rewind(sp,symbol,height);
|
|||
} |
|||
} |
|||
|
|||
int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char *dest) |
|||
{ |
|||
static int32_t errs; |
|||
int32_t func,ht,notarized_height,num,matched=0; bits256 notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33]; |
|||
if ( (func= fgetc(fp)) != EOF ) |
|||
{ |
|||
if ( ASSETCHAINS_SYMBOL[0] == 0 && strcmp(symbol,"KMD") == 0 ) |
|||
matched = 1; |
|||
else matched = (strcmp(symbol,ASSETCHAINS_SYMBOL) == 0); |
|||
if ( fread(&ht,1,sizeof(ht),fp) != sizeof(ht) ) |
|||
errs++; |
|||
//printf("fpos.%ld func.(%d %c) ht.%d ",ftell(fp),func,func,ht);
|
|||
if ( func == 'P' ) |
|||
{ |
|||
if ( (num= fgetc(fp)) <= 64 ) |
|||
{ |
|||
if ( fread(pubkeys,33,num,fp) != num ) |
|||
errs++; |
|||
else |
|||
{ |
|||
//printf("updated %d pubkeys at %s ht.%d\n",num,symbol,ht);
|
|||
//if ( (KOMODO_EXTERNAL_NOTARIES != 0 && matched != 0) || (strcmp(symbol,"KMD") == 0 && KOMODO_EXTERNAL_NOTARIES == 0) )
|
|||
// komodo_eventadd_pubkeys(sp,symbol,ht,num,pubkeys);
|
|||
} |
|||
} else printf("illegal num.%d\n",num); |
|||
} |
|||
else if ( func == 'N' ) |
|||
{ |
|||
if ( fread(¬arized_height,1,sizeof(notarized_height),fp) != sizeof(notarized_height) ) |
|||
errs++; |
|||
if ( fread(¬arized_hash,1,sizeof(notarized_hash),fp) != sizeof(notarized_hash) ) |
|||
errs++; |
|||
if ( fread(¬arized_desttxid,1,sizeof(notarized_desttxid),fp) != sizeof(notarized_desttxid) ) |
|||
errs++; |
|||
//if ( matched != 0 ) global independent states -> inside *sp
|
|||
//komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height);
|
|||
} |
|||
else if ( func == 'U' ) // deprecated
|
|||
{ |
|||
uint8_t n,nid; bits256 hash; uint64_t mask; |
|||
n = fgetc(fp); |
|||
nid = fgetc(fp); |
|||
//printf("U %d %d\n",n,nid);
|
|||
if ( fread(&mask,1,sizeof(mask),fp) != sizeof(mask) ) |
|||
errs++; |
|||
if ( fread(&hash,1,sizeof(hash),fp) != sizeof(hash) ) |
|||
errs++; |
|||
//if ( matched != 0 )
|
|||
// komodo_eventadd_utxo(sp,symbol,ht,nid,hash,mask,n);
|
|||
} |
|||
else if ( func == 'K' ) |
|||
{ |
|||
int32_t kheight; |
|||
if ( fread(&kheight,1,sizeof(kheight),fp) != sizeof(kheight) ) |
|||
errs++; |
|||
//if ( matched != 0 ) global independent states -> inside *sp
|
|||
//printf("%s.%d load[%s] ht.%d\n",ASSETCHAINS_SYMBOL,ht,symbol,kheight);
|
|||
komodo_eventadd_kmdheight(sp,symbol,ht,kheight,0); |
|||
} |
|||
else if ( func == 'T' ) |
|||
{ |
|||
int32_t kheight,ktimestamp; |
|||
if ( fread(&kheight,1,sizeof(kheight),fp) != sizeof(kheight) ) |
|||
errs++; |
|||
if ( fread(&ktimestamp,1,sizeof(ktimestamp),fp) != sizeof(ktimestamp) ) |
|||
errs++; |
|||
//if ( matched != 0 ) global independent states -> inside *sp
|
|||
//printf("%s.%d load[%s] ht.%d t.%u\n",ASSETCHAINS_SYMBOL,ht,symbol,kheight,ktimestamp);
|
|||
komodo_eventadd_kmdheight(sp,symbol,ht,kheight,ktimestamp); |
|||
} |
|||
else if ( func == 'R' ) |
|||
{ |
|||
uint16_t olen,v; uint64_t ovalue; bits256 txid; uint8_t opret[16384]; |
|||
if ( fread(&txid,1,sizeof(txid),fp) != sizeof(txid) ) |
|||
errs++; |
|||
if ( fread(&v,1,sizeof(v),fp) != sizeof(v) ) |
|||
errs++; |
|||
if ( fread(&ovalue,1,sizeof(ovalue),fp) != sizeof(ovalue) ) |
|||
errs++; |
|||
if ( fread(&olen,1,sizeof(olen),fp) != sizeof(olen) ) |
|||
errs++; |
|||
if ( olen < sizeof(opret) ) |
|||
{ |
|||
if ( fread(opret,1,olen,fp) != olen ) |
|||
errs++; |
|||
if ( 0 && matched != 0 ) |
|||
{ |
|||
int32_t i; for (i=0; i<olen; i++) |
|||
printf("%02x",opret[i]); |
|||
printf(" %s.%d load[%s] opret[%c] len.%d %.8f\n",ASSETCHAINS_SYMBOL,ht,symbol,opret[0],olen,(double)ovalue/SATOSHIDEN); |
|||
} |
|||
komodo_eventadd_opreturn(sp,symbol,ht,txid,ovalue,v,opret,olen); // global shared state -> global PAX
|
|||
} else |
|||
{ |
|||
int32_t i; |
|||
for (i=0; i<olen; i++) |
|||
fgetc(fp); |
|||
//printf("illegal olen.%u\n",olen);
|
|||
} |
|||
} |
|||
else if ( func == 'D' ) |
|||
{ |
|||
printf("unexpected function D[%d]\n",ht); |
|||
} |
|||
else if ( func == 'V' ) |
|||
{ |
|||
int32_t numpvals; uint32_t pvals[128]; |
|||
numpvals = fgetc(fp); |
|||
if ( numpvals*sizeof(uint32_t) <= sizeof(pvals) && fread(pvals,sizeof(uint32_t),numpvals,fp) == numpvals ) |
|||
{ |
|||
//if ( matched != 0 ) global shared state -> global PVALS
|
|||
//printf("%s load[%s] prices %d\n",ASSETCHAINS_SYMBOL,symbol,ht);
|
|||
//komodo_eventadd_pricefeed(sp,symbol,ht,pvals,numpvals);
|
|||
//printf("load pvals ht.%d numpvals.%d\n",ht,numpvals);
|
|||
} else printf("error loading pvals[%d]\n",numpvals); |
|||
} |
|||
else printf("[%s] %s illegal func.(%d %c)\n",ASSETCHAINS_SYMBOL,symbol,func,func); |
|||
return(func); |
|||
} else return(-1); |
|||
} |
|||
|
|||
void stats_stateupdate(char *destdir,char *statefname,int32_t maxseconds) |
|||
{ |
|||
static long lastpos; |
|||
char fname[512],symbol[64],base[64],dest[64]; int32_t n; FILE *fp; uint32_t starttime; struct komodo_state *sp; |
|||
starttime = (uint32_t)time(NULL); |
|||
strcpy(base,"KV"); |
|||
strcpy(symbol,"KV"); |
|||
strcpy(dest,"KMD"); |
|||
sp = &KOMODO_STATE; |
|||
n = 0; |
|||
if ( (fp= fopen(fname,"rb")) != 0 && sp != 0 ) |
|||
{ |
|||
fseek(fp,0,SEEK_END); |
|||
if ( ftell(fp) > lastpos ) |
|||
{ |
|||
fseek(fp,lastpos,SEEK_SET); |
|||
while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 && n < 1000 ) |
|||
{ |
|||
if ( n == 999 ) |
|||
{ |
|||
if ( time(NULL) < starttime+maxseconds ) |
|||
n = 0; |
|||
else break; |
|||
} |
|||
n++; |
|||
} |
|||
lastpos = ftell(fp); |
|||
} |
|||
fclose(fp); |
|||
} |
|||
} |
|||
|
|||
char *stats_update(char *destdir,char *statefname) |
|||
{ |
|||
cJSON *retjson = cJSON_CreateArray(); |
|||
stats_stateupdate(destdir,statefname,10); |
|||
return(jprint(retjson,1)); |
|||
} |
|||
|
|||
int main(int argc, const char * argv[]) |
|||
{ |
|||
FILE *fp; char *filestr,*statefname; |
|||
if ( argc < 2 ) |
|||
statefname = "/root/.komodo/KV/komodostate"; |
|||
else statefname = (char *)argv[1]; |
|||
printf("DEX stats running\n"); |
|||
while ( 1 ) |
|||
{ |
|||
if ( (filestr= stats_update(STATS_DEST,statefname)) != 0 ) |
|||
{ |
|||
printf("%u: %s\n",(uint32_t)time(NULL),filestr); |
|||
if ( (fp= fopen(STATS_DEST,"wb")) != 0 ) |
|||
{ |
|||
fwrite(filestr,1,strlen(filestr)+1,fp); |
|||
fclose(fp); |
|||
} |
|||
free(filestr); |
|||
} |
|||
sleep(60); |
|||
} |
|||
return 0; |
|||
} |
@ -0,0 +1 @@ |
|||
gcc -o stats -I../crypto777 exchanges/stats.c ../crypto777/cJSON.c ../agents/libcrypto777.a -lcurl -lpthread -lm |
Binary file not shown.
Loading…
Reference in new issue