Marmara coinbase initial impl
This commit is contained in:
@@ -19,6 +19,11 @@
|
|||||||
|
|
||||||
#include "CCinclude.h"
|
#include "CCinclude.h"
|
||||||
|
|
||||||
|
#define MARMARA_GROUPSIZE 60
|
||||||
|
#define MARMARA_MINLOCK (1440 * 3 * 30)
|
||||||
|
#define MARMARA_MAXLOCK (1440 * 24 * 30)
|
||||||
|
uint64_t komodo_block_prg(uint32_t nHeight);
|
||||||
|
|
||||||
bool MarmaraValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
bool MarmaraValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn);
|
||||||
|
|
||||||
// CCcustom
|
// CCcustom
|
||||||
|
|||||||
@@ -71,6 +71,70 @@ bool MarmaraExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransactio
|
|||||||
else return(true);
|
else return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t MarmaraRandomize(uint32_t ind)
|
||||||
|
{
|
||||||
|
uint64_t val64; uint32_t val,range = (MARMARA_MAXLOCK - MARMARA_MINLOCK);
|
||||||
|
val64 = komodo_block_prg(ind);
|
||||||
|
val = (uint32_t)(val64 >> 32);
|
||||||
|
val ^= (uint32_t)val64;
|
||||||
|
return(val % range);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t MarmaraUnlockht(int32_t height)
|
||||||
|
{
|
||||||
|
uint32_t ind = height / MARMARA_GROUPSIZE;
|
||||||
|
return(height + MarmaraRandomize(ind));
|
||||||
|
}
|
||||||
|
|
||||||
|
CScript EncodeMarmaraCoinbaseOpRet(CPubKey pk,int32_t height)
|
||||||
|
{
|
||||||
|
CScript opret; int32_t unlockht; uint8_t evalcode = EVAL_ORACLES;
|
||||||
|
unlockht = MarmaraUnlockht(ht);
|
||||||
|
opret << OP_RETURN << E_MARSHAL(ss << evalcode << 'C' << pk << height << unlockht);
|
||||||
|
return(opret);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t DecodeMaramaraCoinbaseOpRet(const CScript &scriptPubKey,CPubKey &pk,int32_t &height,int32_t &unlckht)
|
||||||
|
{
|
||||||
|
std::vector<uint8_t> vopret; uint8_t *script,e,f,funcid;
|
||||||
|
GetOpReturnData(scriptPubKey,vopret);
|
||||||
|
script = (uint8_t *)vopret.data();
|
||||||
|
if ( vopret.size() > 2 && script[0] == EVAL_MARMARA )
|
||||||
|
{
|
||||||
|
if ( script[1] == 'C' )
|
||||||
|
{
|
||||||
|
if ( E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> pk; ss >> height; ss >> unlockht) != 0 )
|
||||||
|
{
|
||||||
|
return(script[1]);
|
||||||
|
} else fprintf(stderr,"DecodeMaramaraCoinbaseOpRet unmarshal error for C\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t MarmaraValidateCoinbase(int32_t height,CTransaction tx)
|
||||||
|
{
|
||||||
|
struct CCcontract_info *cp,C; CPubKey pk; int32_t ht,unlockht; CTxOut ccvout;
|
||||||
|
cp = CCinit(&C,EVAL_MARMARA);
|
||||||
|
for (ht=0; ht<10000; ht+=MARMARA_GROUPSIZE/3)
|
||||||
|
fprintf(stderr,"%d ",MarmaraUnlockht(ht));
|
||||||
|
fprintf(stderr,"<- unlock hts\n");
|
||||||
|
if ( tx.vout.size() == 2 && tx.vout[1].nValue == 0 )
|
||||||
|
{
|
||||||
|
if ( DecodeMaramaraCoinbaseOpRet(tx.vout[1].scriptPubKey,pk,ht,unlockht) == 'C' )
|
||||||
|
{
|
||||||
|
if ( ht == height && MarmaraUnlockht(height) == unlockht )
|
||||||
|
{
|
||||||
|
ccvout = MakeCC1vout(EVAL_MARMARA,0,pk);
|
||||||
|
if ( ccvout.scriptPubKey == tx.vout[0].scriptPubKey )
|
||||||
|
return(0);
|
||||||
|
fprintf(stderr,"ht.%d mismatched CCvout scriptPubKey\n",height);
|
||||||
|
} else fprintf(stderr,"ht.%d %d vs %d unlock.%d\n",height,MarmaraUnlockht(height),ht,unlockht);
|
||||||
|
} else fprintf(stderr,"ht.%d error decoding coinbase opret\n");
|
||||||
|
}
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
bool MarmaraValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn)
|
bool MarmaraValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn)
|
||||||
{
|
{
|
||||||
int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,numblocks; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64];
|
int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,numblocks; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64];
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ public:
|
|||||||
|
|
||||||
strNetworkID = "main";
|
strNetworkID = "main";
|
||||||
strCurrencyUnits = "KMD";
|
strCurrencyUnits = "KMD";
|
||||||
bip44CoinType = 141; // As registered in https://github.com/satoshilabs/slips/blob/master/slip-0044.md (ZCASH, should be VRSC)
|
bip44CoinType = 141; // As registered in https://github.com/satoshilabs/slips/blob/master/slip-0044.md
|
||||||
consensus.fCoinbaseMustBeProtected = false; // true this is only true wuth Verus and enforced after block 12800
|
consensus.fCoinbaseMustBeProtected = false; // true this is only true wuth Verus and enforced after block 12800
|
||||||
consensus.nSubsidySlowStartInterval = 20000;
|
consensus.nSubsidySlowStartInterval = 20000;
|
||||||
consensus.nSubsidyHalvingInterval = 840000;
|
consensus.nSubsidyHalvingInterval = 840000;
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
// paxdeposit equivalent in reverse makes opreturn and KMD does the same in reverse
|
// paxdeposit equivalent in reverse makes opreturn and KMD does the same in reverse
|
||||||
#include "komodo_defs.h"
|
#include "komodo_defs.h"
|
||||||
|
|
||||||
|
int32_t MarmaraValidateCoinbase(int32_t height,CTransaction tx);
|
||||||
|
|
||||||
int32_t pax_fiatstatus(uint64_t *available,uint64_t *deposited,uint64_t *issued,uint64_t *withdrawn,uint64_t *approved,uint64_t *redeemed,char *base)
|
int32_t pax_fiatstatus(uint64_t *available,uint64_t *deposited,uint64_t *issued,uint64_t *withdrawn,uint64_t *approved,uint64_t *redeemed,char *base)
|
||||||
{
|
{
|
||||||
int32_t baseid; struct komodo_state *sp; int64_t netliability,maxallowed,maxval;
|
int32_t baseid; struct komodo_state *sp; int64_t netliability,maxallowed,maxval;
|
||||||
@@ -687,6 +689,14 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block,uint32_t prevtim
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ( ASSETCHAINS_MARMARA != 0 && (height & 1) != 0 )
|
||||||
|
{
|
||||||
|
if ( MarmaraValidateCoinbase(height,block.vtx[0]) < 0 )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"MARMARA constrains odd height blocks to pay 100% to CC in vout0\n");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
// we don't want these checks in VRSC, leave it at the Sapling upgrade
|
// we don't want these checks in VRSC, leave it at the Sapling upgrade
|
||||||
if ( ASSETCHAINS_SYMBOL[0] == 0 ||
|
if ( ASSETCHAINS_SYMBOL[0] == 0 ||
|
||||||
(ASSETCHAINS_COMMISSION != 0 && height > 1) ||
|
(ASSETCHAINS_COMMISSION != 0 && height > 1) ||
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ unsigned int WITNESS_CACHE_SIZE = _COINBASE_MATURITY+10;
|
|||||||
int32_t KOMODO_MININGTHREADS = -1,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX,KOMODO_EXCHANGEWALLET,KOMODO_REWIND,KOMODO_CONNECTING = -1,KOMODO_DEALERNODE,KOMODO_EXTRASATOSHI,ASSETCHAINS_FOUNDERS;
|
int32_t KOMODO_MININGTHREADS = -1,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX,KOMODO_EXCHANGEWALLET,KOMODO_REWIND,KOMODO_CONNECTING = -1,KOMODO_DEALERNODE,KOMODO_EXTRASATOSHI,ASSETCHAINS_FOUNDERS;
|
||||||
int32_t KOMODO_INSYNC,KOMODO_LASTMINED,prevKOMODO_LASTMINED,KOMODO_CCACTIVATE,JUMBLR_PAUSE = 1;
|
int32_t KOMODO_INSYNC,KOMODO_LASTMINED,prevKOMODO_LASTMINED,KOMODO_CCACTIVATE,JUMBLR_PAUSE = 1;
|
||||||
std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY,ASSETCHAINS_SCRIPTPUB,ASSETCHAINS_SELFIMPORT;
|
std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY,ASSETCHAINS_SCRIPTPUB,ASSETCHAINS_SELFIMPORT;
|
||||||
uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEYHASH[20],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_TXPOW;
|
uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEYHASH[20],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_TXPOW,ASSETCHAINS_MARMARA;
|
||||||
bool VERUS_MINTBLOCKS;
|
bool VERUS_MINTBLOCKS;
|
||||||
|
|
||||||
char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN],ASSETCHAINS_USERPASS[4096];
|
char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN],ASSETCHAINS_USERPASS[4096];
|
||||||
|
|||||||
@@ -1778,6 +1778,7 @@ void komodo_args(char *argv0)
|
|||||||
ASSETCHAINS_SCRIPTPUB = GetArg("-ac_script","");
|
ASSETCHAINS_SCRIPTPUB = GetArg("-ac_script","");
|
||||||
ASSETCHAINS_BEAMPORT = GetArg("-ac_beam",0);
|
ASSETCHAINS_BEAMPORT = GetArg("-ac_beam",0);
|
||||||
ASSETCHAINS_CODAPORT = GetArg("-ac_coda",0);
|
ASSETCHAINS_CODAPORT = GetArg("-ac_coda",0);
|
||||||
|
ASSETCHAINS_MARMARA = GetArg("-ac_marmara",0);
|
||||||
if ( ASSETCHAINS_BEAMPORT != 0 && ASSETCHAINS_CODAPORT != 0 )
|
if ( ASSETCHAINS_BEAMPORT != 0 && ASSETCHAINS_CODAPORT != 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"can only have one of -ac_beam or -ac_coda\n");
|
fprintf(stderr,"can only have one of -ac_beam or -ac_coda\n");
|
||||||
@@ -1857,7 +1858,7 @@ void komodo_args(char *argv0)
|
|||||||
printf("ASSETCHAINS_FOUNDERS needs an ASETCHAINS_OVERRIDE_PUBKEY\n");
|
printf("ASSETCHAINS_FOUNDERS needs an ASETCHAINS_OVERRIDE_PUBKEY\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( ASSETCHAINS_ENDSUBSIDY[0] != 0 || ASSETCHAINS_REWARD[0] != 0 || ASSETCHAINS_HALVING[0] != 0 || ASSETCHAINS_DECAY[0] != 0 || ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_PUBLIC != 0 || ASSETCHAINS_PRIVATE != 0 || ASSETCHAINS_TXPOW != 0 || ASSETCHAINS_FOUNDERS != 0 || ASSETCHAINS_SCRIPTPUB.size() > 1 || ASSETCHAINS_SELFIMPORT.size() > 0 || ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 || ASSETCHAINS_TIMELOCKGTE != _ASSETCHAINS_TIMELOCKOFF|| ASSETCHAINS_ALGO != ASSETCHAINS_EQUIHASH || ASSETCHAINS_LWMAPOS != 0 || ASSETCHAINS_LASTERA > 0 || ASSETCHAINS_BEAMPORT != 0 || ASSETCHAINS_CODAPORT != 0 )
|
if ( ASSETCHAINS_ENDSUBSIDY[0] != 0 || ASSETCHAINS_REWARD[0] != 0 || ASSETCHAINS_HALVING[0] != 0 || ASSETCHAINS_DECAY[0] != 0 || ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_PUBLIC != 0 || ASSETCHAINS_PRIVATE != 0 || ASSETCHAINS_TXPOW != 0 || ASSETCHAINS_FOUNDERS != 0 || ASSETCHAINS_SCRIPTPUB.size() > 1 || ASSETCHAINS_SELFIMPORT.size() > 0 || ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 || ASSETCHAINS_TIMELOCKGTE != _ASSETCHAINS_TIMELOCKOFF|| ASSETCHAINS_ALGO != ASSETCHAINS_EQUIHASH || ASSETCHAINS_LWMAPOS != 0 || ASSETCHAINS_LASTERA > 0 || ASSETCHAINS_BEAMPORT != 0 || ASSETCHAINS_CODAPORT != 0 || ASSETCHAINS_MARMARA != 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"perc %.4f%% ac_pub=[%02x%02x%02x...] acsize.%d\n",dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0],ASSETCHAINS_OVERRIDE_PUBKEY33[1],ASSETCHAINS_OVERRIDE_PUBKEY33[2],(int32_t)ASSETCHAINS_SCRIPTPUB.size());
|
fprintf(stderr,"perc %.4f%% ac_pub=[%02x%02x%02x...] acsize.%d\n",dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0],ASSETCHAINS_OVERRIDE_PUBKEY33[1],ASSETCHAINS_OVERRIDE_PUBKEY33[2],(int32_t)ASSETCHAINS_SCRIPTPUB.size());
|
||||||
extraptr = extrabuf;
|
extraptr = extrabuf;
|
||||||
@@ -1931,6 +1932,8 @@ void komodo_args(char *argv0)
|
|||||||
extraptr[extralen++] = 'b';
|
extraptr[extralen++] = 'b';
|
||||||
if ( ASSETCHAINS_CODAPORT != 0 )
|
if ( ASSETCHAINS_CODAPORT != 0 )
|
||||||
extraptr[extralen++] = 'c';
|
extraptr[extralen++] = 'c';
|
||||||
|
if ( ASSETCHAINS_MARMARA != 0 )
|
||||||
|
extraptr[extralen++] = ASSETCHAINS_MARMARA;
|
||||||
}
|
}
|
||||||
|
|
||||||
addn = GetArg("-seednode","");
|
addn = GetArg("-seednode","");
|
||||||
|
|||||||
Reference in New Issue
Block a user