From 732e44e60dc72da097eaf986e5b492fe7440680e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Feb 2017 18:25:43 +0200 Subject: [PATCH] test --- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 42 +++++++++++++++++++++-- iguana/iguana777.c | 3 ++ iguana/iguana_notary.c | 64 +++++++++++++++++++++------------- iguana/kmd_lookup.h | 70 +++++++++++++++++++++++++++----------- 5 files changed, 135 insertions(+), 46 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 013407cf3..28517e6e0 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -179,9 +179,11 @@ char *_dex_gettxin(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_ char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address); +char *_dex_listunspent2(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listspent(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_getbalance(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *coinaddr,int32_t count,int32_t skip); +char *_dex_listtransactions2(struct supernet_info *myinfo,char *symbol,char *coinaddr,int32_t count,int32_t skip); char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol); int32_t _dex_getheight(struct supernet_info *myinfo,char *symbol); char *_dex_getnotaries(struct supernet_info *myinfo,char *symbol); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0bc7c1e4f..bb9450b6c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -543,6 +543,14 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'u' ) + { + if ( (retjson= kmd_listunspent(coin,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 's' ) { if ( (retjson= dpow_listspent(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) @@ -574,6 +582,15 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == '2' ) + { + //printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); + if ( (retjson= kmd_listtransactions(coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'C' ) { if ( (retjson= dpow_checkaddress(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) @@ -949,12 +966,12 @@ char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *addre return(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")); } -char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) +char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *address,uint8_t arg) { struct dex_request dexreq; char *retstr; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); - dexreq.func = 'U'; + dexreq.func = arg; if ( (retstr= _dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")) != 0 ) { //printf("UNSPENTS.(%s)\n",retstr); @@ -962,6 +979,16 @@ char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) return(_dex_arrayreturn(retstr)); } +char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) +{ + return(_dex_listunspentarg(myinfo,symbol,address,'U')); +} + +char *_dex_listunspent2(struct supernet_info *myinfo,char *symbol,char *address) +{ + return(_dex_listunspentarg(myinfo,symbol,address,'u')); +} + char *_dex_listspent(struct supernet_info *myinfo,char *symbol,char *address) { struct dex_request dexreq; char *retstr; @@ -999,6 +1026,17 @@ char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *addr return(_dex_arrayreturn(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,""))); } +char *_dex_listtransactions2(struct supernet_info *myinfo,char *symbol,char *address,int32_t count,int32_t skip) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.intarg = skip; + dexreq.shortarg = count; + dexreq.func = '2'; + return(_dex_arrayreturn(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,""))); +} + int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) { int32_t i,firstz = -1; diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 947ff0515..2ec4754cc 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -885,7 +885,10 @@ void iguana_coinloop(void *arg) coins++; coin = coins[0]; if ( (coin->notarychain= iguana_isnotarychain(coin->symbol)) >= 0 ) + { coin->VALIDATENODE = 0; + coin->DEXEXPLORER = myinfo->DEXEXPLORER; + } //if ( coin->FULLNODE > 0 ) // coin->notarychain = -1; printf("begin coinloop[%d] %s notarychain.%d\n",n,coin->symbol,coin->notarychain); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 368ca4852..41b7f48f6 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -703,57 +703,73 @@ THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb) TWO_STRINGS(dex,listunspent2,symbol,address) { cJSON *retjson; - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( strcmp(coin->symbol,"BTC") == 0 ) - return(clonestr("[]")); - if ( (retjson= kmd_listunspent(coin,address)) != 0 ) - return(jprint(retjson,1)); + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + { + if ( strcmp(coin->symbol,"BTC") == 0 || coin->DEXEXPLORER == 0 ) + return(clonestr("[]")); + if ( (retjson= kmd_listunspent(coin,address)) != 0 ) + return(jprint(retjson,1)); + } } - return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); + if ( symbol != 0 && address != 0 ) + return(_dex_listunspent2(myinfo,symbol,address)); + else return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); } TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions2,symbol,address,count,skip) { cJSON *retjson; - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( strcmp(coin->symbol,"BTC") == 0 ) - return(clonestr("[]")); - if ( (retjson= kmd_listtransactions(coin,address,count,skip)) != 0 ) - return(jprint(retjson,1)); + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + { + if ( strcmp(coin->symbol,"BTC") == 0 || coin->DEXEXPLORER == 0 ) + return(clonestr("[]")); + if ( (retjson= kmd_listtransactions(coin,address,count,skip)) != 0 ) + return(jprint(retjson,1)); + } } - return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); + if ( symbol != 0 && address != 0 ) + return(_dex_listtransactions2(myinfo,symbol,address,count,skip)); + else return(clonestr("{\"error\":\"dex listunspent2 null symbol, address or coin\"}")); } HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_gettxin(coin,txid,vout),1)); - return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); - } else return(_dex_gettxin(myinfo,symbol,txid,vout)); + } + if ( symbol != 0 ) + return(_dex_gettxin(myinfo,symbol,txid,vout)); + else return(clonestr("{\"error\":\"dex gettxin null symbolor coin\"}")); } TWO_STRINGS(dex,listspent,symbol,address) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_listspent(coin,address),1)); - return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); - } else return(_dex_listspent(myinfo,symbol,address)); + } + if ( symbol != 0 && address != 0 ) + return(_dex_listspent(myinfo,symbol,address)); + else return(clonestr("{\"error\":\"dex listspent null symbol, address or coin\"}")); } TWO_STRINGS(dex,getbalance,symbol,address) { - if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->DEXEXPLORER != 0 ) { - if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 ) + if ( symbol != 0 && address != 0 && (coin= iguana_coinfind(symbol)) != 0 && coin->DEXEXPLORER != 0 ) return(jprint(kmd_getbalance(coin,address),1)); - return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); - } else return(_dex_getbalance(myinfo,symbol,address)); + } + if ( symbol != 0 && address != 0 ) + return(_dex_getbalance(myinfo,symbol,address)); + else return(clonestr("{\"error\":\"dex getbalance null symbol, address or coin\"}")); } STRING_ARG(dex,explorer,symbol) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c31488091..e52ad1c36 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -28,7 +28,7 @@ struct kmd_voutinfo struct kmd_transaction { - bits256 txid; int32_t height,numvouts,numvins; uint32_t timestamp,pad; + bits256 txid; int32_t height,numvouts,numvins; uint32_t timestamp; struct kmd_voutinfo vouts[]; } PACKED; @@ -44,8 +44,8 @@ struct kmd_transactionhh struct kmd_addresshh { UT_hash_handle hh; - uint8_t type_rmd160[21], pad; struct kmd_transactionhh *prev,*lastprev; + uint8_t type_rmd160[21], pad; }; struct kmd_addresshh *_kmd_address(struct iguana_info *coin,uint8_t type_rmd160[21]) @@ -98,7 +98,7 @@ struct kmd_transactionhh *kmd_transaction(struct iguana_info *coin,bits256 txid) int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vini,bits256 txid,int32_t vout) { - struct kmd_transactionhh *ptr,*spendptr=0; long savepos; struct kmd_transaction T; + struct kmd_transactionhh *ptr,*spendptr=0; if ( bits256_nonz(txid) == 0 || vout < 0 ) return(0); // coinbase must be if ( (ptr= kmd_transaction(coin,txid)) != 0 && vout < ptr->numvouts && (spendptr= kmd_transaction(coin,spendtxid)) != 0 ) @@ -108,7 +108,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi { ptr->tx->vouts[vout].spendtxid = spendtxid; ptr->tx->vouts[vout].spendvini = vini; - if ( coin->kmd_txidfp != 0 && 0 ) + /*if ( coin->kmd_txidfp != 0 && 0 ) { char str[65],str2[65]; //printf("write out spent ht.%d vout.%d\n",ptr->tx->height,vout); @@ -121,7 +121,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi fflush(coin->kmd_txidfp); } else printf("vin write validation error ht.%d vout.%d fpos.%ld %s vs %s [%d vs %d]\n",ptr->tx->height,vout,ptr->fpos,bits256_str(str,T.txid),bits256_str(str2,ptr->tx->txid),T.numvouts,ptr->tx->numvouts); fseek(coin->kmd_txidfp,savepos,SEEK_SET); - } + }*/ } return(0); } @@ -232,15 +232,48 @@ FILE *kmd_txidinit(struct iguana_info *coin) } else break; } fseek(fp,lastpos,SEEK_SET); - /*HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) + HASH_ITER(hh,coin->kmd_transactions,ptr,tmp) { - for (i=0; inumvins; i++) + //printf("scan for spends ht.%d\n",ptr->tx->height); + for (i=0; inumvouts; i++) { vptr = &ptr->tx->vouts[i]; - if ( kmd_transactionvin(coin,ptr->tx->txid,i,ptr->tx->vins[i].txid,ptr->tx->vins[i].vout) < 0 ) - printf("error vini.%d ht.%d\n",i,ptr->tx->height); + if ( vptr->spendvini >= 0 && bits256_nonz(vptr->spendtxid) != 0 ) + { + if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) + { + printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); + } + //else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); + } + } + } + } else fp = fopen(fname,"wb+"); + return(fp); +} + +FILE *kmd_spendinit(struct iguana_info *coin) +{ + int32_t i,numvins,spentvout; FILE *fp; char fname[1024],str[65]; bits256 txid,spenttxid; struct kmd_transactionhh *ptr,*tmp; struct kmd_voutinfo *vptr; long lastpos=0; + sprintf(fname,"%s/TRANSACTIONS/%s.spends",GLOBAL_DBDIR,coin->symbol); + if ( (fp= fopen(fname,"rb+")) != 0 ) + { + while ( fread(&txid,1,sizeof(txid),fp) == sizeof(txid) ) + { + if ( fread(&numvins,1,sizeof(numvins),fp) == sizeof(numvins) ) + { + for (i=0; ikmd_transactions,ptr,tmp) { //printf("scan for spends ht.%d\n",ptr->tx->height); @@ -249,11 +282,10 @@ FILE *kmd_txidinit(struct iguana_info *coin) vptr = &ptr->tx->vouts[i]; if ( vptr->spendvini >= 0 && bits256_nonz(vptr->spendtxid) != 0 ) { - if ( (ptr->ptrs[(i<<1) + 1]= kmd_transaction(coin,vptr->spendtxid)) == 0 ) + if ( ptr->ptrs[(i<<1) + 1] != kmd_transaction(coin,vptr->spendtxid) ) { - printf("cant find %s spend.%d\n",bits256_str(str,vptr->spendtxid),i); + printf("mismatch %s spend.%d %p %p\n",bits256_str(str,vptr->spendtxid),i,ptr->ptrs[(i<<1) + 1],kmd_transaction(coin,vptr->spendtxid)); } - //else printf("set spent.%p ht.%d vout.%d\n",ptr->ptrs[(i<<1)+1],ptr->tx->height,i); } } } @@ -446,7 +478,8 @@ cJSON *kmd_getbalance(struct iguana_info *coin,char *coinaddr) bitcoin_address(address,addr->type_rmd160[0],&addr->type_rmd160[1],20); s = r = 0; balance += _kmd_getbalance(coin,address,&r,&s); - printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); + if ( (r - s) > 100000*SATOSHIDEN ) + printf("{\"address\":\"%s\",\"received\":%.8f,\"sent\":%.8f,\"balance\":%.8f,\"supply\":%.8f}\n",address,dstr(r),dstr(s),dstr(r)-dstr(s),dstr(balance)); received += r; sent += s; } @@ -511,13 +544,10 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) int32_t h,num=0,loadheight,i,n,j,iter,numtxids,numvins,numvouts,flag=0,height=-1; cJSON *txjson,*vouts,*vins,*blockjson,*txids,*vout,*vin,*sobj,*addresses; bits256 zero,txid; char *curlstr,params[128],str[65]; struct kmd_transactionhh *ptr; struct kmd_transaction *tx; uint8_t type_rmd160[21]; if ( coin->kmd_didinit == 0 ) { - char fname[1024]; if ( (coin->kmd_txidfp= kmd_txidinit(coin)) == 0 ) - printf("error initializing %s.kmd lookups\n",coin->symbol); - sprintf(fname,"%s/TRANSACTIONS/%s.spends",GLOBAL_DBDIR,coin->symbol); - if ( (coin->kmd_spendfp= fopen(fname,"rb+")) != 0 ) - fseek(coin->kmd_spendfp,0,SEEK_END); - else coin->kmd_spendfp = fopen(fname,"wb+"); + printf("error initializing %s.kmd txid\n",coin->symbol); + else if ( (coin->kmd_spendfp= kmd_spendinit(coin)) == 0 ) + printf("error initializing %s.kmd spend\n",coin->symbol); coin->kmd_didinit = 1; } height = kmd_height(coin);