diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index 53204a8c4..a03dca4ad 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -66,7 +66,7 @@ public: #include "cJSON.c" #include "komodo_notary.h" -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,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) { } diff --git a/src/komodo.h b/src/komodo.h index 7dd14d1ed..ffae64609 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -124,7 +124,18 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char errs++; //if ( matched != 0 ) global independent states -> inside *sp printf("%s load[%s] ht.%d\n",ASSETCHAINS_SYMBOL,symbol,kheight); - komodo_eventadd_kmdheight(sp,symbol,ht,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 load[%s] ht.%d t.%u\n",ASSETCHAINS_SYMBOL,symbol,kheight,ktimestamp); + komodo_eventadd_kmdheight(sp,symbol,ht,kheight,ktimestamp); } else if ( func == 'R' ) { @@ -167,7 +178,7 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char } else 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,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) { static FILE *fp; static int32_t errs; struct komodo_state *sp; char fname[512],symbol[16],dest[16]; int32_t ht,func; uint8_t num,pubkeys[64][33]; @@ -194,12 +205,25 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar //printf("fpos.%ld ",ftell(fp)); if ( KMDheight != 0 ) { - fputc('K',fp); - if ( fwrite(&height,1,sizeof(height),fp) != sizeof(height) ) - errs++; - if ( fwrite(&KMDheight,1,sizeof(KMDheight),fp) != sizeof(KMDheight) ) - errs++; - komodo_eventadd_kmdheight(sp,symbol,height,KMDheight); + if ( KMDtimestamp != 0 ) + { + fputc('T',fp); + if ( fwrite(&height,1,sizeof(height),fp) != sizeof(height) ) + errs++; + if ( fwrite(&KMDheight,1,sizeof(KMDheight),fp) != sizeof(KMDheight) ) + errs++; + if ( fwrite(&KMDtimestamp,1,sizeof(KMDtimestamp),fp) != sizeof(KMDtimestamp) ) + errs++; + } + else + { + fputc('K',fp); + if ( fwrite(&height,1,sizeof(height),fp) != sizeof(height) ) + errs++; + if ( fwrite(&KMDheight,1,sizeof(KMDheight),fp) != sizeof(KMDheight) ) + errs++; + } + komodo_eventadd_kmdheight(sp,symbol,height,KMDheight,KMDtimestamp); } else if ( opretbuf != 0 && opretlen > 0 ) { @@ -347,7 +371,7 @@ 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); + komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0); // extract X opreturns here } else printf("reject ht.%d NOTARIZED.%d %s.%s DESTTXID.%s (%s)\n",height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),desttxid.ToString().c_str(),(char *)&scriptbuf[len]); } @@ -370,7 +394,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr } } if ( *isratificationp == 0 ) - komodo_stateupdate(height,0,0,0,txhash,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); } } return(notaryid); @@ -423,7 +447,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) { printf("hwmheight.%d vs pindex->nHeight.%d reorg.%d\n",hwmheight,pindex->nHeight,hwmheight-pindex->nHeight); komodo_event_rewind(sp,symbol,pindex->nHeight); - komodo_stateupdate(pindex->nHeight,0,0,0,zero,0,0,0,0,-pindex->nHeight,0,0,0,0); + komodo_stateupdate(pindex->nHeight,0,0,0,zero,0,0,0,0,-pindex->nHeight,pindex->nTime,0,0,0,0); } komodo_currentheight_set(chainActive.Tip()->nHeight); /*if ( komodo_is_issuer() != 0 ) @@ -506,14 +530,14 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) if ( ((signedmask & 1) != 0 && numvalid >= KOMODO_MINRATIFY) || bitweight(signedmask) > (numnotaries>>1) ) { memset(&txhash,0,sizeof(txhash)); - komodo_stateupdate(height,pubkeys,numvalid,0,txhash,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); 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); } } } - if ( pindex->nHeight == hwmheight && (hwmheight % 100) == 0 ) - komodo_stateupdate(height,0,0,0,zero,0,0,0,0,height,0,0,0,0); + if ( pindex->nHeight == hwmheight ) + komodo_stateupdate(height,0,0,0,zero,0,0,0,0,height,pindex->nHeight,0,0,0,0); } else printf("komodo_connectblock: unexpected null pindex\n"); KOMODO_INITDONE = (uint32_t)time(NULL); } diff --git a/src/komodo_events.h b/src/komodo_events.h index 296824b6e..0e5439210 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -120,19 +120,25 @@ void komodo_event_rewind(struct komodo_state *sp,char *symbol,int32_t height) } } -void komodo_setkmdheight(struct komodo_state *sp,int32_t kmdheight) +void komodo_setkmdheight(struct komodo_state *sp,int32_t kmdheight,uint32_t timestamp) { if ( kmdheight > sp->SAVEDHEIGHT ) + { sp->SAVEDHEIGHT = kmdheight; + sp->SAVEDTIMESTAMP = timestamp; + } } -void komodo_eventadd_kmdheight(struct komodo_state *sp,char *symbol,int32_t height,int32_t 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 ) { - komodo_eventadd(sp,height,symbol,KOMODO_EVENT_KMDHEIGHT,(uint8_t *)&kmdheight,sizeof(kmdheight)); + 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); + komodo_setkmdheight(sp,kmdheight,timestamp); } else { diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index f8bd0aa55..ca5b80362 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -386,7 +386,7 @@ void komodo_gateway_voutupdate(char *symbol,int32_t isspecial,int32_t height,int komodo_paxpricefeed(height,&script[offset],opretlen); //printf("height.%d pricefeed len.%d\n",height,opretlen); } - else komodo_stateupdate(height,0,0,0,utxid,0,0,0,0,0,value,&script[offset],opretlen,vout); + else komodo_stateupdate(height,0,0,0,utxid,0,0,0,0,0,0,value,&script[offset],opretlen,vout); } else if ( numvouts >= KOMODO_MINRATIFY ) typestr = "ratify"; @@ -494,7 +494,7 @@ void komodo_gateway_iteration(char *symbol) if ( (KMDHEIGHT % 100) == 0 ) fprintf(stderr,"%s.%d ",symbol,KMDHEIGHT); memset(&zero,0,sizeof(zero)); - komodo_stateupdate(KMDHEIGHT,0,0,0,zero,0,0,0,0,KMDHEIGHT,0,0,0,0); + komodo_stateupdate(KMDHEIGHT,0,0,0,zero,0,0,0,0,KMDHEIGHT,0,0,0,0,0); } if ( komodo_gateway_block(symbol,KMDHEIGHT,port) < 0 ) { diff --git a/src/komodo_globals.h b/src/komodo_globals.h index b63b59c07..b69802edc 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -13,7 +13,7 @@ * * ******************************************************************************/ -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 kheight,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 kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout); void komodo_init(int32_t height); int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp); char *komodo_issuemethod(char *method,char *params,uint16_t port); diff --git a/src/komodo_notary.h b/src/komodo_notary.h index f8ae0fe39..055ecac9b 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -240,7 +240,7 @@ void komodo_init(int32_t height) // Minerids[i] = -2; didinit = 1; } - komodo_stateupdate(0,0,0,0,zero,0,0,0,0,0,0,0,0,0); + komodo_stateupdate(0,0,0,0,zero,0,0,0,0,0,0,0,0,0,0); } void komodo_assetchain_pubkeys(char *jsonstr) diff --git a/src/komodo_pax.h b/src/komodo_pax.h index d63ffa0f6..f582a9721 100644 --- a/src/komodo_pax.h +++ b/src/komodo_pax.h @@ -454,7 +454,7 @@ void komodo_paxpricefeed(int32_t height,uint8_t *pricefeed,int32_t opretlen) double KMDBTC,BTCUSD,CNYUSD; uint32_t numpvals,timestamp,pvals[128]; uint256 zero; numpvals = dpow_readprices(pricefeed,×tamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals); memset(&zero,0,sizeof(zero)); - komodo_stateupdate(height,0,0,0,zero,0,0,pvals,numpvals,0,0,0,0,0); + komodo_stateupdate(height,0,0,0,zero,0,0,pvals,numpvals,0,0,0,0,0,0); //printf("komodo_paxpricefeed vout OP_RETURN.%d prices numpvals.%d opretlen.%d\n",height,numpvals,opretlen); } diff --git a/src/komodo_structs.h b/src/komodo_structs.h index eefcf09c2..eed4103bd 100644 --- a/src/komodo_structs.h +++ b/src/komodo_structs.h @@ -71,6 +71,6 @@ struct komodo_state { uint256 NOTARIZED_HASH,NOTARIZED_DESTTXID; int32_t SAVEDHEIGHT,CURRENT_HEIGHT,NOTARIZED_HEIGHT; - uint32_t KOMODO_REALTIME; + uint32_t KOMODO_REALTIME,SAVEDTIMESTAMP; struct komodo_event **Komodo_events; int32_t Komodo_numevents; };