From e556d4181044ce71cc2f68a0afcfcd927964cc26 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 14 Oct 2016 13:28:52 -0300 Subject: [PATCH] test --- deprecated/obsolete.h | 41 +++++++++ iguana/dpow/dpow_fsm.c | 22 +++-- iguana/dpow/dpow_tx.c | 184 ++++++++++++----------------------------- 3 files changed, 109 insertions(+), 138 deletions(-) diff --git a/deprecated/obsolete.h b/deprecated/obsolete.h index 44228d604..0a53db822 100755 --- a/deprecated/obsolete.h +++ b/deprecated/obsolete.h @@ -19382,6 +19382,47 @@ len = 0; } }*/ + /*if ( vins == 0 && bitweight(bestmask) == DPOW_M(bp) ) + { + if ( (rawtx2= dpow_decoderawtransaction(myinfo,coin,rawtx)) != 0 ) + { + if ( (txobj= cJSON_Parse(rawtx2)) != 0 ) + { + vins = jduplicate(jobj(txobj,"vin")); + free_json(txobj); + //printf("generated vins.(%s)\n",jprint(vins,0)); + } + free(rawtx2); + } + if ( vins != 0 ) + { + flag = 1; + n = cJSON_GetArraySize(vins); + k = (bp->height % bp->numnotaries) % bp->numnotaries; + for (i=0; i= bp->numnotaries ) + k = 0; + item = jitem(vins,i); + //printf("(%s) i.%d of %d, (%d) k.%d bestmask.%llx\n",jprint(item,0),i,n,(bp->height % bp->numnotaries) % bp->numnotaries,k,(long long)bestmask); + if ( bits256_nonz(bp->notaries[k].prev_hash) == 0 ) + { + bp->notaries[k].prev_hash = jbits256(item,"txid"); + if ( bits256_nonz(bp->notaries[k].prev_hash) != 0 ) + { + bp->notaries[k].prev_vout = jint(item,"vout"); + bp->recvmask |= (1LL << k); + printf(">>>>>>>> rawtx utxo.%d %s/v%d %llx\n",k,bits256_str(str,bp->notaries[k].prev_hash),bp->notaries[k].prev_vout,(long long)bp->recvmask); + } + } + if ( i < n-1 ) + k++; + } + if ( k != bestk ) + printf("extracted uxto k.%d != bestk.%d %llx\n",k,bestk,(long long)bestmask); + } + }*/ uint64_t dpow_maskmin(uint64_t refmask,struct dpow_block *bp,int32_t *lastkp) { diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 287e9e356..88cca66e7 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -13,6 +13,20 @@ * * ******************************************************************************/ +struct dpow_entry *dpow_notaryfind(struct supernet_info *myinfo,struct dpow_block *bp,int32_t *senderindp,uint8_t *senderpub) +{ + int32_t i; + *senderindp = -1; + for (i=0; inumnotaries; i++) + { + if ( memcmp(bp->notaries[i].pubkey,senderpub,33) == 0 ) + { + *senderindp = i; + return(&bp->notaries[i]); + } + } + return(0); +} void dpow_datahandler(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t channel,uint32_t height,uint8_t *data,int32_t datalen) { @@ -79,7 +93,7 @@ void dpow_datahandler(struct supernet_info *myinfo,struct dpow_block *bp,uint32_ if ( dsig.lastk < bp->numnotaries && dsig.senderind < bp->numnotaries && (ep= dpow_notaryfind(myinfo,bp,&senderind,dsig.senderpub)) != 0 ) { vcalc_sha256(0,commit.bytes,dsig.beacon.bytes,sizeof(dsig.beacon)); - if ( memcmp(dsig.senderpub,bp->notaries[dsig.senderind].pubkey,33) == 0 ) //bits256_cmp(ep->commit,commit) == 0 && + if ( memcmp(dsig.senderpub,bp->notaries[dsig.senderind].pubkey,33) == 0 ) { if ( ep->masks[dsig.lastk] == 0 ) { @@ -87,8 +101,6 @@ void dpow_datahandler(struct supernet_info *myinfo,struct dpow_block *bp,uint32_ ep->siglens[dsig.lastk] = dsig.siglen; memcpy(ep->sigs[dsig.lastk],dsig.sig,dsig.siglen); ep->beacon = dsig.beacon; - //for (j=0; j>>>>>>>>\n",bp->coin->symbol,dsig.senderind,dsig.lastk,(long long)dsig.mask,dsig.siglen); mask = dpow_maskmin(ep->recvmask,bp,&lastk); if ( (mask & bp->recvmask) == mask ) @@ -147,7 +159,6 @@ int32_t dpow_update(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t { struct dpow_entry *ep; ep = &bp->notaries[myind]; - //dpow_channelget(myinfo,bp,channel); if ( (bp->bestk= dpow_bestk(bp,&bp->bestmask)) >= 0 ) { if ( ep->masks[bp->bestk] == 0 ) @@ -155,10 +166,8 @@ int32_t dpow_update(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t else dpow_sigsend(myinfo,bp,myind,bp->bestk,bp->bestmask,srchash,sigchannel); } - //dpow_channelget(myinfo,bp,txidchannel); if ( bp->state != 0xffffffff ) { - //dpow_channelget(myinfo,bp,sigchannel); if ( ep->masks[bp->bestk] == 0 ) dpow_signedtxgen(myinfo,bp->coin,bp,bp->bestk,bp->bestmask,myind,bp->opret_symbol,sigchannel); else dpow_sigsend(myinfo,bp,myind,bp->bestk,bp->bestmask,srchash,sigchannel); @@ -168,7 +177,6 @@ int32_t dpow_update(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t uint32_t dpow_statemachineiterate(struct supernet_info *myinfo,struct dpow_info *dp,struct iguana_info *coin,struct dpow_block *bp,int32_t myind) { - // todo: add RBF support int32_t j,match,sigmatch,len,vout,incr,haveutxo = 0; cJSON *addresses; char *sendtx,*rawtx,*opret_symbol,coinaddr[64]; uint32_t channel,sigchannel,txidchannel; bits256 txid,srchash,zero; uint8_t data[4096]; int8_t lastk; uint64_t sigsmask; if ( bp->numnotaries > 8 ) incr = sqrt(bp->numnotaries) + 1; diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 6256f2f23..2f01a2c7e 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -71,25 +71,10 @@ struct dpow_block *dpow_heightfind(struct supernet_info *myinfo,int32_t height,i else return(myinfo->DPOW.srcblocks!=0?myinfo->DPOW.srcblocks[height]:0); } -struct dpow_entry *dpow_notaryfind(struct supernet_info *myinfo,struct dpow_block *bp,int32_t *senderindp,uint8_t *senderpub) +bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,char *src,int32_t usesigs) { - int32_t i; - *senderindp = -1; - for (i=0; inumnotaries; i++) - { - if ( memcmp(bp->notaries[i].pubkey,senderpub,33) == 0 ) - { - *senderindp = i; - return(&bp->notaries[i]); - } - } - return(0); -} - -bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,char *src) -{ - uint32_t i,j,m,numsigs,locktime,numvouts,version,opretlen,siglen,len,sequenceid = 0xffffffff; - uint64_t satoshis,satoshisB; uint8_t serialized[32768],opret[1024],data[4096]; + uint32_t k,j,m,numsigs,locktime,numvouts,version,opretlen,siglen,len,sequenceid = 0xffffffff; + uint64_t satoshis,satoshisB; uint8_t serialized[32768],opret[1024],data[4096]; struct dpow_entry *ep; len = locktime = numsigs = 0; version = 1; len += iguana_rwnum(1,&serialized[len],sizeof(version),&version); @@ -99,25 +84,29 @@ bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow len += iguana_rwvarint32(1,&serialized[len],(uint32_t *)&m); for (j=m=0; jnumnotaries; j++) { - i = ((bp->height % bp->numnotaries) + j) % bp->numnotaries; - if ( ((1LL << i) & bestmask) != 0 ) + k = ((bp->height % bp->numnotaries) + j) % bp->numnotaries; + if ( ((1LL << k) & bestmask) != 0 ) { - if ( bits256_nonz(bp->notaries[i].prev_hash) == 0 ) - return(bp->notaries[i].prev_hash); - len += iguana_rwbignum(1,&serialized[len],sizeof(bp->notaries[i].prev_hash),bp->notaries[i].prev_hash.bytes); - len += iguana_rwnum(1,&serialized[len],sizeof(bp->notaries[i].prev_vout),&bp->notaries[i].prev_vout); - siglen = bp->notaries[i].siglens[bestk]; - len += iguana_rwvarint32(1,&serialized[len],&siglen); - if ( siglen > 0 && siglen <= sizeof(bp->notaries[i].sigs[bestk]) ) + ep = &bp->notaries[k]; + if ( bits256_nonz(ep->prev_hash) == 0 ) + return(ep->prev_hash); + len += iguana_rwbignum(1,&serialized[len],sizeof(ep->prev_hash),ep->prev_hash.bytes); + len += iguana_rwnum(1,&serialized[len],sizeof(ep->prev_vout),&ep->prev_vout); + siglen = ep->siglens[bestk]; + if ( usesigs != 0 ) { - memcpy(&serialized[len],bp->notaries[i].sigs[bestk],siglen); - len += siglen; - numsigs++; - } + len += iguana_rwvarint32(1,&serialized[len],&siglen); + if ( siglen > 0 && siglen <= sizeof(ep->sigs[bestk]) ) + { + memcpy(&serialized[len],ep->sigs[bestk],siglen); + len += siglen; + numsigs++; + } + } else serialized[len++] = 0; len += iguana_rwnum(1,&serialized[len],sizeof(sequenceid),&sequenceid); //printf("height.%d mod.%d VINI.%d <- i.%d j.%d\n",height,height % numnotaries,m,i,j); m++; - if ( m == DPOW_M(bp) && i == bestk ) + if ( m == DPOW_M(bp) && k == bestk ) break; } } @@ -151,110 +140,45 @@ bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow return(bits256_doublesha256(0,serialized,len)); } -cJSON *dpow_createtx(struct iguana_info *coin,cJSON **vinsp,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t usesigs) +cJSON *dpow_vins(struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t usesigs) { - int32_t i,j,m=0,siglen; char scriptstr[256]; cJSON *txobj=0,*vins=0,*item; uint64_t satoshis; uint8_t script[35],*sig; - if ( (txobj= bitcoin_txcreate(coin->chain->isPoS,0,1,0)) != 0 ) + int32_t k,j,m=0; uint8_t script[35]; char scriptstr[256]; cJSON *vins=0,*item; struct dpow_entry *ep; + vins = cJSON_CreateArray(); + for (j=0; jnumnotaries; j++) { - jaddnum(txobj,"suppress",1); - jaddnum(txobj,"timestamp",bp->timestamp); - vins = cJSON_CreateArray(); - for (j=0; jnumnotaries; j++) + k = ((bp->height % bp->numnotaries) + j) % bp->numnotaries; + if ( ((1LL << k) & bestmask) != 0 ) { - i = ((bp->height % bp->numnotaries) + j) % bp->numnotaries; - if ( ((1LL << i) & bestmask) != 0 ) + ep = &bp->notaries[k]; + if ( bits256_nonz(ep->prev_hash) != 0 ) { - if ( bits256_nonz(bp->notaries[i].prev_hash) != 0 ) - { - item = cJSON_CreateObject(); - jaddbits256(item,"txid",bp->notaries[i].prev_hash); - jaddnum(item,"vout",bp->notaries[i].prev_vout); - script[0] = 33; - memcpy(script+1,bp->notaries[i].pubkey,33); - script[34] = CHECKSIG; - init_hexbytes_noT(scriptstr,script,35); - jaddstr(item,"scriptPubKey",scriptstr); - sig = 0, siglen = 0; - if ( usesigs != 0 && bp->notaries[i].siglens[bestk] > 0 ) - { - init_hexbytes_noT(scriptstr,bp->notaries[i].sigs[bestk],bp->notaries[i].siglens[bestk]); - jaddstr(item,"scriptSig",scriptstr); - //printf("sig%d.(%s)\n",i,scriptstr); - sig = bp->notaries[i].sigs[bestk]; - siglen = bp->notaries[i].siglens[bestk]; - } - jaddi(vins,item); - bitcoin_txinput(coin,txobj,bp->notaries[i].prev_hash,bp->notaries[i].prev_vout,0xffffffff,script,sizeof(script),0,0,0,0,sig,siglen); - //printf("height.%d mod.%d VINI.%d <- i.%d j.%d\n",height,height % numnotaries,m,i,j); - m++; - if ( m == DPOW_M(bp) && i == bestk ) - break; - } - else - { - free_json(vins), vins = 0; - free_json(txobj); - return(0); - } + item = cJSON_CreateObject(); + jaddbits256(item,"txid",ep->prev_hash); + jaddnum(item,"vout",ep->prev_vout); + script[0] = 33; + memcpy(script+1,ep->pubkey,33); + script[34] = CHECKSIG; + init_hexbytes_noT(scriptstr,script,35); + jaddstr(item,"scriptPubKey",scriptstr); + jaddi(vins,item); + //printf("height.%d mod.%d VINI.%d <- i.%d j.%d\n",height,height % numnotaries,m,i,j); + m++; + if ( m == DPOW_M(bp) && k == bestk ) + break; + } + else + { + free_json(vins); + return(0); } } - satoshis = DPOW_UTXOSIZE * m * .76; - script[0] = 33; - decode_hex(script+1,33,CRYPTO777_PUBSECPSTR); - script[34] = CHECKSIG; - txobj = bitcoin_txoutput(txobj,script,sizeof(script),satoshis); } - *vinsp = vins; - if ( 0 && usesigs != 0 ) - printf("%s createtx.(%s)\n",coin->symbol,jprint(txobj,0)); - return(txobj); + return(vins); } - void dpow_rawtxsign(struct supernet_info *myinfo,struct iguana_info *coin,struct dpow_block *bp,char *rawtx,cJSON *vins,int8_t bestk,uint64_t bestmask,int32_t myind,uint32_t sigchannel) { int32_t j,m=0,flag=0,retval=-1; char *jsonstr,*signedtx,*rawtx2,*sigstr; cJSON *signobj,*sobj,*txobj2,*item,*vin; bits256 srchash; struct dpow_entry *ep = &bp->notaries[myind]; - /*if ( vins == 0 && bitweight(bestmask) == DPOW_M(bp) ) - { - if ( (rawtx2= dpow_decoderawtransaction(myinfo,coin,rawtx)) != 0 ) - { - if ( (txobj= cJSON_Parse(rawtx2)) != 0 ) - { - vins = jduplicate(jobj(txobj,"vin")); - free_json(txobj); - //printf("generated vins.(%s)\n",jprint(vins,0)); - } - free(rawtx2); - } - if ( vins != 0 ) - { - flag = 1; - n = cJSON_GetArraySize(vins); - k = (bp->height % bp->numnotaries) % bp->numnotaries; - for (i=0; i= bp->numnotaries ) - k = 0; - item = jitem(vins,i); - //printf("(%s) i.%d of %d, (%d) k.%d bestmask.%llx\n",jprint(item,0),i,n,(bp->height % bp->numnotaries) % bp->numnotaries,k,(long long)bestmask); - if ( bits256_nonz(bp->notaries[k].prev_hash) == 0 ) - { - bp->notaries[k].prev_hash = jbits256(item,"txid"); - if ( bits256_nonz(bp->notaries[k].prev_hash) != 0 ) - { - bp->notaries[k].prev_vout = jint(item,"vout"); - bp->recvmask |= (1LL << k); - printf(">>>>>>>> rawtx utxo.%d %s/v%d %llx\n",k,bits256_str(str,bp->notaries[k].prev_hash),bp->notaries[k].prev_vout,(long long)bp->recvmask); - } - } - if ( i < n-1 ) - k++; - } - if ( k != bestk ) - printf("extracted uxto k.%d != bestk.%d %llx\n",k,bestk,(long long)bestmask); - } - }*/ m = 0; if ( (jsonstr= dpow_signrawtransaction(myinfo,coin,rawtx,vins)) != 0 ) { @@ -298,7 +222,7 @@ void dpow_rawtxsign(struct supernet_info *myinfo,struct iguana_info *coin,struct int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t myind,char *opret_symbol,uint32_t sigchannel) { - int32_t j,incr,numsigs,retval=-1; char rawtx[32768]; cJSON *txobj,*vins; bits256 txid,srchash,zero; struct dpow_entry *ep; + int32_t j,incr,numsigs,retval=-1; char rawtx[32768]; cJSON *vins; bits256 txid,srchash,zero; struct dpow_entry *ep; if ( bp->numnotaries < 8 ) incr = 1; else incr = sqrt(bp->numnotaries) + 1; @@ -309,9 +233,9 @@ int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct iguana_info *coin,s return(-1); for (j=0; jDPOW.minerkey33[j+1]; - if ( (txobj= dpow_createtx(coin,&vins,bp,bestk,bestmask,1)) != 0 ) + if ( (vins= dpow_vins(coin,bp,bestk,bestmask,1)) != 0 ) { - txid = dpow_notarytx(rawtx,&numsigs,coin->chain->isPoS,bp,bestk,bestmask,opret_symbol); + txid = dpow_notarytx(rawtx,&numsigs,coin->chain->isPoS,bp,bestk,bestmask,opret_symbol,0); if ( bits256_nonz(txid) != 0 && rawtx[0] != 0 ) // send tx to share utxo set { /*memset(&tmp,0,sizeof(tmp)); @@ -324,9 +248,7 @@ int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct iguana_info *coin,s dpow_send(myinfo,bp,zero,bp->hashmsg,(bits256_nonz(bp->btctxid) == 0) ? DPOW_BTCTXIDCHANNEL : DPOW_TXIDCHANNEL,bp->height,txdata,len+32,bp->txidcrcs);*/ dpow_rawtxsign(myinfo,coin,bp,rawtx,vins,bestk,bestmask,myind,sigchannel); } - free_json(txobj); - //fprintf(stderr,"free vins\n"); - //free_json(vins); + free_json(vins); } return(retval); } @@ -337,7 +259,7 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t memset(zero.bytes,0,sizeof(zero)); if ( bp->state != 0xffffffff && bp->coin != 0 ) { - bp->signedtxid = dpow_notarytx(bp->signedtx,&numsigs,bp->coin->chain->isPoS,bp,bp->bestk,bp->bestmask,bp->opret_symbol); + bp->signedtxid = dpow_notarytx(bp->signedtx,&numsigs,bp->coin->chain->isPoS,bp,bp->bestk,bp->bestmask,bp->opret_symbol,1); printf("%s numsigs.%d signedtx.(%s)\n",bits256_str(str,bp->signedtxid),numsigs,bp->signedtx); bp->state = 1; if ( bits256_nonz(bp->signedtxid) != 0 && numsigs == DPOW_M(bp) )