|
|
|
|
@@ -73,7 +73,7 @@ int32_t komodo_currentheight()
|
|
|
|
|
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; uint256 notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33];
|
|
|
|
|
int32_t func,ht,notarized_height,num,matched=0,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33];
|
|
|
|
|
if ( (func= fgetc(fp)) != EOF )
|
|
|
|
|
{
|
|
|
|
|
if ( ASSETCHAINS_SYMBOL[0] == 0 && strcmp(symbol,"KMD") == 0 )
|
|
|
|
|
@@ -97,7 +97,7 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char
|
|
|
|
|
}
|
|
|
|
|
} else printf("illegal num.%d\n",num);
|
|
|
|
|
}
|
|
|
|
|
else if ( func == 'N' )
|
|
|
|
|
else if ( func == 'N' || func == 'M' )
|
|
|
|
|
{
|
|
|
|
|
if ( fread(¬arized_height,1,sizeof(notarized_height),fp) != sizeof(notarized_height) )
|
|
|
|
|
errs++;
|
|
|
|
|
@@ -105,10 +105,22 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char
|
|
|
|
|
errs++;
|
|
|
|
|
if ( fread(¬arized_desttxid,1,sizeof(notarized_desttxid),fp) != sizeof(notarized_desttxid) )
|
|
|
|
|
errs++;
|
|
|
|
|
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 )
|
|
|
|
|
printf("%s load[%s.%d -> %s] NOTARIZED %d %s\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str());
|
|
|
|
|
if ( func == 'M' )
|
|
|
|
|
{
|
|
|
|
|
if ( fread(&MoM,1,sizeof(MoM),fp) != sizeof(MoM) )
|
|
|
|
|
errs++;
|
|
|
|
|
if ( fread(&MoMdepth,1,sizeof(MoMdepth),fp) != sizeof(MoMdepth) )
|
|
|
|
|
errs++;
|
|
|
|
|
if ( 1 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 )
|
|
|
|
|
printf("%s load[%s.%d -> %s] NOTARIZED %d %s MoM.%s %d\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str(),MoM.ToString().c_str(),MoMdepth);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
memset(&MoM,0,sizeof(MoM));
|
|
|
|
|
MoMdepth = 0;
|
|
|
|
|
}
|
|
|
|
|
//if ( matched != 0 ) global independent states -> inside *sp
|
|
|
|
|
komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height);
|
|
|
|
|
komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height,MoM,MoMdepth);
|
|
|
|
|
}
|
|
|
|
|
else if ( func == 'U' ) // deprecated
|
|
|
|
|
{
|
|
|
|
|
@@ -208,7 +220,7 @@ int32_t memread(void *dest,int32_t size,uint8_t *filedata,long *fposp,long datal
|
|
|
|
|
int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long *fposp,long datalen,char *symbol,char *dest)
|
|
|
|
|
{
|
|
|
|
|
static int32_t errs;
|
|
|
|
|
int32_t func= -1,ht,notarized_height,num,matched=0; uint256 notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33]; long fpos = *fposp;
|
|
|
|
|
int32_t func= -1,ht,notarized_height,MoMdepth,num,matched=0; uint256 MoM,notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33]; long fpos = *fposp;
|
|
|
|
|
if ( fpos < datalen )
|
|
|
|
|
{
|
|
|
|
|
func = filedata[fpos++];
|
|
|
|
|
@@ -231,7 +243,7 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long
|
|
|
|
|
}
|
|
|
|
|
} else printf("illegal num.%d\n",num);
|
|
|
|
|
}
|
|
|
|
|
else if ( func == 'N' )
|
|
|
|
|
else if ( func == 'N' || func == 'M' )
|
|
|
|
|
{
|
|
|
|
|
if ( memread(¬arized_height,sizeof(notarized_height),filedata,&fpos,datalen) != sizeof(notarized_height) )
|
|
|
|
|
errs++;
|
|
|
|
|
@@ -239,10 +251,21 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long
|
|
|
|
|
errs++;
|
|
|
|
|
if ( memread(¬arized_desttxid,sizeof(notarized_desttxid),filedata,&fpos,datalen) != sizeof(notarized_desttxid) )
|
|
|
|
|
errs++;
|
|
|
|
|
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 )
|
|
|
|
|
printf("%s load[%s.%d -> %s] NOTARIZED %d %s\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str());
|
|
|
|
|
//if ( matched != 0 ) global independent states -> inside *sp
|
|
|
|
|
komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height);
|
|
|
|
|
if ( func == 'M' )
|
|
|
|
|
{
|
|
|
|
|
if ( memread(&MoM,sizeof(MoM),filedata,&fpos,datalen) != sizeof(MoM) )
|
|
|
|
|
errs++;
|
|
|
|
|
if ( memread(&MoMdepth,sizeof(MoMdepth),filedata,&fpos,datalen) != sizeof(MoMdepth) )
|
|
|
|
|
errs++;
|
|
|
|
|
if ( 1 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 )
|
|
|
|
|
printf("%s load[%s.%d -> %s] NOTARIZED %d %s MoM.%s %d\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str(),MoM.ToString().c_str(),MoMdepth);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
memset(&MoM,0,sizeof(MoM));
|
|
|
|
|
MoMdepth = 0;
|
|
|
|
|
}
|
|
|
|
|
komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height,MoM,MoMdepth);
|
|
|
|
|
}
|
|
|
|
|
else if ( func == 'U' ) // deprecated
|
|
|
|
|
{
|
|
|
|
|
@@ -326,7 +349,7 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long
|
|
|
|
|
return(-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout)
|
|
|
|
|
void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,bits256 MoM,int32_t MoMdepth)
|
|
|
|
|
{
|
|
|
|
|
static FILE *fp; static int32_t errs,didinit;
|
|
|
|
|
struct komodo_state *sp; char fname[512],symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; int32_t retval,ht,func; uint8_t num,pubkeys[64][33];
|
|
|
|
|
@@ -457,7 +480,9 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar
|
|
|
|
|
//printf("ht.%d func N ht.%d errs.%d\n",height,NOTARIZED_HEIGHT,errs);
|
|
|
|
|
if ( sp != 0 )
|
|
|
|
|
{
|
|
|
|
|
fputc('N',fp);
|
|
|
|
|
if ( sp->MoMdepth > 0 && bits256_nonz(sp->MoM) != 0 )
|
|
|
|
|
fputc('M',fp);
|
|
|
|
|
else fputc('N',fp);
|
|
|
|
|
if ( fwrite(&height,1,sizeof(height),fp) != sizeof(height) )
|
|
|
|
|
errs++;
|
|
|
|
|
if ( fwrite(&sp->NOTARIZED_HEIGHT,1,sizeof(sp->NOTARIZED_HEIGHT),fp) != sizeof(sp->NOTARIZED_HEIGHT) )
|
|
|
|
|
@@ -466,7 +491,14 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar
|
|
|
|
|
errs++;
|
|
|
|
|
if ( fwrite(&sp->NOTARIZED_DESTTXID,1,sizeof(sp->NOTARIZED_DESTTXID),fp) != sizeof(sp->NOTARIZED_DESTTXID) )
|
|
|
|
|
errs++;
|
|
|
|
|
komodo_eventadd_notarized(sp,symbol,height,dest,sp->NOTARIZED_HASH,sp->NOTARIZED_DESTTXID,sp->NOTARIZED_HEIGHT);
|
|
|
|
|
if ( sp->MoMdepth > 0 && bits256_nonz(sp->MoM) != 0 )
|
|
|
|
|
{
|
|
|
|
|
if ( fwrite(&sp->MoM,1,sizeof(sp->MoM),fp) != sizeof(sp->MoM) )
|
|
|
|
|
errs++;
|
|
|
|
|
if ( fwrite(&sp->MoMdepth,1,sizeof(sp->MoMdepth),fp) != sizeof(sp->MoMdepth) )
|
|
|
|
|
errs++;
|
|
|
|
|
}
|
|
|
|
|
komodo_eventadd_notarized(sp,symbol,height,dest,sp->NOTARIZED_HASH,sp->NOTARIZED_DESTTXID,sp->NOTARIZED_HEIGHT,sp->MoM,sp->MoMdepth);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
fflush(fp);
|
|
|
|
|
@@ -542,7 +574,21 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr
|
|
|
|
|
sp->NOTARIZED_HEIGHT = *notarizedheightp;
|
|
|
|
|
sp->NOTARIZED_HASH = kmdtxid;
|
|
|
|
|
sp->NOTARIZED_DESTTXID = desttxid;
|
|
|
|
|
komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0);
|
|
|
|
|
if ( len+36 <= opretlen )
|
|
|
|
|
{
|
|
|
|
|
len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&sp->MoM);
|
|
|
|
|
len += iguana_rwnum(0,&scriptbuf[len],sizeof(*notarizedheightp),(uint8_t *)&sp->MoMdepth);
|
|
|
|
|
if ( bits256_nonz(sp->MoM) == 0 || sp->MoMdepth > 1440 || sp->MoMdepth < 0 )
|
|
|
|
|
{
|
|
|
|
|
memset(sp->MoM.bytes,0,sizeof(sp->MoM));
|
|
|
|
|
sp->MoMdepth = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
printf("%s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,bits256_str(str,sp->MoM),sp->M<oMdepth);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth);
|
|
|
|
|
len += 4;
|
|
|
|
|
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
|
|
|
|
printf("[%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d)\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),opretlen,len);
|
|
|
|
|
@@ -567,7 +613,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr
|
|
|
|
|
//for (i=0; i<opretlen-len; i++)
|
|
|
|
|
// printf("%02x",scriptbuf[len+i]);
|
|
|
|
|
//printf(" Found extradata.[%d] %d - %d\n",opretlen-len,opretlen,len);
|
|
|
|
|
komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen-len+4+3+(scriptbuf[1] == 0x4d),j);
|
|
|
|
|
komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen-len+4+3+(scriptbuf[1] == 0x4d),j,zero,0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if ( height >= KOMODO_MAINNET_START )
|
|
|
|
|
@@ -596,7 +642,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( *isratificationp == 0 && (signedmask != 0 || (scriptbuf[len] != 'X' && scriptbuf[len] != 'A')) ) // && scriptbuf[len] != 'I')
|
|
|
|
|
komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen,j);
|
|
|
|
|
komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,0,value,&scriptbuf[len],opretlen,j,zero,0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return(notaryid);
|
|
|
|
|
@@ -655,7 +701,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block)
|
|
|
|
|
if ( pindex->nHeight != hwmheight )
|
|
|
|
|
printf("%s hwmheight.%d vs pindex->nHeight.%d t.%u reorg.%d\n",ASSETCHAINS_SYMBOL,hwmheight,pindex->nHeight,(uint32_t)pindex->nTime,hwmheight-pindex->nHeight);
|
|
|
|
|
komodo_event_rewind(sp,symbol,pindex->nHeight);
|
|
|
|
|
komodo_stateupdate(pindex->nHeight,0,0,0,zero,0,0,0,0,-pindex->nHeight,pindex->nTime,0,0,0,0);
|
|
|
|
|
komodo_stateupdate(pindex->nHeight,0,0,0,zero,0,0,0,0,-pindex->nHeight,pindex->nTime,0,0,0,0,zero,0);
|
|
|
|
|
}
|
|
|
|
|
komodo_currentheight_set(chainActive.Tip()->nHeight);
|
|
|
|
|
if ( pindex != 0 )
|
|
|
|
|
@@ -787,7 +833,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block)
|
|
|
|
|
if ( ((signedmask & 1) != 0 && numvalid >= KOMODO_MINRATIFY) || bitweight(signedmask) > (numnotaries/3) )
|
|
|
|
|
{
|
|
|
|
|
memset(&txhash,0,sizeof(txhash));
|
|
|
|
|
komodo_stateupdate(height,pubkeys,numvalid,0,txhash,0,0,0,0,0,0,0,0,0,0);
|
|
|
|
|
komodo_stateupdate(height,pubkeys,numvalid,0,txhash,0,0,0,0,0,0,0,0,0,0,zero,0);
|
|
|
|
|
printf("RATIFIED! >>>>>>>>>> new notaries.%d newheight.%d from height.%d\n",numvalid,(((height+KOMODO_ELECTION_GAP/2)/KOMODO_ELECTION_GAP)+1)*KOMODO_ELECTION_GAP,height);
|
|
|
|
|
} else printf("signedmask.%llx numvalid.%d wt.%d numnotaries.%d\n",(long long)signedmask,numvalid,bitweight(signedmask),numnotaries);
|
|
|
|
|
}
|
|
|
|
|
@@ -796,7 +842,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block)
|
|
|
|
|
if ( NOTARY_PUBKEY33[0] != 0 && ASSETCHAINS_SYMBOL[0] == 0 )
|
|
|
|
|
printf("%s ht.%d\n",ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL,height);
|
|
|
|
|
if ( pindex->nHeight == hwmheight )
|
|
|
|
|
komodo_stateupdate(height,0,0,0,zero,0,0,0,0,height,(uint32_t)pindex->nTime,0,0,0,0);
|
|
|
|
|
komodo_stateupdate(height,0,0,0,zero,0,0,0,0,height,(uint32_t)pindex->nTime,0,0,0,0,zero,0);
|
|
|
|
|
} else fprintf(stderr,"komodo_connectblock: unexpected null pindex\n");
|
|
|
|
|
//KOMODO_INITDONE = (uint32_t)time(NULL);
|
|
|
|
|
//fprintf(stderr,"%s end connect.%d\n",ASSETCHAINS_SYMBOL,pindex->nHeight);
|
|
|
|
|
|