Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
a360dd74d6
  1. 2
      iguana/SuperNET.c
  2. 2
      iguana/btcd
  3. 2088
      iguana/confs/BTCD_hdrs.h
  4. 17
      iguana/iguana777.c
  5. 6
      iguana/iguana777.h
  6. 1
      iguana/iguana_accept.c
  7. 19
      iguana/iguana_blocks.c
  8. 2
      iguana/iguana_bundles.c
  9. 66
      iguana/iguana_init.c
  10. 2
      iguana/iguana_instantdex.c
  11. 374
      iguana/iguana_msg.c
  12. 2
      iguana/iguana_peers.c
  13. 106
      iguana/iguana_tx.c
  14. 42
      iguana/iguana_unspents.c
  15. 41
      iguana/main.c
  16. BIN
      iguana/pnacl/Release/iguana.pexe
  17. 40
      iguana/ramchain_api.c
  18. 2
      pnacl_main.h

2
iguana/SuperNET.c

@ -675,7 +675,7 @@ char *SuperNET_JSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr,ui
OS_randombytes((uint8_t *)&tag,sizeof(tag));
jadd64bits(json,"tag",tag);
}
//printf("SuperNET_JSON.(%s) remote.(%s)\n",jprint(json,0),remoteaddr!=0?remoteaddr:"");
printf("SuperNET_JSON.(%s) remote.(%s)\n",jprint(json,0),remoteaddr!=0?remoteaddr:"");
destflag = SuperNET_destination(myinfo,&destipbits,&category,&subhash,&maxdelay,json,remoteaddr);
//printf("destflag.%d\n",destflag);
if ( (hexmsg= jstr(json,"hexmsg")) == 0 && (message= jstr(json,"message")) == 0 )

2
iguana/btcd

@ -1,4 +1,4 @@
curl --url "http://127.0.0.1:7778" --data "{\"prefetchlag\":-1,\"poll\":1,\"VALIDATE\":1,\"validatedir\":\"/tmp\",\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"BTCD\",\"startpend\":32,\"endpend\":32,\"services\":1,\"maxpeers\":64,\"tmpdir\":\"/mnt/ramdisk\"}"
curl --url "http://127.0.0.1:7778" --data "{\"prefetchlag\":-1,\"poll\":100,\"VALIDATE\":1,\"validatedir\":\"/tmp\",\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"BTCD\",\"startpend\":32,\"endpend\":32,\"services\":0,\"maxpeers\":64,\"tmpdir\":\"/mnt/ramdisk\"}"
curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"pausecoin\",\"coin\":\"BTC\"}"
curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnode\",\"coin\":\"BTCD\",\"ipaddr\":\"89.248.160.241\"}"
curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnode\",\"coin\":\"BTCD\",\"ipaddr\":\"89.248.160.244\"}"

2088
iguana/confs/BTCD_hdrs.h

File diff suppressed because it is too large

17
iguana/iguana777.c

@ -53,7 +53,7 @@ struct iguana_info *iguana_coinadd(const char *symbol,cJSON *argjson)
{
if ( i >= sizeof(Hardcoded_coins)/sizeof(*Hardcoded_coins) )
break;
//printf("Hardcoded_coins[i][0] %s vs.(%s)\n",Hardcoded_coins[i][0],symbol);
printf("Hardcoded_coins[i][0] %s vs.(%s)\n",Hardcoded_coins[i][0],symbol);
//if ( symbol[0] == 0 )
// getchar();
if ( strcmp("endmarker",Hardcoded_coins[i][0]) == 0 || strcmp(symbol,Hardcoded_coins[i][0]) == 0 )
@ -517,20 +517,21 @@ void iguana_coinloop(void *arg)
bp->bundleheight = 0;
while ( 1 )
{
//fprintf(stderr,"iter\n");
flag = 0;
for (i=0; i<n; i++)
{
if ( (coin= coins[i]) != 0 )
{
#ifdef __PNACL__
if ( strcmp(coin->symbol,"BTC") == 0 )
continue;
#endif
if ( coin->MAXPEERS > IGUANA_MAXPEERS )
coin->MAXPEERS = IGUANA_MAXPEERS;
if ( coin->MAXPEERS < IGUANA_MINPEERS )
coin->MAXPEERS = IGUANA_MAXPEERS;
#ifdef __PNACL__
if ( strcmp(coin->symbol,"BTC") == 0 )
continue;
if ( coin->MAXPEERS > 64 )
coin->MAXPEERS = 64;
#endif
if ( coin->started == 0 && coin->active != 0 )
{
iguana_rwiAddrind(coin,0,0,0);
@ -613,6 +614,7 @@ struct iguana_info *iguana_setcoin(char *symbol,void *launched,int32_t maxpeers,
struct iguana_chain *iguana_createchain(cJSON *json);
struct iguana_info *coin; int32_t j,m,mult,maxval,mapflags; char dirname[512]; cJSON *peers;
mapflags = IGUANA_MAPRECVDATA | maphash*IGUANA_MAPTXIDITEMS | maphash*IGUANA_MAPPKITEMS | maphash*IGUANA_MAPBLOCKITEMS | maphash*IGUANA_MAPPEERITEMS;
printf("setcoin.%s\n",symbol);
coin = iguana_coinadd(symbol,json);
coin->launched = launched;
if ( (coin->MAXPEERS= maxpeers) <= 0 )
@ -638,7 +640,7 @@ struct iguana_info *iguana_setcoin(char *symbol,void *launched,int32_t maxpeers,
maxval = (int32_t)coin->MAXMEM;
coin->MAXMEM *= (1024L * 1024 * 1024);
#ifdef __PNACL__
maxval = 1;
maxval = 8;
#endif
if ( (coin->startPEND= juint(json,"startpend")) == 0 )
coin->startPEND = IGUANA_MAXPENDBUNDLES * mult;
@ -699,6 +701,7 @@ int32_t iguana_launchcoin(char *symbol,cJSON *json)
int64_t maxrecvcache; uint64_t services; struct iguana_info **coins,*coin;
if ( symbol == 0 )
return(-1);
printf("launchcoin.%s\n",symbol);
if ( (coin= iguana_coinadd(symbol,json)) == 0 )
return(-1);
if ( coin->launched == 0 )

6
iguana/iguana777.h

@ -414,6 +414,7 @@ struct iguana_peer
struct iguana_fileitem *filehash2; int32_t numfilehash2,maxfilehash2;
//struct iguana_bundle *bp;
FILE *voutsfp,*vinsfp;
uint8_t *blockspace;//[IGUANA_MAXPACKETSIZE + 8192];
#ifdef IGUANA_PEERALLOC
struct OS_memspace *SEROUT[128];
#endif
@ -553,6 +554,8 @@ int32_t iguana_send_version(struct iguana_info *coin,struct iguana_peer *addr,ui
int32_t iguana_gentxarray(struct iguana_info *coin,struct OS_memspace *mem,struct iguana_txblock *txblock,int32_t *lenp,uint8_t *data,int32_t datalen);
int32_t iguana_gethdrs(struct iguana_info *coin,uint8_t *serialized,char *cmd,char *hashstr);
int32_t iguana_getdata(struct iguana_info *coin,uint8_t *serialized,int32_t type,bits256 *hashes,int32_t n);
void iguana_blockunconv(struct iguana_msgblock *msg,struct iguana_block *src,int32_t cleartxn_count);
int32_t iguana_peerblockrequest(struct iguana_info *coin,struct iguana_peer *addr,bits256 hash2);
// ramchain
int64_t iguana_verifyaccount(struct iguana_info *coin,struct iguana_account *acct,uint32_t pkind);
@ -868,6 +871,9 @@ int32_t iguana_balancefinished(struct iguana_info *coin);
int32_t iguana_alloctxbits(struct iguana_info *coin,struct iguana_ramchain *ramchain);
void iguana_allocvolatile(struct iguana_info *coin,struct iguana_ramchain *ramchain);
int32_t iguana_peerhdrrequest(struct iguana_info *coin,struct iguana_peer *addr,bits256 hash2);
int32_t iguana_peerinvdata(struct iguana_info *coin,struct iguana_peer *addr,uint8_t *space,int32_t max);
extern int32_t HDRnet,netBLOCKS;
extern queue_t bundlesQ,validateQ,emitQ,TerminateQ;

1
iguana/iguana_accept.c

@ -154,6 +154,7 @@ int32_t iguana_pendingaccept(struct iguana_info *coin)
}
return(0);
}
/*int32_t iguana_acceptport(struct iguana_info *coin,uint16_t port)
{
if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)iguana_acceptloop,(void *)coin) != 0 )

19
iguana/iguana_blocks.c

@ -217,6 +217,19 @@ void iguana_blockconv(struct iguana_block *dest,struct iguana_msgblock *msg,bits
dest->RO.hash2 = hash2;
}
void iguana_blockunconv(struct iguana_msgblock *msg,struct iguana_block *src,int32_t cleartxn_count)
{
memset(msg,0,sizeof(*msg));
msg->H.version = src->RO.version;
msg->H.prev_block = src->RO.prev_block;
msg->H.merkle_root = src->RO.merkle_root;
msg->H.timestamp = src->RO.timestamp;
msg->H.bits = src->RO.bits;
msg->H.nonce = src->RO.nonce;
if ( cleartxn_count == 0 )
msg->txn_count = src->RO.txn_count;
}
void iguana_blockcopy(struct iguana_info *coin,struct iguana_block *block,struct iguana_block *origblock)
{
block->RO.hash2 = origblock->RO.hash2;
@ -347,7 +360,11 @@ struct iguana_block *iguana_fastlink(struct iguana_info *coin,int32_t hwmheight)
{
hdrsi = (height / coin->chain->bundlesize);
bundlei = (height % coin->chain->bundlesize);
if ( (bp= coin->bundles[bundlei]) == 0 )
#ifndef __PNACL__
if ( (height % 10000) == 0 )
fprintf(stderr,".");
#endif
if ( (bp= coin->bundles[hdrsi]) == 0 )
{
printf("iguana_fastlink null bundle.[%d]\n",hdrsi);
break;

2
iguana/iguana_bundles.c

@ -341,7 +341,7 @@ struct iguana_bundle *iguana_bundlecreate(struct iguana_info *coin,int32_t *bund
bits256_str(str,bundlehash2);
sprintf(dirname,"%s/%s/%d",GLOBALTMPDIR,coin->symbol,bp->bundleheight), OS_ensure_directory(dirname);
//sprintf(dirname,"DB/%s/%d",coin->symbol,bp->bundleheight), OS_ensure_directory(dirname);
//printf("ht.%d alloc.[%d] new hdrs.%s %s\n",bp->bundleheight,coin->bundlescount,str,bits256_str(str2,allhash));
//printf("ht.%d alloc.[%d] new hdrs.%s\n",bp->bundleheight,coin->bundlescount,bits256_str(str,bp->hashes[0]));
iguana_bundlehash2add(coin,0,bp,0,bundlehash2);
if ( issueflag != 0 )
{

66
iguana/iguana_init.c

@ -129,15 +129,17 @@ bits256 iguana_genesis(struct iguana_info *coin,struct iguana_chain *chain)
int32_t iguana_savehdrs(struct iguana_info *coin)
{
char fname[512],shastr[65],tmpfname[512],str2[65],str[65],oldfname[512];
bits256 sha256all; FILE *fp; struct iguana_bundle *bp; int32_t hdrsi,n,retval = 0;
char fname[512],shastr[65],tmpfname[512],tmpfname2[512],str2[65],str[65],oldfname[512];
bits256 sha256all; FILE *fp,*fp2; struct iguana_bundle *bp; int32_t hdrsi,n,retval = 0;
n = coin->blocks.hwmchain.height + 1;
sprintf(tmpfname,"%s/%s/hdrs.txt",GLOBALTMPDIR,coin->symbol), OS_compatible_path(tmpfname);
sprintf(tmpfname2,"%s/%s/hdrs.h",GLOBALTMPDIR,coin->symbol), OS_compatible_path(tmpfname);
sprintf(oldfname,"confs/%s_oldhdrs.txt",coin->symbol), OS_compatible_path(oldfname);
sprintf(fname,"confs/%s_hdrs.txt",coin->symbol);
OS_compatible_path(fname);
sprintf(fname,"confs/%s_hdrs.txt",coin->symbol), OS_compatible_path(fname);
if ( (fp= fopen(tmpfname,"w")) != 0 )
{
if ( (fp2= fopen(tmpfname2,"w")) != 0 )
fprintf(fp2,"char *%s_hdrs[][4] = {\n",coin->symbol);
fprintf(fp,"%d\n",n);
for (hdrsi=0; hdrsi<coin->bundlescount; hdrsi++)
{
@ -155,11 +157,17 @@ int32_t iguana_savehdrs(struct iguana_info *coin)
bits256_str(shastr,bp->allhash);
}
fprintf(fp,"%d %s %s %s\n",bp->bundleheight,bits256_str(str,bp->hashes[0]),shastr,bits256_str(str2,bp->hashes[1]));
if ( fp2 != 0 )
fprintf(fp2,"{ \"%d\", \"%s\", \"%s\", \"%s\"},\n",bp->bundleheight,bits256_str(str,bp->hashes[0]),shastr,bits256_str(str2,bp->hashes[1]));
}
else
{
if ( bp != 0 && bits256_nonz(bp->hashes[0]) != 0 )
{
fprintf(fp,"%d %s\n",bp->bundleheight,bits256_str(str,bp->hashes[0]));
if ( fp2 != 0 )
fprintf(fp2,"{ \"%d\", \"%s\", \"%s\", \"%s\"},\n",bp->bundleheight,bits256_str(str,bp->hashes[0]),"","");
}
break;
}
}
@ -171,6 +179,11 @@ int32_t iguana_savehdrs(struct iguana_info *coin)
OS_renamefile(fname,oldfname);
OS_copyfile(tmpfname,fname,1);
} else fclose(fp);
if ( fp2 != 0 )
{
fprintf(fp2,"};\n");
fclose(fp2);
}
}
else
{
@ -212,6 +225,7 @@ void iguana_parseline(struct iguana_info *coin,int32_t iter,FILE *fp)
}
m = flag = 0;
allhash = zero;
memset(line,0,sizeof(line));
while ( fgets(line,sizeof(line),fp) > 0 )
{
j = (int32_t)strlen(line) - 1;
@ -249,7 +263,16 @@ void iguana_parseline(struct iguana_info *coin,int32_t iter,FILE *fp)
if ( line[k] == ' ' )
{
decode_hex(hash2.bytes,sizeof(hash2),line+k+1);
if ( line[k+1 + 65] != 0 )
//printf("line.(%s) k.%d (%c)(%c)(%d)\n",line,k,line[k+63],line[k+64],line[k+65]);
if ( height >= 0 && bits256_nonz(hash2) != 0 )
{
if ( (bp= iguana_bundlecreate(coin,&bundlei,height,hash2,zero,0)) != 0 )
{
//printf("created bundle.%d\n",bp->hdrsi);
lastbundle = hash2;
}
}
if ( line[k + 65] != 0 && line[k+65] != '\n' && line[k+65] != '\r' )
{
if ( height > (coin->blocks.maxbits - 1000) )
iguana_recvalloc(coin,height + 100000);
@ -265,6 +288,11 @@ void iguana_parseline(struct iguana_info *coin,int32_t iter,FILE *fp)
//char str[65],str2[65]; printf(">>>> bundle.%d got (%s)/(%s) allhash.(%s)\n",height,bits256_str(str,hash1),checkstr,bits256_str(str2,allhash));
if ( (bp= iguana_bundlecreate(coin,&bundlei,height,hash2,allhash,0)) != 0 )
{
if ( bits256_cmp(allhash,bp->allhash) != 0 )
{
printf("mismatched allhash.[%d]\n",bp->hdrsi);
bp->allhash = allhash;
}
bp->bundleheight = height;
if ( bits256_nonz(hash1) != 0 )
{
@ -299,6 +327,7 @@ void iguana_parseline(struct iguana_info *coin,int32_t iter,FILE *fp)
}
}
}
memset(line,0,sizeof(line));
}
if ( iter == 1 )
iguana_initfinal(coin,lastbundle);
@ -436,6 +465,33 @@ struct iguana_info *iguana_coinstart(struct iguana_info *coin,int32_t initialhei
iguana_genesis(coin,coin->chain);
for (iter=coin->peers.numranked>8; iter<2; iter++)
{
#ifdef __PNACL__
#include "confs/BTCD_hdrs.h"
bits256 hash2,allhash,hash1; int32_t bundlei,i,height; struct iguana_block *block; struct iguana_bundle *bp;
for (i=0; i<sizeof(BTCD_hdrs)/sizeof(*BTCD_hdrs); i++)
{
height = atoi(BTCD_hdrs[i][0]);
if ( height > (coin->blocks.maxbits - 1000) )
iguana_recvalloc(coin,height + 100000);
hash2 = bits256_conv(BTCD_hdrs[i][1]);
if ( BTCD_hdrs[i][2][0] != 0 )
allhash = bits256_conv(BTCD_hdrs[i][2]);
if ( BTCD_hdrs[i][3][0] != 0 )
hash1 = bits256_conv(BTCD_hdrs[i][3]);
if ( (bp= iguana_bundlecreate(coin,&bundlei,height,hash2,allhash,0)) != 0 )
{
bp->bundleheight = height;
if ( bits256_nonz(hash1) != 0 )
{
if ( (block= iguana_blockhashset("inithash1",coin,height+1,hash1,1)) != 0 )
{
iguana_bundlehashadd(coin,bp,1,block);
block->mainchain = 1;
}
}
}
}
#endif
sprintf(fname,"confs/%s_%s.txt",coin->symbol,(iter == 0) ? "peers" : "hdrs");
OS_compatible_path(fname);
//sprintf(fname,"confs/%s_%s.txt",coin->symbol,(iter == 0) ? "peers" : "hdrs");

2
iguana/iguana_instantdex.c

@ -60,7 +60,7 @@ cJSON *instantdex_defaultprocess(struct supernet_info *myinfo,struct exchange_in
}
return(newjson);
}
//({"agent":"iguana","method":"addcoin","newcoin":"PPC","active":1,"maxpeers":128,"services":0,"poll":1,"RAM":4,"minoutput":100000,"minconfirms":3,"estblocktime":600,"path":"/data/ppcoin","conf":"/data/.ppcoin","txfee_satoshis":100000,"useaddmultisig":1,"hastimestamp":0,"userhome":"/data/SuperNET/iguana","pubval":"37","scriptval":"75","wiftype":"b7","netmagic":"e6e8e9e5","genesishash":"00000ffd590b1485b3caadc19b22e6379c733355108f107a430458cdf3407ab6","genesis":{"hashalgo":"sha256","version":1,"timestamp":1345084287,"nbits":"1d00ffff","nonce":2179302059,"merkleroot":"3c2d8f85fab4d17aac558cc648a1a58acff0de6deb890c29985690052c5993c2"},"p2p":9901,"rpc":9902})
cJSON *instantdex_defaulttimeout(struct supernet_info *myinfo,struct exchange_info *exchange,struct bitcoin_swapinfo *swap,cJSON *argjson,cJSON *newjson,uint8_t **serdatap,int32_t *serdatalenp)
{
uint8_t *serdata = *serdatap; int32_t serdatalen = *serdatalenp;

374
iguana/iguana_msg.c

@ -472,10 +472,65 @@ int32_t iguana_send_hashes(struct iguana_info *coin,char *command,struct iguana_
return(retval);
}
int32_t iguana_intvectors(struct iguana_info *coin,struct iguana_peer *addr,int32_t processflag,uint8_t *data,int32_t datalen)
{
uint32_t type; bits256 *txids=0,*blockhashes=0,hash; int32_t i,n,m,len; uint64_t x;
len = n = m = 0;
len += iguana_rwvarint(0,&data[len],&x);
for (i=0; i<x; i++)
{
len += iguana_rwnum(0,&data[len],sizeof(uint32_t),&type);
len += iguana_rwbignum(0,&data[len],sizeof(bits256),hash.bytes);
if ( type == MSG_TX )
{
if ( txids == 0 )
txids = mycalloc('t',(int32_t)x+1,sizeof(*txids));
txids[m++] = hash;
if ( (rand() % 1000) == 0 && i == x-1 )
printf("%s %d of %d: tx.%llx len.%d\n",addr->ipaddr,i,(int32_t)x,(long long)hash.txid,len);
}
else if ( type == MSG_BLOCK )
{
if ( blockhashes == 0 )
{
blockhashes = mycalloc('f',(int32_t)x+1,sizeof(*blockhashes));
n = 1;
}
blockhashes[n++] = hash;
}
else if ( type == MSG_FILTERED_BLOCK )
printf(" %d of %d: merkle.%llx\n",i,(int32_t)x,(long long)hash.txid);
else printf("what type is %d\n",type);
}
if ( n > 0 )
{
if ( n != x+1 )
{
printf("n.%d != x.%d -> realloc blockhashes\n",n,(int32_t)x+1);
blockhashes = myrealloc('f',blockhashes,(int32_t)((x+1)*sizeof(*blockhashes)),n*sizeof(*blockhashes));
} // else printf("n.%d == x.%d\n",n,(int32_t)x);
if ( processflag != 0 )
iguana_gotblockhashesM(coin,addr,blockhashes,n), blockhashes = 0;
}
if ( m > 0 )
{
if ( m != x )
txids = myrealloc('t',txids,(int32_t)((x+1)*sizeof(*txids)),(m+1)*sizeof(*txids));
if ( processflag != 0 )
iguana_gottxidsM(coin,addr,txids,m), txids = 0;
}
if ( txids != 0 )
myfree(txids,sizeof(*txids) * (x+1));
if ( blockhashes != 0 )
myfree(blockhashes,sizeof(*blockhashes) * (x+1));
return(len);
//printf("intvectors.%c recvlen.%d\n",intvectors,recvlen);
}
int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t recvlen)
{
uint8_t serialized[512]; char *retstr;
int32_t i,retval,delay,srvmsg,bloom,intvectors,len= -100; uint64_t nonce,x; uint32_t type; bits256 hash2;
uint8_t serialized[16384]; char *retstr;
int32_t i,tmp,n,retval,ishost,delay,srvmsg,bloom,sendlen=0,intvectors,len= -100; uint64_t nonce,x; bits256 hash2;
bloom = intvectors = srvmsg = -1;
if ( addr != 0 )
{
@ -484,16 +539,65 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc
}
retval = 0;
//printf("iguana_msgparser %s parse.(%s)\n",addr->ipaddr,H->command);
if ( strcmp(H->command,"block") == 0 )
if ( (ishost= (strcmp(H->command,"getblocks") == 0)) || strcmp(H->command,"block") == 0 )
{
struct iguana_txblock txdata;
if ( addr != 0 )
addr->msgcounts.block++;
iguana_memreset(rawmem), iguana_memreset(txmem);
memset(&txdata,0,sizeof(txdata));
if ( (len= iguana_gentxarray(coin,rawmem,&txdata,&len,data,recvlen)) == recvlen )
iguana_gotblockM(coin,addr,&txdata,rawmem->ptr,H,data,recvlen);
else printf("parse error block txn_count.%d, len.%d vs recvlen.%d\n",txdata.block.RO.txn_count,len,recvlen);
{
if ( ishost == 0 )
{
addr->msgcounts.block++;
iguana_memreset(rawmem), iguana_memreset(txmem);
memset(&txdata,0,sizeof(txdata));
if ( (len= iguana_gentxarray(coin,rawmem,&txdata,&len,data,recvlen)) == recvlen )
iguana_gotblockM(coin,addr,&txdata,rawmem->ptr,H,data,recvlen);
else printf("parse error block txn_count.%d, len.%d vs recvlen.%d\n",txdata.block.RO.txn_count,len,recvlen);
}
else
{
addr->msgcounts.getblocks++;
len = iguana_rwnum(0,&serialized[sizeof(struct iguana_msghdr)],sizeof(uint32_t),&tmp);
len += iguana_rwvarint32(0,&serialized[sizeof(struct iguana_msghdr) + len],(uint32_t *)&n);
for (i=0; i<n; i++)
{
len += iguana_rwbignum(0,&serialized[sizeof(struct iguana_msghdr) + len],sizeof(bits256),hash2.bytes);
iguana_peerblockrequest(coin,addr,hash2);
if ( bits256_nonz(hash2) == 0 )
break;
}
}
}
}
if ( (ishost= (strcmp(H->command,"data") == 0)) || strcmp(H->command,"inv") == 0 )
{
if ( addr != 0 )
{
if ( ishost != 0 )
{
addr->msgcounts.getdata++;
printf("%s SERVER getdata\n",addr->ipaddr);
intvectors = srvmsg = 'D';
// generate intvectors data, create new type for shahdrs!
if ( (sendlen= iguana_peerinvdata(coin,addr,addr->blockspace,sizeof(addr->blockspace))) > 0 )
iguana_queue_send(coin,addr,0,addr->blockspace,"inv",0,0,0);
}
else
{
intvectors = 'I', addr->msgcounts.inv++;
len = iguana_intvectors(coin,addr,1,data,recvlen);
}
}
}
else if ( strcmp(H->command,"notfound") == 0 )
{
printf("%s SERVER notfound\n",addr->ipaddr);
intvectors = 'N', addr->msgcounts.notfound++;
len = iguana_intvectors(coin,addr,1,data,recvlen);
}
else if ( strcmp(H->command,"mempool") == 0 )
{
printf("%s SERVER mempool\n",addr->ipaddr);
srvmsg = 'M', addr->msgcounts.mempool++;
}
else if ( strncmp(H->command,"SuperNET",strlen("SuperNET")) == 0 )
{
@ -507,94 +611,126 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc
}
//printf("GOT.(%s) [%s] len.%d from %s -> (%s)\n",H->command,data,recvlen,addr->ipaddr,retstr==0?"null":retstr);
}
else if ( strcmp(H->command,"version") == 0 )
else if ( (ishost= (strcmp(H->command,"getheaders") == 0)) || strcmp(H->command,"headers") == 0 )
{
struct iguana_msgversion recvmv;
if ( addr != 0 )
struct iguana_msgblock msg; struct iguana_block *blocks; uint32_t n;
if ( ishost == 0 )
{
len = iguana_rwversion(0,data,&recvmv,addr->ipaddr,recvlen);
if ( len <= recvlen )
iguana_gotversion(coin,addr,&recvmv);
//printf("deser.(%s) len.%d recvlen.%d\n",recvmv.H.command,len,recvlen);
addr->msgcounts.version++;
len = iguana_rwvarint32(0,data,&n);
if ( n <= IGUANA_MAXINV )
{
blocks = mycalloc('i',1,sizeof(*blocks) * n);
for (i=0; i<n; i++)
{
len += iguana_rwblock(0,&hash2,&data[len],&msg);
iguana_blockconv(&blocks[i],&msg,hash2,-1);
}
iguana_gotheadersM(coin,addr,blocks,n);
//myfree(blocks,sizeof(*blocks) * n);
if ( len == recvlen && addr != 0 )
addr->msgcounts.headers++;
} else printf("got unexpected n.%d for headers\n",n);
}
else
{
addr->msgcounts.getheaders++;
len = iguana_rwnum(0,&serialized[sizeof(struct iguana_msghdr)],sizeof(uint32_t),&tmp);
len += iguana_rwvarint32(0,&serialized[sizeof(struct iguana_msghdr) + len],(uint32_t *)&n);
for (i=0; i<n; i++)
{
len += iguana_rwbignum(0,&serialized[sizeof(struct iguana_msghdr) + len],sizeof(bits256),hash2.bytes);
iguana_peerhdrrequest(coin,addr,hash2);
if ( bits256_nonz(hash2) == 0 )
break;
}
}
//printf("GOT HEADERS n.%d len.%d\n",n,len);
}
else if ( strcmp(H->command,"verack") == 0 )
else if ( (ishost= (strcmp(H->command,"version") == 0)) || strcmp(H->command,"verack") == 0 )
{
if ( addr != 0 )
{
iguana_gotverack(coin,addr);
addr->msgcounts.verack++;
if ( ishost != 0 )
{
struct iguana_msgversion recvmv;
len = iguana_rwversion(0,data,&recvmv,addr->ipaddr,recvlen);
if ( len <= recvlen )
iguana_gotversion(coin,addr,&recvmv);
addr->msgcounts.version++;
}
else
{
iguana_gotverack(coin,addr);
addr->msgcounts.verack++;
len = 0;
}
}
len = 0;
}
else if ( strcmp(H->command,"ConnectTo") == 0 )
{
iguana_queue_send(coin,addr,0,serialized,"getaddr",0,0,0);
len = 6;
}
else if ( strcmp(H->command,"ping") == 0 )
else if ( (ishost= (strcmp(H->command,"ping") == 0)) || strcmp(H->command,"pong") == 0 )
{
len = 0;
if ( recvlen == sizeof(uint64_t) && addr != 0 )
{
len = iguana_rwnum(0,data,sizeof(uint64_t),&nonce);
if ( addr != 0 )
{
//printf("%u got nonce.%llx from %s\n",(uint32_t)time(NULL),(long long)nonce,addr->ipaddr);
iguana_gotping(coin,addr,nonce,data);
addr->msgcounts.ping++;
if ( ishost != 0 )
{
iguana_gotping(coin,addr,nonce,data);
addr->msgcounts.ping++;
}
else
{
iguana_gotpong(coin,addr,nonce);
addr->msgcounts.pong++;
}
iguana_queue_send(coin,addr,0,serialized,"getaddr",0,0,0);
}
iguana_queue_send(coin,addr,0,serialized,"getaddr",0,0,0);
}
}
else if ( strcmp(H->command,"pong") == 0 )
{
len = 0;
if ( recvlen == sizeof(uint64_t) )
{
len = iguana_rwnum(0,data,sizeof(uint64_t),&nonce);
iguana_gotpong(coin,addr,nonce);
} else printf("unexpected pong recvlen.%d\n",recvlen);
if ( len == recvlen && addr != 0 )
addr->msgcounts.pong++;
iguana_queue_send(coin,addr,0,serialized,"getaddr",0,0,0);
}
else if ( strcmp(H->command,"addr") == 0 )
else if ( (ishost= (strcmp(H->command,"getaddr") == 0)) || strcmp(H->command,"addr") == 0 )
{
struct iguana_msgaddress A;
len = iguana_rwvarint(0,data,&x);
for (i=0; i<x; i++)
{
memset(&A,0,sizeof(A));
if ( addr != 0 )
len += iguana_rwaddr(0,&data[len],&A,(int32_t)addr->protover);
iguana_gotaddr(coin,addr,&A);
}
if ( len == recvlen && addr != 0 )
{
addr->lastgotaddr = (uint32_t)time(NULL);
addr->msgcounts.addr++;
}
//printf("%s -> addr recvlen.%d num.%d\n",addr->ipaddr,recvlen,(int32_t)x);
}
else if ( strcmp(H->command,"headers") == 0 )
{
struct iguana_msgblock msg; struct iguana_block *blocks; uint32_t n;
len = iguana_rwvarint32(0,data,&n);
if ( n <= IGUANA_MAXINV )
if ( addr != 0 )
{
blocks = mycalloc('i',1,sizeof(*blocks) * n);
for (i=0; i<n; i++)
if ( ishost == 0 )
{
len += iguana_rwblock(0,&hash2,&data[len],&msg);
iguana_blockconv(&blocks[i],&msg,hash2,-1);
len = iguana_rwvarint(0,data,&x);
for (i=0; i<x; i++)
{
memset(&A,0,sizeof(A));
if ( addr != 0 )
len += iguana_rwaddr(0,&data[len],&A,(int32_t)addr->protover);
iguana_gotaddr(coin,addr,&A);
}
if ( len == recvlen && addr != 0 )
{
addr->lastgotaddr = (uint32_t)time(NULL);
addr->msgcounts.addr++;
}
}
iguana_gotheadersM(coin,addr,blocks,n);
//myfree(blocks,sizeof(*blocks) * n);
if ( len == recvlen && addr != 0 )
addr->msgcounts.headers++;
} else printf("got unexpected n.%d for headers\n",n);
//printf("GOT HEADERS n.%d len.%d\n",n,len);
else
{
struct iguana_peer *tmpaddr;
len = 0;
x = coin->peers.numranked;
if ( x > (sizeof(serialized)-sizeof(*H)-sizeof(uint64_t))/sizeof(A) )
x = (sizeof(serialized)-sizeof(*H)-sizeof(uint64_t))/sizeof(A);
sendlen = iguana_rwvarint(1,&serialized[sizeof(*H)+sendlen],&x);
for (i=0; i<x; i++)
{
memset(&A,0,sizeof(A));
if ( (tmpaddr= coin->peers.ranked[i]) != 0 )
{
sendlen += iguana_rwaddr(1,&serialized[sizeof(*H)+sendlen],&tmpaddr->A,(int32_t)tmpaddr->protover);
}
}
retval = iguana_queue_send(coin,addr,0,serialized,"addr",sendlen,0,0);
addr->msgcounts.getaddr++;
}
}
//printf("%s -> addr recvlen.%d num.%d\n",addr->ipaddr,recvlen,(int32_t)x);
}
else if ( strcmp(H->command,"tx") == 0 )
{
@ -606,6 +742,11 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc
printf("tx recvlen.%d vs len.%d\n",recvlen,len);
addr->msgcounts.tx++;
}
else if ( strcmp(H->command,"ConnectTo") == 0 )
{
iguana_queue_send(coin,addr,0,serialized,"getaddr",0,0,0);
len = 6;
}
else if ( strcmp(H->command,"reject") == 0 )
{
for (i=0; i<recvlen; i++)
@ -626,36 +767,7 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc
}
else if ( addr != 0 )
{
if ( strcmp(H->command,"inv") == 0 )
intvectors = 'I', addr->msgcounts.inv++;
else if ( strcmp(H->command,"notfound") == 0 ) // for servers
intvectors = 'N', addr->msgcounts.notfound++;
else if ( strcmp(H->command,"getdata") == 0 ) // for servers
{
printf("%s SERVER getdata\n",addr->ipaddr);
intvectors = srvmsg = 'D', addr->msgcounts.getdata++;
}
else if ( strcmp(H->command,"getblocks") == 0 ) // for servers
{
printf("%s SERVER getblocks\n",addr->ipaddr);
srvmsg = 'B', addr->msgcounts.getblocks++;
}
else if ( strcmp(H->command,"getheaders") == 0 ) // for servers
{
printf("%s SERVER getheaders\n",addr->ipaddr);
srvmsg = 'H', addr->msgcounts.getheaders++;
}
else if ( strcmp(H->command,"getaddr") == 0 )
{
printf("%s SERVER getaddr\n",addr->ipaddr);
srvmsg = 'A', addr->msgcounts.getaddr++;
}
else if ( strcmp(H->command,"mempool") == 0 )
{
printf("%s SERVER mempool\n",addr->ipaddr);
srvmsg = 'M', addr->msgcounts.mempool++;
}
else if ( strcmp(H->command,"filterload") == 0 ) // for bloom
if ( strcmp(H->command,"filterload") == 0 ) // for bloom
bloom = 'L', addr->msgcounts.filterload++;
else if ( strcmp(H->command,"filteradd") == 0 ) // for bloom
bloom = 'A', addr->msgcounts.filteradd++;
@ -666,62 +778,6 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc
}
if ( bloom >= 0 || srvmsg >= 0 )
len = recvlen; // just mark as valid
if ( intvectors >= 0 )
{
bits256 *txids=0,*blockhashes=0,hash; int32_t n,m;
len = n = m = 0;
len += iguana_rwvarint(0,&data[len],&x);
for (i=0; i<x; i++)
{
len += iguana_rwnum(0,&data[len],sizeof(uint32_t),&type);
len += iguana_rwbignum(0,&data[len],sizeof(bits256),hash.bytes);
if ( type == MSG_TX )
{
if ( txids == 0 )
txids = mycalloc('t',(int32_t)x+1,sizeof(*txids));
txids[m++] = hash;
if ( (rand() % 1000) == 0 && i == x-1 )
printf("%s iv.%c %d of %d: tx.%llx len.%d\n",addr->ipaddr,intvectors,i,(int32_t)x,(long long)hash.txid,len);
}
else if ( type == MSG_BLOCK )
{
if ( blockhashes == 0 )
{
blockhashes = mycalloc('f',(int32_t)x+1,sizeof(*blockhashes));
n = 1;
}
blockhashes[n++] = hash;
}
else if ( type == MSG_FILTERED_BLOCK )
printf("iv.%d %d of %d: merkle.%llx\n",intvectors,i,(int32_t)x,(long long)hash.txid);
else printf("what type is %d\n",type);
}
if ( intvectors == 'I' )
{
if ( n > 0 )
{
if ( n != x+1 )
{
printf("n.%d != x.%d -> realloc blockhashes\n",n,(int32_t)x+1);
blockhashes = myrealloc('f',blockhashes,(int32_t)((x+1)*sizeof(*blockhashes)),n*sizeof(*blockhashes));
} // else printf("n.%d == x.%d\n",n,(int32_t)x);
if ( 1 )
iguana_gotblockhashesM(coin,addr,blockhashes,n), blockhashes = 0;
else iguana_send_hashes(coin,"getblocks",addr,blockhashes[0],&blockhashes[1],n);
}
if ( m > 0 )
{
if ( m != x )
txids = myrealloc('t',txids,(int32_t)((x+1)*sizeof(*txids)),(m+1)*sizeof(*txids));
iguana_gottxidsM(coin,addr,txids,m), txids = 0;
}
}
if ( txids != 0 )
myfree(txids,sizeof(*txids) * (x+1));
if ( blockhashes != 0 )
myfree(blockhashes,sizeof(*blockhashes) * (x+1));
//printf("intvectors.%c recvlen.%d\n",intvectors,recvlen);
}
if ( len != recvlen && len != recvlen-1 && len != recvlen-2 )
{
//printf("error.(%s) (%s): len.%d != recvlen.%d\n",H->command,addr->ipaddr,len,recvlen);

2
iguana/iguana_peers.c

@ -1035,6 +1035,8 @@ void iguana_dedicatedloop(struct iguana_info *coin,struct iguana_peer *addr)
//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;
if ( addr->blockspace == 0 )
addr->blockspace = mycalloc('r',1,bufsize + 8192);
buf = mycalloc('r',1,bufsize);
if ( strcmp(coin->symbol,"VPN") == 0 )
{

106
iguana/iguana_tx.c

@ -89,6 +89,112 @@ struct iguana_txid *iguana_blocktx(struct iguana_info *coin,struct iguana_txid *
return(0);
}
int32_t iguana_ramtxbytes(struct iguana_info *coin,uint8_t *serialized,int32_t maxlen,bits256 *txidp,struct iguana_txid *tx,int32_t height,struct iguana_msgvin *vins,struct iguana_msgvout *vouts)
{
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 )
len += iguana_rwnum(rwflag,&serialized[len],sizeof(tx->timestamp),&tx->timestamp);
numvins = tx->numvins, numvouts = tx->numvouts;
len += iguana_rwvarint32(rwflag,&serialized[len],&numvins);
for (i=0; i<numvins; i++)
{
if ( vins == 0 )
iguana_vinset(coin,height,&vin,tx,i);
else vin = vins[i];
len += iguana_rwvin(rwflag,0,&serialized[len],&vin);
}
if ( len > maxlen )
return(0);
len += iguana_rwvarint32(rwflag,&serialized[len],&numvouts);
for (i=0; i<numvouts; i++)
{
if ( vouts == 0 )
iguana_voutset(coin,space,asmstr,height,&vout,tx,i);
else vout = vouts[i];
len += iguana_rwvout(rwflag,0,&serialized[len],&vout);
}
if ( len > 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 )
{
//for (i=0; i<len; i++)
// printf("%02x",serialized[i]);
char str[65],str2[65]; printf("\nrw.%d numvins.%d numvouts.%d error generating txbytes, probably due to running without stored sigs txid %s vs %s\n",rwflag,numvins,numvouts,bits256_str(str,*txidp),bits256_str(str2,tx->txid));
return(len);
}
return(len);
}
int32_t iguana_peerblockrequest(struct iguana_info *coin,struct iguana_peer *addr,bits256 hash2)
{
struct iguana_txid *tx,T; bits256 checktxid; int32_t i,len,total,bundlei=-2; struct iguana_block *block; struct iguana_bundle *bp=0;
if ( (bp= iguana_bundlefind(coin,&bp,&bundlei,hash2)) != 0 && bundlei >= 0 && bundlei < bp->n && (block= bp->blocks[bundlei]) != 0 && block->mainchain != 0 && block->height >= 0 )
{
for (i=total=0; i<block->RO.txn_count; i++)
{
if ( (tx= iguana_blocktx(coin,&T,block,i)) != 0 )
{
if ( (len= iguana_ramtxbytes(coin,&addr->blockspace[sizeof(struct iguana_msghdr) + total],sizeof(addr->blockspace) - total,&checktxid,tx,block->height,0,0)) > 0 && bits256_cmp(checktxid,T.txid) == 0 )
total += len;
else break;
} else break;
}
if ( i == block->RO.txn_count )
return(iguana_queue_send(coin,addr,0,addr->blockspace,"block",total,0,0));
else printf("iguana_peerblockrequest: error getting tx.[%d] for ht.%d\n",i,bp->bundleheight+bundlei);
}
return(-1);
}
int32_t iguana_peerhdrrequest(struct iguana_info *coin,struct iguana_peer *addr,bits256 hash2)
{
struct iguana_txid *tx,T; int32_t len=0,i,height,retval=-1; struct iguana_block *block; struct iguana_msgblock msgB; uint8_t *serialized; bits256 checkhash2;
if ( (tx= iguana_txidfind(coin,&height,&T,hash2,coin->bundlescount-1)) != 0 )
{
serialized = calloc(coin->chain->bundlesize,sizeof(msgB));
for (i=0; i<coin->chain->bundlesize; i++)
{
if ( (block= iguana_blockptr("peerhdr",coin,height + i)) != 0 )
{
iguana_blockunconv(&msgB,block,1);
len += iguana_rwblock(1,&checkhash2,&serialized[sizeof(struct iguana_msghdr) + len],&msgB);
if ( bits256_cmp(checkhash2,block->RO.hash2) != 0 )
{
char str[65],str2[65];
printf("iguana_peerhdrrequest blockhash.%d error (%s) vs (%s)\n",height+i,bits256_str(str,checkhash2),bits256_str(str2,block->RO.hash2));
free(serialized);
return(-1);
}
}
}
if ( i == coin->chain->bundlesize || (i > 0 && height/coin->chain->bundlesize >= coin->blocks.hwmchain.height/coin->chain->bundlesize) )
retval = iguana_queue_send(coin,addr,0,serialized,"headers",len,0,0);
free(serialized);
}
return(retval);
}
int32_t iguana_peerinvdata(struct iguana_info *coin,struct iguana_peer *addr,uint8_t *space,int32_t max)
{
int32_t i,type,len = 0; uint64_t x; struct iguana_bundle *bp;
x = coin->bundlescount;
len += iguana_rwvarint(1,&space[sizeof(struct iguana_msghdr) + len],&x);
for (i=0; i<x; i++)
{
if ( (bp= coin->bundles[i]) != 0 )
{
type = MSG_BLOCK;
len += iguana_rwnum(1,&space[sizeof(struct iguana_msghdr) + len],sizeof(uint32_t),&type);
len += iguana_rwbignum(1,&space[sizeof(struct iguana_msghdr) + len],sizeof(bits256),bp->hashes[0].bytes);
}
}
return(len);
}
cJSON *iguana_blockjson(struct iguana_info *coin,struct iguana_block *block,int32_t txidsflag)
{
char str[65],hexstr[1024]; int32_t i,len; struct iguana_txid *tx,T; struct iguana_msgblock msg;

42
iguana/iguana_unspents.c

@ -1214,7 +1214,7 @@ void iguana_truncatebalances(struct iguana_info *coin)
int32_t iguana_volatilesinit(struct iguana_info *coin)
{
bits256 balancehash,allbundles; struct iguana_utxo *Uptr; struct iguana_account *Aptr;
struct sha256_vstate vstate,bstate; int32_t i,n,from_ro,numpkinds,numunspents; struct iguana_bundle *bp; struct iguana_block *block;
struct sha256_vstate vstate,bstate; int32_t i,from_ro,numpkinds,numunspents; struct iguana_bundle *bp; struct iguana_block *block;
uint32_t crc,filecrc; FILE *fp; char crcfname[512],str[65],str2[65],buf[2048];
from_ro = 1;
printf("volatile init\n");
@ -1303,19 +1303,19 @@ int32_t iguana_volatilesinit(struct iguana_info *coin)
}
}
}
coin->RTheight = coin->balanceswritten * coin->chain->bundlesize;
if ( (coin->RTheight= coin->balanceswritten * coin->chain->bundlesize) > coin->longestchain )
coin->longestchain = coin->RTheight;
iguana_bundlestats(coin,buf,IGUANA_DEFAULTLAG);
if ( (bp= coin->bundles[coin->balanceswritten-1]) != 0 && (block= iguana_blockfind("init",coin,bp->hashes[bp->n-1])) != 0 )
coin->blocks.hwmchain = *block;
if ( (n= iguana_walkchain(coin,0)) > 0 )
printf("iguana_walkchain n.%d vs hwmheight.%d\n",n,coin->blocks.hwmchain.height);
//iguana_fastlink(coin,coin->balanceswritten * coin->chain->bundlesize - 1);
//if ( (n= iguana_walkchain(coin,0)) > 0 )
// printf("iguana_walkchain n.%d vs hwmheight.%d\n",n,coin->blocks.hwmchain.height);
return(coin->balanceswritten);
}
void iguana_initfinal(struct iguana_info *coin,bits256 lastbundle)
{
int32_t i; struct iguana_bundle *bp; char hashstr[65];
int32_t i; struct iguana_bundle *bp; bits256 hash2; struct iguana_block *block; char hashstr[65];
if ( bits256_nonz(lastbundle) > 0 )
{
init_hexbytes_noT(hashstr,lastbundle.bytes,sizeof(bits256));
@ -1359,7 +1359,14 @@ void iguana_initfinal(struct iguana_info *coin,bits256 lastbundle)
}
coin->origbalanceswritten = coin->balanceswritten;
iguana_volatilesinit(coin);
//iguana_fastlink(coin,coin->balanceswritten * coin->chain->bundlesize - 1);
iguana_savehdrs(coin);
if ( 1 )
{
iguana_fastlink(coin,coin->balanceswritten * coin->chain->bundlesize - 1);
hash2 = iguana_blockhash(coin,coin->balanceswritten * coin->chain->bundlesize);
if ( bits256_nonz(hash2) != 0 && (block= iguana_blockfind("initfinal",coin,hash2)) != 0 )
_iguana_chainlink(coin,block);
}
}
int32_t iguana_balanceflush(struct iguana_info *coin,int32_t refhdrsi)
@ -1751,7 +1758,6 @@ int32_t iguana_realtime_update(struct iguana_info *coin)
double startmillis0; static double totalmillis0; static int32_t num0;
struct iguana_bundle *bp; struct iguana_ramchaindata *rdata; int32_t bundlei,i,n,flag=0; bits256 hash2; struct iguana_peer *addr;
struct iguana_block *block=0; struct iguana_blockRO *B; struct iguana_ramchain *dest=0,blockR;
//starti = coin->RTheight % coin->chain->bundlesize;
if ( (bp= coin->current) != 0 && bp->hdrsi == coin->longestchain/coin->chain->bundlesize && bp->hdrsi == coin->balanceswritten && coin->RTheight >= bp->bundleheight && coin->RTheight < bp->bundleheight+bp->n && ((coin->RTheight <= coin->blocks.hwmchain.height && time(NULL) > bp->lastRT) || time(NULL) > bp->lastRT+10) )
{
if ( (block= bp->blocks[0]) == 0 || block->txvalid == 0 || block->mainchain == 0 )
@ -1759,18 +1765,14 @@ int32_t iguana_realtime_update(struct iguana_info *coin)
if ( block != 0 )
{
if ( _iguana_chainlink(coin,block) <= 0 )
iguana_blockunmark(coin,block,bp,0,1);
}
bp->issued[0] = 0;
{
struct iguana_peer *addr; //uint8_t serialized[512]; int32_t len;
hash2 = bp->hashes[0];
//char str[65]; printf("RT[0] [%d:%d] %s %p\n",bp->hdrsi,0,bits256_str(str,hash2),block);
addr = coin->peers.ranked[rand() % 8];
if ( addr != 0 && addr->usock >= 0 && addr->dead == 0 )//&& (len= iguana_getdata(coin,serialized,MSG_BLOCK,&hash2,1)) > 0 )
{
iguana_sendblockreqPT(coin,addr,bp,0,hash2,0);
//iguana_send(coin,addr,serialized,len);
iguana_blockunmark(coin,block,bp,0,0);
bp->issued[0] = 0;
hash2 = bp->hashes[0];
//char str[65]; printf("RT[0] [%d:%d] %s %p\n",bp->hdrsi,0,bits256_str(str,hash2),block);
addr = coin->peers.ranked[rand() % 8];
if ( addr != 0 && addr->usock >= 0 && addr->dead == 0 )
iguana_sendblockreqPT(coin,addr,bp,0,hash2,0);
}
}
}
@ -1804,7 +1806,7 @@ int32_t iguana_realtime_update(struct iguana_info *coin)
//bp->blocks[bundlei] = block;
//if ( bits256_nonz(hash2) != 0 )
// iguana_blockhashset("RTset",coin,bp->bundleheight+bundlei,hash2,1);
//printf("RT.%d vs hwm.%d starti.%d bp->n %d block.%p/%p ramchain.%p\n",coin->RTheight,coin->blocks.hwmchain.height,coin->RTstarti,bp->n,block,bp->blocks[bundlei],dest->H.data);
printf("RT.%d vs hwm.%d starti.%d bp->n %d block.%p/%p ramchain.%p\n",coin->RTheight,coin->blocks.hwmchain.height,coin->RTstarti,bp->n,block,bp->blocks[bundlei],dest->H.data);
if ( block != 0 && bits256_nonz(block->RO.prev_block) != 0 )
{
iguana_blocksetcounters(coin,block,dest);

41
iguana/main.c

@ -15,7 +15,7 @@
#define CHROMEAPP_NAME iguana
#define CHROMEAPP_STR "iguana"
#define CHROMEAPP_CONF "iguana.conf"
#define CHROMEAPP_CONF "iguana.config"
#define CHROMEAPP_MAIN iguana_main
#define CHROMEAPP_JSON iguana_JSON
#define CHROMEAPP_HANDLER Handler_iguana
@ -190,17 +190,18 @@ char *iguana_JSON(char *jsonstr,uint16_t port)
char *SuperNET_jsonstr(struct supernet_info *myinfo,char *jsonstr,char *remoteaddr,uint16_t port)
{
cJSON *json; char *agent,*method,*retstr = 0;
//char str[65]; printf("SuperNET_jsonstr %p %s\n",&myinfo->privkey,bits256_str(str,myinfo->privkey));
char str[65]; printf("SuperNET_jsonstr %p %s\n",&myinfo->privkey,bits256_str(str,myinfo->privkey));
if ( (json= cJSON_Parse(jsonstr)) != 0 )
{
method = jstr(json,"method");
if ( (agent= jstr(json,"agent")) != 0 && method != 0 )
retstr = SuperNET_parser(myinfo,agent,method,json,remoteaddr);
else if ( method != 0 && is_bitcoinrpc(myinfo,method,remoteaddr) >= 0 )
if ( method != 0 && is_bitcoinrpc(myinfo,method,remoteaddr) >= 0 )
retstr = iguana_bitcoinRPC(myinfo,method,json,remoteaddr,port);
else if ( (agent= jstr(json,"agent")) != 0 && method != 0 )
retstr = SuperNET_parser(myinfo,agent,method,json,remoteaddr);
else retstr = clonestr("{\"error\":\"need both agent and method\"}");
free_json(json);
} else retstr = clonestr("{\"error\":\"couldnt parse SuperNET_JSON\"}");
printf("SuperNET_jsonstr ret.(%s)\n",retstr);
return(retstr);
}
@ -231,7 +232,7 @@ char *iguana_blockingjsonstr(struct supernet_info *myinfo,char *jsonstr,uint64_t
{
struct iguana_jsonitem *ptr; char *retjsonstr = 0; int32_t len,allocsize; double expiration;
expiration = OS_milliseconds() + maxmillis;
//printf("blocking case.(%s)\n",jsonstr);
printf("blocking case.(%s)\n",jsonstr);
len = (int32_t)strlen(jsonstr);
allocsize = sizeof(*ptr) + len + 1;
ptr = mycalloc('J',1,allocsize);
@ -261,7 +262,7 @@ char *iguana_blockingjsonstr(struct supernet_info *myinfo,char *jsonstr,uint64_t
char *SuperNET_processJSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr,uint16_t port)
{
cJSON *retjson; uint64_t tag; uint32_t timeout; char *jsonstr,*method,*retjsonstr,*retstr = 0;
//char str[65]; printf("processJSON %p %s\n",&myinfo->privkey,bits256_str(str,myinfo->privkey));
char str[65]; printf("processJSON %p %s\n",&myinfo->privkey,bits256_str(str,myinfo->privkey));
if ( json != 0 )
{
if ( (tag= j64bits(json,"tag")) == 0 )
@ -273,11 +274,12 @@ char *SuperNET_processJSON(struct supernet_info *myinfo,cJSON *json,char *remote
timeout = IGUANA_JSONTIMEOUT;
if ( (method= jstr(json,"method")) != 0 && strcmp(method,"DHT") == 0 && remoteaddr != 0 )
{
printf("hexmsgprocess\n");
SuperNET_hexmsgprocess(myinfo,0,json,jstr(json,"hexmsg"),remoteaddr);
return(clonestr("{\"result\":\"processed remote DHT\"}"));
}
jsonstr = jprint(json,0);
//printf("RPC? (%s)\n",jsonstr);
printf("RPC? (%s)\n",jsonstr);
if ( remoteaddr == 0 || jstr(json,"immediate") != 0 )
retjsonstr = SuperNET_jsonstr(myinfo,jsonstr,remoteaddr,port);
else retjsonstr = iguana_blockingjsonstr(myinfo,jsonstr,tag,timeout,remoteaddr,port);
@ -291,7 +293,7 @@ char *SuperNET_processJSON(struct supernet_info *myinfo,cJSON *json,char *remote
jadd64bits(retjson,"tag",tag);
}
retstr = jprint(retjson,1);
//printf("retstr.(%s) retjsonstr.%p retjson.%p\n",retstr,retjsonstr,retjson);
printf("retstr.(%s) retjsonstr.%p retjson.%p\n",retstr,retjsonstr,retjson);
free(retjsonstr);//,strlen(retjsonstr)+1);
} else retstr = retjsonstr;
}
@ -299,6 +301,7 @@ char *SuperNET_processJSON(struct supernet_info *myinfo,cJSON *json,char *remote
} else retstr = clonestr("{\"error\":\"cant parse JSON\"}");
if ( retstr == 0 )
retstr = clonestr("{\"error\":\"null return\"}");
printf("processJSON.(%s)\n",retstr);
return(retstr);
}
@ -375,6 +378,7 @@ void mainloop(struct supernet_info *myinfo)
printf("mainloop\n");
while ( 1 )
{
//printf("main iteration\n");
if ( myinfo->expiration != 0 && time(NULL) > myinfo->expiration )
iguana_walletlock(myinfo);
flag = 0;
@ -426,10 +430,8 @@ void mainloop(struct supernet_info *myinfo)
}
pangea_queues(SuperNET_MYINFO(0));
if ( flag == 0 )
{
usleep(1000 + isRT*100000 + (numpeers == 0)*1000000);
iguana_jsonQ(); // cant do this here safely, need to send to coin specific queue
}
//iguana_jsonQ(); // cant do this here safely, need to send to coin specific queue
}
}
@ -1083,7 +1085,7 @@ int maingen(int argc, char** argv)
void iguana_main(void *arg)
{
int32_t usessl = 0, ismainnet = 1; int32_t i; struct iguana_info *btcd=0; //*btc=0,
struct supernet_info *myinfo; char *tmpstr,*helperargs,*coinargs,helperstr[512];
struct supernet_info *myinfo; char *helperargs,*coinargs,helperstr[512];
mycalloc(0,0,0);
myinfo = SuperNET_MYINFO(0);
FILE *fp; int32_t iter; void ztest(); ztest();
@ -1138,7 +1140,7 @@ void iguana_main(void *arg)
iguana_initQ(&validateQ,"validateQ");
myinfo->rpcport = IGUANA_RPCPORT;
strcpy(myinfo->rpcsymbol,"BTCD");
if ( 0 && arg != 0 )
if ( arg != 0 )
{
cJSON *argjson;
if ( (argjson= cJSON_Parse(arg)) != 0 )
@ -1169,6 +1171,8 @@ void iguana_main(void *arg)
OS_ensure_directory("purgeable/BTC");
OS_ensure_directory("purgeable/BTCD");
OS_ensure_directory(GLOBALTMPDIR);
#ifndef __PNACL__
char *tmpstr;
if ( (tmpstr= SuperNET_JSON(myinfo,cJSON_Parse("{\"agent\":\"SuperNET\",\"method\":\"help\"}"),0,myinfo->rpcport)) != 0 )
{
if ( (API_json= cJSON_Parse(tmpstr)) != 0 && (API_json= jobj(API_json,"result")) != 0 )
@ -1176,21 +1180,22 @@ void iguana_main(void *arg)
free(tmpstr);
}
printf("generated API_json\n");
#endif
if ( IGUANA_NUMHELPERS == 0 )
IGUANA_NUMHELPERS = 1;
iguana_initQ(&TerminateQ,"TerminateQ");
category_init(myinfo);
if ( (coinargs= SuperNET_keysinit(myinfo,arg)) != 0 )
iguana_launch(btcd,"iguana_coins",iguana_coins,coinargs,IGUANA_PERMTHREAD);
char *str;
{
//iguana_launch(btcd,"iguana_coins",iguana_coins,coinargs,IGUANA_PERMTHREAD);
}
if ( 0 && (str= SuperNET_JSON(myinfo,cJSON_Parse("{\"prefetchlag\":2,\"VALIDATE\":1,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"BTC\",\"startpend\":166,\"services\":1}"),0,myinfo->rpcport)) != 0 )
free(str);
btcd = iguana_coinadd("BTCD",0);
iguana_coinadd("BTC",0);
#ifdef __APPLE__
if ( 1 )
{
char *str;
if ( btcd == 0 )
{
printf("error adding BTCD.%p\n",btcd);

BIN
iguana/pnacl/Release/iguana.pexe

Binary file not shown.

40
iguana/ramchain_api.c

@ -102,46 +102,6 @@ HASH_AND_INT(bitcoinrpc,getblock,blockhash,remoteonly)
return(jprint(retjson,1));
}
int32_t iguana_ramtxbytes(struct iguana_info *coin,uint8_t *serialized,int32_t maxlen,bits256 *txidp,struct iguana_txid *tx,int32_t height,struct iguana_msgvin *vins,struct iguana_msgvout *vouts)
{
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 )
len += iguana_rwnum(rwflag,&serialized[len],sizeof(tx->timestamp),&tx->timestamp);
numvins = tx->numvins, numvouts = tx->numvouts;
len += iguana_rwvarint32(rwflag,&serialized[len],&numvins);
for (i=0; i<numvins; i++)
{
if ( vins == 0 )
iguana_vinset(coin,height,&vin,tx,i);
else vin = vins[i];
len += iguana_rwvin(rwflag,0,&serialized[len],&vin);
}
if ( len > maxlen )
return(0);
len += iguana_rwvarint32(rwflag,&serialized[len],&numvouts);
for (i=0; i<numvouts; i++)
{
if ( vouts == 0 )
iguana_voutset(coin,space,asmstr,height,&vout,tx,i);
else vout = vouts[i];
len += iguana_rwvout(rwflag,0,&serialized[len],&vout);
}
if ( len > 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 )
{
//for (i=0; i<len; i++)
// printf("%02x",serialized[i]);
char str[65],str2[65]; printf("\nrw.%d numvins.%d numvouts.%d error generating txbytes, probably due to running without stored sigs txid %s vs %s\n",rwflag,numvins,numvouts,bits256_str(str,*txidp),bits256_str(str2,tx->txid));
return(len);
}
return(len);
}
HASH_AND_INT(bitcoinrpc,getrawtransaction,txid,verbose)
{
struct iguana_txid *tx,T; char *txbytes; bits256 checktxid; int32_t len,height; cJSON *retjson;

2
pnacl_main.h

@ -40,7 +40,7 @@ void *CHROMEAPP_NAME(void *arg)
while ( initflag == 0 )
usleep(1000000);
PNACL_message("%s start.(%s)\n",CHROMEAPP_STR,(char *)arg);
CHROMEAPP_MAIN(arg);
CHROMEAPP_MAIN(0);//arg);
return(0);
}

Loading…
Cancel
Save