From ab91876752f093be6c1345bdde46d7d72b141a1c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 19 Nov 2016 11:48:56 -0300 Subject: [PATCH] test --- src/bitcoind.cpp | 9 +--- src/komodo.h | 60 +++++++--------------- src/komodo_events.h | 105 ++++++++++++++++----------------------- src/komodo_gateway.h | 86 ++++++++++++++++++++------------ src/komodo_globals.h | 9 +--- src/komodo_notary.h | 2 +- src/komodo_structs.h | 36 +++++++++++++- src/komodo_utils.h | 85 ++++++++++++++++++++++++++----- src/miner.cpp | 13 ++--- src/util.cpp | 8 +-- src/wallet/rpcwallet.cpp | 4 +- 11 files changed, 235 insertions(+), 182 deletions(-) diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index 1f7267701..5cb5a92fc 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -33,9 +33,7 @@ static bool fDaemon; extern char ASSETCHAINS_SYMBOL[16]; -void komodo_gateway_iteration(char *symbol); -void komodo_iteration(char *symbol); -int32_t komodo_is_issuer(); +void komodo_passport_iteration(); void WaitForShutdown(boost::thread_group* threadGroup) { @@ -44,10 +42,7 @@ void WaitForShutdown(boost::thread_group* threadGroup) while (!fShutdown) { MilliSleep(10000); - if ( komodo_is_issuer() != 0 ) - komodo_gateway_iteration(ASSETCHAINS_SYMBOL); - else komodo_iteration((char *)"EUR"); - + komodo_passport_iteration(); fShutdown = ShutdownRequested(); } if (threadGroup) diff --git a/src/komodo.h b/src/komodo.h index ed05c1a46..18d8a5a0d 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -41,21 +41,16 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block); #include "komodo_globals.h" #include "komodo_utils.h" -void komodo_setkmdheight(int32_t kmdheight) -{ - if ( kmdheight > KMDHEIGHT ) - KMDHEIGHT = kmdheight; -} - #include "cJSON.c" #include "komodo_bitcoind.h" #include "komodo_interest.h" #include "komodo_pax.h" #include "komodo_notary.h" + +int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char *dest); #include "komodo_gateway.h" #include "komodo_events.h" - void komodo_currentheight_set(int32_t height) { char symbol[16],dest[16]; struct komodo_state *sp; @@ -177,25 +172,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar return; if ( fp == 0 ) { -#ifdef WIN32 - sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"komodostate"); - //sprintf(fname2,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"minerids"); -#else - sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),(char *)"komodostate"); - //sprintf(fname2,"%s/%s",GetDataDir(false).string().c_str(),(char *)"minerids"); -#endif - /*memset(Minerids,0xfe,sizeof(Minerids)); - if ( (Minerfp= fopen(fname2,"rb+")) == 0 ) - { - if ( (Minerfp= fopen(fname2,"wb")) != 0 ) - { - fwrite(Minerids,1,sizeof(Minerids),Minerfp); - fclose(Minerfp); - } - Minerfp = fopen(fname2,"rb+"); - } - if ( Minerfp != 0 && fread(Minerids,1,sizeof(Minerids),Minerfp) != sizeof(Minerids) ) - printf("read error Minerids\n");*/ + komodo_statefname(fname,ASSETCHAINS_SYMBOL); if ( (fp= fopen(fname,"rb+")) != 0 ) { while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 ) @@ -212,7 +189,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar if ( fp != 0 ) // write out funcid, height, other fields, call side effect function { //printf("fpos.%ld ",ftell(fp)); - if ( KMDheight > 0 ) + if ( KMDheight != 0 ) { fputc('K',fp); if ( fwrite(&height,1,sizeof(height),fp) != sizeof(height) ) @@ -368,6 +345,7 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr sp->NOTARIZED_HASH = kmdtxid; sp->NOTARIZED_DESTTXID = desttxid; komodo_stateupdate(height,0,0,0,zero,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]); } else if ( i == 0 && j == 1 && opretlen == 149 ) @@ -407,7 +385,7 @@ int32_t komodo_isratify(int32_t isspecial,int32_t numvalid) // if all outputs to notary -> notary utxo // if txi == 0 && 2 outputs and 2nd OP_RETURN, len == 32*2+4 -> notarized, 1st byte 'P' -> pricefeed // OP_RETURN: 'D' -> deposit, 'W' -> withdraw -void komodo_currentheight_set(int32_t height); + int32_t gettxout_scriptPubKey(uint8_t *scriptPubKey,int32_t maxsize,uint256 txid,int32_t n); int32_t komodo_notarycmp(uint8_t *scriptPubKey,int32_t scriptlen,uint8_t pubkeys[64][33],int32_t numnotaries,uint8_t rmd160[20]) @@ -428,9 +406,12 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) { static int32_t hwmheight; uint64_t signedmask,voutmask; char symbol[16],dest[16]; struct komodo_state *sp; - uint8_t scriptbuf[4096],pubkeys[64][33],rmd160[20],scriptPubKey[35]; uint256 kmdtxid,btctxid,txhash; + uint8_t scriptbuf[4096],pubkeys[64][33],rmd160[20],scriptPubKey[35]; uint256 kmdtxid,zero,btctxid,txhash; int32_t i,j,k,numnotaries,scriptlen,isratification,nid,numvalid,specialtx,notarizedheight,notaryid,len,numvouts,numvins,height,txn_count; + memset(zero.bytes,0,sizeof(zero)); komodo_init(pindex->nHeight); + if ( (sp= komodo_stateptr(symbol,dest)) == 0 ) + return; numnotaries = komodo_notaries(pubkeys,pindex->nHeight); calc_rmd160_sha256(rmd160,pubkeys[0],33); if ( pindex->nHeight > hwmheight ) @@ -438,20 +419,19 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) else { printf("hwmheight.%d vs pindex->nHeight.%d reorg.%d\n",hwmheight,pindex->nHeight,hwmheight-pindex->nHeight); - if ( (sp= komodo_stateptr(symbol,dest)) != 0 ) - komodo_event_rewind(sp,symbol,pindex->nHeight); - // komodo_stateupdate(); + 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_currentheight_set(chainActive.Tip()->nHeight); - if ( komodo_is_issuer() != 0 ) + /*if ( komodo_is_issuer() != 0 ) { while ( KOMODO_REALTIME == 0 || time(NULL) <= KOMODO_REALTIME ) { fprintf(stderr,"komodo_connect.(%s) waiting for realtime RT.%u now.%u\n",ASSETCHAINS_SYMBOL,KOMODO_REALTIME,(uint32_t)time(NULL)); sleep(30); } - } - KOMODO_REALTIME = KOMODO_INITDONE = (uint32_t)time(NULL); + }*/ + sp->KOMODO_REALTIME = KOMODO_INITDONE = (uint32_t)time(NULL); if ( pindex != 0 ) { height = pindex->nHeight; @@ -481,10 +461,6 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) } } } - if ( i != 0 && notaryid >= 0 && notaryid < 64 && voutmask != 0 ) - { - //komodo_stateupdate(height,0,0,notaryid,txhash,voutmask,numvouts,0,0,0,0,0,0,0); - } signedmask = 0; numvins = block.vtx[i].vin.size(); for (j=0; j= 0 ) signedmask |= (1LL << k); } - /*if ( (k= komodo_nutxofind(height,block.vtx[i].vin[j].prevout.hash,block.vtx[i].vin[j].prevout.n)) >= 0 ) - signedmask |= (1LL << k); - else if ( signedmask != 0 ) - printf("signedmask.%llx but ht.%d i.%d j.%d not found (%s %d)\n",(long long)signedmask,height,i,j,block.vtx[i].vin[j].prevout.hash.ToString().c_str(),block.vtx[i].vin[j].prevout.n);*/ } if ( signedmask != 0 ) printf("ht.%d signedmask.%llx numvins.%d numvouts.%d\n",height,(long long)signedmask,numvins,numvouts); @@ -537,6 +509,8 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) } } } + if ( pindex->nHeight == hwmheight && (hwmheight % 100) == 0 ) + komodo_stateupdate(height,0,0,0,zero,0,0,0,0,height,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 017fcb145..e006803c1 100644 --- a/src/komodo_events.h +++ b/src/komodo_events.h @@ -16,45 +16,7 @@ #ifndef H_KOMODOEVENTS_H #define H_KOMODOEVENTS_H - -#ifdef WIN32 -#define PACKED -#else -#define PACKED __attribute__((packed)) -#endif - -#define KOMODO_EVENT_RATIFY 'P' -#define KOMODO_EVENT_NOTARIZED 'N' -#define KOMODO_EVENT_UTXO 'U' -#define KOMODO_EVENT_KMDHEIGHT 'K' -#define KOMODO_EVENT_REWIND 'B' -//#define KOMODO_EVENT_DELETE 'D' -#define KOMODO_EVENT_PRICEFEED 'V' -#define KOMODO_EVENT_OPRETURN 'R' -#define KOMODO_OPRETURN_DEPOSIT 'D' -#define KOMODO_OPRETURN_ISSUED 'I' // assetchain -#define KOMODO_OPRETURN_WITHDRAW 'W' // assetchain -#define KOMODO_OPRETURN_REDEEMED 'X' - -struct komodo_event_notarized { uint256 blockhash,desttxid; int32_t notarizedheight; char dest[16]; }; -struct komodo_event_pubkeys { uint8_t num; uint8_t pubkeys[64][33]; }; -struct komodo_event_utxo { uint256 txid; uint64_t voutmask; uint8_t numvouts; }; -struct komodo_event_opreturn { uint256 txid; uint64_t value; uint16_t vout,oplen; uint8_t opret[]; }; -struct komodo_event_pricefeed { uint8_t num; uint32_t prices[35]; }; - -struct komodo_event -{ - struct komodo_event *related; - uint16_t len; - int32_t height; - uint8_t type,reorged; - char symbol[16]; - uint8_t space[]; -} PACKED; - -struct komodo_event **Komodo_events; int32_t Komodo_numevents; - -struct komodo_event *komodo_eventadd(int32_t height,char *symbol,uint8_t type,uint8_t *data,uint16_t datalen) +struct komodo_event *komodo_eventadd(struct komodo_state *sp,int32_t height,char *symbol,uint8_t type,uint8_t *data,uint16_t datalen) { struct komodo_event *ep; uint16_t len = (uint16_t)(sizeof(*ep) + datalen); ep = (struct komodo_event *)calloc(1,len); @@ -64,8 +26,8 @@ struct komodo_event *komodo_eventadd(int32_t height,char *symbol,uint8_t type,ui strcpy(ep->symbol,symbol); if ( datalen != 0 ) memcpy(ep->space,data,datalen); - Komodo_events = (struct komodo_event **)realloc(Komodo_events,(1 + Komodo_numevents) * sizeof(*Komodo_events)); - Komodo_events[Komodo_numevents++] = ep; + sp->Komodo_events = (struct komodo_event **)realloc(sp->Komodo_events,(1 + sp->Komodo_numevents) * sizeof(*Komodo_events)); + sp->Komodo_events[sp->Komodo_numevents++] = ep; return(ep); } @@ -77,7 +39,7 @@ void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t heig N.desttxid = notarized_desttxid; N.notarizedheight = notarizedheight; strcpy(N.dest,dest); - komodo_eventadd(height,symbol,KOMODO_EVENT_NOTARIZED,(uint8_t *)&N,sizeof(N)); + komodo_eventadd(sp,height,symbol,KOMODO_EVENT_NOTARIZED,(uint8_t *)&N,sizeof(N)); if ( sp != 0 ) komodo_notarized_update(sp,height,notarizedheight,notarized_hash,notarized_desttxid); } @@ -89,7 +51,7 @@ void komodo_eventadd_pubkeys(struct komodo_state *sp,char *symbol,int32_t height memset(&P,0,sizeof(P)); P.num = num; memcpy(P.pubkeys,pubkeys,33 * num); - komodo_eventadd(height,symbol,KOMODO_EVENT_RATIFY,(uint8_t *)&P,(int32_t)(sizeof(P.num) + 33 * num)); + komodo_eventadd(sp,height,symbol,KOMODO_EVENT_RATIFY,(uint8_t *)&P,(int32_t)(sizeof(P.num) + 33 * num)); if ( sp != 0 ) komodo_notarysinit(height,pubkeys,num); } @@ -112,18 +74,11 @@ void komodo_eventadd_pricefeed(struct komodo_state *sp,char *symbol,int32_t heig memset(&F,0,sizeof(F)); F.num = num; memcpy(F.prices,prices,sizeof(*F.prices) * num); - komodo_eventadd(height,symbol,KOMODO_EVENT_PRICEFEED,(uint8_t *)&F,(int32_t)(sizeof(F.num) + sizeof(*F.prices) * num)); + komodo_eventadd(sp,height,symbol,KOMODO_EVENT_PRICEFEED,(uint8_t *)&F,(int32_t)(sizeof(F.num) + sizeof(*F.prices) * num)); if ( sp != 0 ) komodo_pvals(height,prices,num); } -void komodo_eventadd_kmdheight(struct komodo_state *sp,char *symbol,int32_t height,int32_t kmdheight) -{ - komodo_eventadd(height,symbol,KOMODO_EVENT_KMDHEIGHT,(uint8_t *)&kmdheight,sizeof(kmdheight)); - if ( sp != 0 ) - komodo_setkmdheight(kmdheight); -} - void komodo_eventadd_opreturn(struct komodo_state *sp,char *symbol,int32_t height,uint256 txid,uint64_t value,uint16_t vout,uint8_t *buf,uint16_t opretlen) { struct komodo_event_opreturn O; uint8_t opret[10000]; @@ -134,21 +89,26 @@ void komodo_eventadd_opreturn(struct komodo_state *sp,char *symbol,int32_t heigh memcpy(opret,&O,sizeof(O)); memcpy(&opret[sizeof(O)],buf,opretlen); O.oplen = (int32_t)(opretlen + sizeof(O)); - komodo_eventadd(height,symbol,KOMODO_EVENT_OPRETURN,opret,O.oplen); + komodo_eventadd(sp,height,symbol,KOMODO_EVENT_OPRETURN,opret,O.oplen); if ( sp != 0 ) komodo_opreturn(height,value,buf,opretlen,txid,vout); } -void komodo_event_undo(struct komodo_event *ep) +void komodo_event_undo(struct komodo_state *sp,struct komodo_event *ep) { switch ( ep->type ) { - case KOMODO_EVENT_RATIFY: - case KOMODO_EVENT_NOTARIZED: - case KOMODO_EVENT_UTXO: + case KOMODO_EVENT_RATIFY: printf("rewind of ratify, needs to be coded.%d\n",ep->height); break; + case KOMODO_EVENT_NOTARIZED: printf("unexpected rewind of notarization.%d\n",ep->height); break; case KOMODO_EVENT_KMDHEIGHT: + if ( ep->height <= sp->SAVEDHEIGHT ) + sp->SAVEDHEIGHT = ep->height; + break; case KOMODO_EVENT_PRICEFEED: + // backtrack prices; + break; case KOMODO_EVENT_OPRETURN: + // backtrack opreturns break; } } @@ -156,23 +116,46 @@ void komodo_event_undo(struct komodo_event *ep) void komodo_event_rewind(struct komodo_state *sp,char *symbol,int32_t height) { struct komodo_event *ep; - komodo_eventadd(height,symbol,KOMODO_EVENT_REWIND,(uint8_t *)&height,sizeof(height)); if ( sp != 0 ) { - while ( Komodo_numevents > 0 ) + while ( sp->Komodo_events != 0 && sp->Komodo_numevents > 0 ) { - if ( (ep= Komodo_events[Komodo_numevents-1]) != 0 ) + if ( (ep= sp->Komodo_events[sp->Komodo_numevents-1]) != 0 ) { if ( ep->height < height ) break; printf("undo event.%c ht.%d for rewind.%d\n",ep->type,ep->height,height); - komodo_event_undo(ep); - Komodo_numevents--; + komodo_event_undo(sp,ep); + sp->Komodo_numevents--; } } } } +void komodo_setkmdheight(struct komodo_state *sp,int32_t kmdheight) +{ + if ( kmdheight > sp->SAVEDHEIGHT ) + sp->SAVEDHEIGHT = kmdheight; +} + +void komodo_eventadd_kmdheight(struct komodo_state *sp,char *symbol,int32_t height,int32_t kmdheight) +{ + if ( kmdheight > 0 ) + { + komodo_eventadd(sp,height,symbol,KOMODO_EVENT_KMDHEIGHT,(uint8_t *)&kmdheight,sizeof(kmdheight)); + if ( sp != 0 ) + komodo_setkmdheight(sp,kmdheight); + } + else + { + kmdheight = -kmdheight; + komodo_eventadd(so,height,symbol,KOMODO_EVENT_REWIND,(uint8_t *)&height,sizeof(height)); + if ( sp != 0 ) + komodo_event_rewind(sp,symbol,height); + } +} + + /*void komodo_eventadd_deposit(int32_t actionflag,char *symbol,int32_t height,uint64_t komodoshis,char *fiat,uint64_t fiatoshis,uint8_t rmd160[20],bits256 kmdtxid,uint16_t kmdvout,uint64_t price) { uint8_t opret[512]; uint16_t opretlen; diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index d72c4b1c0..01702f303 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -110,12 +110,9 @@ void komodo_gateway_deposit(char *coinaddr,uint64_t value,int32_t shortflag,char } } -int32_t komodo_issued_opreturn(uint8_t *shortflagp,char *base,uint256 *txids,uint16_t *vouts,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo) +int32_t komodo_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo) { int32_t i,n=0,j,len; - if ( opretbuf[opretlen-5] == '-' ) - *shortflagp = 1; - else *shortflagp = 0; for (i=0; i<4; i++) base[i] = opretbuf[opretlen-4+i]; if ( ASSETCHAINS_SYMBOL[0] == 0 || strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0 ) // shortflag @@ -143,7 +140,7 @@ int32_t komodo_issued_opreturn(uint8_t *shortflagp,char *base,uint256 *txids,uin for (i=0; opretbuf[len+i]!=0&&i<3; i++) symbol[i] = opretbuf[len+i]; symbol[i] = 0; - printf(">>>>>>> iskomodo X: (%s) fiat %.8f kmdheight.%d other.%d short.%d\n",symbol,dstr(fiatoshis),height,otherheight,shortflag); + printf(">>>>>>> iskomodo X: (%s) fiat %.8f kmdheight.%d other.%d\n",symbol,dstr(fiatoshis),height,otherheight); } } } @@ -223,7 +220,7 @@ int32_t komodo_gateway_deposits(CMutableTransaction *txNew,int32_t shortflag,cha int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above block is valid pax pricing { - int32_t i,j,n,num,opretlen,offset=1,errs=0,matched=0; uint256 hash,txids[64]; uint8_t shortflag; char symbol[16],base[16]; uint16_t vouts[64]; uint8_t *script,opcode; struct pax_transaction *pax,space; + int32_t i,j,n,num,opretlen,offset=1,errs=0,matched=0; uint256 hash,txids[64]; char symbol[16],base[16]; uint16_t vouts[64]; uint8_t *script,opcode; struct pax_transaction *pax,space; n = block.vtx[0].vout.size(); script = (uint8_t *)block.vtx[0].vout[n-1].scriptPubKey.data(); if ( n <= 2 || script[0] != 0x6a ) @@ -244,7 +241,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above } if ( script[offset] == opcode && opretlen < block.vtx[0].vout[n-1].scriptPubKey.size() ) { - if ( (num= komodo_issued_opreturn(&shortflag,base,txids,vouts,&script[offset],opretlen,opcode == 'X')) > 0 ) + if ( (num= komodo_issued_opreturn(base,txids,vouts,&script[offset],opretlen,opcode == 'X')) > 0 ) { for (i=1; i= checktoshis || (seed == 0 && diff < .01) ) { - for (i=0; i<32; i++) - printf("%02x",((uint8_t *)&txid)[i]); - printf(" <- txid.v%u ",vout); - for (i=0; i<33; i++) - printf("%02x",pubkey33[i]); - printf(" checkpubkey check %.8f v %.8f dest.(%s) kmdheight.%d height.%d\n",dstr(checktoshis),dstr(value),destaddr,kmdheight,height); - if ( value >= checktoshis || (seed == 0 && diff < .01) ) + if ( komodo_paxfind(&space,txid,vout) == 0 ) { - if ( komodo_paxfind(&space,txid,vout) == 0 ) - { - komodo_gateway_deposit(coinaddr,value,shortflag,base,fiatoshis,rmd160,txid,vout,kmdheight,height); - } else printf("duplicate deposit\n"); - } - } - else // short - { - for (i=0; i 0 && shortflag == ASSETCHAINS_SHORTFLAG ) + if ( (n= komodo_issued_opreturn(&shortflag,base,txids,vouts,opretbuf,opretlen,0)) > 0 ) { for (i=0; i= kmdheight ) - KOMODO_REALTIME = (uint32_t)time(NULL); + sp->KOMODO_REALTIME = (uint32_t)time(NULL); } free_json(infoobj); } @@ -570,3 +555,38 @@ void komodo_iteration(char *symbol) } } } +#else + +void komodo_gateway_iteration() +{ + static long lastpos[33]; + FILE *fp; int32_t baseid,refid; struct komodo_state *sp; char fname[512],*base,dest[16]; + if ( ASSETCHAINS_SYMBOL[0] == 0 ) + refid = 32; + else refid = komodo_baseid(ASSETCHAINS_SYMBOL); + if ( refid >= 0 ) + { + for (baseid=0; baseid<=32; baseid++) + { + if ( baseid != refid ) // use direct data for yourself + { + komodo_statefname(fname,""); + komodo_nameset(symbol,dest,source); + if ( (fp= fopen(fname,"rb")) != 0 ) + { + fseek(fp,lastpos,SEEK_SET); + if ( ftell(fp) > lastpos[baseid] ) + { + while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 ) + ; + lastpos[baseid] = ftell(fp); + printf("%s lastpos[%s] %ld\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid]); + } + fclose(fp); + } + } + } + } +} +#endif + diff --git a/src/komodo_globals.h b/src/komodo_globals.h index f5eba4929..db4b55be4 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -20,19 +20,15 @@ char *komodo_issuemethod(char *method,char *params,uint16_t port); void komodo_init(int32_t height); void komodo_assetchain_pubkeys(char *jsonstr); int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33); +int32_t komodo_isrealtime(int32_t *kmdheightp,char *target); pthread_mutex_t komodo_mutex; -//FILE *Minerfp; -//int8_t Minerids[KOMODO_MAXBLOCKS]; // 5 million blocks #define KOMODO_ELECTION_GAP ((ASSETCHAINS_SYMBOL[0] == 0) ? 2000 : 100) -int32_t KMDHEIGHT = 43000; - struct pax_transaction *PAX; int32_t NUM_PRICES; uint32_t *PVALS; struct knotaries_entry *Pubkeys; -//struct nutxo_entry *NUTXOS; int32_t Num_nutxos; struct notarized_checkpoint *NPOINTS; int32_t NUM_NPOINTS; struct komodo_state KOMODO_STATES[33]; @@ -43,13 +39,12 @@ int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED, std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES; uint8_t NOTARY_PUBKEY33[33]; -int32_t ASSETCHAINS_SHORTFLAG; char ASSETCHAINS_SYMBOL[16]; uint16_t ASSETCHAINS_PORT; uint32_t ASSETCHAIN_INIT; uint32_t ASSETCHAINS_MAGIC = 2387029918; uint64_t ASSETCHAINS_SUPPLY = 10; -uint32_t KOMODO_INITDONE,KOMODO_REALTIME; +uint32_t KOMODO_INITDONE; char KMDUSERPASS[1024]; uint16_t BITCOIND_PORT = 7771; uint64_t PENDING_KOMODO_TX; diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 954c029a5..64ffb21fd 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -208,7 +208,7 @@ void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t not sp->NOTARIZED_DESTTXID = np->notarized_desttxid = notarized_desttxid; } -struct komodo_state *komodo_stateptr(char *symbol,char *dest); +//struct komodo_state *komodo_stateptr(char *symbol,char *dest); int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp) { char symbol[16],dest[16]; struct komodo_state *sp; diff --git a/src/komodo_structs.h b/src/komodo_structs.h index dd653fc37..a5e17e8ae 100644 --- a/src/komodo_structs.h +++ b/src/komodo_structs.h @@ -16,10 +16,42 @@ #include "uthash.h" #include "utlist.h" +#ifdef WIN32 +#define PACKED +#else +#define PACKED __attribute__((packed)) +#endif + #define GENESIS_NBITS 0x1f00ffff #define KOMODO_MINRATIFY 7 #define KOMODO_MAXBLOCKS 5000000 +#define KOMODO_EVENT_RATIFY 'P' +#define KOMODO_EVENT_NOTARIZED 'N' +#define KOMODO_EVENT_KMDHEIGHT 'K' +#define KOMODO_EVENT_REWIND 'B' +#define KOMODO_EVENT_PRICEFEED 'V' +#define KOMODO_EVENT_OPRETURN 'R' +#define KOMODO_OPRETURN_DEPOSIT 'D' +#define KOMODO_OPRETURN_ISSUED 'I' // assetchain +#define KOMODO_OPRETURN_WITHDRAW 'W' // assetchain +#define KOMODO_OPRETURN_REDEEMED 'X' + +struct komodo_event_notarized { uint256 blockhash,desttxid; int32_t notarizedheight; char dest[16]; }; +struct komodo_event_pubkeys { uint8_t num; uint8_t pubkeys[64][33]; }; +struct komodo_event_opreturn { uint256 txid; uint64_t value; uint16_t vout,oplen; uint8_t opret[]; }; +struct komodo_event_pricefeed { uint8_t num; uint32_t prices[35]; }; + +struct komodo_event +{ + struct komodo_event *related; + uint16_t len; + int32_t height; + uint8_t type,reorged; + char symbol[16]; + uint8_t space[]; +} PACKED; + struct pax_transaction { UT_hash_handle hh; @@ -38,6 +70,6 @@ struct notarized_checkpoint { uint256 notarized_hash,notarized_desttxid; int32_t struct komodo_state { uint256 NOTARIZED_HASH,NOTARIZED_DESTTXID; - int32_t CURRENT_HEIGHT,NOTARIZED_HEIGHT,rewinding; - // gateway state + int32_t SAVEDHEIGHT,CURRENT_HEIGHT,NOTARIZED_HEIGHT,rewinding; + struct komodo_event **Komodo_events; int32_t Komodo_numevents; }; diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 78d38141d..dc753a3e6 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1261,6 +1261,36 @@ void komodo_userpass(char *username,char *password,FILE *fp) free(rpcpassword); } +void komodo_statefname(char *fname,char *symbol) +{ + int32_t n,len; + sprintf(fname,"%s",GetDataDir(false).string().c_str()); + if ( (n= (int32_t)strlen(ASSETCHAINS_SYMBOL)) != 0 ) + { + len = (int32_t)strlen(fname); + if ( strcmp(ASSETCHAINS_SYMBOL,&fname[len - n]) == 0 ) + { + fname[len - n] = 0; + if ( symbol[0] != 0 ) + { + strcpy(&fname[len - n],symbol); +#ifdef WIN32 + strcat(fname,"\\"); +#else + strcat(fname,"//"); +#endif + } + } + else + { + printf("unexpected fname.(%s) vs %s\n",fname,ASSETCHAINS_SYMBOL); + return; + } + } + strcat(fname,(char *)"komodostate"); + printf("statename.(%s) %s\n",symbol,fname); +} + void komodo_configfile(char *symbol,uint16_t port) { static char myusername[512],mypassword[8192]; @@ -1327,7 +1357,7 @@ uint32_t komodo_assetmagic(char *symbol,uint64_t supply) return(calc_crc32(0,buf,len)); } -int32_t komodo_shortflag(char *symbol) +/*int32_t komodo_shortflag(char *symbol) { int32_t i,shortflag = 0; if ( symbol[0] == '-' ) @@ -1338,17 +1368,16 @@ int32_t komodo_shortflag(char *symbol) symbol[i] = 0; } return(shortflag); -} +}*/ uint16_t komodo_assetport(uint32_t magic,int32_t shortflag) { return(8000 + shortflag*7777 + (magic % 7777)); } -uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp,int32_t *shortflagp) +uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp) { *magicp = komodo_assetmagic(symbol,supply); - *shortflagp = komodo_shortflag(symbol); return(komodo_assetport(*magicp,*shortflagp)); } @@ -1381,8 +1410,7 @@ void komodo_args() if ( strlen(addn.c_str()) > 0 ) ASSETCHAINS_SEED = 1; strncpy(ASSETCHAINS_SYMBOL,name.c_str(),sizeof(ASSETCHAINS_SYMBOL)-1); - ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC,&ASSETCHAINS_SHORTFLAG); - //fprintf(stderr,"after args: %c%s port.%u magic.%08x supply.%u\n",ASSETCHAINS_SHORTFLAG!=0?'-':'+',ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_MAGIC,(int32_t)ASSETCHAINS_SUPPLY); + ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC); while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 ) { fprintf(stderr,"waiting for datadir\n"); @@ -1395,7 +1423,7 @@ void komodo_args() extern int COINBASE_MATURITY; komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT + 1); //if ( komodo_baseid(ASSETCHAINS_SYMBOL) >= 0 ) - COINBASE_MATURITY = 1; + COINBASE_MATURITY = 1; } ASSETCHAINS_NOTARIES = GetArg("-ac_notaries",""); komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str()); @@ -1419,21 +1447,30 @@ void komodo_args() //fprintf(stderr,"%s chain params initialized\n",ASSETCHAINS_SYMBOL); } -struct komodo_state *komodo_stateptr(char *symbol,char *dest) +void komodo_nameset(char *symbol,char *dest,char *source) { - int32_t baseid; struct komodo_state *sp; - if ( ASSETCHAINS_SYMBOL[0] == 0 ) + if ( source[0] == 0 ) { strcpy(symbol,"KMD"); strcpy(dest,"BTC"); - sp = &KOMODO_STATES[0]; } else { - strcpy(symbol,ASSETCHAINS_SYMBOL); + strcpy(symbol,source); strcpy(dest,"KMD"); + } +} + +struct komodo_state *komodo_stateptr(char *symbol,char *dest) +{ + int32_t baseid; struct komodo_state *sp; + komodo_nameset(symbol,dest,ASSETCHAINS_SYMBOL); + if ( ASSETCHAINS_SYMBOL[0] == 0 ) + sp = &KOMODO_STATES[0]; + else + { if ( (baseid= komodo_baseid(ASSETCHAINS_SYMBOL)) >= 0 ) - sp = &KOMODO_STATES[baseid]; + sp = &KOMODO_STATES[baseid+1]; else { fprintf(stderr,"komodo_stateupdate.(%s) not supported\n",ASSETCHAINS_SYMBOL); @@ -1442,3 +1479,25 @@ struct komodo_state *komodo_stateptr(char *symbol,char *dest) } return(sp); } + +struct komodo_state *komodo_stateptrget(char *base) +{ + int32_t baseid; + if ( base == 0 || base[0] == 0 || strcmp(base,"KMD") == 0 ) + return(KOMODO_STATES[0]); + else if ( (baseid= komodo_baseid(base)) >= 0 ) + return(&KOMODO_STATES[baseid+1]); + else return(0); +} + +int32_t komodo_isrealtime(int32_t *kmdheightp,char *target) +{ + char symbol[16],dest[16]; struct komodo_state *sp; + *kmdheightp = 0; + if ( (sp= komodo_stateptrget(target)) != 0 ) + { + *kmdheightp = sp->CURRENT_HEIGHT; + return(sp->KOMODO_REALTIME); + } + return(0); +} diff --git a/src/miner.cpp b/src/miner.cpp index 90fd460f6..42b2b87c9 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -100,7 +100,7 @@ void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, #define ASSETCHAINS_MINHEIGHT 100 #define ROUNDROBIN_DELAY 45 -extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE,ASSETCHAINS_SHORTFLAG,KOMODO_REALTIME; +extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE; extern char ASSETCHAINS_SYMBOL[16]; extern std::string NOTARY_PUBKEY; extern uint8_t NOTARY_PUBKEY33[33]; @@ -114,7 +114,7 @@ int32_t komodo_gateway_deposits(CMutableTransaction *txNew,int32_t shortflag,cha CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { - uint64_t deposits; const CChainParams& chainparams = Params(); + uint64_t deposits; int32_t isrealtime,kmdheight; const CChainParams& chainparams = Params(); // Create new block unique_ptr pblocktemplate(new CBlockTemplate()); if(!pblocktemplate.get()) @@ -122,13 +122,14 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) CBlock *pblock = &pblocktemplate->block; // pointer for convenience if ( ASSETCHAINS_SYMBOL[0] != 0 && chainActive.Tip()->nHeight >= 100 ) { - fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),KOMODO_REALTIME,KOMODO_ON_DEMAND); - while ( KOMODO_ON_DEMAND == 0 )//mempool.GetTotalTxSize() <= 0 ) + isrealtime = komodo_isrealtime(&kmdheight,ASSETCHAINS_SYMBOL); + fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),isrealtime,KOMODO_ON_DEMAND); + while ( KOMODO_ON_DEMAND == 0 ) { deposits = komodo_paxtotal(); - if ( KOMODO_INITDONE == 0 || KOMODO_REALTIME == 0 ) + if ( KOMODO_INITDONE == 0 || komodo_isrealtime(&kmdheight,ASSETCHAINS_SYMBOL) == 0 ) { - //fprintf(stderr,"INITDONE.%d RT.%d deposits %.8f\n",KOMODO_INITDONE,KOMODO_REALTIME,(double)deposits/COIN); + //fprintf(stderr,"INITDONE.%d RT.%d deposits %.8f\n",KOMODO_INITDONE,isrealtime,(double)deposits/COIN); } else if ( deposits != 0 ) break; diff --git a/src/util.cpp b/src/util.cpp index a586a7516..4dfe13919 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -401,18 +401,14 @@ void PrintExceptionContinue(const std::exception* pex, const char* pszThread) } extern char ASSETCHAINS_SYMBOL[16]; -extern int32_t ASSETCHAINS_SHORTFLAG; boost::filesystem::path GetDefaultDataDir() { namespace fs = boost::filesystem; char symbol[16]; if ( ASSETCHAINS_SYMBOL[0] != 0 ) - { - if ( ASSETCHAINS_SHORTFLAG != 0 ) - sprintf(symbol,"-%s",ASSETCHAINS_SYMBOL); - else strcpy(symbol,ASSETCHAINS_SYMBOL); - } else symbol[0] = 0; + strcpy(symbol,ASSETCHAINS_SYMBOL); + else symbol[0] = 0; // Windows < Vista: C:\Documents and Settings\Username\Application Data\Zcash // Windows >= Vista: C:\Users\Username\AppData\Roaming\Zcash // Mac: ~/Library/Application Support/Zcash diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1f2cb706b..8b1eab8a3 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -521,7 +521,6 @@ Value paxdeposit(const Array& params, bool fHelp) Value paxwithdraw(const Array& params, bool fHelp) { - extern int32_t KMDHEIGHT,KOMODO_REALTIME; CWalletTx wtx; std::string dest; int32_t kmdheight; uint64_t seed,komodoshis = 0; char destaddr[64]; uint8_t i,pubkey37[37]; bool fSubtractFeeFromAmount = false; if ( ASSETCHAINS_SYMBOL[0] == 0 ) return(0); @@ -529,14 +528,13 @@ Value paxwithdraw(const Array& params, bool fHelp) return 0; if (fHelp || params.size() != 2) throw runtime_error("paxwithdraw \"address\" fiatamount"); - if ( KOMODO_REALTIME == 0 ) + if ( komodo_isrealtime(&kmdheight,"KMD") == 0 ) return(0); LOCK2(cs_main, pwalletMain->cs_wallet); CBitcoinAddress address(params[0].get_str()); if (!address.IsValid()) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address"); int64_t fiatoshis = atof(params[1].get_str().c_str()) * COIN; - kmdheight = KMDHEIGHT; komodoshis = PAX_fiatdest(&seed,1,destaddr,pubkey37,(char *)params[0].get_str().c_str(),kmdheight,ASSETCHAINS_SYMBOL,fiatoshis); dest.append(destaddr); CBitcoinAddress destaddress(CRYPTO777_KMDADDR); -- 2.42.0