jl777 9 years ago
parent
commit
fa917a6479
  1. 32
      iguana/dpow/dpow_fsm.c
  2. 36
      iguana/dpow/dpow_network.c

32
iguana/dpow/dpow_fsm.c

@ -107,7 +107,7 @@ void dpow_sync(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo
int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t channel,uint32_t height,uint8_t *data,int32_t datalen) int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t channel,uint32_t height,uint8_t *data,int32_t datalen)
{ {
bits256 txid,commit,srchash,hashmsg; struct dpow_block *bp = 0; uint32_t flag = 0; int32_t src_or_dest,senderind,i,rlen,myind = -1; char str[65],str2[65]; struct dpow_sigentry dsig; struct dpow_entry *ep; struct dpow_coinentry *cp; struct dpow_utxoentry U; struct iguana_info *coin; bits256 txid,commit,srchash,hashmsg; struct dpow_block *bp = 0; uint32_t flag = 0; int32_t src_or_dest,senderind,i,iter,rlen,myind = -1; char str[65],str2[65]; struct dpow_sigentry dsig; struct dpow_entry *ep; struct dpow_coinentry *cp; struct dpow_utxoentry U; struct iguana_info *coin;
if ( (bp= dpow_heightfind(myinfo,dp,height)) == 0 ) if ( (bp= dpow_heightfind(myinfo,dp,height)) == 0 )
{ {
if ( (rand() % 100) == 0 && height > 0 ) if ( (rand() % 100) == 0 && height > 0 )
@ -122,10 +122,9 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,uint3
} }
for (i=0; i<32; i++) for (i=0; i<32; i++)
srchash.bytes[i] = dp->minerkey33[i+1]; srchash.bytes[i] = dp->minerkey33[i+1];
if ( channel == DPOW_ENTRIESCHANNEL || channel == DPOW_BTCENTRIESCHANNEL ) if ( channel == DPOW_ENTRIESCHANNEL )
{ {
struct dpow_entry notaries[DPOW_MAXRELAYS]; uint8_t n; int8_t bestk; struct dpow_coinentry *ptr,*refptr; struct dpow_entry notaries[DPOW_MAXRELAYS]; uint8_t n; int8_t bestk; struct dpow_coinentry *ptr,*refptr;
src_or_dest = (channel == DPOW_BTCENTRIESCHANNEL);
rlen = 0; rlen = 0;
bestk = data[rlen++]; bestk = data[rlen++];
n = data[rlen++]; n = data[rlen++];
@ -136,12 +135,10 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,uint3
memset(notaries,0,sizeof(notaries)); memset(notaries,0,sizeof(notaries));
for (i=0; i<64; i++) for (i=0; i<64; i++)
notaries[i].bestk = -1; notaries[i].bestk = -1;
rlen += dpow_rwcoinentrys(0,&data[rlen],src_or_dest,notaries,n,bestk); rlen += dpow_rwcoinentrys(0,&data[rlen],notaries,n,bestk);
//printf("matched hashmsg rlen.%d vs datalen.%d\n",rlen,datalen); //printf("matched hashmsg rlen.%d vs datalen.%d\n",rlen,datalen);
for (i=0; i<n; i++) for (i=0; i<n; i++)
{ {
ptr = src_or_dest != 0 ? &notaries[i].dest : &notaries[i].src;
refptr = src_or_dest != 0 ? &bp->notaries[i].dest : &bp->notaries[i].src;
if ( bits256_nonz(ptr->prev_hash) != 0 ) if ( bits256_nonz(ptr->prev_hash) != 0 )
{ {
if ( bits256_nonz(refptr->prev_hash) == 0 ) if ( bits256_nonz(refptr->prev_hash) == 0 )
@ -152,16 +149,21 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,uint3
bp->recvmask |= (1LL << i); bp->recvmask |= (1LL << i);
} }
} }
if ( (bestk= notaries[i].bestk) >= 0 ) for (iter=0; iter<2; iter++)
{ {
if ( ptr->siglens[bestk] > 0 && refptr->siglens[bestk] == 0 ) ptr = iter != 0 ? &notaries[i].dest : &notaries[i].src;
refptr = iter != 0 ? &bp->notaries[i].dest : &bp->notaries[i].src;
if ( (bestk= notaries[i].bestk) >= 0 )
{ {
printf(">>>>>>>>>> got siglen.%d for [%d] indirectly <<<<<<<<<<\n",ptr->siglens[bestk],i); if ( ptr->siglens[bestk] > 0 && refptr->siglens[bestk] == 0 )
memcpy(refptr->sigs[bestk],ptr->sigs[bestk],ptr->siglens[bestk]); {
refptr->siglens[bestk] = ptr->siglens[bestk]; printf(">>>>>>>>>> got siglen.%d for [%d] indirectly <<<<<<<<<<\n",ptr->siglens[bestk],i);
if ( src_or_dest != 0 ) memcpy(refptr->sigs[bestk],ptr->sigs[bestk],ptr->siglens[bestk]);
bp->destsigsmasks[bestk] |= (1LL << i); refptr->siglens[bestk] = ptr->siglens[bestk];
else bp->srcsigsmasks[bestk] |= (1LL << i); if ( iter != 0 )
bp->destsigsmasks[bestk] |= (1LL << i);
else bp->srcsigsmasks[bestk] |= (1LL << i);
}
} }
} }
} }
@ -354,7 +356,7 @@ int32_t dpow_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo
} }
if ( bp->isratify != 0 || (rand() % 10) == 0 ) if ( bp->isratify != 0 || (rand() % 10) == 0 )
{ {
dpow_sendcoinentrys(myinfo,dp,bp,bp->state < 1000); dpow_sendcoinentrys(myinfo,dp,bp);
bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk);
printf("ht.%d numnotaries.%d BEST.%llx from RECV.%llx bestk.%d\n",bp->height,bp->numnotaries,(long long)bp->bestmask,(long long)bp->recvmask,bp->bestk); printf("ht.%d numnotaries.%d BEST.%llx from RECV.%llx bestk.%d\n",bp->height,bp->numnotaries,(long long)bp->bestmask,(long long)bp->recvmask,bp->bestk);
} }

36
iguana/dpow/dpow_network.c

@ -155,35 +155,41 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) { }
#endif #endif
int32_t dpow_rwcoinentry(int32_t rwflag,uint8_t *serialized,struct dpow_coinentry *ptr,int8_t *bestkp) int32_t dpow_rwcoinentry(int32_t rwflag,uint8_t *serialized,struct dpow_coinentry *src,struct dpow_coinentry *dest,int8_t *bestkp)
{ {
int8_t bestk; int32_t siglen,len = 0; int8_t bestk; struct dpow_coinentry *ptr; int32_t siglen,iter,len = 0;
len += iguana_rwbignum(rwflag,&serialized[len],sizeof(ptr->prev_hash),ptr->prev_hash.bytes); len += iguana_rwbignum(rwflag,&serialized[len],sizeof(src->prev_hash),src->prev_hash.bytes);
len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->prev_vout),(uint32_t *)&ptr->prev_vout); len += iguana_rwnum(rwflag,&serialized[len],sizeof(src->prev_vout),(uint32_t *)&src->prev_vout);
len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dest->prev_hash),dest->prev_hash.bytes);
len += iguana_rwnum(rwflag,&serialized[len],sizeof(dest->prev_vout),(uint32_t *)&dest->prev_vout);
len += iguana_rwnum(rwflag,&serialized[len],sizeof(*bestkp),(uint32_t *)bestkp); len += iguana_rwnum(rwflag,&serialized[len],sizeof(*bestkp),(uint32_t *)bestkp);
if ( (bestk= *bestkp) >= 0 ) if ( (bestk= *bestkp) >= 0 )
{ {
len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->siglens[bestk]),(uint32_t *)&ptr->siglens[bestk]); for (iter=0; iter<2; iter++)
if ( (siglen= ptr->siglens[bestk]) > 0 )
{ {
if ( rwflag != 0 ) ptr = (iter == 0) ? src : dest;
memcpy(&serialized[len],ptr->sigs[bestk],siglen); len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->siglens[bestk]),(uint32_t *)&ptr->siglens[bestk]);
else memcpy(ptr->sigs[bestk],&serialized[len],siglen); if ( (siglen= ptr->siglens[bestk]) > 0 )
len += siglen; {
if ( rwflag != 0 )
memcpy(&serialized[len],ptr->sigs[bestk],siglen);
else memcpy(ptr->sigs[bestk],&serialized[len],siglen);
len += siglen;
}
} }
} }
return(len); return(len);
} }
int32_t dpow_rwcoinentrys(int32_t rwflag,uint8_t *serialized,int32_t src_or_dest,struct dpow_entry notaries[DPOW_MAXRELAYS],uint8_t numnotaries,int8_t bestk) int32_t dpow_rwcoinentrys(int32_t rwflag,uint8_t *serialized,struct dpow_entry notaries[DPOW_MAXRELAYS],uint8_t numnotaries,int8_t bestk)
{ {
int32_t i,len = 0; int32_t i,len = 0;
for (i=0; i<numnotaries; i++) for (i=0; i<numnotaries; i++)
len += dpow_rwcoinentry(rwflag,&serialized[len],src_or_dest != 0 ? &notaries[i].dest : &notaries[i].src,&notaries[i].bestk); len += dpow_rwcoinentry(rwflag,&serialized[len],&notaries[i].src,&notaries[i].dest,&notaries[i].bestk);
return(len); return(len);
} }
int32_t dpow_sendcoinentrys(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,int32_t src_or_dest) int32_t dpow_sendcoinentrys(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp)
{ {
uint8_t data[sizeof(struct dpow_coinentry)*64 + 4096]; bits256 zero; int32_t len = 0; uint8_t data[sizeof(struct dpow_coinentry)*64 + 4096]; bits256 zero; int32_t len = 0;
memset(zero.bytes,0,sizeof(zero)); memset(zero.bytes,0,sizeof(zero));
@ -191,8 +197,8 @@ int32_t dpow_sendcoinentrys(struct supernet_info *myinfo,struct dpow_info *dp,st
data[len++] = bp->bestk; data[len++] = bp->bestk;
data[len++] = bp->numnotaries; data[len++] = bp->numnotaries;
len += iguana_rwbignum(1,&data[len],sizeof(bp->hashmsg),bp->hashmsg.bytes); len += iguana_rwbignum(1,&data[len],sizeof(bp->hashmsg),bp->hashmsg.bytes);
len += dpow_rwcoinentrys(1,&data[len],src_or_dest,bp->notaries,bp->numnotaries,bp->bestk); len += dpow_rwcoinentrys(1,&data[len],bp->notaries,bp->numnotaries,bp->bestk);
dpow_send(myinfo,dp,bp,zero,bp->hashmsg,src_or_dest != 0 ? DPOW_BTCENTRIESCHANNEL : DPOW_ENTRIESCHANNEL,bp->height,data,len); dpow_send(myinfo,dp,bp,zero,bp->hashmsg,DPOW_ENTRIESCHANNEL,bp->height,data,len);
return(len); return(len);
} }

Loading…
Cancel
Save