jl777 8 years ago
parent
commit
e066934f6f
  1. 47
      iguana/iguana_notary.c

47
iguana/iguana_notary.c

@ -29,7 +29,7 @@
struct dpow_entry struct dpow_entry
{ {
bits256 prev_hash; bits256 prev_hash,commit;
uint64_t mask; uint64_t mask;
int32_t prev_vout,height; int32_t prev_vout,height;
uint8_t pubkey[33],k,siglen,sig[76]; uint8_t pubkey[33],k,siglen,sig[76];
@ -333,9 +333,21 @@ int32_t dpow_haveutxo(struct supernet_info *myinfo,struct iguana_info *coin,bits
return(haveutxo); return(haveutxo);
} }
int32_t dpow_message_utxo(bits256 *hashmsgp,bits256 *txidp,int32_t *voutp,cJSON *json) int32_t dpow_rwutxobuf(int32_t rwflag,uint8_t *data,bits256 *hashmsg,bits256 *txid,int32_t *voutp,bits256 *commit)
{ {
cJSON *msgobj,*item; uint8_t key[BASILISK_KEYSIZE],data[sizeof(bits256)*2+1]; char *keystr,*hexstr,str[65],str2[65]; int32_t i,j,n,datalen,retval = -1; int32_t len = 0;
len += iguana_rwbignum(rwflag,&data[len],sizeof(*hashmsg),hashmsg->bytes);
len += iguana_rwbignum(rwflag,&data[len],sizeof(*txid),txid->bytes);
len += iguana_rwbignum(rwflag,&data[len],sizeof(*commit),commit->bytes);
if ( rwflag != 0 )
data[len++] = *voutp;
else *voutp = data[len++];
return(len);
}
int32_t dpow_message_utxo(bits256 *hashmsgp,bits256 *txidp,int32_t *voutp,bits256 *commitp,cJSON *json)
{
cJSON *msgobj,*item; uint8_t key[BASILISK_KEYSIZE],data[sizeof(bits256)*3+1]; char *keystr,*hexstr,str[65],str2[65]; int32_t i,n,datalen,retval = -1;
*voutp = -1; *voutp = -1;
memset(txidp,0,sizeof(*txidp)); memset(txidp,0,sizeof(*txidp));
if ( (msgobj= jarray(&n,json,"messages")) != 0 ) if ( (msgobj= jarray(&n,json,"messages")) != 0 )
@ -353,13 +365,7 @@ int32_t dpow_message_utxo(bits256 *hashmsgp,bits256 *txidp,int32_t *voutp,cJSON
decode_hex(data,datalen,hexstr); decode_hex(data,datalen,hexstr);
if ( datalen == sizeof(data) ) if ( datalen == sizeof(data) )
{ {
for (j=0; j<sizeof(bits256); j++) retval = dpow_rwutxobuf(0,data,hashmsgp,txidp,voutp,commitp);
{
hashmsgp->bytes[j] = data[j];
txidp->bytes[j] = data[j + sizeof(bits256)];
}
*voutp = data[sizeof(bits256) * 2];
retval = datalen;
printf("notary.%d hashmsg.(%s) txid.(%s) v%d\n",i,bits256_str(str,*hashmsgp),bits256_str(str2,*txidp),*voutp); printf("notary.%d hashmsg.(%s) txid.(%s) v%d\n",i,bits256_str(str,*hashmsgp),bits256_str(str2,*txidp),*voutp);
} }
} else printf("datalen.%d >= maxlen.%d\n",datalen,(int32_t)sizeof(data)); } else printf("datalen.%d >= maxlen.%d\n",datalen,(int32_t)sizeof(data));
@ -430,18 +436,6 @@ int32_t dpow_message_most(uint8_t *k_masks,int32_t num,cJSON *json,int32_t lastf
return(num); return(num);
} }
int32_t dpow_rwutxobuf(int32_t rwflag,uint8_t *data,bits256 *hashmsg,bits256 *txid,int32_t *voutp,bits256 *commit)
{
int32_t len = 0;
len += iguana_rwbignum(rwflag,&data[len],sizeof(*hashmsg),hashmsg->bytes);
len += iguana_rwbignum(rwflag,&data[len],sizeof(*txid),txid->bytes);
len += iguana_rwbignum(rwflag,&data[len],sizeof(*commit),commit->bytes);
if ( rwflag != 0 )
data[len++] = *voutp;
else *voutp = data[len++];
return(len);
}
int32_t dpow_opreturnscript(uint8_t *script,uint8_t *opret,int32_t opretlen) int32_t dpow_opreturnscript(uint8_t *script,uint8_t *opret,int32_t opretlen)
{ {
int32_t offset = 0; int32_t offset = 0;
@ -745,13 +739,13 @@ int32_t dpow_mostsignedtx(struct supernet_info *myinfo,struct dpow_info *dp,stru
void dpow_txidupdate(struct supernet_info *myinfo,struct dpow_info *dp,struct iguana_info *coin,uint64_t *recvmaskp,uint32_t channel,int32_t height,struct dpow_entry notaries[DPOW_MAXRELAYS],int32_t numnotaries,int32_t myind,bits256 hashmsg) void dpow_txidupdate(struct supernet_info *myinfo,struct dpow_info *dp,struct iguana_info *coin,uint64_t *recvmaskp,uint32_t channel,int32_t height,struct dpow_entry notaries[DPOW_MAXRELAYS],int32_t numnotaries,int32_t myind,bits256 hashmsg)
{ {
int32_t i,j,k,m,vout; cJSON *item,*retarray; bits256 desthash,srchash,checkmsg,txid; int32_t i,j,k,m,vout; cJSON *item,*retarray; bits256 desthash,commit,srchash,checkmsg,txid;
for (j=0; j<sizeof(srchash); j++) for (j=0; j<sizeof(srchash); j++)
srchash.bytes[j] = myinfo->DPOW.minerkey33[j+1]; srchash.bytes[j] = myinfo->DPOW.minerkey33[j+1];
for (i=0; i<numnotaries; i++) for (i=0; i<numnotaries; i++)
{ {
if ( (*recvmaskp & (1LL << i)) != 0 ) //if ( (*recvmaskp & (1LL << i)) != 0 )
continue; // continue;
for (j=0; j<sizeof(desthash); j++) for (j=0; j<sizeof(desthash); j++)
desthash.bytes[j] = notaries[i].pubkey[j+1]; desthash.bytes[j] = notaries[i].pubkey[j+1];
if ( (retarray= basilisk_channelget(myinfo,desthash,srchash,channel,height,0)) != 0 ) if ( (retarray= basilisk_channelget(myinfo,desthash,srchash,channel,height,0)) != 0 )
@ -762,7 +756,7 @@ void dpow_txidupdate(struct supernet_info *myinfo,struct dpow_info *dp,struct ig
for (k=0; k<m; k++) for (k=0; k<m; k++)
{ {
item = jitem(retarray,k); item = jitem(retarray,k);
if ( dpow_message_utxo(&checkmsg,&txid,&vout,item) == sizeof(bits256)*2+1 ) if ( dpow_message_utxo(&checkmsg,&txid,&vout,&commit,item) == sizeof(bits256)*3+1 )
{ {
if ( bits256_cmp(checkmsg,hashmsg) == 0 ) if ( bits256_cmp(checkmsg,hashmsg) == 0 )
{ {
@ -770,6 +764,7 @@ void dpow_txidupdate(struct supernet_info *myinfo,struct dpow_info *dp,struct ig
{ {
notaries[i].prev_hash = txid; notaries[i].prev_hash = txid;
notaries[i].prev_vout = vout; notaries[i].prev_vout = vout;
notaries[i].commit = commit;
} }
notaries[i].height = height; notaries[i].height = height;
*recvmaskp |= (1LL << i); *recvmaskp |= (1LL << i);

Loading…
Cancel
Save