return(0);
else
{
- if ( kmdheight >= 238000 )
+ if ( ASSETCHAINS_SYMBOL[0] != 0 )
printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
return(-1);
}
{
if ( baseids[i] < 0 )
{
- printf("%d of %d illegal baseid.%d\n",i,n,baseids[i]);
+ static uint32_t counter;
+ if ( counter++ < 3 )
+ printf("%d of %d illegal baseid.%d, this can be ignored\n",i,n,baseids[i]);
continue;
}
bitcoin_address(coinaddr,60,&rmd160s[i*20],20);
return(typestr);
}
+int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long *fposp,long datalen,char *symbol,char *dest);
+
+void komodo_stateind_set(struct komodo_state *sp,uint32_t *inds,int32_t n,uint8_t *filedata,long datalen,char *symbol,char *dest)
+{
+ uint8_t func; long fpos;
+ //komodo_parsestatefiledata(sp,filedata,&fpos,datalen,symbol,dest);
+ // scan backwards to set all the sp-> fields to the current valid value
+}
+
+void *OS_loadfile(char *fname,uint8_t **bufp,long *lenp,long *allocsizep)
+{
+ FILE *fp;
+ long filesize,buflen = *allocsizep;
+ uint8_t *buf = *bufp;
+ *lenp = 0;
+ if ( (fp= fopen(fname,"rb")) != 0 )
+ {
+ fseek(fp,0,SEEK_END);
+ filesize = ftell(fp);
+ if ( filesize == 0 )
+ {
+ fclose(fp);
+ *lenp = 0;
+ printf("OS_loadfile null size.(%s)\n",fname);
+ return(0);
+ }
+ if ( filesize > buflen )
+ {
+ *allocsizep = filesize;
+ *bufp = buf = (uint8_t *)realloc(buf,(long)*allocsizep+64);
+ }
+ rewind(fp);
+ if ( buf == 0 )
+ printf("Null buf ???\n");
+ else
+ {
+ if ( fread(buf,1,(long)filesize,fp) != (unsigned long)filesize )
+ printf("error reading filesize.%ld\n",(long)filesize);
+ buf[filesize] = 0;
+ }
+ fclose(fp);
+ *lenp = filesize;
+ //printf("loaded.(%s)\n",buf);
+ } //else printf("OS_loadfile couldnt load.(%s)\n",fname);
+ return(buf);
+}
+
+uint8_t *OS_fileptr(long *allocsizep,char *fname)
+{
+ long filesize = 0; uint8_t *buf = 0; void *retptr;
+ *allocsizep = 0;
+ retptr = OS_loadfile(fname,&buf,&filesize,allocsizep);
+ return((uint8_t *)retptr);
+}
+
+long komodo_stateind_validate(struct komodo_state *sp,char *indfname,uint8_t *filedata,long datalen,uint32_t *prevpos100p,uint32_t *indcounterp,char *symbol,char *dest)
+{
+ FILE *fp; long fsize,lastfpos=0,fpos=0; uint8_t *inds,func; int32_t i,n; uint32_t offset,tmp,prevpos100 = 0;
+ *indcounterp = *prevpos100p = 0;
+ if ( (inds= OS_fileptr(&fsize,indfname)) != 0 )
+ {
+ lastfpos = 0;
+ fprintf(stderr,"inds.%p validate %s fsize.%ld datalen.%ld n.%ld lastfpos.%ld\n",inds,indfname,fsize,datalen,fsize / sizeof(uint32_t),lastfpos);
+ if ( (fsize % sizeof(uint32_t)) == 0 )
+ {
+ n = (int32_t)(fsize / sizeof(uint32_t));
+ for (i=0; i<n; i++)
+ {
+ memcpy(&tmp,&inds[i * sizeof(uint32_t)],sizeof(uint32_t));
+ if ( 0 && i > n-10 )
+ printf("%d: tmp.%08x [%c] prevpos100.%u\n",i,tmp,tmp&0xff,prevpos100);
+ if ( (i % 100) == 0 )
+ prevpos100 = tmp;
+ else
+ {
+ func = (tmp & 0xff);
+ offset = (tmp >> 8);
+ fpos = prevpos100 + offset;
+ if ( lastfpos >= datalen || filedata[lastfpos] != func )
+ {
+ printf("validate.%d error (%u %d) prev100 %u -> fpos.%ld datalen.%ld [%d] (%c) vs (%c) lastfpos.%ld\n",i,offset,func,prevpos100,fpos,datalen,lastfpos < datalen ? filedata[lastfpos] : -1,func,filedata[lastfpos],lastfpos);
+ return(-1);
+ }
+ }
+ lastfpos = fpos;
+ }
+ *indcounterp = n;
+ *prevpos100p = prevpos100;
+ if ( sp != 0 )
+ komodo_stateind_set(sp,(uint32_t *)inds,n,filedata,fpos,symbol,dest);
+ printf("free inds.%p %s validated[%d] fpos.%ld datalen.%ld, offset %ld vs fsize.%ld\n",inds,indfname,i,fpos,datalen,i * sizeof(uint32_t),fsize);
+ free(inds);
+ return(fpos);
+ } else printf("wrong filesize %s %ld\n",indfname,fsize);
+ }
+ free(inds);
+ fprintf(stderr,"indvalidate return -1\n");
+ return(-1);
+}
+
+long komodo_indfile_update(FILE *indfp,uint32_t *prevpos100p,long lastfpos,long newfpos,uint8_t func,uint32_t *indcounterp)
+{
+ uint32_t tmp;
+ if ( indfp != 0 )
+ {
+ tmp = ((uint32_t)(newfpos - *prevpos100p) << 8) | (func & 0xff);
+ if ( ftell(indfp)/sizeof(uint32_t) != *indcounterp )
+ printf("indfp fpos %ld -> ind.%ld vs counter.%u\n",ftell(indfp),ftell(indfp)/sizeof(uint32_t),*indcounterp);
+ fprintf(stderr,"ftell.%ld indcounter.%u lastfpos.%ld newfpos.%ld func.%02x\n",ftell(indfp),*indcounterp,lastfpos,newfpos,func);
+ fwrite(&tmp,1,sizeof(tmp),indfp), (*indcounterp)++;
+ if ( (*indcounterp % 100) == 0 )
+ {
+ *prevpos100p = (uint32_t)newfpos;
+ fwrite(prevpos100p,1,sizeof(*prevpos100p),indfp), (*indcounterp)++;
+ }
+ }
+ return(newfpos);
+}
+
+int32_t komodo_faststateinit(struct komodo_state *sp,char *fname,char *symbol,char *dest)
+{
+ FILE *indfp; char indfname[1024]; uint8_t *filedata; long validated=-1,datalen,fpos,lastfpos; uint32_t tmp,prevpos100,indcounter,starttime; int32_t func,finished = 0;
+ starttime = (uint32_t)time(NULL);
+ safecopy(indfname,fname,sizeof(indfname)-4);
+ strcat(indfname,".ind");
+ if ( (filedata= OS_fileptr(&datalen,fname)) != 0 )
+ {
+ if ( datalen >= (1LL << 32) || GetArg("-genind",0) != 0 || (validated= komodo_stateind_validate(0,indfname,filedata,datalen,&prevpos100,&indcounter,symbol,dest)) < 0 )
+ {
+ lastfpos = fpos = 0;
+ indcounter = prevpos100 = 0;
+ if ( (indfp= fopen(indfname,"wb")) != 0 )
+ fwrite(&prevpos100,1,sizeof(prevpos100),indfp), indcounter++;
+ fprintf(stderr,"processing %s %ldKB, validated.%ld\n",fname,datalen/1024,validated);
+ while ( (func= komodo_parsestatefiledata(sp,filedata,&fpos,datalen,symbol,dest)) >= 0 )
+ {
+ lastfpos = komodo_indfile_update(indfp,&prevpos100,lastfpos,fpos,func,&indcounter);
+ }
+ if ( indfp != 0 )
+ {
+ fclose(indfp);
+ if ( (fpos= komodo_stateind_validate(0,indfname,filedata,datalen,&prevpos100,&indcounter,symbol,dest)) < 0 )
+ printf("unexpected komodostate.ind validate failure %s datalen.%ld\n",indfname,datalen);
+ else printf("%s validated fpos.%ld\n",indfname,fpos);
+ }
+ finished = 1;
+ fprintf(stderr,"took %d seconds to process %s %ldKB\n",(int32_t)(time(NULL)-starttime),fname,datalen/1024);
+ }
+ else if ( validated > 0 )
+ {
+ if ( (indfp= fopen(indfname,"rb+")) != 0 )
+ {
+ lastfpos = fpos = validated;
+ fprintf(stderr,"datalen.%ld validated %ld -> indcounter %u, prevpos100 %u offset.%ld\n",datalen,validated,indcounter,prevpos100,indcounter * sizeof(uint32_t));
+ if ( fpos < datalen )
+ {
+ fseek(indfp,indcounter * sizeof(uint32_t),SEEK_SET);
+ if ( ftell(indfp) == indcounter * sizeof(uint32_t) )
+ {
+ while ( (func= komodo_parsestatefiledata(sp,filedata,&fpos,datalen,symbol,dest)) >= 0 )
+ {
+ lastfpos = komodo_indfile_update(indfp,&prevpos100,lastfpos,fpos,func,&indcounter);
+ if ( lastfpos != fpos )
+ fprintf(stderr,"unexpected lastfpos.%ld != %ld\n",lastfpos,fpos);
+ }
+ }
+ fclose(indfp);
+ }
+ printf("call validate datalen.%ld\n",datalen);
+ if ( komodo_stateind_validate(sp,indfname,filedata,datalen,&prevpos100,&indcounter,symbol,dest) < 0 )
+ printf("unexpected komodostate.ind validate failure %s datalen.%ld\n",indfname,datalen);
+ else
+ {
+ printf("%s validated updated from validated.%ld to %ld new.[%ld] -> indcounter %u, prevpos100 %u offset.%ld\n",indfname,validated,fpos,fpos-validated,indcounter,prevpos100,indcounter * sizeof(uint32_t));
+ finished = 1;
+ }
+ }
+ } else printf("komodo_faststateinit unexpected case\n");
+ printf("free filedata.%p\n",filedata);
+ free(filedata);
+ return(finished == 1);
+ }
+ return(-1);
+}
+
void komodo_passport_iteration()
{
- static long lastpos[34]; static char userpass[33][1024]; static uint32_t lasttime;
- int32_t maxseconds = 30;
- FILE *fp; int32_t baseid,n,ht,isrealtime,expired,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3],starttime; cJSON *infoobj,*result; uint64_t RTmask = 0;
- //printf("PASSPORT.(%s)\n",ASSETCHAINS_SYMBOL);
+ static long lastpos[34]; static char userpass[33][1024]; static uint32_t lasttime,callcounter;
+ int32_t maxseconds = 10;
+ FILE *fp; uint8_t *filedata; long fpos,datalen,lastfpos; int32_t baseid,limit,n,ht,isrealtime,expired,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3],starttime; cJSON *infoobj,*result; uint64_t RTmask = 0;
expired = 0;
while ( KOMODO_INITDONE == 0 )
{
if ( ASSETCHAINS_SYMBOL[0] == 0 )
{
refid = 33;
+ limit = 10000000;
jumblr_iteration();
}
else
{
+ limit = 10000000;
refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0
if ( refid == 0 )
{
return;
}*/
starttime = (uint32_t)time(NULL);
- if ( starttime == lasttime )
- {
- usleep(1000);
- return;
- }
+ if ( callcounter++ < 1 )
+ limit = 10000;
lasttime = starttime;
- //printf("PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
for (baseid=32; baseid>=0; baseid--)
{
if ( time(NULL) >= starttime+maxseconds )
sp = 0;
isrealtime = 0;
base = (char *)CURRENCIES[baseid];
- if ( baseid+1 != refid )
+ //printf("PASSPORT %s baseid+1 %d refid.%d\n",ASSETCHAINS_SYMBOL,baseid+1,refid);
+ if ( baseid+1 != refid ) // only need to import state from a different coin
{
- if ( baseid == 32 || ASSETCHAINS_SYMBOL[0] == 0 )
+ if ( baseid == 32 ) // only care about KMD's state
{
refsp->RTmask &= ~(1LL << baseid);
komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
komodo_nameset(symbol,dest,base);
sp = komodo_stateptrget(symbol);
n = 0;
- if ( (fp= fopen(fname,"rb")) != 0 && sp != 0 )
+ if ( lastpos[baseid] == 0 && (filedata= OS_fileptr(&datalen,fname)) != 0 )
+ {
+ fpos = 0;
+ fprintf(stderr,"%s processing %s %ldKB\n",ASSETCHAINS_SYMBOL,fname,datalen/1024);
+ while ( komodo_parsestatefiledata(sp,filedata,&fpos,datalen,symbol,dest) >= 0 )
+ lastfpos = fpos;
+ fprintf(stderr,"%s took %d seconds to process %s %ldKB\n",ASSETCHAINS_SYMBOL,(int32_t)(time(NULL)-starttime),fname,datalen/1024);
+ lastpos[baseid] = lastfpos;
+ free(filedata), filedata = 0;
+ datalen = 0;
+ }
+ else if ( (fp= fopen(fname,"rb")) != 0 && sp != 0 )
{
fseek(fp,0,SEEK_END);
+ //fprintf(stderr,"couldnt OS_fileptr(%s), freading %ldKB\n",fname,ftell(fp)/1024);
if ( ftell(fp) > lastpos[baseid] )
{
if ( ASSETCHAINS_SYMBOL[0] != 0 )
printf("%s passport refid.%d %s fname.(%s) base.%s %ld %ld\n",ASSETCHAINS_SYMBOL,refid,symbol,fname,base,ftell(fp),lastpos[baseid]);
fseek(fp,lastpos[baseid],SEEK_SET);
- while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 && n < 1000 )
+ while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 && n < limit )
{
- if ( n == 999 )
+ if ( n == limit-1 )
{
if ( time(NULL) < starttime+maxseconds )
n = 0;
n++;
}
lastpos[baseid] = ftell(fp);
- if ( lastpos[baseid] == 0 && strcmp(symbol,"KMD") == 0 )
+ if ( 0 && lastpos[baseid] == 0 && strcmp(symbol,"KMD") == 0 )
printf("from.(%s) lastpos[%s] %ld isrt.%d\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid],komodo_isrealtime(&ht));
} //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
fclose(fp);
- } //else printf("error.(%s) %p\n",fname,sp);
+ } else fprintf(stderr,"load error.(%s) %p\n",fname,sp);
komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
if ( (fp= fopen(fname,"rb")) != 0 )
{