Browse Source

Notarizations api

jl777
jl777 7 years ago
parent
commit
571fd156dc
  1. 15
      iguana/dpow/dpow_fsm.c
  2. 46
      iguana/iguana_notary.c
  3. 1
      includes/iguana_apideclares.h

15
iguana/dpow/dpow_fsm.c

@ -162,9 +162,9 @@ int32_t dpow_checkutxo(struct supernet_info *myinfo,struct dpow_info *dp,struct
uint32_t Numallocated; uint32_t Numallocated;
int32_t dpow_txhasnotarization(int32_t *nothtp,struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t height) int32_t dpow_txhasnotarization(uint64_t *signedmaskp,int32_t *nothtp,struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t height)
{ {
cJSON *txobj,*vins,*vin,*vouts,*vout,*spentobj,*sobj; char *hexstr; uint8_t script[35]; bits256 spenttxid; uint64_t notarymask; int32_t i,j,numnotaries,len,spentvout,numvins,numvouts,hasnotarization = 0; cJSON *txobj,*vins,*vin,*vouts,*vout,*spentobj,*sobj; char *hexstr; uint8_t script[35]; bits256 spenttxid; uint64_t notarymask=0; int32_t i,j,numnotaries,len,spentvout,numvins,numvouts,hasnotarization = 0;
if ( (txobj= dpow_gettransaction(myinfo,coin,txid)) != 0 ) if ( (txobj= dpow_gettransaction(myinfo,coin,txid)) != 0 )
{ {
if ( (vins= jarray(&numvins,txobj,"vin")) != 0 ) if ( (vins= jarray(&numvins,txobj,"vin")) != 0 )
@ -223,19 +223,22 @@ int32_t dpow_txhasnotarization(int32_t *nothtp,struct supernet_info *myinfo,stru
} }
free_json(txobj); free_json(txobj);
} }
if ( hasnotarization != 0 )
(*signedmaskp) = notarymask;
return(hasnotarization); return(hasnotarization);
} }
int32_t dpow_hasnotarization(int32_t *nothtp,struct supernet_info *myinfo,struct iguana_info *coin,cJSON *blockjson,int32_t ht) int32_t dpow_hasnotarization(uint64_t *signedmaskp,int32_t *nothtp,struct supernet_info *myinfo,struct iguana_info *coin,cJSON *blockjson,int32_t ht)
{ {
int32_t i,n,hasnotarization = 0; bits256 txid; cJSON *txarray; int32_t i,n,hasnotarization = 0; bits256 txid; cJSON *txarray;
*nothtp = 0; *nothtp = 0;
*signedmaskp = 0;
if ( (txarray= jarray(&n,blockjson,"tx")) != 0 ) if ( (txarray= jarray(&n,blockjson,"tx")) != 0 )
{ {
for (i=0; i<n; i++) for (i=0; i<n; i++)
{ {
txid = jbits256i(txarray,i); txid = jbits256i(txarray,i);
hasnotarization += dpow_txhasnotarization(nothtp,myinfo,coin,txid,ht); hasnotarization += dpow_txhasnotarization(signedmaskp,nothtp,myinfo,coin,txid,ht);
} }
} }
return(hasnotarization); return(hasnotarization);
@ -243,7 +246,7 @@ int32_t dpow_hasnotarization(int32_t *nothtp,struct supernet_info *myinfo,struct
bits256 dpow_calcMoM(uint32_t *MoMdepthp,struct supernet_info *myinfo,struct iguana_info *coin,int32_t height) bits256 dpow_calcMoM(uint32_t *MoMdepthp,struct supernet_info *myinfo,struct iguana_info *coin,int32_t height)
{ {
bits256 MoM,blockhash,merkle,*merkles; cJSON *blockjson; int32_t breakht=0,notht=0,ht,maxdepth = 1440,MoMdepth = 0; bits256 MoM,blockhash,merkle,*merkles; cJSON *blockjson; uint64_t signedmask; int32_t breakht=0,notht=0,ht,maxdepth = 1440,MoMdepth = 0;
memset(MoM.bytes,0,sizeof(MoM)); memset(MoM.bytes,0,sizeof(MoM));
blockhash = dpow_getblockhash(myinfo,coin,height); blockhash = dpow_getblockhash(myinfo,coin,height);
//printf("start MoM calc %s height.%d\n",coin->symbol,height); //printf("start MoM calc %s height.%d\n",coin->symbol,height);
@ -262,7 +265,7 @@ bits256 dpow_calcMoM(uint32_t *MoMdepthp,struct supernet_info *myinfo,struct igu
blockhash = dpow_getblockhash(myinfo,coin,ht); blockhash = dpow_getblockhash(myinfo,coin,ht);
if ( (blockjson= dpow_getblock(myinfo,coin,blockhash)) != 0 ) if ( (blockjson= dpow_getblock(myinfo,coin,blockhash)) != 0 )
{ {
if ( breakht == 0 && dpow_hasnotarization(&notht,myinfo,coin,blockjson,ht) > 0 ) if ( breakht == 0 && dpow_hasnotarization(&signedmask,&notht,myinfo,coin,blockjson,ht) > 0 )
{ {
breakht = notht; breakht = notht;
//free_json(blockjson); //free_json(blockjson);

46
iguana/iguana_notary.c

@ -60,7 +60,7 @@ void dpow_checkpointset(struct supernet_info *myinfo,struct dpow_checkpoint *che
void dpow_srcupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t height,bits256 hash,uint32_t timestamp,uint32_t blocktime) void dpow_srcupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t height,bits256 hash,uint32_t timestamp,uint32_t blocktime)
{ {
void **ptrs; char str[65]; cJSON *blockjson; struct iguana_info *coin; struct dpow_checkpoint checkpoint; int32_t freq,minsigs,i,ht,notht; struct dpow_block *bp; void **ptrs; char str[65]; cJSON *blockjson; struct iguana_info *coin; struct dpow_checkpoint checkpoint; int32_t freq,minsigs,i,ht,notht; uint64_t signedmask; struct dpow_block *bp;
dpow_checkpointset(myinfo,&dp->last,height,hash,timestamp,blocktime); dpow_checkpointset(myinfo,&dp->last,height,hash,timestamp,blocktime);
checkpoint = dp->srcfifo[dp->srcconfirms]; checkpoint = dp->srcfifo[dp->srcconfirms];
if ( strcmp("BTC",dp->dest) == 0 ) if ( strcmp("BTC",dp->dest) == 0 )
@ -88,7 +88,7 @@ void dpow_srcupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t he
if ( (blockjson= dpow_getblock(myinfo,coin,hash)) != 0 ) if ( (blockjson= dpow_getblock(myinfo,coin,hash)) != 0 )
{ {
height = jint(blockjson,"height"); height = jint(blockjson,"height");
if ( dpow_hasnotarization(&notht,myinfo,coin,blockjson,height) <= 0 ) if ( dpow_hasnotarization(&signedmask,&notht,myinfo,coin,blockjson,height) <= 0 )
{ {
blocktime = juint(blockjson,"time"); blocktime = juint(blockjson,"time");
free_json(blockjson); free_json(blockjson);
@ -575,6 +575,48 @@ void iguana_notarystats(int32_t totals[64],int32_t dispflag)
} }
} }
STRING_AND_TWOINTS(dpow,notarizations,symbol,height,numblocks)
{
int32_t i,j,ht,notht,masksums[64]; uint64_t signedmask; cJSON *retjson,*blockjson,*item,*array; bits256 blockhash;
memset(masksums,0,sizeof(masksums));
if ( (coin= iguana_coinfind(symbol)) != 0 )
{
for (i=0; i<numblocks; i++)
{
ht = height + i;
blockhash = dpow_getblockhash(myinfo,coin,ht);
if ( (blockjson= dpow_getblock(myinfo,coin,blockhash)) != 0 )
{
if ( dpow_hasnotarization(&signedmask,&notht,myinfo,coin,blockjson,ht) > 0 )
{
for (j=0; j<64; j++)
if ( ((1LL << j) & signedmask) != 0 )
masksums[j]++;
}
free_json(blockjson);
}
}
array = cJSON_CreateArray();
for (i=0; i<Notaries_num; i++)
{
if ( masksums[i] != 0 )
{
item = cJSON_CreateObject();
jaddstr(item,"notary",Notaries_elected[i][0]);
jaddnum(item,"notarizations",masksums[i]);
jaddi(array,item);
}
}
retjson = cJSON_CreateObject();
jaddstr(retjson,"coin",symbol);
jaddnum(retjson,"start",height);
jaddnum(retjson,"numblocks",numblocks);
jadd(retjson,"notarizations",array);
return(jprint(retjson,1));
}
return(clonestr("{\"error\":\"cant find coin\"}"));
}
ZERO_ARGS(dpow,notarychains) ZERO_ARGS(dpow,notarychains)
{ {
int32_t i; cJSON *array = cJSON_CreateArray(); int32_t i; cJSON *array = cJSON_CreateArray();

1
includes/iguana_apideclares.h

@ -20,6 +20,7 @@ emit compiler error if recursively being included
#define _IGUANA_APIDEC_H_ #define _IGUANA_APIDEC_H_
STRING_ARG(dpow,pending,fiat); STRING_ARG(dpow,pending,fiat);
STRING_AND_TWOINTS(dpow,notarizations,symbol,height,numblocks);
ZERO_ARGS(dpow,notarychains); ZERO_ARGS(dpow,notarychains);
STRING_ARG(dpow,active,maskhex); STRING_ARG(dpow,active,maskhex);
TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified); TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified);

Loading…
Cancel
Save