From 5a26482eab309f9a4f94ea65c1936e26a721ac84 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 16 Jan 2016 16:36:18 -0300 Subject: [PATCH] test --- iguana/iguana777.c | 1 - iguana/iguana777.h | 14 ++++++-------- iguana/iguana_bundles.c | 2 +- iguana/iguana_init.c | 2 +- iguana/iguana_msg.c | 9 ++++++--- iguana/iguana_peers.c | 30 ++++++++++++++++-------------- iguana/iguana_ramchain.c | 8 ++++---- iguana/iguana_recv.c | 2 +- iguana/ramchain_api.c | 25 +++++++++++++++++++++++++ includes/iguana_apideclares.h | 1 + 10 files changed, 61 insertions(+), 33 deletions(-) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 3276e766b..7959b34ba 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -402,7 +402,6 @@ void iguana_coinloop(void *arg) { //printf("metrics\n"); coin->peers.lastmetrics = iguana_updatemetrics(coin); // ranks peers - coin->lastpossible = iguana_possible_peer(coin,0); // tries to connect to new peers } //printf("process\n"); iguana_bundlestats(coin,str); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 8d93dbbe9..4f60efbf9 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -232,7 +232,7 @@ struct iguana_kvitem { UT_hash_handle hh; uint8_t keyvalue[]; } __attribute__((p struct iguana_iAddr { - UT_hash_handle hh; uint32_t ipbits; + UT_hash_handle hh; uint64_t ipbits; uint32_t lastkilled,lastconnect; int32_t status,height,numkilled,numconnects; }; @@ -355,8 +355,8 @@ struct iguana_peer queue_t sendQ; struct iguana_msgaddress A; char ipaddr[64],lastcommand[16],coinstr[16],symbol[16]; - uint64_t pingnonce,totalsent,totalrecv; double pingtime,sendmillis,pingsum,getdatamillis; - uint32_t lastcontact,sendtime,ready,startsend,startrecv,pending,ipbits,lastgotaddr,lastblockrecv,pendtime,lastflush,lastpoll; + uint64_t pingnonce,totalsent,totalrecv,ipbits; double pingtime,sendmillis,pingsum,getdatamillis; + uint32_t lastcontact,sendtime,ready,startsend,startrecv,pending,lastgotaddr,lastblockrecv,pendtime,lastflush,lastpoll; 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; @@ -453,14 +453,12 @@ int32_t iguana_verifypeer(struct iguana_info *coin,void *key,void *value,int32_t int32_t iguana_peermetrics(struct iguana_info *coin); void iguana_peersloop(void *arg); int32_t iguana_queue_send(struct iguana_info *coin,struct iguana_peer *addr,int32_t delay,uint8_t *serialized,char *cmd,int32_t len,int32_t getdatablock,int32_t forceflag); -uint32_t iguana_ipbits2ind(struct iguana_info *coin,struct iguana_iAddr *iA,uint32_t ipbits,int32_t createflag); uint32_t iguana_rwiAddrind(struct iguana_info *coin,int32_t rwflag,struct iguana_iAddr *iA,uint32_t ind); -//uint32_t iguana_rwipbits_status(struct iguana_info *coin,int32_t rwflag,uint32_t ipbits,int32_t *statusp); void iguana_connections(void *arg); -uint32_t iguana_possible_peer(struct iguana_info *coin,char *ipaddr); +uint32_t iguana_possible_peer(struct iguana_info *coin,char *ip_port); //int32_t iguana_set_iAddrheight(struct iguana_info *coin,uint32_t ipbits,int32_t height); //struct iguana_peer *iguana_choosepeer(struct iguana_info *coin); -void iguana_initpeer(struct iguana_info *coin,struct iguana_peer *addr,uint32_t ipbits); +void iguana_initpeer(struct iguana_info *coin,struct iguana_peer *addr,uint64_t ipbits); void iguana_startconnection(void *arg); void iguana_shutdownpeers(struct iguana_info *coin,int32_t forceflag); void iguana_acceptloop(void *args); @@ -660,7 +658,7 @@ int32_t iguana_scriptgen(struct iguana_info *coin,uint8_t *script,char *asmstr,s int32_t iguana_ramchain_spendtxid(struct iguana_info *coin,bits256 *txidp,struct iguana_txid *T,int32_t numtxids,bits256 *X,int32_t numexternaltxids,struct iguana_spend *s); 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,uint32_t ipbits); +struct iguana_peer *iguana_peerslot(struct iguana_info *coin,uint64_t ipbits); char *busdata_sync(uint32_t *noncep,char *jsonstr,char *broadcastmode,char *destNXTaddr); void peggy(); diff --git a/iguana/iguana_bundles.c b/iguana/iguana_bundles.c index e957c16b5..aeea1c86f 100755 --- a/iguana/iguana_bundles.c +++ b/iguana/iguana_bundles.c @@ -348,7 +348,7 @@ void iguana_bundlepurge(struct iguana_info *coin,struct iguana_bundle *bp) { for (j=m=0; jpeers.active)/sizeof(*coin->peers.active); j++) { - if ( (ipbits= coin->peers.active[j].ipbits) != 0 ) + if ( (ipbits= (uint32_t)coin->peers.active[j].ipbits) != 0 ) { if ( iguana_peerfname(coin,&hdrsi,"tmp",fname,ipbits,bp->hashes[0],zero,1) >= 0 ) { diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index bb5450636..3829af64c 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -38,7 +38,7 @@ void iguana_initQs(struct iguana_info *coin) iguana_initQ(&coin->peers.active[i].sendQ,"addrsendQ"); } -void iguana_initpeer(struct iguana_info *coin,struct iguana_peer *addr,uint32_t ipbits) +void iguana_initpeer(struct iguana_info *coin,struct iguana_peer *addr,uint64_t ipbits) { memset(addr,0,sizeof(*addr)); addr->ipbits = ipbits; diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index b75d85285..8f2966f16 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -191,11 +191,14 @@ void iguana_gotverack(struct iguana_info *coin,struct iguana_peer *addr) void iguana_gotaddr(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_msgaddress *A) { - char ipaddr[64]; uint32_t ipbits; + char ipaddr[64],ipport[64]; uint32_t ipbits; uint16_t port; iguana_rwnum(0,&A->ip[12],sizeof(uint32_t),&ipbits); + iguana_rwnum(0,(void *)&A->port,sizeof(uint16_t),&port); expand_ipbits(ipaddr,ipbits); - iguana_possible_peer(coin,ipaddr); - //printf("gotaddr.(%s)\n",ipaddr); + if ( port != 0 ) + sprintf(ipport,"%s:%d",ipaddr,port); + iguana_possible_peer(coin,ipport); + printf("gotaddr.(%s:%d)\n",ipaddr,port); } void iguana_gotping(struct iguana_info *coin,struct iguana_peer *addr,uint64_t nonce,uint8_t *data) diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index 6fcc652ab..ea20fc202 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -16,9 +16,9 @@ #include "iguana777.h" #define _iguana_hashfind(coin,ipbits) _iguana_hashset(coin,ipbits,-1) -struct iguana_iAddr *iguana_iAddrhashfind(struct iguana_info *coin,uint32_t ipbits,int32_t createflag); +struct iguana_iAddr *iguana_iAddrhashfind(struct iguana_info *coin,uint64_t ipbits,int32_t createflag); -struct iguana_iAddr *_iguana_hashset(struct iguana_info *coin,uint32_t ipbits,int32_t itemind) +struct iguana_iAddr *_iguana_hashset(struct iguana_info *coin,uint64_t ipbits,int32_t itemind) { struct iguana_iAddr *ptr = 0; int32_t allocsize; char str[65]; struct OS_memspace *mem = 0; expand_ipbits(str,ipbits); @@ -56,7 +56,7 @@ struct iguana_iAddr *iguana_iAddrhashset(struct iguana_info *coin,struct iguana_ struct iguana_iAddr *tmp,*item; if ( iA == 0 || iA->ipbits == 0 ) { - printf("null iA.%p or ipbits.%x ind.%d status.%d\n",iA,iA!=0?iA->ipbits:0,iA!=0?iA->hh.itemind:0,iA!=0?iA->status:0); + printf("null iA.%p or ipbits.%llx ind.%d status.%d\n",iA,iA!=0?(long long)iA->ipbits:0,iA!=0?iA->hh.itemind:0,iA!=0?iA->status:0); exit(-1); return(0); } @@ -87,7 +87,7 @@ struct iguana_iAddr *iguana_iAddrhashset(struct iguana_info *coin,struct iguana_ return(iA); } -struct iguana_iAddr *iguana_iAddrhashfind(struct iguana_info *coin,uint32_t ipbits,int32_t createflag) +struct iguana_iAddr *iguana_iAddrhashfind(struct iguana_info *coin,uint64_t ipbits,int32_t createflag) { int32_t ind; struct iguana_iAddr *item = 0; portable_mutex_lock(&coin->peers_mutex); @@ -253,7 +253,7 @@ void iguana_iAkill(struct iguana_info *coin,struct iguana_peer *addr,int32_t mar int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) { - int32_t opt,sock,result; uint32_t ipbits; char ipaddr[64]; struct timeval timeout; + int32_t opt,sock,result; uint64_t ipbits; char ipaddr[64]; struct timeval timeout; struct sockaddr_in saddr; socklen_t addrlen,slen; addrlen = sizeof(saddr); struct hostent *hostent = gethostbyname(hostname); @@ -265,7 +265,7 @@ int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) saddr.sin_family = AF_INET; saddr.sin_port = htons(port); memcpy(&saddr.sin_addr.s_addr,hostent->h_addr_list[0],hostent->h_length); - ipbits = (uint32_t)calc_ipbits(hostname); + ipbits = calc_ipbits(hostname); //printf("ipbits.%08x vs %08x\n",ipbits,saddr.sin_addr.s_addr); expand_ipbits(ipaddr,saddr.sin_addr.s_addr); //if ( bindflag != 0 ) @@ -524,7 +524,7 @@ void iguana_gotdata(struct iguana_info *coin,struct iguana_peer *addr,int32_t he coin->longestchain = height; } -int32_t iguana_iAddrheight(struct iguana_info *coin,uint32_t ipbits) +int32_t iguana_iAddrheight(struct iguana_info *coin,uint64_t ipbits) { struct iguana_iAddr *iA; if ( (iA= iguana_iAddrhashfind(coin,ipbits,0)) != 0 ) @@ -534,7 +534,7 @@ int32_t iguana_iAddrheight(struct iguana_info *coin,uint32_t ipbits) void iguana_startconnection(void *arg) { - int32_t i,n; char ipaddr[64]; struct iguana_peer *addr = arg; struct iguana_info *coin = 0; + int32_t i,n; uint16_t port; char ipaddr[64]; struct iguana_peer *addr = arg; struct iguana_info *coin = 0; if ( addr == 0 || (coin= iguana_coinfind(addr->symbol)) == 0 ) { printf("iguana_startconnection nullptrs addr.%p coin.%p\n",addr,coin); @@ -559,8 +559,10 @@ void iguana_startconnection(void *arg) } //printf("startconnection.(%s) pending.%u usock.%d addrind.%d\n",addr->ipaddr,addr->pending,addr->usock,addr->addrind); addr->pending = (uint32_t)time(NULL); + if ( (port= (uint16_t)(addr->ipbits >> 32)) == 0 ) + port = coin->chain->portp2p; if ( addr->usock < 0 ) - addr->usock = iguana_socket(0,addr->ipaddr,coin->chain->portp2p); + addr->usock = iguana_socket(0,addr->ipaddr,port); if ( addr->usock < 0 || coin->peers.shuttingdown != 0 ) { strcpy(ipaddr,addr->ipaddr); @@ -570,7 +572,7 @@ void iguana_startconnection(void *arg) else { addr->ready = (uint32_t)time(NULL); - addr->ipbits = (uint32_t)calc_ipbits(addr->ipaddr); + addr->ipbits = calc_ipbits(addr->ipaddr); addr->dead = 0; addr->pending = 0; addr->height = iguana_iAddrheight(coin,addr->ipbits); @@ -592,7 +594,7 @@ void iguana_startconnection(void *arg) } } -struct iguana_peer *iguana_peerslot(struct iguana_info *coin,uint32_t ipbits) +struct iguana_peer *iguana_peerslot(struct iguana_info *coin,uint64_t ipbits) { int32_t i; struct iguana_peer *addr; char ipaddr[64]; expand_ipbits(ipaddr,ipbits); @@ -653,7 +655,7 @@ void *iguana_iAddriterator(struct iguana_info *coin,struct iguana_iAddr *iA) uint32_t iguana_possible_peer(struct iguana_info *coin,char *ipaddr) { - char checkaddr[64]; uint32_t ipbits,now = (uint32_t)time(NULL); int32_t i,n; struct iguana_iAddr *iA; + char checkaddr[64]; uint64_t ipbits; uint32_t now = (uint32_t)time(NULL); int32_t i,n; struct iguana_iAddr *iA; if ( ipaddr != 0 ) { //printf("%p Q possible peer.(%s)\n",coin,ipaddr); @@ -685,12 +687,12 @@ uint32_t iguana_possible_peer(struct iguana_info *coin,char *ipaddr) return((uint32_t)time(NULL)); if ( strncmp("0.0.0",ipaddr,5) != 0 && strcmp("0.0.255.255",ipaddr) != 0 && strcmp("1.0.0.0",ipaddr) != 0 ) { - if ( (ipbits= (uint32_t)calc_ipbits(ipaddr)) != 0 ) + if ( (ipbits= calc_ipbits(ipaddr)) != 0 ) { expand_ipbits(checkaddr,ipbits); if ( strcmp(checkaddr,ipaddr) == 0 ) { - //printf("valid ipaddr.(%s) MAXPEERS.%d\n",ipaddr,coin->MAXPEERS); + printf("valid ipaddr.(%s) MAXPEERS.%d\n",ipaddr,coin->MAXPEERS); if ( (iA= iguana_iAddrhashfind(coin,ipbits,1)) != 0 ) { if ( iA->status != IGUANA_PEER_CONNECTING && iA->status != IGUANA_PEER_READY && iA->status != IGUANA_PEER_ELIGIBLE ) diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 5fae5b61e..2b08692a8 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -268,7 +268,7 @@ int32_t iguana_peerfname(struct iguana_info *coin,int32_t *hdrsip,char *dirname, int32_t iguana_peerfile_exists(struct iguana_info *coin,struct iguana_peer *addr,char *dirname,char *fname,bits256 hash2,bits256 prevhash2,int32_t numblocks) { FILE *fp; int32_t bundlei,hdrsi; - if ( (bundlei= iguana_peerfname(coin,&hdrsi,dirname,fname,addr!=0?addr->ipbits:0,hash2,prevhash2,numblocks)) >= 0 ) + if ( (bundlei= iguana_peerfname(coin,&hdrsi,dirname,fname,addr!=0?(uint32_t)addr->ipbits:0,hash2,prevhash2,numblocks)) >= 0 ) { OS_compatible_path(fname); if ( (fp= fopen(fname,"rb")) == 0 ) @@ -1493,7 +1493,7 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru if ( (err= iguana_ramchain_verify(coin,ramchain)) == 0 ) { B[0] = origtxdata->block.RO; - if ( (fpos= (int32_t)iguana_ramchain_save(coin,RAMCHAIN_ARG,addr->ipbits,origtxdata->block.RO.hash2,origtxdata->block.RO.prev_block,bundlei,0)) >= 0 ) + if ( (fpos= (int32_t)iguana_ramchain_save(coin,RAMCHAIN_ARG,(uint32_t)addr->ipbits,origtxdata->block.RO.hash2,origtxdata->block.RO.prev_block,bundlei,0)) >= 0 ) { //printf("set fpos.%d\n",fpos); //bp->ipbits[bundlei] = addr->ipbits; @@ -1501,7 +1501,7 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru ramchain->H.ROflag = 0; flag = 1; memset(&R,0,sizeof(R)); - if ( verifyflag != 0 && (mapchain= iguana_ramchain_map(coin,fname,0,1,&R,0,addr->ipbits,origtxdata->block.RO.hash2,origtxdata->block.RO.prev_block,bundlei,fpos,1,0)) != 0 ) + if ( verifyflag != 0 && (mapchain= iguana_ramchain_map(coin,fname,0,1,&R,0,(uint32_t)addr->ipbits,origtxdata->block.RO.hash2,origtxdata->block.RO.prev_block,bundlei,fpos,1,0)) != 0 ) { //printf("mapped Soffset.%ld\n",(long)mapchain->data->Soffset); iguana_ramchain_link(&R,origtxdata->block.RO.hash2,origtxdata->block.RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,1); @@ -1540,7 +1540,7 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru bp->numspends += ramchain->H.data->numspends; } if ( fpos >= 0 ) - block->fpos = fpos, block->fpipbits = addr->ipbits; + block->fpos = fpos, block->fpipbits = (uint32_t)addr->ipbits; } } else printf("ramchain verification error.%d hdrsi.%d bundlei.%d\n",err,bp->hdrsi,bundlei); } diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index 64bfe8cfe..f8c65d8ea 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -159,7 +159,7 @@ void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct i addr->recvtotal += recvlen; if ( iguana_ramchain_data(coin,addr,origtxdata,txarray,origtxdata->block.RO.txn_count,data,recvlen) >= 0 ) { - txdata->block.fpipbits = addr->ipbits; + txdata->block.fpipbits = (uint32_t)addr->ipbits; req->datalen = txdata->datalen; req->ipbits = txdata->block.fpipbits; if ( 0 ) diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index f968e2c18..314503c10 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -16,21 +16,46 @@ #include "iguana777.h" #include "../includes/iguana_apidefs.h" +ZERO_ARGS(ramchain,getpeers) +{ + int32_t i,r,j,iter,n; struct iguana_peer *addr; cJSON *array = cJSON_CreateArray(); + cJSON *retjson = cJSON_CreateObject(); + r = rand(); + for (iter=n=0; iter<2; iter++) + { + for (j=0; jpeers.active[i]; + if ( addr->usock >= 0 && (iter == 1 || addr->supernet != 0) ) + { + jaddistr(array,addr->ipaddr); + if ( ++n >= 64 ) + break; + } + } + } + return(jprint(retjson,1)); +} + ZERO_ARGS(ramchain,getinfo) { cJSON *retjson = cJSON_CreateObject(); + jaddstr(retjson,"result",coin->statusstr); return(jprint(retjson,1)); } ZERO_ARGS(ramchain,getbestblockhash) { cJSON *retjson = cJSON_CreateObject(); + char str[65]; jaddstr(retjson,"result",bits256_str(str,coin->blocks.hwmchain.RO.hash2)); return(jprint(retjson,1)); } ZERO_ARGS(ramchain,getblockcount) { cJSON *retjson = cJSON_CreateObject(); + jaddnum(retjson,"result",coin->blocks.hwmchain.height); return(jprint(retjson,1)); } diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index fc55b1d46..86e369a11 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -28,6 +28,7 @@ TWO_STRINGS(iguana,removenode,activecoin,ipaddr); TWO_STRINGS(iguana,oneshot,activecoin,ipaddr); TWO_STRINGS(iguana,nodestatus,activecoin,ipaddr); +ZERO_ARGS(ramchain,getpeers); ZERO_ARGS(ramchain,getinfo); ZERO_ARGS(ramchain,getbestblockhash); ZERO_ARGS(ramchain,getblockcount);