From 23e0b80b6d5b64721645753a39e10835c613fec7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:17:13 -1100 Subject: [PATCH] Test --- src/cc/CCinclude.h | 10 ++++++---- src/cc/CCtx.cpp | 14 +++++++++++++- src/cc/CCutils.cpp | 19 ++++++++++++++++++- src/cc/gateways.cpp | 17 +++++++---------- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index afc113083..4beb722a1 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -67,12 +67,12 @@ struct CC_utxo struct CCcontract_info { uint256 prevtxid; - char unspendableCCaddr[64],CChexstr[72],normaladdr[64],unspendableaddr2[64]; - uint8_t CCpriv[32],unspendablepriv2[32]; - CPubKey unspendablepk2; + char unspendableCCaddr[64],CChexstr[72],normaladdr[64],unspendableaddr2[64],unspendableaddr3[64]; + uint8_t CCpriv[32],unspendablepriv2[32],unspendablepriv3[32]; + CPubKey unspendablepk2,unspendablepk3; bool (*validate)(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); bool (*ismyvin)(CScript const& scriptSig); - uint8_t evalcode,evalcode2,didinit; + uint8_t evalcode,evalcode2,evalcode3,didinit; }; struct CCcontract_info *CCinit(struct CCcontract_info *cp,uint8_t evalcode); @@ -126,6 +126,8 @@ CTxOut MakeCC1vout(uint8_t evalcode,CAmount nValue,CPubKey pk); CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk,CPubKey pk2); CC *MakeCCcond1(uint8_t evalcode,CPubKey pk); CC* GetCryptoCondition(CScript const& scriptSig); +void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr); +void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr); bool IsCCInput(CScript const& scriptSig); int32_t unstringbits(char *buf,uint64_t bits); uint64_t stringbits(char *str); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index c9196e951..b92879359 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -41,7 +41,7 @@ bool SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const CScrip std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret) { auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); - CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t mask=0,nmask=0,vinimask=0; int64_t utxovalues[64],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*othercond2=0,*cond; CPubKey unspendablepk; + CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t mask=0,nmask=0,vinimask=0; int64_t utxovalues[64],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*othercond2=0,*othercond3=0,*cond; CPubKey unspendablepk; n = mtx.vout.size(); for (i=0; ievalcode2,cp->unspendablepk2); cond = othercond2; } + else if ( strcmp(destaddr,cp->unspendableaddr3) == 0 ) + { + //fprintf(stderr,"matched %s unspendable3!\n",cp->unspendableaddr3); + privkey = cp->unspendablepriv3; + if ( othercond3 == 0 ) + othercond3 = MakeCCcond1(cp->evalcode3,cp->unspendablepk3); + cond = othercond3; + } else { fprintf(stderr,"vini.%d has unknown CC address.(%s)\n",i,destaddr); @@ -155,6 +163,10 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran cc_free(mycond); if ( othercond != 0 ) cc_free(othercond); + if ( othercond2 != 0 ) + cc_free(othercond2); + if ( othercond3 != 0 ) + cc_free(othercond3); std::string strHex = EncodeHexTx(mtx); if ( strHex.size() > 0 ) return(strHex); diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 396b3211d..a91d6ffdd 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -169,6 +169,22 @@ CPubKey pubkey2pk(std::vector pubkey) return(pk); } +void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr) +{ + cp->evalcode2 = evalcode; + cp->unspendablepk2 = pk; + memcpy(cp->unspendablepriv2,priv,32); + strcpy(cp->unspendableaddr2,coinaddr); +} + +void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr) +{ + cp->evalcode3 = evalcode; + cp->unspendablepk3 = pk; + memcpy(cp->unspendablepriv3,priv,32); + strcpy(cp->unspendableaddr3,coinaddr); +} + bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) { CTxDestination address; txnouttype whichType; @@ -339,7 +355,8 @@ bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector param //if ( txid == cp->prevtxid ) // return(true); //fprintf(stderr,"process CC %02x\n",cp->evalcode); - cp->unspendableaddr2[0] = 0; + cp->evalcode2 = cp->evalcode3 = 0; + cp->unspendableaddr2[0] = cp->unspendableaddr3[0] = 0; if ( paramsNull.size() != 0 ) // Don't expect params return eval->Invalid("Cannot have params"); else if ( ctx.vout.size() == 0 ) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index d4e755c8a..53abb345e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -619,20 +619,17 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2,mypriv[32]; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64],coinaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(cp->unspendableaddr2,EVAL_ASSETS,gatewayspk); - memcpy(cp->unspendablepriv2,cp->CCpriv,32); - assetscp->evalcode2 = cp->evalcode2 = EVAL_ASSETS; - assetscp->unspendablepk2 = gatewayspk; - cp->unspendablepk2 = gatewayspk; - memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); - strcpy(assetscp->unspendableaddr2,cp->unspendableaddr2); + CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,cp->unspendableCCaddr); + Myprivkey(mypriv); + _GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk); + CCaddr3set(assetscp,EVAL_GATEWAYS,mypk,mypriv,coinaddr); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -656,7 +653,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui //fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(cp,mtx,gatewayspk,assetid,amount,60)) > 0 ) + if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); @@ -664,7 +661,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n");