diff --git a/iguana/dPoW.h b/iguana/dPoW.h index b0a933f02..41283f8ce 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -178,5 +178,8 @@ char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *addre char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *coinaddr,int32_t count,int32_t skip); char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol); +int32_t _dex_getheight(struct supernet_info *myinfo,char *symbol); +char *_dex_getnotaries(struct supernet_info *myinfo,char *symbol); +int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); #endif diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 3a6bf95a3..6a4b8340d 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -293,7 +293,7 @@ void dpow_statemachinestart(void *ptr) //printf(" <= pubkey[%d]\n",i); memcpy(bp->notaries[i].pubkey,pubkeys[i],33); if ( strcmp("KMD",src->symbol) == 0 ) - memcpy(myinfo->notaries[i].pubkey,pubkeys[i],33); + memcpy(myinfo->notaries[i],pubkeys[i],33); if ( memcmp(bp->notaries[i].pubkey,dp->minerkey33,33) == 0 ) { myind = i; diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d2cded61d..fe0d1655b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -13,9 +13,6 @@ * * ******************************************************************************/ -// 1. add rpc hooks, debug -// 2. sig validate in fsm - struct signed_nnpacket { uint8_t sig64[64]; @@ -52,10 +49,10 @@ int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32 } return(-1); } -//dex* api -int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int32_t n,int32_t sock,void *packetp) + +int32_t signed_nn_recv(void **freeptrp,void *ctx,uint8_t notaries[64][33],int32_t n,int32_t sock,void *packetp) { - int32_t i,recvbytes; uint8_t pubkey33[33]; bits256 packethash; struct signed_nnpacket *sigpacket=0; + int32_t i,recvbytes; uint8_t pubkey33[33],pubkey0[33]; bits256 packethash; struct signed_nnpacket *sigpacket=0; *(void **)packetp = 0; *freeptrp = 0; recvbytes = nn_recv(sock,&sigpacket,NN_MSG,0); @@ -66,9 +63,19 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int { if ( bitcoin_recoververify(ctx,"nnrecv",sigpacket->sig64,sigpacket->packethash,pubkey33,33) == 0 ) { - for (i=0; ictx,myinfo->notaries,myinfo->numnotaries,myinfo->reqsock,&retptr)) >= 0 ) { - printf("req returned.[%d]\n",recvbytes); + //printf("req returned.[%d]\n",recvbytes); portable_mutex_lock(&myinfo->dexmutex); ipbits = 0; if ( strcmp(handler,"DEX") == 0 ) @@ -261,6 +268,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int3 else if ( retptr != 0 ) { retstr = clonestr((char *)retptr); + //printf("GOT.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { ipbits = juint(retjson,"randipbits"); @@ -325,7 +333,7 @@ void dpow_randipbits(struct supernet_info *myinfo,struct iguana_info *coin,cJSON char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { - char buf[65],*retstr = 0; int32_t datalen; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; + char buf[65],*retstr = 0; int32_t i,datalen; bits256 hash2; cJSON *retjson=0; struct iguana_info *coin; struct dex_request dexreq; *broadcastflagp = 0; if ( strcmp(dexp->handler,"request") == 0 ) { @@ -432,6 +440,36 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'N' ) + { + uint8_t pubkeys[64][33]; char str[128]; int32_t numnotaries; cJSON *array,*item; + if ( (numnotaries= komodo_notaries("KMD",pubkeys,-1)) > 0 && numnotaries <= 64 ) + { + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + for (i=0; i (%s)\n",retstr); + } } else printf("(%s) not active\n",dexreq.name); if ( retstr == 0 ) return(clonestr("{\"error\":\"null return\"}")); @@ -447,7 +485,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 { if ( (retstrs[j]= _dex_reqsend(myinfo,handler,data,datalen)) != 0 ) { - //printf("j.%d of max.%d (%s)\n",j,max,retstrs[j]); + //printf("j.%d of max.%d M.%d (%s)\n",j,max,M,retstrs[j]); if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 && strncmp(retstrs[j],"[]",strlen("[]")) != 0 && strcmp("0",retstrs[j]) != 0 ) { if ( ++j == M ) @@ -459,7 +497,10 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 //printf("automatic retry.%d of %d\n",i,max); } if ( j == 1 ) + { + //printf("return.(%s)\n",retstrs[0]); return(retstrs[0]); + } else if ( j >= M ) { origretstr0 = retstrs[0]; @@ -568,6 +609,31 @@ char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) return(_dex_sendrequest(myinfo,&dexreq,1,"")); } +int32_t _dex_getheight(struct supernet_info *myinfo,char *symbol) +{ + char *retstr; cJSON *retjson; int32_t height = -1; + if ( (retstr= _dex_getinfo(myinfo,symbol)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + height = jint(retjson,"blocks") - 1; + free_json(retjson); + } + free(retstr); + } + return(height); +} + +char *_dex_getnotaries(struct supernet_info *myinfo,char *symbol) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'N'; + dexreq.intarg = -1; + return(_dex_sendrequest(myinfo,&dexreq,1,"")); +} + char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol) { struct dex_request dexreq; @@ -1483,6 +1549,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) int32_t i,n=0,num=0,size,broadcastflag,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; void *freeptr; if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); + if ( myinfo->IAMNOTARY != 0 && myinfo->numnotaries <= 0 ) + { + myinfo->numnotaries = komodo_notaries("KMD",myinfo->notaries,-1); + printf("INIT with %d notaries\n",myinfo->numnotaries); + } portable_mutex_lock(&myinfo->dpowmutex); /*for (i=0; i<100; i++) { diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index b81d1dcf1..6283e4839 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -15,11 +15,45 @@ #define issue_curl(cmdstr) bitcoind_RPC(0,"curl",cmdstr,0,0,0) +cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char buf[128],*retstr=0; cJSON *json = 0; + if ( coin->FULLNODE < 0 ) + { + buf[0] = 0; + retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getinfo",buf); + usleep(10000); + } + else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) + { + retstr = bitcoinrpc_getinfo(myinfo,coin,0,0); + } + else + { + return(0); + } + if ( retstr != 0 ) + { + json = cJSON_Parse(retstr); + free(retstr); + } + return(json); +} + int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height) { int32_t i,num=-1; struct iguana_info *coin; char params[256],*retstr,*pubkeystr; cJSON *retjson,*item,*array; if ( (coin= iguana_coinfind(symbol)) != 0 ) { + if ( height < 0 ) + { + if ( (retjson= dpow_getinfo(SuperNET_MYINFO(0),coin)) != 0 ) + { + height = jint(retjson,"blocks") - 1; + free_json(retjson); +//printf("komodo_notaries height.%d\n",height); + } + } if ( coin->FULLNODE < 0 ) { sprintf(params,"[\"%d\"]",height); @@ -27,7 +61,7 @@ int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - //printf("%s\n",retstr); +//printf("%s\n",retstr); if ( (array= jarray(&num,retjson,"notaries")) != 0 ) { if ( num > 64 ) @@ -50,6 +84,7 @@ int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height) } } } + //printf("komodo_notaries returns.%d\n",num); return(num); } @@ -146,31 +181,6 @@ bits256 dpow_getblockhash(struct supernet_info *myinfo,struct iguana_info *coin, return(blockhash); } -cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin) -{ - char buf[128],*retstr=0; cJSON *json = 0; - if ( coin->FULLNODE < 0 ) - { - buf[0] = 0; - retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getinfo",buf); - usleep(10000); - } - else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) - { - retstr = bitcoinrpc_getinfo(myinfo,coin,0,0); - } - else - { - return(0); - } - if ( retstr != 0 ) - { - json = cJSON_Parse(retstr); - free(retstr); - } - return(json); -} - cJSON *dpow_getblock(struct supernet_info *myinfo,struct iguana_info *coin,bits256 blockhash) { char buf[128],str[65],*retstr=0; cJSON *json = 0; diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 03c6de357..b36c93803 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -902,7 +902,9 @@ void iguana_coinloop(void *arg) init_alladdresses(myinfo,coin); } if ( coin->FULLNODE < 0 || coin->notarychain >= 0 ) + { continue; + } /*if ( strcmp(coin->symbol,"RELAY") == 0 ) { if ( myinfo->expiration != 0 && (myinfo->IAMLP != 0 || myinfo->DEXactive > now) ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index dfa7132b2..bfcbbff1b 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -137,7 +137,7 @@ struct supernet_info uint8_t logs[256],exps[510]; struct message_info msgids[8192]; double *svmfeatures; - struct dpow_entry notaries[64]; int32_t numnotaries; + uint8_t notaries[64][33]; int32_t numnotaries; }; #include "../includes/iguana_funcs.h" diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 5f98f1bb8..bf1829b5a 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -656,6 +656,12 @@ TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) { return(_dex_listtransactions(myinfo,symbol,address,count,skip)); } + +STRING_ARG(dex,getnotaries,symbol) +{ + return(_dex_getnotaries(myinfo,symbol)); +} + #include "../includes/iguana_apiundefs.h" diff --git a/iguana/main.c b/iguana/main.c index 0dfeabc7e..839a0e164 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1643,8 +1643,31 @@ void iguana_main(void *arg) #ifdef __APPLE__ iguana_appletests(myinfo); #endif + char *retstr,*pubkeystr; cJSON *retjson,*array,*item; int32_t i,n; + if ( (retstr= _dex_getnotaries(myinfo,"KMD")) != 0 ) + { + printf("INITIAL NOTARIES.(%s)\n",retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (myinfo->numnotaries= jint(retjson,"numnotaries")) != 0 && (array= jarray(&n,retjson,"notaries")) != 0 && n == myinfo->numnotaries ) + { + for (i=0; inotaries[i],33,pubkeystr); + } + } + free_json(retjson); + } + free(retstr); + } } - } else basilisks_init(myinfo); + } + else + { + basilisks_init(myinfo); + } if ( 0 ) { char *jsonstr = "[\"03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828\", \"02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344\", \"03750cf30d739cd7632f77c1c02812dd7a7181628b0558058d4755838117e05339\", \"0394f3529d2e8cc69ffa7a2b55f3761e7be978fa1896ef4c55dc9c275e77e5bf5e\", \"0243c1eeb3777af47187d542e5f8c84f0ac4b05cf5a7ad77faa8cb6d2d56db7823\", \"02bb298844175640a34e908ffdfa2839f77aba3d5edadefee16beb107826e00063\", \"02fa88e549b4b871498f892e527a5d57287916809f8cc3163f641d71c535e8df5a\", \"032f799e370f06476793a122fcd623db7804898fe5aef5572095cfee6353df34bf\", \"02c06fe5401faff4442ef87b7d1b56c2e5a214166615f9a2f2030c71b0cb067ae8\", \"038ac67ca49a8169bcc5de83fe020071095a2c3b2bc4d1c17386977329758956d5\"]"; diff --git a/iguana/tests/dexnotaries b/iguana/tests/dexnotaries new file mode 100755 index 000000000..1da169442 --- /dev/null +++ b/iguana/tests/dexnotaries @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getnotaries\",\"symbol\":\"KMD\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index bbb9b1bfa..c45f295f4 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -29,6 +29,7 @@ ZERO_ARGS(iguana,paxfiats); TWO_STRINGS(dex,send,hex,handler); HASH_AND_STRING(dex,gettransaction,txid,symbol); STRING_ARG(dex,getinfo,symbol); +STRING_ARG(dex,getnotaries,symbol); STRING_ARG(dex,alladdresses,symbol); STRING_ARG(dex,getbestblockhash,symbol); STRING_AND_INT(dex,getblockhash,symbol,height);