Merge remote-tracking branch 'origin/jl777' into cctests
This commit is contained in:
16
.github/ISSUE_TEMPLATE.md
vendored
16
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,10 +1,8 @@
|
|||||||
<!--- Remove text and sections that do not apply -->
|
<!--- Remove text and sections that do not apply -->
|
||||||
|
|
||||||
This issue tracker is only for technical issues related to zcashd.
|
This issue tracker is only for technical issues related to komodod
|
||||||
|
|
||||||
General Zcash questions and/or support requests and are best directed to the [Zcash Forums](https://forum.z.cash) or [Community Rocket.Chat](https://chat.zcashcommunity.com).
|
General Komodo questions and/or support requests and are best directed to [Discord](https://komodoplatform.com/discord)
|
||||||
|
|
||||||
For reporting security vulnerabilities or for sensitive discussions with our security team, please contact [security@z.cash](mailto:security@z.cash). You can use the [GPG key](https://z.cash/gpg-pubkeys/security.asc) (fingerprint: `AF85 0445 546C 18B7 86F9 2C62 88FB 8B86 D8B5 A68C`) to send an encrypted message. The key and fingerprint are duplicated on our [Public Keys page](https://z.cash/support/pubkeys.html).
|
|
||||||
|
|
||||||
### Describe the issue
|
### Describe the issue
|
||||||
Please provide a general summary of the issue you're experiencing
|
Please provide a general summary of the issue you're experiencing
|
||||||
@@ -21,8 +19,8 @@ Tell us what should happen
|
|||||||
### Actual behaviour + errors
|
### Actual behaviour + errors
|
||||||
Tell us what happens instead including any noticable error output (any messages displayed on-screen when e.g. a crash occurred)
|
Tell us what happens instead including any noticable error output (any messages displayed on-screen when e.g. a crash occurred)
|
||||||
|
|
||||||
### The version of Zcash you were using:
|
### The version of Komodo you were using:
|
||||||
Run `zcashd --version` to find out
|
Run `komodod --version` to find out
|
||||||
|
|
||||||
### Machine specs:
|
### Machine specs:
|
||||||
- OS name + version:
|
- OS name + version:
|
||||||
@@ -34,9 +32,9 @@ Run `zcashd --version` to find out
|
|||||||
- Compiler version (gcc -version):
|
- Compiler version (gcc -version):
|
||||||
|
|
||||||
### Any extra information that might be useful in the debugging process.
|
### Any extra information that might be useful in the debugging process.
|
||||||
This includes the relevant contents of `~/.zcash/debug.log`. You can paste raw text, attach the file directly in the issue or link to the text via a pastebin type site.
|
This includes the relevant contents of `~/.komodo/debug.log`. You can paste raw text, attach the file directly in the issue or link to the text via a pastebin type site.
|
||||||
Please also include any non-standard things you did during compilation (extra flags, dependency version changes etc.) if applicable.
|
Please also include any non-standard things you did during compilation (extra flags, dependency version changes etc.) if applicable.
|
||||||
|
|
||||||
### Do you have a backup of `~/.zcash` directory and/or take a VM snapshot?
|
### Do you have a backup of `~/.komodo` directory and/or take a VM snapshot?
|
||||||
- Backing up / making a copy of the `~/.zcash` directory might help make the problem reproducible. Please redact appropriately.
|
- Backing up / making a copy of the `~/.komodo` directory might help make the problem reproducible. Please redact appropriately.
|
||||||
- Taking a VM snapshot is really helpful for interactively testing fixes
|
- Taking a VM snapshot is really helpful for interactively testing fixes
|
||||||
|
|||||||
@@ -15,9 +15,6 @@
|
|||||||
|
|
||||||
#include "CCassets.h"
|
#include "CCassets.h"
|
||||||
|
|
||||||
// need allassets
|
|
||||||
// find asset
|
|
||||||
|
|
||||||
int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs)
|
int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs)
|
||||||
{
|
{
|
||||||
char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector<uint8_t> origpubkey; CTransaction vintx; int32_t j,vout,n = 0;
|
char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector<uint8_t> origpubkey; CTransaction vintx; int32_t j,vout,n = 0;
|
||||||
@@ -35,7 +32,7 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK
|
|||||||
continue;
|
continue;
|
||||||
if ( GetTransaction(txid,vintx,hashBlock,false) != 0 )
|
if ( GetTransaction(txid,vintx,hashBlock,false) != 0 )
|
||||||
{
|
{
|
||||||
if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 )
|
if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 )
|
||||||
{
|
{
|
||||||
if ( total != 0 && maxinputs != 0 )
|
if ( total != 0 && maxinputs != 0 )
|
||||||
mtx.vin.push_back(CTxIn(txid,vout,CScript()));
|
mtx.vin.push_back(CTxIn(txid,vout,CScript()));
|
||||||
|
|||||||
@@ -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; };
|
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;
|
typedef union _bits256 bits256;
|
||||||
|
|
||||||
|
struct CC_utxo
|
||||||
|
{
|
||||||
|
uint256 txid;
|
||||||
|
int64_t nValue;
|
||||||
|
int32_t vout;
|
||||||
|
};
|
||||||
|
|
||||||
struct CCcontract_info
|
struct CCcontract_info
|
||||||
{
|
{
|
||||||
uint256 prevtxid;
|
uint256 prevtxid;
|
||||||
|
|||||||
@@ -201,36 +201,124 @@ uint64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout)
|
|||||||
return(0);
|
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<numunspents; i++)
|
||||||
|
{
|
||||||
|
if ( (atx_value= utxos[i].nValue) <= 0 )
|
||||||
|
continue;
|
||||||
|
if ( atx_value == value )
|
||||||
|
{
|
||||||
|
*aboveip = *belowip = i;
|
||||||
|
*abovep = *belowp = 0;
|
||||||
|
return(i);
|
||||||
|
}
|
||||||
|
else if ( atx_value > 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)
|
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<COutput> 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<COutput> vecOutputs; CTransaction tx; struct CC_utxo *utxos,*up;
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
const CKeyStore& keystore = *pwalletMain;
|
const CKeyStore& keystore = *pwalletMain;
|
||||||
assert(pwalletMain != NULL);
|
assert(pwalletMain != NULL);
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
pwalletMain->AvailableCoins(vecOutputs, false, NULL, true);
|
pwalletMain->AvailableCoins(vecOutputs, false, NULL, true);
|
||||||
|
utxos = (struct CC_utxo *)calloc(maxutxos,sizeof(*utxos));
|
||||||
BOOST_FOREACH(const COutput& out, vecOutputs)
|
BOOST_FOREACH(const COutput& out, vecOutputs)
|
||||||
{
|
{
|
||||||
if ( out.fSpendable != 0 )
|
if ( out.fSpendable != 0 )
|
||||||
{
|
{
|
||||||
txid = out.tx->GetHash();
|
txid = out.tx->GetHash();
|
||||||
vout = out.i;
|
vout = out.i;
|
||||||
for (j=0; j<mtx.vin.size(); j++)
|
for (i=0; i<mtx.vin.size(); i++)
|
||||||
if ( txid == mtx.vin[j].prevout.hash && vout == mtx.vin[j].prevout.n )
|
if ( txid == mtx.vin[i].prevout.hash && vout == mtx.vin[i].prevout.n )
|
||||||
break;
|
break;
|
||||||
if ( j != mtx.vin.size() )
|
if ( i != mtx.vin.size() )
|
||||||
continue;
|
continue;
|
||||||
if ( myIsutxo_spentinmempool(txid,vout) == 0 )
|
if ( myIsutxo_spentinmempool(txid,vout) == 0 )
|
||||||
{
|
{
|
||||||
mtx.vin.push_back(CTxIn(txid,vout,CScript()));
|
up = &utxos[n++];
|
||||||
|
up->txid = 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;
|
nValue = out.tx->vout[out.i].nValue;
|
||||||
totalinputs += nValue;
|
totalinputs += nValue;
|
||||||
n++;
|
n++;
|
||||||
if ( totalinputs >= total || n >= maxinputs )
|
if ( totalinputs >= total || n >= maxinputs )
|
||||||
|
break;*/
|
||||||
|
if ( n >= maxutxos )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
remains = total;
|
||||||
|
for (i=0; i<maxinputs; i++)
|
||||||
|
{
|
||||||
|
below = above = 0;
|
||||||
|
abovei = belowi = -1;
|
||||||
|
if ( CC_vinselect(&abovei,&above,&belowi,&below,utxos,n,remains) < 0 )
|
||||||
|
{
|
||||||
|
printf("error finding unspent i.%d of %d, %.8f vs %.8f\n",i,n,(double)remains/COIN,(double)total/COIN);
|
||||||
|
free(utxos);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
if ( belowi < 0 || abovei >= 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,n,(double)remains/COIN,(double)total/COIN,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 )
|
if ( totalinputs >= total )
|
||||||
return(totalinputs);
|
return(totalinputs);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ bool AuctionExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransactio
|
|||||||
bool AuctionValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx)
|
bool AuctionValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx)
|
||||||
{
|
{
|
||||||
int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval;
|
int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval;
|
||||||
|
return(false); // reject any auction CC for now
|
||||||
numvins = tx.vin.size();
|
numvins = tx.vin.size();
|
||||||
numvouts = tx.vout.size();
|
numvouts = tx.vout.size();
|
||||||
preventCCvins = preventCCvouts = -1;
|
preventCCvins = preventCCvouts = -1;
|
||||||
|
|||||||
@@ -126,20 +126,21 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx
|
|||||||
|
|
||||||
uint64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint64_t total,int32_t maxinputs)
|
uint64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint64_t total,int32_t maxinputs)
|
||||||
{
|
{
|
||||||
char coinaddr[64]; uint64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector<uint8_t> origpubkey; CTransaction vintx; int32_t n = 0;
|
char coinaddr[64]; uint64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector<uint8_t> origpubkey; CTransaction vintx; int32_t vout,n = 0;
|
||||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||||
GetCCaddress(cp,coinaddr,pk);
|
GetCCaddress(cp,coinaddr,pk);
|
||||||
SetCCunspents(unspentOutputs,coinaddr);
|
SetCCunspents(unspentOutputs,coinaddr);
|
||||||
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
||||||
{
|
{
|
||||||
txid = it->first.txhash;
|
txid = it->first.txhash;
|
||||||
// prevent dup
|
vout = (int32_t)it->first.index;
|
||||||
|
// no need to prevent dup
|
||||||
if ( GetTransaction(txid,vintx,hashBlock,false) != 0 )
|
if ( GetTransaction(txid,vintx,hashBlock,false) != 0 )
|
||||||
{
|
{
|
||||||
if ( (nValue= IsFaucetvout(cp,vintx,(int32_t)it->first.index)) > 1000000 )
|
if ( (nValue= IsFaucetvout(cp,vintx,vout)) > 1000000 && myIsutxo_spentinmempool(txid,vout) == 0 )
|
||||||
{
|
{
|
||||||
if ( total != 0 && maxinputs != 0 )
|
if ( total != 0 && maxinputs != 0 )
|
||||||
mtx.vin.push_back(CTxIn(txid,(int32_t)it->first.index,CScript()));
|
mtx.vin.push_back(CTxIn(txid,vout,CScript()));
|
||||||
nValue = it->second.satoshis;
|
nValue = it->second.satoshis;
|
||||||
totalinputs += nValue;
|
totalinputs += nValue;
|
||||||
n++;
|
n++;
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ bool FSMExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction &t
|
|||||||
bool FSMValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx)
|
bool FSMValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx)
|
||||||
{
|
{
|
||||||
int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval;
|
int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval;
|
||||||
|
return(false); // reject any FSM CC for now
|
||||||
numvins = tx.vin.size();
|
numvins = tx.vin.size();
|
||||||
numvouts = tx.vout.size();
|
numvouts = tx.vout.size();
|
||||||
preventCCvins = preventCCvouts = -1;
|
preventCCvins = preventCCvouts = -1;
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ bool LottoExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction
|
|||||||
bool LottoValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx)
|
bool LottoValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx)
|
||||||
{
|
{
|
||||||
int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval;
|
int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval;
|
||||||
|
return(false); // reject any lotto CC for now
|
||||||
numvins = tx.vin.size();
|
numvins = tx.vin.size();
|
||||||
numvouts = tx.vout.size();
|
numvouts = tx.vout.size();
|
||||||
preventCCvins = preventCCvouts = -1;
|
preventCCvins = preventCCvouts = -1;
|
||||||
|
|||||||
@@ -137,18 +137,23 @@ uint8_t DecodeRewardsOpRet(uint256 txid,const CScript &scriptPubKey,uint64_t &sb
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t IsRewardsvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v)
|
uint64_t IsRewardsvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v,uint64_t refsbits,uint256 reffundingtxid)
|
||||||
{
|
{
|
||||||
char destaddr[64];
|
char destaddr[64]; uint64_t sbits; uint256 fundingtxid,txid; uint8_t funcid; int32_t numvouts;
|
||||||
if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 )
|
if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 && (numvouts= (int32_t)tx.vout.size()) > 0 )
|
||||||
{
|
{
|
||||||
if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 )
|
txid = tx.GetHash();
|
||||||
return(tx.vout[v].nValue);
|
if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[numvouts-1].scriptPubKey,sbits,fundingtxid)) != 0 && sbits == refsbits && (fundingtxid == reffundingtxid || txid == reffundingtxid) )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 )
|
||||||
|
return(tx.vout[v].nValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx,uint64_t txfee)
|
bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx,uint64_t txfee,uint64_t refsbits,uint256 reffundingtxid)
|
||||||
{
|
{
|
||||||
static uint256 zerohash;
|
static uint256 zerohash;
|
||||||
CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis;
|
CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis;
|
||||||
@@ -164,7 +169,7 @@ bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransactio
|
|||||||
{
|
{
|
||||||
if ( hashBlock == zerohash )
|
if ( hashBlock == zerohash )
|
||||||
return eval->Invalid("cant rewards from mempool");
|
return eval->Invalid("cant rewards from mempool");
|
||||||
if ( (assetoshis= IsRewardsvout(cp,vinTx,tx.vin[i].prevout.n)) != 0 )
|
if ( (assetoshis= IsRewardsvout(cp,vinTx,tx.vin[i].prevout.n,refsbits,reffundingtxid)) != 0 )
|
||||||
inputs += assetoshis;
|
inputs += assetoshis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -172,7 +177,7 @@ bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransactio
|
|||||||
for (i=0; i<numvouts; i++)
|
for (i=0; i<numvouts; i++)
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"i.%d of numvouts.%d\n",i,numvouts);
|
//fprintf(stderr,"i.%d of numvouts.%d\n",i,numvouts);
|
||||||
if ( (assetoshis= IsRewardsvout(cp,tx,i)) != 0 )
|
if ( (assetoshis= IsRewardsvout(cp,tx,i,refsbits,reffundingtxid)) != 0 )
|
||||||
outputs += assetoshis;
|
outputs += assetoshis;
|
||||||
}
|
}
|
||||||
if ( inputs != outputs+txfee )
|
if ( inputs != outputs+txfee )
|
||||||
@@ -236,7 +241,7 @@ bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t
|
|||||||
if ( (*cp->ismyvin)(tx.vin[i].scriptSig) == 0 )
|
if ( (*cp->ismyvin)(tx.vin[i].scriptSig) == 0 )
|
||||||
return eval->Invalid("unexpected normal vin for unlock");
|
return eval->Invalid("unexpected normal vin for unlock");
|
||||||
}
|
}
|
||||||
if ( RewardsExactAmounts(cp,eval,tx,txfee+tx.vout[1].nValue) == 0 )
|
if ( RewardsExactAmounts(cp,eval,tx,txfee+tx.vout[1].nValue,sbits,fundingtxid) == 0 )
|
||||||
return false;
|
return false;
|
||||||
else if ( eval->GetTxUnconfirmed(tx.vin[0].prevout.hash,vinTx,hashBlock) == 0 )
|
else if ( eval->GetTxUnconfirmed(tx.vin[0].prevout.hash,vinTx,hashBlock) == 0 )
|
||||||
return eval->Invalid("always should find vin.0, but didnt");
|
return eval->Invalid("always should find vin.0, but didnt");
|
||||||
@@ -264,7 +269,7 @@ bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 'L' vs 'F' and 'A'
|
// 'L' vs 'F' and 'A'
|
||||||
uint64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint64_t total,int32_t maxinputs)
|
uint64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint64_t total,int32_t maxinputs,uint64_t refsbits,uint256 reffundingtxid)
|
||||||
{
|
{
|
||||||
char coinaddr[64],str[65]; uint64_t sbits,nValue,totalinputs = 0; uint256 txid,hashBlock,fundingtxid; CTransaction tx; int32_t j,vout,n = 0; uint8_t funcid;
|
char coinaddr[64],str[65]; uint64_t sbits,nValue,totalinputs = 0; uint256 txid,hashBlock,fundingtxid; CTransaction tx; int32_t j,vout,n = 0; uint8_t funcid;
|
||||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||||
@@ -282,10 +287,12 @@ uint64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontr
|
|||||||
break;
|
break;
|
||||||
if ( j != mtx.vin.size() )
|
if ( j != mtx.vin.size() )
|
||||||
continue;
|
continue;
|
||||||
if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() != 0 )
|
if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() != 0 && myIsutxo_spentinmempool(txid,vout) == 0 )
|
||||||
{
|
{
|
||||||
if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid)) != 0 )
|
if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid)) != 0 )
|
||||||
{
|
{
|
||||||
|
if ( sbits != refsbits || fundingtxid != reffundingtxid )
|
||||||
|
continue;
|
||||||
fprintf(stderr,"fundsflag.%d (%c) %.8f %.8f\n",fundsflag,funcid,(double)tx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN);
|
fprintf(stderr,"fundsflag.%d (%c) %.8f %.8f\n",fundsflag,funcid,(double)tx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN);
|
||||||
if ( fundsflag != 0 && funcid != 'F' && funcid != 'A' && funcid != 'U' )
|
if ( fundsflag != 0 && funcid != 'F' && funcid != 'A' && funcid != 'U' )
|
||||||
continue;
|
continue;
|
||||||
@@ -323,7 +330,7 @@ uint64_t RewardsPlanFunds(uint64_t refsbits,struct CCcontract_info *cp,CPubKey p
|
|||||||
{
|
{
|
||||||
if ( (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid )
|
if ( (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid )
|
||||||
{
|
{
|
||||||
if ( refsbits == sbits && (nValue= IsRewardsvout(cp,tx,vout)) > 0 )
|
if ( refsbits == sbits && (nValue= IsRewardsvout(cp,tx,vout,sbits,fundingtxid)) > 0 )
|
||||||
totalinputs += nValue;
|
totalinputs += nValue;
|
||||||
else fprintf(stderr,"refsbits.%llx sbits.%llx nValue %.8f\n",(long long)refsbits,(long long)sbits,(double)nValue/COIN);
|
else fprintf(stderr,"refsbits.%llx sbits.%llx nValue %.8f\n",(long long)refsbits,(long long)sbits,(double)nValue/COIN);
|
||||||
} //else fprintf(stderr,"else case\n");
|
} //else fprintf(stderr,"else case\n");
|
||||||
@@ -412,7 +419,7 @@ UniValue RewardsList()
|
|||||||
std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t APR,int64_t minseconds,int64_t maxseconds,int64_t mindeposit)
|
std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t APR,int64_t minseconds,int64_t maxseconds,int64_t mindeposit)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t sbits,a,b,c,d; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t sbits,a,b,c,d; struct CCcontract_info *cp,C;
|
||||||
if ( funds < 0 || mindeposit < 0 || minseconds < 0 || maxseconds < 0 )
|
if ( funds < COIN || mindeposit < 0 || minseconds < 0 || maxseconds < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative parameter error\n");
|
fprintf(stderr,"negative parameter error\n");
|
||||||
return(0);
|
return(0);
|
||||||
@@ -520,7 +527,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2
|
|||||||
}
|
}
|
||||||
fprintf(stderr,"APR %.8f minseconds.%llu maxseconds.%llu mindeposit %.8f\n",(double)APR/COIN,(long long)minseconds,(long long)maxseconds,(double)mindeposit/COIN);
|
fprintf(stderr,"APR %.8f minseconds.%llu maxseconds.%llu mindeposit %.8f\n",(double)APR/COIN,(long long)minseconds,(long long)maxseconds,(double)mindeposit/COIN);
|
||||||
if ( locktxid == zeroid )
|
if ( locktxid == zeroid )
|
||||||
amount = AddRewardsInputs(scriptPubKey,0,cp,mtx,rewardspk,(1LL << 30),1);
|
amount = AddRewardsInputs(scriptPubKey,0,cp,mtx,rewardspk,(1LL << 30),1,sbits,fundingtxid);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GetCCaddress(cp,coinaddr,rewardspk);
|
GetCCaddress(cp,coinaddr,rewardspk);
|
||||||
@@ -542,7 +549,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2
|
|||||||
}
|
}
|
||||||
if ( amount > 0 && (reward= RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit)) > txfee && scriptPubKey.size() > 0 )
|
if ( amount > 0 && (reward= RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit)) > txfee && scriptPubKey.size() > 0 )
|
||||||
{
|
{
|
||||||
if ( (inputs= AddRewardsInputs(ignore,1,cp,mtx,rewardspk,reward+txfee,30)) > 0 )
|
if ( (inputs= AddRewardsInputs(ignore,1,cp,mtx,rewardspk,reward+txfee,30,sbits,fundingtxid)) > 0 )
|
||||||
{
|
{
|
||||||
if ( inputs >= (reward + 2*txfee) )
|
if ( inputs >= (reward + 2*txfee) )
|
||||||
CCchange = (inputs - (reward + txfee));
|
CCchange = (inputs - (reward + txfee));
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ public:
|
|||||||
|
|
||||||
//! height of the entry in the chain. The genesis block has height 0
|
//! height of the entry in the chain. The genesis block has height 0
|
||||||
int nHeight;
|
int nHeight;
|
||||||
int64_t newcoins,zfunds;
|
int64_t newcoins,zfunds; int8_t segid; // jl777 fields
|
||||||
//! Which # file this block is stored in (blk?????.dat)
|
//! Which # file this block is stored in (blk?????.dat)
|
||||||
int nFile;
|
int nFile;
|
||||||
|
|
||||||
@@ -182,6 +182,7 @@ public:
|
|||||||
{
|
{
|
||||||
phashBlock = NULL;
|
phashBlock = NULL;
|
||||||
newcoins = zfunds = 0;
|
newcoins = zfunds = 0;
|
||||||
|
segid = -2;
|
||||||
pprev = NULL;
|
pprev = NULL;
|
||||||
pskip = NULL;
|
pskip = NULL;
|
||||||
nHeight = 0;
|
nHeight = 0;
|
||||||
|
|||||||
@@ -427,7 +427,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar
|
|||||||
errs++;
|
errs++;
|
||||||
if ( fwrite(opretbuf,1,olen,fp) != olen )
|
if ( fwrite(opretbuf,1,olen,fp) != olen )
|
||||||
errs++;
|
errs++;
|
||||||
printf("create ht.%d R opret[%d] sp.%p\n",height,olen,sp);
|
//printf("create ht.%d R opret[%d] sp.%p\n",height,olen,sp);
|
||||||
//komodo_opreturn(height,opretvalue,opretbuf,olen,txhash,vout);
|
//komodo_opreturn(height,opretvalue,opretbuf,olen,txhash,vout);
|
||||||
komodo_eventadd_opreturn(sp,symbol,height,txhash,opretvalue,vout,opretbuf,olen);
|
komodo_eventadd_opreturn(sp,symbol,height,txhash,opretvalue,vout,opretbuf,olen);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1105,7 +1105,6 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_
|
|||||||
commission must be in coinbase.vout[1] and must be >= 10000 sats
|
commission must be in coinbase.vout[1] and must be >= 10000 sats
|
||||||
PoS stake must be without txfee and in the last tx in the block at vout[0]
|
PoS stake must be without txfee and in the last tx in the block at vout[0]
|
||||||
*/
|
*/
|
||||||
//#define KOMODO_POWMINMULT 16
|
|
||||||
|
|
||||||
uint64_t komodo_commission(const CBlock *pblock)
|
uint64_t komodo_commission(const CBlock *pblock)
|
||||||
{
|
{
|
||||||
@@ -1135,11 +1134,13 @@ uint32_t komodo_segid32(char *coinaddr)
|
|||||||
return(addrhash.uints[0]);
|
return(addrhash.uints[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t komodo_segid(int32_t height)
|
int8_t komodo_segid(int32_t nocache,int32_t height)
|
||||||
{
|
{
|
||||||
CTxDestination voutaddress; CBlock block; CBlockIndex *pindex; uint64_t value; uint32_t txtime; char voutaddr[64],destaddr[64]; int32_t txn_count,vout; uint256 txid; int8_t segid = -1;
|
CTxDestination voutaddress; CBlock block; CBlockIndex *pindex; uint64_t value; uint32_t txtime; char voutaddr[64],destaddr[64]; int32_t txn_count,vout; uint256 txid; int8_t segid = -1;
|
||||||
if ( height > 0 && (pindex= komodo_chainactive(height)) != 0 )
|
if ( height > 0 && (pindex= komodo_chainactive(height)) != 0 )
|
||||||
{
|
{
|
||||||
|
if ( nocache == 0 && pindex->segid >= -1 )
|
||||||
|
return(pindex->segid);
|
||||||
if ( komodo_blockload(block,pindex) == 0 )
|
if ( komodo_blockload(block,pindex) == 0 )
|
||||||
{
|
{
|
||||||
txn_count = block.vtx.size();
|
txn_count = block.vtx.size();
|
||||||
@@ -1154,6 +1155,7 @@ int8_t komodo_segid(int32_t height)
|
|||||||
if ( strcmp(destaddr,voutaddr) == 0 && block.vtx[txn_count-1].vout[0].nValue == value )
|
if ( strcmp(destaddr,voutaddr) == 0 && block.vtx[txn_count-1].vout[0].nValue == value )
|
||||||
{
|
{
|
||||||
segid = komodo_segid32(voutaddr) & 0x3f;
|
segid = komodo_segid32(voutaddr) & 0x3f;
|
||||||
|
//fprintf(stderr,"komodo_segid.(%d) -> %02x\n",height,segid);
|
||||||
}
|
}
|
||||||
} else fprintf(stderr,"komodo_segid ht.%d couldnt extract voutaddress\n",height);
|
} else fprintf(stderr,"komodo_segid ht.%d couldnt extract voutaddress\n",height);
|
||||||
}
|
}
|
||||||
@@ -1173,7 +1175,7 @@ int32_t komodo_segids(uint8_t *hashbuf,int32_t height,int32_t n)
|
|||||||
memset(hashbuf,0xff,n);
|
memset(hashbuf,0xff,n);
|
||||||
for (i=0; i<n; i++)
|
for (i=0; i<n; i++)
|
||||||
{
|
{
|
||||||
hashbuf[i] = (uint8_t)komodo_segid(height+i);
|
hashbuf[i] = (uint8_t)komodo_segid(1,height+i);
|
||||||
//fprintf(stderr,"%02x ",hashbuf[i]);
|
//fprintf(stderr,"%02x ",hashbuf[i]);
|
||||||
}
|
}
|
||||||
if ( n == 100 )
|
if ( n == 100 )
|
||||||
@@ -1224,13 +1226,6 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh
|
|||||||
komodo_segids(hashbuf,nHeight-101,100);
|
komodo_segids(hashbuf,nHeight-101,100);
|
||||||
segid32 = komodo_stakehash(&hash,address,hashbuf,txid,vout);
|
segid32 = komodo_stakehash(&hash,address,hashbuf,txid,vout);
|
||||||
segid = ((nHeight + segid32) & 0x3f);
|
segid = ((nHeight + segid32) & 0x3f);
|
||||||
/*vcalc_sha256(0,(uint8_t *)&addrhash,(uint8_t *)address,(int32_t)strlen(address));
|
|
||||||
segid = ((nHeight + addrhash.uints[0]) & 0x3f);
|
|
||||||
komodo_segids(hashbuf,nHeight-101,100);
|
|
||||||
memcpy(&hashbuf[100],&addrhash,sizeof(addrhash));
|
|
||||||
memcpy(&hashbuf[100+sizeof(addrhash)],&txid,sizeof(txid));
|
|
||||||
memcpy(&hashbuf[100+sizeof(addrhash)+sizeof(txid)],&vout,sizeof(vout));
|
|
||||||
vcalc_sha256(0,(uint8_t *)&hash,hashbuf,100 + (int32_t)sizeof(uint256)*2 + sizeof(vout));*/
|
|
||||||
for (iter=0; iter<600; iter++)
|
for (iter=0; iter<600; iter++)
|
||||||
{
|
{
|
||||||
if ( blocktime+iter+segid*2 < txtime+minage )
|
if ( blocktime+iter+segid*2 < txtime+minage )
|
||||||
@@ -1248,12 +1243,8 @@ uint32_t komodo_stake(int32_t validateflag,arith_uint256 bnTarget,int32_t nHeigh
|
|||||||
coinage = (value * diff);
|
coinage = (value * diff);
|
||||||
if ( blocktime+iter+segid*2 > prevtime+480 )
|
if ( blocktime+iter+segid*2 > prevtime+480 )
|
||||||
coinage *= ((blocktime+iter+segid*2) - (prevtime+400));
|
coinage *= ((blocktime+iter+segid*2) - (prevtime+400));
|
||||||
//if ( nHeight >= 2500 && blocktime+iter+segid*2 > prevtime+180 )
|
|
||||||
// coinage *= ((blocktime+iter+segid*2) - (prevtime+60));
|
|
||||||
coinage256 = arith_uint256(coinage+1);
|
coinage256 = arith_uint256(coinage+1);
|
||||||
hashval = ratio * (UintToArith256(hash) / coinage256);
|
hashval = ratio * (UintToArith256(hash) / coinage256);
|
||||||
//if ( nHeight >= 900 && nHeight < 916 )
|
|
||||||
// hashval = (hashval / coinage256);
|
|
||||||
if ( hashval <= bnTarget )
|
if ( hashval <= bnTarget )
|
||||||
{
|
{
|
||||||
winner = 1;
|
winner = 1;
|
||||||
@@ -1308,7 +1299,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he
|
|||||||
continue;
|
continue;
|
||||||
if ( (pindex= komodo_chainactive(ht)) != 0 )
|
if ( (pindex= komodo_chainactive(ht)) != 0 )
|
||||||
{
|
{
|
||||||
if ( komodo_segid(ht) >= 0 )
|
if ( komodo_segid(0,ht) >= 0 )
|
||||||
{
|
{
|
||||||
n++;
|
n++;
|
||||||
percPoS++;
|
percPoS++;
|
||||||
@@ -1323,26 +1314,6 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he
|
|||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*if ( (pindex= komodo_chainactive(ht)) != 0 )
|
|
||||||
{
|
|
||||||
bnTarget.SetCompact(pindex->nBits,&fNegative,&fOverflow);
|
|
||||||
bnTarget = (bnTarget / arith_uint256(KOMODO_POWMINMULT));
|
|
||||||
hashval = UintToArith256(pindex->GetBlockHash());
|
|
||||||
if ( hashval <= bnTarget ) // PoW is never as easy as PoS/16, some PoS will be counted as PoW
|
|
||||||
{
|
|
||||||
if ( ASSETCHAINS_STAKED < 100 )
|
|
||||||
fprintf(stderr,"1");
|
|
||||||
sum += hashval;
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
n++;
|
|
||||||
percPoS++;
|
|
||||||
if ( ASSETCHAINS_STAKED < 100 )
|
|
||||||
fprintf(stderr,"0");
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
if ( ASSETCHAINS_STAKED < 100 && (i % 10) == 9 )
|
if ( ASSETCHAINS_STAKED < 100 && (i % 10) == 9 )
|
||||||
fprintf(stderr," %d, ",percPoS);
|
fprintf(stderr," %d, ",percPoS);
|
||||||
}
|
}
|
||||||
@@ -1351,7 +1322,6 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he
|
|||||||
if ( ASSETCHAINS_STAKED < 100 )
|
if ( ASSETCHAINS_STAKED < 100 )
|
||||||
fprintf(stderr," -> %d%% percPoS vs goalperc.%d ht.%d\n",percPoS,goalperc,height);
|
fprintf(stderr," -> %d%% percPoS vs goalperc.%d ht.%d\n",percPoS,goalperc,height);
|
||||||
*percPoSp = percPoS;
|
*percPoSp = percPoS;
|
||||||
//target = (target / arith_uint256(KOMODO_POWMINMULT));
|
|
||||||
if ( m > 0 )
|
if ( m > 0 )
|
||||||
{
|
{
|
||||||
ave = (sum / arith_uint256(m));
|
ave = (sum / arith_uint256(m));
|
||||||
@@ -1411,11 +1381,18 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he
|
|||||||
return(bnTarget);
|
return(bnTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_uint256 bnTarget)
|
int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_uint256 bnTarget,arith_uint256 bhash)
|
||||||
{
|
{
|
||||||
CBlockIndex *previndex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,txn_count,eligible=0,isPoS = 0; uint64_t value; CTxDestination voutaddress;
|
CBlockIndex *previndex,*pindex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,PoSperc,txn_count,eligible=0,isPoS = 0,segid; uint64_t value; CTxDestination voutaddress;
|
||||||
if ( ASSETCHAINS_STAKED == 100 && height <= 10 )
|
if ( ASSETCHAINS_STAKED == 100 && height <= 10 )
|
||||||
return(1);
|
return(1);
|
||||||
|
pindex = mapBlockIndex[pblock->GetHash()];
|
||||||
|
if ( pindex != 0 && pindex->segid >= -1 )
|
||||||
|
{
|
||||||
|
if ( pindex->segid == -1 )
|
||||||
|
return(0);
|
||||||
|
else return(1);
|
||||||
|
}
|
||||||
txn_count = pblock->vtx.size();
|
txn_count = pblock->vtx.size();
|
||||||
if ( txn_count > 1 && pblock->vtx[txn_count-1].vin.size() == 1 && pblock->vtx[txn_count-1].vout.size() == 1 )
|
if ( txn_count > 1 && pblock->vtx[txn_count-1].vin.size() == 1 && pblock->vtx[txn_count-1].vout.size() == 1 )
|
||||||
{
|
{
|
||||||
@@ -1429,29 +1406,58 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_
|
|||||||
if ( prevtime != 0 )
|
if ( prevtime != 0 )
|
||||||
{
|
{
|
||||||
if ( komodo_isPoS(pblock) != 0 )
|
if ( komodo_isPoS(pblock) != 0 )
|
||||||
|
{
|
||||||
eligible = komodo_stake(1,bnTarget,height,txid,vout,pblock->nTime,prevtime+27,(char *)"");
|
eligible = komodo_stake(1,bnTarget,height,txid,vout,pblock->nTime,prevtime+27,(char *)"");
|
||||||
|
}
|
||||||
if ( eligible == 0 || eligible > pblock->nTime )
|
if ( eligible == 0 || eligible > pblock->nTime )
|
||||||
{
|
{
|
||||||
if ( ASSETCHAINS_STAKED < 100 )
|
if ( 0 && ASSETCHAINS_STAKED < 100 )
|
||||||
fprintf(stderr,"komodo_is_PoSblock PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d -> check to see if it is PoW block\n",height,eligible,(uint32_t)pblock->nTime,(int32_t)(eligible - pblock->nTime));
|
fprintf(stderr,"komodo_is_PoSblock PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d -> check to see if it is PoW block\n",height,eligible,(uint32_t)pblock->nTime,(int32_t)(eligible - pblock->nTime));
|
||||||
} else isPoS = 1;
|
if ( slowflag != 0 && pindex != 0 )
|
||||||
|
{
|
||||||
|
pindex->segid = -1;
|
||||||
|
fprintf(stderr,"PoW block detected set segid.%d <- %d\n",height,pindex->segid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isPoS = 2; // 2 means staking utxo validated
|
||||||
|
if ( slowflag != 0 && height > 100 )
|
||||||
|
{
|
||||||
|
if ( pindex != 0 && pindex->segid == -2 && (segid= komodo_segid(1,height)) >= 0 )
|
||||||
|
{
|
||||||
|
pindex->segid = segid;
|
||||||
|
fprintf(stderr,"B set segid.%d <- %d\n",height,pindex->segid);
|
||||||
|
} else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( slowflag == 0 ) // maybe previous block is not seen yet, do the best approx
|
if ( slowflag == 0 && isPoS == 0 ) // maybe previous block is not seen yet, do the best approx
|
||||||
{
|
{
|
||||||
if ( komodo_isPoS(pblock) != 0 )
|
if ( komodo_isPoS(pblock) != 0 )
|
||||||
isPoS = 1;
|
isPoS = 1;
|
||||||
/*txtime = komodo_txtime(&value,txid,vout,destaddr);
|
}
|
||||||
if ( ExtractDestination(pblock->vtx[txn_count-1].vout[0].scriptPubKey,voutaddress) )
|
if ( slowflag != 0 && isPoS != 0 )
|
||||||
|
{
|
||||||
|
if ( isPoS != 2 )
|
||||||
{
|
{
|
||||||
strcpy(voutaddr,CBitcoinAddress(voutaddress).ToString().c_str());
|
fprintf(stderr,"ht.%d isPoS.%d utxo not validated -> must be PoW fake\n",height,isPoS);
|
||||||
if ( strcmp(destaddr,voutaddr) == 0 && pblock->vtx[txn_count-1].vout[0].nValue == value )
|
isPoS = 0;
|
||||||
isPoS = 1; // close enough for a pre-filter
|
}
|
||||||
//else fprintf(stderr,"komodo_is_PoSblock ht.%d (%s) != (%s) or %.8f != %.8f\n",height,destaddr,voutaddr,dstr(value),dstr(pblock->vtx[txn_count-1].vout[0].nValue));
|
else
|
||||||
} else fprintf(stderr,"komodo_is_PoSblock ht.%d couldnt extract voutaddress\n",height);*/
|
{
|
||||||
} //else return(-1);
|
bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED);
|
||||||
|
if ( bhash < bnTarget )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"ht.%d isPoS but meets PoW diff!\n",height);
|
||||||
|
isPoS = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//else return(-1);
|
||||||
}
|
}
|
||||||
//fprintf(stderr,"slow.%d ht.%d isPoS.%d\n",slowflag,height,isPoS);
|
//fprintf(stderr,"slow.%d ht.%d isPoS.%d\n",slowflag,height,isPoS);
|
||||||
return(isPoS);
|
return(isPoS != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t komodo_checkcommission(CBlock *pblock,int32_t height)
|
int64_t komodo_checkcommission(CBlock *pblock,int32_t height)
|
||||||
@@ -1482,6 +1488,8 @@ bool KOMODO_TEST_ASSETCHAIN_SKIP_POW = 0;
|
|||||||
int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
||||||
{
|
{
|
||||||
uint256 hash; arith_uint256 bnTarget,bhash; bool fNegative,fOverflow; uint8_t *script,pubkey33[33],pubkeys[64][33]; int32_t i,possible,PoSperc,is_PoSblock=0,n,failed = 0,notaryid = -1; int64_t checktoshis,value; CBlockIndex *pprev;
|
uint256 hash; arith_uint256 bnTarget,bhash; bool fNegative,fOverflow; uint8_t *script,pubkey33[33],pubkeys[64][33]; int32_t i,possible,PoSperc,is_PoSblock=0,n,failed = 0,notaryid = -1; int64_t checktoshis,value; CBlockIndex *pprev;
|
||||||
|
if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW == 0 && Params().NetworkIDString() == "regtest" )
|
||||||
|
KOMODO_TEST_ASSETCHAIN_SKIP_POW = 1;
|
||||||
if ( !CheckEquihashSolution(pblock, Params()) )
|
if ( !CheckEquihashSolution(pblock, Params()) )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"komodo_checkPOW slowflag.%d ht.%d CheckEquihashSolution failed\n",slowflag,height);
|
fprintf(stderr,"komodo_checkPOW slowflag.%d ht.%d CheckEquihashSolution failed\n",slowflag,height);
|
||||||
@@ -1522,13 +1530,15 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
|||||||
{
|
{
|
||||||
if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW )
|
if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW )
|
||||||
return(0);
|
return(0);
|
||||||
if ( ASSETCHAINS_STAKED == 0 ) // komodo_is_PoSblock will check bnTarget
|
if ( ASSETCHAINS_STAKED == 0 ) // komodo_is_PoSblock will check bnTarget for staked chains
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ( strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 13000 )
|
||||||
|
return(0);
|
||||||
if ( ASSETCHAINS_STAKED != 0 && height >= 2 ) // must PoS or have at least 16x better PoW
|
if ( ASSETCHAINS_STAKED != 0 && height >= 2 ) // must PoS or have at least 16x better PoW
|
||||||
{
|
{
|
||||||
if ( (is_PoSblock= komodo_is_PoSblock(slowflag,height,pblock,bnTarget)) == 0 )
|
if ( (is_PoSblock= komodo_is_PoSblock(slowflag,height,pblock,bnTarget,bhash)) == 0 )
|
||||||
{
|
{
|
||||||
if ( ASSETCHAINS_STAKED == 100 && height > 100 ) // only PoS allowed! POSTEST64
|
if ( ASSETCHAINS_STAKED == 100 && height > 100 ) // only PoS allowed! POSTEST64
|
||||||
return(-1);
|
return(-1);
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ int32_t komodo_kvsearch(uint256 *pubkeyp,int32_t current_height,uint32_t *flagsp
|
|||||||
if ( (retval= ptr->valuesize) > 0 )
|
if ( (retval= ptr->valuesize) > 0 )
|
||||||
memcpy(value,ptr->value,retval);
|
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);
|
portable_mutex_unlock(&KOMODO_KV_mutex);
|
||||||
if ( retval < 0 )
|
if ( retval < 0 )
|
||||||
{
|
{
|
||||||
@@ -172,7 +172,7 @@ void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value)
|
|||||||
memcpy(ptr->key,key,keylen);
|
memcpy(ptr->key,key,keylen);
|
||||||
newflag = 1;
|
newflag = 1;
|
||||||
HASH_ADD_KEYPTR(hh,KOMODO_KV,ptr->key,ptr->keylen,ptr);
|
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 )
|
if ( newflag != 0 || (ptr->flags & KOMODO_KVPROTECTED) == 0 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3368,6 +3368,10 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) {
|
|||||||
assert(view.Flush());
|
assert(view.Flush());
|
||||||
DisconnectNotarisations(block);
|
DisconnectNotarisations(block);
|
||||||
}
|
}
|
||||||
|
pindexDelete->segid = -2;
|
||||||
|
pindexDelete->newcoins = 0;
|
||||||
|
pindexDelete->zfunds = 0;
|
||||||
|
|
||||||
LogPrint("bench", "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * 0.001);
|
LogPrint("bench", "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * 0.001);
|
||||||
uint256 anchorAfterDisconnect = pcoinsTip->GetBestAnchor();
|
uint256 anchorAfterDisconnect = pcoinsTip->GetBestAnchor();
|
||||||
// Write the chain state to disk, if necessary.
|
// Write the chain state to disk, if necessary.
|
||||||
|
|||||||
@@ -103,9 +103,10 @@ static const unsigned int DATABASE_FLUSH_INTERVAL = 24 * 60 * 60;
|
|||||||
static const unsigned int MAX_REJECT_MESSAGE_LENGTH = 111;
|
static const unsigned int MAX_REJECT_MESSAGE_LENGTH = 111;
|
||||||
|
|
||||||
//static const bool DEFAULT_ADDRESSINDEX = false;
|
//static const bool DEFAULT_ADDRESSINDEX = false;
|
||||||
|
//static const bool DEFAULT_SPENTINDEX = false;
|
||||||
#define DEFAULT_ADDRESSINDEX (GetArg("-ac_cc",0) != 0)
|
#define DEFAULT_ADDRESSINDEX (GetArg("-ac_cc",0) != 0)
|
||||||
|
#define DEFAULT_SPENTINDEX (GetArg("-ac_cc",0) != 0)
|
||||||
static const bool DEFAULT_TIMESTAMPINDEX = false;
|
static const bool DEFAULT_TIMESTAMPINDEX = false;
|
||||||
static const bool DEFAULT_SPENTINDEX = false;
|
|
||||||
static const unsigned int DEFAULT_DB_MAX_OPEN_FILES = 1000;
|
static const unsigned int DEFAULT_DB_MAX_OPEN_FILES = 1000;
|
||||||
static const bool DEFAULT_DB_COMPRESSION = true;
|
static const bool DEFAULT_DB_COMPRESSION = true;
|
||||||
|
|
||||||
|
|||||||
@@ -4836,7 +4836,9 @@ int32_t ensure_CCrequirements()
|
|||||||
if ( NOTARY_PUBKEY33[0] == 0 )
|
if ( NOTARY_PUBKEY33[0] == 0 )
|
||||||
return(-1);
|
return(-1);
|
||||||
else if ( GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX) == 0 )
|
else if ( GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX) == 0 )
|
||||||
return(-2);
|
return(-1);
|
||||||
|
else if ( GetBoolArg("-spentindex", DEFAULT_SPENTINDEX) == 0 )
|
||||||
|
return(-1);
|
||||||
else return(0);
|
else return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5044,7 +5046,7 @@ UniValue rewardsaddfunding(const UniValue& params, bool fHelp)
|
|||||||
UniValue rewardsunlock(const UniValue& params, bool fHelp)
|
UniValue rewardsunlock(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); std::string hex; char *name; uint256 fundingtxid,txid;
|
UniValue result(UniValue::VOBJ); std::string hex; char *name; uint256 fundingtxid,txid;
|
||||||
if ( fHelp || params.size() > 3 )
|
if ( fHelp || params.size() > 3 || params.size() < 2 )
|
||||||
throw runtime_error("rewardsunlock name fundingtxid [txid]\n");
|
throw runtime_error("rewardsunlock name fundingtxid [txid]\n");
|
||||||
if ( ensure_CCrequirements() < 0 )
|
if ( ensure_CCrequirements() < 0 )
|
||||||
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user