From 7973df73794b02de4c7728c21b7502bd9e59e89f Mon Sep 17 00:00:00 2001 From: DeckerSU Date: Thu, 18 Oct 2018 23:09:55 +0300 Subject: [PATCH] dpow_notarytx: correct sapling unsigned raw tx with usesigs=0 now we have correct format of unsigned rawtx with sapling support inside dpow_notarytx and correct format of signed raw tx when usesigs=0. but as we don't yet create sapling preimage - sigs are still incorrect, and notary tx can't be broadcasted. --- iguana/dpow/dpow_tx.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 1f8f769eb..7eac71e46 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -267,7 +267,8 @@ int32_t dpow_voutstandard(struct supernet_info *myinfo,struct dpow_block *bp,uin bits256 dpow_notarytx(struct supernet_info *myinfo,char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t usesigs,int32_t src_or_dest,uint8_t pubkeys[][33],int32_t numratified) { uint32_t k,m,numsigs,version,vout,crcval,sequenceid = 0xffffffff; bits256 zero; int32_t n,siglen,len; uint8_t serialized[32768],*sig; bits256 txid; struct dpow_entry *ep; struct dpow_coinentry *cp; - + // int32_t preimage_len; uint8_t preimage[32768]; // here we will create preimage, when usesigs=0 (?) + struct iguana_info *coin = (src_or_dest != 0) ? bp->destcoin : bp->srccoin; uint32_t zcash = (strcmp(coin->symbol, "VRSC") == 0 || strcmp(coin->symbol, "VRSCTEST") == 0); printf("[Decker] dpow_notarytx: src.(%s) dst.(%s) src_or_dest.(%d) usesigs.(%d)\n", bp->srccoin->symbol, bp->destcoin->symbol, src_or_dest, usesigs); @@ -290,7 +291,6 @@ bits256 dpow_notarytx(struct supernet_info *myinfo,char *signedtx,int32_t *numsi len += iguana_rwnum(1, &serialized[len], sizeof(versiongroupid), &versiongroupid); } - if ( isPoS != 0 ) len += iguana_rwnum(1,&serialized[len],sizeof(bp->timestamp),&bp->timestamp); m = bp->minsigs; @@ -344,7 +344,7 @@ bits256 dpow_notarytx(struct supernet_info *myinfo,char *signedtx,int32_t *numsi len += iguana_rwbignum(1,&serialized[len],sizeof(txid),txid.bytes); len += iguana_rwnum(1,&serialized[len],sizeof(vout),&vout); - if ( usesigs != 0 && bestk >= 0 ) + if ( usesigs != 0 && bestk >= 0 ) // usesigs=1 -> insert signature { len += iguana_rwvarint32(1,&serialized[len],(uint32_t *)&siglen); if ( siglen > 0 && siglen <= sizeof(cp->sigs[bestk]) ) @@ -353,7 +353,7 @@ bits256 dpow_notarytx(struct supernet_info *myinfo,char *signedtx,int32_t *numsi len += siglen; numsigs++; } //else printf("%s -> %s src_or_dest.%d Missing sig from k.%d\n",bp->srccoin->symbol,bp->destcoin->symbol,src_or_dest,k); - } else serialized[len++] = 0; + } else serialized[len++] = 0; // usesigs=0 -> insert scriptlen = 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); @@ -369,6 +369,22 @@ bits256 dpow_notarytx(struct supernet_info *myinfo,char *signedtx,int32_t *numsi return(zero); } len += n; + + if (zcash) { + uint32_t nExpiryHeight = 0; + uint64_t valueBalance = 0; + uint8_t nShieldedSpend = 0; + uint8_t nShieldedOutput = 0; + uint8_t nJoinSplit = 0; + len += iguana_rwnum(1, &serialized[len], sizeof(nExpiryHeight), &nExpiryHeight); + len += iguana_rwnum(1, &serialized[len], sizeof(valueBalance), &valueBalance); + len += iguana_rwnum(1, &serialized[len], sizeof(nShieldedSpend), &nShieldedSpend); // The number of Spend descriptions in vShieldedSpend + len += iguana_rwnum(1, &serialized[len], sizeof(nShieldedOutput), &nShieldedOutput); // The number of Output descriptions in vShieldedOutput + len += iguana_rwnum(1, &serialized[len], sizeof(nJoinSplit), &nJoinSplit); // The number of JoinSplit descriptions in vJoinSplit + } + + // here if usesigs=0 we have unsigned tx (not preimage), if usesigs=1 - we have signed tx with sigs from nn_bus network (?) + init_hexbytes_noT(signedtx,serialized,len); printf("[Decker] dpow_notarytx: signedtx.(%s)\n", signedtx);