diff --git a/iguana/dPoW.h b/iguana/dPoW.h index c822b787c..5c54c9b6e 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -57,7 +57,7 @@ struct dpow_block struct iguana_info *coin; char *opret_symbol; uint64_t recvmask; struct dpow_entry notaries[DPOW_MAXRELAYS]; - uint32_t state,timestamp; + uint32_t state,timestamp,waiting; int32_t height,numnotaries,completed; char signedtx[32768]; }; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index e2094f7e0..a2d344343 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -65,7 +65,7 @@ int32_t dpow_rwopret(int32_t rwflag,uint8_t *opret,bits256 *hashmsg,int32_t *hei } else { - for (i=0; src[i]!=0; i++) + for (i=0; opret[opretlen]!=0; i++) src[i] = opret[opretlen++]; src[i] = 0; opretlen++; @@ -628,7 +628,7 @@ int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct iguana_info *coin,s return(retval); } -int32_t dpow_mostsignedtx(struct supernet_info *myinfo,struct dpow_info *dp,struct iguana_info *coin,uint64_t *maskp,int32_t *lastkp,struct dpow_block *bp,int32_t myind) +/*int32_t dpow_mostsignedtx(struct supernet_info *myinfo,struct dpow_info *dp,struct iguana_info *coin,uint64_t *maskp,int32_t *lastkp,struct dpow_block *bp,int32_t myind) { uint64_t mostmask=0,refmask = 0; struct dpow_entry *ep; int32_t nonz,k,i,mostk = -1,most = 0; for (k=0; knumnotaries; k++) @@ -662,7 +662,7 @@ int32_t dpow_mostsignedtx(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->signedtxid = dpow_notarytx(bp->signedtx,coin->chain->isPoS,bp,mostmask,mostk,dp->symbol); } else printf("mostsignedtx most.%d\n",most); return(most); -} +}*/ uint64_t dpow_lastk_mask(struct dpow_block *bp,int32_t *lastkp) { @@ -704,7 +704,7 @@ struct dpow_entry *dpow_notaryfind(struct supernet_info *myinfo,struct dpow_bloc void dpow_handler(struct supernet_info *myinfo,struct basilisk_message *msg) { - bits256 hashmsg,txid,commit,srchash,desthash; uint64_t mask; uint32_t channel,height,flag = 0; int32_t i,lastk,vout,myind = -1; char str[65],str2[65]; uint8_t senderpub[33]; struct dpow_sigentry dsig; struct dpow_block *bp; struct dpow_entry *ep; + bits256 hashmsg,txid,commit,srchash,desthash; uint64_t mask; uint32_t channel,height,flag = 0; int32_t i,lastk,vout,myind = -1; char *retstr,str[65],str2[65]; uint8_t senderpub[33]; struct dpow_sigentry dsig; struct dpow_block *bp; struct dpow_entry *ep; basilisk_messagekeyread(msg->key,&channel,&height,&srchash,&desthash); if ( channel == DPOW_UTXOCHANNEL || channel == DPOW_UTXOBTCCHANNEL ) { @@ -765,6 +765,19 @@ void dpow_handler(struct supernet_info *myinfo,struct basilisk_message *msg) memcpy(ep->sigs[dsig.lastk],dsig.sig,dsig.siglen); ep->beacon = dsig.beacon; printf("<<<<<<<< from.%d got lastk.%d %llx siglen.%d >>>>>>>>>\n",dsig.senderind,dsig.lastk,(long long)dsig.mask,dsig.siglen); + if ( bp->coin != 0 ) + { + bp->signedtxid = dpow_notarytx(bp->signedtx,bp->coin->chain->isPoS,bp,dsig.mask,dsig.lastk,bp->opret_symbol); + if ( bits256_nonz(bp->signedtxid) != 0 ) + { + if ( (retstr= dpow_sendrawtransaction(myinfo,bp->coin,bp->signedtx)) != 0 ) + { + printf("sendrawtransaction.(%s)\n",retstr); + free(retstr); + } + bp->state = 0xffffffff; + } + } flag = 1; } } else printf("beacon mismatch for senderind.%d %llx vs %llx\n",dsig.senderind,*(long long *)dsig.senderpub,*(long long *)bp->notaries[dsig.senderind].pubkey); @@ -778,7 +791,7 @@ void dpow_handler(struct supernet_info *myinfo,struct basilisk_message *msg) 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 - bits256 txid; int32_t vout,i,len,j,k,m,incr,haveutxo = 0; cJSON *addresses; char *sendtx,*rawtx,*retstr,*opret_symbol,coinaddr[64]; uint8_t data[4096]; uint32_t channel; bits256 srchash,desthash,zero; uint64_t mask; + bits256 txid; int32_t vout,i,len,j,k,incr,haveutxo = 0; cJSON *addresses; char *sendtx,*rawtx,*opret_symbol,coinaddr[64]; uint8_t data[4096]; uint32_t channel; bits256 srchash,desthash,zero; uint64_t mask; if ( bp->numnotaries > 8 ) incr = sqrt(bp->numnotaries) + 1; else incr = 1; @@ -854,7 +867,12 @@ uint32_t dpow_statemachineiterate(struct supernet_info *myinfo,struct dpow_info break; case 4: // wait for N/2+1 signed tx and broadcast printf("STATE4: %s BTC.%d RECVMASK.%llx\n",coin->symbol,bits256_nonz(bp->btctxid)==0,(long long)bp->recvmask); - if ( (m= dpow_mostsignedtx(myinfo,dp,coin,&mask,&k,bp,myind)) > 0 ) + if ( bp->waiting++ > 10 ) + { + bp->state = 2; + bp->waiting = 0; + } + /*if ( (m= dpow_mostsignedtx(myinfo,dp,coin,&mask,&k,bp,myind)) > 0 ) { if ( m >= bp->numnotaries/2+1 ) { @@ -870,7 +888,7 @@ uint32_t dpow_statemachineiterate(struct supernet_info *myinfo,struct dpow_info { dpow_signedtxgen(myinfo,coin,bp,mask,k,myind,opret_symbol); } - } + }*/ if ( bp->state != 0xffffffff ) bp->state = 2; break; @@ -953,7 +971,12 @@ void dpow_statemachinestart(void *ptr) { //printf("dp->ht.%d ht.%d DEST.%08x %s\n",dp->checkpoint.blockhash.height,checkpoint.blockhash.height,deststate,bits256_str(str,srchash.hash)); destbp->state = dpow_statemachineiterate(myinfo,dp,dest,destbp,myind); - } else srcbp->btctxid = destbp->signedtxid; + } + else + { + srcbp->btctxid = destbp->signedtxid; + dp->destupdated = 0; + } if ( destbp->state == 0xffffffff ) { if ( srcbp->state != 0xffffffff )