]> Git Repo - VerusCoin.git/blame - src/komodo_globals.h
Build fix
[VerusCoin.git] / src / komodo_globals.h
CommitLineData
98f2e433 1/******************************************************************************
713c2a94 2 * Copyright © 2014-2018 The SuperNET Developers. *
98f2e433 3 * *
4 * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
5 * the top-level directory of this distribution for the individual copyright *
6 * holder information and the developer policies on copyright and licensing. *
7 * *
8 * Unless otherwise agreed in a custom licensing agreement, no part of the *
9 * SuperNET software, including this file may be copied, modified, propagated *
10 * or distributed except according to the terms contained in the LICENSE file *
11 * *
12 * Removal or modification of this copyright notice is prohibited. *
13 * *
14 ******************************************************************************/
15
b2a98c42 16#include "komodo_structs.h"
5416af1d 17
cf53fd7c 18void komodo_prefetch(FILE *fp);
709a9861 19uint32_t komodo_heightstamp(int32_t height);
c88fa588 20void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth);
cf0ace4a 21void komodo_init(int32_t height);
51dab149 22int32_t komodo_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight,uint256 *MoMoMp,int32_t *MoMoMoffsetp,int32_t *MoMoMdepthp,int32_t *kmdstartip,int32_t *kmdendip);
cf0ace4a 23int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp);
0ded57c8 24char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port);
cf0ace4a 25void komodo_init(int32_t height);
8683bd8d 26int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp);
48a3cd18 27int32_t komodo_isrealtime(int32_t *kmdheightp);
b4116bb6 28uint64_t komodo_paxtotal();
439e76ae 29int32_t komodo_longestchain();
afacf361 30uint64_t komodo_maxallowed(int32_t baseid);
c2123afe 31int32_t komodo_bannedset(int32_t *indallvoutsp,uint256 *array,int32_t max);
cf0ace4a 32
3face669 33pthread_mutex_t komodo_mutex;
0db8cd28 34
335f2ea7 35#define KOMODO_ELECTION_GAP 2000 //((ASSETCHAINS_SYMBOL[0] == 0) ? 2000 : 100)
7c130297 36#define KOMODO_ASSETCHAIN_MAXLEN 65
0db8cd28 37
0db8cd28 38struct pax_transaction *PAX;
39int32_t NUM_PRICES; uint32_t *PVALS;
40struct knotaries_entry *Pubkeys;
0db8cd28 41
2d116f01 42struct komodo_state KOMODO_STATES[34];
0db8cd28 43
7e2cbee1 44#define _COINBASE_MATURITY 100
7a90b9dd 45int COINBASE_MATURITY = _COINBASE_MATURITY;//100;
1290fc05 46
c8d6a51c 47int32_t KOMODO_MININGTHREADS = 0,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX,KOMODO_EXCHANGEWALLET,KOMODO_REWIND,KOMODO_CONNECTING = -1;
e0f78699 48int32_t KOMODO_INSYNC,KOMODO_LASTMINED,prevKOMODO_LASTMINED,KOMODO_CCACTIVATE,JUMBLR_PAUSE = 1;
6e62f837 49std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY;
36f9e6d6 50uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE;
5f63373e 51bool VERUS_MINTBLOCKS;
98f2e433 52
7af5cf39 53char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN], ASSETCHAINS_USERPASS[4096];
b2a98c42
MT
54
55bool PBAAS_TESTMODE;
56std::string PBAAS_HOST;
57int32_t PBAAS_PORT;
58std::string PBAAS_USERPASS;
7af5cf39 59std::string ASSETCHAINS_RPCHOST, ASSETCHAINS_RPCCREDENTIALS;
b2a98c42
MT
60
61uint160 ASSETCHAINS_CHAINID;
62uint160 VERUS_CHAINID;
7c8e5e18 63std::string VERUS_CHAINNAME = "VRSC";
346d96b9 64uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
6d2fc290 65uint32_t ASSETCHAIN_INIT,ASSETCHAINS_CC,KOMODO_STOPAT;
98f2e433 66uint32_t ASSETCHAINS_MAGIC = 2387029918;
a0dd01bc 67int64_t ASSETCHAINS_GENESISTXVAL = 5000000000;
36647d52 68
9feb4b9e 69int64_t MAX_MONEY = 200000000 * 100000000LL;
c8c684e9 70int64_t MAX_SUPPLY = 50000000000LL * 100000000LL;
9feb4b9e 71
29bd53a1
MT
72// consensus variables for coinbase timelock control and timelock transaction support
73// time locks are specified enough to enable their use initially to lock specific coinbase transactions for emission control
74// to be verifiable, timelocks require additional data that enables them to be validated and their ownership and
75// release time determined from the blockchain. to do this, every time locked output according to this
76// spec will use an op_return with CLTV at front and anything after |OP_RETURN|PUSH of rest|OPRETTYPE_TIMELOCK|script|
0a962eb9 77#define _ASSETCHAINS_TIMELOCKOFF 0xffffffffffffffff
f5aab5ec 78uint64_t ASSETCHAINS_TIMELOCKGTE = _ASSETCHAINS_TIMELOCKOFF, ASSETCHAINS_TIMEUNLOCKFROM = 0, ASSETCHAINS_TIMEUNLOCKTO = 0;
d121e75b 79
6b78e01d 80uint32_t ASSETCHAINS_LASTERA = 1;
26a8d194 81uint64_t ASSETCHAINS_ENDSUBSIDY[ASSETCHAINS_MAX_ERAS],ASSETCHAINS_REWARD[ASSETCHAINS_MAX_ERAS],ASSETCHAINS_HALVING[ASSETCHAINS_MAX_ERAS],ASSETCHAINS_DECAY[ASSETCHAINS_MAX_ERAS];
d7bbd546 82uint64_t ASSETCHAINS_ERAOPTIONS[ASSETCHAINS_MAX_ERAS];
98f2e433 83
42181656 84#define _ASSETCHAINS_EQUIHASH 0
85uint32_t ASSETCHAINS_NUMALGOS = 2;
86uint32_t ASSETCHAINS_EQUIHASH = _ASSETCHAINS_EQUIHASH;
87uint32_t ASSETCHAINS_VERUSHASH = 1;
88const char *ASSETCHAINS_ALGORITHMS[] = {"equihash", "verushash"};
4dcb64c0
MT
89uint64_t ASSETCHAINS_NONCEMASK[] = {0xffff,0xfffffff};
90uint32_t ASSETCHAINS_NONCESHIFT[] = {32,16};
fa7fdbc6 91uint32_t ASSETCHAINS_HASHESPERROUND[] = {1,0x10000};
42181656 92uint32_t ASSETCHAINS_ALGO = _ASSETCHAINS_EQUIHASH;
93
1f722359
MT
94// Verus proof of stake controls
95int32_t ASSETCHAINS_LWMAPOS = 0; // percentage of blocks should be PoS
dbe656fe 96int32_t VERUS_BLOCK_POSUNITS = 1024; // one block is 1000 units
1fae37f6 97int32_t VERUS_MIN_STAKEAGE = 150; // 1/2 this should also be a cap on the POS averaging window, or startup could be too easy
6e381b26 98int32_t VERUS_CONSECUTIVE_POS_THRESHOLD = 7; // this gives us 8 in a row
598ba98b 99int32_t VERUS_V2_CONSECUTIVE_POS_THRESHOLD = 5; // reduce to max 5 in a row
dbe656fe 100int32_t VERUS_NOPOS_THRESHHOLD = 150; // if we have no POS blocks in this many blocks, set to default difficulty
68b309c0
MT
101int32_t PBAAS_STARTBLOCK = 0; // the parent blockchain must be notarized at this value in block 1 for it to be accepted
102int32_t PBAAS_ENDBLOCK = 0; // end of life block for the PBaaS blockchain
1f722359 103
4b729ec5 104int32_t ASSETCHAINS_SAPLING;
105int32_t ASSETCHAINS_OVERWINTER;
106
94d3d09d 107uint64_t KOMODO_INTERESTSUM,KOMODO_WALLETBALANCE;
56fe75cb 108uint64_t ASSETCHAINS_COMMISSION, ASSETCHAINS_STAKED, ASSETCHAINS_SUPPLY = 10;
98f2e433 109
ab918767 110uint32_t KOMODO_INITDONE;
4d068367 111char KMDUSERPASS[8192],BTCUSERPASS[8192]; uint16_t KMD_PORT = 7771,BITCOIND_RPCPORT = 7771;
f846a857 112uint64_t PENDING_KOMODO_TX;
e28e0df9 113extern int32_t KOMODO_LOADINGBLOCKS;
9d657620 114unsigned int MAX_BLOCK_SIGOPS = 20000;
15d0fbd4 115
116struct komodo_kv *KOMODO_KV;
fb9c3652 117pthread_mutex_t KOMODO_KV_mutex,KOMODO_CC_mutex;
48d800c2 118
119#define MAX_CURRENCIES 32
120char CURRENCIES[][8] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies
121 "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK",
122 "KMD" };
123
124int32_t komodo_baseid(char *origbase)
125{
126 int32_t i; char base[64];
127 for (i=0; origbase[i]!=0&&i<sizeof(base); i++)
128 base[i] = toupper((int32_t)(origbase[i] & 0xff));
129 base[i] = 0;
130 for (i=0; i<=MAX_CURRENCIES; i++)
131 if ( strcmp(CURRENCIES[i],base) == 0 )
132 return(i);
133 //printf("illegal base.(%s) %s\n",origbase,base);
134 return(-1);
135}
136
137#ifndef SATOSHIDEN
138#define SATOSHIDEN ((uint64_t)100000000L)
139#endif
140int64_t komodo_current_supply(uint32_t nHeight)
141{
142 uint64_t cur_money;
143 int32_t baseid;
144
145 if ( (baseid = komodo_baseid(ASSETCHAINS_SYMBOL)) >= 0 && baseid < 32 )
e980a26d 146 cur_money = ASSETCHAINS_GENESISTXVAL + ASSETCHAINS_SUPPLY + nHeight * ASSETCHAINS_REWARD[0] / SATOSHIDEN;
48d800c2 147 else
148 {
149 // figure out max_money by adding up supply to a maximum of 10,000,000 blocks
761d2aa1 150 cur_money = (ASSETCHAINS_SUPPLY+1) + (ASSETCHAINS_MAGIC & 0xffffff) + ASSETCHAINS_GENESISTXVAL;
48d800c2 151 if ( ASSETCHAINS_LASTERA == 0 && ASSETCHAINS_REWARD[0] == 0 )
152 {
e980a26d 153 cur_money += (nHeight * 10000) / SATOSHIDEN;
48d800c2 154 }
155 else
156 {
157 for ( int j = 0; j <= ASSETCHAINS_LASTERA; j++ )
158 {
159 // if any condition means we have no more rewards, break
160 if (j != 0 && (nHeight <= ASSETCHAINS_ENDSUBSIDY[j - 1] || (ASSETCHAINS_ENDSUBSIDY[j - 1] == 0 &&
161 (ASSETCHAINS_REWARD[j] == 0 && (j == ASSETCHAINS_LASTERA || ASSETCHAINS_DECAY[j] != SATOSHIDEN)))))
162 break;
163
164 // add rewards from this era, up to nHeight
165 int64_t reward = ASSETCHAINS_REWARD[j];
166 if ( reward > 0 )
167 {
168 uint64_t lastEnd = j == 0 ? 0 : ASSETCHAINS_ENDSUBSIDY[j - 1];
169 uint64_t curEnd = ASSETCHAINS_ENDSUBSIDY[j] == 0 ? nHeight : nHeight > ASSETCHAINS_ENDSUBSIDY[j] ? ASSETCHAINS_ENDSUBSIDY[j] : nHeight;
170 uint64_t period = ASSETCHAINS_HALVING[j];
f8f61a6d 171 if (period == 0)
172 {
173 period = curEnd - lastEnd;
174 }
48d800c2 175 uint32_t nSteps = (curEnd - lastEnd) / period;
176 uint32_t modulo = (curEnd - lastEnd) % period;
177 uint64_t decay = ASSETCHAINS_DECAY[j];
178
179 // if exactly SATOSHIDEN, linear decay to zero or to next era, same as:
180 // (next_era_reward + (starting reward - next_era_reward) / 2) * num_blocks
181 if ( decay == SATOSHIDEN )
182 {
183 int64_t lowestSubsidy, subsidyDifference, stepDifference, stepTriangle;
184 int64_t denominator, modulo;
185 int32_t sign = 1;
186
187 if ( j == ASSETCHAINS_LASTERA )
188 {
189 subsidyDifference = reward;
190 lowestSubsidy = 0;
191 }
192 else
193 {
194 // Ex: -ac_eras=3 -ac_reward=0,384,24 -ac_end=1440,260640,0 -ac_halving=1,1440,2103840 -ac_decay 100000000,97750000,0
195 subsidyDifference = reward - ASSETCHAINS_REWARD[j + 1];
196 if (subsidyDifference < 0)
197 {
198 sign = -1;
199 subsidyDifference *= sign;
200 lowestSubsidy = reward;
201 }
202 else
203 {
204 lowestSubsidy = ASSETCHAINS_REWARD[j + 1];
205 }
206 }
207
208 // if we have not finished the current era, we need to caluclate a total as if we are at the end, with the current
209 // subsidy. we will calculate the total of a linear era as follows. Each item represents an area calculation:
210 // a) the rectangle from 0 to the lowest reward in the era * the number of blocks
211 // b) the rectangle of the remainder of blocks from the lowest point of the era to the highest point of the era if any remainder
212 // c) the minor triangle from the start of transition from the lowest point to the start of transition to the highest point
213 // d) one halving triangle (half area of one full step)
214 //
215 // we also need:
216 // e) number of steps = (n - erastart) / halving interval
217 //
218 // the total supply from era start up to height is:
219 // a + b + c + (d * e)
220
221 // calculate amount in one step's triangular protrusion over minor triangle's hypotenuse
222 denominator = nSteps * period;
223
224 // difference of one step vs. total
225 stepDifference = (period * subsidyDifference) / denominator;
226
227 // area == coin holding of one step triangle, protruding from minor triangle's hypotenuse
228 stepTriangle = (period * stepDifference) >> 1;
229
230 // sign is negative if slope is positive (start is less than end)
231 if (sign < 0)
232 {
233 // use steps minus one for our calculations, and add the potentially partial rectangle
234 // at the end
235 cur_money += stepTriangle * (nSteps - 1);
236 cur_money += stepTriangle * (nSteps - 1) * (nSteps - 1);
237
238 // difference times number of steps is height of rectangle above lowest subsidy
239 cur_money += modulo * stepDifference * nSteps;
240 }
241 else
242 {
243 // if negative slope, the minor triangle is the full number of steps, as the highest
244 // level step is full. lowest subsidy is just the lowest so far
245 lowestSubsidy = reward - (stepDifference * nSteps);
246
247 // add the step triangles, one per step
248 cur_money += stepTriangle * nSteps;
249
250 // add the minor triangle
251 cur_money += stepTriangle * nSteps * nSteps;
252 }
253
254 // add more for the base rectangle if lowest subsidy is not 0
255 cur_money += lowestSubsidy * (curEnd - lastEnd);
256 }
257 else
258 {
f8f61a6d 259 if (period == 0)
260 {
261
262 }
263 else
264 {
265 /* code */
266 }
267
48d800c2 268 for ( int k = lastEnd; k < curEnd; k += period )
269 {
270 cur_money += period * reward;
271 // if zero, we do straight halving
272 reward = decay ? (reward * decay) / SATOSHIDEN : reward >> 1;
273 }
274 cur_money += modulo * reward;
275 }
276 }
277 }
278 }
279 }
280 return((int64_t)(cur_money + (cur_money * ASSETCHAINS_COMMISSION) / SATOSHIDEN));
281}
282
This page took 0.365644 seconds and 4 git commands to generate.