Browse Source

Merge pull request #148 from jl777/dev

Dev
win-cross
jl777 8 years ago
committed by GitHub
parent
commit
5d21d2bdaf
  1. 2
      iguana/coins/Agenbtcd
  2. 2
      iguana/dPoW.h
  3. 67
      iguana/dpow/dpow_network.c
  4. 20
      iguana/dpow/dpow_rpc.c
  5. 13
      iguana/dpow/dpow_tx.c
  6. 2
      iguana/iguana777.h
  7. 24
      iguana/iguana_notary.c
  8. 41
      iguana/iguana_rpc.c
  9. 34
      iguana/main.c
  10. 2
      iguana/tests/Alistunspent
  11. 3
      iguana/tests/active_7776

2
iguana/coins/Agenbtcd

@ -0,0 +1,2 @@
#!/bin/bash
curl --url "http://127.0.0.1:7778" --data "{\"userpass\":\"username@password\",\"prefetchlag\":11,\"poll\":50,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"BTCD\",\"startpend\":512,\"endpend\":512,\"services\":129,\"maxpeers\":512,\"RELAY\":1,\"VALIDATE\":1,\"portp2p\":14631,\"rpc\":14632,\"minconfirms\":5}"

2
iguana/dPoW.h

@ -134,7 +134,7 @@ struct dpow_info
uint32_t SRCREALTIME,destupdated,srcconfirms,numdesttx,numsrctx,lastsplit,cancelratify;
int32_t lastheight,maxblocks,SRCHEIGHT,SHORTFLAG,ratifying;
struct pax_transaction *PAX;
portable_mutex_t mutex;
portable_mutex_t paxmutex,dexmutex;
uint32_t ipbits[64],numipbits;
struct dpow_block **blocks;
};

67
iguana/dpow/dpow_network.c

@ -210,7 +210,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i
char str[512]; uint32_t ipbits,*ptr; int32_t i,iter,n,retval = -1;
if ( myinfo->dpowsock >= 0 )
{
portable_mutex_lock(&myinfo->dpowmutex);
portable_mutex_lock(&myinfo->notarymutex);
ipbits = (uint32_t)calc_ipbits(ipaddr);
for (iter=0; iter<2; iter++)
{
@ -247,7 +247,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i
if ( dp == 0 )
break;
}
portable_mutex_unlock(&myinfo->dpowmutex);
portable_mutex_unlock(&myinfo->notarymutex);
}
return(retval);
}
@ -364,9 +364,9 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr
np->srcvout = bp->notaries[bp->myind].src.prev_vout;
np->destutxo = bp->notaries[bp->myind].dest.prev_hash;
np->destvout = bp->notaries[bp->myind].dest.prev_vout;
np->bestmask = bp->bestmask;
np->recvmask = bp->recvmask;
if ( (np->bestk= bp->bestk) >= 0 )
np->bestmask = bp->notaries[bp->myind].bestmask;
np->recvmask = bp->notaries[bp->myind].recvmask;
if ( (np->bestk= bp->notaries[bp->myind].bestk) >= 0 )
{
if ( (np->siglens[0]= bp->notaries[bp->myind].src.siglens[bp->bestk]) > 0 )
memcpy(np->sigs[0],bp->notaries[bp->myind].src.sigs[bp->bestk],np->siglens[0]);
@ -556,21 +556,19 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct
void dpow_bestconsensus(struct dpow_block *bp)
{
int8_t bestks[64]; int32_t counts[64],i,j,numcrcs=0,numdiff,besti,best,bestmatches = 0,matches = 0; uint64_t masks[64],matchesmask; uint32_t crcval=0; char srcaddr[64],destaddr[64];
int8_t bestks[64]; int32_t counts[64],i,j,numcrcs=0,numdiff,besti,best,bestmatches = 0,matches = 0; uint64_t masks[64],matchesmask,recvmask; uint32_t crcval=0; char srcaddr[64],destaddr[64];
memset(masks,0,sizeof(masks));
memset(bestks,0xff,sizeof(bestks));
memset(counts,0,sizeof(counts));
bp->recvmask = 0;
bp->bestmask = 0;
bp->bestk = -1;
recvmask = 0;
for (numdiff=i=0; i<bp->numnotaries; i++)
{
if ( bits256_nonz(bp->notaries[i].src.prev_hash) != 0 && bits256_nonz(bp->notaries[i].dest.prev_hash) != 0 )
bp->recvmask |= (1LL << i);
recvmask |= (1LL << i);
if ( bp->notaries[i].bestk < 0 || bp->notaries[i].bestmask == 0 )
continue;
if ( bp->require0 != 0 && (bp->notaries[i].bestmask & 1) == 0 )
continue;
//if ( bp->require0 != 0 && (bp->notaries[i].bestmask & 1) == 0 )
// continue;
for (j=0; j<numdiff; j++)
if ( bp->notaries[i].bestk == bestks[j] && bp->notaries[i].bestmask == masks[j] )
{
@ -596,12 +594,16 @@ void dpow_bestconsensus(struct dpow_block *bp)
besti = i;
}
}
if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (bp->recvmask & masks[besti]) == masks[besti] )
bp->bestmask = masks[besti], bp->bestk = bestks[besti];
if ( bp->bestmask == 0 || (time(NULL) / 180) != bp->lastepoch )
if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (recvmask & masks[besti]) == masks[besti] )
{
bp->bestmask = masks[besti];
bp->bestk = bestks[besti];
bp->recvmask = recvmask;
}
if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch )
{
bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk);
if ( (time(NULL) / 180) != bp->lastepoch )
if ( 0 && (time(NULL) / 180) != bp->lastepoch )
{
bp->lastepoch = (uint32_t)(time(NULL) / 180);
printf("epoch %u\n",bp->lastepoch % bp->numnotaries);
@ -621,13 +623,15 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru
bp->notaries[senderind].src.prev_vout = srcvout;
bp->notaries[senderind].dest.prev_hash = destutxo;
bp->notaries[senderind].dest.prev_vout = destvout;
bp->notaries[senderind].bestmask = bestmask;
bp->notaries[senderind].recvmask = recvmask;
if ( bestmask != 0 )
bp->notaries[senderind].bestmask = bestmask;
if ( recvmask != 0 )
bp->notaries[senderind].recvmask = recvmask;
if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 )
{
//fprintf(stderr,"{%d %x} ",senderind,paxwdcrc);
}
if ( (bp->notaries[senderind].bestk= bestk) >= 0 )
if ( bestk >= 0 && (bp->notaries[senderind].bestk= bestk) >= 0 )
{
if ( (bp->notaries[senderind].src.siglens[bestk]= siglens[0]) != 0 )
{
@ -647,10 +651,14 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru
dpow_bestconsensus(bp);
//bp->recvmask |= (1LL << senderind) | (1LL << bp->myind);
//bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk);
bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc;
bp->notaries[bp->myind].bestk = bp->bestk;
bp->notaries[bp->myind].bestmask = bp->bestmask;
bp->notaries[bp->myind].recvmask = bp->recvmask;
if ( bp->paxwdcrc != 0 )
bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc;
if ( bp->bestk >= 0 )
bp->notaries[bp->myind].bestk = bp->bestk;
if ( bp->bestmask != 0 )
bp->notaries[bp->myind].bestmask = bp->bestmask;
if ( bp->recvmask != 0 )
bp->notaries[bp->myind].recvmask = bp->recvmask;
if ( bp->bestk >= 0 )
{
for (i=0; i<bp->numnotaries; i++)
@ -668,7 +676,9 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru
paxbestmatches++;
}
}
} else printf("%d.(%x %llx) ",i,bp->notaries[i].paxwdcrc,(long long)bp->notaries[i].bestmask);
}
if ( bp->notaries[i].paxwdcrc != 0 )
printf("%d.(%x %d %llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask);
}
printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches);
if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs )
@ -705,6 +715,8 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d
}
else
{
if ( senderind <= 1 )
printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,bp->bestk,(long long)np->bestmask);
dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc);
}
//dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask);
@ -735,6 +747,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo
{
extralen = dpow_paxpending(extras,&paxwdcrc);
bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = paxwdcrc;
dpow_bestconsensus(bp);
dpow_nanoutxoset(&np->notarize,bp,0);
}
else
@ -758,9 +771,11 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo
np->version0 = DPOW_VERSION & 0xff;
np->version1 = (DPOW_VERSION >> 8) & 0xff;
memcpy(np->packet,data,datalen);
portable_mutex_lock(&myinfo->dpowmutex);
sentbytes = nn_send(myinfo->dpowsock,np,size,0);
portable_mutex_unlock(&myinfo->dpowmutex);
free(np);
//printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen);
printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,np->bestk,(long long)np->bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask);
}
void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits)
@ -810,6 +825,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo)
int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0;
if ( time(NULL) < myinfo->nanoinit+5 )
return;
portable_mutex_lock(&myinfo->dpowmutex);
while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 )
{
num++;
@ -860,6 +876,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo)
if ( size == 0 || n++ > 100 )
break;
}
portable_mutex_unlock(&myinfo->dpowmutex);
if ( 0 && n != 0 )
printf("nanoupdates.%d\n",n);
n = 0;

20
iguana/dpow/dpow_rpc.c

@ -617,7 +617,7 @@ cJSON *dpow_paxjson(struct pax_transaction *pax)
uint64_t dpow_paxtotal(struct dpow_info *dp)
{
struct pax_transaction *pax,*tmp; uint64_t total = 0;
pthread_mutex_lock(&dp->mutex);
pthread_mutex_lock(&dp->paxmutex);
/*if ( dp->PAX != 0 )
{
tmp = 0;
@ -635,25 +635,25 @@ uint64_t dpow_paxtotal(struct dpow_info *dp)
if ( pax->marked == 0 )
total += pax->komodoshis;
}
pthread_mutex_unlock(&dp->mutex);
pthread_mutex_unlock(&dp->paxmutex);
return(total);
}
struct pax_transaction *dpow_paxfind(struct dpow_info *dp,struct pax_transaction *space,bits256 txid,uint16_t vout)
{
struct pax_transaction *pax;
pthread_mutex_lock(&dp->mutex);
pthread_mutex_lock(&dp->paxmutex);
HASH_FIND(hh,dp->PAX,&txid,sizeof(txid),pax);
if ( pax != 0 )
memcpy(space,pax,sizeof(*pax));
pthread_mutex_unlock(&dp->mutex);
pthread_mutex_unlock(&dp->paxmutex);
return(pax);
}
struct pax_transaction *dpow_paxmark(struct dpow_info *dp,struct pax_transaction *space,bits256 txid,uint16_t vout,int32_t mark)
{
struct pax_transaction *pax;
pthread_mutex_lock(&dp->mutex);
pthread_mutex_lock(&dp->paxmutex);
HASH_FIND(hh,dp->PAX,&txid,sizeof(txid),pax);
if ( pax == 0 )
{
@ -670,14 +670,14 @@ struct pax_transaction *dpow_paxmark(struct dpow_info *dp,struct pax_transaction
printf(" paxmark.ht %d vout%d\n",mark,vout);
memcpy(space,pax,sizeof(*pax));
}
pthread_mutex_unlock(&dp->mutex);
pthread_mutex_unlock(&dp->paxmutex);
return(pax);
}
cJSON *dpow_withdraws_pending(struct dpow_info *dp)
{
struct pax_transaction *pax,*tmp; cJSON *retjson = cJSON_CreateArray();
pthread_mutex_lock(&dp->mutex);
pthread_mutex_lock(&dp->paxmutex);
/*if ( dp->PAX != 0 )
{
tmp = 0;
@ -695,14 +695,14 @@ cJSON *dpow_withdraws_pending(struct dpow_info *dp)
if ( pax->marked == 0 )
jaddi(retjson,dpow_paxjson(pax));
}
pthread_mutex_unlock(&dp->mutex);
pthread_mutex_unlock(&dp->paxmutex);
return(retjson);
}
void dpow_issuer_withdraw(struct dpow_info *dp,char *coinaddr,uint64_t fiatoshis,int32_t shortflag,char *symbol,uint64_t komodoshis,uint8_t *rmd160,bits256 txid,uint16_t vout,int32_t kmdheight,int32_t height) // assetchain context
{
struct pax_transaction *pax;
pthread_mutex_lock(&dp->mutex);
pthread_mutex_lock(&dp->paxmutex);
HASH_FIND(hh,dp->PAX,&txid,sizeof(txid),pax);
if ( pax == 0 )
{
@ -711,7 +711,7 @@ void dpow_issuer_withdraw(struct dpow_info *dp,char *coinaddr,uint64_t fiatoshis
pax->vout = vout;
HASH_ADD_KEYPTR(hh,dp->PAX,&pax->txid,sizeof(pax->txid),pax);
}
pthread_mutex_unlock(&dp->mutex);
pthread_mutex_unlock(&dp->paxmutex);
if ( coinaddr != 0 )
{
strcpy(pax->coinaddr,coinaddr);

13
iguana/dpow/dpow_tx.c

@ -101,21 +101,22 @@ uint64_t dpow_ratifybest(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp)
uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp)
{
int32_t m,j,k; uint64_t bestmask,mask = bp->require0;
int32_t m,j,k; uint64_t bestmask,mask = 0;//bp->require0;
bestmask = 0;
*lastkp = -1;
for (m=j=0; j<bp->numnotaries; j++)
{
k = (j + ((uint32_t)time(NULL) / 180)) % bp->numnotaries;
if ( bp->require0 != 0 && k == 0 )
continue;
//k = (j + ((uint32_t)time(NULL) / 180)) % bp->numnotaries;
k = (j + (bp->height/DPOW_CHECKPOINTFREQ)) % bp->numnotaries;
//if ( bp->require0 != 0 && k == 0 )
// continue;
if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 )
{
mask |= (1LL << k);
if ( ++m == bp->minsigs-bp->require0 )
if ( ++m == bp->minsigs )//-bp->require0 )
{
*lastkp = k;
bestmask = mask | bp->require0;
bestmask = mask;// | bp->require0;
//printf("m.%d == minsigs.%d (%d %llx)\n",m,bp->minsigs,k,(long long)bestmask);
}
}

2
iguana/iguana777.h

@ -110,7 +110,7 @@ struct supernet_info
void *PAXDATA;
struct liquidity_info linfos[64];
struct komodo_notaries NOTARY;
char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t dpowmutex;
char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex;
char dexseed_ipaddr[64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex;
// compatibility
bits256 pangea_category,instantdex_category;

24
iguana/iguana_notary.c

@ -297,12 +297,13 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey)
dp->maxblocks = 100000;
dp->blocks = calloc(dp->maxblocks,sizeof(*dp->blocks));
}
if ( myinfo->numdpows++ == 0 )
portable_mutex_init(&dp->mutex);
portable_mutex_init(&dp->paxmutex);
portable_mutex_init(&dp->dexmutex);
PAX_init();
//printf(">>>>>>>>>>>>>>> call paxpending\n");
//uint8_t buf[32768];
//dpow_paxpending(buf);
myinfo->numdpows++;
return(clonestr("{\"result\":\"success\"}"));
}
@ -376,6 +377,25 @@ STRING_ARG(dpow,active,maskhex)
{
uint8_t data[8],revdata[8]; int32_t i,len; uint64_t mask; cJSON *retjson,*array = cJSON_CreateArray();
//return(clonestr("{\"error\":\"dpow active is deprecated for now\"}"));
if ( 0 )
{
int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height);
char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies
"CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK",
"REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" };
uint8_t pubkeys[64][33]; char coinaddr[64]; int32_t i,j; double val = 0.01;
int32_t n = komodo_notaries("KMD",pubkeys,114000);
//#include "notaries.h"
for (i=0; i<sizeof(CURRENCIES)/sizeof(*CURRENCIES); i++)
{
for (j=0; j<n; j++)
{
//decode_hex(pubkeys[j],33,Notaries[j][1]);
bitcoin_address(coinaddr,60,pubkeys[j],33);
printf("./komodo-cli -ac_name=%s sendtoaddress %s %f\n",CURRENCIES[i],coinaddr,val);
}
}
}
if ( maskhex == 0 || maskhex[0] == 0 )
{
mask = myinfo->DPOWS[0].lastrecvmask;

41
iguana/iguana_rpc.c

@ -18,20 +18,30 @@
#include "iguana777.h"
//#include "SuperNET.h"
#define RPCARGS struct supernet_info *myinfo,uint16_t port,struct iguana_info *coin,cJSON *params[],int32_t n,cJSON *json,char *remoteaddr,cJSON *array
#define GLUEARGS cJSON *json,struct supernet_info *myinfo,uint16_t port,struct iguana_info *coin,char *remoteaddr,cJSON *params[]
#define RPCARGS struct supernet_info *myinfo,uint16_t port,struct iguana_info *coin,cJSON *params[],int32_t n,cJSON *json,char *remoteaddr,cJSON *array,char *userpass
#define GLUEARGS cJSON *json,struct supernet_info *myinfo,uint16_t port,struct iguana_info *coin,char *remoteaddr,cJSON *params[],char *userpass
#define CALLGLUE myinfo,port,coin,remoteaddr,params
#define CALLGLUE myinfo,port,coin,remoteaddr,params,userpass
char *sglue(GLUEARGS,char *agent,char *method)
{
char *retstr,*rpcretstr,*walletstr,checkstr[65],dcheckstr[65]; cJSON *retjson,*tmpjson,*result,*error,*wallet; int32_t i,j,len; int64_t val; double dval;
if ( json == 0 )
json = cJSON_CreateObject();
//printf("sglue.(%s)\n",jprint(json,0));
//printf("userpass.(%s)\n",userpass);
jaddstr(json,"agent",agent);
jaddstr(json,"method",method);
jaddstr(json,"coin",coin->symbol);
if ( userpass != 0 )
jaddstr(json,"userpass",userpass);
if ( coin != 0 && coin->FULLNODE >= 0 && coin->chain->userpass[0] != 0 )
{
if ( userpass == 0 || strcmp(userpass,coin->chain->userpass) != 0 )
{
printf("iguana authentication error {%s} (%s) != (%s)\n",jprint(json,0),userpass,coin->chain->userpass);
return(clonestr("{\"error\":\"authentication error\"}"));
}
}
if ( myinfo->expiration != 0 && time(NULL) > myinfo->expiration )
iguana_walletlock(myinfo,0);
if ( (retstr= SuperNET_JSON(myinfo,coin,json,remoteaddr,port)) != 0 )
@ -667,7 +677,7 @@ char *iguana_bitcoinrpc(struct supernet_info *myinfo,uint16_t port,struct iguana
for (i=0; i<sizeof(RPCcalls)/sizeof(*RPCcalls); i++)
{
if ( strcmp(RPCcalls[i].name,method) == 0 )
return((*RPCcalls[i].rpcfunc)(myinfo,port,coin,params,n,json,remoteaddr,array));
return((*RPCcalls[i].rpcfunc)(myinfo,port,coin,params,n,json,remoteaddr,array,jstr(json,"userpass")));
}
return(clonestr("{\"error\":\"invalid coin address\"}"));
}
@ -710,12 +720,13 @@ struct iguana_info *iguana_coinchoose(struct supernet_info *myinfo,char *symbol,
char *iguana_bitcoinRPC(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr,uint16_t port)
{
cJSON *params[16],*array; struct iguana_info *coin = 0; char symbol[16]; uint32_t immed; int32_t i,n; char *retstr = 0;
cJSON *params[16],*array; struct iguana_info *coin = 0; char symbol[16],*userpass; uint32_t immed; int32_t i,n; char *retstr = 0;
symbol[0] = 0;
memset(params,0,sizeof(params));
//printf("bitcoinRPC\n");
//printf("bitcoinRPC.(%s)\n",jprint(json,0));
if ( json != 0 )
{
userpass = jstr(json,"userpass");
coin = iguana_coinchoose(myinfo,symbol,json,port);
if ( myinfo->rpcsymbol[0] == 0 )
strcpy(myinfo->rpcsymbol,symbol);
@ -842,8 +853,8 @@ cJSON *SuperNET_urlconv(char *value,int32_t bufsize,char *urlstr)
char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *postflagp,char *urlstr,char *remoteaddr,char *filetype,uint16_t port)
{
cJSON *tokens,*argjson,*origargjson,*json = 0; long filesize; struct iguana_info *coin = 0;
char symbol[64],buf[4096],*originstr,*fieldstr,urlmethod[16],*data,url[8192],furl[8192],*retstr,*filestr,*token = 0; int32_t i,j,n,iter,num=0;
cJSON *tokens,*argjson,*origargjson,*tmpjson=0,*json = 0; long filesize; struct iguana_info *coin = 0;
char symbol[64],buf[4096],*originstr,*fieldstr,*userpass=0,urlmethod[16],*data,url[8192],furl[8192],*retstr,*filestr,*token = 0; int32_t i,j,n,iter,num=0;
//printf("rpcparse.(%s)\n",urlstr);
if ( myinfo->remoteorigin == 0 )
{
@ -965,13 +976,14 @@ char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsiz
jaddstr(argjson,"agent",jstri(tokens,0));
if ( num > 1 )
jaddstr(argjson,"method",jstri(tokens,1));
//printf("urlstr.(%s)\n",urlstr+n);
if ( (json= SuperNET_urlconv(retbuf,bufsize,urlstr+n)) != 0 )
{
jadd(json,"tokens",tokens);
jaddstr(json,"urlmethod",urlmethod);
if ( (data= jstr(json,"POST")) == 0 || (argjson= cJSON_Parse(data)) == 0 )
{
userpass = jstr(argjson,"userpass");
printf("userpass.(%s)\n",userpass);
if ( (n= cJSON_GetArraySize(tokens)) > 0 )
{
if ( n > 1 )
@ -1064,6 +1076,8 @@ char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsiz
for (i=0; i<n; i++)
{
argjson = jitem(origargjson,i);
if ( userpass != 0 && jstr(argjson,"userpass") == 0 )
jaddstr(argjson,"userpass",userpass);
//printf("after urlconv.(%s) argjson.(%s)\n",jprint(json,0),jprint(argjson,0));
coin = iguana_coinchoose(myinfo,symbol,argjson,port);
if ( (retstr= SuperNET_JSON(myinfo,coin,argjson,remoteaddr,port)) != 0 )
@ -1079,14 +1093,21 @@ char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsiz
}
else
{
//printf("ARGJSON.(%s)\n",jprint(argjson,0));
coin = iguana_coinchoose(myinfo,symbol,argjson,port);
if ( userpass != 0 && jstr(argjson,"userpass") == 0 )
jaddstr(argjson,"userpass",userpass);
retstr = SuperNET_JSON(myinfo,coin,argjson,remoteaddr,port);
}
free_json(argjson);
free_json(json);
if ( tmpjson != 0 )
free(tmpjson);
return(retstr);
}
free_json(argjson);
if ( tmpjson != 0 )
free(tmpjson);
*jsonflagp = 1;
return(clonestr("{\"error\":\"couldnt process packet\"}"));
}

34
iguana/main.c

@ -326,8 +326,8 @@ char *SuperNET_processJSON(struct supernet_info *myinfo,struct iguana_info *coin
char *SuperNET_JSON(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *json,char *remoteaddr,uint16_t port)
{
int32_t autologin = 0; uint32_t timestamp; char *retstr=0,*agent=0,*method=0,*jsonstr=0; uint64_t tag;
//printf("SuperNET_JSON.(%s)\n",jprint(json,0));
int32_t autologin = 0; uint32_t timestamp; char *retstr=0,*agent=0,*method=0,*userpass; uint64_t tag;
//printf("SuperNET_JSON.(%s)\n",jprint(json,0));
if ( remoteaddr != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 )
remoteaddr = 0;
if ( (agent = jstr(json,"agent")) == 0 )
@ -351,10 +351,16 @@ char *SuperNET_JSON(struct supernet_info *myinfo,struct iguana_info *coin,cJSON
OS_randombytes((uint8_t *)&tag,sizeof(tag));
jadd64bits(json,"tag",tag);
}
if ( coin != 0 && coin->FULLNODE >= 0 && coin->chain->userpass[0] != 0 )
{
if ( (userpass= jstr(json,"userpass")) == 0 || strcmp(userpass,coin->chain->userpass) != 0 )
{
printf("iguana authentication error {%s} (%s) != (%s)\n",jprint(json,0),userpass,coin->chain->userpass);
return(clonestr("{\"error\":\"authentication error\"}"));
}
}
if ( (retstr= SuperNET_processJSON(myinfo,coin,json,remoteaddr,port)) == 0 )
printf("null retstr from SuperNET_JSON\n");
if ( jsonstr != 0 )
free(jsonstr);
if ( autologin != 0 )
SuperNET_logout(myinfo,0,json,remoteaddr);
return(retstr);
@ -1611,6 +1617,7 @@ void iguana_main(void *arg)
strcpy(myinfo->rpcsymbol,"BTCD");
iguana_urlinit(myinfo,ismainnet,usessl);
portable_mutex_init(&myinfo->dpowmutex);
portable_mutex_init(&myinfo->notarymutex);
if ( myinfo->IAMNOTARY == 0 )
{
#if LIQUIDITY_PROVIDER
@ -1652,25 +1659,6 @@ void iguana_main(void *arg)
}
} else printf("couldnt parse.(%s)\n",jsonstr);
}
if ( 0 )
{
int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height);
char CURRENCIES[][8] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies
"CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK",
"REVS" };
uint8_t pubkeys[64][33]; char coinaddr[64]; int32_t i,j; double val = 0.01;
//n = komodo_notaries("KMD",pubkeys,0);
#include "notaries.h"
for (i=0; i<=32; i++)
{
for (j=0; j<sizeof(Notaries)/sizeof(*Notaries); j++)
{
decode_hex(pubkeys[j],33,Notaries[j][1]);
bitcoin_address(coinaddr,60,pubkeys[j],33);
printf("./komodo-cli -ac_name=%s sendtoaddress %s %f\n",CURRENCIES[i],coinaddr,val);
}
}
}
iguana_launchdaemons(myinfo);
}

2
iguana/tests/Alistunspent

@ -0,0 +1,2 @@
#!/bin/bash
curl --url "http://127.0.0.1:7778" --data "{\"userpass\":\"username@password\",\"coin\":\"BTCD\",\"method\":\"listunspent\",\"params\":[1, 9999999, []]}"

3
iguana/tests/active_7776

@ -0,0 +1,3 @@
#!/bin/bash
source pubkey.txt
curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"ffff\"}"
Loading…
Cancel
Save