Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
ecc4f4e26b
  1. 83
      basilisk/basilisk.c
  2. 2
      basilisk/basilisk.h
  3. 38
      basilisk/basilisk_bitcoin.c
  4. 2
      iguana/SuperNET.c
  5. 4
      iguana/iguana_sign.c

83
basilisk/basilisk.c

@ -17,20 +17,21 @@
char *basilisk_finish(struct basilisk_item *ptr,int32_t besti,char *errstr)
{
int32_t i; char *retstr = 0;
for (i=0; i<ptr->numresults; i++)
{
if ( besti >= 0 && i != besti )
char *retstr = 0; struct basilisk_item *parent;
if ( besti >= 0 && besti < ptr->numresults )
{
if ( ptr->results[i] != 0 )
free(ptr->results[i]);
} else retstr = ptr->results[i];
ptr->results[i] = 0;
retstr = ptr->results[besti];
ptr->results[besti] = 0;
}
if ( retstr == 0 )
retstr = clonestr(errstr);
ptr->retstr = retstr;
ptr->finished = (uint32_t)time(NULL);
if ( (parent= ptr->parent) != 0 )
{
ptr->parent = 0;
parent->childrendone++;
}
return(retstr);
}
@ -102,7 +103,7 @@ int32_t basilisk_submit(struct supernet_info *myinfo,cJSON *reqjson,int32_t time
int32_t i,j,k,l,r2,r,n; struct iguana_peer *addr; struct iguana_info *coin; char *reqstr; cJSON *tmpjson;
tmpjson = basilisk_json(myinfo,reqjson,ptr->basilisktag,timeout);
reqstr = jprint(tmpjson,1);
printf("basilisk_submit.(%s)\n",reqstr);
//printf("basilisk_submit.(%s)\n",reqstr);
if ( fanout <= 0 )
fanout = BASILISK_MINFANOUT;
else if ( fanout > BASILISK_MAXFANOUT )
@ -250,13 +251,15 @@ char *basilisk_block(struct supernet_info *myinfo,struct iguana_info *coin,char
}
if ( numvalid < ptr->numrequired )
{
usleep(10000);
usleep(1000000);
printf("%u: numvalid.%d < required.%d\n",ptr->basilisktag,numvalid,ptr->numrequired);
continue;
}
if ( ptr->uniqueflag == 0 && ptr->numexact <= (ptr->numresults >> 1) )
besti = -1, errstr = "{\"error\":\"basilisk non-consensus results\"}";
else besti = basilisk_besti(ptr), errstr = "{\"error\":\"basilisk no valid results\"}";
retstr = basilisk_finish(ptr,besti,errstr);
printf("besti.%d numexact.%d numresults.%d -> (%s)\n",besti,ptr->numexact,ptr->numresults,retstr);
break;
}
if ( retstr == 0 )
@ -267,6 +270,7 @@ char *basilisk_block(struct supernet_info *myinfo,struct iguana_info *coin,char
hexobj = cJSON_CreateObject();
jaddstr(hexobj,"agent","basilisk");
jaddstr(hexobj,"method","result");
jaddnum(hexobj,"basilisktag",ptr->basilisktag);
if ( (valsobj= cJSON_Parse(retstr)) != 0 )
{
if ( jobj(valsobj,"coin") == 0 )
@ -287,7 +291,7 @@ char *basilisk_block(struct supernet_info *myinfo,struct iguana_info *coin,char
{
if ( addr->supernet != 0 && strcmp(addr->ipaddr,remoteaddr) == 0 )
{
printf("send back.%d basilisk_result addr->supernet.%u to (%s).%d\n",(int32_t)strlen(retstr),addr->supernet,addr->ipaddr,addr->A.port);
printf("send back.%s basilisk_result addr->supernet.%u to (%s).%d\n",retstr,addr->supernet,addr->ipaddr,addr->A.port);
iguana_send_supernet(addr,retstr,0);
return(retstr);
}
@ -410,7 +414,7 @@ INT_AND_ARRAY(basilisk,result,basilisktag,vals)
ptr = calloc(1,sizeof(*ptr));
ptr->retstr = jprint(vals,0);
ptr->basilisktag = basilisktag;
printf("Q.%u results vals.(%s)\n",basilisktag,ptr->retstr);
//printf("Q.%u results vals.(%s)\n",basilisktag,ptr->retstr);
queue_enqueue("resultsQ",&myinfo->basilisks.resultsQ,&ptr->DL,0);
return(clonestr("{\"result\":\"queued basilisk return\"}"));
} else printf("null vals.(%s) or no hexmsg.%p\n",jprint(vals,0),vals);
@ -424,7 +428,7 @@ char *basilisk_hexmsg(struct supernet_info *myinfo,struct category_info *cat,voi
array = 0;
if ( (remotejson= cJSON_Parse(ptr)) != 0 )
{
printf("basilisk.(%s)\n",jprint(remotejson,0));
//printf("basilisk.(%s)\n",jprint(remotejson,0));
agent = jstr(remotejson,"agent");
method = jstr(remotejson,"method");
if ( agent != 0 && method != 0 && strcmp(agent,"SuperNET") == 0 && strcmp(method,"DHT") == 0 && (hexmsg= jstr(remotejson,"hexmsg")) != 0 )
@ -444,7 +448,6 @@ char *basilisk_hexmsg(struct supernet_info *myinfo,struct category_info *cat,voi
agent = jstr(remotejson,"agent");
method = jstr(remotejson,"method");
}
//basilisk.({"agent":"basilisk","basilisktag":462531728,"method":"rawtx","activecoin":"BTC","vals":{"changeaddr":"1FNhoaBYzf7safMBjoCsJYgxtah3K95sep","addresses":["1Hgzt5xsnbfc8UTWqWKSTLRm5bEYHYBoCE"],"timeout":5000,"amount":"20000","spendscript":"76a914b7128d2ee837cf03e30a2c0e3e0181f7b9669bb688ac"},"basilisktag":462531728})
basilisktag = juint(remotejson,"basilisktag");
if ( strcmp(agent,"basilisk") == 0 && (valsobj= jobj(remotejson,"vals")) != 0 )
{
@ -452,7 +455,7 @@ char *basilisk_hexmsg(struct supernet_info *myinfo,struct category_info *cat,voi
coin = iguana_coinfind(jstr(valsobj,"coin"));
else if ( jstr(remotejson,"activecoin") != 0 )
coin = iguana_coinfind(jstr(remotejson,"activecoin"));
printf("coin.%p agent.%s method.%s vals.%p\n",coin,agent,method,valsobj);
//printf("coin.%p agent.%s method.%s vals.%p\n",coin,agent,method,valsobj);
if ( coin != 0 )
{
if ( coin->RELAYNODE != 0 || coin->VALIDATENODE != 0 )
@ -477,13 +480,13 @@ char *basilisk_hexmsg(struct supernet_info *myinfo,struct category_info *cat,voi
}
free_json(remotejson);
}
printf("unhandled bitcoin_hexmsg.(%d) from %s (%s/%s)\n",len,remoteaddr,agent,method);
printf("unhandled bitcoin_hexmsg.(%d) from %s (%s)\n",len,remoteaddr,(char *)ptr);
return(retstr);
}
void basilisks_loop(void *arg)
{
basilisk_metricfunc metricfunc; struct basilisk_item *ptr,*tmp,*pending; int32_t i,flag,n; struct supernet_info *myinfo = arg;
basilisk_metricfunc metricfunc; struct basilisk_item *ptr,*tmp,*pending,*parent; int32_t i,flag,n; struct supernet_info *myinfo = arg;
//uint8_t *blockspace; struct OS_memspace RAWMEM;
//memset(&RAWMEM,0,sizeof(RAWMEM));
//blockspace = calloc(1,IGUANA_MAXPACKETSIZE);
@ -507,8 +510,9 @@ void basilisks_loop(void *arg)
if ( (n= pending->numresults) < sizeof(pending->results)/sizeof(*pending->results) )
{
pending->results[n] = ptr->retstr;
printf("%p Add results[%d] <- (%s)\n",&pending->results[n],n,ptr->retstr);
pending->numresults++;
if ( (metricfunc= ptr->metricfunc) == 0 )
if ( (metricfunc= pending->metricfunc) == 0 )
pending->metrics[n] = n + 1;
else pending->metrics[n] = (*metricfunc)(myinfo,pending,pending->results[n]);
}
@ -521,31 +525,48 @@ void basilisks_loop(void *arg)
flag = 0;
HASH_ITER(hh,myinfo->basilisks.issued,pending,tmp)
{
if ( pending->finished != 0 && pending->parent == 0 )
for (i=0; i<pending->numresults; i++)
if ( pending->metrics[i] == 0. )
{
HASH_DELETE(hh,myinfo->basilisks.issued,pending);
if ( pending->vals != 0 )
free_json(pending->vals);
if ( pending->dependents != 0 )
free(pending->dependents);
free(pending);
if ( (metricfunc= pending->metricfunc) != 0 )
{
pending->metrics[i] = (*metricfunc)(myinfo,pending,pending->results[i]);
printf("poll metrics\n");
}
flag++;
}
else if ( OS_milliseconds() > pending->expiration )
if ( OS_milliseconds() > pending->expiration )
{
if ( pending->finished == 0 )
{
if ( (parent= pending->parent) != 0 )
{
pending->parent = 0;
parent->childrendone++;
}
pending->finished = (uint32_t)time(NULL);
}
if ( pending->retstr == 0 )
pending->retstr = clonestr("{\"error\":\"basilisk timeout\"}");
printf("timeout call metrics.%u\n",pending->basilisktag);
for (i=0; i<pending->numresults; i++)
if ( (metricfunc= pending->metricfunc) != 0 )
pending->metrics[i] = (*metricfunc)(myinfo,pending,pending->results[i]);
}
else
if ( pending->finished != 0 )
{
for (i=0; i<pending->numresults; i++)
if ( pending->metrics[i] == 0. )
if ( pending->dependents == 0 || pending->childrendone >= pending->numchildren )
{
if ( (metricfunc= pending->metricfunc) != 0 )
pending->metrics[i] = (*metricfunc)(myinfo,pending,pending->results[i]);
HASH_DELETE(hh,myinfo->basilisks.issued,pending);
if ( pending->dependents != 0 )
free(pending->dependents);
printf("free ptr.%u\n",pending->basilisktag);
for (i=0; i<pending->numresults; i++)
if ( pending->results[i] != 0 )
free(pending->results[i]);
if ( pending->vals != 0 )
free_json(pending->vals);
free(pending);
flag++;
}
}

2
basilisk/basilisk.h

@ -27,7 +27,7 @@ struct basilisk_value { bits256 txid; int64_t value; int32_t height; int16_t vou
struct basilisk_item
{
struct queueitem DL; UT_hash_handle hh; struct basilisk_item *parent; void *dependents;
uint32_t submit,finished,basilisktag,numresults,numexact,uniqueflag,numrequired;
uint32_t submit,finished,basilisktag,numresults,numexact,uniqueflag,numrequired,childrendone,numchildren;
char symbol[32]; double expiration; cJSON *vals; int32_t metricdir; void *metricfunc;
char *retstr,*results[BASILISK_MAXFANOUT]; double metrics[BASILISK_MAXFANOUT];
};

38
basilisk/basilisk_bitcoin.c

@ -403,12 +403,14 @@ void *basilisk_bitcoinvalue(struct basilisk_item *Lptr,struct supernet_info *myi
txid = jbits256(valsobj,"txid");
vout = jint(valsobj,"vout");
coinaddr = jstr(valsobj,"address");
printf("bitcoinvalue\n");
if ( coin != 0 && basilisk_bitcoinavail(coin) != 0 && coinaddr != 0 && coinaddr[0] != 0 )
{
if ( coin->VALIDATENODE != 0 || coin->RELAYNODE != 0 )
{
if ( iguana_unspentindfind(coin,coinaddr,0,0,&value,&height,txid,vout,coin->bundlescount) > 0 )
{
printf("bitcoinvalue found iguana\n");
Lptr->retstr = basilisk_valuestr(coin,coinaddr,value,height,txid,vout);
return(Lptr);
}
@ -421,11 +423,13 @@ void *basilisk_bitcoinvalue(struct basilisk_item *Lptr,struct supernet_info *myi
{
if ( v->vout == vout && bits256_cmp(txid,v->txid) == 0 && strcmp(v->coinaddr,coinaddr) == 0 )
{
printf("bitcoinvalue local\n");
Lptr->retstr = basilisk_valuestr(coin,coinaddr,value,height,txid,vout);
return(Lptr);
}
}
}
printf("bitcoinvalue issue remote\n");
return(basilisk_issueremote(myinfo,"value",coin->symbol,valsobj,0,juint(valsobj,"fanout"),juint(valsobj,"minresults"),basilisktag));
}
@ -437,7 +441,14 @@ double basilisk_bitcoin_rawtxmetric_dependents(struct supernet_info *myinfo,stru
if ( (child= dependents->ptrs[i]) != 0 )
{
if ( ptr->finished != 0 )
{
printf("parent finished\n");
if ( child->finished == 0 )
{
ptr->childrendone++;
child->finished = (uint32_t)time(NULL);
}
}
else if ( child->finished == 0 )
notfinished++;
}
@ -445,11 +456,8 @@ double basilisk_bitcoin_rawtxmetric_dependents(struct supernet_info *myinfo,stru
if ( notfinished != 0 )
{
if ( ptr->finished != 0 )
{
if ( ptr->metricdir < 0 )
return(1.);
else return(-1.);
} else return(0.);
return(-1.);
else return(0.);
}
else if ( ptr->vals != 0 )
{
@ -470,7 +478,7 @@ double basilisk_bitcoin_rawtxmetric_dependents(struct supernet_info *myinfo,stru
if ( j == numaddrs )
{
printf("spend of invalid input address.(%s)\n",coinaddr);
metric = 3. + i;
metric = -(3. + i);
}
printf("Valid spend %.8f to %s\n",dstr(value),coinaddr);
}
@ -483,10 +491,10 @@ double basilisk_bitcoin_rawtxmetric_dependents(struct supernet_info *myinfo,stru
if ( (inputsum - dependents->outputsum) != txfee )
{
printf("inputsum %.8f - outputsum %.8f = %.8f != txfee %.8f\n",dstr(inputsum),dstr(dependents->outputsum),dstr(inputsum)-dstr(dependents->outputsum),dstr(txfee));
return(1001.); // error
return(-1001.); // error
}
return(dstr(dependents->cost));
} else return(666.); // no vals??
} else return(-666.); // no vals??
}
double basilisk_bitcoin_rawtxmetric(struct supernet_info *myinfo,struct basilisk_item *ptr,char *resultstr)
@ -504,11 +512,12 @@ double basilisk_bitcoin_rawtxmetric(struct supernet_info *myinfo,struct basilisk
}
return(metric);
}
if ( (resultsobj= cJSON_Parse(resultstr)) == 0 || (vins= jobj(resultsobj,"vins")) != 0 || (rawtx= jstr(resultsobj,"rawtx")) != 0 )
if ( (resultsobj= cJSON_Parse(resultstr)) == 0 || (vins= jobj(resultsobj,"vins")) == 0 || (rawtx= jstr(resultsobj,"rawtx")) == 0 )
{
if ( resultsobj != 0 )
free_json(resultsobj);
return(1.); // error
printf("resultstr error.(%s)\n",resultstr);
return(-1.); // error
}
spendscriptstr = jstr(ptr->vals,"spendscript");
changeaddr = jstr(ptr->vals,"changeaddr");
@ -523,7 +532,7 @@ double basilisk_bitcoin_rawtxmetric(struct supernet_info *myinfo,struct basilisk
if ( juint(txobj,"locktime") != locktime )
{
printf("locktime mismatch %u != %u\n",juint(txobj,"locktime"),locktime);
return(2.); // error
return(-2.); // error
}
else if ( jobj(txobj,"error") == 0 && cJSON_GetArraySize(vins) == msgtx.tx_in )
{
@ -532,6 +541,7 @@ double basilisk_bitcoin_rawtxmetric(struct supernet_info *myinfo,struct basilisk
dependents->coinaddrs = (void *)&dependents->results[msgtx.tx_in];
dependents->numptrs = msgtx.tx_in;
ptr->dependents = dependents;
ptr->numchildren = dependents->numptrs;
for (i=0; i<msgtx.tx_in; i++)
{
vin = jitem(vins,i);
@ -577,7 +587,7 @@ double basilisk_bitcoin_rawtxmetric(struct supernet_info *myinfo,struct basilisk
if ( m == 1 && strcmp(jstri(addrs,0),changeaddr) == 0 )
{
dependents->change = msgtx.vouts[i].value;
printf("verify it is normal spend for %s\n",changeaddr);
printf("verify it is normal spend for %s %.8f\n",changeaddr,dstr(msgtx.vouts[i].value));
continue;
}
}
@ -592,12 +602,12 @@ double basilisk_bitcoin_rawtxmetric(struct supernet_info *myinfo,struct basilisk
if ( dependents->spentsatoshis != amount )
{
printf("spentsatoshis %.8f != expected %.8f, change %.8f\n",dstr(dependents->spentsatoshis),dstr(amount),dstr(dependents->change));
return(1000.); // error
return(-1000.); // error
}
if ( (dependents->outputsum= outputsum) <= 0 )
{
printf("illegal outputsum %.8f\n",dstr(outputsum));
return(1001.); // error
return(-1001.); // error
}
dependents->cost = cost;
return(0.);

2
iguana/SuperNET.c

@ -492,7 +492,7 @@ int32_t iguana_send_supernet(struct iguana_peer *addr,char *jsonstr,int32_t dela
printf("SUPERSEND -> (%s) (%s) delaymillis.%d datalen.%d checkc.%x\n",jprint(SuperNET_bits2json(&serialized[sizeof(struct iguana_msghdr)],datalen),1),addr->ipaddr,delaymillis,datalen,checkc);
if ( 1 && memcmp(destpub.bytes,GENESIS_PUBKEY.bytes,sizeof(destpub)) == 0 )
{
qlen = iguana_queue_send(addr,delaymillis,serialized,"SuperNET",datalen,0,0);
qlen = iguana_queue_send(addr,delaymillis,serialized,"SuperNET",datalen+1,0,0);
//printf("send broadcast\n");
}
else

4
iguana/iguana_sign.c

@ -341,7 +341,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t rwflag,cJSON *json,uint8
array = cJSON_CreateArray();
if ( rwflag == 0 )
sigser = calloc(1,maxsize);
printf("json.%p array.%p sigser.%p\n",json,array,sigser);
//printf("json.%p array.%p sigser.%p\n",json,array,sigser);
}
//printf("version.%d\n",msg->version);
if ( coin->chain->hastimestamp != 0 )
@ -561,7 +561,7 @@ char *bitcoin_json2hex(struct supernet_info *myinfo,struct iguana_info *coin,bit
cJSON *bitcoin_hex2json(struct iguana_info *coin,bits256 *txidp,struct iguana_msgtx *msgtx,char *txbytes,uint8_t *extraspace,int32_t extralen)
{
int32_t n,len; char vpnstr[64]; struct iguana_msgtx M; uint8_t *serialized; cJSON *txobj;
if ( coin == 0 )
if ( coin == 0 || txbytes == 0 )
return(0);
txobj = cJSON_CreateObject();
if ( msgtx == 0 )

Loading…
Cancel
Save