/******************************************************************************
- * Copyright © 2014-2017 The SuperNET Developers. *
+ * Copyright © 2014-2018 The SuperNET Developers. *
* *
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
* the top-level directory of this distribution for the individual copyright *
#include "komodo_jumblr.h"
#include "komodo_gateway.h"
#include "komodo_events.h"
+#include "komodo_ccdata.h"
void komodo_currentheight_set(int32_t height)
{
if ( didinit == 0 )
{
portable_mutex_init(&KOMODO_KV_mutex);
+ portable_mutex_init(&KOMODO_CC_mutex);
didinit = 1;
}
if ( (sp= komodo_stateptr(symbol,dest)) == 0 )
int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp,uint64_t value,int32_t notarized,uint64_t signedmask,uint32_t timestamp)
{
static uint256 zero; static FILE *signedfp;
- int32_t opretlen,nid,k,len = 0; uint256 kmdtxid,desttxid; uint8_t crypto777[33]; struct komodo_state *sp; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN];
+ int32_t opretlen,nid,offset,k,MoMdepth,matched,len = 0; uint256 MoM,srchash,desttxid; uint8_t crypto777[33]; struct komodo_state *sp; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN];
if ( (sp= komodo_stateptr(symbol,dest)) == 0 )
return(-1);
if ( scriptlen == 35 && scriptbuf[0] == 33 && scriptbuf[34] == 0xac )
}
if ( scriptbuf[len++] == 0x6a )
{
+ int32_t nameoffset,opoffset = 0;
if ( (opretlen= scriptbuf[len++]) == 0x4c )
opretlen = scriptbuf[len++];
else if ( opretlen == 0x4d )
opretlen = scriptbuf[len++];
opretlen += (scriptbuf[len++] << 8);
}
- if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
- printf("[%s] notarized.%d notarizedht.%d sp.Nht %d sp.ht %d opretlen.%d (%c %c %c)\n",ASSETCHAINS_SYMBOL,notarized,*notarizedheightp,sp->NOTARIZED_HEIGHT,sp->CURRENT_HEIGHT,opretlen,scriptbuf[len+32*2+4],scriptbuf[len+32*2+4+1],scriptbuf[len+32*2+4+2]);
- if ( j == 1 && opretlen >= 32*2+4 && strcmp(ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,(char *)&scriptbuf[len+32*2+4]) == 0 )
+ opoffset = len;
+ matched = 0;
+ if ( ASSETCHAINS_SYMBOL[0] == 0 )
{
- 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 ( strcmp("PIZZA",ASSETCHAINS_SYMBOL) == 0 && opretlen == 110 )
- {
+ if ( strcmp("KMD",(char *)&scriptbuf[len+32 * 2 + 4]) == 0 )
+ matched = 1;
+ }
+ else
+ {
+ if ( strcmp(ASSETCHAINS_SYMBOL,(char *)&scriptbuf[len+offset]) == 0 )
+ matched = 1;
+ }
+ offset = 32 * (1 + matched) + 4;
+ nameoffset = (int32_t)strlen((char *)&scriptbuf[len+offset]);
+ if ( nameoffset == 2 )
+ nameoffset += 2;
+ else nameoffset++;
+ if ( j == 1 && opretlen >= len+offset-opoffset )
+ {
+ static int32_t last_rewind; int32_t rewindtarget,validated = 0; CBlockIndex *pindex;//
+ struct komodo_ccdata ccdata; struct komodo_ccdataMoMoM MoMoMdata;
+ memset(&ccdata,0,sizeof(ccdata));
+ memset(&MoMoMdata,0,sizeof(MoMoMdata));
+ strncpy(ccdata.symbol,(char *)&scriptbuf[len+offset],sizeof(ccdata.symbol));
+ if ( matched == 0 && bitweight(signedmask) >= KOMODO_MINRATIFY )
notarized = 1;
- }
- int32_t validated = 0;
- if ( ASSETCHAINS_SYMBOL[0] != 0 )
- validated = 1;
- else if ( height < sp->CURRENT_HEIGHT-64 || komodo_verifynotarization((char *)"KMD",(char *)"BTC",height,*notarizedheightp,kmdtxid,desttxid) == 0 )
- validated = 1;
- if ( notarized != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height && validated != 0 )
+ if ( strcmp("PIZZA",ccdata.symbol) == 0 )
+ notarized = 1;
+ if ( 0 && opretlen != 149 )
+ printf("[%s].%d (%s) matched.%d i.%d j.%d notarized.%d %llx opretlen.%d len.%d offset.%d opoffset.%d\n",ASSETCHAINS_SYMBOL,height,ccdata.symbol,matched,i,j,notarized,(long long)signedmask,opretlen,len,offset,opoffset);
+ len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&srchash);
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(*notarizedheightp),(uint8_t *)notarizedheightp);
+ if ( matched != 0 )
+ len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&desttxid);
+ if ( matched != 0 && IsInitialBlockDownload() == 0 && ((pindex= mapBlockIndex[srchash]) == 0 || pindex->nHeight != *notarizedheightp) )
{
- int32_t nameoffset = (int32_t)strlen(ASSETCHAINS_SYMBOL) + 1;
- sp->NOTARIZED_HEIGHT = *notarizedheightp;
- sp->NOTARIZED_HASH = kmdtxid;
- sp->NOTARIZED_DESTTXID = desttxid;
- memset(&sp->MoM,0,sizeof(sp->MoM));
- sp->MoMdepth = 0;
- if ( len+36 <= opretlen )
+ if ( sp->NOTARIZED_HEIGHT > 0 && sp->NOTARIZED_HEIGHT < *notarizedheightp )
+ rewindtarget = sp->NOTARIZED_HEIGHT - 1;
+ else if ( *notarizedheightp > 101 )
+ rewindtarget = *notarizedheightp - 101;
+ else rewindtarget = 0;
+ if ( rewindtarget != 0 && rewindtarget > KOMODO_REWIND && rewindtarget > last_rewind )
{
- 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 )
+ if ( last_rewind != 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_REWIND = rewindtarget;
+ fprintf(stderr,"%s FORK detected. notarized.%d %s not in this chain! last notarization %d -> rewindtarget.%d\n",ASSETCHAINS_SYMBOL,*notarizedheightp,srchash.ToString().c_str(),sp->NOTARIZED_HEIGHT,rewindtarget);
}
+ last_rewind = rewindtarget;
}
- komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth);
+ } else validated = 1;
+ if ( notarized != 0 && validated != 0 )
+ {
+ //sp->NOTARIZED_HEIGHT = *notarizedheightp;
+ //sp->NOTARIZED_HASH = srchash;
+ //sp->NOTARIZED_DESTTXID = desttxid;
+ memset(&MoM,0,sizeof(MoM));
+ MoMdepth = 0;
len += nameoffset;
- if ( ASSETCHAINS_SYMBOL[0] != 0 )
- 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 )
+ ccdata.MoMdata.notarized_height = *notarizedheightp;
+ ccdata.MoMdata.height = height;
+ ccdata.MoMdata.txi = i;
+ //printf("nameoffset.%d len.%d + 36 %d vs opretlen.%d\n",nameoffset,len,len+36,opretlen);
+ if ( len+36-opoffset <= opretlen )
{
- if ( signedfp == 0 )
+ len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&MoM);
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(MoMdepth),(uint8_t *)&MoMdepth);
+ ccdata.MoMdata.MoM = MoM;
+ ccdata.MoMdata.MoMdepth = MoMdepth;
+ if ( len+sizeof(ccdata.CCid) <= opretlen )
{
- char fname[512];
- komodo_statefname(fname,ASSETCHAINS_SYMBOL,(char *)"signedmasks");
- if ( (signedfp= fopen(fname,"rb+")) == 0 )
- signedfp = fopen(fname,"wb");
- else fseek(signedfp,0,SEEK_END);
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(ccdata.CCid),(uint8_t *)&ccdata.CCid);
+ ccdata.len = sizeof(ccdata.CCid);
+ if ( ASSETCHAINS_SYMBOL[0] != 0 )
+ {
+ // MoMoM, depth, numpairs, (notarization ht, MoMoM offset)
+ if ( len+48-opoffset <= opretlen && strcmp(ccdata.symbol,ASSETCHAINS_SYMBOL) == 0 )
+ {
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(uint32_t),(uint8_t *)&MoMoMdata.kmdstarti);
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(uint32_t),(uint8_t *)&MoMoMdata.kmdendi);
+ len += iguana_rwbignum(0,&scriptbuf[len],sizeof(MoMoMdata.MoMoM),(uint8_t *)&MoMoMdata.MoMoM);
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(uint32_t),(uint8_t *)&MoMoMdata.MoMoMdepth);
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(uint32_t),(uint8_t *)&MoMoMdata.numpairs);
+ MoMoMdata.len += sizeof(MoMoMdata.MoMoM) + sizeof(uint32_t)*4;
+ if ( len+MoMoMdata.numpairs*8-opoffset == opretlen )
+ {
+ MoMoMdata.pairs = (struct komodo_ccdatapair *)calloc(MoMoMdata.numpairs,sizeof(*MoMoMdata.pairs));
+ for (k=0; k<MoMoMdata.numpairs; k++)
+ {
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(int32_t),(uint8_t *)&MoMoMdata.pairs[k].notarization_height);
+ len += iguana_rwnum(0,&scriptbuf[len],sizeof(uint32_t),(uint8_t *)&MoMoMdata.pairs[k].MoMoMoffset);
+ MoMoMdata.len += sizeof(uint32_t) * 2;
+ }
+ } else ccdata.len = MoMoMdata.len = 0;
+ } else ccdata.len = MoMoMdata.len = 0;
+ }
}
- if ( signedfp != 0 )
+ if ( MoM == zero || MoMdepth > 1440 || MoMdepth < 0 )
{
- fwrite(&height,1,sizeof(height),signedfp);
- fwrite(&signedmask,1,sizeof(signedmask),signedfp);
- fflush(signedfp);
+ memset(&MoM,0,sizeof(MoM));
+ MoMdepth = 0;
}
- if ( opretlen > len && scriptbuf[len] == 'A' )
+ else
{
- //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,zero,0);
+ komodo_rwccdata(ASSETCHAINS_SYMBOL,1,&ccdata,&MoMoMdata);
+ //printf("[%s] matched.%d VALID (%s) MoM.%s [%d]\n",ASSETCHAINS_SYMBOL,matched,ccdata.symbol,MoM.ToString().c_str(),MoMdepth);
}
+ if ( MoMoMdata.pairs != 0 )
+ free(MoMoMdata.pairs);
+ memset(&ccdata,0,sizeof(ccdata));
+ memset(&MoMoMdata,0,sizeof(MoMoMdata));
}
- } 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 ( ASSETCHAINS_SYMBOL[0] == 0 && matched != 0 && notarized != 0 && validated != 0 )
+ komodo_rwccdata((char *)"KMD",1,&ccdata,0);
+ if ( matched != 0 && *notarizedheightp > sp->NOTARIZED_HEIGHT && *notarizedheightp < height )
+ {
+ sp->NOTARIZED_HEIGHT = *notarizedheightp;
+ sp->NOTARIZED_HASH = srchash;
+ sp->NOTARIZED_DESTTXID = desttxid;
+ sp->MoM = MoM;
+ sp->MoMdepth = MoMdepth;
+ komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0,sp->MoM,sp->MoMdepth);
+ if ( ASSETCHAINS_SYMBOL[0] != 0 )
+ 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,srchash.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 )
+ {
+ char fname[512];
+ komodo_statefname(fname,ASSETCHAINS_SYMBOL,(char *)"signedmasks");
+ if ( (signedfp= fopen(fname,"rb+")) == 0 )
+ signedfp = fopen(fname,"wb");
+ else fseek(signedfp,0,SEEK_END);
+ }
+ if ( signedfp != 0 )
+ {
+ fwrite(&height,1,sizeof(height),signedfp);
+ fwrite(&signedmask,1,sizeof(signedmask),signedfp);
+ fflush(signedfp);
+ }
+ if ( opretlen > len && scriptbuf[len] == 'A' )
+ {
+ //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,zero,0);
+ }
+ }
+ }
+ } else //if ( matched != 0 && *notarizedheightp != sp->NOTARIZED_HEIGHT )
+ printf("validated.%d notarized.%d %llx reject ht.%d NOTARIZED.%d prev.%d %s.%s DESTTXID.%s len.%d opretlen.%d\n",validated,notarized,(long long)signedmask,height,*notarizedheightp,sp->NOTARIZED_HEIGHT,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,srchash.ToString().c_str(),desttxid.ToString().c_str(),len,opretlen);
}
- else if ( i == 0 && j == 1 && opretlen == 149 )
+ else if ( matched != 0 && i == 0 && j == 1 && opretlen == 149 )
{
if ( notaryid >= 0 && notaryid < 64 )
komodo_paxpricefeed(height,&scriptbuf[len],opretlen);
}
- else
+ else if ( matched != 0 )
{
//int32_t k; for (k=0; k<scriptlen; k++)
// printf("%02x",scriptbuf[k]);
{
static int32_t hwmheight;
uint64_t signedmask,voutmask; char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp;
- uint8_t scriptbuf[4096],pubkeys[64][33],rmd160[20],scriptPubKey[35]; uint256 kmdtxid,zero,btctxid,txhash;
+ uint8_t scriptbuf[10001],pubkeys[64][33],rmd160[20],scriptPubKey[35]; uint256 zero,btctxid,txhash;
int32_t i,j,k,numnotaries,notarized,scriptlen,isratification,nid,numvalid,specialtx,notarizedheight,notaryid,len,numvouts,numvins,height,txn_count;
memset(&zero,0,sizeof(zero));
komodo_init(pindex->nHeight);