diff --git a/crypto777/curve25519.c b/crypto777/curve25519.c index 4e0b88912..914e315ed 100755 --- a/crypto777/curve25519.c +++ b/crypto777/curve25519.c @@ -184,6 +184,7 @@ bits256 fcontract(const bits320 input) bits256 curve25519(bits256 mysecret,bits256 basepoint) { bits320 bp,x,z; + mysecret.bytes[0] &= 0xf8, mysecret.bytes[31] &= 0x7f, mysecret.bytes[31] |= 0x40; bp = fexpand(basepoint); cmult(&x,&z,mysecret,bp); return(fcontract(fmul(x,crecip(z)))); diff --git a/iguana/SuperNET.h b/iguana/SuperNET.h index a886b133b..afea890b3 100644 --- a/iguana/SuperNET.h +++ b/iguana/SuperNET.h @@ -66,11 +66,15 @@ struct supernet_agent uint32_t ipbits,dead; int32_t num,sock; uint16_t port,pubport,repport; }; -struct supernet_address { bits256 pubkey; }; +struct supernet_address +{ + bits256 pubkey,iphash; + uint32_t selfipbits,myipbits; int32_t confirmed,totalconfirmed; +}; struct supernet_info { - char ipaddr[64],transport[8]; int32_t APISLEEP; int32_t iamrelay; uint64_t my64bits; uint64_t ipbits; + char ipaddr[64],transport[8]; int32_t APISLEEP; int32_t iamrelay; int32_t Debuglevel,readyflag,dead,POLLTIMEOUT; char rpcsymbol[16],LBpoint[64],PUBpoint[64]; //int32_t pullsock,subclient,lbclient,lbserver,servicesock,pubglobal,pubrelays,numservers; bits256 privkey; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index c0e880200..b0cca8092 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -353,10 +353,11 @@ struct iguana_peer { struct queueitem DL; queue_t sendQ; + bits256 iphash; struct iguana_msgaddress A; char ipaddr[64],lastcommand[16],coinstr[16],symbol[16]; uint64_t pingnonce,totalsent,totalrecv,ipbits; double pingtime,sendmillis,pingsum,getdatamillis; - uint32_t lastcontact,sendtime,ready,startsend,startrecv,pending,lastgotaddr,lastblockrecv,pendtime,lastflush,lastpoll; + uint32_t lastcontact,sendtime,ready,startsend,startrecv,pending,lastgotaddr,lastblockrecv,pendtime,lastflush,lastpoll,myipbits; int32_t supernet,dead,addrind,usock,lastheight,protover,relayflag,numpackets,numpings,ipv6,height,rank,pendhdrs,pendblocks,recvhdrs,lastlefti; double recvblocks,recvtotal; int64_t allocated,freed; @@ -659,6 +660,9 @@ int32_t iguana_ramchain_spendtxid(struct iguana_info *coin,bits256 *txidp,struct struct iguana_info *iguana_coinselect(); void iguana_dedicatedloop(struct iguana_info *coin,struct iguana_peer *addr); struct iguana_peer *iguana_peerslot(struct iguana_info *coin,uint64_t ipbits); +void iguana_dedicatedglue(void *arg); +void SuperNET_remotepeer(struct supernet_info *myinfo,struct iguana_info *coin,char *symbol,char *ipaddr,int32_t supernetflag); +void SuperNET_yourip(struct supernet_info *myinfo,char *yourip); char *busdata_sync(uint32_t *noncep,char *jsonstr,char *broadcastmode,char *destNXTaddr); void peggy(); @@ -667,7 +671,7 @@ struct iguana_info *iguana_coinfind(const char *symbol); struct iguana_info *iguana_coinadd(const char *symbol); struct iguana_ramchain *iguana_bundleload(struct iguana_info *coin,struct iguana_bundle *bp); int32_t iguana_sendblockreq(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_bundle *bp,int32_t bundlei,bits256 hash2,int32_t iamthreadsafe); -int32_t iguana_send_supernet(struct iguana_info *coin,struct iguana_peer *addr,char *jsonstr,int32_t delay); +int32_t iguana_send_supernet(struct iguana_info *coin,struct iguana_peer *addr,void *data,long datalen,int32_t delay); struct iguana_waccount *iguana_waccountfind(struct iguana_info *coin,char *account); struct iguana_waccount *iguana_waccountadd(struct iguana_info *coin,char *walletaccount,struct iguana_waddress *waddr); diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 51032d953..397e04c7c 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -100,7 +100,9 @@ void iguana_acceptloop(void *args) { printf("LAUNCH DEDICATED THREAD for %s\n",ipaddr); addr->usock = sock; - iguana_dedicatedloop(coin,addr); + strcpy(addr->symbol,coin->symbol); + iguana_launch(coin,"accept",iguana_dedicatedglue,addr,IGUANA_CONNTHREAD); + //iguana_dedicatedloop(coin,addr); } } } diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index cd5cfbcc1..cee9c8e21 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -352,11 +352,6 @@ int32_t SuperNET_coinpeers(struct iguana_info *coin,cJSON *SNjson,cJSON *rawjson return(max); } -void SuperNET_remotepeer(struct supernet_info *myinfo,struct iguana_info *coin,char *symbol,char *ipaddr,int32_t supernetflag) -{ - printf("got %s remotepeer.(%s) supernet.%d\n",symbol,ipaddr,supernetflag); -} - void SuperNET_parsepeers(struct supernet_info *myinfo,cJSON *array,int32_t n,int32_t supernetflag) { int32_t i,j,m; cJSON *coinarray,*item; char *symbol,*ipaddr; struct iguana_info *ptr; diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index 8687b2f24..e1307aaab 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -163,7 +163,7 @@ int32_t iguana_send_version(struct iguana_info *coin,struct iguana_peer *addr,ui void iguana_gotverack(struct iguana_info *coin,struct iguana_peer *addr) { - uint8_t serialized[sizeof(struct iguana_msghdr)]; + uint8_t serialized[sizeof(struct iguana_msghdr)]; char *msg = "{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}"; if ( addr != 0 ) { printf("gotverack from %s\n",addr->ipaddr); @@ -172,7 +172,7 @@ void iguana_gotverack(struct iguana_info *coin,struct iguana_peer *addr) if ( addr->supernet != 0 ) { printf("send getpeers to %s\n",addr->ipaddr); - iguana_send_supernet(coin,addr,"{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}",0); + iguana_send_supernet(coin,addr,msg,strlen(msg)+1,0); } } } @@ -192,6 +192,7 @@ void iguana_gotaddr(struct iguana_info *coin,struct iguana_peer *addr,struct igu void iguana_gotping(struct iguana_info *coin,struct iguana_peer *addr,uint64_t nonce,uint8_t *data) { int32_t len; uint8_t serialized[sizeof(struct iguana_msghdr) + sizeof(nonce)]; + char *msg = "{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}"; len = iguana_rwnum(1,&serialized[sizeof(struct iguana_msghdr)],sizeof(uint64_t),&nonce); if ( memcmp(data,&serialized[sizeof(struct iguana_msghdr)],sizeof(nonce)) != 0 ) printf("ping ser error %llx != %llx\n",(long long)nonce,*(long long *)data); @@ -199,13 +200,14 @@ void iguana_gotping(struct iguana_info *coin,struct iguana_peer *addr,uint64_t n if ( addr->supernet != 0 ) { printf("send getpeers to %s\n",addr->ipaddr); - iguana_send_supernet(coin,addr,"{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}",0); + iguana_send_supernet(coin,addr,msg,strlen(msg)+1,0); } } int32_t iguana_send_ping(struct iguana_info *coin,struct iguana_peer *addr) { int32_t len; uint64_t nonce; uint8_t serialized[sizeof(struct iguana_msghdr) + sizeof(nonce)]; + char *msg = "{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}"; if ( (nonce= addr->pingnonce) == 0 ) { OS_randombytes((uint8_t *)&nonce,sizeof(nonce)); @@ -215,7 +217,7 @@ int32_t iguana_send_ping(struct iguana_info *coin,struct iguana_peer *addr) printf("pingnonce.%llx\n",(long long)nonce); len = iguana_rwnum(1,&serialized[sizeof(struct iguana_msghdr)],sizeof(uint64_t),&nonce); if ( addr->supernet != 0 ) - iguana_send_supernet(coin,addr,"{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}",(rand() % 10000)); + iguana_send_supernet(coin,addr,msg,strlen(msg)+1,(rand() % 10000)); return(iguana_queue_send(coin,addr,0,serialized,"ping",len,0,0)); } @@ -438,7 +440,7 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc len = recvlen; if ( (retstr= SuperNET_p2p(coin,addr,&delay,addr->ipaddr,data,recvlen)) != 0 ) { - iguana_send_supernet(coin,addr,retstr,delay); + iguana_send_supernet(coin,addr,retstr,strlen(retstr)+1,delay); free(retstr); } printf("GOT.(%s) [%s] len.%d from %s -> (%s)\n",H->command,data,recvlen,addr->ipaddr,retstr==0?"null":retstr); diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index 7055539ad..2c7018988 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -602,6 +602,9 @@ void iguana_startconnection(void *arg) struct iguana_peer *iguana_peerslot(struct iguana_info *coin,uint64_t ipbits) { int32_t i; struct iguana_peer *addr; char ipaddr[64]; + for (i=0; i<IGUANA_MAXPEERS; i++) + if ( ipbits == coin->peers.active[i].ipbits ) + return(0); expand_ipbits(ipaddr,ipbits); #ifdef IGUANA_DISABLEPEERS if ( strcmp("127.0.0.1",ipaddr) != 0 ) @@ -883,8 +886,8 @@ int64_t iguana_peerallocated(struct iguana_info *coin,struct iguana_peer *addr) void iguana_dedicatedloop(struct iguana_info *coin,struct iguana_peer *addr) { static uint32_t lastping; - struct pollfd fds; uint8_t *buf,serialized[64]; struct iguana_bundlereq *req; - int32_t bufsize,flag,run,timeout = coin->polltimeout == 0 ? 10 : coin->polltimeout; + char *msg; struct pollfd fds; uint8_t *buf,serialized[64]; struct iguana_bundlereq *req; + uint32_t ipbits; int32_t bufsize,flag,run,timeout = coin->polltimeout == 0 ? 10 : coin->polltimeout; #ifdef IGUANA_PEERALLOC int32_t i; int64_t remaining; struct OS_memspace *mem[sizeof(addr->SEROUT)/sizeof(*addr->SEROUT)]; for (i=0; i<sizeof(addr->SEROUT)/sizeof(*addr->SEROUT); i++) @@ -900,7 +903,9 @@ void iguana_dedicatedloop(struct iguana_info *coin,struct iguana_peer *addr) } #endif addr->addrind = (int32_t)(((long)addr - (long)&coin->peers.active[0]) / sizeof(*addr)); - printf("start dedicatedloop.%s addrind.%d\n",addr->ipaddr,addr->addrind); + ipbits = (uint32_t)addr->ipbits; + vcalc_sha256(0,addr->iphash.bytes,(uint8_t *)&ipbits,sizeof(ipbits)); + char str[65]; printf("start dedicatedloop.%s addrind.%d %s\n",addr->ipaddr,addr->addrind,bits256_str(str,addr->iphash)); addr->maxfilehash2 = IGUANA_MAXFILEITEMS; bufsize = IGUANA_MAXPACKETSIZE; buf = mycalloc('r',1,bufsize); @@ -981,7 +986,8 @@ void iguana_dedicatedloop(struct iguana_info *coin,struct iguana_peer *addr) else if ( addr->supernet != 0 && time(NULL) > lastping+60 ) { printf("send getpeers\n"); - iguana_send_supernet(coin,addr,"{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}",0); + msg = "{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}"; + iguana_send_supernet(coin,addr,msg,strlen(msg)+1,0); lastping = (uint32_t)time(NULL); } if ( coin->isRT != 0 && addr->rank > coin->MAXPEERS && (rand() % 100) == 0 ) @@ -1020,6 +1026,17 @@ void iguana_dedicatedloop(struct iguana_info *coin,struct iguana_peer *addr) coin->peers.numconnected--; } +void iguana_dedicatedglue(void *arg) +{ + struct iguana_info *coin = 0; struct iguana_peer *addr = arg; + if ( addr == 0 || (coin= iguana_coinfind(addr->symbol)) == 0 ) + { + printf("iguana_dedicatedglue nullptrs addr.%p coin.%p\n",addr,coin); + return; + } + iguana_dedicatedloop(coin,addr); +} + void iguana_peersloop(void *ptr) { #ifndef IGUANA_DEDICATED_THREADS @@ -1074,8 +1091,9 @@ void iguana_peersloop(void *ptr) } if ( flag == 0 ) { + char *msg = "{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}"; if ( time(NULL) > lastping+1 ) - iguana_send_supernet(coin,addr,"{\"agent\":\"SuperNET\",\"method\":\"getpeers\"}",0); + iguana_send_supernet(coin,addr,msg,strlen(msg)+1,0); usleep(1000); } } diff --git a/iguana/main.c b/iguana/main.c index 6cf0969a8..94440860c 100644 --- a/iguana/main.c +++ b/iguana/main.c @@ -33,6 +33,7 @@ uint32_t prices777_NXTBLOCK,MAX_DEPTH = 100; char NXTAPIURL[256],IGUANA_NXTADDR[256],IGUANA_NXTACCTSECRET[256]; uint64_t IGUANA_MY64BITS; queue_t helperQ,jsonQ,finishedQ,bundlesQ; +struct supernet_info MYINFO; static int32_t initflag; #ifdef __linux__ int32_t IGUANA_NUMHELPERS = 8; @@ -159,13 +160,199 @@ char *iguana_JSON(char *jsonstr) return(retstr); } +int32_t SuperNET_confirmip(struct supernet_info *myinfo,uint32_t ipbits) +{ + int32_t i,j,total = 0; uint32_t x; + for (i=0; i<IGUANA_MAXCOINS; i++) + { + if ( Coins[i] != 0 ) + { + for (j=0; j<IGUANA_MAXPEERS; j++) + { + if ( (x= Coins[i]->peers.active[j].myipbits) != 0 ) + { + if ( x == ipbits ) + total++; + else total--; + } + } + } + } + return(total); +} + +void SuperNET_myipaddr(struct supernet_info *myinfo,struct iguana_peer *addr,char *myipaddr,char *remoteaddr) +{ + uint32_t myipbits = (uint32_t)calc_ipbits(myipaddr); + if ( addr->myipbits == 0 ) + addr->myipbits = myipbits; + else if ( addr->myipbits != myipbits ) + { + printf("%s: myipaddr conflict %x != %x?\n",addr->ipaddr,addr->myipbits,myipbits); + addr->myipbits = 0; + } + if ( addr->myipbits != 0 && myinfo->myaddr.myipbits == 0 ) + myinfo->myaddr.myipbits = addr->myipbits; + if ( addr->myipbits == myinfo->myaddr.myipbits ) + { + myinfo->myaddr.confirmed++; + if ( myinfo->myaddr.selfipbits == 0 || myinfo->ipaddr[0] == 0 ) + { + if ( (myinfo->myaddr.totalconfirmed= SuperNET_confirmip(myinfo,addr->myipbits)) > 3 ) + myinfo->myaddr.selfipbits = addr->myipbits; + } + } + else myinfo->myaddr.confirmed--; + if ( myinfo->myaddr.selfipbits == myinfo->myaddr.myipbits ) + { + expand_ipbits(myinfo->ipaddr,myinfo->myaddr.selfipbits); + vcalc_sha256(0,myinfo->myaddr.iphash.bytes,(uint8_t *)&myinfo->myaddr.selfipbits,sizeof(myinfo->myaddr.selfipbits)); + } +} + +void SuperNET_remotepeer(struct supernet_info *myinfo,struct iguana_info *coin,char *symbol,char *ipaddr,int32_t supernetflag) +{ + uint64_t ipbits; struct iguana_peer *addr; + printf("got %s remotepeer.(%s) supernet.%d\n",symbol,ipaddr,supernetflag); + if ( supernetflag != 0 ) + { + ipbits = calc_ipbits(ipaddr); + if ( (addr= iguana_peerslot(coin,ipbits)) != 0 ) + { + printf("launch startconnection to supernet peer.(%s)\n",ipaddr); + iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); + return; + } + } + iguana_possible_peer(coin,ipaddr); +} + +int32_t iguana_send_supernet(struct iguana_info *coin,struct iguana_peer *addr,void *data,long datalen,int32_t delaymillis) +{ + uint64_t r; char *jsonstr = data; int32_t flag=0,qlen = -1; uint8_t serialized[8192],*buf; cJSON *json; + if ( (json= cJSON_Parse((char *)data)) != 0 ) + { + if ( j64bits(json,"tag") == 0 ) + { + OS_randombytes((uint8_t *)&r,sizeof(r)); + jadd64bits(json,"tag",r); + } + jdelete(json,"yourip"); + jaddstr(json,"yourip",addr->ipaddr); + jsonstr = jprint(json,1); + datalen = strlen(jsonstr)+1; + flag = 1; + } + buf = serialized; + if ( datalen > sizeof(serialized)-sizeof(struct iguana_msghdr) ) + buf = calloc(1,datalen+sizeof(struct iguana_msghdr)); + memcpy(&buf[sizeof(struct iguana_msghdr)],jsonstr,datalen); + printf("SUPERSEND.(%s) -> (%s) delaymillis.%d\n",jsonstr,addr->ipaddr,delaymillis); + qlen = iguana_queue_send(coin,addr,delaymillis,serialized,"SuperNET",(int32_t)datalen,0,1); + if ( buf != serialized ) + free(buf); + if ( flag != 0 ) + free(jsonstr); + return(qlen); +} + +uint64_t Packetcache[1024]; +int32_t SuperNET_DHTsend(struct supernet_info *myinfo,bits256 routehash,uint8_t *data,int32_t datalen,int32_t maxdelay) +{ + static int lastpurge; + bits256 packethash; int32_t i,j,firstz,iter,n = 0; struct iguana_peer *addr; + vcalc_sha256(0,packethash.bytes,data,datalen); + firstz = -1; + for (i=0; i<sizeof(Packetcache)/sizeof(*Packetcache); i++) + { + if ( Packetcache[i] == 0 ) + { + Packetcache[i] = packethash.txid; + printf("add.%llx packetcache(%s)\n",(long long)packethash.txid,(char *)data); + break; + } + else if ( Packetcache[i] == packethash.txid ) + { + printf("SuperNET_DHTsend reject repeated packet.%llx (%s)\n",(long long)packethash.txid,(char *)data); + return(-1); + } + } + if ( i == sizeof(Packetcache)/sizeof(*Packetcache) ) + { + printf("purge slot[%d]\n",lastpurge); + Packetcache[lastpurge++] = packethash.txid; + if ( lastpurge >= sizeof(Packetcache)/sizeof(*Packetcache) ) + lastpurge = 0; + } + for (iter=0; iter<2; iter++) + { + for (i=0; i<IGUANA_MAXCOINS; i++) + { + if ( Coins[i] != 0 ) + { + for (j=0; j<IGUANA_MAXPEERS; j++) + { + addr = &Coins[i]->peers.active[j]; + if ( addr->usock >= 0 ) + { + if ( iter == 0 && memcmp(addr->iphash.bytes,routehash.bytes,sizeof(addr->iphash)) == 0 ) + { + iguana_send_supernet(Coins[i],addr,data,datalen,maxdelay==0?0:rand()%maxdelay); + return(100); + } + else if ( iter == 1 ) + { + if ( bits256_cmp(addr->iphash,myinfo->myaddr.iphash) < 0 ) + { + iguana_send_supernet(Coins[i],addr,data,datalen,maxdelay==0?0:rand()%maxdelay); + n++; + } + } + } + } + } + } + } + return(n); +} + +int32_t SuperNET_mypacket(struct supernet_info *myinfo,uint32_t destipbits,bits256 destpub) +{ + if ( destipbits == myinfo->myaddr.selfipbits ) + return(0); + if ( memcmp(destpub.bytes,myinfo->myaddr.pubkey.bytes,sizeof(destpub)) == 0 ) + return(0); + // check for encrypted packets + return(-1); +} + char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen) { - cJSON *json,*retjson; char *agent,*method,*retstr = 0; + cJSON *json,*retjson; bits256 destpub,routehash; uint32_t n,destipbits = 0; + char *destip,*agent,*myipaddr,*method,retbuf[512],*retstr = 0; *delaymillisp = 0; if ( (json= cJSON_Parse((char *)data)) != 0 ) { printf("GOT >>>>>>>> SUPERNET P2P.(%s) from.%s\n",(char *)data,coin->symbol); + if ( (myipaddr= jstr(json,"yourip")) != 0 ) + SuperNET_myipaddr(&MYINFO,addr,myipaddr,ipaddr); + if ( (destip= jstr(json,"destip")) != 0 ) + destipbits = (uint32_t)calc_ipbits(destip); + destpub = jbits256(json,"destpub"); + if ( SuperNET_mypacket(&MYINFO,destipbits,destpub) < 0 ) + { + if ( destipbits != 0 ) + vcalc_sha256(0,routehash.bytes,(uint8_t *)&destipbits,sizeof(destipbits)); + else routehash = destpub; + n = SuperNET_DHTsend(&MYINFO,routehash,data,datalen,juint(json,"delay")); + free_json(json); + if ( n > 0 ) + { + if ( n == 100 ) + sprintf(retbuf,"{\"result\":\"packet sent to destination\"}"); + else sprintf(retbuf,"{\"result\":\"packet forwarded to superDHT\",\"branches\":%d}",n); + } else return(clonestr("{\"error\":\"no nodes to forward packet to\"}")); + } if ( (agent= jstr(json,"agent")) != 0 && (method= jstr(json,"method")) != 0 ) { if ( strcmp(agent,"SuperNET") == 0 && strcmp(method,"stop") == 0 ) @@ -196,31 +383,6 @@ char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *de return(retstr); } -int32_t iguana_send_supernet(struct iguana_info *coin,struct iguana_peer *addr,char *jsonstr,int32_t delaymillis) -{ - int32_t len,flag=0,qlen = -1; uint8_t serialized[8192],*buf; cJSON *json; - if ( (json= cJSON_Parse(jsonstr)) != 0 ) - { - jdelete(json,"yourip"); - jaddstr(json,"yourip",addr->ipaddr); - jsonstr = jprint(json,1); - flag = 1; - } - buf = serialized; - if ( (len= (int32_t)strlen(jsonstr)) > sizeof(serialized)-sizeof(struct iguana_msghdr) ) - buf = calloc(1,len+sizeof(struct iguana_msghdr)); - { - memcpy(&buf[sizeof(struct iguana_msghdr)],jsonstr,len+1); - printf("SUPERSEND.(%s) -> (%s) delaymillis.%d\n",jsonstr,addr->ipaddr,delaymillis); - qlen = iguana_queue_send(coin,addr,delaymillis,serialized,"SuperNET",len+1,0,1); - } - if ( buf != serialized ) - free(buf); - if ( flag != 0 ) - free(jsonstr); - return(qlen); -} - void iguana_exit() { int32_t i,j,k; char *stopstr = "{\"agent\":\"SuperNET\",\"method\":\"stop\"}"; @@ -232,7 +394,7 @@ void iguana_exit() for (j=0; j<IGUANA_MAXPEERS; j++) { if ( Coins[i]->peers.active[j].usock >= 0 && Coins[i]->peers.active[j].supernet != 0 ) - iguana_send_supernet(Coins[i],&Coins[i]->peers.active[j],stopstr,0); + iguana_send_supernet(Coins[i],&Coins[i]->peers.active[j],stopstr,strlen(stopstr)+1,0); } } } @@ -271,8 +433,22 @@ void sigcontinue_func() { printf("\nSIGCONT\n"); signal(SIGCONT,sigcontinue_func void iguana_main(void *arg) { - struct supernet_info MYINFO; char helperstr[64],*helperargs,*coinargs=0,*secret,*jsonstr = arg; - int32_t i,len,flag; cJSON *json; uint8_t secretbuf[512]; + char helperstr[64],*helperargs,*ipaddr,*coinargs=0,*secret,*jsonstr = arg; + int32_t i,len,flag,c; cJSON *json; uint8_t secretbuf[512]; int64_t allocsize; + if ( (ipaddr= OS_filestr(&allocsize,"ipaddr")) != 0 ) + { + printf("got ipaddr.(%s)\n",ipaddr); + len = (int32_t)strlen(ipaddr) - 1; + while ( len > 8 && ((c= ipaddr[len]) == '\r' || c == '\n' || c == ' ' || c == '\t') ) + ipaddr[len] = 0, len--; + printf("got ipaddr.(%s) %x\n",ipaddr,is_ipaddr(ipaddr)); + if ( is_ipaddr(ipaddr) != 0 ) + { + strcpy(MYINFO.ipaddr,ipaddr); + MYINFO.myaddr.selfipbits = (uint32_t)calc_ipbits(ipaddr); + } + free(ipaddr); + } signal(SIGINT,sigint_func); signal(SIGILL,sigillegal_func); signal(SIGHUP,sighangup_func); @@ -288,6 +464,7 @@ void iguana_main(void *arg) OS_ensure_directory("DB"); OS_ensure_directory("tmp"); memset(&MYINFO,0,sizeof(MYINFO)); + OS_randombytes(MYINFO.privkey.bytes,sizeof(MYINFO.privkey)); if ( jsonstr != 0 && (json= cJSON_Parse(jsonstr)) != 0 ) { if ( jobj(json,"numhelpers") != 0 )