From d17312f526417ffe7fe9a928496be4d71e006d47 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 04:50:40 -1100 Subject: [PATCH 01/67] Qvalidate --- src/cc/dilithium.c | 106 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 102 insertions(+), 4 deletions(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 9a9c4de71..1b3ed1d86 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -2915,6 +2915,30 @@ int32_t main(void) void calc_rmd160_sha256(uint8_t rmd160[20],uint8_t *data,int32_t datalen); char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160,int32_t len); +int32_t dilithium_Qmsghash(uint8_t *msg,CTransaction tx,std::vector voutpubtxids) +{ + CScript data; uint256 hash; int32_t i,numvins,numvouts,len = 0; std::vector vintxids; std::vector nValues; std::vector vinprevns; std::vector scriptPubKeys; + numvins = tx.vin.size(); + numvouts = tx.vout.size(); + if ( tx.vout[numvouts-1].scriptPubKey[0] == 0x6a ) + { + for (i=0; i bigpub) { CScript opret; uint8_t evalcode = EVAL_DILITHIUM; @@ -2969,6 +2993,24 @@ uint8_t dilithium_spendopretdecode(uint256 &destpubtxid,std::vector &si return(0); } +CScript dilithium_Qsendopret(uint256 destpubtxid,std::vectorsig,std::vector voutpubtxids) +{ + CScript opret; uint8_t evalcode = EVAL_DILITHIUM; + opret << OP_RETURN << E_MARSHAL(ss << evalcode << 'Q' << destpubtxid << sig << voutpubtxids); + return(opret); +} + +uint8_t dilithium_Qsendopretdecode(uint256 &destpubtxid,std::vector&sig,std::vector &voutpubtxids,CScript scriptPubKey) +{ + std::vector vopret; uint8_t e,f; + GetOpReturnData(scriptPubKey,vopret); + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> destpubtxid; ss >> sig; ss >> voutpubtxids) != 0 && e == EVAL_DILITHIUM && f == 'Q' ) + { + return(f); + } + return(0); +} + UniValue dilithium_rawtxresult(UniValue &result,std::string rawtx) { CTransaction tx; @@ -3229,14 +3271,70 @@ UniValue dilithium_spend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params } else return(cclib_error(result,"need to have exactly 2 params sendtxid, scriptPubKey")); } +bool dilithium_Qvalidate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx) +{ + int32_t i,numvins,numvouts,mlen,smlen=CRYPTO_BYTES+32; CPubKey destpub33; std::string handle; uint256 tmptxid,hashBlock,destpubtxid,signerpubtxid; CTransaction vintx; std::vector tmpsig,sig,vopret; uint8_t msg[32],msg2[CRYPTO_BYTES+32],pk[CRYPTO_PUBLICKEYBYTES],*script; std::vector voutpubtxids; + numvins = tx.vin.size(); + signerpubtxid = zeriod; + for (i=0; i 1 ) + { + GetOpReturnData(vintx.vout[numvouts-1].scriptPubKey,vopret); + script = (uint8_t *)vopret.data(); + if ( script[1] == 'Q' ) + { + if ( dilithium_Qsendopretdecode(tmptxid,tmpsig,voutpubtxids,vintx.vout[numvouts-1].scriptPubKey) != 'Q' ) + return eval->Invalid("couldnt decode destpubtxid from Qsend"); + else if ( vntx.vin[i].prevout.n > voutpubtxids.size() ) + return eval->Invalid("no destpubtxid for prevout.n"); + destpubtxid = voutpubtxids[vintx.vin[i].prevout.n]; + } + else + { + if ( dilithium_sendopretdecode(destpubtxid,vintx.vout[numvouts-1].scriptPubKey) != 'x' ) + return eval->Invalid("couldnt decode destpubtxid from send"); + } + if ( signerpubtxid == zeroid ) + signerpubtxid = destpubtxid; + else if ( destpubtxid != signerpubtxid ) + return eval->Invalid("destpubtxid of vini doesnt match first one"); + } + } + } + if ( signerpubtxid != zeroid ) + { + numvouts = tx.vout.size(); + if ( dilithium_Qsendopretdecode(destpubtxid,sig,voutpubtxids,tx.vout[numvouts-1].scriptPubKey) == 'Q' && destpubtxid == signerpubtxid && sig.size() == smlen ) + { + if ( dilithium_Qmsghash(msg,tx,voutpubtxids) < 0 ) + return eval->Invalid("couldnt get Qmsghash"); + else if ( dilithium_bigpubget(handle,destpub33,pk,signerpubtxid) < 0 ) + return eval->Invalid("couldnt get bigpub"); + else + { + if ( _dilithium_verify(msg2,&mlen,&sig[0],smlen,pk) < 0 ) + return eval->Invalid("failed dilithium verify"); + else if ( mlen != 32 || memcmp(msg,msg2,32) != 0 ) + return eval->Invalid("failed dilithium msg verify"); + else return eval->Invalid("this is actually a success"); + } + } else return eval->Invalid("failed decode Qsend"); + } else return eval->Invalid("unexpected zero signerpubtxid"); +} + bool dilithium_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx) { - CPubKey destpub33; std::string handle; uint256 hashBlock,destpubtxid,checktxid; CTransaction vintx; int32_t numvouts,numvins,mlen,smlen=CRYPTO_BYTES+32; std::vector sig; uint8_t msg[32],msg2[CRYPTO_BYTES+32],pk[CRYPTO_PUBLICKEYBYTES]; + CPubKey destpub33; std::string handle; uint256 hashBlock,destpubtxid,checktxid; CTransaction vintx; int32_t numvouts,mlen,smlen=CRYPTO_BYTES+32; std::vector sig,vpopret; uint8_t msg[32],msg2[CRYPTO_BYTES+32],pk[CRYPTO_PUBLICKEYBYTES],*script; // if all dilithium tx -> do multispend/send, else: numvouts = tx.vout.size(); - numvins = tx.vin.size(); - - if ( tx.vout.size() != 2 ) + GetOpReturnData(tx.vout[numvouts-1].scriptPubKey,vopret); + script = (uint8_t *)vopret.data(); + if ( script[1] == 'Q' ) + return(dilithium_Qvalidate(cp,height,eval,tx)); + else if ( tx.vout.size() != 2 ) return eval->Invalid("numvouts != 2"); else if ( tx.vin.size() != 1 ) return eval->Invalid("numvins != 1"); From 3e5cd48c382daa653d0c8c8f7580d5a267ca83a0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 04:52:10 -1100 Subject: [PATCH 02/67] Syntax --- src/cc/dilithium.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 1b3ed1d86..0a3ec40ea 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -2929,8 +2929,8 @@ int32_t dilithium_Qmsghash(uint8_t *msg,CTransaction tx,std::vector vou } for (i=0; iInvalid("couldnt decode destpubtxid from Qsend"); - else if ( vntx.vin[i].prevout.n > voutpubtxids.size() ) + else if ( vintx.vin[i].prevout.n > voutpubtxids.size() ) return eval->Invalid("no destpubtxid for prevout.n"); destpubtxid = voutpubtxids[vintx.vin[i].prevout.n]; } @@ -3327,7 +3327,7 @@ bool dilithium_Qvalidate(struct CCcontract_info *cp,int32_t height,Eval *eval,co bool dilithium_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx) { - CPubKey destpub33; std::string handle; uint256 hashBlock,destpubtxid,checktxid; CTransaction vintx; int32_t numvouts,mlen,smlen=CRYPTO_BYTES+32; std::vector sig,vpopret; uint8_t msg[32],msg2[CRYPTO_BYTES+32],pk[CRYPTO_PUBLICKEYBYTES],*script; + CPubKey destpub33; std::string handle; uint256 hashBlock,destpubtxid,checktxid; CTransaction vintx; int32_t numvouts,mlen,smlen=CRYPTO_BYTES+32; std::vector sig,vopret; uint8_t msg[32],msg2[CRYPTO_BYTES+32],pk[CRYPTO_PUBLICKEYBYTES],*script; // if all dilithium tx -> do multispend/send, else: numvouts = tx.vout.size(); GetOpReturnData(tx.vout[numvouts-1].scriptPubKey,vopret); From 483ac5bbea0862f9128777cccc3328c73a2be5e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 04:56:10 -1100 Subject: [PATCH 03/67] Change to CTxout --- src/cc/dilithium.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 0a3ec40ea..ed23dd813 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -2917,7 +2917,7 @@ char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160, int32_t dilithium_Qmsghash(uint8_t *msg,CTransaction tx,std::vector voutpubtxids) { - CScript data; uint256 hash; int32_t i,numvins,numvouts,len = 0; std::vector vintxids; std::vector nValues; std::vector vinprevns; std::vector scriptPubKeys; + CScript data; uint256 hash; int32_t i,numvins,numvouts,len = 0; std::vector vintxids; std::vector vinprevns; std::vector vouts; numvins = tx.vin.size(); numvouts = tx.vout.size(); if ( tx.vout[numvouts-1].scriptPubKey[0] == 0x6a ) @@ -2928,11 +2928,9 @@ int32_t dilithium_Qmsghash(uint8_t *msg,CTransaction tx,std::vector vou vinprevns.push_back(tx.vin[i].prevout.n); } for (i=0; i tmpsig,sig,vopret; uint8_t msg[32],msg2[CRYPTO_BYTES+32],pk[CRYPTO_PUBLICKEYBYTES],*script; std::vector voutpubtxids; numvins = tx.vin.size(); - signerpubtxid = zeriod; + signerpubtxid = zeroid; for (i=0; i Date: Mon, 25 Feb 2019 06:43:39 -1100 Subject: [PATCH 04/67] Qsend rpc --- src/cc/cclib.cpp | 6 ++- src/cc/dilithium.c | 115 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 110 insertions(+), 11 deletions(-) diff --git a/src/cc/cclib.cpp b/src/cc/cclib.cpp index f7749d99f..121a16475 100644 --- a/src/cc/cclib.cpp +++ b/src/cc/cclib.cpp @@ -87,6 +87,7 @@ CClib_methods[] = { (char *)"dilithium", (char *)"verify", (char *)"pubtxid msg sig", 3, 3, 'V', EVAL_DILITHIUM }, { (char *)"dilithium", (char *)"send", (char *)"handle pubtxid amount", 3, 3, 'x', EVAL_DILITHIUM }, { (char *)"dilithium", (char *)"spend", (char *)"sendtxid scriptPubKey [hexseed]", 2, 3, 'y', EVAL_DILITHIUM }, + { (char *)"dilithium", (char *)"Qsend", (char *)"mypubtxid hexseed/'mypriv' destpubtxid,amount, ...", 4, 66, 'Q', EVAL_DILITHIUM }, #endif }; @@ -134,6 +135,7 @@ UniValue dilithium_spend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params UniValue dilithium_keypair(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); UniValue dilithium_sign(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); UniValue dilithium_verify(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); +UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); #endif @@ -261,7 +263,9 @@ UniValue CClib_method(struct CCcontract_info *cp,char *method,char *jsonstr) } else if ( cp->evalcode == EVAL_DILITHIUM ) { - if ( strcmp(method,"send") == 0 ) + if ( strcmp(method,"Qsend") == 0 ) + return(dilithium_Qsend(txfee,cp,params)); + else if ( strcmp(method,"send") == 0 ) return(dilithium_send(txfee,cp,params)); else if ( strcmp(method,"spend") == 0 ) return(dilithium_spend(txfee,cp,params)); diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index ed23dd813..b04390323 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3209,16 +3209,6 @@ UniValue dilithium_send(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) } else return(cclib_error(result,"not enough parameters")); } -/* - ultimately what is needed is to be able to scan all utxos to the CC address and be able to spend many vins in the same tx. to do this the opreturn would need to be able to have txid of special with the sigs. However, it is complicated by the need to create a specific message to sign that is the desired outputs and all the inputs. Also, to properly be able to do change and keep everything in dilithium outputs, there needs to be a second destpub. - - so the proposed opreturn for spend would be: - - destpubtxid0, destpubtxid1 (zeroid if only 1), vector of sigs/sigtxid where if it is len 32 it is a txid that just has the sig in the opreturn. - - however, for now, to keep things simple we will only support spending a specific txid to normal output to avoid needing a combined opreturn and other complications. - */ - UniValue dilithium_spend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); @@ -3269,6 +3259,111 @@ UniValue dilithium_spend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params } else return(cclib_error(result,"need to have exactly 2 params sendtxid, scriptPubKey")); } +int64_t dilithium_inputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs,char *cmpaddr) +{ + char coinaddr[64]; int64_t threshold,nValue,price,totalinputs = 0; uint256 tmptxid,txid,hashBlock; std::vector origpubkey,tmpsig; CTransaction vintx; int32_t vout,numvouts,n = 0; std::vector voutpubtxids; + std::vector > unspentOutputs; + GetCCaddress(cp,coinaddr,pk); + SetCCunspents(unspentOutputs,coinaddr); + threshold = total/(maxinputs+1); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + vout = (int32_t)it->first.index; + //char str[65]; fprintf(stderr,"%s check %s/v%d %.8f vs %.8f\n",coinaddr,uint256_str(str,txid),vout,(double)it->second.satoshis/COIN,(double)threshold/COIN); + if ( it->second.satoshis < threshold || it->second.satoshis == DILITHIUM_TXFEE ) + continue; + if ( GetTransaction(txid,vintx,hashBlock,false) != 0 && (numvouts= vintx.vout.size()) > 1 ) + { + if ( (nValue= IsCClibvout(cp,vintx,vout,cmpaddr)) > DILITHIUM_TXFEE && myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) == 0 ) + { + if ( dilithium_Qsendopretdecode(tmptxid,tmpsig,voutpubtxids,vintx.vout[numvouts-1].scriptPubKey) == 'Q' || dilithium_sendopretdecode(tmptxid,tmpsig,vintx.vout[numvouts-1].scriptPubKey) == 'x' ) + { + if ( total != 0 && maxinputs != 0 ) + mtx.vin.push_back(CTxIn(txid,vout,CScript())); + nValue = it->second.satoshis; + totalinputs += nValue; + n++; + if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) + break; + } + } //else fprintf(stderr,"nValue %.8f too small or already spent in mempool\n",(double)nValue/COIN); + } else fprintf(stderr,"couldnt get tx\n"); + } + return(totalinputs); +} + +UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) +{ + CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); + UniValue result(UniValue::VOBJ); std::string rawtx; CPubKey mypk,destpub33; CTransaction tx,vintx; uint256 prevhash,mypubtxid,hashBlock,destpubtxid; int64_t amount,inputsum,outputsum,change; int32_t i,smlen,n,numvouts; char str[129],myCCaddr[64],*scriptstr; CTxOut vout; std::string handle; uint8_t pk[CRYPTO_PUBLICKEYBYTES],pk2[CRYPTO_PUBLICKEYBYTES],sk[CRYPTO_SECRETKEYBYTES],msg[32],seed[32]; std::vector sig; std::vector voutpubtxids; + if ( txfee == 0 ) + txfee = DILITHIUM_TXFEE; + mypk = pubkey2pk(Mypubkey()); + GetCCaddress(cp,myCCaddr,mypk); + if ( params != 0 && (n= cJSON_GetArraySize(params)) >= 4 && (n & 1) == 0 ) + { + mypubtxid = juint256(jitem(params,0)); + if ( cclib_parsehash(seed,jitem(params,1),32) < 0 ) + { + Myprivkey(seed); + result.push_back(Pair("warning","test mode using privkey for -pubkey, only for testing. there is no point using quantum secure signing if you are using a privkey with a known secp256k1 pubkey!!")); + } + _dilithium_keypair(pk,sk,seed); + outputsum = 0; + for (i=2; ievalcode,amount,destpub33)); + voutpubtxids.push_back(prevhash); // binds destpub22 CC addr with dilithium bigpub + } else return(cclib_error(result,"couldnt find bigpub at txid")); + } + else + { + CScript scriptPubKey; + scriptPubKey.resize(strlen(scriptstr)/2); + decode_hex(&scriptPubKey[0],strlen(scriptstr)/2,scriptstr); + vout.nValue = amount; + vout.scriptPubKey = scriptPubKey; + mtx.vout.push_back(vout); + voutpubtxids.push_back(zeroid); + } + outputsum += amount; + } + if ( (inputsum= dilithium_inputs(cp,mtx,mypk,outputsum+txfee,64,myCCaddr)) >= outputsum+txfee ) + { + change = (inputsum - outputsum - txfee) + if ( change >= txfee ) + { + mtx.vout.push_back(MakeCC1vout(cp->evalcode,change,mypk)); + voutpubtxids.push_back(mypubtxid); + } + tx = mtx; + dilithium_Qmsghash(msg,tx,voutpubtxids); + sig.resize(32+CRYPTO_BYTES); + if ( dilithium_bigpubget(handle,destpub33,pk2,mypubtxid) < 0 ) + return(cclib_error(result,"couldnt get bigpub")); + else if ( memcmp(pk,pk2,sizeof(pk)) != 0 ) + return(cclib_error(result,"dilithium bigpub mismatch")); + else if ( destpub33 != mypk ) + return(cclib_error(result,"destpub33 is not for this -pubkey")); + else if ( _dilithium_sign(&sig[0],&smlen,msg,32,sk) < 0 ) + return(cclib_error(result,"dilithium signing error")); + else if ( smlen != 32+CRYPTO_BYTES ) + return(cclib_error(result,"siglen error")); + rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,dilithium_Qsendopret(destpubtxid,sig,voutpubtxids)); + return(dilithium_rawtxresult(result,rawtx)); + } else return(cclib_error(result,"couldnt find vin0")); + } else return(cclib_error(result,"need to have exactly 2 params sendtxid, scriptPubKey")); +} + bool dilithium_Qvalidate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx) { int32_t i,numvins,numvouts,mlen,smlen=CRYPTO_BYTES+32; CPubKey destpub33; std::string handle; uint256 tmptxid,hashBlock,destpubtxid,signerpubtxid; CTransaction vintx; std::vector tmpsig,sig,vopret; uint8_t msg[32],msg2[CRYPTO_BYTES+32],pk[CRYPTO_PUBLICKEYBYTES],*script; std::vector voutpubtxids; From 6751dc52fce22e037a25b3e2b2536e20339b33d9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 06:46:08 -1100 Subject: [PATCH 05/67] -DILITHIUM_TXFEE --- src/cc/dilithium.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index b04390323..432b4b264 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3277,7 +3277,7 @@ int64_t dilithium_inputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPu { if ( (nValue= IsCClibvout(cp,vintx,vout,cmpaddr)) > DILITHIUM_TXFEE && myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) == 0 ) { - if ( dilithium_Qsendopretdecode(tmptxid,tmpsig,voutpubtxids,vintx.vout[numvouts-1].scriptPubKey) == 'Q' || dilithium_sendopretdecode(tmptxid,tmpsig,vintx.vout[numvouts-1].scriptPubKey) == 'x' ) + if ( dilithium_Qsendopretdecode(tmptxid,tmpsig,voutpubtxids,vintx.vout[numvouts-1].scriptPubKey) == 'Q' || dilithium_sendopretdecode(tmptxid,vintx.vout[numvouts-1].scriptPubKey) == 'x' ) { if ( total != 0 && maxinputs != 0 ) mtx.vin.push_back(CTxIn(txid,vout,CScript())); From a762316ef1b4a7886cfa944394a18fe23f40eacc Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 06:46:28 -1100 Subject: [PATCH 06/67] ; --- src/cc/dilithium.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 432b4b264..a0aadd209 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3339,7 +3339,7 @@ UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params } if ( (inputsum= dilithium_inputs(cp,mtx,mypk,outputsum+txfee,64,myCCaddr)) >= outputsum+txfee ) { - change = (inputsum - outputsum - txfee) + change = (inputsum - outputsum - txfee); if ( change >= txfee ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,change,mypk)); From 4dff19ad47eaff67ce33ef3c3d0fe04968bdcd54 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 06:55:54 -1100 Subject: [PATCH 07/67] Fix --- src/cc/dilithium.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index a0aadd209..b7106a95d 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -2908,6 +2908,14 @@ int32_t main(void) this generates a really big hex, broadcast it and if all went well it will get confirmed. a dilithium spend! + to generate a seed that wont be directly derivable from an secp256k1 keypair, do: + cclib keypair 19 \"[%22rand%22]\" + + to do a Qsend (multiple dilithium inputs and outputs) + + cclib Qsend 19 \"[%22mypubtxid%22,%22%22,%22%22,0.777]\" + there can be up to 64 outputs, where each one can be a different destpubtxid or scriptPubKey. The only restriction is that scriptPubKey hex cant be 32 bytes. + */ #define DILITHIUM_TXFEE 10000 @@ -3315,7 +3323,6 @@ UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params { amount = jdouble(jitem(params,i+1),0)*COIN + 0.0000000049; scriptstr = jstr(jitem(params,i),0); - return(cclib_error(result,"illegal dest scriptPubKey")); if ( is_hexstr(scriptstr,0) == 64 ) { prevhash = juint256(jitem(params,i)); From 0b83ec2d379914cb6adff05cb47a307d1a0167fe Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 06:59:15 -1100 Subject: [PATCH 08/67] +filed --- src/cc/dilithium.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index b7106a95d..71cb505e7 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3330,7 +3330,12 @@ UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params { mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,destpub33)); voutpubtxids.push_back(prevhash); // binds destpub22 CC addr with dilithium bigpub - } else return(cclib_error(result,"couldnt find bigpub at txid")); + } + else + { + result.push_back(Pair("destpubtxid",prevhash.GetHex().c_str())); + return(cclib_error(result,"couldnt find bigpub at destpubtxid")); + } } else { From 3a117c9d928fad05b7e021bb75b78f286be7ce96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:05:27 -1100 Subject: [PATCH 09/67] +print --- src/cc/dilithium.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 71cb505e7..6277e95e0 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3062,15 +3062,18 @@ char *dilithium_hexstr(char *str,uint8_t *buf,int32_t len) int32_t dilithium_bigpubget(std::string &handle,CPubKey &pk33,uint8_t *pk,uint256 pubtxid) { - CTransaction tx; uint256 hashBlock; int32_t numvouts; std::vector bigpub; + CTransaction tx; uint8_t funcid; uint256 hashBlock; int32_t numvouts=0; std::vector bigpub; if ( myGetTransaction(pubtxid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 1 ) { - if ( dilithium_registeropretdecode(handle,pk33,bigpub,tx.vout[numvouts-1].scriptPubKey) == 'R' && bigpub.size() == CRYPTO_PUBLICKEYBYTES ) + if ( (funcid= dilithium_registeropretdecode(handle,pk33,bigpub,tx.vout[numvouts-1].scriptPubKey)) == 'R' && bigpub.size() == CRYPTO_PUBLICKEYBYTES ) { memcpy(pk,&bigpub[0],CRYPTO_PUBLICKEYBYTES); return(0); - } else return(-2); + } + fprintf(stderr,"%s funcid.(%c) size.%d vs %d\n",handle,funcid,(int32_t)bigpub.size(),CRYPTO_PUBLICKEYBYTES); + return(-2); } + fprintf(stderr,"numvouts.%d\n",numvouts); return(-1); } From e658b24151a468b67ae640466dade8516d4adb5a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:06:07 -1100 Subject: [PATCH 10/67] .cstr --- src/cc/dilithium.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 6277e95e0..8eadc72cd 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3070,7 +3070,7 @@ int32_t dilithium_bigpubget(std::string &handle,CPubKey &pk33,uint8_t *pk,uint25 memcpy(pk,&bigpub[0],CRYPTO_PUBLICKEYBYTES); return(0); } - fprintf(stderr,"%s funcid.(%c) size.%d vs %d\n",handle,funcid,(int32_t)bigpub.size(),CRYPTO_PUBLICKEYBYTES); + fprintf(stderr,"%s funcid.(%c) size.%d vs %d\n",handle.c_str(),funcid,(int32_t)bigpub.size(),CRYPTO_PUBLICKEYBYTES); return(-2); } fprintf(stderr,"numvouts.%d\n",numvouts); From fe7f9ef1bf132a069d0c0ac940e54c9dbabb9c51 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:08:23 -1100 Subject: [PATCH 11/67] Test --- src/cc/dilithium.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 8eadc72cd..c0661b64a 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3329,6 +3329,7 @@ UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params if ( is_hexstr(scriptstr,0) == 64 ) { prevhash = juint256(jitem(params,i)); + fprintf(stderr,"call bigpub\n"); if ( dilithium_bigpubget(handle,destpub33,pk2,prevhash) < 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,destpub33)); From 51aa55d3be98e1957f9a993adbfedd932b649581 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:10:59 -1100 Subject: [PATCH 12/67] +print --- src/cc/dilithium.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index c0661b64a..e81425674 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3063,17 +3063,22 @@ char *dilithium_hexstr(char *str,uint8_t *buf,int32_t len) int32_t dilithium_bigpubget(std::string &handle,CPubKey &pk33,uint8_t *pk,uint256 pubtxid) { CTransaction tx; uint8_t funcid; uint256 hashBlock; int32_t numvouts=0; std::vector bigpub; - if ( myGetTransaction(pubtxid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 1 ) + fprintf(stderr,"inside bigpubget\n"); + if ( myGetTransaction(pubtxid,tx,hashBlock) != 0 ) { - if ( (funcid= dilithium_registeropretdecode(handle,pk33,bigpub,tx.vout[numvouts-1].scriptPubKey)) == 'R' && bigpub.size() == CRYPTO_PUBLICKEYBYTES ) + fprintf(stderr,"got tx\n"); + if ( (numvouts= tx.vout.size()) > 1 ) { - memcpy(pk,&bigpub[0],CRYPTO_PUBLICKEYBYTES); - return(0); + if ( (funcid= dilithium_registeropretdecode(handle,pk33,bigpub,tx.vout[numvouts-1].scriptPubKey)) == 'R' && bigpub.size() == CRYPTO_PUBLICKEYBYTES ) + { + memcpy(pk,&bigpub[0],CRYPTO_PUBLICKEYBYTES); + return(0); + } + fprintf(stderr,"%s funcid.(%c) size.%d vs %d\n",handle.c_str(),funcid,(int32_t)bigpub.size(),CRYPTO_PUBLICKEYBYTES); + return(-2); } - fprintf(stderr,"%s funcid.(%c) size.%d vs %d\n",handle.c_str(),funcid,(int32_t)bigpub.size(),CRYPTO_PUBLICKEYBYTES); - return(-2); - } - fprintf(stderr,"numvouts.%d\n",numvouts); + fprintf(stderr,"numvouts.%d\n",numvouts); + } else fprintf(stderr,"no tx\n"); return(-1); } From 1a7a8158d224ea8aaffe25a4a460d9320a7ed661 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:13:43 -1100 Subject: [PATCH 13/67] -print --- src/cc/dilithium.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index e81425674..18c3d8266 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3063,22 +3063,17 @@ char *dilithium_hexstr(char *str,uint8_t *buf,int32_t len) int32_t dilithium_bigpubget(std::string &handle,CPubKey &pk33,uint8_t *pk,uint256 pubtxid) { CTransaction tx; uint8_t funcid; uint256 hashBlock; int32_t numvouts=0; std::vector bigpub; - fprintf(stderr,"inside bigpubget\n"); if ( myGetTransaction(pubtxid,tx,hashBlock) != 0 ) { - fprintf(stderr,"got tx\n"); if ( (numvouts= tx.vout.size()) > 1 ) { if ( (funcid= dilithium_registeropretdecode(handle,pk33,bigpub,tx.vout[numvouts-1].scriptPubKey)) == 'R' && bigpub.size() == CRYPTO_PUBLICKEYBYTES ) { memcpy(pk,&bigpub[0],CRYPTO_PUBLICKEYBYTES); return(0); - } - fprintf(stderr,"%s funcid.(%c) size.%d vs %d\n",handle.c_str(),funcid,(int32_t)bigpub.size(),CRYPTO_PUBLICKEYBYTES); - return(-2); + } else return(-2); } - fprintf(stderr,"numvouts.%d\n",numvouts); - } else fprintf(stderr,"no tx\n"); + } return(-1); } @@ -3334,17 +3329,16 @@ UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params if ( is_hexstr(scriptstr,0) == 64 ) { prevhash = juint256(jitem(params,i)); - fprintf(stderr,"call bigpub\n"); if ( dilithium_bigpubget(handle,destpub33,pk2,prevhash) < 0 ) - { - mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,destpub33)); - voutpubtxids.push_back(prevhash); // binds destpub22 CC addr with dilithium bigpub - } - else { result.push_back(Pair("destpubtxid",prevhash.GetHex().c_str())); return(cclib_error(result,"couldnt find bigpub at destpubtxid")); } + else + { + mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,destpub33)); + voutpubtxids.push_back(prevhash); // binds destpub22 CC addr with dilithium bigpub + } } else { From 9754d8c501aa07acf49374c7fd65790ed607ca9e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:15:48 -1100 Subject: [PATCH 14/67] Test --- src/cc/dilithium.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 18c3d8266..15bf3e2a0 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3073,7 +3073,7 @@ int32_t dilithium_bigpubget(std::string &handle,CPubKey &pk33,uint8_t *pk,uint25 return(0); } else return(-2); } - } + } return(-1); } @@ -3375,7 +3375,7 @@ UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params return(cclib_error(result,"siglen error")); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,dilithium_Qsendopret(destpubtxid,sig,voutpubtxids)); return(dilithium_rawtxresult(result,rawtx)); - } else return(cclib_error(result,"couldnt find vin0")); + } else return(cclib_error(result,"Q couldnt find enough Q or x inputs")); } else return(cclib_error(result,"need to have exactly 2 params sendtxid, scriptPubKey")); } From 2c52e2737a0c31e2c1feb485965bc3d83db53eb0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:19:38 -1100 Subject: [PATCH 15/67] Fix --- src/cc/dilithium.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 15bf3e2a0..3917b61fe 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3373,7 +3373,7 @@ UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params return(cclib_error(result,"dilithium signing error")); else if ( smlen != 32+CRYPTO_BYTES ) return(cclib_error(result,"siglen error")); - rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,dilithium_Qsendopret(destpubtxid,sig,voutpubtxids)); + rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,dilithium_Qsendopret(mypubtxid,sig,voutpubtxids)); return(dilithium_rawtxresult(result,rawtx)); } else return(cclib_error(result,"Q couldnt find enough Q or x inputs")); } else return(cclib_error(result,"need to have exactly 2 params sendtxid, scriptPubKey")); From 7be98a290ec8523cc31940bd27731a1e627c2e67 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:31:19 -1100 Subject: [PATCH 16/67] +comments --- src/cc/dilithium.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 3917b61fe..8b258bf49 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -2916,6 +2916,12 @@ int32_t main(void) cclib Qsend 19 \"[%22mypubtxid%22,%22%22,%22%22,0.777]\" there can be up to 64 outputs, where each one can be a different destpubtxid or scriptPubKey. The only restriction is that scriptPubKey hex cant be 32 bytes. + Qsend is able to spend many Qvins as long as they are for the same dilithium bigpub + secp pub33. And the outputs can be to many different Qvouts or normal vouts. This allows to keep funds totally within the dilithium system and also to transfer back to normal taddrs. Qsend currently only sends from Qfunds, though it could also use funds from normal inputs. + + Currently, to get funds from normal inputs to a dilithium, the send rpc can be used as above. So that provides a way to push funds into dilithium. The spend rpc becomes redundant with Qsend. + + To properly test this, we need to make sure that transactions Qsend can use send outputs, and Qsend outputs and a combination. Of course, it needs to be validated that funds are not lost, Qsends work properly, etc. + */ #define DILITHIUM_TXFEE 10000 From 621ec418fb41fc8083d43534eb52333055ad5156 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 07:37:17 -1100 Subject: [PATCH 17/67] Return true --- src/cc/dilithium.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 8b258bf49..1f893d268 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3433,7 +3433,7 @@ bool dilithium_Qvalidate(struct CCcontract_info *cp,int32_t height,Eval *eval,co return eval->Invalid("failed dilithium verify"); else if ( mlen != 32 || memcmp(msg,msg2,32) != 0 ) return eval->Invalid("failed dilithium msg verify"); - else return eval->Invalid("this is actually a success"); + else return true; } } else return eval->Invalid("failed decode Qsend"); } else return eval->Invalid("unexpected zero signerpubtxid"); From 5c00bf5580e16a0a581e4649eec9fb208def2822 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 08:11:05 -1100 Subject: [PATCH 18/67] Print gametxid in playertxid --- src/cc/rogue_rpc.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index aee151530..4d98855d4 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -364,7 +364,7 @@ int32_t rogue_isvalidgame(struct CCcontract_info *cp,int32_t &gameheight,CTransa } else return(-1); } -UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint256 tokenid,std::string symbol,std::string pname) +UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint256 tokenid,std::string symbol,std::string pname,uint256 gametxid) { int32_t i; struct rogue_player P; char packitemstr[512],*datastr=0; UniValue obj(UniValue::VOBJ),a(UniValue::VARR); memset(&P,0,sizeof(P)); @@ -385,6 +385,7 @@ UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint a.push_back(packitemstr); } obj.push_back(Pair("playertxid",playertxid.GetHex())); + obj.push_back(Pair("gametxid",gametxid.GetHex())); if ( tokenid != zeroid ) obj.push_back(Pair("tokenid",tokenid.GetHex())); else obj.push_back(Pair("tokenid",playertxid.GetHex())); @@ -625,7 +626,7 @@ void rogue_gameplayerinfo(struct CCcontract_info *cp,UniValue &obj,uint256 gamet obj.push_back(Pair("batonvalue",ValueFromAmount(batonvalue))); obj.push_back(Pair("batonht",(int64_t)batonht)); if ( playerdata.size() > 0 ) - obj.push_back(Pair("player",rogue_playerobj(playerdata,playertxid,tokenid,symbol,pname))); + obj.push_back(Pair("player",rogue_playerobj(playerdata,playertxid,tokenid,symbol,pname,gametxid))); } else fprintf(stderr,"findbaton err.%d\n",retval); } @@ -714,7 +715,7 @@ UniValue rogue_playerinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *param playertxid = juint256(jitem(params,0)); if ( rogue_playerdata(cp,origplayergame,tokenid,pk,playerdata,symbol,pname,playertxid) < 0 ) return(cclib_error(result,"invalid playerdata")); - result.push_back(Pair("player",rogue_playerobj(playerdata,playertxid,tokenid,symbol,pname))); + result.push_back(Pair("player",rogue_playerobj(playerdata,playertxid,tokenid,symbol,pname,origplayergame))); } else return(cclib_error(result,"no playertxid")); return(result); } else return(cclib_error(result,"couldnt reparse params")); From fa0f53295c8127ec107f8ff5febb3a88e315e8cf Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 25 Feb 2019 23:51:56 -1100 Subject: [PATCH 19/67] +print --- src/cc/rogue_rpc.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 4d98855d4..a7cefcc45 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -448,6 +448,7 @@ int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,uint { if ( (f= rogue_highlanderopretdecode(gametxid,tokenid,regslot,pk,playerdata,symbol,pname,playertx.vout[numvouts-1].scriptPubKey)) == 'H' || f == 'Q' ) { + fprintf(stderr,"gametxid.%s\n",gametxid.GetHex().c_str()); if ( tokenid != zeroid ) { playertxid = tokenid; @@ -462,6 +463,7 @@ int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,uint //fprintf(stderr,"playertxid.%s got vin.%s/v%d gametxid.%s iterate.%d\n",playertxid.ToString().c_str(),playertx.vin[1].prevout.hash.ToString().c_str(),(int32_t)playertx.vin[1].prevout.n-maxplayers,gametxid.ToString().c_str(),rogue_iterateplayer(registertxid,gametxid,playertx.vin[1].prevout.n-maxplayers,playertxid)); if ( (tokenid != zeroid || playertx.vin[1].prevout.hash == gametxid) && rogue_iterateplayer(registertxid,gametxid,playertx.vin[1].prevout.n-maxplayers,playertxid) == 0 ) { + fprintf(stderr,"gametxid.%s\n",gametxid.GetHex().c_str()); // if registertxid has vin from pk, it can be used return(0); } else fprintf(stderr,"hash mismatch or illegal gametxid\n"); From 67dc3a0d2a8c2f845868ec45eef5c82fdcb2b47d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 26 Feb 2019 00:02:43 -1100 Subject: [PATCH 20/67] Test batontxid --- src/cc/rogue_rpc.cpp | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index a7cefcc45..cf7aa7979 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -366,7 +366,7 @@ int32_t rogue_isvalidgame(struct CCcontract_info *cp,int32_t &gameheight,CTransa UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint256 tokenid,std::string symbol,std::string pname,uint256 gametxid) { - int32_t i; struct rogue_player P; char packitemstr[512],*datastr=0; UniValue obj(UniValue::VOBJ),a(UniValue::VARR); + int32_t i,vout,spentvini,n=0; uint256 txid,spenttxid,hashblock; struct rogue_player P; char packitemstr[512],*datastr=0; UniValue obj(UniValue::VOBJ),a(UniValue::VARR); CTransaction tx; memset(&P,0,sizeof(P)); if ( playerdata.size() > 0 ) { @@ -384,8 +384,38 @@ UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint rogue_packitemstr(packitemstr,&P.roguepack[i]); a.push_back(packitemstr); } - obj.push_back(Pair("playertxid",playertxid.GetHex())); + txid = playertxid; + vout = 0; + while ( CCgettxout(txid,vout,1) < 0 ) + { + spenttxid = zeroid; + spentvini = -1; + if ( (spentvini= myIsutxo_spent(spenttxid,txid,0)) >= 0 ) + txid = spenttxid; + else if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,0) == 0 || spenttxid == zeroid ) + { + fprintf(stderr,"mempool tracking error %s/v0\n",txid.ToString().c_str()); + break; + } + txid = spenttxid; + vout = 0; + if ( myGetTransaction(txid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 1 ) + { + for (i=0; i 1000 ) + break; + } obj.push_back(Pair("gametxid",gametxid.GetHex())); + if ( txid != playertxid ) + obj.push_back(Pair("batontxid",txid.GetHex())); + obj.push_back(Pair("playertxid",playertxid.GetHex())); if ( tokenid != zeroid ) obj.push_back(Pair("tokenid",tokenid.GetHex())); else obj.push_back(Pair("tokenid",playertxid.GetHex())); @@ -448,7 +478,7 @@ int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,uint { if ( (f= rogue_highlanderopretdecode(gametxid,tokenid,regslot,pk,playerdata,symbol,pname,playertx.vout[numvouts-1].scriptPubKey)) == 'H' || f == 'Q' ) { - fprintf(stderr,"gametxid.%s\n",gametxid.GetHex().c_str()); + origplayergame = gametxid; if ( tokenid != zeroid ) { playertxid = tokenid; @@ -463,7 +493,6 @@ int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,uint //fprintf(stderr,"playertxid.%s got vin.%s/v%d gametxid.%s iterate.%d\n",playertxid.ToString().c_str(),playertx.vin[1].prevout.hash.ToString().c_str(),(int32_t)playertx.vin[1].prevout.n-maxplayers,gametxid.ToString().c_str(),rogue_iterateplayer(registertxid,gametxid,playertx.vin[1].prevout.n-maxplayers,playertxid)); if ( (tokenid != zeroid || playertx.vin[1].prevout.hash == gametxid) && rogue_iterateplayer(registertxid,gametxid,playertx.vin[1].prevout.n-maxplayers,playertxid) == 0 ) { - fprintf(stderr,"gametxid.%s\n",gametxid.GetHex().c_str()); // if registertxid has vin from pk, it can be used return(0); } else fprintf(stderr,"hash mismatch or illegal gametxid\n"); From d5dd62e4ee80eb3c3cbd6063a2415c38ab144e0e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 26 Feb 2019 00:03:26 -1100 Subject: [PATCH 21/67] Test --- src/cc/rogue_rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index cf7aa7979..a288e6175 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -366,7 +366,7 @@ int32_t rogue_isvalidgame(struct CCcontract_info *cp,int32_t &gameheight,CTransa UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint256 tokenid,std::string symbol,std::string pname,uint256 gametxid) { - int32_t i,vout,spentvini,n=0; uint256 txid,spenttxid,hashblock; struct rogue_player P; char packitemstr[512],*datastr=0; UniValue obj(UniValue::VOBJ),a(UniValue::VARR); CTransaction tx; + int32_t i,vout,spentvini,n=0; uint256 txid,spenttxid,hashBlock; struct rogue_player P; char packitemstr[512],*datastr=0; UniValue obj(UniValue::VOBJ),a(UniValue::VARR); CTransaction tx; memset(&P,0,sizeof(P)); if ( playerdata.size() > 0 ) { From 7bff2f9229ee1db01881cf3316738233e4598b29 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 26 Feb 2019 00:03:59 -1100 Subject: [PATCH 22/67] Syntax --- src/cc/rogue_rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index a288e6175..52a4a8ce6 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -366,7 +366,7 @@ int32_t rogue_isvalidgame(struct CCcontract_info *cp,int32_t &gameheight,CTransa UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint256 tokenid,std::string symbol,std::string pname,uint256 gametxid) { - int32_t i,vout,spentvini,n=0; uint256 txid,spenttxid,hashBlock; struct rogue_player P; char packitemstr[512],*datastr=0; UniValue obj(UniValue::VOBJ),a(UniValue::VARR); CTransaction tx; + int32_t i,vout,spentvini,numvouts,n=0; uint256 txid,spenttxid,hashBlock; struct rogue_player P; char packitemstr[512],*datastr=0; UniValue obj(UniValue::VOBJ),a(UniValue::VARR); CTransaction tx; memset(&P,0,sizeof(P)); if ( playerdata.size() > 0 ) { From 075ec9cb1bafad85e007e3a63efafde56b84e5f7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 26 Feb 2019 00:06:02 -1100 Subject: [PATCH 23/67] start with vout.1 --- src/cc/rogue_rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 52a4a8ce6..31545dbf8 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -385,7 +385,7 @@ UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint a.push_back(packitemstr); } txid = playertxid; - vout = 0; + vout = 1; while ( CCgettxout(txid,vout,1) < 0 ) { spenttxid = zeroid; From 9ce70a4711fed4631e8686a68917c9302e117d14 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 26 Feb 2019 00:07:52 -1100 Subject: [PATCH 24/67] Fix --- src/cc/rogue_rpc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 31545dbf8..2f263e8aa 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -390,9 +390,9 @@ UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint { spenttxid = zeroid; spentvini = -1; - if ( (spentvini= myIsutxo_spent(spenttxid,txid,0)) >= 0 ) + if ( (spentvini= myIsutxo_spent(spenttxid,txid,vout)) >= 0 ) txid = spenttxid; - else if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,0) == 0 || spenttxid == zeroid ) + else if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,vout) == 0 || spenttxid == zeroid ) { fprintf(stderr,"mempool tracking error %s/v0\n",txid.ToString().c_str()); break; From 8425000e5904f7440797eb7d7bf82daeb22b8afd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 26 Feb 2019 00:09:14 -1100 Subject: [PATCH 25/67] Add gametxid and batontxid to player info --- src/cc/rogue_rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 2f263e8aa..fa4abae24 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -408,7 +408,7 @@ UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint break; } } - fprintf(stderr,"trace spend to %s/v%d\n",txid.GetHex().c_str(),vout); + //fprintf(stderr,"trace spend to %s/v%d\n",txid.GetHex().c_str(),vout); if ( n++ > 1000 ) break; } From ba7adb6aa0688be487da29aed0345c36d63bfc64 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 26 Feb 2019 00:41:44 -1100 Subject: [PATCH 26/67] -print --- src/cc/rogue/rogue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue/rogue.c b/src/cc/rogue/rogue.c index 53f6da353..7cd1874e5 100644 --- a/src/cc/rogue/rogue.c +++ b/src/cc/rogue/rogue.c @@ -599,7 +599,7 @@ int32_t _quit() else { //score(rs,purse, 1, 0); - fprintf(stderr,"done! (%c)\n",c); + //fprintf(stderr,"done! (%c)\n",c); } return(1); } From 5e17fafef0d6ff4cd3500461eda0cb47fd9d9c30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 00:24:44 -1100 Subject: [PATCH 27/67] +/- print --- src/cc/rogue/rogue.c | 4 +++- src/cc/rogue_rpc.cpp | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/cc/rogue/rogue.c b/src/cc/rogue/rogue.c index 7cd1874e5..10fff1dd7 100644 --- a/src/cc/rogue/rogue.c +++ b/src/cc/rogue/rogue.c @@ -169,6 +169,8 @@ int32_t flushkeystrokes(struct rogue_state *rs) { if ( rs->num > 0 ) { + // need to get existing keystrokes including mempool + // create keystrokes that are not saved rogue_progress(rs,rs->seed,rs->buffered,rs->num); memset(rs->buffered,0,sizeof(rs->buffered)); rs->counter++; @@ -229,7 +231,7 @@ int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t nu if ( (fp= fopen("checkfile","wb")) != 0 ) { save_file(rs,fp,0); - fprintf(stderr,"gold.%d hp.%d strength.%d/%d level.%d exp.%d dungeon.%d data[%d]\n",rs->P.gold,rs->P.hitpoints,rs->P.strength&0xffff,rs->P.strength>>16,rs->P.level,rs->P.experience,rs->P.dungeonlevel,rs->playersize); + //fprintf(stderr,"gold.%d hp.%d strength.%d/%d level.%d exp.%d dungeon.%d data[%d]\n",rs->P.gold,rs->P.hitpoints,rs->P.strength&0xffff,rs->P.strength>>16,rs->P.level,rs->P.experience,rs->P.dungeonlevel,rs->playersize); if ( newdata != 0 && rs->playersize > 0 ) memcpy(newdata,rs->playerdata,rs->playersize); } diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index fa4abae24..d4c1776e8 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -941,7 +941,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto else { sprintf(str,"extracted $$$gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d",endP.gold,endP.hitpoints,endP.strength&0xffff,endP.strength>>16,endP.level,endP.experience,endP.dungeonlevel); - fprintf(stderr,"%s\n",str); + //fprintf(stderr,"%s\n",str); *numkeysp = numkeys; return(keystrokes); } @@ -1221,7 +1221,7 @@ UniValue rogue_highlander(uint64_t txfee,struct CCcontract_info *cp,cJSON *param UniValue rogue_gameinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,gameheight,maxplayers,numvouts; uint256 txid; CTransaction tx; int64_t buyin; uint64_t seed; bits256 t; char myrogueaddr[64]; CPubKey mypk,roguepk; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,gameheight,maxplayers,numvouts; uint256 txid; CTransaction tx; int64_t buyin; uint64_t seed; bits256 t; char myrogueaddr[64],str[64]; CPubKey mypk,roguepk; result.push_back(Pair("name","rogue")); result.push_back(Pair("method","gameinfo")); if ( params != 0 && (n= cJSON_GetArraySize(params)) > 0 ) @@ -1248,6 +1248,11 @@ UniValue rogue_gameinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) rogue_gameplayerinfo(cp,obj,txid,tx,i+1,maxplayers,myrogueaddr); a.push_back(obj); } + else + { + fprintf(str,"vout %d+1 is unspent",i); + result.push_back(Pair("unspent",str)); + } } result.push_back(Pair("players",a)); } else return(cclib_error(result,"couldnt find valid game")); @@ -1469,7 +1474,15 @@ bool rogue_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const C if ( funcid == 'H' ) cashout *= 2; if ( tx.vout.size() > 3 ) // orig of 't' has 0 cashout - fprintf(stderr,"ht.%d txid.%s cashout %.8f vs vout2 %.8f\n",height,txid.GetHex().c_str(),(double)cashout/COIN,(double)tx.vout[2].nValue/COIN); + { + static char laststr[512]; + fprintf(cashstr,"ht.%d txid.%s %d,%d %.8f vs vout2 %.8f",height,txid.GetHex().c_str(),tokentx,decoded,(double)cashout/COIN,(double)tx.vout[2].nValue/COIN); + if ( strcmp(laststr,cashstr) != 0 ) + { + strcpy(laststr,cashstr); + fprintf(stderr,"%s\n",cashstr); + } + } } if ( funcid == 'Q' ) { From f20724fcef51849562925743fd6235be9da8bfdf Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 00:25:48 -1100 Subject: [PATCH 28/67] S --- src/cc/rogue_rpc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index d4c1776e8..619feef69 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -1250,7 +1250,7 @@ UniValue rogue_gameinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) } else { - fprintf(str,"vout %d+1 is unspent",i); + sprintf(str,"vout %d+1 is unspent",i); result.push_back(Pair("unspent",str)); } } @@ -1476,7 +1476,7 @@ bool rogue_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const C if ( tx.vout.size() > 3 ) // orig of 't' has 0 cashout { static char laststr[512]; - fprintf(cashstr,"ht.%d txid.%s %d,%d %.8f vs vout2 %.8f",height,txid.GetHex().c_str(),tokentx,decoded,(double)cashout/COIN,(double)tx.vout[2].nValue/COIN); + sprintf(cashstr,"ht.%d txid.%s %d,%d %.8f vs vout2 %.8f",height,txid.GetHex().c_str(),tokentx,decoded,(double)cashout/COIN,(double)tx.vout[2].nValue/COIN); if ( strcmp(laststr,cashstr) != 0 ) { strcpy(laststr,cashstr); From 26b114c0c661315a1839279255336e7f65dfbab8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 00:26:32 -1100 Subject: [PATCH 29/67] Cashstr --- src/cc/rogue_rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 619feef69..481224d90 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -1475,7 +1475,7 @@ bool rogue_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const C cashout *= 2; if ( tx.vout.size() > 3 ) // orig of 't' has 0 cashout { - static char laststr[512]; + static char laststr[512]; char cashstr[512]; sprintf(cashstr,"ht.%d txid.%s %d,%d %.8f vs vout2 %.8f",height,txid.GetHex().c_str(),tokentx,decoded,(double)cashout/COIN,(double)tx.vout[2].nValue/COIN); if ( strcmp(laststr,cashstr) != 0 ) { From 36ffbed7d1df8df196aaf77e494c27296c30c0b6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 00:32:04 -1100 Subject: [PATCH 30/67] +print --- src/cc/rogue_rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 481224d90..d238abc2f 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -577,7 +577,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-2); } txid = spenttxid; - //fprintf(stderr,"next txid.%s/v%d\n",txid.GetHex().c_str(),spentvini); +fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); if ( spentvini != 0 ) return(-3); if ( keystrokesp != 0 && myGetTransaction(spenttxid,spenttx,hashBlock) != 0 && spenttx.vout.size() >= 2 ) From 0942e9e47c69d6b40e403921b54697c1091ac93e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 00:41:55 -1100 Subject: [PATCH 31/67] terminate baton search when non-zero spentvini --- src/cc/rogue_rpc.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index d238abc2f..8bd8d4bf2 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -528,8 +528,8 @@ int32_t rogue_playerdataspend(CMutableTransaction &mtx,uint256 playertxid,int32_ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **keystrokesp,int32_t &numkeys,int32_t ®slot,std::vector &playerdata,uint256 &batontxid,int32_t &batonvout,int64_t &batonvalue,int32_t &batonht,uint256 gametxid,CTransaction gametx,int32_t maxplayers,char *destaddr,int32_t &numplayers,std::string &symbol,std::string &pname) { int32_t i,numvouts,spentvini,n,matches = 0; CPubKey pk; uint256 tid,active,spenttxid,tokenid,hashBlock,txid,origplayergame; CTransaction spenttx,matchtx,batontx; std::vector checkdata; CBlockIndex *pindex; char ccaddr[64],*keystrokes=0; - numkeys = numplayers = 0; - playertxid = zeroid; + batonvalue = numkeys = numplayers = batonht = 0; + playertxid = batontxid = zeroid; for (i=0; i= 2 ) { uint256 g,b; CPubKey p; std::vector k; From 0e567288cde35925be33dafcba17ad4f6d21797e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 01:34:42 -1100 Subject: [PATCH 32/67] +print --- src/cc/rogue_rpc.cpp | 228 ++++++++++++++++++++++++------------------- 1 file changed, 130 insertions(+), 98 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 8bd8d4bf2..158b2a7c6 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -277,25 +277,9 @@ int32_t rogue_iamregistered(int32_t maxplayers,uint256 gametxid,CTransaction tx, return(0); } -int32_t rogue_playersalive(int32_t &numplayers,uint256 gametxid,int32_t maxplayers) -{ - int32_t i,alive = 0; uint64_t txfee = 10000; - numplayers = 0; - for (i=0; iGetHeight(); @@ -317,9 +301,10 @@ uint64_t rogue_gamefields(UniValue &obj,int64_t maxplayers,int64_t buyin,uint256 obj.push_back(Pair("run",cmd)); } } + obj.push_back(Pair("alive",rogue_playersalive(openslots,numplayers,gametxid,maxplayers,ht,tx))); + obj.push_back(Pair("openslots",openslots)); + obj.push_back(Pair("numplayers",numplayers)); } - obj.push_back(Pair("alive",rogue_playersalive(numplayers,gametxid,maxplayers))); - obj.push_back(Pair("numplayers",numplayers)); obj.push_back(Pair("maxplayers",maxplayers)); obj.push_back(Pair("buyin",ValueFromAmount(buyin))); return(seed); @@ -550,85 +535,129 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke } if ( matches == 1 ) { - if ( 1 || myIsutxo_spent(spenttxid,gametxid,maxplayers+i+1) < 0 ) + numvouts = matchtx.vout.size(); + //fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); + if ( rogue_registeropretdecode(txid,tokenid,playertxid,matchtx.vout[numvouts-1].scriptPubKey) == 'R' )//&& txid == gametxid ) { - numvouts = matchtx.vout.size(); - //fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); - if ( rogue_registeropretdecode(txid,tokenid,playertxid,matchtx.vout[numvouts-1].scriptPubKey) == 'R' )//&& txid == gametxid ) + //fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); + if ( tokenid != zeroid ) + active = tokenid; + else active = playertxid; + if ( active == zeroid || rogue_playerdata(cp,origplayergame,tid,pk,playerdata,symbol,pname,active) == 0 ) { - //fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); - if ( tokenid != zeroid ) - active = tokenid; - else active = playertxid; - if ( active == zeroid || rogue_playerdata(cp,origplayergame,tid,pk,playerdata,symbol,pname,active) == 0 ) + txid = matchtx.GetHash(); + //fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); + n = 0; + while ( CCgettxout(txid,0,1) < 0 ) { - txid = matchtx.GetHash(); - //fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); - n = 0; - while ( CCgettxout(txid,0,1) < 0 ) - { - spenttxid = zeroid; - spentvini = -1; - if ( (spentvini= myIsutxo_spent(spenttxid,txid,0)) >= 0 ) - txid = spenttxid; - else if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,0) == 0 || spenttxid == zeroid ) - { - fprintf(stderr,"mempool tracking error %s/v0\n",txid.ToString().c_str()); - return(-2); - } + spenttxid = zeroid; + spentvini = -1; + if ( (spentvini= myIsutxo_spent(spenttxid,txid,0)) >= 0 ) txid = spenttxid; -//fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); - if ( spentvini != 0 ) // game is over? - { - return(0); - } - if ( keystrokesp != 0 && myGetTransaction(spenttxid,spenttx,hashBlock) != 0 && spenttx.vout.size() >= 2 ) - { - uint256 g,b; CPubKey p; std::vector k; - if ( rogue_keystrokesopretdecode(g,b,p,k,spenttx.vout[spenttx.vout.size()-1].scriptPubKey) == 'K' ) - { - keystrokes = (char *)realloc(keystrokes,numkeys + (int32_t)k.size()); - for (i=0; i= ROGUE_MAXITERATIONS ) - { - fprintf(stderr,"rogue_findbaton n.%d, seems something is wrong\n",n); - return(-5); - } - //fprintf(stderr,"n.%d txid.%s\n",n,txid.GetHex().c_str()); - } - //fprintf(stderr,"set baton %s\n",txid.GetHex().c_str()); - batontxid = txid; - batonvout = 0; // not vini - // how to detect timeout, bailedout, highlander - hashBlock = zeroid; - if ( myGetTransaction(batontxid,batontx,hashBlock) != 0 && batontx.vout.size() > 0 ) + else if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,0) == 0 || spenttxid == zeroid ) + { + fprintf(stderr,"mempool tracking error %s/v0\n",txid.ToString().c_str()); + return(-2); + } + txid = spenttxid; + //fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); + if ( spentvini != 0 ) // game is over? { - if ( hashBlock == zeroid ) - batonht = komodo_nextheight(); - else if ( (pindex= komodo_blockindex(hashBlock)) == 0 ) - return(-4); - else batonht = pindex->GetHeight(); - batonvalue = batontx.vout[0].nValue; - //printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); return(0); - } else fprintf(stderr,"couldnt find baton\n"); - } else fprintf(stderr,"error with playerdata\n"); - } else fprintf(stderr,"findbaton opret error\n"); - } - else - { - fprintf(stderr,"already played\n"); - return(-6); - } + } + if ( keystrokesp != 0 && myGetTransaction(spenttxid,spenttx,hashBlock) != 0 && spenttx.vout.size() >= 2 ) + { + uint256 g,b; CPubKey p; std::vector k; + if ( rogue_keystrokesopretdecode(g,b,p,k,spenttx.vout[spenttx.vout.size()-1].scriptPubKey) == 'K' ) + { + keystrokes = (char *)realloc(keystrokes,numkeys + (int32_t)k.size()); + for (i=0; i= ROGUE_MAXITERATIONS ) + { + fprintf(stderr,"rogue_findbaton n.%d, seems something is wrong\n",n); + return(-5); + } + //fprintf(stderr,"n.%d txid.%s\n",n,txid.GetHex().c_str()); + } + //fprintf(stderr,"set baton %s\n",txid.GetHex().c_str()); + batontxid = txid; + batonvout = 0; // not vini + // how to detect timeout, bailedout, highlander + hashBlock = zeroid; + if ( myGetTransaction(batontxid,batontx,hashBlock) != 0 && batontx.vout.size() > 0 ) + { + if ( hashBlock == zeroid ) + batonht = komodo_nextheight(); + else if ( (pindex= komodo_blockindex(hashBlock)) == 0 ) + return(-4); + else batonht = pindex->GetHeight(); + batonvalue = batontx.vout[0].nValue; + //printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); + return(0); + } else fprintf(stderr,"couldnt find baton\n"); + } else fprintf(stderr,"error with playerdata\n"); + } else fprintf(stderr,"findbaton opret error\n"); } return(-1); } +int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametxid,int32_t maxplayers,int32_t gameht,CTransaction gametx) +{ + int32_t i,n,vout,spentvini,registration_open = 0,alive = 0; CTransaction tx; uint256 txid,spenttxid,hashBlock; CBlockIndex *pindex; uint64_t txfee = 10000; + numplayers = openslots = 0; + if ( komodo_nextheight() <= gameheight+ROGUE_MAXKEYSTROKESGAP ) + registration_open = 1; + for (i=0; i= 0 ) + txid = spenttxid; + else if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,vout) == 0 || spenttxid == zeroid ) + { + fprintf(stderr,"mempool tracking error %s/v0\n",txid.ToString().c_str()); + break; + } + txid = spenttxid; + vout = 0; + fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); + if ( spentvini != 0 ) + break; + if ( n++ > 1000 ) + break; + } + if ( txid != zeroid ) + { + if ( myGetTransaction(txid,tx,hashBlock) != 0 && (pindex= komodo_blockindex(hashBlock)) != 0 ) + { + if ( pindex->GetHeight() <= gameheight+ROGUE_MAXKEYSTROKESGAP ) + alive++; + } + } + } + } + else if ( registration_open != 0 ) + openslots++; + } + return(alive); +} + void rogue_gameplayerinfo(struct CCcontract_info *cp,UniValue &obj,uint256 gametxid,CTransaction gametx,int32_t vout,int32_t maxplayers,char *myrogueaddr) { // identify if bailout or quit or timed out @@ -883,7 +912,7 @@ UniValue rogue_keystrokes(uint64_t txfee,struct CCcontract_info *cp,cJSON *param char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vector &newdata,uint64_t &seed,uint256 &playertxid,struct CCcontract_info *cp,uint256 gametxid,char *rogueaddr) { - CPubKey roguepk; int32_t i,num,maxplayers,gameheight,batonht,batonvout,numplayers,regslot,numkeys,err; std::string symbol,pname; CTransaction gametx; int64_t buyin,batonvalue; char fname[64],*keystrokes = 0; std::vector playerdata; uint256 batontxid; FILE *fp; uint8_t newplayer[10000]; struct rogue_player P,endP; + CPubKey roguepk; int32_t i,num,retval,maxplayers,gameheight,batonht,batonvout,numplayers,regslot,numkeys,err; std::string symbol,pname; CTransaction gametx; int64_t buyin,batonvalue; char fname[64],*keystrokes = 0; std::vector playerdata; uint256 batontxid; FILE *fp; uint8_t newplayer[10000]; struct rogue_player P,endP; roguepk = GetUnspendable(cp,0); *numkeysp = 0; seed = 0; @@ -891,7 +920,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto playertxid = zeroid; if ( (err= rogue_isvalidgame(cp,gameheight,gametx,buyin,maxplayers,gametxid,0)) == 0 ) { - if ( rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,rogueaddr,numplayers,symbol,pname) == 0 ) + if ( (retval= rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,rogueaddr,numplayers,symbol,pname)) == 0 ) { UniValue obj; seed = rogue_gamefields(obj,maxplayers,buyin,gametxid,rogueaddr); @@ -951,7 +980,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto } else { - fprintf(stderr,"extractgame: couldnt find baton keystrokes.%p\n",keystrokes); + fprintf(stderr,"extractgame: couldnt find baton keystrokes.%p retval.%d\n",keystrokes,retval); if ( keystrokes != 0 ) free(keystrokes), keystrokes = 0; } @@ -1155,8 +1184,6 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param } else { - //if ( maxplayers == 1 ) - // mult /= 2; cpTokens = CCinit(&tokensC, EVAL_TOKENS); mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS, txfee, GetUnspendable(cpTokens,NULL))); // marker to token cc addr, burnable and validated mtx.vout.push_back(MakeTokensCC1vout(cp->evalcode,1,mypk)); @@ -1169,8 +1196,13 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param fprintf(stderr,"\nextracted $$$gold.%d -> %.8f ROGUE hp.%d strength.%d/%d level.%d exp.%d dl.%d n.%d amulet.%d\n",P.gold,(double)cashout/COIN,P.hitpoints,P.strength&0xffff,P.strength>>16,P.level,P.experience,P.dungeonlevel,n,P.amulet); if ( funcid == 'H' && maxplayers > 1 ) { - if ( (numplayers != maxplayers || (numplayers - rogue_playersalive(tmp,gametxid,maxplayers)) > 1) && P.amulet == 0 ) - return(cclib_error(result,"highlander must be a winner or last one standing")); + if ( P.amulet == 0 ) + { + if ( numplayers != maxplayers ) + return(cclib_error(result,"numplayers != maxplayers")); + else if ( rogue_playersalive(tmp,tmp,gametxid,maxplayers,gameheight,gametx) > 1 ) + return(cclib_error(result,"highlander must be a winner or last one standing")); + } cashout += numplayers * buyin; } if ( cashout >= txfee ) @@ -1265,7 +1297,7 @@ UniValue rogue_gameinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) UniValue rogue_pending(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); int64_t buyin; uint256 txid,hashBlock; CTransaction tx; int32_t maxplayers,numplayers,gameheight,nextheight,vout,numvouts; CPubKey roguepk; char coinaddr[64]; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); int64_t buyin; uint256 txid,hashBlock; CTransaction tx; int32_t openslots,maxplayers,numplayers,gameheight,nextheight,vout,numvouts; CPubKey roguepk; char coinaddr[64]; std::vector > unspentOutputs; roguepk = GetUnspendable(cp,0); GetCCaddress(cp,coinaddr,roguepk); @@ -1280,8 +1312,8 @@ UniValue rogue_pending(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) continue; if ( rogue_isvalidgame(cp,gameheight,tx,buyin,maxplayers,txid,1) == 0 && nextheight <= gameheight+ROGUE_MAXKEYSTROKESGAP ) { - rogue_playersalive(numplayers,txid,maxplayers); - if ( numplayers < maxplayers ) + rogue_playersalive(openslots,numplayers,txid,maxplayers,gameheight,tx); + if ( openslots > 0 ) a.push_back(txid.GetHex()); } } From 9b6c331f8105d7ec17f7c9450bdbe1357a201fae Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 01:40:44 -1100 Subject: [PATCH 33/67] Synth --- src/cc/rogue_rpc.cpp | 70 ++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 158b2a7c6..b418926dc 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -277,39 +277,6 @@ int32_t rogue_iamregistered(int32_t maxplayers,uint256 gametxid,CTransaction tx, return(0); } -uint64_t rogue_gamefields(UniValue &obj,int64_t maxplayers,int64_t buyin,uint256 gametxid,char *myrogueaddr) -{ - CBlockIndex *pindex; int32_t ht,openslots,delay,numplayers; uint256 hashBlock; uint64_t seed=0; char cmd[512]; CTransaction tx; - if ( myGetTransaction(gametxid,tx,hashBlock) != 0 && (pindex= komodo_blockindex(hashBlock)) != 0 ) - { - ht = pindex->GetHeight(); - delay = ROGUE_REGISTRATION * (maxplayers > 1); - obj.push_back(Pair("height",ht)); - obj.push_back(Pair("start",ht+delay)); - if ( komodo_nextheight() > ht+delay ) - { - if ( (pindex= komodo_chainactive(ht+delay)) != 0 ) - { - hashBlock = pindex->GetBlockHash(); - obj.push_back(Pair("starthash",hashBlock.ToString())); - memcpy(&seed,&hashBlock,sizeof(seed)); - seed &= (1LL << 62) - 1; - obj.push_back(Pair("seed",(int64_t)seed)); - if ( rogue_iamregistered(maxplayers,gametxid,tx,myrogueaddr) > 0 ) - sprintf(cmd,"cc/rogue/rogue %llu %s",(long long)seed,gametxid.ToString().c_str()); - else sprintf(cmd,"./komodo-cli -ac_name=%s cclib register %d \"[%%22%s%%22]\"",ASSETCHAINS_SYMBOL,EVAL_ROGUE,gametxid.ToString().c_str()); - obj.push_back(Pair("run",cmd)); - } - } - obj.push_back(Pair("alive",rogue_playersalive(openslots,numplayers,gametxid,maxplayers,ht,tx))); - obj.push_back(Pair("openslots",openslots)); - obj.push_back(Pair("numplayers",numplayers)); - } - obj.push_back(Pair("maxplayers",maxplayers)); - obj.push_back(Pair("buyin",ValueFromAmount(buyin))); - return(seed); -} - int32_t rogue_isvalidgame(struct CCcontract_info *cp,int32_t &gameheight,CTransaction &tx,int64_t &buyin,int32_t &maxplayers,uint256 txid,int32_t unspentv0) { uint256 hashBlock; int32_t i,numvouts; char coinaddr[64]; CPubKey roguepk; uint64_t txfee = 10000; @@ -610,7 +577,7 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx { int32_t i,n,vout,spentvini,registration_open = 0,alive = 0; CTransaction tx; uint256 txid,spenttxid,hashBlock; CBlockIndex *pindex; uint64_t txfee = 10000; numplayers = openslots = 0; - if ( komodo_nextheight() <= gameheight+ROGUE_MAXKEYSTROKESGAP ) + if ( komodo_nextheight() <= gameht+ROGUE_MAXKEYSTROKESGAP ) registration_open = 1; for (i=0; iGetHeight() <= gameheight+ROGUE_MAXKEYSTROKESGAP ) + if ( pindex->GetHeight() <= gameht+ROGUE_MAXKEYSTROKESGAP ) alive++; } } @@ -658,6 +625,39 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx return(alive); } +uint64_t rogue_gamefields(UniValue &obj,int64_t maxplayers,int64_t buyin,uint256 gametxid,char *myrogueaddr) +{ + CBlockIndex *pindex; int32_t ht,openslots,delay,numplayers; uint256 hashBlock; uint64_t seed=0; char cmd[512]; CTransaction tx; + if ( myGetTransaction(gametxid,tx,hashBlock) != 0 && (pindex= komodo_blockindex(hashBlock)) != 0 ) + { + ht = pindex->GetHeight(); + delay = ROGUE_REGISTRATION * (maxplayers > 1); + obj.push_back(Pair("height",ht)); + obj.push_back(Pair("start",ht+delay)); + if ( komodo_nextheight() > ht+delay ) + { + if ( (pindex= komodo_chainactive(ht+delay)) != 0 ) + { + hashBlock = pindex->GetBlockHash(); + obj.push_back(Pair("starthash",hashBlock.ToString())); + memcpy(&seed,&hashBlock,sizeof(seed)); + seed &= (1LL << 62) - 1; + obj.push_back(Pair("seed",(int64_t)seed)); + if ( rogue_iamregistered(maxplayers,gametxid,tx,myrogueaddr) > 0 ) + sprintf(cmd,"cc/rogue/rogue %llu %s",(long long)seed,gametxid.ToString().c_str()); + else sprintf(cmd,"./komodo-cli -ac_name=%s cclib register %d \"[%%22%s%%22]\"",ASSETCHAINS_SYMBOL,EVAL_ROGUE,gametxid.ToString().c_str()); + obj.push_back(Pair("run",cmd)); + } + } + obj.push_back(Pair("alive",rogue_playersalive(openslots,numplayers,gametxid,maxplayers,ht,tx))); + obj.push_back(Pair("openslots",openslots)); + obj.push_back(Pair("numplayers",numplayers)); + } + obj.push_back(Pair("maxplayers",maxplayers)); + obj.push_back(Pair("buyin",ValueFromAmount(buyin))); + return(seed); +} + void rogue_gameplayerinfo(struct CCcontract_info *cp,UniValue &obj,uint256 gametxid,CTransaction gametx,int32_t vout,int32_t maxplayers,char *myrogueaddr) { // identify if bailout or quit or timed out From bfdd14c4fdc1c67c45fc99e1c560dcbadc09398c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 01:45:31 -1100 Subject: [PATCH 34/67] +prints --- src/cc/rogue_rpc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index b418926dc..f4bc769f5 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -503,17 +503,17 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke if ( matches == 1 ) { numvouts = matchtx.vout.size(); - //fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); + fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); if ( rogue_registeropretdecode(txid,tokenid,playertxid,matchtx.vout[numvouts-1].scriptPubKey) == 'R' )//&& txid == gametxid ) { - //fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); + fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); if ( tokenid != zeroid ) active = tokenid; else active = playertxid; if ( active == zeroid || rogue_playerdata(cp,origplayergame,tid,pk,playerdata,symbol,pname,active) == 0 ) { txid = matchtx.GetHash(); - //fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); + fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); n = 0; while ( CCgettxout(txid,0,1) < 0 ) { @@ -527,7 +527,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-2); } txid = spenttxid; - //fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); + fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); if ( spentvini != 0 ) // game is over? { return(0); @@ -564,7 +564,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-4); else batonht = pindex->GetHeight(); batonvalue = batontx.vout[0].nValue; - //printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); + printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); return(0); } else fprintf(stderr,"couldnt find baton\n"); } else fprintf(stderr,"error with playerdata\n"); From 4e9aa2136d513419947bf2cad6626c445b27cd59 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 01:55:59 -1100 Subject: [PATCH 35/67] add rogueaddr to extract --- src/cc/rogue_rpc.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index f4bc769f5..52a514870 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -996,6 +996,7 @@ UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) roguepk = GetUnspendable(cp,0); result.push_back(Pair("name","rogue")); result.push_back(Pair("method","extract")); + rogueaddr[0] = 0; if ( params != 0 && (n= cJSON_GetArraySize(params)) > 0 ) { if ( n > 0 ) @@ -1004,14 +1005,20 @@ UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) result.push_back(Pair("gametxid",gametxid.GetHex())); if ( n == 2 ) { - if ( (pubstr= jstr(jitem(params,1),0)) != 0 && strlen(pubstr) == 66 ) + if ( (pubstr= jstr(jitem(params,1),0)) != 0 ) { - decode_hex(pub33,33,pubstr); - pk = buf2pk(pub33); + if (strlen(pubstr) == 66 ) + { + decode_hex(pub33,33,pubstr); + pk = buf2pk(pub33); + } + else if ( strlen(pub33) < 36 ) + strcpy(rogueaddr,pubstr); } //fprintf(stderr,"gametxid.%s %s\n",gametxid.GetHex().c_str(),pubstr); } - GetCCaddress1of2(cp,rogueaddr,roguepk,pk); + if ( rogueaddr[0] == 0 ) + GetCCaddress1of2(cp,rogueaddr,roguepk,pk); result.push_back(Pair("rogueaddr",rogueaddr)); str[0] = 0; if ( (keystrokes= rogue_extractgame(1,str,&numkeys,newdata,seed,playertxid,cp,gametxid,rogueaddr)) != 0 ) From 885acadeb53181f28b5af983bcb2111b1a44d904 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 01:56:53 -1100 Subject: [PATCH 36/67] pubstr --- src/cc/rogue_rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 52a514870..75eb1ab6b 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -1012,7 +1012,7 @@ UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) decode_hex(pub33,33,pubstr); pk = buf2pk(pub33); } - else if ( strlen(pub33) < 36 ) + else if ( strlen(pubstr) < 36 ) strcpy(rogueaddr,pubstr); } //fprintf(stderr,"gametxid.%s %s\n",gametxid.GetHex().c_str(),pubstr); From e4d71c9ada40fdcb137ce05b67c16f9ac3960f2e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 02:01:06 -1100 Subject: [PATCH 37/67] -print --- src/cc/rogue_rpc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 75eb1ab6b..5553c9c2a 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -503,17 +503,17 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke if ( matches == 1 ) { numvouts = matchtx.vout.size(); - fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); + //fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); if ( rogue_registeropretdecode(txid,tokenid,playertxid,matchtx.vout[numvouts-1].scriptPubKey) == 'R' )//&& txid == gametxid ) { - fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); + //fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); if ( tokenid != zeroid ) active = tokenid; else active = playertxid; if ( active == zeroid || rogue_playerdata(cp,origplayergame,tid,pk,playerdata,symbol,pname,active) == 0 ) { txid = matchtx.GetHash(); - fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); + //fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); n = 0; while ( CCgettxout(txid,0,1) < 0 ) { @@ -527,7 +527,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-2); } txid = spenttxid; - fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); + //fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); if ( spentvini != 0 ) // game is over? { return(0); @@ -564,7 +564,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-4); else batonht = pindex->GetHeight(); batonvalue = batontx.vout[0].nValue; - printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); + //printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); return(0); } else fprintf(stderr,"couldnt find baton\n"); } else fprintf(stderr,"error with playerdata\n"); From 47ec1a61e396613e83abd3897bbe013463ee9177 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 02:13:59 -1100 Subject: [PATCH 38/67] Keystrokes --- src/cc/rogue_rpc.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 5553c9c2a..c05b02a91 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -971,7 +971,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto } else { - sprintf(str,"extracted $$$gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d",endP.gold,endP.hitpoints,endP.strength&0xffff,endP.strength>>16,endP.level,endP.experience,endP.dungeonlevel); + sprintf(str,"$$$gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d",endP.gold,endP.hitpoints,endP.strength&0xffff,endP.strength>>16,endP.level,endP.experience,endP.dungeonlevel); //fprintf(stderr,"%s\n",str); *numkeysp = numkeys; return(keystrokes); @@ -991,7 +991,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { - UniValue result(UniValue::VOBJ); CPubKey pk,roguepk; int32_t i,n,numkeys,flag = 0; uint64_t seed; char str[512],rogueaddr[64],*pubstr,*keystrokes = 0; std::vector newdata; uint256 gametxid,playertxid; FILE *fp; uint8_t pub33[33]; + UniValue result(UniValue::VOBJ); CPubKey pk,roguepk; int32_t i,n,numkeys,flag = 0; uint64_t seed; char str[512],rogueaddr[64],*pubstr,*hexstr,*keystrokes = 0; std::vector newdata; uint256 gametxid,playertxid; FILE *fp; uint8_t pub33[33]; pk = pubkey2pk(Mypubkey()); roguepk = GetUnspendable(cp,0); result.push_back(Pair("name","rogue")); @@ -1025,9 +1025,15 @@ UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { result.push_back(Pair("status","success")); flag = 1; + hexstr = malloc(numkeys*2 + 1) + for (i=0; i Date: Wed, 27 Feb 2019 02:15:06 -1100 Subject: [PATCH 39/67] Char * --- src/cc/rogue_rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index c05b02a91..4d0011d06 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -1025,7 +1025,7 @@ UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { result.push_back(Pair("status","success")); flag = 1; - hexstr = malloc(numkeys*2 + 1) + hexstr = (char *)malloc(numkeys*2 + 1); for (i=0; i Date: Wed, 27 Feb 2019 03:05:41 -1100 Subject: [PATCH 40/67] Test --- src/cc/rogue/main.c | 68 ++++++++++++++++++++++++++++++++++++++++++-- src/cc/rogue/rogue.c | 21 +++++++------- src/cc/rogue/rogue.h | 10 ++++--- src/cc/rogue_rpc.cpp | 8 +++--- 4 files changed, 86 insertions(+), 21 deletions(-) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index 2daa1d0c7..d814bcbd3 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -708,11 +708,48 @@ char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port) #include "rogue.h" -void rogue_progress(struct rogue_state *rs,uint64_t seed,char *keystrokes,int32_t num) +int32_t rogue_confirmed(uint256 txid) { - char cmd[16384],hexstr[16384],params[32768],*retstr; int32_t i; + char params[512],*retstr; cJSON *retjson; int32_t numconfs = -1; + sprintf(params,"[\"%s\"]",txid.GetHex().c_str()); + if ( (retstr= komodo_issuemethod(USERPASS,"getrawtransaction",params,ROGUE_PORT)) != 0 ) + { + fprintf(stderr,"params.(%s) -> %s\n",params,retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + numconfs = juint(retjson,"confirmations"); + free_json(retjson); + } + free(retstr); + } + fprintf(stderr,"numconfs %d\n",numconfs); + return(numconfs); +} + +void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char *keystrokes,int32_t num) +{ + char cmd[16384],hexstr[16384],params[32768],*retstr; int32_t i; uint256 txid; + memset(&txid,0,sizeof(txid)); if ( rs->guiflag != 0 && Gametxidstr[0] != 0 ) { + if ( rs->keytxid != zeroid ) + { + if ( rogue_confirmed(rs->keytxid) < 2 ) + { + if ( waitflag == 0 ) + return(0); + else + { + while ( rogue_confirmed(rs->keytxid) < 2 ) + { + fprintf(stderr,"pre-rebroadcast\n"); + RelayTransaction(rs->keystrokestx); + sleep(10); + } + } + } + rs->keytxid = zeroid; + } for (i=0; ikeystrokestx = tx; + rs->keytxid = txid; + fprintf(stderr,"set keystrokestx <- %s\n",txid.GetHex().c_str()); + } + } + } + free_json(retjson); + } free(retstr); } - sleep(1); + if ( waitflag != 0 && rs->keytxid != zeroid ) + { + while ( rogue_confirmed(rs->keytxid) < 2 ) + { + fprintf(stderr,"post-rebroadcast\n"); + RelayTransaction(rs->keystrokestx); + sleep(3); + } + } } } } diff --git a/src/cc/rogue/rogue.c b/src/cc/rogue/rogue.c index 10fff1dd7..2b8a0ffc0 100644 --- a/src/cc/rogue/rogue.c +++ b/src/cc/rogue/rogue.c @@ -119,7 +119,7 @@ int32_t roguefname(char *fname,uint64_t seed,int32_t counter) } #ifdef test -int32_t flushkeystrokes(struct rogue_state *rs) +int32_t flushkeystrokes(struct rogue_state *rs,int32_t waitflag) { char fname[1024]; FILE *fp; int32_t i,retflag = -1; roguefname(fname,rs->seed,rs->counter); @@ -155,7 +155,7 @@ int32_t flushkeystrokes(struct rogue_state *rs) #ifdef BUILD_ROGUE // stubs for inside daemon -void rogue_progress(struct rogue_state *rs,uint64_t seed,char *keystrokes,int32_t num) +void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char *keystrokes,int32_t num) { } @@ -165,16 +165,17 @@ int32_t rogue_setplayerdata(struct rogue_state *rs,char *gametxidstr) } #endif -int32_t flushkeystrokes(struct rogue_state *rs) +int32_t flushkeystrokes(struct rogue_state *rs,int32_t waitflag) { if ( rs->num > 0 ) { // need to get existing keystrokes including mempool // create keystrokes that are not saved - rogue_progress(rs,rs->seed,rs->buffered,rs->num); + //rs->keytxid = rogue_progress(rs,waitflag,rs->seed,&rs->buffered[rs->lastnum],rs->num - rs->lastnum); + //rs->lastnum = rs->num; + rogue_progress(rs,waitflag,rs->seed,rs->buffered,rs->num); memset(rs->buffered,0,sizeof(rs->buffered)); rs->counter++; - rs->num = 0; } return(0); } @@ -182,7 +183,7 @@ int32_t flushkeystrokes(struct rogue_state *rs) void rogue_bailout(struct rogue_state *rs) { char cmd[512]; - flushkeystrokes(rs); + flushkeystrokes(rs,1); //sleep(5); return; /*fprintf(stderr,"bailing out\n"); @@ -562,15 +563,15 @@ playit(struct rogue_state *rs) } else { - if ( rs->needflush != 0 && rs->num > 1000 ) + if ( rs->needflush != 0 ) { - if ( flushkeystrokes(rs) == 0 ) + if ( flushkeystrokes(rs,0) == 0 ) rs->needflush = 0; } } } if ( rs->guiflag != 0 ) - flushkeystrokes(rs); + flushkeystrokes(rs,1); endit(0); } @@ -595,7 +596,7 @@ int32_t _quit() if ( rs->sleeptime != 0 ) refresh(); score(rs,purse, 1, 0); - flushkeystrokes(rs); + flushkeystrokes(rs,1); my_exit(0); } else diff --git a/src/cc/rogue/rogue.h b/src/cc/rogue/rogue.h index b64af8f1a..e5ea51771 100644 --- a/src/cc/rogue/rogue.h +++ b/src/cc/rogue/rogue.h @@ -361,12 +361,14 @@ typedef union _bits256 bits256; struct rogue_state { + uint256 keytxid; + CTransaction keystrokestx; uint64_t seed; char *keystrokes; uint32_t needflush,replaydone; - int32_t numkeys,ind,num,guiflag,counter,sleeptime,playersize,restoring; + int32_t numkeys,ind,num,guiflag,counter,sleeptime,playersize,restoring,lastnum; struct rogue_player P; - char buffered[8192]; + char buffered[65536*16]; uint8_t playerdata[10000]; }; extern struct rogue_state globalR; @@ -374,12 +376,12 @@ extern struct rogue_state globalR; int rogue(int argc, char **argv, char **envp); void rogueiterate(struct rogue_state *rs); int32_t roguefname(char *fname,uint64_t seed,int32_t counter); -int32_t flushkeystrokes(struct rogue_state *rs); +int32_t flushkeystrokes(struct rogue_state *rs,int32_t waitflag); int32_t rogue_restorepack(struct rogue_state *rs); void restore_player(struct rogue_state *rs); int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player,int32_t sleepmillis); void rogue_bailout(struct rogue_state *rs); -void rogue_progress(struct rogue_state *rs,uint64_t seed,char *keystrokes,int32_t num); +void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char *keystrokes,int32_t num); int32_t rogue_setplayerdata(struct rogue_state *rs,char *gametxidstr); #define ROGUE_MAXTOTAL (pstats.s_str*2) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 4d0011d06..08d1b72e7 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -361,7 +361,7 @@ UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint } } //fprintf(stderr,"trace spend to %s/v%d\n",txid.GetHex().c_str(),vout); - if ( n++ > 1000 ) + if ( n++ > ROGUE_MAXITERATIONS ) break; } obj.push_back(Pair("gametxid",gametxid.GetHex())); @@ -588,7 +588,7 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx { txid = gametxid; vout = 1+i; - fprintf(stderr,"scan forward active.%s spenttxid.%s\n",gametxid.GetHex().c_str(),txid.GetHex().c_str()); + //fprintf(stderr,"scan forward active.%s spenttxid.%s\n",gametxid.GetHex().c_str(),txid.GetHex().c_str()); n = 0; while ( CCgettxout(txid,vout,1) < 0 ) { @@ -603,10 +603,10 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx } txid = spenttxid; vout = 0; - fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); + //fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); if ( spentvini != 0 ) break; - if ( n++ > 1000 ) + if ( n++ > ROGUE_MAXITERATIONS ) break; } if ( txid != zeroid ) From 16341e10bc92a01c232dd3edb8335e607d0cb136 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 03:15:49 -1100 Subject: [PATCH 41/67] Test --- src/cc/rogue/main.c | 46 ++++++++++++++++++++------------------------ src/cc/rogue/rogue.h | 4 +--- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index d814bcbd3..80d572a72 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -708,22 +708,25 @@ char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port) #include "rogue.h" -int32_t rogue_confirmed(uint256 txid) +int32_t rogue_sendrawtransaction(char *rawtx) { char params[512],*retstr; cJSON *retjson; int32_t numconfs = -1; - sprintf(params,"[\"%s\"]",txid.GetHex().c_str()); - if ( (retstr= komodo_issuemethod(USERPASS,"getrawtransaction",params,ROGUE_PORT)) != 0 ) + sprintf(params,"[\"%s\"]",rawtx); + if ( (retstr= komodo_issuemethod(USERPASS,"sendrawtransaction",params,ROGUE_PORT)) != 0 ) { fprintf(stderr,"params.(%s) -> %s\n",params,retstr); + if ( is_hexstr(retstr,64) == 64 ) + { + free(retstr); + return(0); + } if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - numconfs = juint(retjson,"confirmations"); free_json(retjson); } free(retstr); } - fprintf(stderr,"numconfs %d\n",numconfs); - return(numconfs); + return(-1); } void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char *keystrokes,int32_t num) @@ -732,23 +735,22 @@ void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char * memset(&txid,0,sizeof(txid)); if ( rs->guiflag != 0 && Gametxidstr[0] != 0 ) { - if ( rs->keytxid != zeroid ) + if ( rs->keystrokeshex != 0 ) { - if ( rogue_confirmed(rs->keytxid) < 2 ) + if ( rogue_sendrawtransaction(rs->keystrokeshex) == 0 ) { if ( waitflag == 0 ) - return(0); + return; else { - while ( rogue_confirmed(rs->keytxid) < 2 ) + while ( rogue_sendrawtransaction(rs->keystrokeshex) == 0 ) { fprintf(stderr,"pre-rebroadcast\n"); - RelayTransaction(rs->keystrokestx); sleep(10); } } } - rs->keytxid = zeroid; + free(rs->keystrokeshex), rs->keystrokeshex = 0; } for (i=0; ikeystrokestx = tx; - rs->keytxid = txid; - fprintf(stderr,"set keystrokestx <- %s\n",txid.GetHex().c_str()); - } - } + if ( rs->keystrokeshex != 0 ) + free(rs->keystrokeshex); + rs->keystrokeshex = (char *)malloc(strlen(hexstr)+1); + strcpy(rs->keystrokeshex,hexstr); + fprintf(stderr,"set keystrokestx <- %s\n",txid.GetHex().c_str()); } free_json(retjson); } free(retstr); } - if ( waitflag != 0 && rs->keytxid != zeroid ) + if ( waitflag != 0 && rs->keystrokeshex != 0 ) { - while ( rogue_confirmed(rs->keytxid) < 2 ) + while ( rogue_sendrawtransaction(rs->keystrokeshex) == 0 ) { fprintf(stderr,"post-rebroadcast\n"); - RelayTransaction(rs->keystrokestx); sleep(3); } } diff --git a/src/cc/rogue/rogue.h b/src/cc/rogue/rogue.h index e5ea51771..e5422c3c2 100644 --- a/src/cc/rogue/rogue.h +++ b/src/cc/rogue/rogue.h @@ -361,10 +361,8 @@ typedef union _bits256 bits256; struct rogue_state { - uint256 keytxid; - CTransaction keystrokestx; uint64_t seed; - char *keystrokes; + char *keystrokes,*keystrokeshex; uint32_t needflush,replaydone; int32_t numkeys,ind,num,guiflag,counter,sleeptime,playersize,restoring,lastnum; struct rogue_player P; From 18f44b1077f39975840ec571b8cec6dfdbf0aa09 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 03:17:29 -1100 Subject: [PATCH 42/67] rs->keystrokeshex --- src/cc/rogue/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index 80d572a72..1a915cc6c 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -731,7 +731,7 @@ int32_t rogue_sendrawtransaction(char *rawtx) void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char *keystrokes,int32_t num) { - char cmd[16384],hexstr[16384],params[32768],*retstr; int32_t i; uint256 txid; + char cmd[16384],hexstr[16384],params[32768],*retstr; int32_t i; cJSON *retjson; memset(&txid,0,sizeof(txid)); if ( rs->guiflag != 0 && Gametxidstr[0] != 0 ) { @@ -783,7 +783,7 @@ void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char * free(rs->keystrokeshex); rs->keystrokeshex = (char *)malloc(strlen(hexstr)+1); strcpy(rs->keystrokeshex,hexstr); - fprintf(stderr,"set keystrokestx <- %s\n",txid.GetHex().c_str()); + fprintf(stderr,"set keystrokestx <- %s\n",rs->keystrokeshex); } free_json(retjson); } From 62684be1a1a1762f4726dd232e0c7d45a109d7e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 03:18:52 -1100 Subject: [PATCH 43/67] Rawtx --- src/cc/rogue/main.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index 1a915cc6c..9612d3bce 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -731,8 +731,7 @@ int32_t rogue_sendrawtransaction(char *rawtx) void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char *keystrokes,int32_t num) { - char cmd[16384],hexstr[16384],params[32768],*retstr; int32_t i; cJSON *retjson; - memset(&txid,0,sizeof(txid)); + char cmd[16384],hexstr[16384],params[32768],*retstr,*rawtx; int32_t i; cJSON *retjson; if ( rs->guiflag != 0 && Gametxidstr[0] != 0 ) { if ( rs->keystrokeshex != 0 ) @@ -777,12 +776,12 @@ void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char * } if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (hexstr= jstr(retjson,"hex")) != 0 ) + if ( (rawtx= jstr(retjson,"hex")) != 0 ) { if ( rs->keystrokeshex != 0 ) free(rs->keystrokeshex); - rs->keystrokeshex = (char *)malloc(strlen(hexstr)+1); - strcpy(rs->keystrokeshex,hexstr); + rs->keystrokeshex = (char *)malloc(strlen(rawtx)+1); + strcpy(rs->keystrokeshex,rawtx); fprintf(stderr,"set keystrokestx <- %s\n",rs->keystrokeshex); } free_json(retjson); From c712f2815323157eb67e640230950151c3e3748e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 03:29:33 -1100 Subject: [PATCH 44/67] +print --- src/cc/rogue/main.c | 2 ++ src/cc/rogue/rogue.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index 9612d3bce..2ebd171c9 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -712,6 +712,7 @@ int32_t rogue_sendrawtransaction(char *rawtx) { char params[512],*retstr; cJSON *retjson; int32_t numconfs = -1; sprintf(params,"[\"%s\"]",rawtx); + fprintf(stderr,"sendrawtransaction\n"); if ( (retstr= komodo_issuemethod(USERPASS,"sendrawtransaction",params,ROGUE_PORT)) != 0 ) { fprintf(stderr,"params.(%s) -> %s\n",params,retstr); @@ -732,6 +733,7 @@ int32_t rogue_sendrawtransaction(char *rawtx) void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char *keystrokes,int32_t num) { char cmd[16384],hexstr[16384],params[32768],*retstr,*rawtx; int32_t i; cJSON *retjson; + fprintf(stderr,"rogue_progress num.%d\n",num); if ( rs->guiflag != 0 && Gametxidstr[0] != 0 ) { if ( rs->keystrokeshex != 0 ) diff --git a/src/cc/rogue/rogue.c b/src/cc/rogue/rogue.c index 2b8a0ffc0..14650a0c7 100644 --- a/src/cc/rogue/rogue.c +++ b/src/cc/rogue/rogue.c @@ -318,6 +318,7 @@ int rogue(int argc, char **argv, char **envp) { rs->seed = atol(argv[1]); strcpy(Gametxidstr,argv[2]); + fprintf(stderr,"setplayerdata\n"); if ( rogue_setplayerdata(rs,Gametxidstr) < 0 ) { fprintf(stderr,"invalid gametxid, or already started\n"); @@ -413,7 +414,7 @@ int rogue(int argc, char **argv, char **envp) #endif printf("Hello %s, just a moment while I dig the dungeon... seed.%llu", whoami,(long long)rs->seed); fflush(stdout); - + fprintf(stderr,"rogueiterate\n"); rogueiterate(rs); return(0); } From 4b030a62a9b0c6cea9594b928c91f552dafd9af7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 03:34:07 -1100 Subject: [PATCH 45/67] Reduce size of buffer --- src/cc/rogue/rogue.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue/rogue.h b/src/cc/rogue/rogue.h index e5422c3c2..d453a871f 100644 --- a/src/cc/rogue/rogue.h +++ b/src/cc/rogue/rogue.h @@ -366,7 +366,7 @@ struct rogue_state uint32_t needflush,replaydone; int32_t numkeys,ind,num,guiflag,counter,sleeptime,playersize,restoring,lastnum; struct rogue_player P; - char buffered[65536*16]; + char buffered[10000]; uint8_t playerdata[10000]; }; extern struct rogue_state globalR; From f09c30068068bd40a28052dd5381776219ca9639 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 03:51:31 -1100 Subject: [PATCH 46/67] -print --- src/cc/rogue/main.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index 2ebd171c9..4bcc5c533 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -712,10 +712,9 @@ int32_t rogue_sendrawtransaction(char *rawtx) { char params[512],*retstr; cJSON *retjson; int32_t numconfs = -1; sprintf(params,"[\"%s\"]",rawtx); - fprintf(stderr,"sendrawtransaction\n"); if ( (retstr= komodo_issuemethod(USERPASS,"sendrawtransaction",params,ROGUE_PORT)) != 0 ) { - fprintf(stderr,"params.(%s) -> %s\n",params,retstr); + //fprintf(stderr,"params.(%s) -> %s\n",params,retstr); if ( is_hexstr(retstr,64) == 64 ) { free(retstr); @@ -733,7 +732,7 @@ int32_t rogue_sendrawtransaction(char *rawtx) void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char *keystrokes,int32_t num) { char cmd[16384],hexstr[16384],params[32768],*retstr,*rawtx; int32_t i; cJSON *retjson; - fprintf(stderr,"rogue_progress num.%d\n",num); + //fprintf(stderr,"rogue_progress num.%d\n",num); if ( rs->guiflag != 0 && Gametxidstr[0] != 0 ) { if ( rs->keystrokeshex != 0 ) @@ -746,7 +745,7 @@ void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char * { while ( rogue_sendrawtransaction(rs->keystrokeshex) == 0 ) { - fprintf(stderr,"pre-rebroadcast\n"); + //fprintf(stderr,"pre-rebroadcast\n"); sleep(10); } } @@ -784,7 +783,7 @@ void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char * free(rs->keystrokeshex); rs->keystrokeshex = (char *)malloc(strlen(rawtx)+1); strcpy(rs->keystrokeshex,rawtx); - fprintf(stderr,"set keystrokestx <- %s\n",rs->keystrokeshex); + //fprintf(stderr,"set keystrokestx <- %s\n",rs->keystrokeshex); } free_json(retjson); } @@ -794,7 +793,7 @@ void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char * { while ( rogue_sendrawtransaction(rs->keystrokeshex) == 0 ) { - fprintf(stderr,"post-rebroadcast\n"); + //fprintf(stderr,"post-rebroadcast\n"); sleep(3); } } From 263f5fcfe97d4de6dc8bf5fdb363c21e493ad1e5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 04:04:10 -1100 Subject: [PATCH 47/67] -print --- src/cc/rogue/rip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue/rip.c b/src/cc/rogue/rip.c index 1866f0b48..123b1aaa8 100644 --- a/src/cc/rogue/rip.c +++ b/src/cc/rogue/rip.c @@ -238,7 +238,7 @@ death(struct rogue_state *rs,char monst) //struct tm *localtime(const time_t *); if ( rs->guiflag == 0 ) { - fprintf(stderr,"death during replay by (%c)\n",monst); //sleep(3); + //fprintf(stderr,"death during replay by (%c)\n",monst); //sleep(3); rs->replaydone = (uint32_t)time(NULL); return; } From a232b0cd760e7b49a32ab53070e1372d59b9b58a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 04:32:43 -1100 Subject: [PATCH 48/67] Revert to boost 1.69 --- depends/packages/boost.mk | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk index 7a0439ba7..800c424c5 100644 --- a/depends/packages/boost.mk +++ b/depends/packages/boost.mk @@ -1,8 +1,9 @@ package=boost -$(package)_version=1_69_0 -$(package)_download_path=https://dl.bintray.com/boostorg/release/1.69.0/source + +$(package)_version=1_66_0 +$(package)_download_path=https://dl.bintray.com/boostorg/release/1.66.0/source +$(package)_sha256_hash=5721818253e6a0989583192f96782c4a98eb6204965316df9f5ad75819225ca9 $(package)_file_name=$(package)_$($(package)_version).tar.bz2 -$(package)_sha256_hash=8f32d4617390d1c2d16f26a27ab60d97807b35440d45891fa340fc2648b04406 define $(package)_set_vars $(package)_config_opts_release=variant=release From 616c8c33f56cb9c90c1891171f7e6bdf06f80419 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 07:59:32 -1100 Subject: [PATCH 49/67] Reset rs->num! --- src/cc/rogue/rogue.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/rogue/rogue.c b/src/cc/rogue/rogue.c index 14650a0c7..6cc51e04b 100644 --- a/src/cc/rogue/rogue.c +++ b/src/cc/rogue/rogue.c @@ -175,6 +175,7 @@ int32_t flushkeystrokes(struct rogue_state *rs,int32_t waitflag) //rs->lastnum = rs->num; rogue_progress(rs,waitflag,rs->seed,rs->buffered,rs->num); memset(rs->buffered,0,sizeof(rs->buffered)); + rs->num = 0; rs->counter++; } return(0); From 5cd9437aada4711caa5be9fd44bf9f962c21a299 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 18:09:18 -1100 Subject: [PATCH 50/67] Fix OS X build issue in rpc/misc.cpp --- src/rpc/misc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index ef1c8bf5c..a8b6d6dc5 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -182,7 +182,7 @@ UniValue geterablockheights(const UniValue& params, bool fHelp) { char str[16]; sprintf(str, "%d", era); - ret.push_back(Pair(str,i)); + ret.push_back(Pair(str,(int64_t)i)); lastera = era; } } From bd78364587f59410fea7d2ef89ad1be0457413ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 27 Feb 2019 18:18:41 -1100 Subject: [PATCH 51/67] rogue.sendlog --- src/cc/rogue/main.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index 4bcc5c533..56377071f 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -720,6 +720,16 @@ int32_t rogue_sendrawtransaction(char *rawtx) free(retstr); return(0); } + { + static FILE *fp; + if ( fp == 0 ) + fp = fopen("rogue.sendlog","wb"); + if ( fp != 0 ) + { + fprintf(fp,"%s\n",retstr); + fflush(fp); + } + } if ( (retjson= cJSON_Parse(retstr)) != 0 ) { free_json(retjson); @@ -789,13 +799,14 @@ void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char * } free(retstr); } - if ( waitflag != 0 && rs->keystrokeshex != 0 ) + if ( 0 && waitflag != 0 && rs->keystrokeshex != 0 ) { while ( rogue_sendrawtransaction(rs->keystrokeshex) == 0 ) { //fprintf(stderr,"post-rebroadcast\n"); sleep(3); } + free(rs->keystrokeshex), rs->keystrokeshex = 0; } } } From 094a153beab57529c15fa9d6d544d59ce6dfaa46 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Feb 2019 18:29:57 -1100 Subject: [PATCH 52/67] Remove while loop waiting for send --- src/cc/rogue/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index 56377071f..7b68aa49e 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -751,7 +751,7 @@ void rogue_progress(struct rogue_state *rs,int32_t waitflag,uint64_t seed,char * { if ( waitflag == 0 ) return; - else + else if ( 0 ) { while ( rogue_sendrawtransaction(rs->keystrokeshex) == 0 ) { From 1adc843ab233344f1c4453de708e4377d19867b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Feb 2019 19:12:57 -1100 Subject: [PATCH 53/67] +print --- src/cc/rogue_rpc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 13724ed7b..f0ef921ad 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -489,7 +489,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke playertxid = batontxid = zeroid; for (i=0; i= 0 ) { if ( myGetTransaction(spenttxid,spenttx,hashBlock) != 0 && spenttx.vout.size() > 0 ) @@ -508,17 +508,17 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke if ( matches == 1 ) { numvouts = matchtx.vout.size(); - //fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); + fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); if ( rogue_registeropretdecode(txid,tokenid,playertxid,matchtx.vout[numvouts-1].scriptPubKey) == 'R' )//&& txid == gametxid ) { - //fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); + fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); if ( tokenid != zeroid ) active = tokenid; else active = playertxid; if ( active == zeroid || rogue_playerdata(cp,origplayergame,tid,pk,playerdata,symbol,pname,active) == 0 ) { txid = matchtx.GetHash(); - //fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); + fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); n = 0; while ( CCgettxout(txid,0,1) < 0 ) { @@ -532,7 +532,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-2); } txid = spenttxid; - //fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); + fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); if ( spentvini != 0 ) // game is over? { return(0); From 0cea17dea9baa3bde36a3780460023623d27a0bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Feb 2019 19:32:56 -1100 Subject: [PATCH 54/67] +print --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 01513149c..aa5b0df75 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2083,14 +2083,14 @@ bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlo memset(&hashBlock,0,sizeof(hashBlock)); // need a GetTransaction without lock so the validation code for assets can run without deadlock { - //fprintf(stderr,"check mempool\n"); + fprintf(stderr,"check mempool %s\n",hash.GetHex().c_str()); if (mempool.lookup(hash, txOut)) { //fprintf(stderr,"found in mempool\n"); return true; } } - //fprintf(stderr,"check disk\n"); + fprintf(stderr,"check disk %s\n",hash.GetHex().c_str()); if (fTxIndex) { CDiskTxPos postx; From 2e0420792098fd9e14ba80e616317fd89e99e53b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Feb 2019 19:45:45 -1100 Subject: [PATCH 55/67] +print --- src/cc/rogue_rpc.cpp | 3 +++ src/main.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index f0ef921ad..e77600d39 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -540,13 +540,16 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke if ( keystrokesp != 0 && myGetTransaction(spenttxid,spenttx,hashBlock) != 0 && spenttx.vout.size() >= 2 ) { uint256 g,b; CPubKey p; std::vector k; + fprintf(stderr,"decode keys\n"); if ( rogue_keystrokesopretdecode(g,b,p,k,spenttx.vout[spenttx.vout.size()-1].scriptPubKey) == 'K' ) { + fprintf(stderr,"decoded keys %d\n",(int32_t)k.size()); keystrokes = (char *)realloc(keystrokes,numkeys + (int32_t)k.size()); for (i=0; i= ROGUE_MAXITERATIONS ) diff --git a/src/main.cpp b/src/main.cpp index aa5b0df75..df3c87ca4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2112,11 +2112,11 @@ bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlo hashBlock = header.GetHash(); if (txOut.GetHash() != hash) return error("%s: txid mismatch", __func__); - //fprintf(stderr,"found on disk\n"); + fprintf(stderr,"found on disk %s\n",hash.GetHex().c_str()); return true; } } - //fprintf(stderr,"not found\n"); + fprintf(stderr,"not found on disk %s\n",hash.GetHex().c_str()); return false; } From e06dcabe9e1f3157438f3d87474c8fd07f43028e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Feb 2019 19:56:19 -1100 Subject: [PATCH 56/67] +/- prints --- src/cc/rogue_rpc.cpp | 3 ++- src/main.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index e77600d39..6a7a81e20 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -539,6 +539,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke } if ( keystrokesp != 0 && myGetTransaction(spenttxid,spenttx,hashBlock) != 0 && spenttx.vout.size() >= 2 ) { + fprintf(stderr,"declares\n"); uint256 g,b; CPubKey p; std::vector k; fprintf(stderr,"decode keys\n"); if ( rogue_keystrokesopretdecode(g,b,p,k,spenttx.vout[spenttx.vout.size()-1].scriptPubKey) == 'K' ) @@ -552,12 +553,12 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke fprintf(stderr,"updated keystrokes.%p[%d]\n",keystrokes,numkeys); } } + fprintf(stderr,"n.%d txid.%s\n",n,txid.GetHex().c_str()); if ( ++n >= ROGUE_MAXITERATIONS ) { fprintf(stderr,"rogue_findbaton n.%d, seems something is wrong\n",n); return(-5); } - //fprintf(stderr,"n.%d txid.%s\n",n,txid.GetHex().c_str()); } //fprintf(stderr,"set baton %s\n",txid.GetHex().c_str()); batontxid = txid; diff --git a/src/main.cpp b/src/main.cpp index df3c87ca4..01e19628c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2083,14 +2083,14 @@ bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlo memset(&hashBlock,0,sizeof(hashBlock)); // need a GetTransaction without lock so the validation code for assets can run without deadlock { - fprintf(stderr,"check mempool %s\n",hash.GetHex().c_str()); + //fprintf(stderr,"check mempool %s\n",hash.GetHex().c_str()); if (mempool.lookup(hash, txOut)) { //fprintf(stderr,"found in mempool\n"); return true; } } - fprintf(stderr,"check disk %s\n",hash.GetHex().c_str()); + //fprintf(stderr,"check disk %s\n",hash.GetHex().c_str()); if (fTxIndex) { CDiskTxPos postx; @@ -2112,11 +2112,11 @@ bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlo hashBlock = header.GetHash(); if (txOut.GetHash() != hash) return error("%s: txid mismatch", __func__); - fprintf(stderr,"found on disk %s\n",hash.GetHex().c_str()); + //fprintf(stderr,"found on disk %s\n",hash.GetHex().c_str()); return true; } } - fprintf(stderr,"not found on disk %s\n",hash.GetHex().c_str()); + //fprintf(stderr,"not found on disk %s\n",hash.GetHex().c_str()); return false; } From 973124163e36164737f2a4ba34759dd99577478c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Feb 2019 20:14:38 -1100 Subject: [PATCH 57/67] Lockflag --- src/cc/CCinclude.h | 2 +- src/cc/CCtx.cpp | 25 ++++++++++++++++++------- src/cc/marmara.cpp | 2 +- src/cc/rogue_rpc.cpp | 35 ++++++++++++++++++++--------------- src/cc/sudoku.cpp | 2 +- 5 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 5b1a29421..91e9467dd 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -170,7 +170,7 @@ static int32_t ignorevin; bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock); int32_t is_hexstr(char *str,int32_t n); bool myAddtomempool(CTransaction &tx, CValidationState *pstate = NULL, bool fSkipExpiry = false); -int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag); +int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag,int32_t lockflag); bool myIsutxo_spentinmempool(uint256 &spenttxid,int32_t &spentvini,uint256 txid,int32_t vout); bool mytxid_inmempool(uint256 txid); int32_t myIsutxo_spent(uint256 &spenttxid,uint256 txid,int32_t vout); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index fd432359e..dd9812c99 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -347,17 +347,28 @@ int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) return(0); } -int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag) +int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag,int32_t lockflag) { CCoins coins; if ( mempoolflag != 0 ) { - LOCK(mempool.cs); - CCoinsViewMemPool view(pcoinsTip, mempool); - if (!view.GetCoins(txid, coins)) - return(-1); - if ( myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) != 0 ) - return(-1); + if ( lockflag != 0 ) + { + LOCK(mempool.cs); + CCoinsViewMemPool view(pcoinsTip, mempool); + if (!view.GetCoins(txid, coins)) + return(-1); + if ( myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) != 0 ) + return(-1); + } + else + { + CCoinsViewMemPool view(pcoinsTip, mempool); + if (!view.GetCoins(txid, coins)) + return(-1); + if ( myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) != 0 ) + return(-1); + } } else { diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index f43f3a559..3c35632c8 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -167,7 +167,7 @@ int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid, creditloop.push_back(txid); //fprintf(stderr,"%d: %s\n",n,txid.GetHex().c_str()); n++; - if ( (value= CCgettxout(spenttxid,vout,1)) == 10000 ) + if ( (value= CCgettxout(spenttxid,vout,1,1)) == 10000 ) { batontxid = spenttxid; //fprintf(stderr,"got baton %s %.8f\n",batontxid.GetHex().c_str(),(double)value/COIN); diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 6a7a81e20..f9c9cb331 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -295,7 +295,7 @@ int32_t rogue_isvalidgame(struct CCcontract_info *cp,int32_t &gameheight,CTransa txid = tx.GetHash(); //fprintf(stderr,"set txid %s %llu\n",txid.GetHex().c_str(),(long long)CCgettxout(txid,0,1)); } - if ( IsCClibvout(cp,tx,0,cp->unspendableCCaddr) == txfee && (unspentv0 == 0 || CCgettxout(txid,0,1) == txfee) ) + if ( IsCClibvout(cp,tx,0,cp->unspendableCCaddr) == txfee && (unspentv0 == 0 || CCgettxout(txid,0,1,0) == txfee) ) { if ( rogue_newgameopreturndecode(buyin,maxplayers,tx.vout[numvouts-1].scriptPubKey) == 'G' ) { @@ -343,7 +343,7 @@ UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint } txid = playertxid; vout = 1; - while ( CCgettxout(txid,vout,1) < 0 ) + while ( CCgettxout(txid,vout,1,0) < 0 ) { spenttxid = zeroid; spentvini = -1; @@ -462,7 +462,7 @@ int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,uint int32_t rogue_playerdataspend(CMutableTransaction &mtx,uint256 playertxid,int32_t vout,uint256 origplayergame) { int64_t txfee = 10000; CTransaction tx; uint256 hashBlock; - if ( CCgettxout(playertxid,vout,1) == 1 ) // not sure if this is enough validation + if ( CCgettxout(playertxid,vout,1,0) == 1 ) // not sure if this is enough validation { mtx.vin.push_back(CTxIn(playertxid,vout,CScript())); return(0); @@ -472,7 +472,7 @@ int32_t rogue_playerdataspend(CMutableTransaction &mtx,uint256 playertxid,int32_ vout = 0; if ( myGetTransaction(playertxid,tx,hashBlock) != 0 && tx.vout[vout].nValue == 1 && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() != 0 ) { - if ( CCgettxout(playertxid,vout,1) == 1 ) // not sure if this is enough validation + if ( CCgettxout(playertxid,vout,1,0) == 1 ) // not sure if this is enough validation { mtx.vin.push_back(CTxIn(playertxid,vout,CScript())); return(0); @@ -520,16 +520,21 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke txid = matchtx.GetHash(); fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); n = 0; - while ( CCgettxout(txid,0,1) < 0 ) + while ( CCgettxout(txid,0,1,0) < 0 ) { spenttxid = zeroid; spentvini = -1; + fprintf(stderr,"check myIsutxo_spent\n"); if ( (spentvini= myIsutxo_spent(spenttxid,txid,0)) >= 0 ) txid = spenttxid; - else if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,0) == 0 || spenttxid == zeroid ) + else { - fprintf(stderr,"mempool tracking error %s/v0\n",txid.ToString().c_str()); - return(-2); + fprintf(stderr,"check myIsutxo_spentinmempool\n"); + if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,0) == 0 || spenttxid == zeroid ) + { + fprintf(stderr,"mempool tracking error %s/v0\n",txid.ToString().c_str()); + return(-2); + } } txid = spenttxid; fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); @@ -590,16 +595,16 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx registration_open = 1; for (i=0; i 1 ) { @@ -710,7 +715,7 @@ int64_t rogue_registrationbaton(CMutableTransaction &mtx,uint256 gametxid,CTrans for (j=0; j 1 ) { From 50acda66405b99f299c4532513a6903f7f0a7545 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Feb 2019 20:28:06 -1100 Subject: [PATCH 58/67] +prot --- src/cc/CCtx.cpp | 5 +++-- src/cc/rogue_rpc.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index dd9812c99..65aad8e3a 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -350,6 +350,7 @@ int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag,int32_t lockflag) { CCoins coins; + fprintf(stderr,"CCgettxoud %s/v%d\n",txid.GetHex().c_str(),vout); if ( mempoolflag != 0 ) { if ( lockflag != 0 ) @@ -358,7 +359,7 @@ int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag,int32_t lockfla CCoinsViewMemPool view(pcoinsTip, mempool); if (!view.GetCoins(txid, coins)) return(-1); - if ( myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) != 0 ) + else if ( myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) != 0 ) return(-1); } else @@ -366,7 +367,7 @@ int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag,int32_t lockfla CCoinsViewMemPool view(pcoinsTip, mempool); if (!view.GetCoins(txid, coins)) return(-1); - if ( myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) != 0 ) + else if ( myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) != 0 ) return(-1); } } diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index f9c9cb331..cc96dfff5 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -565,7 +565,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-5); } } - //fprintf(stderr,"set baton %s\n",txid.GetHex().c_str()); + fprintf(stderr,"set baton %s\n",txid.GetHex().c_str()); batontxid = txid; batonvout = 0; // not vini // how to detect timeout, bailedout, highlander @@ -578,7 +578,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-4); else batonht = pindex->GetHeight(); batonvalue = batontx.vout[0].nValue; - //printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); + printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); return(0); } else fprintf(stderr,"couldnt find baton\n"); } else fprintf(stderr,"error with playerdata\n"); From 1f8591b0e94b81692465ef0bf8bb320231535cd6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 1 Mar 2019 01:47:09 -1100 Subject: [PATCH 59/67] Fixes --- src/cc/dilithium.c | 8 ++++---- src/cc/rogue_rpc.cpp | 9 +++++++-- src/komodo_globals.h | 18 ++++++++++++++++-- src/komodo_utils.h | 7 ++++++- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/cc/dilithium.c b/src/cc/dilithium.c index 1f893d268..b01a3bf1d 100644 --- a/src/cc/dilithium.c +++ b/src/cc/dilithium.c @@ -3276,9 +3276,9 @@ UniValue dilithium_spend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params } else return(cclib_error(result,"need to have exactly 2 params sendtxid, scriptPubKey")); } -int64_t dilithium_inputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs,char *cmpaddr) +int64_t dilithium_inputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 pubtxid,int64_t total,int32_t maxinputs,char *cmpaddr) { - char coinaddr[64]; int64_t threshold,nValue,price,totalinputs = 0; uint256 tmptxid,txid,hashBlock; std::vector origpubkey,tmpsig; CTransaction vintx; int32_t vout,numvouts,n = 0; std::vector voutpubtxids; + char coinaddr[64]; int64_t threshold,nValue,price,totalinputs = 0; uint256 checktxid,txid,hashBlock; std::vector origpubkey,tmpsig; CTransaction vintx; int32_t vout,numvouts,n = 0; std::vector voutpubtxids; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); @@ -3294,7 +3294,7 @@ int64_t dilithium_inputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPu { if ( (nValue= IsCClibvout(cp,vintx,vout,cmpaddr)) > DILITHIUM_TXFEE && myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,vout) == 0 ) { - if ( dilithium_Qsendopretdecode(tmptxid,tmpsig,voutpubtxids,vintx.vout[numvouts-1].scriptPubKey) == 'Q' || dilithium_sendopretdecode(tmptxid,vintx.vout[numvouts-1].scriptPubKey) == 'x' ) + if ( (dilithium_Qsendopretdecode(checktxid,tmpsig,voutpubtxids,vintx.vout[numvouts-1].scriptPubKey) == 'Q' || dilithium_sendopretdecode(checktxid,vintx.vout[numvouts-1].scriptPubKey) == 'x') && desttxid == checktxid ) { if ( total != 0 && maxinputs != 0 ) mtx.vin.push_back(CTxIn(txid,vout,CScript())); @@ -3358,7 +3358,7 @@ UniValue dilithium_Qsend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params } outputsum += amount; } - if ( (inputsum= dilithium_inputs(cp,mtx,mypk,outputsum+txfee,64,myCCaddr)) >= outputsum+txfee ) + if ( (inputsum= dilithium_inputs(cp,mtx,mypk,mypubtxid,outputsum+txfee,64,myCCaddr)) >= outputsum+txfee ) { change = (inputsum - outputsum - txfee); if ( change >= txfee ) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index cc96dfff5..508bf6040 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -593,16 +593,19 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx numplayers = openslots = 0; if ( komodo_nextheight() <= gameht+ROGUE_MAXKEYSTROKESGAP ) registration_open = 1; + fprintf(stderr,"players alive\n"); for (i=0; i ROGUE_MAXITERATIONS ) break; } + fprintf(stderr,"out of while\n"); if ( txid != zeroid ) { + fprintf(stderr,"get height of %s\n",txid.GetHex().c_str()); if ( myGetTransaction(txid,tx,hashBlock) != 0 && (pindex= komodo_blockindex(hashBlock)) != 0 ) { if ( pindex->GetHeight() <= gameht+ROGUE_MAXKEYSTROKESGAP ) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index 859fada99..b94281b02 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -129,7 +129,7 @@ int32_t komodo_baseid(char *origbase) #ifndef SATOSHIDEN #define SATOSHIDEN ((uint64_t)100000000L) #endif -int64_t komodo_current_supply(uint32_t nHeight) +uint64_t komodo_current_supply(uint32_t nHeight) { uint64_t cur_money; int32_t baseid; @@ -264,5 +264,19 @@ int64_t komodo_current_supply(uint32_t nHeight) } } } - return((int64_t)(cur_money + (cur_money * ASSETCHAINS_COMMISSION))); +#define KOMODO_MAXNVALUE (((uint64_t)1 << 63) - 1) +#define KOMODO_BIT63SET(x) ((x) & ((uint64_t)1 << 63)) + + if ( KOMODO_BIT63SET(cur_money) != 0 ) + return(KOMODO_MAXNVALUE); + if ( ASSETCHAINS_COMMISSION != 0 ) + { + uint64_t newval = (cur_money + (cur_money * ASSETCHAINS_COMMISSION)); + if ( KOMODO_BIT63SET(newval) != 0 ) + return(KOMODO_MAXNVALUE); + else if ( newval < curval ) // check for underflow + return(KOMODO_MAXNVALUE); + return(newvalue) + } + return(cur_money); } diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 2fbb782ce..65114c16b 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1562,7 +1562,7 @@ char *argv0names[] = (char *)"MNZ", (char *)"MNZ", (char *)"MNZ", (char *)"MNZ", (char *)"BTCH", (char *)"BTCH", (char *)"BTCH", (char *)"BTCH" }; -int64_t komodo_max_money() +uint64_t komodo_max_money() { return komodo_current_supply(10000000); } @@ -1787,6 +1787,11 @@ void komodo_args(char *argv0) ASSETCHAINS_FOUNDERS = GetArg("-ac_founders",0);// & 1; ASSETCHAINS_FOUNDERS_REWARD = GetArg("-ac_founders_reward",0); ASSETCHAINS_SUPPLY = GetArg("-ac_supply",10); + if ( ASSETCHAINS_SUPPLY > (uint64_t)90*1000*1000000 ) + { + fprintf(stderr,"-ac_supply must be less than 90 billion\n"); + exit(0); + } ASSETCHAINS_COMMISSION = GetArg("-ac_perc",0); ASSETCHAINS_OVERRIDE_PUBKEY = GetArg("-ac_pubkey",""); ASSETCHAINS_SCRIPTPUB = GetArg("-ac_script",""); From 3f64e818b7b8a8164ed59ec359e92df96757343b Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 1 Mar 2019 01:52:06 -1100 Subject: [PATCH 60/67] cur_money --- src/komodo_globals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index b94281b02..2c668ae7b 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -274,7 +274,7 @@ uint64_t komodo_current_supply(uint32_t nHeight) uint64_t newval = (cur_money + (cur_money * ASSETCHAINS_COMMISSION)); if ( KOMODO_BIT63SET(newval) != 0 ) return(KOMODO_MAXNVALUE); - else if ( newval < curval ) // check for underflow + else if ( newval < cur_money ) // check for underflow return(KOMODO_MAXNVALUE); return(newvalue) } From c02c249c22a0d910c14034d40630bdd4ecbd5f5d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 1 Mar 2019 01:53:32 -1100 Subject: [PATCH 61/67] newval --- src/komodo_globals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index 2c668ae7b..35a4032ce 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -276,7 +276,7 @@ uint64_t komodo_current_supply(uint32_t nHeight) return(KOMODO_MAXNVALUE); else if ( newval < cur_money ) // check for underflow return(KOMODO_MAXNVALUE); - return(newvalue) + return(newval) } return(cur_money); } From cc42fe2a866a8c783f94a8f73f9b5c6bee76bc8c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 1 Mar 2019 01:54:13 -1100 Subject: [PATCH 62/67] ; --- src/komodo_globals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index 35a4032ce..13de7c310 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -276,7 +276,7 @@ uint64_t komodo_current_supply(uint32_t nHeight) return(KOMODO_MAXNVALUE); else if ( newval < cur_money ) // check for underflow return(KOMODO_MAXNVALUE); - return(newval) + return(newval); } return(cur_money); } From 1dcc19e22f6506a4c2c879ce70e6fc34c7e0eeee Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 1 Mar 2019 02:09:06 -1100 Subject: [PATCH 63/67] Finally --- src/cc/rogue_rpc.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 508bf6040..863934e75 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -630,11 +630,17 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx if ( txid != zeroid ) { fprintf(stderr,"get height of %s\n",txid.GetHex().c_str()); - if ( myGetTransaction(txid,tx,hashBlock) != 0 && (pindex= komodo_blockindex(hashBlock)) != 0 ) + if ( myGetTransaction(txid,tx,hashBlock) != 0 ) { - if ( pindex->GetHeight() <= gameht+ROGUE_MAXKEYSTROKESGAP ) - alive++; + fprintf(stderr,"got tx %s\n",txid.GetHex().c_str()); + if ( (pindex= komodo_blockindex(hashBlock)) != 0 ) + { + fprintf(stderr,"got pindex %s\n",hashBlock.GetHex().c_str()); + if ( pindex->GetHeight() <= gameht+ROGUE_MAXKEYSTROKESGAP ) + alive++; + } } + fprintf(stderr,"got height of %s\n",txid.GetHex().c_str()); } } } From 0b23f6273761c7341ff538ccee7dd251677f547b Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 1 Mar 2019 02:23:22 -1100 Subject: [PATCH 64/67] +print --- src/cc/rogue_rpc.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 863934e75..f0453b66d 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -508,28 +508,26 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke if ( matches == 1 ) { numvouts = matchtx.vout.size(); - fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); + //fprintf(stderr,"matchtxid.%s matches.%d numvouts.%d\n",matchtx.GetHash().GetHex().c_str(),matches,numvouts); if ( rogue_registeropretdecode(txid,tokenid,playertxid,matchtx.vout[numvouts-1].scriptPubKey) == 'R' )//&& txid == gametxid ) { - fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); + //fprintf(stderr,"tokenid.%s txid.%s vs gametxid.%s player.%s\n",tokenid.GetHex().c_str(),txid.GetHex().c_str(),gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); if ( tokenid != zeroid ) active = tokenid; else active = playertxid; if ( active == zeroid || rogue_playerdata(cp,origplayergame,tid,pk,playerdata,symbol,pname,active) == 0 ) { txid = matchtx.GetHash(); - fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); + //fprintf(stderr,"scan forward active.%s spenttxid.%s\n",active.GetHex().c_str(),txid.GetHex().c_str()); n = 0; while ( CCgettxout(txid,0,1,0) < 0 ) { spenttxid = zeroid; spentvini = -1; - fprintf(stderr,"check myIsutxo_spent\n"); if ( (spentvini= myIsutxo_spent(spenttxid,txid,0)) >= 0 ) txid = spenttxid; else { - fprintf(stderr,"check myIsutxo_spentinmempool\n"); if ( myIsutxo_spentinmempool(spenttxid,spentvini,txid,0) == 0 || spenttxid == zeroid ) { fprintf(stderr,"mempool tracking error %s/v0\n",txid.ToString().c_str()); @@ -537,35 +535,32 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke } } txid = spenttxid; - fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); + //fprintf(stderr,"n.%d next txid.%s/v%d\n",n,txid.GetHex().c_str(),spentvini); if ( spentvini != 0 ) // game is over? { return(0); } if ( keystrokesp != 0 && myGetTransaction(spenttxid,spenttx,hashBlock) != 0 && spenttx.vout.size() >= 2 ) { - fprintf(stderr,"declares\n"); uint256 g,b; CPubKey p; std::vector k; - fprintf(stderr,"decode keys\n"); if ( rogue_keystrokesopretdecode(g,b,p,k,spenttx.vout[spenttx.vout.size()-1].scriptPubKey) == 'K' ) { - fprintf(stderr,"decoded keys %d\n",(int32_t)k.size()); keystrokes = (char *)realloc(keystrokes,numkeys + (int32_t)k.size()); for (i=0; i= ROGUE_MAXITERATIONS ) { fprintf(stderr,"rogue_findbaton n.%d, seems something is wrong\n",n); return(-5); } } - fprintf(stderr,"set baton %s\n",txid.GetHex().c_str()); + //fprintf(stderr,"set baton %s\n",txid.GetHex().c_str()); batontxid = txid; batonvout = 0; // not vini // how to detect timeout, bailedout, highlander @@ -578,7 +573,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke return(-4); else batonht = pindex->GetHeight(); batonvalue = batontx.vout[0].nValue; - printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); + //printf("batonht.%d keystrokes[%d]\n",batonht,numkeys); return(0); } else fprintf(stderr,"couldnt find baton\n"); } else fprintf(stderr,"error with playerdata\n"); @@ -596,7 +591,7 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx fprintf(stderr,"players alive\n"); for (i=0; i 0 ) { @@ -978,6 +974,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto fclose(fp); } } + fprintf(stderr,"replay2\n"); num = rogue_replay2(newplayer,seed,keystrokes,numkeys,playerdata.size()==0?0:&P,0); newdata.resize(num); for (i=0; i Date: Fri, 1 Mar 2019 02:40:17 -1100 Subject: [PATCH 65/67] Break out of infinite loops! --- src/cc/rogue/monsters.c | 2 +- src/cc/rogue/new_level.c | 14 +++++++------- src/cc/rogue/pack.c | 2 ++ src/cc/rogue/rings.c | 34 ++++++++++++++++++---------------- src/cc/rogue/rogue.h | 8 ++++---- src/cc/rogue/rooms.c | 24 ++++++++++++++---------- src/cc/rogue/sticks.c | 2 +- src/cc/rogue/weapons.c | 2 ++ src/cc/rogue/wizard.c | 30 ++++++++++++++++-------------- src/cc/rogue_rpc.cpp | 16 +++++----------- 10 files changed, 70 insertions(+), 64 deletions(-) diff --git a/src/cc/rogue/monsters.c b/src/cc/rogue/monsters.c index 2f6d68362..7e1186e8d 100644 --- a/src/cc/rogue/monsters.c +++ b/src/cc/rogue/monsters.c @@ -124,7 +124,7 @@ wanderer(struct rogue_state *rs) tp = new_item(); do { - find_floor((struct room *) NULL, &cp, FALSE, TRUE); + find_floor(rs,(struct room *) NULL, &cp, FALSE, TRUE); } while (roomin(rs,&cp) == proom); new_monster(rs,tp, randmonster(TRUE), &cp); if (on(player, SEEMONST)) diff --git a/src/cc/rogue/new_level.c b/src/cc/rogue/new_level.c index b55d3e42c..c2ec5219d 100644 --- a/src/cc/rogue/new_level.c +++ b/src/cc/rogue/new_level.c @@ -74,7 +74,7 @@ new_level(struct rogue_state *rs) */ do { - find_floor((struct room *) NULL, &stairs, FALSE, FALSE); + find_floor(rs,(struct room *) NULL, &stairs, FALSE, FALSE); } while (chat(stairs.y, stairs.x) != FLOOR); sp = &flat(stairs.y, stairs.x); *sp &= ~F_REAL; @@ -84,14 +84,14 @@ new_level(struct rogue_state *rs) /* * Place the staircase down. */ - find_floor((struct room *) NULL, &stairs, FALSE, FALSE); + find_floor(rs,(struct room *) NULL, &stairs, FALSE, FALSE); chat(stairs.y, stairs.x) = STAIRS; seenstairs = FALSE; for (tp = mlist; tp != NULL; tp = next(tp)) tp->t_room = roomin(rs,&tp->t_pos); - find_floor((struct room *) NULL, &hero, FALSE, TRUE); + find_floor(rs,(struct room *) NULL, &hero, FALSE, TRUE); enter_room(rs,&hero); mvaddch(hero.y, hero.x, PLAYER); if (on(player, SEEMONST)) @@ -153,7 +153,7 @@ put_things(struct rogue_state *rs) /* * Put it somewhere */ - find_floor((struct room *) NULL, &obj->o_pos, FALSE, FALSE); + find_floor(rs,(struct room *) NULL, &obj->o_pos, FALSE, FALSE); chat(obj->o_pos.y, obj->o_pos.x) = (char) obj->o_type; } /* @@ -173,7 +173,7 @@ put_things(struct rogue_state *rs) /* * Put it somewhere */ - find_floor((struct room *) NULL, &obj->o_pos, FALSE, FALSE); + find_floor(rs,(struct room *) NULL, &obj->o_pos, FALSE, FALSE); chat(obj->o_pos.y, obj->o_pos.x) = AMULET; } } @@ -201,7 +201,7 @@ treas_room(struct rogue_state *rs) num_monst = nm = rnd(spots) + MINTREAS; while (nm--) { - find_floor(rp, &mp, 2 * MAXTRIES, FALSE); + find_floor(rs,rp, &mp, 2 * MAXTRIES, FALSE); //fprintf(stderr,"treas_room\n"); tp = new_thing(rs); tp->o_pos = mp; @@ -222,7 +222,7 @@ treas_room(struct rogue_state *rs) while (nm--) { spots = 0; - if (find_floor(rp, &mp, MAXTRIES, TRUE)) + if (find_floor(rs,rp, &mp, MAXTRIES, TRUE)) { tp = new_item(); new_monster(rs,tp, randmonster(FALSE), &mp); diff --git a/src/cc/rogue/pack.c b/src/cc/rogue/pack.c index 776669b3b..362c65412 100644 --- a/src/cc/rogue/pack.c +++ b/src/cc/rogue/pack.c @@ -422,6 +422,8 @@ get_item(struct rogue_state *rs,char *purpose, int type) { for (;;) { + if ( rs->replaydone != 0 ) + return(NULL); if (!terse) addmsg(rs,"which object do you want to "); addmsg(rs,purpose); diff --git a/src/cc/rogue/rings.c b/src/cc/rogue/rings.c index 747da302a..af6cc881b 100644 --- a/src/cc/rogue/rings.c +++ b/src/cc/rogue/rings.c @@ -130,24 +130,26 @@ int gethand(struct rogue_state *rs) { int c; - + for (;;) { - if (terse) - msg(rs,"left or right ring? "); - else - msg(rs,"left hand or right hand? "); - if ((c = readchar(rs)) == ESCAPE) - return -1; - mpos = 0; - if (c == 'l' || c == 'L') - return LEFT; - else if (c == 'r' || c == 'R') - return RIGHT; - if (terse) - msg(rs,"L or R"); - else - msg(rs,"please type L or R"); + if ( rs->replaydone != 0 ) + return(-1); + if (terse) + msg(rs,"left or right ring? "); + else + msg(rs,"left hand or right hand? "); + if ((c = readchar(rs)) == ESCAPE) + return -1; + mpos = 0; + if (c == 'l' || c == 'L') + return LEFT; + else if (c == 'r' || c == 'R') + return RIGHT; + if (terse) + msg(rs,"L or R"); + else + msg(rs,"please type L or R"); } } diff --git a/src/cc/rogue/rogue.h b/src/cc/rogue/rogue.h index d453a871f..8c1101fc6 100644 --- a/src/cc/rogue/rogue.h +++ b/src/cc/rogue/rogue.h @@ -612,7 +612,7 @@ void current(struct rogue_state *rs,THING *cur, char *how, char *where); void d_level(struct rogue_state *rs); void death(struct rogue_state *rs,char monst); char death_monst(void); -void dig(int y, int x); +void dig(struct rogue_state *rs,int y, int x); void discard(THING *item); void discovered(struct rogue_state *rs); int dist(int y1, int x1, int y2, int x2); @@ -620,7 +620,7 @@ int dist_cp(coord *c1, coord *c2); int do_chase(struct rogue_state *rs,THING *th); void do_daemons(struct rogue_state *rs,int flag); void do_fuses(struct rogue_state *rs,int flag); -void do_maze(struct room *rp); +void do_maze(struct rogue_state *rs,struct room *rp); void do_motion(struct rogue_state *rs,THING *obj, int ydelta, int xdelta); void do_move(struct rogue_state *rs,int dy, int dx); void do_passages(struct rogue_state *rs); @@ -632,7 +632,7 @@ void doadd(struct rogue_state *rs,char *fmt, va_list args); void door(struct room *rm, coord *cp); void door_open(struct rogue_state *rs,struct room *rp); void drain(struct rogue_state *rs); -void draw_room(struct room *rp); +void draw_room(struct rogue_state *rs,struct room *rp); void drop(struct rogue_state *rs); void eat(struct rogue_state *rs); size_t encread(char *start, size_t size, FILE *inf); @@ -761,7 +761,7 @@ bool chase(THING *tp, coord *ee); bool diag_ok(coord *sp, coord *ep); bool dropcheck(struct rogue_state *rs,THING *obj); bool fallpos(coord *pos, coord *newpos); -bool find_floor(struct room *rp, coord *cp, int limit, bool monst); +bool find_floor(struct rogue_state *rs,struct room *rp, coord *cp, int limit, bool monst); bool is_magic(THING *obj); bool is_symlink(char *sp); bool levit_check(struct rogue_state *rs); diff --git a/src/cc/rogue/rooms.c b/src/cc/rogue/rooms.c index 41041d627..67ca701d9 100644 --- a/src/cc/rogue/rooms.c +++ b/src/cc/rogue/rooms.c @@ -112,7 +112,7 @@ do_rooms(struct rogue_state *rs) rp->r_pos.x = top.x + rnd(bsze.x - rp->r_max.x); rp->r_pos.y = top.y + rnd(bsze.y - rp->r_max.y); } until (rp->r_pos.y != 0); - draw_room(rp); + draw_room(rs,rp); /* * Put the gold in */ @@ -122,7 +122,7 @@ do_rooms(struct rogue_state *rs) gold = new_item(); gold->o_goldval = rp->r_goldval = GOLDCALC; - find_floor(rp, &rp->r_gold, FALSE, FALSE); + find_floor(rs,rp, &rp->r_gold, FALSE, FALSE); gold->o_pos = rp->r_gold; chat(rp->r_gold.y, rp->r_gold.x) = GOLD; gold->o_flags = ISMANY; @@ -136,7 +136,7 @@ do_rooms(struct rogue_state *rs) if (rnd(100) < (rp->r_goldval > 0 ? 80 : 25)) { tp = new_item(); - find_floor(rp, &mp, FALSE, TRUE); + find_floor(rs,rp, &mp, FALSE, TRUE); new_monster(rs,tp, randmonster(FALSE), &mp); give_pack(rs,tp); } @@ -150,12 +150,12 @@ do_rooms(struct rogue_state *rs) */ void -draw_room(struct room *rp) +draw_room(struct rogue_state *rs,struct room *rp) { int y, x; if (rp->r_flags & ISMAZE) - do_maze(rp); + do_maze(rs,rp); else { vert(rp, rp->r_pos.x); /* Draw left side */ @@ -211,7 +211,7 @@ static SPOT maze[NUMLINES/3+1][NUMCOLS/3+1]; void -do_maze(struct room *rp) +do_maze(struct rogue_state *rs,struct room *rp) { SPOT *sp; int starty, startx; @@ -232,7 +232,7 @@ do_maze(struct room *rp) pos.y = starty + Starty; pos.x = startx + Startx; putpass(&pos); - dig(starty, startx); + dig(rs,starty, startx); } /* @@ -241,7 +241,7 @@ do_maze(struct room *rp) */ void -dig(int y, int x) +dig(struct rogue_state *rs,int y, int x) { coord *cp; int cnt, newy, newx, nexty = 0, nextx = 0; @@ -252,6 +252,8 @@ dig(int y, int x) for (;;) { + if ( rs->replaydone != 0 ) + return; cnt = 0; for (cp = del; cp <= &del[3]; cp++) { @@ -291,7 +293,7 @@ dig(int y, int x) pos.y = nexty + Starty; pos.x = nextx + Startx; putpass(&pos); - dig(nexty, nextx); + dig(rs,nexty, nextx); } } @@ -332,7 +334,7 @@ rnd_pos(struct room *rp, coord *cp) * pick a new room each time around the loop. */ bool -find_floor(struct room *rp, coord *cp, int limit, bool monst) +find_floor(struct rogue_state *rs,struct room *rp, coord *cp, int limit, bool monst) { PLACE *pp; int cnt; @@ -346,6 +348,8 @@ find_floor(struct room *rp, coord *cp, int limit, bool monst) cnt = limit; for (;;) { + if ( rs->replaydone != 0 ) + return(FALSE); if (limit && cnt-- == 0) return FALSE; if (pickroom) diff --git a/src/cc/rogue/sticks.c b/src/cc/rogue/sticks.c index f048f9423..cd559daef 100644 --- a/src/cc/rogue/sticks.c +++ b/src/cc/rogue/sticks.c @@ -158,7 +158,7 @@ do_zap(struct rogue_state *rs) { do { - find_floor(NULL, &new_pos, FALSE, TRUE); + find_floor(rs,NULL, &new_pos, FALSE, TRUE); } while (ce(new_pos, hero)); } else diff --git a/src/cc/rogue/weapons.c b/src/cc/rogue/weapons.c index e5a5eacf6..e313bf9d3 100644 --- a/src/cc/rogue/weapons.c +++ b/src/cc/rogue/weapons.c @@ -81,6 +81,8 @@ do_motion(struct rogue_state *rs,THING *obj, int ydelta, int xdelta) obj->o_pos = hero; for (;;) { + if ( rs->replaydone != 0 ) + return; /* * Erase the old one */ diff --git a/src/cc/rogue/wizard.c b/src/cc/rogue/wizard.c index ee16b2d9b..35ce9fb54 100644 --- a/src/cc/rogue/wizard.c +++ b/src/cc/rogue/wizard.c @@ -35,19 +35,21 @@ whatis(struct rogue_state *rs,bool insist, int type) for (;;) { - obj = get_item(rs,"identify", type); - if (insist) - { - if (n_objs == 0) - return; - else if (obj == NULL) - msg(rs,"you must identify something"); - else if (type && obj->o_type != type && - !(type == R_OR_S && (obj->o_type == RING || obj->o_type == STICK)) ) - msg(rs,"you must identify a %s", type_name(type)); - else - break; - } + if ( rs->replaydone != 0 ) + return; + obj = get_item(rs,"identify", type); + if (insist) + { + if (n_objs == 0) + return; + else if (obj == NULL) + msg(rs,"you must identify something"); + else if (type && obj->o_type != type && + !(type == R_OR_S && (obj->o_type == RING || obj->o_type == STICK)) ) + msg(rs,"you must identify a %s", type_name(type)); + else + break; + } else break; } @@ -202,7 +204,7 @@ teleport(struct rogue_state *rs) static coord c; mvaddch(hero.y, hero.x, floor_at()); - find_floor((struct room *) NULL, &c, FALSE, TRUE); + find_floor(rs,(struct room *) NULL, &c, FALSE, TRUE); if (roomin(rs,&c) != proom) { leave_room(rs,&hero); diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index f0453b66d..107e50e4d 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -588,19 +588,18 @@ int32_t rogue_playersalive(int32_t &openslots,int32_t &numplayers,uint256 gametx numplayers = openslots = 0; if ( komodo_nextheight() <= gameht+ROGUE_MAXKEYSTROKESGAP ) registration_open = 1; - fprintf(stderr,"players alive\n"); for (i=0; i ROGUE_MAXITERATIONS ) break; } - fprintf(stderr,"out of while\n"); if ( txid != zeroid ) { - fprintf(stderr,"get height of %s\n",txid.GetHex().c_str()); if ( myGetTransaction(txid,tx,hashBlock) != 0 ) { - fprintf(stderr,"got tx %s\n",txid.GetHex().c_str()); if ( (pindex= komodo_blockindex(hashBlock)) != 0 ) { - fprintf(stderr,"got pindex %s\n",hashBlock.GetHex().c_str()); if ( pindex->GetHeight() <= gameht+ROGUE_MAXKEYSTROKESGAP ) alive++; } } - fprintf(stderr,"got height of %s\n",txid.GetHex().c_str()); } } } else if ( registration_open != 0 ) openslots++; } - fprintf(stderr,"numalive.%d openslots.%d\n",alive,openslots); + //fprintf(stderr,"numalive.%d openslots.%d\n",alive,openslots); return(alive); } From 7a761304c516d4f517d3f344015073c795fb33b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 1 Mar 2019 02:47:51 -1100 Subject: [PATCH 66/67] -print --- src/cc/CCtx.cpp | 2 +- src/cc/rogue_rpc.cpp | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 65aad8e3a..2b0893eb4 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -350,7 +350,7 @@ int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag,int32_t lockflag) { CCoins coins; - fprintf(stderr,"CCgettxoud %s/v%d\n",txid.GetHex().c_str(),vout); + //fprintf(stderr,"CCgettxoud %s/v%d\n",txid.GetHex().c_str(),vout); if ( mempoolflag != 0 ) { if ( lockflag != 0 ) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 107e50e4d..2457f4f4b 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -489,7 +489,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke playertxid = batontxid = zeroid; for (i=0; i= 0 ) { if ( myGetTransaction(spenttxid,spenttx,hashBlock) != 0 && spenttx.vout.size() > 0 ) @@ -942,7 +942,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto { UniValue obj; seed = rogue_gamefields(obj,maxplayers,buyin,gametxid,rogueaddr); - fprintf(stderr,"(%s) found baton %s numkeys.%d seed.%llu playerdata.%d playertxid.%s\n",pname.size()!=0?pname.c_str():Rogue_pname.c_str(),batontxid.ToString().c_str(),numkeys,(long long)seed,(int32_t)playerdata.size(),playertxid.GetHex().c_str()); + //fprintf(stderr,"(%s) found baton %s numkeys.%d seed.%llu playerdata.%d playertxid.%s\n",pname.size()!=0?pname.c_str():Rogue_pname.c_str(),batontxid.ToString().c_str(),numkeys,(long long)seed,(int32_t)playerdata.size(),playertxid.GetHex().c_str()); memset(&P,0,sizeof(P)); if ( playerdata.size() > 0 ) { @@ -968,7 +968,6 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto fclose(fp); } } - fprintf(stderr,"replay2\n"); num = rogue_replay2(newplayer,seed,keystrokes,numkeys,playerdata.size()==0?0:&P,0); newdata.resize(num); for (i=0; i Date: Fri, 1 Mar 2019 02:52:21 -1100 Subject: [PATCH 67/67] -print --- src/cc/rogue_rpc.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 2457f4f4b..00fe4c842 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -936,6 +936,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto seed = 0; num = numkeys = 0; playertxid = zeroid; + str[0] = 0; if ( (err= rogue_isvalidgame(cp,gameheight,gametx,buyin,maxplayers,gametxid,0)) == 0 ) { if ( (retval= rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,rogueaddr,numplayers,symbol,pname)) == 0 ) @@ -977,7 +978,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto } if ( endP.gold <= 0 || endP.hitpoints <= 0 || (endP.strength&0xffff) <= 0 || endP.level <= 0 || endP.experience <= 0 || endP.dungeonlevel <= 0 ) { - //fprintf(stderr,"zero value character was killed -> no playerdata\n"); + fprintf(stderr,"zero value character was killed -> no playerdata\n"); newdata.resize(0); //P.gold = (P.gold * 8) / 10; if ( keystrokes != 0 ) @@ -985,6 +986,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto free(keystrokes); keystrokes = 0; *numkeysp = 0; + return(keystrokes); } } else