From 718255b3fdf835774de32a41decea1eb555b0bae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Aug 2018 23:36:00 -1100 Subject: [PATCH] smart utxo selection without press release to coin telegraph --- src/cc/CCinclude.h | 7 ++++ src/cc/CCtx.cpp | 98 +++++++++++++++++++++++++++++++++++++++++++--- src/komodo_kv.h | 4 +- 3 files changed, 102 insertions(+), 7 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 0ab0bf874..a59a2325c 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -33,6 +33,13 @@ union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; }; typedef union _bits256 bits256; +struct CC_utxo +{ + uint256 txid; + int64_t nValue; + int32_t vout; +}; + struct CCcontract_info { uint256 prevtxid; diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index bea26e4a2..171ebf132 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -201,36 +201,124 @@ uint64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) return(0); } +int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t *belowp,struct CC_utxo utxos[],int32_t numunspents,uint64_t value) +{ + int32_t i,abovei,belowi; int64_t above,below,gap,atx_value; + abovei = belowi = -1; + for (above=below=i=0; i value ) + { + gap = (atx_value - value); + if ( above == 0 || gap < above ) + { + above = gap; + abovei = i; + } + } + else + { + gap = (value - atx_value); + if ( below == 0 || gap < below ) + { + below = gap; + belowi = i; + } + } + //printf("value %.8f gap %.8f abovei.%d %.8f belowi.%d %.8f\n",dstr(value),dstr(gap),abovei,dstr(above),belowi,dstr(below)); + } + *aboveip = abovei; + *abovep = above; + *belowip = belowi; + *belowp = below; + //printf("above.%d below.%d\n",abovei,belowi); + if ( abovei >= 0 && belowi >= 0 ) + { + if ( above < (below >> 1) ) + return(abovei); + else return(belowi); + } + else if ( abovei >= 0 ) + return(abovei); + else return(belowi); + //return(abovei >= 0 && above < (below>>1) ? abovei : belowi); +} + uint64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,uint64_t total,int32_t maxinputs) { - int32_t vout,j,n = 0; uint64_t nValue,totalinputs = 0; uint256 txid,hashBlock; std::vector vecOutputs; CTransaction tx; + int32_t abovei,belowi,ind,vout,i,n = 0,maxutxos=1024; int64_t above,below; uint64_t remains,nValue,totalinputs = 0; uint256 txid,hashBlock; std::vector vecOutputs; CTransaction tx; struct CC_utxo *utxos,*up; #ifdef ENABLE_WALLET const CKeyStore& keystore = *pwalletMain; assert(pwalletMain != NULL); LOCK2(cs_main, pwalletMain->cs_wallet); pwalletMain->AvailableCoins(vecOutputs, false, NULL, true); + utxos = calloc(maxutxos,sizeof(*utxos)); BOOST_FOREACH(const COutput& out, vecOutputs) { if ( out.fSpendable != 0 ) { txid = out.tx->GetHash(); vout = out.i; - for (j=0; jtxid = txid; + up->nValue = out.tx->vout[out.i].nValue; + up->vout = vout; + /*mtx.vin.push_back(CTxIn(txid,vout,CScript())); nValue = out.tx->vout[out.i].nValue; totalinputs += nValue; n++; if ( totalinputs >= total || n >= maxinputs ) + break;*/ + if ( n >= maxutxos ) break; } } } + remains = total; + for (i=0; i= 0 ) + ind = abovei; + else ind = belowi; + if ( ind < 0 ) + { + printf("error finding unspent i.%d of %d, %.8f vs %.8f, abovei.%d belowi.%d ind.%d\n",i,numunspents,dstr(remains),dstr(amount),abovei,belowi,ind); + free(utxos); + return(0); + } + up = utxos[ind]; + utxos[ind] = utxos[--n]; + memset(&utxos[n],0,sizeof(utxos[n])); + mtx.vin.push_back(CTxIn(up->txid,up->vout,CScript())); + totalinputs += up->nValue; + remains -= up->nValue; + if ( totalinputs >= total || (i+1) >= maxinputs ) + break; + } + free(utxos); if ( totalinputs >= total ) return(totalinputs); #endif diff --git a/src/komodo_kv.h b/src/komodo_kv.h index ee0496aae..2f4eadea4 100644 --- a/src/komodo_kv.h +++ b/src/komodo_kv.h @@ -88,7 +88,7 @@ int32_t komodo_kvsearch(uint256 *pubkeyp,int32_t current_height,uint32_t *flagsp if ( (retval= ptr->valuesize) > 0 ) memcpy(value,ptr->value,retval); } - } else fprintf(stderr,"couldnt find (%s)\n",(char *)key); + } //else fprintf(stderr,"couldnt find (%s)\n",(char *)key); portable_mutex_unlock(&KOMODO_KV_mutex); if ( retval < 0 ) { @@ -172,7 +172,7 @@ void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value) memcpy(ptr->key,key,keylen); newflag = 1; HASH_ADD_KEYPTR(hh,KOMODO_KV,ptr->key,ptr->keylen,ptr); - fprintf(stderr,"KV add.(%s) (%s)\n",ptr->key,valueptr); + //fprintf(stderr,"KV add.(%s) (%s)\n",ptr->key,valueptr); } if ( newflag != 0 || (ptr->flags & KOMODO_KVPROTECTED) == 0 ) {