Browse Source

test

etomic
jl777 8 years ago
parent
commit
88d05f55cf
  1. 39
      basilisk/basilisk_bitcoin.c
  2. 2
      basilisk/basilisk_swap.c
  3. 6
      iguana/dPoW.h
  4. 130
      iguana/dpow/dpow_network.c
  5. 6
      iguana/iguana_notary.c

39
basilisk/basilisk_bitcoin.c

@ -882,7 +882,7 @@ cJSON *BTC_makeclaimfunc(struct supernet_info *myinfo,struct exchange_info *exch
HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr)
{ {
char *retstr=0,*symbol,*coinaddr; cJSON *retjson,*txoutjson; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height; char *retstr=0,*symbol,*coinaddr; cJSON *retjson,*txoutjson,*txjson,*array; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height,n;
if ( vals == 0 ) if ( vals == 0 )
return(clonestr("{\"error\":\"null valsobj\"}")); return(clonestr("{\"error\":\"null valsobj\"}"));
//if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 )
@ -894,12 +894,12 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr)
} }
if ( jobj(vals,"fanout") == 0 ) if ( jobj(vals,"fanout") == 0 )
jaddnum(vals,"fanout",MAX(5,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); jaddnum(vals,"fanout",MAX(5,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1));
txid = jbits256(vals,"txid");
vout = jint(vals,"vout");
if ( coin != 0 ) if ( coin != 0 )
{ {
if ( coin->FULLNODE < 0 ) if ( coin->FULLNODE < 0 )
{ {
txid = jbits256(vals,"txid");
vout = jint(vals,"vout");
if ( (txoutjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) if ( (txoutjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 )
{ {
if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= SATOSHIDEN*jdouble(txoutjson,"value")) != 0 ) if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= SATOSHIDEN*jdouble(txoutjson,"value")) != 0 )
@ -936,6 +936,39 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr)
return(retstr); return(retstr);
} }
} }
if ( myinfo->reqsock >= 0 )
{
if ( coin != 0 && (retstr= dex_getrawtransaction(myinfo,coin->symbol,txid)) != 0 )
{
if ( (txoutjson= cJSON_Parse(retstr)) != 0 )
{
if ( (array= jarray(&n,txoutjson,"vout")) != 0 && vout < n && (txjson= jitem(array,vout)) != 0 )
{
retjson = cJSON_CreateObject();
jaddstr(retjson,"result","success");
printf("txjson.(%s)\n",jprint(txjson,0));
if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= j64bits(txjson,"value") * SATOSHIDEN) != 0 )
{
jaddstr(retjson,"address",coinaddr);
jadd64bits(retjson,"satoshis",value);
jaddnum(retjson,"value",dstr(value));
//height = dpow_getchaintip(myinfo,&blockhash,&blocktime,0,0,coin);
//jaddnum(retjson,"height",height);
jaddnum(retjson,"numconfirms",jint(txjson,"confirmations"));
jaddbits256(retjson,"txid",txid);
jaddnum(retjson,"vout",vout);
jaddstr(retjson,"coin",coin->symbol);
free(retstr);
free_json(txoutjson);
return(jprint(retjson,1));
}
}
free_json(txoutjson);
}
free(retstr);
}
}
return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1)); return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1));
} }

2
basilisk/basilisk_swap.c

@ -257,7 +257,7 @@ int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_rawtx
jaddstr(argjson,"coin",rawtx->coin->symbol); jaddstr(argjson,"coin",rawtx->coin->symbol);
if ( (valstr= basilisk_value(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0)) != 0 ) if ( (valstr= basilisk_value(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0)) != 0 )
{ {
//char str[65]; printf("%s %s valstr.(%s)\n",rawtx->name,bits256_str(str,rawtx->actualtxid),valstr); //char str[65]; printf("%s %s valstr.(%s)\n",rawtx->name,bits256_str(str,rawtx->I.actualtxid),valstr);
if ( (valuearray= cJSON_Parse(valstr)) != 0 ) if ( (valuearray= cJSON_Parse(valstr)) != 0 )
{ {
if ( is_cJSON_Array(valuearray) != 0 ) if ( is_cJSON_Array(valuearray) != 0 )

6
iguana/dPoW.h

@ -22,7 +22,7 @@
#define DPOW_MINSIGS 11 #define DPOW_MINSIGS 11
//#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1)
#define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries)
#define DPOW_VERSION 0x0776 #define DPOW_VERSION 0x0777
#define DPOW_UTXOSIZE 10000 #define DPOW_UTXOSIZE 10000
#define DPOW_MINOUTPUT 6000 #define DPOW_MINOUTPUT 6000
#define DPOW_DURATION 600 #define DPOW_DURATION 600
@ -141,12 +141,14 @@ struct dpow_info
uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp);
int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp);
void dex_updateclient(struct supernet_info *myinfo); void dex_updateclient(struct supernet_info *myinfo);
int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen); char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen);
char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration); char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration);
char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx);
cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout);
int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin);
void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen);
int32_t dpow_nanomsg_update(struct supernet_info *myinfo); int32_t dpow_nanomsg_update(struct supernet_info *myinfo);
char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid);
cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid);
#endif #endif

130
iguana/dpow/dpow_network.c

@ -68,9 +68,46 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t
} }
} }
int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) struct dex_request { bits256 txid; char name[15]; uint8_t func; };
int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq)
{
int32_t len = 0;
len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->txid),dexreq->txid.bytes);
if ( rwflag != 0 )
{
memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name);
serialized[len++] = dexreq->func;
}
else
{
memcpy(dexreq->name,&serialized[len],sizeof(dexreq->name)), len += sizeof(dexreq->name);
dexreq->func = serialized[len++];
}
return(len);
}
char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp)
{
char *retstr = 0; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq;
if ( strcmp(dexp->handler,"request") == 0 )
{
dex_rwrequest(0,dexp->packet,&dexreq);
if ( (coin= iguana_coinfind(dexreq.name)) != 0 )
{
if ( dexreq.func == 'T' )
{
if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.txid)) != 0 )
retstr = jprint(retjson,1);
}
}
}
return(retstr);
}
char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen)
{ {
struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t retval=0,timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; char *retstr = 0;
portable_mutex_lock(&myinfo->dexmutex); portable_mutex_lock(&myinfo->dexmutex);
subsock = myinfo->subsock; subsock = myinfo->subsock;
reqsock = myinfo->reqsock; reqsock = myinfo->reqsock;
@ -130,41 +167,60 @@ int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int
//printf(" sent.%d:%d datalen.%d\n",sentbytes,size,datalen); //printf(" sent.%d:%d datalen.%d\n",sentbytes,size,datalen);
if ( (recvbytes= nn_recv(myinfo->reqsock,&retptr,NN_MSG,0)) >= 0 ) if ( (recvbytes= nn_recv(myinfo->reqsock,&retptr,NN_MSG,0)) >= 0 )
{ {
ipbits = *retptr;
expand_ipbits(ipaddr,ipbits);
//printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr);
portable_mutex_lock(&myinfo->dexmutex); portable_mutex_lock(&myinfo->dexmutex);
n = myinfo->numdexipbits; if ( strcmp(handler,"DEX") == 0 )
for (i=0; i<n; i++)
if ( ipbits == myinfo->dexipbits[i] )
break;
if ( i == n && n < 64 )
{ {
myinfo->dexipbits[n++] = ipbits; ipbits = *retptr;
qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits); expand_ipbits(ipaddr,ipbits);
if ( (myinfo->numdexipbits= n) < 3 ) //printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr);
n = myinfo->numdexipbits;
for (i=0; i<n; i++)
if ( ipbits == myinfo->dexipbits[i] )
break;
if ( i == n && n < 64 )
{ {
if ( myinfo->IAMNOTARY == 0 && myinfo->subsock >= 0 ) myinfo->dexipbits[n++] = ipbits;
qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits);
if ( (myinfo->numdexipbits= n) < 3 )
{ {
nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); if ( myinfo->IAMNOTARY == 0 && myinfo->subsock >= 0 )
printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); {
nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK));
printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str);
}
} }
nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK));
printf("%d: req connect (%s)\n",myinfo->numdexipbits,str);
} }
nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); nn_freemsg(retptr);
printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); }
else
{
retstr = (char *)retptr;
printf("REQ got (%s)\n",retstr);
} }
portable_mutex_unlock(&myinfo->dexmutex); portable_mutex_unlock(&myinfo->dexmutex);
nn_freemsg(retptr);
} }
else else
{ {
retval = -2; //retval = -2;
//printf("no rep return? recvbytes.%d\n",recvbytes); //printf("no rep return? recvbytes.%d\n",recvbytes);
} }
//printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d recv.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,recvbytes,dexp->timestamp); //printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d recv.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,recvbytes,dexp->timestamp);
free(dexp); free(dexp);
} else retval = -1; } //else retval = -1;
return(retval); return(retstr);
}
char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid)
{
struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen;
memset(&dexreq,0,sizeof(dexreq));
safecopy(dexreq.name,symbol,sizeof(dexreq.name));
dexreq.txid = txid;
dexreq.func = 'T';
datalen = dex_rwrequest(1,packet,&dexreq);
return(dex_reqsend(myinfo,"request",packet,datalen));
} }
int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32)
@ -937,7 +993,7 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *
int32_t dpow_nanomsg_update(struct supernet_info *myinfo) int32_t dpow_nanomsg_update(struct supernet_info *myinfo)
{ {
int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; int32_t i,n=0,num=0,size,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0;
if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) )
return(-1); return(-1);
portable_mutex_lock(&myinfo->dpowmutex); portable_mutex_lock(&myinfo->dpowmutex);
@ -1022,18 +1078,26 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo)
if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 )
{ {
num++; num++;
if ( (m= myinfo->numdpowipbits) > 0 ) if ( (retstr= dex_response(myinfo,dexp)) != 0 )
{ {
r = myinfo->dpowipbits[rand() % m]; nn_send(myinfo->repsock,retstr,(int32_t)strlen(retstr)+1,0);
nn_send(myinfo->repsock,&r,sizeof(r),0); free(retstr);
//printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); }
} else printf("illegal state without dpowipbits?\n"); else
if ( dex_packetcheck(myinfo,dexp,size) == 0 )
{ {
nn_send(myinfo->dexsock,dexp,size,0); if ( (m= myinfo->numdpowipbits) > 0 )
nn_send(myinfo->pubsock,dexp,size,0); {
//printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); r = myinfo->dpowipbits[rand() % m];
dex_packet(myinfo,dexp,size); nn_send(myinfo->repsock,&r,sizeof(r),0);
//printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r);
} else printf("illegal state without dpowipbits?\n");
if ( dex_packetcheck(myinfo,dexp,size) == 0 )
{
nn_send(myinfo->dexsock,dexp,size,0);
nn_send(myinfo->pubsock,dexp,size,0);
//printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp));
dex_packet(myinfo,dexp,size);
}
} }
//printf("GOT DEX rep PACKET.%d\n",size); //printf("GOT DEX rep PACKET.%d\n",size);
if ( dexp != 0 ) if ( dexp != 0 )

6
iguana/iguana_notary.c

@ -347,16 +347,16 @@ THREE_STRINGS(iguana,passthru,asset,function,hex)
TWO_STRINGS(dex,send,hex,handler) TWO_STRINGS(dex,send,hex,handler)
{ {
uint8_t data[8192]; int32_t datalen,retval; uint8_t data[8192]; int32_t datalen; char *retstr;
if ( hex != 0 && (datalen= is_hexstr(hex,0)) > 0 && (datalen>>1) < sizeof(data) ) if ( hex != 0 && (datalen= is_hexstr(hex,0)) > 0 && (datalen>>1) < sizeof(data) )
{ {
datalen >>= 1; datalen >>= 1;
decode_hex(data,datalen,hex); decode_hex(data,datalen,hex);
if ( handler == 0 || handler[0] == 0 ) if ( handler == 0 || handler[0] == 0 )
handler = "DEX"; handler = "DEX";
if ( (retval= dex_reqsend(myinfo,handler,data,datalen)) == 0 ) if ( (retstr= dex_reqsend(myinfo,handler,data,datalen)) == 0 )
return(clonestr("{\"result\":\"success\"}")); return(clonestr("{\"result\":\"success\"}"));
else return(clonestr("{\"error\":\"dex send: retval error\"}")); else return(retstr);
} else return(clonestr("{\"error\":\"dex send: invalid hex\"}")); } else return(clonestr("{\"error\":\"dex send: invalid hex\"}"));
} }

Loading…
Cancel
Save