From 149ac448688c2bc13df65b11d379e4a8a0601987 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 10 Jan 2016 18:57:06 -0300 Subject: [PATCH] test --- SuperNET/SuperNET.c | 181 +---------- SuperNET/SuperNET.h | 41 ++- SuperNET/main.c | 616 ++++++++++++++++++++++++++++--------- crypto777/OS_nonportable.c | 1 + crypto777/OS_portable.h | 13 +- iguana/iguana777.h | 3 +- iguana/iguana_msg.c | 20 +- iguana/iguana_pubkeys.c | 51 ++- iguana/iguana_rpc.c | 9 +- iguana/mingw32 | 4 - iguana/mingw64 | 3 - win/pthreadGC2.dll | Bin 0 -> 119888 bytes win/pthreadGC2_64.dll | Bin 0 -> 185976 bytes 13 files changed, 591 insertions(+), 351 deletions(-) create mode 100644 win/pthreadGC2.dll create mode 100644 win/pthreadGC2_64.dll diff --git a/SuperNET/SuperNET.c b/SuperNET/SuperNET.c index 7249d68d4..d7a7a23ac 100644 --- a/SuperNET/SuperNET.c +++ b/SuperNET/SuperNET.c @@ -14,121 +14,8 @@ ******************************************************************************/ #include "SuperNET.h" -#ifdef later - -int32_t nn_typelist[] = { NN_REP, NN_REQ, NN_RESPONDENT, NN_SURVEYOR, NN_PUB, NN_SUB, NN_PULL, NN_PUSH, NN_BUS, NN_PAIR }; -char *nn_transports[] = { "tcp", "ws", "ipc", "inproc", "tcpmux", "tbd1", "tbd2", "tbd3" }; - -void expand_epbits(char *endpoint,struct endpoint epbits) -{ - char ipaddr[64]; - if ( epbits.ipbits != 0 ) - expand_ipbits(ipaddr,epbits.ipbits); - else strcpy(ipaddr,"*"); - sprintf(endpoint,"%s://%s:%d",nn_transports[epbits.transport],ipaddr,epbits.port); -} - -struct endpoint calc_epbits(char *transport,uint32_t ipbits,uint16_t port,int32_t type) -{ - int32_t i; struct endpoint epbits; - memset(&epbits,0,sizeof(epbits)); - for (i=0; i<(int32_t)(sizeof(nn_transports)/sizeof(*nn_transports)); i++) - if ( strcmp(transport,nn_transports[i]) == 0 ) - { - epbits.ipbits = ipbits; - epbits.port = port; - epbits.transport = i; - epbits.nn = type; - break; - } - return(epbits); -} - -int32_t ismyaddress(char *server,struct supernet_info *myinfo) -{ - uint32_t ipbits; - if ( strncmp(server,"tcp://",6) == 0 ) - server += 6; - else if ( strncmp(server,"ws://",5) == 0 ) - server += 5; - if ( (ipbits= is_ipaddr(server)) != 0 ) - { - if ( strcmp(server,myinfo->ipaddr) == 0 || myinfo->ipbits == ipbits ) - { - printf("(%s) MATCHES me (%s)\n",server,myinfo->ipaddr); - return(1); - } - } - else if ( myinfo->my64bits == ipbits ) - return(1); - //printf("(%s) is not me (%s)\n",server,myipaddr); - return(0); -} - -char *nn_typestr(int32_t type) -{ - switch ( type ) - { - // Messages that need a response from the set of peers: SURVEY - case NN_SURVEYOR: return("NN_SURVEYOR"); break; - case NN_RESPONDENT: return("NN_RESPONDENT"); break; - // Messages that need a response, but only from one peer: REQ/REP - case NN_REQ: return("NN_REQ"); break; - case NN_REP: return("NN_REP"); break; - // One-way messages to one peer: PUSH/PULL - case NN_PUSH: return("NN_PUSH"); break; - case NN_PULL: return("NN_PULL"); break; - // One-way messages to all: PUB/SUB - case NN_PUB: return("NN_PUB"); break; - case NN_SUB: return("NN_SUB"); break; - case NN_BUS: return("NN_BUS"); break; - case NN_PAIR: return("NN_PAIR"); break; - } - return("NN_ERROR"); -} - -int32_t nn_oppotype(int32_t type) -{ - switch ( type ) - { - // Messages that need a response from the set of peers: SURVEY - case NN_SURVEYOR: return(NN_RESPONDENT); break; - case NN_RESPONDENT: return(NN_SURVEYOR); break; - // Messages that need a response, but only from one peer: REQ/REP - case NN_REQ: return(NN_REP); break; - case NN_REP: return(NN_REQ); break; - // One-way messages to one peer: PUSH/PULL - case NN_PUSH: return(NN_PULL); break; - case NN_PULL: return(NN_PUSH); break; - // One-way messages to all: PUB/SUB - case NN_PUB: return(NN_SUB); break; - case NN_SUB: return(NN_PUB); break; - case NN_BUS: return(NN_BUS); break; - case NN_PAIR: return(NN_PAIR); break; - } - return(-1); -} - -int32_t nn_portoffset(int32_t type) -{ - int32_t i; - for (i=0; i<(int32_t)(sizeof(nn_typelist)/sizeof(*nn_typelist)); i++) - if ( nn_typelist[i] == type ) - return(i + 2); - return(-1); -} - -int32_t nn_socket_status(int32_t sock,int32_t timeoutmillis) -{ - struct nn_pollfd pfd; - int32_t rc; - pfd.fd = sock; - pfd.events = NN_POLLIN | NN_POLLOUT; - if ( (rc= nn_poll(&pfd,1,timeoutmillis)) == 0 ) - return(pfd.revents); - else return(-1); -} +/* struct endpoint find_epbits(struct relay_info *list,uint32_t ipbits,uint16_t port,int32_t type) { int32_t i; struct endpoint epbits; @@ -207,7 +94,7 @@ int32_t _lb_socket(struct supernet_info *myinfo,uint16_t port,uint16_t globalpor printf("error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); else if ( nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_RECONNECT_IVL_MAX,&maxmillis,sizeof(maxmillis)) < 0 ) fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); - timeout = SUPERNET_TIMEOUT; + timeout = SUPERNET_NETWORKTIMEOUT; if ( 1 && nn_setsockopt(lbsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)) < 0 ) printf("error setting NN_SOL_SOCKET NN_RCVTIMEO socket %s\n",nn_errstr()); timeout = 100; @@ -228,59 +115,15 @@ int32_t nn_lbsocket(struct supernet_info *myinfo,int32_t maxmillis,int32_t port, { char Cservers[32][MAX_SERVERNAME],Bservers[32][MAX_SERVERNAME],failsafes[4][MAX_SERVERNAME]; int32_t n,m,lbsock,numfailsafes = 0; + printf("redo lbsocket()\n"), exit(-1); //strcpy(failsafes[numfailsafes++],"5.9.56.103"); //strcpy(failsafes[numfailsafes++],"5.9.102.210"); - n = crackfoo_servers(Cservers,sizeof(Cservers)/sizeof(*Cservers),port); - m = badass_servers(Bservers,sizeof(Bservers)/sizeof(*Bservers),port); + // n = crackfoo_servers(Cservers,sizeof(Cservers)/sizeof(*Cservers),port); + // m = badass_servers(Bservers,sizeof(Bservers)/sizeof(*Bservers),port); lbsock = _lb_socket(myinfo,port,globalport,relaysport,maxmillis,Bservers,m,Cservers,n*0,failsafes,numfailsafes); return(lbsock); } -int32_t nn_settimeouts(int32_t sock,int32_t sendtimeout,int32_t recvtimeout) -{ - int32_t retrymillis,maxmillis; - if ( (maxmillis= SUPERNET_TIMEOUT) == 0 ) - maxmillis = 3000; - retrymillis = maxmillis/40; - if ( nn_setsockopt(sock,NN_SOL_SOCKET,NN_RECONNECT_IVL,&retrymillis,sizeof(retrymillis)) < 0 ) - fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); - else if ( nn_setsockopt(sock,NN_SOL_SOCKET,NN_RECONNECT_IVL_MAX,&maxmillis,sizeof(maxmillis)) < 0 ) - fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); - else if ( sendtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&sendtimeout,sizeof(sendtimeout)) < 0 ) - fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); - else if ( recvtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&recvtimeout,sizeof(recvtimeout)) < 0 ) - fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); - else return(0); - return(-1); -} - -int32_t nn_createsocket(struct supernet_info *myinfo,char *endpoint,int32_t bindflag,char *name,int32_t type,uint16_t port,int32_t sendtimeout,int32_t recvtimeout) -{ - int32_t sock; - if ( (sock= nn_socket(AF_SP,type)) < 0 ) - fprintf(stderr,"error getting socket %s\n",nn_errstr()); - if ( bindflag != 0 ) - { - if ( endpoint[0] == 0 ) - expand_epbits(endpoint,calc_epbits(myinfo->transport,0,port,type)); - if ( nn_bind(sock,endpoint) < 0 ) - fprintf(stderr,"error binding to relaypoint sock.%d type.%d to (%s) (%s) %s\n",sock,type,name,endpoint,nn_errstr()); - else fprintf(stderr,"BIND.(%s) <- %s\n",endpoint,name); - } - else if ( bindflag == 0 && endpoint[0] != 0 ) - { - if ( nn_connect(sock,endpoint) < 0 ) - fprintf(stderr,"error connecting to relaypoint sock.%d type.%d to (%s) (%s) %s\n",sock,type,name,endpoint,nn_errstr()); - else fprintf(stderr,"%s -> CONNECT.(%s)\n",name,endpoint); - } - if ( nn_settimeouts(sock,sendtimeout,recvtimeout) < 0 ) - { - fprintf(stderr,"nn_createsocket.(%s) %d\n",name,sock); - return(-1); - } - return(sock); -} - void add_standard_fields(char *request) { cJSON *json; uint64_t tag; @@ -402,7 +245,7 @@ void busdata_init(struct supernet_info *myinfo,int32_t sendtimeout,int32_t recvt myinfo->pfd[myinfo->numservers++].fd = myinfo->subclient, printf("numservers.%d\n",myinfo->numservers); nn_setsockopt(myinfo->subclient,NN_SUB,NN_SUB_SUBSCRIBE,"",0); } else printf("error creating subclient\n"); - myinfo->lbclient = nn_lbsocket(myinfo,SUPERNET_TIMEOUT,SUPERNET_PORT + LB_OFFSET,myinfo->port + PUBGLOBALS_OFFSET,myinfo->port + PUBRELAYS_OFFSET); + myinfo->lbclient = nn_lbsocket(myinfo,SUPERNET_NETWORKTIMEOUT,SUPERNET_PORT + LB_OFFSET,myinfo->port + PUBGLOBALS_OFFSET,myinfo->port + PUBRELAYS_OFFSET); printf("LBclient.%d port.%d\n",myinfo->lbclient,SUPERNET_PORT + LB_OFFSET); sprintf(endpoint,"%s://%s:%u",myinfo->transport,myinfo->ipaddr,myinfo->serviceport); if ( (myinfo->servicesock= nn_createsocket(myinfo,endpoint,1,"NN_REP",NN_REP,myinfo->serviceport,sendtimeout,recvtimeout)) >= 0 ) @@ -412,19 +255,13 @@ void busdata_init(struct supernet_info *myinfo,int32_t sendtimeout,int32_t recvt myinfo->pfd[i].events = NN_POLLIN | NN_POLLOUT; printf("myinfo->iamrelay %d, numservers.%d ipaddr.(%s://%s) port.%d serviceport.%d\n",myinfo->iamrelay,myinfo->numservers,myinfo->transport,myinfo->ipaddr,myinfo->port,myinfo->serviceport); } -#endif - -char *SuperNET_JSON(struct supernet_info *myinfo,char *jsonstr) -{ - return(clonestr("{\"error\":\"SuperNET is just a stub for now\"}")); -} void SuperNET_init(struct supernet_info *myinfo,char *jsonstr) { char *str; if ( jsonstr != 0 && (str= SuperNET_JSON(myinfo,jsonstr)) != 0 ) free(str); - //busdata_init(myinfo,10,1,0); - //init_SUPERNET_pullsock(myinfo,10,10); -} + busdata_init(myinfo,10,1,0); + init_SUPERNET_pullsock(myinfo,10,10); +}*/ diff --git a/SuperNET/SuperNET.h b/SuperNET/SuperNET.h index e660cbe72..c9e7efb55 100644 --- a/SuperNET/SuperNET.h +++ b/SuperNET/SuperNET.h @@ -21,20 +21,18 @@ #include "../includes/nanomsg/nn.h" #define SUPERNET_PORT 7774 -#define SUPERNET_TIMEOUT 10000 -#define SUPERNET_MAXPEERS 128 +#define SUPERNET_NETWORKTIMEOUT 10000 +#define SUPERNET_POLLTIMEOUT 1 +#define SUPERNET_APIUSLEEP (SUPERNET_POLLTIMEOUT * 10000) +#define SUPERNET_MAXAGENTS 64 #define LB_OFFSET 1 #define PUBGLOBALS_OFFSET 2 #define PUBRELAYS_OFFSET 3 -#define SUPERNET_APIENDPOINT "tcp://127.0.0.1:7776" #define NXT_TOKEN_LEN 160 #define nn_errstr() nn_strerror(nn_errno()) -#define CONNECTION_NUMBITS 10 -struct endpoint { uint64_t ipbits:32,port:16,transport:2,nn:4,directind:CONNECTION_NUMBITS; }; - #define MAX_SERVERNAME 128 struct relayargs { @@ -42,16 +40,41 @@ struct relayargs int32_t sock,type,bindflag,sendtimeout,recvtimeout; }; +#define CONNECTION_NUMBITS 10 +struct endpoint { queue_t nnrecvQ; int32_t nnsock,nnind; uint64_t ipbits:32,port:16,transport:2,nn:4,directind:CONNECTION_NUMBITS; }; + struct relay_info { int32_t sock,num,mytype,desttype; struct endpoint connections[1 << CONNECTION_NUMBITS]; }; struct direct_connection { char handler[16]; struct endpoint epbits; int32_t sock; }; +struct supernet_msghdr { uint8_t type,serlen[3]; char command[16]; uint8_t hdrdata[44]; uint8_t data[]; }; + +struct supernet_agent +{ + struct queueitem DL; queue_t recvQ; uint64_t totalrecv,totalsent; + int32_t (*recvfunc)(void *myinfo,struct supernet_agent *,struct supernet_msghdr *msg,uint8_t *data,int32_t datalen); + cJSON *networks; + char name[9],ipaddr[64],reppoint[64],pubpoint[64]; int32_t reqsock,repsock,pubsock,subsock; + uint32_t ipbits,dead; int32_t num,sock; uint16_t port,pubport,repport; +}; + struct supernet_info { char ipaddr[64],transport[8]; int32_t APISLEEP; int32_t iamrelay; uint64_t my64bits; uint64_t ipbits; - int32_t Debuglevel,readyflag,dead; + int32_t Debuglevel,readyflag,dead,POLLTIMEOUT; int32_t pullsock,subclient,lbclient,lbserver,servicesock,pubglobal,pubrelays,numservers; - uint16_t port,serviceport,portp2p; - struct nn_pollfd pfd[16]; struct relay_info active; + + uint16_t port,serviceport,acceptport; + struct nn_pollfd pfd[SUPERNET_MAXAGENTS]; struct relay_info active; + struct supernet_agent agents[SUPERNET_MAXAGENTS]; queue_t acceptQ; int32_t numagents; +}; + + +struct supernet_endpoint +{ + char name[64]; struct endpoint ep; + int32_t (*nnrecvfunc)(struct supernet_info *,struct supernet_endpoint *,int32_t ind,uint8_t *msg,int32_t nnlen); + queue_t nnrecvQ; + int32_t nnsock,num; struct endpoint eps[]; }; void expand_epbits(char *endpoint,struct endpoint epbits); diff --git a/SuperNET/main.c b/SuperNET/main.c index d152bb9f1..2d13dea5b 100644 --- a/SuperNET/main.c +++ b/SuperNET/main.c @@ -23,52 +23,291 @@ #include "../pnacl_main.h" #include "SuperNET.h" +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0x4000 // Do not generate SIGPIPE +#endif + // ALL globals must be here! -int32_t PULLsock; - - -int32_t badass_servers(char servers[][MAX_SERVERNAME],int32_t max,int32_t port) -{ - int32_t n = 0; - strcpy(servers[n++],"89.248.160.237"); - strcpy(servers[n++],"89.248.160.238"); - strcpy(servers[n++],"89.248.160.239"); - strcpy(servers[n++],"89.248.160.240"); - strcpy(servers[n++],"89.248.160.241"); - strcpy(servers[n++],"89.248.160.242"); - //strcpy(servers[n++],"89.248.160.243"); - //strcpy(servers[n++],"89.248.160.244"); - //strcpy(servers[n++],"89.248.160.245"); - return(n); + +int32_t nn_typelist[] = { NN_REP, NN_REQ, NN_RESPONDENT, NN_SURVEYOR, NN_PUB, NN_SUB, NN_PULL, NN_PUSH, NN_BUS, NN_PAIR }; +char *nn_transports[] = { "tcp", "ws", "ipc", "inproc", "tcpmux", "", "", "" }; + +void expand_epbits(char *endpoint,struct endpoint epbits) +{ + char ipaddr[64]; + if ( epbits.ipbits != 0 ) + expand_ipbits(ipaddr,epbits.ipbits); + else strcpy(ipaddr,"*"); + sprintf(endpoint,"%s://%s:%d",nn_transports[epbits.transport],ipaddr,epbits.port); } -int32_t crackfoo_servers(char servers[][MAX_SERVERNAME],int32_t max,int32_t port) +struct endpoint calc_epbits(char *transport,uint32_t ipbits,uint16_t port,int32_t type) { - int32_t n = 0; - /*strcpy(servers[n++],"192.99.151.160"); - strcpy(servers[n++],"167.114.96.223"); - strcpy(servers[n++],"167.114.113.197"); - strcpy(servers[n++],"5.9.105.170"); - strcpy(servers[n++],"136.243.5.70"); - strcpy(servers[n++],"5.9.155.145");*/ - if ( 1 ) + int32_t i; struct endpoint epbits; + memset(&epbits,0,sizeof(epbits)); + for (i=0; i<(int32_t)(sizeof(nn_transports)/sizeof(*nn_transports)); i++) + if ( strcmp(transport,nn_transports[i]) == 0 ) + { + epbits.ipbits = ipbits; + epbits.port = port; + epbits.transport = i; + epbits.nn = type; + break; + } + return(epbits); +} + +int32_t ismyaddress(struct supernet_info *myinfo,char *server) +{ + uint32_t ipbits; int32_t i,tlen; char str[64]; + for (i=0; iipaddr) == 0 || myinfo->ipbits == ipbits ) + { + printf("(%s) MATCHES me (%s)\n",server,myinfo->ipaddr); + return(1); + } + } + else if ( myinfo->my64bits == ipbits ) + return(1); + //printf("(%s) is not me (%s)\n",server,myipaddr); + return(0); +} + +char *nn_typestr(int32_t type) +{ + switch ( type ) + { + // Messages that need a response from the set of peers: SURVEY + case NN_SURVEYOR: return("NN_SURVEYOR"); break; + case NN_RESPONDENT: return("NN_RESPONDENT"); break; + // Messages that need a response, but only from one peer: REQ/REP + case NN_REQ: return("NN_REQ"); break; + case NN_REP: return("NN_REP"); break; + // One-way messages to one peer: PUSH/PULL + case NN_PUSH: return("NN_PUSH"); break; + case NN_PULL: return("NN_PULL"); break; + // One-way messages to all: PUB/SUB + case NN_PUB: return("NN_PUB"); break; + case NN_SUB: return("NN_SUB"); break; + case NN_BUS: return("NN_BUS"); break; + case NN_PAIR: return("NN_PAIR"); break; + } + return("NN_ERROR"); +} + +int32_t nn_oppotype(int32_t type) +{ + switch ( type ) + { + // Messages that need a response from the set of peers: SURVEY + case NN_SURVEYOR: return(NN_RESPONDENT); break; + case NN_RESPONDENT: return(NN_SURVEYOR); break; + // Messages that need a response, but only from one peer: REQ/REP + case NN_REQ: return(NN_REP); break; + case NN_REP: return(NN_REQ); break; + // One-way messages to one peer: PUSH/PULL + case NN_PUSH: return(NN_PULL); break; + case NN_PULL: return(NN_PUSH); break; + // One-way messages to all: PUB/SUB + case NN_PUB: return(NN_SUB); break; + case NN_SUB: return(NN_PUB); break; + case NN_BUS: return(NN_BUS); break; + case NN_PAIR: return(NN_PAIR); break; + } + return(-1); +} + +int32_t nn_portoffset(int32_t type) +{ + int32_t i; + for (i=0; i<(int32_t)(sizeof(nn_typelist)/sizeof(*nn_typelist)); i++) + if ( nn_typelist[i] == type ) + return(i + 2); + return(-1); +} + +int32_t nn_socket_status(int32_t nnsock,int32_t timeoutmillis) +{ + struct nn_pollfd pfd; + int32_t rc; + pfd.fd = nnsock; + pfd.events = NN_POLLIN | NN_POLLOUT; + if ( (rc= nn_poll(&pfd,1,timeoutmillis)) == 0 ) + return(pfd.revents); + else return(-1); +} + +int32_t SuperNET_msglen(struct supernet_msghdr *msg) +{ + return(msg->serlen[0] + ((int32_t)msg->serlen[1] << 8) + ((int32_t)msg->serlen[2] << 16)); +} + +int32_t SuperNET_msgvalidate(struct supernet_msghdr *msg) +{ + int32_t msglen = 0; + msglen = SuperNET_msglen(msg); + return(msglen); +} + +char *SuperNET_JSON(struct supernet_info *myinfo,char *jsonstr) +{ + return(clonestr("{\"error\":\"SuperNET is just a stub for now\"}")); +} + +int32_t nn_settimeouts(int32_t sock,int32_t sendtimeout,int32_t recvtimeout) +{ + int32_t retrymillis,maxmillis; + if ( (maxmillis= SUPERNET_NETWORKTIMEOUT) == 0 ) + maxmillis = 3000; + retrymillis = maxmillis/40; + if ( nn_setsockopt(sock,NN_SOL_SOCKET,NN_RECONNECT_IVL,&retrymillis,sizeof(retrymillis)) < 0 ) + fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); + else if ( nn_setsockopt(sock,NN_SOL_SOCKET,NN_RECONNECT_IVL_MAX,&maxmillis,sizeof(maxmillis)) < 0 ) + fprintf(stderr,"error setting NN_REQ NN_RECONNECT_IVL_MAX socket %s\n",nn_errstr()); + else if ( sendtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&sendtimeout,sizeof(sendtimeout)) < 0 ) + fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); + else if ( recvtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&recvtimeout,sizeof(recvtimeout)) < 0 ) + fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); + else return(0); + return(-1); +} + +int32_t nn_createsocket(struct supernet_info *myinfo,char *endpoint,int32_t bindflag,char *name,int32_t type,uint16_t port,int32_t sendtimeout,int32_t recvtimeout) +{ + int32_t sock; + if ( (sock= nn_socket(AF_SP,type)) < 0 ) + fprintf(stderr,"error getting socket %s\n",nn_errstr()); + if ( bindflag != 0 ) + { + if ( endpoint[0] == 0 ) + expand_epbits(endpoint,calc_epbits(myinfo->transport,0,port,type)); + if ( nn_bind(sock,endpoint) < 0 ) + fprintf(stderr,"error binding to relaypoint sock.%d type.%d to (%s) (%s) %s\n",sock,type,name,endpoint,nn_errstr()); + else fprintf(stderr,"BIND.(%s) <- %s\n",endpoint,name); + } + else if ( bindflag == 0 && endpoint != 0 && endpoint[0] != 0 ) + { + if ( nn_connect(sock,endpoint) < 0 ) + fprintf(stderr,"error connecting to relaypoint sock.%d type.%d to (%s) (%s) %s\n",sock,type,name,endpoint,nn_errstr()); + else fprintf(stderr,"%s -> CONNECT.(%s)\n",name,endpoint); + } + if ( nn_settimeouts(sock,sendtimeout,recvtimeout) < 0 ) + { + fprintf(stderr,"nn_createsocket.(%s) %d\n",name,sock); + return(-1); + } + return(sock); +} + +bits256 SuperNET_OPRETURN(struct supernet_info *myinfo,char *symbol,double fee,uint8_t *buf,int32_t len) +{ + bits256 txid; + return(txid); +} + +/*int32_t SuperNET_OPRETURN(uint8_t *data,char *announce) +{ + static char *protocols[][2] = { {"pangea","GEA"}, {"peggy","PAX"} }; + int32_t i; + for (i=0; iipbits),&myinfo->ipbits); + for (i=0; i<7; i++) + if ( (data[len+i]= announce[i]) == 0 ) + break; + len = 13; + if ( (pubkeystr= jstr(network,"pubkey")) == 0 || strlen(pubkeystr) != sizeof(bits256)*2 ) + pubkeystr = GENESIS_PUBKEYSTR; + decode_hex(pubkey.bytes,sizeof(pubkey),pubkeystr); + len += iguana_rwbignum(1,&data[len],sizeof(pubkey),pubkey.bytes); // 45 bytes + if ( (sigstr= jstr(network,"sig")) != 0 && strlen(sigstr) == sizeof(bits256)*2 ) + { + sigstr = GENESIS_PUBKEYSTR; + len += iguana_rwbignum(1,&data[len],sizeof(sig),sig.bytes); // 77 bytes + } + decode_hex(netmagic,4,"e4c2d8e6"); + iguana_sethdr((struct iguana_msghdr *)buf,netmagic,"SuperNET",data,len); + return(SuperNET_OPRETURN(myinfo,"BTCD",.001,buf,len)); + } + printf("invalid SuperNET OPRETURN protocol.(%s)\n",announce!=0?announce:""); + return(zero); +} + +void Supernet_networkadd(struct supernet_info *myinfo,struct supernet_agent *agent,cJSON *network) +{ + int32_t sendtimeout=0,recvtimeout=0; + agent->pubpoint[0] = agent->reppoint[0] = 0; + if ( (agent->pubport= juint(network,"pubport")) > 1000 ) + { + agent->pubsock = nn_createsocket(myinfo,agent->pubpoint,1,"NN_PUB",NN_PUB,agent->pubport,sendtimeout,recvtimeout); + SuperNET_agentannounce(myinfo,agent,network); + } + else agent->pubport = -1; + if ( (agent->repport= juint(network,"repport")) > 1000 ) + agent->repsock = nn_createsocket(myinfo,agent->reppoint,1,"NN_REP",NN_REP,agent->repport,sendtimeout,recvtimeout); + else agent->repport = -1; + agent->subsock = nn_createsocket(myinfo,0,0,"NN_SUB",NN_SUB,0,sendtimeout,recvtimeout); + nn_setsockopt(agent->subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + agent->reqsock = nn_createsocket(myinfo,0,0,"NN_REQ",NN_REQ,0,sendtimeout,recvtimeout); +} + +int32_t SuperNET_agentcommand(struct supernet_info *myinfo,struct supernet_agent *agent,struct supernet_msghdr *H,uint8_t *buf,int32_t buflen) +{ + char *name; cJSON *json; int32_t i; + if ( strcmp(H->command,"register") == 0 ) + { + if ( (json= cJSON_Parse((char *)buf)) != 0 ) + { + if ( (name= jstr(json,"name")) != 0 ) + { + memset(agent->name,0,sizeof(agent->name)); + strncpy(agent->name,name,sizeof(agent->name)-1); + if ( (agent->networks= jarray(&agent->num,json,"networks")) != 0 ) + { + for (i=0; inum; i++) + Supernet_networkadd(myinfo,agent,jitem(agent->networks,i)); + } + } else free_json(json); + } } - return(n); + return(0); } -int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) +int32_t SuperNET_socket(int32_t bindflag,char *hostname,uint16_t port) { int32_t opt,sock,result; uint32_t ipbits; char ipaddr[64]; struct timeval timeout; struct sockaddr_in saddr; socklen_t addrlen; @@ -125,42 +364,6 @@ int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) return(sock); } -/*void iguana_parsebuf(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_msghdr *H,uint8_t *buf,int32_t len) -{ - struct iguana_msghdr checkH; - memset(&checkH,0,sizeof(checkH)); - iguana_sethdr(&checkH,coin->chain->netmagic,H->command,buf,len); - if ( memcmp(&checkH,H,sizeof(checkH)) == 0 ) - { - //if ( strcmp(addr->ipaddr,"127.0.0.1") == 0 ) - //printf("%s parse.(%s) len.%d\n",addr->ipaddr,H.command,len); - //printf("addr->dead.%u\n",addr->dead); - if ( strcmp(H->command,"block") == 0 || strcmp(H->command,"tx") == 0 ) - { - if ( addr->RAWMEM.ptr == 0 ) - iguana_meminit(&addr->RAWMEM,addr->ipaddr,0,IGUANA_MAXPACKETSIZE,0); - if ( addr->TXDATA.ptr == 0 ) - iguana_meminit(&addr->TXDATA,"txdata",0,IGUANA_MAXPACKETSIZE,0); - if ( addr->HASHMEM.ptr == 0 ) - iguana_meminit(&addr->HASHMEM,"HASHPTRS",0,256,0);//IGUANA_MAXPACKETSIZE*16,0); - //printf("Init %s memory %p %p %p\n",addr->ipaddr,addr->RAWMEM.ptr,addr->TXDATA.ptr,addr->HASHMEM.ptr); - } - if ( iguana_parser(coin,addr,&addr->RAWMEM,&addr->TXDATA,&addr->HASHMEM,H,buf,len) < 0 || addr->dead != 0 ) - { - printf("%p addr->dead.%d or parser break at %u\n",&addr->dead,addr->dead,(uint32_t)time(NULL)); - addr->dead = (uint32_t)time(NULL); - } - else - { - addr->numpackets++; - addr->totalrecv += len; - coin->totalrecv += len, coin->totalpackets++; - //printf("next iter.(%s) numreferrals.%d numpings.%d\n",addr->ipaddr,addr->numreferrals,addr->numpings); - } - } else printf("header error from %s\n",addr->ipaddr); -}*/ - - int32_t SuperNET_recv(int32_t sock,uint8_t *recvbuf,int32_t len) { int32_t recvlen,remains = len; @@ -187,101 +390,206 @@ int32_t SuperNET_recv(int32_t sock,uint8_t *recvbuf,int32_t len) return(len); } -int32_t SuperNET_recvmsg(char *ipaddr,int32_t sock,uint8_t *_buf,int32_t maxlen) +int32_t SuperNET_send(struct supernet_info *myinfo,struct supernet_agent *agent,uint8_t *serialized,int32_t len) +{ + int32_t numsent,remains,sock; + if ( agent == 0 ) + return(-1); + if ( (sock= agent->sock) < 0 || agent->dead != 0 ) + { + return(-1); + } + remains = len; + while ( remains > 0 ) + { + if ( (numsent= (int32_t)send(sock,serialized,remains,MSG_NOSIGNAL)) < 0 ) + { + printf("send errno.%d %s\n",errno,strerror(errno)); + if ( errno != EAGAIN && errno != EWOULDBLOCK ) + { + printf("bad errno.%d %s zombify.%p\n",errno,strerror(errno),agent->name); + agent->dead = (uint32_t)time(NULL); + return(-errno); + } //else usleep(*sleeptimep), *sleeptimep *= 1.1; + } + else if ( remains > 0 ) + { + remains -= numsent; + serialized += numsent; + if ( remains > 0 ) + printf("SuperNET sent.%d remains.%d of len.%d\n",numsent,remains,len); + } + } + agent->totalsent += len; + //printf(" sent.%d bytes to %s\n",len,addr->ipaddr);// getchar(); + return(len); +} + +int32_t SuperNET_msgrecv(struct supernet_info *myinfo,struct supernet_agent *agent,uint8_t *_buf,int32_t maxlen) { - int32_t len,recvlen; void *buf = _buf; struct iguana_msghdr H; - printf("got.(%s) from %s | sock.%d\n",H.command,ipaddr,sock); + int32_t len,recvlen; void *buf = _buf; struct supernet_msghdr H; + printf("got.(%s) from %s | sock.%d\n",H.command,agent->ipaddr,agent->sock); memset(&H,0,sizeof(H)); - if ( (recvlen= (int32_t)SuperNET_recv(sock,(uint8_t *)&H,sizeof(H))) == sizeof(H) ) + if ( (recvlen= (int32_t)SuperNET_recv(agent->sock,(uint8_t *)&H,sizeof(H))) == sizeof(H) ) { - //printf("%p got.(%s) recvlen.%d from %s | usock.%d ready.%u dead.%u\n",addr,H.command,recvlen,addr->ipaddr,addr->usock,addr->ready,addr->dead); - if ( (len= iguana_validatehdr(&H)) >= 0 ) + agent->totalrecv += recvlen; + if ( (len= SuperNET_msgvalidate(&H)) >= 0 ) { + recvlen = 0; if ( len > 0 ) { - if ( len > IGUANA_MAXPACKETSIZE ) - { - printf("buffer %d too small for %d\n",IGUANA_MAXPACKETSIZE,len); - return(-1);; - } if ( len > maxlen ) buf = calloc(1,len); - if ( (recvlen= SuperNET_recv(sock,buf,len)) < 0 ) + if ( (recvlen= SuperNET_recv(agent->sock,buf,len)) < 0 ) { printf("recv error on (%s) len.%d errno.%d (%s)\n",H.command,len,-recvlen,strerror(-recvlen)); if ( buf != _buf ) free(buf); - //addr->dead = (uint32_t)time(NULL); + agent->dead = (uint32_t)time(NULL); return(recvlen); - } + } else agent->totalrecv += recvlen; } - //iguana_parsebuf(coin,addr,&H,buf,len); + printf("PROCESS.%c NNRECV(%s) recvlen.%d\n",H.type,H.command,recvlen); + if ( H.type == 'C' ) + SuperNET_agentcommand(myinfo,agent,&H,buf,recvlen); + else if ( agent->recvfunc != 0 ) + (*agent->recvfunc)(myinfo,agent,&H,buf,recvlen); if ( buf != _buf ) free(buf); return(recvlen); } - printf("invalid header received from (%s)\n",ipaddr); + printf("invalid header received from (%s)\n",agent->ipaddr); } - printf("%s recv error on hdr errno.%d (%s)\n",ipaddr,-recvlen,strerror(-recvlen)); + printf("%s recv error on hdr errno.%d (%s)\n",agent->ipaddr,-recvlen,strerror(-recvlen)); return(-1); } -struct supernet_accept { struct queueitem DL; char ipaddr[64]; uint32_t ipbits; int32_t sock; uint16_t port; } Accepts[SUPERNET_MAXPEERS]; -queue_t AcceptQ; +int32_t SuperNET_msgsend(struct supernet_info *myinfo,struct supernet_agent *agent,struct supernet_msghdr *msg) +{ + return(SuperNET_send(myinfo,agent,(uint8_t *)msg,SuperNET_msglen(msg) + sizeof(*msg))); +} + +int32_t SuperNET_nnsend(struct supernet_info *myinfo,struct supernet_endpoint *ptr,int32_t ind,struct supernet_msghdr *msg) +{ + return(nn_send(ptr->eps[ind].nnsock,(uint8_t *)msg,SuperNET_msglen(msg) + sizeof(*msg),0)); +} + +struct supernet_msghdr *SuperNET_msgpending(struct supernet_info *myinfo,struct supernet_agent *agent) +{ + return(queue_dequeue(&agent->recvQ,0)); +} + +struct supernet_msghdr *SuperNET_nnpending(struct supernet_info *myinfo,struct supernet_endpoint *ptr,int32_t ind) +{ + return(queue_dequeue(&ptr->eps[ind].nnrecvQ,0)); +} + +int32_t SuperNET_nnrecv(struct supernet_info *myinfo,struct supernet_endpoint *ptr,int32_t ind) +{ + void *msg; int32_t nnlen; + if ( (nnlen= nn_recv(ptr->eps[ind].nnsock,&msg,NN_MSG,0)) > 0 ) + { + printf("PROCESS NNRECV(%s)\n",msg); + if ( ptr->nnrecvfunc != 0 ) + (*ptr->nnrecvfunc)(myinfo,ptr,ind,msg,nnlen); + nn_freemsg(msg); + } + return(nnlen); +} -int32_t Supernet_poll(uint8_t *buf,int32_t bufsize,struct supernet_accept *accepts,int32_t num,int32_t timeout) +int32_t Supernet_poll(struct supernet_info *myinfo,uint8_t *buf,int32_t bufsize,struct supernet_agent *agents,int32_t num,int32_t timeout) { - struct pollfd fds[SUPERNET_MAXPEERS]; int32_t i,j,n,r,nonz,flag; struct supernet_accept *ptr; + struct pollfd fds[SUPERNET_MAXAGENTS]; int32_t i,nonz,flag; struct supernet_msghdr *msg; struct supernet_agent *agent; if ( num == 0 ) return(0);; memset(fds,0,sizeof(fds)); flag = 0; - r = (rand() % num); - for (j=n=nonz=0; jsock >= 0 ) + if ( agent->sock >= 0 ) { - fds[i].fd = ptr->sock; + fds[i].fd = agent->sock; fds[i].events = (POLLIN | POLLOUT); nonz++; } } if ( nonz != 0 && poll(fds,num,timeout) > 0 ) { - for (j=0; jsock < 0 ) + agent = &agents[i]; + if ( agent->sock < 0 ) continue; - if ( (fds[i].revents & POLLIN) != 0 ) + if ( (fds[i].revents & POLLIN) != 0 && SuperNET_msgrecv(myinfo,agent,buf,bufsize) >= 0 ) + flag++; + if ( (fds[i].revents & POLLOUT) != 0 ) { - return(SuperNET_recvmsg(ptr->ipaddr,ptr->sock,buf,bufsize)); + if ( (msg= SuperNET_msgpending(myinfo,agent)) != 0 && SuperNET_msgsend(myinfo,agent,msg) > 0 ) + flag++; } - if ( (fds[i].revents & POLLOUT) != 0 ) + } + } + return(flag); +} + +int32_t Supernet_nnpoll(struct supernet_info *myinfo,uint8_t *buf,int32_t bufsize,struct supernet_endpoint **eps,int32_t num,int32_t timeout) +{ + struct nn_pollfd fds[1024]; int32_t i,j,n,k,r,starti,nonz,flag; struct supernet_msghdr *msg; struct supernet_endpoint *ptr; + if ( num == 0 ) + return(0); + memset(fds,0,sizeof(fds)); + flag = 0; + r = rand(); + for (j=k=nonz=n=0; jnum; k++,n++) + { + fds[n].fd = -1; + if ( ptr->eps[k].nnsock >= 0 ) { - //if ( iguana_pollsendQ(coin,addr) == 0 ) - // flag += iguana_poll(coin,addr); - //else flag++; + fds[n].fd = ptr->eps[k].nnsock; + fds[n].events = (POLLIN | POLLOUT); + nonz++; } } } - return(0); + if ( nonz != 0 && nn_poll(fds,num,timeout) > 0 ) + { + for (j=k=0; jnum; k++,n++) + { + if ( (fds[i].revents & POLLIN) != 0 && SuperNET_nnrecv(myinfo,ptr,n - starti) >= 0 ) + flag++; + if ( (fds[i].revents & POLLOUT) != 0 ) + { + if ( (msg= SuperNET_nnpending(myinfo,ptr,n - starti)) != 0 && SuperNET_nnsend(myinfo,ptr,n - starti,msg) > 0 ) + flag++; + } + } + } + } + return(flag); } void SuperNET_acceptloop(void *args) { - int32_t bindsock,sock; struct supernet_accept *ptr; struct supernet_info *myinfo = args; - socklen_t clilen; struct sockaddr_in cli_addr; char ipaddr[64]; uint32_t ipbits; - bindsock = iguana_socket(1,"127.0.0.1",myinfo->portp2p); - printf("iguana_bindloop 127.0.0.1:%d bind sock.%d\n",myinfo->portp2p,bindsock); + int32_t bindsock,sock; struct supernet_agent *agent; struct supernet_info *myinfo = args; + socklen_t clilen; uint16_t agentport; struct sockaddr_in cli_addr; char ipaddr[64]; uint32_t ipbits; + bindsock = SuperNET_socket(1,"127.0.0.1",myinfo->acceptport); + printf("SuperNET_acceptloop 127.0.0.1:%d bind sock.%d\n",myinfo->acceptport,bindsock); while ( bindsock >= 0 ) { clilen = sizeof(cli_addr); - printf("ACCEPT (%s:%d) on sock.%d\n","127.0.0.1",myinfo->portp2p,bindsock); + printf("ACCEPT (%s:%d) on sock.%d\n","127.0.0.1",myinfo->acceptport,bindsock); sock = accept(bindsock,(struct sockaddr *)&cli_addr,&clilen); if ( sock < 0 ) { @@ -289,14 +597,16 @@ void SuperNET_acceptloop(void *args) continue; } memcpy(&ipbits,&cli_addr.sin_addr.s_addr,sizeof(ipbits)); + agentport = cli_addr.sin_port; expand_ipbits(ipaddr,ipbits); - printf("NEWSOCK.%d for %x (%s)\n",sock,ipbits,ipaddr); - ptr = calloc(1,sizeof(*ptr)); - strcpy(ptr->ipaddr,ipaddr); - ptr->ipbits = ipbits; - ptr->sock = sock; - ptr->port = myinfo->portp2p; - queue_enqueue("acceptQ",&AcceptQ,&ptr->DL,0); + printf("NEWSOCK.%d for %x (%s:%u)\n",sock,ipbits,ipaddr,agentport); + agent = calloc(1,sizeof(*agent)); + strcpy(agent->ipaddr,ipaddr); + sprintf(agent->name,"%s:%d",ipaddr,agentport); + agent->ipbits = ipbits; + agent->sock = sock; + agent->port = myinfo->acceptport; + queue_enqueue("acceptQ",&myinfo->acceptQ,&agent->DL,0); } } @@ -305,7 +615,7 @@ int32_t SuperNET_acceptport(struct supernet_info *myinfo,uint16_t port) struct supernet_info *ptr; ptr = calloc(1,sizeof(*myinfo)); *ptr = *myinfo; - ptr->portp2p = port; + ptr->acceptport = port; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)SuperNET_acceptloop,(void *)ptr) != 0 ) { printf("error launching accept thread for port.%u\n",port); @@ -314,20 +624,42 @@ int32_t SuperNET_acceptport(struct supernet_info *myinfo,uint16_t port) return(0); } +void SuperNET_loop(struct supernet_info *myinfo) +{ + struct supernet_agent *ptr; char *buf; int32_t bufsize = 65536 * 32; + buf = calloc(1,bufsize); + while ( myinfo->dead == 0 ) + { + if ( (ptr= queue_dequeue(&myinfo->acceptQ,0)) != 0 ) + { + if ( myinfo->numagents < sizeof(myinfo->agents)/sizeof(*myinfo->agents)-1 ) + { + myinfo->agents[myinfo->numagents++] = *ptr; + free(ptr); + } + printf("SuperNET.[%d] got new socket %d for %s:%d\n",myinfo->numagents,ptr->sock,ptr->ipaddr,ptr->port); + } + else if ( Supernet_poll(myinfo,(uint8_t *)buf,bufsize,myinfo->agents,myinfo->numagents,myinfo->POLLTIMEOUT) <= 0 ) + usleep(10000); + } + free(buf); +} + void SuperNET_main(void *arg) { - struct supernet_info MYINFO; struct supernet_accept *ptr; char buf[8192]; - cJSON *json,*array; uint16_t port; int32_t i,n = 0; + struct supernet_info MYINFO; cJSON *json,*array; uint16_t port; int32_t i,n = 0; memset(&MYINFO,0,sizeof(MYINFO)); - if ( 0 ) + if ( 1 ) { strcpy(MYINFO.transport,"tcp"); strcpy(MYINFO.ipaddr,"127.0.0.1"); - MYINFO.port = SUPERNET_PORT; MYINFO.serviceport = SUPERNET_PORT - 2; - SuperNET_init(&MYINFO,arg); + MYINFO.acceptport = SUPERNET_PORT; MYINFO.serviceport = SUPERNET_PORT - 2; + // SuperNET_init(&MYINFO,arg); parse supernet.conf + if ( MYINFO.POLLTIMEOUT == 0 ) + MYINFO.POLLTIMEOUT = SUPERNET_POLLTIMEOUT; } if ( arg == 0 || (json= cJSON_Parse(arg)) == 0 ) - SuperNET_acceptport(&MYINFO,14631); + SuperNET_acceptport(&MYINFO,MYINFO.port); else { if ( (array= jarray(&n,json,"accept")) != 0 ) @@ -339,22 +671,8 @@ void SuperNET_main(void *arg) free_json(json); } sleep(3); - printf("start SuperNET_loop\n"); - while ( MYINFO.dead == 0 ) - { - //if ( busdata_poll(&MYINFO) == 0 && MYINFO.APISLEEP > 0 ) - // usleep(MYINFO.APISLEEP * 1000); - if ( (ptr= queue_dequeue(&AcceptQ,0)) != 0 ) - { - if ( n < sizeof(Accepts)/sizeof(*Accepts)-1 ) - { - Accepts[n++] = *ptr; - free(ptr); - } - PostMessage("SuperNET.[%d] got new socket %d for %s:%d\n",n,ptr->sock,ptr->ipaddr,ptr->port); - } - if ( n > 0 ) - Supernet_poll(buf,sizeof(buf),Accepts,n,7); - sleep(1); - } + printf("start SuperNET_loop on port.%u\n",MYINFO.port); + for (i=0; iblockspace; char asmstr[512],txidstr[65],*txbytes = 0; + int32_t i,rwflag=1,len = 0; char asmstr[512],txidstr[65]; uint32_t numvins,numvouts; struct iguana_msgvin vin; struct iguana_msgvout vout; uint8_t space[8192]; len += iguana_rwnum(rwflag,&serialized[len],sizeof(tx->version),&tx->version); if ( coin->chain->hastimestamp != 0 ) @@ -350,15 +350,23 @@ char *iguana_txbytes(struct iguana_info *coin,bits256 *txidp,struct iguana_txid len += iguana_rwvarint32(rwflag,&serialized[len],&numvins); for (i=0; i maxlen ) + return(0); len += iguana_rwvarint32(rwflag,&serialized[len],&numvouts); for (i=0; i maxlen ) + return(0); len += iguana_rwnum(rwflag,&serialized[len],sizeof(tx->locktime),&tx->locktime); *txidp = bits256_doublesha256(txidstr,serialized,len); if ( memcmp(txidp,tx->txid.bytes,sizeof(*txidp)) != 0 ) @@ -366,9 +374,7 @@ char *iguana_txbytes(struct iguana_info *coin,bits256 *txidp,struct iguana_txid printf("error generating txbytes\n"); return(0); } - txbytes = mycalloc('x',1,len*2+1); - init_hexbytes_noT(txbytes,serialized,len*2+1); - return(txbytes); + return(len); } int32_t iguana_gentxarray(struct iguana_info *coin,struct OS_memspace *mem,struct iguana_txblock *txdata,int32_t *lenp,uint8_t *data,int32_t recvlen) diff --git a/iguana/iguana_pubkeys.c b/iguana/iguana_pubkeys.c index 46b89c7bb..e0a3a07b3 100755 --- a/iguana/iguana_pubkeys.c +++ b/iguana/iguana_pubkeys.c @@ -296,7 +296,7 @@ cstring *base58_decode(const char *s_in) goto out; break; } - BN_set_word(&bnChar,p1 - base58_chars); + BN_set_word(&bnChar,(int32_t)(p1 - base58_chars)); if (!BN_mul(&bn, &bn, &bn58, ctx)) goto out; if (!BN_add(&bn, &bn, &bnChar)) @@ -789,6 +789,55 @@ int32_t btc_pub65toaddr(char *coinaddr,uint8_t addrtype,char pubkey[131],uint8_t return(retval); } +/*char *iguana_txsign(struct iguana_info *coin,struct cointx_info *refT,int32_t redeemi,char *redeemscript,char sigs[][256],int32_t n,uint8_t privkey[32],int32_t privkeyind) +{ + char hexstr[16384]; bits256 hash2; uint8_t data[4096],sigbuf[512]; struct bp_key key; + struct cointx_info *T; int32_t i,len; void *sig = NULL; size_t siglen = 0; struct cointx_input *vin; + if ( bp_key_init(&key) != 0 && bp_key_secret_set(&key,privkey,32) != 0 ) + { + if ( (T= calloc(1,sizeof(*T))) == 0 ) + return(0); + *T = *refT; vin = &T->inputs[redeemi]; + for (i=0; inuminputs; i++) + strcpy(T->inputs[i].sigs,"00"); + strcpy(vin->sigs,redeemscript); + vin->sequence = (uint32_t)-1; + T->nlocktime = 0; + //disp_cointx(&T); + emit_cointx(&hash2,data,sizeof(data),T,oldtx_format,SIGHASH_ALL); + //printf("HASH2.(%llx)\n",(long long)hash2.txid); + if ( bp_sign(&key,hash2.bytes,sizeof(hash2),&sig,&siglen) != 0 ) + { + memcpy(sigbuf,sig,siglen); + sigbuf[siglen++] = SIGHASH_ALL; + init_hexbytes_noT(sigs[privkeyind],sigbuf,(int32_t)siglen); + strcpy(vin->sigs,"00"); + for (i=0; isigs + strlen(vin->sigs),"%02x%s",(int32_t)strlen(sigs[i])>>1,sigs[i]); + //printf("(%s).%ld ",sigs[i],strlen(sigs[i])); + } + } + len = (int32_t)(strlen(redeemscript)/2); + if ( len >= 0xfd ) + sprintf(&vin->sigs[strlen(vin->sigs)],"4d%02x%02x",len & 0xff,(len >> 8) & 0xff); + else sprintf(&vin->sigs[strlen(vin->sigs)],"4c%02x",len); + sprintf(&vin->sigs[strlen(vin->sigs)],"%s",redeemscript); + //printf("after A.(%s) othersig.(%s) siglen.%02lx -> (%s)\n",hexstr,othersig != 0 ? othersig : "",siglen,vin->sigs); + //printf("vinsigs.(%s) %ld\n",vin->sigs,strlen(vin->sigs)); + _emit_cointx(hexstr,sizeof(hexstr),T,oldtx_format); + //disp_cointx(&T); + free(T); + return(clonestr(hexstr)); + } + else printf("error signing\n"); + free(T); + } + return(0); +}*/ + #define IGUANA_SCRIPT_NULL 0 #define IGUANA_SCRIPT_76AC 1 #define IGUANA_SCRIPT_7688AC 2 diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index f03fc9833..be90dc28c 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -174,6 +174,7 @@ cJSON *iguana_vinjson(struct iguana_info *coin,struct iguana_msgvin *vin) } //struct iguana_txid { bits256 txid; uint32_t txidind,firstvout,firstvin,locktime,version,timestamp; uint16_t numvouts,numvins; } __attribute__((packed)); + //struct iguana_msgvin { bits256 prev_hash; uint8_t *script; uint32_t prev_vout,scriptlen,sequence; } __attribute__((packed)); //struct iguana_spend { uint32_t spendtxidind; int16_t prevout; uint16_t tbd:14,external:1,diffsequence:1; } __attribute__((packed)); @@ -248,7 +249,7 @@ cJSON *iguana_txjson(struct iguana_info *coin,struct iguana_txid *tx,int32_t hei char *ramchain_coinparser(struct iguana_info *coin,char *method,cJSON *json) { - char *hashstr,*txidstr,*coinaddr,*txbytes,rmd160str[41],str[65]; int32_t height,i,n,valid = 0; + char *hashstr,*txidstr,*coinaddr,*txbytes,rmd160str[41],str[65]; int32_t len,height,i,n,valid = 0; cJSON *addrs,*retjson,*retitem; uint8_t rmd160[20],addrtype; bits256 hash2,checktxid; memset(&hash2,0,sizeof(hash2)); struct iguana_txid *tx,T; struct iguana_block *block = 0; if ( coin == 0 && (coin= iguana_coinselect()) == 0 ) @@ -305,13 +306,15 @@ char *ramchain_coinparser(struct iguana_info *coin,char *method,cJSON *json) decode_hex(hash2.bytes,sizeof(hash2),txidstr); if ( (tx= iguana_txidfind(coin,&height,&T,hash2)) != 0 ) { - if ( (txbytes= iguana_txbytes(coin,&checktxid,tx,height)) != 0 ) + if ( (len= iguana_txbytes(coin,coin->blockspace,sizeof(coin->blockspace),&checktxid,tx,height,0,0)) > 0 ) { + txbytes = mycalloc('x',1,len*2+1); + init_hexbytes_noT(txbytes,coin->blockspace,len*2+1); retitem = cJSON_CreateObject(); jaddstr(retitem,"txid",bits256_str(str,hash2)); jaddnum(retitem,"height",height); jaddstr(retitem,"rawtx",txbytes); - myfree(txbytes,strlen(txbytes)+1); + myfree(txbytes,len*2+1); return(jprint(retitem,1)); } else return(clonestr("{\"error\":\"couldnt generate txbytes\"}")); } diff --git a/iguana/mingw32 b/iguana/mingw32 index ed5309db4..ed1e15c4f 100755 --- a/iguana/mingw32 +++ b/iguana/mingw32 @@ -3,7 +3,3 @@ MINGW := i586-mingw32 LIBS := ../win/libcrypto.a ../win/libssl.a ../win/libpthreadGC2.a -lws2_32 -lgdi32 include mingw - -all: - $(TOOL_DIR)/$(MINGW)-gcc -o ../agents/iguana.exe -D __MINGW $(SOURCES) $(LIBS) - $(TOOL_DIR)/$(MINGW)-strip --strip-all ../agents/iguana.exe diff --git a/iguana/mingw64 b/iguana/mingw64 index b5f314e5f..3937e43db 100755 --- a/iguana/mingw64 +++ b/iguana/mingw64 @@ -4,6 +4,3 @@ LIBS := ../win/libcrypto.a ../win/libs/libssl.a ../win/libpthreadGC2_64.a -lws2_ include mingw -all: - $(TOOL_DIR)/$(MINGW)-gcc -o ../agents/iguana.exe -D __MINGW $(SOURCES) $(LIBS) - $(TOOL_DIR)/$(MINGW)-strip --strip-all ../agents/iguana.exe diff --git a/win/pthreadGC2.dll b/win/pthreadGC2.dll new file mode 100644 index 0000000000000000000000000000000000000000..67b9289dfd9f6f1ad12c1d137f4e57ad1a54271c GIT binary patch literal 119888 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

PI35m#66 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 literal 0 HcmV?d00001 diff --git a/win/pthreadGC2_64.dll b/win/pthreadGC2_64.dll new file mode 100644 index 0000000000000000000000000000000000000000..841d4a21699017e835f330b3262e5b46e988a753 GIT binary patch literal 185976 zcmeFad3;pW`9D4ZB2ktbiUUCqV~rYIFmX);bpi?8XwWFAh+Etccf=dPiWoXG!tHfz zY}IO|EwPGFn;O;uw<3z7SjE=mUI!GlBA_zA_xm~L&fJ-V#c$isU%$MRx%cen zInQ>U=Q-z&8rK@?914ZH;Qw?w6q<`){zc^9o&VEBw+29^M_A1j&H`awh zm)^E_=#!@xoffL?6gp&&P-s)=pwe!gI)y{qQRp!IzgH;qL~r~Svyyo+|CQ%XYTSG+ z4B>@;#h4A+s4_asyh5Q;Nmg~GK;FAI`9w(s!|=gGNa9>KrTP-D~JOE0o6LgEw5C@u)e zw7cLp@D~X+whf-73Su|_fiAa4yK<4i7vFG$R0WJf6}kC-lP#g9w!xRF_5?kUzrj8y%E8?l=|;ea&($y4=Sdl&eznn8@+ZMmgfcmi%%N%(vo5 zq26z^y-G=;Q@w-Py<&IQKA-E3OW&cClm&>;P|3CdV zAuxJg2#ah+H}89t4j#M`VxOy`7?h8KjMXHMlhW4}mfo{QenZ<+R5mOSP_RkGQ23V(#h=$1}K zY%i3aw;yV_Gqyp1v91j5f(y^DId4gHTY)4sr!F&{E(caH*O^dM*~az`Ujr6VnP%VB zX7#ejvjtWq#;{;mL8z|s!&JBNtw=Ru=*b^QgS}oV&O$|0Ykt2n?G( zQEzXW&l0Bnc6wE`@RWgQlGBq(ovY@kW^bd#)H9~j!#x=7U-GdufCaVck@harPGg$A z+>Cx!WLAGQxwq-;!9G4`LV6XFZrq4&+(wQzS@;mD@DGo_(2vQ&d-anV>^*qPABJ-_7L7$WnDNzicq!zZX`feCYT8rFD(u%y`|7eP)3(aW zP5bW+_N8T!276iaMNZ+l`(lMQW0d7s5%)KrghKVUYrkXKTiw=1c403!Vt+(u(Qi9j z*T>gc*Vvnqg%_cD^qDptcHyvD2mP21dTDUbI!0|SG4=~3hNq)j3T`ZMhoj}_w*@uE zT}zvP;~tm-Ebl?SdkUV|iS=-%-;(dsX(lzlnEGWVv9lyvW8#~Q*iX=NCSxx&U@!N^ zBMt4<#XdA*r>p$R)ttqPr^%Gm%X8mJP4%+s(@@Ae5M?Vjdk0JPh`*Y!(j%Ai95 zNi8nPtg!$sBvbLNx1LD!F8ufz<}%5&V`U{6NjiM(Nu+Vp(RCf& z;PjXDuuC82}4tGBRz1ho5dlQ>Hf}~n( z+Fm-Gg5r>RLg;C}8YvPlz}QmjG2aPTpvU%M)$=g2gr>1Z!Wf{qx@@ebuqG2IQfh*h zu*y{c9w@!Gj0{p9%H?53G04@b0;ue9MLuAni%ayNeBkVX{yEyjRmGK?In8ESLCbWy zK2LGMv3GYGORCQR*<~JNRxhz0G^0yo#SX=I ztOL}F_4O`CF=M|L0Z4R8Q9-}W(T_WO)ktj(c6OfMnaj=&;G7STzJ?$p^|$PLN#f&} zig!KQkR_C)`?;>K5Q8)F6v%)j1>_f_WV*o?vDHhXy&WOAlH z=}q%lFhM|5BWzv}^G!XVz0BmW5&>{>Sh4=4Di|_nV79BR<2dw5xfm!aK>!2a zRWmAzL zA1{*Mg=NL^`)FASejDru%S!p~aM6v}x!}5HVk*i1J+O;ueF{SJsG)ylK4d25lyT!h z&Mv>nSeZ*EjXx95>jTeg{b$Gm#VL+gtCS?Rf|r6%2tPbtV=PGcSi&`NZEdZ!=<#p`~50pc|`* z7Y$%G@s$?&-f`-^T)&?x?|L~P1!XxLy&R5S4o5G?^rc+AzA?=E7YLN1nA3!gMmELR;89XUO95|_|IU>BlRRevh^#d86Rl_M7u5L%0D@vOT(?+&%DffIZ$epQ7Cw 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 literal 0 HcmV?d00001