diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 7c59c74c3..e7813cc76 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/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) { - 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 ) return(clonestr("{\"error\":\"null valsobj\"}")); //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 ) 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->FULLNODE < 0 ) { - txid = jbits256(vals,"txid"); - vout = jint(vals,"vout"); if ( (txoutjson= dpow_gettxout(myinfo,coin,txid,vout)) != 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); } } + 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)); } diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 37b0fd43f..31e3596b9 100755 --- a/basilisk/basilisk_swap.c +++ b/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); 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 ( is_cJSON_Array(valuearray) != 0 ) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 2df40807a..eb94a0057 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 11 //#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_VERSION 0x0776 +#define DPOW_VERSION 0x0777 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #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); int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); 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 *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); 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); 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 diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c530659c1..1a57f9d61 100755 --- a/iguana/dpow/dpow_network.c +++ b/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); subsock = myinfo->subsock; 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); 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); - n = myinfo->numdexipbits; - for (i=0; idexipbits[i] ) - break; - if ( i == n && n < 64 ) + if ( strcmp(handler,"DEX") == 0 ) { - myinfo->dexipbits[n++] = ipbits; - qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits); - if ( (myinfo->numdexipbits= n) < 3 ) + ipbits = *retptr; + expand_ipbits(ipaddr,ipbits); + //printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr); + n = myinfo->numdexipbits; + for (i=0; idexipbits[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)); - printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); + if ( myinfo->IAMNOTARY == 0 && myinfo->subsock >= 0 ) + { + 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)); - printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); + nn_freemsg(retptr); + } + else + { + retstr = (char *)retptr; + printf("REQ got (%s)\n",retstr); } portable_mutex_unlock(&myinfo->dexmutex); - nn_freemsg(retptr); } else { - retval = -2; + //retval = -2; //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); free(dexp); - } else retval = -1; - return(retval); + } //else retval = -1; + 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) @@ -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 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) ) return(-1); 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 ) { num++; - if ( (m= myinfo->numdpowipbits) > 0 ) + if ( (retstr= dex_response(myinfo,dexp)) != 0 ) { - r = myinfo->dpowipbits[rand() % m]; - 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->repsock,retstr,(int32_t)strlen(retstr)+1,0); + free(retstr); + } + else { - 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); + if ( (m= myinfo->numdpowipbits) > 0 ) + { + r = myinfo->dpowipbits[rand() % m]; + 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); if ( dexp != 0 ) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index ebb52cd3f..2c177e665 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -347,16 +347,16 @@ THREE_STRINGS(iguana,passthru,asset,function,hex) 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) ) { datalen >>= 1; decode_hex(data,datalen,hex); if ( handler == 0 || handler[0] == 0 ) handler = "DEX"; - if ( (retval= dex_reqsend(myinfo,handler,data,datalen)) == 0 ) + if ( (retstr= dex_reqsend(myinfo,handler,data,datalen)) == 0 ) return(clonestr("{\"result\":\"success\"}")); - else return(clonestr("{\"error\":\"dex send: retval error\"}")); + else return(retstr); } else return(clonestr("{\"error\":\"dex send: invalid hex\"}")); }