@ -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 ( & notarized_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 ( & notarized_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 ( & notarized_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 ( & notarized_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,9 +349,9 @@ 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 , uint256 MoM , int32_t MoMdepth )
{
static FILE * fp ; static int32_t errs , didinit ;
static FILE * fp ; static int32_t errs , didinit ; static uint256 zero ;
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 ] ;
if ( didinit = = 0 )
{
@ -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 & & sp - > MoM ! = zero )
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 & & sp - > MoM ! = zero )
{
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 ) ;
@ -537,15 +569,36 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr
len + = iguana_rwbignum ( 0 , & scriptbuf [ len ] , 32 , ( uint8_t * ) & kmdtxid ) ;
len + = iguana_rwnum ( 0 , & scriptbuf [ len ] , sizeof ( * notarizedheightp ) , ( uint8_t * ) notarizedheightp ) ;
len + = iguana_rwbignum ( 0 , & scriptbuf [ len ] , 32 , ( uint8_t * ) & desttxid ) ;
if ( notarized ! = 0 & & * notarizedheightp > sp - > NOTARIZED_HEIGHT & & * notarizedheightp < height & & ( height < sp - > CURRENT_HEIGHT - 1000 | | komodo_verifynotarization ( ASSETCHAINS_SYMBOL [ 0 ] = = 0 ? ( char * ) " KMD " : ASSETCHAINS_SYMBOL , ( char * ) ( ASSETCHAINS_SYMBOL [ 0 ] = = 0 ? " BTC " : " KMD " ) , height , * notarizedheightp , kmdtxid , desttxid ) = = 0 ) )
if ( strcmp ( " PIZZA " , ASSETCHAINS_SYMBOL ) = = 0 & & opretlen = = 110 )
{
notarized = 1 ;
}
if ( notarized ! = 0 & & * notarizedheightp > sp - > NOTARIZED_HEIGHT & & * notarizedheightp < height & & ( height < sp - > CURRENT_HEIGHT - 64 | | komodo_verifynotarization ( ASSETCHAINS_SYMBOL [ 0 ] = = 0 ? ( char * ) " KMD " : ASSETCHAINS_SYMBOL , ( char * ) ( ASSETCHAINS_SYMBOL [ 0 ] = = 0 ? " BTC " : " KMD " ) , height , * notarizedheightp , kmdtxid , desttxid ) = = 0 ) )
{
int32_t nameoffset = ( int32_t ) strlen ( ASSETCHAINS_SYMBOL ) + 1 ;
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 ) ;
len + = 4 ;
memset ( & sp - > MoM , 0 , sizeof ( sp - > MoM ) ) ;
sp - > MoMdepth = 0 ;
if ( len + 36 < = opretlen )
{
len + = iguana_rwbignum ( 0 , & scriptbuf [ len + nameoffset ] , 32 , ( uint8_t * ) & sp - > MoM ) ;
len + = iguana_rwnum ( 0 , & scriptbuf [ len + nameoffset ] , sizeof ( sp - > MoMdepth ) , ( uint8_t * ) & sp - > MoMdepth ) ;
if ( sp - > MoM = = zero | | sp - > MoMdepth > 1440 | | sp - > MoMdepth < 0 )
{
memset ( & sp - > MoM , 0 , sizeof ( sp - > MoM ) ) ;
sp - > MoMdepth = 0 ;
}
else
{
//printf("VALID %s MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,sp->MoM.ToString().c_str(),sp->MoMdepth);
}
}
komodo_stateupdate ( height , 0 , 0 , 0 , zero , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , sp - > MoM , sp - > MoMdepth ) ;
len + = nameoffset ;
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 ) ;
printf ( " [%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s lens.(%d %d) MoM.%s %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 , sp - > MoM . ToString ( ) . c_str ( ) , sp - > MoMdepth ) ;
if ( ASSETCHAINS_SYMBOL [ 0 ] = = 0 )
{
if ( signedfp = = 0 )
@ -567,11 +620,11 @@ 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 )
printf ( " notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) \n " , notarized , ( long long ) signedmask , height , * notarizedheightp , sp - > NOTARIZED_HEIGHT , ASSETCHAINS_SYMBOL [ 0 ] = = 0 ? " KMD " : ASSETCHAINS_SYMBOL , kmdtxid . ToString ( ) . c_str ( ) , desttxid . ToString ( ) . c_str ( ) , ( char * ) & scriptbuf [ len ] ) ;
} else if ( height > = sp - > CURRENT_HEIGHT - 64 ) //KOMODO_MAINNET_START )
printf ( " notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s (%s) len.%d opretlen.%d \n " , notarized , ( long long ) signedmask , height , * notarizedheightp , sp - > NOTARIZED_HEIGHT , ASSETCHAINS_SYMBOL [ 0 ] = = 0 ? " KMD " : ASSETCHAINS_SYMBOL , kmdtxid . ToString ( ) . c_str ( ) , desttxid . ToString ( ) . c_str ( ) , ( char * ) & scriptbuf [ len ] , len , opretlen ) ;
}
else if ( i = = 0 & & j = = 1 & & opretlen = = 149 )
{
@ -596,7 +649,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 +708,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 +840,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 +849,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);