char *init_NXTservices(char *JSON_or_fname,char *myipaddr) { static int32_t zero,one = 1; struct coin_info *cp; struct NXThandler_info *mp = Global_mp; // seems safest place to have main data structure if ( Debuglevel > 0 ) printf("init_NXTservices.(%s)\n",myipaddr); UV_loop = uv_default_loop(); myipaddr = init_MGWconf(JSON_or_fname,myipaddr); mp->udp = start_libuv_udpserver(4,SUPERNET_PORT,on_udprecv); if ( (cp= get_coin_info("BTCD")) != 0 && cp->bridgeport != 0 ) cp->bridgeudp = start_libuv_udpserver(4,cp->bridgeport,on_bridgerecv); if ( 0 ) { uint32_t before,after; int32_t numinputs; char *rawtx = clonestr("0100000074fc77540156a5b19aaada0496780b1fbce72f7647da5f940883da7ee5d5774f673c6703c401000000fdfd0000483045022100f0b26a43136af6c28d381f461a9fcd30309788456cb81784dbc68ee85ae4151d022036fc96c4edd7b87e762bb139d5d34838a88054c37173236236f72940b2e5309801473044022068ae115a397d9a6f462b78416d58582736fa38ecc4eab2c26759e1e58d6326bc02204e148ab84d49b0f1c8aab1033819ad90c536c604ce24dab419013a5914d39d8a014c695221035827b3c432eb5a528a21657d36a1b61dd85078a6ba5f328bed2d928c173a46c421024ae5e013fda966cf8544025534012156f84a40a5672a894c42e144b0664202502102acdb9c782d499de9b98e8b166fc22bd68895e2293cb49e4a2e071f1254d1a7aa53aeffffffff0340420f00000000001976a9148466f34f39c23547abf922d422e3e5322fdf156588ac20cd8800020000001976a914cd073e0a5d4225f2577113400c3abf9ac1ad2cc488ac60c791e50600000017a914194a1499c343beefe3127e041f480ee4aef058408700000000"); before = extract_sequenceid(&numinputs,get_coin_info("BTCD"),rawtx,0); replace_bitcoin_sequenceid(get_coin_info("BTCD"),rawtx,12345678); after = extract_sequenceid(&numinputs,get_coin_info("BTCD"),rawtx,0); printf("newtx.(%s) before.%u after.%u\n",rawtx,before,after); getchar(); } if ( myipaddr != 0 ) strcpy(mp->ipaddr,myipaddr); //#ifndef __APPLE__ // Coinloop(0); //#else if ( IS_LIBTEST > 1 && portable_thread_create((void *)Coinloop,0) == 0 ) printf("ERROR hist Coinloop SSL\n"); //#endif Finished_loading = 1; if ( Debuglevel > 0 ) printf("run_UVloop\n"); if ( portable_thread_create((void *)run_UVloop,Global_mp) == 0 ) printf("ERROR hist process_hashtablequeues\n"); if ( portable_thread_create((void *)run_libwebsockets,&one) == 0 ) printf("ERROR hist run_libwebsockets SSL\n"); while ( SSL_done == 0 ) usleep(100000); if ( portable_thread_create((void *)run_libwebsockets,&zero) == 0 ) printf("ERROR hist run_libwebsockets\n"); sleep(3); { struct coin_info *cp; while ( (cp= get_coin_info("BTCD")) == 0 ) sleep(1); parse_ipaddr(cp->myipaddr,myipaddr); bind_NXT_ipaddr(cp->srvpubnxtbits,myipaddr); } return(myipaddr); }
char *get_public_srvacctsecret() { struct coin_info *cp = get_coin_info("BTCD"); if ( cp != 0 ) return(cp->srvNXTACCTSECRET); else return(GENESIS_SECRET); }
char *telepod_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { uint64_t satoshis; struct coin_info *cp; uint32_t crc,ind,height,vout,totalcrc,sharei,M,N; char NXTACCTSECRET[1024],coinstr[512],coinaddr[512],otherpubaddr[512],txid[512],pubkey[512],privkey[2048],privkeyhex[2048],*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); crc = get_API_uint(objs[2],0); ind = get_API_uint(objs[3],0); height = get_API_uint(objs[4],0); copy_cJSON(coinstr,objs[5]); satoshis = SATOSHIDEN * get_API_float(objs[6]); copy_cJSON(coinaddr,objs[7]); copy_cJSON(txid,objs[8]); vout = get_API_uint(objs[9],0); copy_cJSON(pubkey,objs[10]); copy_cJSON(privkeyhex,objs[11]); decode_hex((unsigned char *)privkey,(int32_t)strlen(privkeyhex)/2,privkeyhex); privkey[strlen(privkeyhex)/2] = 0; totalcrc = get_API_uint(objs[12],0); sharei = get_API_uint(objs[13],0); M = get_API_uint(objs[14],1); N = get_API_uint(objs[15],1); copy_cJSON(otherpubaddr,objs[16]); if ( coinstr[0] != 0 && sender[0] != 0 && valid != 0 ) retstr = telepod_received(sender,NXTACCTSECRET,coinstr,crc,ind,height,satoshis,coinaddr,txid,vout,pubkey,privkey,totalcrc,sharei,M,N,otherpubaddr); else retstr = clonestr("{\"error\":\"invalid telepod received\"}"); return(retstr); }
char *teleport_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { //static char *teleport[] = { (char *)teleport_func, "teleport", "V", "NXT", "secret", "amount", "dest", "coin", "minage", 0 }; double amount; int32_t M,N; struct coin_info *cp; char NXTACCTSECRET[512],destaddr[512],minage[512],coinstr[512],*retstr = 0; if ( Historical_done == 0 ) return(clonestr("historical processing is not done yet")); copy_cJSON(NXTACCTSECRET,objs[1]); amount = get_API_float(objs[2]); copy_cJSON(destaddr,objs[3]); copy_cJSON(coinstr,objs[4]); copy_cJSON(minage,objs[5]); M = get_API_int(objs[6],1); N = get_API_int(objs[7],1); if ( M > N || N >= 0xff || M <= 0 ) M = N = 1; printf("amount.(%.8f) minage.(%s) %d | M.%d N.%d\n",amount,minage,atoi(minage),M,N); cp = get_coin_info(coinstr); if ( cp != 0 && sender[0] != 0 && amount > 0 && valid != 0 && destaddr[0] != 0 ) retstr = teleport(sender,NXTACCTSECRET,(uint64_t)(SATOSHIDEN * amount),destaddr,cp,atoi(minage),M,N); else retstr = clonestr("{\"error\":\"invalid teleport request\"}"); return(retstr); }
void every_minute(int32_t counter) { static int broadcast_count; uint32_t now = (uint32_t)time(NULL); int32_t i,n,numnodes,len; char ipaddr[64],_cmd[MAX_JSON_FIELD]; uint8_t finalbuf[MAX_JSON_FIELD]; struct coin_info *cp; struct nodestats *stats,**nodes; struct pserver_info *pserver; if ( Finished_init == 0 ) return; now = (uint32_t)time(NULL); cp = get_coin_info("BTCD"); if ( cp == 0 ) return; //printf("<<<<<<<<<<<<< EVERY_MINUTE\n"); refresh_buckets(cp->srvNXTACCTSECRET); if ( broadcast_count == 0 ) { p2p_publishpacket(0,0); update_Kbuckets(get_nodestats(cp->srvpubnxtbits),cp->srvpubnxtbits,cp->myipaddr,0,0,0); nodes = (struct nodestats **)copy_all_DBentries(&numnodes,NODESTATS_DATA); if ( nodes != 0 ) { now = (uint32_t)time(NULL); for (i=0; i<numnodes; i++) { expand_ipbits(ipaddr,nodes[i]->ipbits); printf("(%llu %d %s) ",(long long)nodes[i]->nxt64bits,nodes[i]->lastcontact-now,ipaddr); if ( gen_pingstr(_cmd,1) > 0 ) { len = construct_tokenized_req((char *)finalbuf,_cmd,cp->srvNXTACCTSECRET); send_packet(!prevent_queueing("ping"),nodes[i]->ipbits,0,finalbuf,len); pserver = get_pserver(0,ipaddr,0,0); send_kademlia_cmd(0,pserver,"ping",cp->srvNXTACCTSECRET,0,0); p2p_publishpacket(pserver,0); } free(nodes[i]); } free(nodes); } printf("numnodes.%d\n",numnodes); } if ( (broadcast_count % 10) == 0 ) { for (i=n=0; i<Num_in_whitelist; i++) { expand_ipbits(ipaddr,SuperNET_whitelist[i]); pserver = get_pserver(0,ipaddr,0,0); if ( ismyipaddr(ipaddr) == 0 && ((stats= get_nodestats(pserver->nxt64bits)) == 0 || broadcast_count == 0 || (now - stats->lastcontact) > NODESTATS_EXPIRATION) ) send_kademlia_cmd(0,pserver,"ping",cp->srvNXTACCTSECRET,0,0), n++; } if ( Debuglevel > 0 ) printf("PINGED.%d\n",n); } broadcast_count++; }
char *call_SuperNET_JSON(char *JSONstr) { cJSON *json,*array; int32_t valid; char NXTaddr[64],_tokbuf[2*MAX_JSON_FIELD],encoded[NXT_TOKEN_LEN+1],*cmdstr,*retstr = 0; struct coin_info *cp = get_coin_info("BTCD"); if ( Finished_init == 0 ) { printf("Finished_init still 0\n"); return(clonestr("{\"result\":null}")); } //printf("got call_SuperNET_JSON.(%s)\n",JSONstr); if ( cp != 0 && (json= cJSON_Parse(JSONstr)) != 0 ) { expand_nxt64bits(NXTaddr,cp->srvpubnxtbits); cJSON_AddItemToObject(json,"NXT",cJSON_CreateString(NXTaddr)); cJSON_AddItemToObject(json,"pubkey",cJSON_CreateString(Global_mp->pubkeystr)); cmdstr = cJSON_Print(json); if ( cmdstr != 0 ) { stripwhite_ns(cmdstr,strlen(cmdstr)); issue_generateToken(0,encoded,cmdstr,cp->srvNXTACCTSECRET); encoded[NXT_TOKEN_LEN] = 0; sprintf(_tokbuf,"[%s,{\"token\":\"%s\"}]",cmdstr,encoded); free(cmdstr); //printf("made tokbuf.(%s)\n",_tokbuf); array = cJSON_Parse(_tokbuf); if ( array != 0 ) { cmdstr = verify_tokenized_json(0,NXTaddr,&valid,array); //printf("cmdstr.%s valid.%d\n",cmdstr,valid); retstr = SuperNET_json_commands(Global_mp,0,array,NXTaddr,valid,_tokbuf); //printf("json command return.(%s)\n",retstr); if ( cmdstr != 0 ) free(cmdstr); free_json(array); } else printf("couldnt parse tokbuf.(%s)\n",_tokbuf); } free_json(json); } else printf("couldnt parse (%s)\n",JSONstr); if ( retstr == 0 ) retstr = clonestr("{\"result\":null}"); return(retstr); }
char *transporterstatus_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { uint64_t value; cJSON *array; struct coin_info *cp; int32_t minage; uint8_t sharenrs[255]; uint32_t totalcrc,status,i,sharei,M,N,height,ind,num,n=0,*crcs = 0; char NXTACCTSECRET[1024],sharenrsbuf[1024],otherpubaddr[512],coinstr[512],*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); status = get_API_int(objs[2],0); copy_cJSON(coinstr,objs[3]); totalcrc = get_API_uint(objs[4],0); value = (SATOSHIDEN * get_API_float(objs[5])); num = get_API_int(objs[6],0); minage = get_API_int(objs[7],0); height = get_API_int(objs[8],0); array = objs[9]; if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { crcs = calloc(n,sizeof(*crcs)); for (i=0; i<n; i++) crcs[i] = get_API_uint(cJSON_GetArrayItem(array,i),0); } sharei = get_API_int(objs[9],0); M = get_API_int(objs[11],0); N = get_API_int(objs[12],0); copy_cJSON(sharenrsbuf,objs[13]); memset(sharenrs,0,sizeof(sharenrs)); if ( M <= N && N < 0xff && M > 0 ) decode_hex(sharenrs,N,sharenrsbuf); else M = N = 1; ind = get_API_int(objs[14],0); copy_cJSON(otherpubaddr,objs[15]); //printf("transporterstatus_func sharei.%d M.%d N.%d other.(%s)\n",sharei,M,N,otherpubaddr); if ( coinstr[0] != 0 && sender[0] != 0 && valid != 0 && num > 0 ) retstr = got_transporter_status(NXTACCTSECRET,sender,coinstr,status,totalcrc,value,num,crcs,ind,minage,height,sharei,M,N,sharenrs,otherpubaddr); else retstr = clonestr("{\"error\":\"invalid incoming transporter status\"}"); if ( crcs != 0 ) free(crcs); return(retstr); }
char *transporter_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { uint64_t value; struct coin_info *cp; uint8_t sharenrs[255]; uint32_t totalcrc,M,N,minage,height,i,n=0,*crcs = 0; char NXTACCTSECRET[1024],sharenrsbuf[1024],coinstr[512],otherpubaddr[512],*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); copy_cJSON(coinstr,objs[2]); height = get_API_uint(objs[3],0); minage = get_API_uint(objs[4],0); value = (SATOSHIDEN * get_API_float(objs[5])); totalcrc = get_API_uint(objs[6],0); if ( is_cJSON_Array(objs[7]) != 0 && (n= cJSON_GetArraySize(objs[7])) > 0 ) { crcs = calloc(n,sizeof(*crcs)); for (i=0; i<n; i++) crcs[i] = get_API_uint(cJSON_GetArrayItem(objs[7],i),0); } M = get_API_int(objs[8],0); N = get_API_int(objs[9],0); copy_cJSON(sharenrsbuf,objs[10]); memset(sharenrs,0,sizeof(sharenrs)); if ( M <= N && N < 0xff && M > 0 ) decode_hex(sharenrs,N,sharenrsbuf); else M = N = 1; copy_cJSON(otherpubaddr,objs[11]); printf("transporterstatus_func M.%d N.%d [%s] otherpubaddr.(%s)\n",M,N,sharenrsbuf,otherpubaddr); if ( coinstr[0] != 0 && sender[0] != 0 && valid != 0 && n > 0 ) retstr = transporter_received(sender,NXTACCTSECRET,coinstr,totalcrc,height,value,minage,crcs,n,M,N,sharenrs,otherpubaddr); else retstr = clonestr("{\"error\":\"invalid incoming transporter bundle\"}"); if ( crcs != 0 ) free(crcs); return(retstr); }
char *SuperNET_JSON(char *JSONstr) { char *retstr = 0; struct coin_info *cp = get_coin_info("BTCD"); cJSON *json; if ( Finished_init == 0 ) return(0); if ( Debuglevel > 1 ) printf("got JSON.(%s)\n",JSONstr); if ( cp != 0 && (json= cJSON_Parse(JSONstr)) != 0 ) { if ( 1 && is_BTCD_command(json) != 0 ) // deadlocks as the SuperNET API came from locked BTCD RPC { //if ( Debuglevel > 1 ) // printf("is_BTCD_command\n"); return(block_on_SuperNET(0,JSONstr)); } else retstr = block_on_SuperNET(1,JSONstr); free_json(json); } else printf("couldnt parse (%s)\n",JSONstr); if ( retstr == 0 ) retstr = clonestr("{\"result\":null}"); return(retstr); }
char *pNXT_jsonhandler(cJSON **argjsonp,char *argstr,char *verifiedsender) { struct NXThandler_info *mp = Global_mp; long len; struct coin_info *cp; int32_t valid,firsttime = 1; cJSON *secretobj = 0,*json; char NXTACCTSECRET[1024],sender[64],*origparmstxt,*parmstxt=0,encoded[NXT_TOKEN_LEN+1],*retstr = 0; again: sender[0] = 0; if ( verifiedsender != 0 && verifiedsender[0] != 0 ) safecopy(sender,verifiedsender,sizeof(sender)); valid = -1; //printf("pNXT_jsonhandler argjson.%p\n",*argjsonp); if ( *argjsonp != 0 ) { secretobj = cJSON_GetObjectItem(*argjsonp,"secret"); copy_cJSON(NXTACCTSECRET,secretobj); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) { safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); cJSON_ReplaceItemInObject(*argjsonp,"secret",cJSON_CreateString(NXTACCTSECRET)); //printf("got cp.%p for BTCD (%s) (%s)\n",cp,cp->NXTACCTSECRET,cJSON_Print(*argjsonp)); } parmstxt = cJSON_Print(*argjsonp); len = strlen(parmstxt); stripwhite_ns(parmstxt,len); //printf("parmstxt.(%s)\n",parmstxt); } if ( *argjsonp == 0 ) { json = cJSON_CreateObject(); cJSON_AddItemToObject(json,"error",cJSON_CreateString("cant parse")); cJSON_AddItemToObject(json,"argstr",cJSON_CreateString(argstr)); retstr = cJSON_Print(json); free_json(json); return(retstr); } else { origparmstxt = parmstxt; parmstxt = verify_tokenized_json(sender,&valid,argjsonp,parmstxt); } retstr = pNXT_json_commands(mp,Global_pNXT,*argjsonp,sender,valid,argstr); //printf("back from pNXT_json_commands\n"); if ( firsttime != 0 && retstr == 0 && *argjsonp != 0 && parmstxt == 0 ) { cJSON *reqobj; uint64_t nxt64bits; char _tokbuf[4096],NXTaddr[64],buf[1024];//,*str; firsttime = 0; reqobj = cJSON_GetObjectItem(*argjsonp,"requestType"); copy_cJSON(buf,reqobj); if ( cJSON_GetObjectItem(*argjsonp,"requestType") != 0 ) cJSON_ReplaceItemInObject(*argjsonp,"time",cJSON_CreateNumber(time(NULL))); else cJSON_AddItemToObject(*argjsonp,"time",cJSON_CreateNumber(time(NULL))); nxt64bits = issue_getAccountId(0,NXTACCTSECRET); expand_nxt64bits(NXTaddr,nxt64bits); cJSON_ReplaceItemInObject(*argjsonp,"NXT",cJSON_CreateString(NXTaddr)); printf("replace NXT.(%s)\n",NXTaddr); //#ifndef __linux__ if ( strcmp(buf,"teleport") != 0 && strcmp(buf,"tradebot") != 0 && strcmp(buf,"makeoffer") != 0 && strcmp(buf,"select") != 0 && strcmp(buf,"checkmessages") != 0 && Global_pNXT->privacyServer != 0 ) { parmstxt = remove_secret(argjsonp,parmstxt); issue_generateToken(mp->curl_handle2,encoded,parmstxt,NXTACCTSECRET); encoded[NXT_TOKEN_LEN] = 0; sprintf(_tokbuf,"[%s,{\"token\":\"%s\"}]",parmstxt,encoded); retstr = sendmessage(NXTaddr,NXTACCTSECRET,_tokbuf,(int32_t)strlen(_tokbuf)+1,Global_pNXT->privacyServer_NXTaddr,_tokbuf); } else //#endif { issue_generateToken(mp->curl_handle2,encoded,origparmstxt,NXTACCTSECRET); encoded[NXT_TOKEN_LEN] = 0; sprintf(_tokbuf,"[%s,{\"token\":\"%s\"}]",origparmstxt,encoded); if ( *argjsonp != 0 ) free_json(*argjsonp); *argjsonp = cJSON_Parse(_tokbuf); if ( origparmstxt != 0 ) free(origparmstxt), origparmstxt = 0; goto again; } } //printf("free parmstxt.%p, argjson.%p\n",parmstxt,*argjsonp); if ( parmstxt != 0 ) free(parmstxt); return(retstr); }