diff --git a/src/komodo_nSPV.h b/src/komodo_nSPV.h index 51deb18be6e..9fe49f9e081 100644 --- a/src/komodo_nSPV.h +++ b/src/komodo_nSPV.h @@ -286,7 +286,7 @@ int32_t NSPV_rwinforesp(int32_t rwflag,uint8_t *serialized,struct NSPV_inforesp len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->height),&ptr->height); len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->hdrheight),&ptr->hdrheight); len += NSPV_rwequihdr(rwflag,&serialized[len],&ptr->H); -fprintf(stderr,"hdr rwlen.%d\n",len); +//fprintf(stderr,"hdr rwlen.%d\n",len); return(len); } @@ -305,6 +305,7 @@ int32_t NSPV_rwtxproof(int32_t rwflag,uint8_t *serialized,struct NSPV_txproof *p len += iguana_rwnum(rwflag,&serialized[len],sizeof(ptr->vout),&ptr->vout); len += iguana_rwuint8vec(rwflag,&serialized[len],&ptr->txlen,&ptr->tx); len += iguana_rwuint8vec(rwflag,&serialized[len],&ptr->txprooflen,&ptr->txproof); +fprintf(stderr,"len %d\n",len); return(len); } @@ -493,14 +494,15 @@ int32_t NSPV_fastnotariescount(CTransaction tx,uint8_t elected[64][33],uint32_t continue; char coinaddr[64]; Getscriptaddress(coinaddr,scriptPubKeys[j]); NSPV_SignTx(mtx,vini,10000,scriptPubKeys[j],nTime); // sets SIG_TXHASH + //fprintf(stderr,"%s ",SIG_TXHASH.GetHex().c_str()); if ( (retval= pubkeys[j].Verify(SIG_TXHASH,vData[0])) != 0 ) { - fprintf(stderr,"(vini.%d %s.%d) ",vini,coinaddr,retval); + //fprintf(stderr,"(vini.%d %s.%d) ",vini,coinaddr,retval); mask |= (1LL << j); break; } } - fprintf(stderr," verified %llx\n",(long long)mask); + //fprintf(stderr," vini.%d verified %llx\n",vini,(long long)mask); } } return(bitweight(mask)); @@ -571,7 +573,7 @@ int32_t NSPV_notarizationextract(int32_t verifyntz,int32_t *ntzheightp,uint256 * { fprintf(stderr,"numsigs.%d error\n",numsigs); return(-3); - } + } return(0); } else diff --git a/src/komodo_nSPV_defs.h b/src/komodo_nSPV_defs.h index 4cf4d93eb05..e4a08a12594 100644 --- a/src/komodo_nSPV_defs.h +++ b/src/komodo_nSPV_defs.h @@ -18,7 +18,7 @@ #define KOMODO_NSPV_DEFSH #define NSPV_POLLITERS 100 -#define NSPV_POLLMICROS 50000 +#define NSPV_POLLMICROS 10000 #define NSPV_MAXVINS 64 #define NSPV_AUTOLOGOUT 777 #define NSPV_BRANCHID 0x76b809bb diff --git a/src/komodo_nSPV_fullnode.h b/src/komodo_nSPV_fullnode.h index ecd8dde4475..d35c6e9ad9f 100644 --- a/src/komodo_nSPV_fullnode.h +++ b/src/komodo_nSPV_fullnode.h @@ -363,7 +363,10 @@ uint8_t *NSPV_getrawtx(CTransaction &tx,uint256 &hashBlock,int32_t *txlenp,uint2 *txlenp = 0; { if (!GetTransaction(txid, tx, hashBlock, false)) + { + //fprintf(stderr,"error getting transaction %s\n",txid.GetHex().c_str()); return(0); + } string strHex = EncodeHexTx(tx); *txlenp = (int32_t)strHex.size() >> 1; if ( *txlenp > 0 ) @@ -405,33 +408,38 @@ int32_t NSPV_gettxproof(struct NSPV_txproof *ptr,int32_t vout,uint256 txid,int32 return(-1); ptr->txid = txid; ptr->vout = vout; - ptr->height = height; - if ( height != 0 && (pindex= komodo_chainactive(height)) != 0 && komodo_blockload(block,pindex) == 0 ) + if ( height == 0 ) + ptr->height = komodo_blockheight(hashBlock); + else { - BOOST_FOREACH(const CTransaction&tx, block.vtx) + ptr->height = height; + if ((pindex= komodo_chainactive(height)) != 0 && komodo_blockload(block,pindex) == 0 ) { - if ( tx.GetHash() == txid ) + BOOST_FOREACH(const CTransaction&tx, block.vtx) { - flag = 1; - break; + if ( tx.GetHash() == txid ) + { + flag = 1; + break; + } } - } - if ( flag != 0 ) - { - set setTxids; - CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION); - setTxids.insert(txid); - CMerkleBlock mb(block, setTxids); - ssMB << mb; - std::vector proof(ssMB.begin(), ssMB.end()); - ptr->txprooflen = (int32_t)proof.size(); - //fprintf(stderr,"%s txproof.(%s)\n",txid.GetHex().c_str(),HexStr(proof).c_str()); - if ( ptr->txprooflen > 0 ) + if ( flag != 0 ) { - ptr->txproof = (uint8_t *)calloc(1,ptr->txprooflen); - memcpy(ptr->txproof,&proof[0],ptr->txprooflen); + set setTxids; + CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION); + setTxids.insert(txid); + CMerkleBlock mb(block, setTxids); + ssMB << mb; + std::vector proof(ssMB.begin(), ssMB.end()); + ptr->txprooflen = (int32_t)proof.size(); + //fprintf(stderr,"%s txproof.(%s)\n",txid.GetHex().c_str(),HexStr(proof).c_str()); + if ( ptr->txprooflen > 0 ) + { + ptr->txproof = (uint8_t *)calloc(1,ptr->txprooflen); + memcpy(ptr->txproof,&proof[0],ptr->txprooflen); + } + //fprintf(stderr,"gettxproof slen.%d\n",(int32_t)(sizeof(*ptr) - sizeof(ptr->tx) - sizeof(ptr->txproof) + ptr->txlen + ptr->txprooflen)); } - //fprintf(stderr,"gettxproof slen.%d\n",(int32_t)(sizeof(*ptr) - sizeof(ptr->tx) - sizeof(ptr->txproof) + ptr->txlen + ptr->txprooflen)); } } ptr->unspentvalue = CCgettxout(txid,vout,1,1); @@ -520,16 +528,16 @@ void komodo_nSPVreq(CNode *pfrom,std::vector request) // received a req if ( len == 1+sizeof(reqheight) ) iguana_rwnum(0,&request[1],sizeof(reqheight),&reqheight); else reqheight = 0; - fprintf(stderr,"request height.%d\n",reqheight); + //fprintf(stderr,"request height.%d\n",reqheight); memset(&I,0,sizeof(I)); if ( (slen= NSPV_getinfo(&I,reqheight)) > 0 ) { response.resize(1 + slen); response[0] = NSPV_INFORESP; - fprintf(stderr,"slen.%d\n",slen); + //fprintf(stderr,"slen.%d\n",slen); if ( NSPV_rwinforesp(1,&response[1],&I) == slen ) { - fprintf(stderr,"send info resp to id %d\n",(int32_t)pfrom->id); + //fprintf(stderr,"send info resp to id %d\n",(int32_t)pfrom->id); pfrom->PushMessage("nSPV",response); pfrom->prevtimes[ind] = timestamp; } @@ -706,16 +714,18 @@ void komodo_nSPVreq(CNode *pfrom,std::vector request) // received a req memset(&P,0,sizeof(P)); if ( (slen= NSPV_gettxproof(&P,vout,txid,height)) > 0 ) { + //fprintf(stderr,"slen.%d\n",slen); response.resize(1 + slen); response[0] = NSPV_TXPROOFRESP; if ( NSPV_rwtxproof(1,&response[1],&P) == slen ) { + //fprintf(stderr,"send response\n"); pfrom->PushMessage("nSPV",response); pfrom->prevtimes[ind] = timestamp; } NSPV_txproof_purge(&P); - } - } + } else fprintf(stderr,"gettxproof error.%d\n",slen); + } else fprintf(stderr,"txproof reqlen.%d\n",len); } } else if ( request[0] == NSPV_SPENTINFO ) diff --git a/src/komodo_nSPV_superlite.h b/src/komodo_nSPV_superlite.h index c8a86196d79..e9c0c20b613 100644 --- a/src/komodo_nSPV_superlite.h +++ b/src/komodo_nSPV_superlite.h @@ -59,7 +59,7 @@ struct NSPV_ntzsresp *NSPV_ntzsresp_add(struct NSPV_ntzsresp *ptr) if ( NSPV_ntzsresp_cache[i].reqheight == 0 ) break; if ( i == sizeof(NSPV_ntzsresp_cache)/sizeof(*NSPV_ntzsresp_cache) ) - i == (rand() % (sizeof(NSPV_ntzsresp_cache)/sizeof(*NSPV_ntzsresp_cache))); + i = (rand() % (sizeof(NSPV_ntzsresp_cache)/sizeof(*NSPV_ntzsresp_cache))); NSPV_ntzsresp_purge(&NSPV_ntzsresp_cache[i]); NSPV_ntzsresp_copy(&NSPV_ntzsresp_cache[i],ptr); fprintf(stderr,"ADD CACHE ntzsresp req.%d\n",ptr->reqheight); @@ -98,7 +98,7 @@ struct NSPV_txproof *NSPV_txproof_add(struct NSPV_txproof *ptr) if ( NSPV_txproof_cache[i].txlen == 0 ) break; if ( i == sizeof(NSPV_txproof_cache)/sizeof(*NSPV_txproof_cache) ) - i == (rand() % (sizeof(NSPV_txproof_cache)/sizeof(*NSPV_txproof_cache))); + i = (rand() % (sizeof(NSPV_txproof_cache)/sizeof(*NSPV_txproof_cache))); NSPV_txproof_purge(&NSPV_txproof_cache[i]); NSPV_txproof_copy(&NSPV_txproof_cache[i],ptr); fprintf(stderr,"ADD CACHE txproof %s\n",ptr->txid.GetHex().c_str()); @@ -121,7 +121,7 @@ struct NSPV_ntzsproofresp *NSPV_ntzsproof_add(struct NSPV_ntzsproofresp *ptr) if ( NSPV_ntzsproofresp_cache[i].common.hdrs == 0 ) break; if ( i == sizeof(NSPV_ntzsproofresp_cache)/sizeof(*NSPV_ntzsproofresp_cache) ) - i == (rand() % (sizeof(NSPV_ntzsproofresp_cache)/sizeof(*NSPV_ntzsproofresp_cache))); + i = (rand() % (sizeof(NSPV_ntzsproofresp_cache)/sizeof(*NSPV_ntzsproofresp_cache))); NSPV_ntzsproofresp_purge(&NSPV_ntzsproofresp_cache[i]); NSPV_ntzsproofresp_copy(&NSPV_ntzsproofresp_cache[i],ptr); fprintf(stderr,"ADD CACHE ntzsproof %s %s\n",ptr->prevtxid.GetHex().c_str(),ptr->nexttxid.GetHex().c_str()); @@ -544,11 +544,11 @@ UniValue NSPV_login(char *wifstr) UniValue NSPV_getinfo_req(int32_t reqht) { - uint8_t msg[64]; int32_t i,iter,len = 0; struct NSPV_inforesp I; + uint8_t msg[512]; int32_t i,iter,len = 0; struct NSPV_inforesp I; NSPV_inforesp_purge(&NSPV_inforesult); msg[len++] = NSPV_INFO; len += iguana_rwnum(1,&msg[len],sizeof(reqht),&reqht); - for (iter=0; iter<3; iter++); + for (iter=0; iter<3; iter++) if ( NSPV_req(0,msg,len,NODE_NSPV,msg[0]>>1) != 0 ) { for (i=0; i= NSPV_inforesult.height && strcmp(coinaddr,NSPV_utxosresult.coinaddr) == 0 && CCflag == NSPV_utxosresult.CCflag && skipcount == NSPV_utxosresult.skipcount ) return(NSPV_utxosresp_json(&NSPV_utxosresult)); @@ -601,7 +601,7 @@ UniValue NSPV_addressutxos(char *coinaddr,int32_t CCflag,int32_t skipcount) memcpy(&msg[len],coinaddr,slen), len += slen; msg[len++] = (CCflag != 0); len += iguana_rwnum(1,&msg[len],sizeof(skipcount),&skipcount); - for (iter=0; iter<3; iter++); + for (iter=0; iter<3; iter++) if ( NSPV_req(0,msg,len,NODE_ADDRINDEX,msg[0]>>1) != 0 ) { for (i=0; i= NSPV_inforesult.height && strcmp(coinaddr,NSPV_txidsresult.coinaddr) == 0 && CCflag == NSPV_txidsresult.CCflag && skipcount == NSPV_txidsresult.skipcount ) return(NSPV_txidsresp_json(&NSPV_txidsresult)); if ( skipcount < 0 ) @@ -638,7 +638,7 @@ UniValue NSPV_addresstxids(char *coinaddr,int32_t CCflag,int32_t skipcount) msg[len++] = (CCflag != 0); len += iguana_rwnum(1,&msg[len],sizeof(skipcount),&skipcount); //fprintf(stderr,"skipcount.%d\n",skipcount); - for (iter=0; iter<3; iter++); + for (iter=0; iter<3; iter++) if ( NSPV_req(0,msg,len,NODE_ADDRINDEX,msg[0]>>1) != 0 ) { for (i=0; i>1) != 0 ) { for (i=0; i>1) != 0 ) { for (i=0; iprevtxid.GetHex().c_str(),ptr->nexttxid.GetHex().c_str()); @@ -768,7 +771,7 @@ UniValue NSPV_txidhdrsproof(uint256 prevtxid,uint256 nexttxid) msg[len++] = NSPV_NTZSPROOF; len += iguana_rwbignum(1,&msg[len],sizeof(prevtxid),(uint8_t *)&prevtxid); len += iguana_rwbignum(1,&msg[len],sizeof(nexttxid),(uint8_t *)&nexttxid); - for (iter=0; iter<3; iter++); + for (iter=0; iter<3; iter++) if ( NSPV_req(0,msg,len,NODE_NSPV,msg[0]>>1) != 0 ) { for (i=0; i>1) != 0 ) { for (i=0; i>1) != 0 ) { for (i=0; i>1) != 0 ) { for (i=0; i proof; + struct NSPV_txproof *ptr; int32_t i,offset,retval; int64_t rewards = 0; uint32_t nLockTime; std::vector proof; + retval = skipvalidation != 0 ? 0 : -1; + //fprintf(stderr,"NSPV_gettx %s/v%d ht.%d\n",txid.GetHex().c_str(),vout,height); if ( (ptr= NSPV_txproof_find(txid)) == 0 ) { @@ -78,7 +80,7 @@ int32_t NSPV_gettransaction(int32_t skipvalidation,int32_t vout,uint256 txid,int retval = -2001; else if ( skipvalidation == 0 && ptr->unspentvalue <= 0 ) retval = -2002; - else if ( ASSETCHAINS_SYMBOL[0] == 0 && extradata >= 0 && tiptime != 0 ) + else if ( ASSETCHAINS_SYMBOL[0] == 0 && tiptime != 0 ) { rewards = komodo_interestnew(height,tx.vout[vout].nValue,tx.nLockTime,tiptime); if ( rewards != extradata ) @@ -117,11 +119,12 @@ int32_t NSPV_gettransaction(int32_t skipvalidation,int32_t vout,uint256 txid,int { std::vector txids; uint256 proofroot; proofroot = BitcoinGetProofMerkleRoot(proof,txids); - if ( proofroot != NSPV_ntzsproofresult.common.hdrs[offset].hashMerkleRoot ) + if ( proofroot != NSPV_ntzsproofresult.common.hdrs[offset].hashMerkleRoot || txids[0] != txid ) { + fprintf(stderr,"txid.%s vs txids[0] %s\n",txid.GetHex().c_str(),txids[0].GetHex().c_str()); fprintf(stderr,"prooflen.%d proofroot.%s vs %s\n",(int32_t)proof.size(),proofroot.GetHex().c_str(),NSPV_ntzsproofresult.common.hdrs[offset].hashMerkleRoot.GetHex().c_str()); retval = -2003; - } + } else retval = 0; } } else retval = -2005; } else retval = -2004; @@ -242,7 +245,7 @@ bool NSPV_SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const C if ( ProduceSignature(TransactionSignatureCreator(&keystore,&txNewConst,vini,utxovalue,SIGHASH_ALL),scriptPubKey,sigdata,branchid) != 0 ) { UpdateTransaction(mtx,vini,sigdata); - //fprintf(stderr,"SIG_TXHASH %s vini.%d %.8f\n",SIG_TXHASH.GetHex().c_str(),vini,(double)utxovalue/COIN); + fprintf(stderr,"SIG_TXHASH %s vini.%d %.8f\n",SIG_TXHASH.GetHex().c_str(),vini,(double)utxovalue/COIN); return(true); } //else fprintf(stderr,"sigerr SIG_TXHASH %s vini.%d %.8f\n",SIG_TXHASH.GetHex().c_str(),vini,(double)utxovalue/COIN); return(false); @@ -321,12 +324,21 @@ UniValue NSPV_spend(char *srcaddr,char *destaddr,int64_t satoshis) // what its a len >>= 1; data.resize(len); decode_hex(&data[0],len,destaddr); - scriptPubKey = CScript() << data << OP_CHECKCRYPTOCONDITION; + if ( data[len-1] == OP_CHECKCRYPTOCONDITION ) + { + data.resize(--len); + scriptPubKey = CScript() << data << OP_CHECKCRYPTOCONDITION; + } + else + { + result.push_back(Pair("result","error")); + result.push_back(Pair("error","only CC hex allowed for now")); + return(result); } } else { result.push_back(Pair("result","error")); - result.push_back(Pair("error","invalid destaddr")); + result.push_back(Pair("error","invalid destaddr/CCvout hex")); return(result); } } diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 028bc4dc2ee..caa99bdcdb9 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -73,7 +73,7 @@ int32_t getkmdseason(int32_t height) return(i+1); } return(0); -}; +} int32_t getacseason(uint32_t timestamp) { @@ -85,7 +85,7 @@ int32_t getacseason(uint32_t timestamp) return(i+1); } return(0); -}; +} int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index c734eb0d97b..d8bed23ddbb 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -972,6 +972,7 @@ UniValue z_exportviewingkey(const UniValue& params, bool fHelp) return EncodeViewingKey(vk); } +extern int32_t KOMODO_NSPV; UniValue NSPV_getinfo_req(int32_t reqht); UniValue NSPV_login(char *wifstr); UniValue NSPV_logout();