This commit is contained in:
jl777
2016-11-19 11:48:56 -03:00
parent 2db1372f32
commit ab91876752
11 changed files with 235 additions and 182 deletions

View File

@@ -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;