]>
Commit | Line | Data |
---|---|---|
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 | 18 | void komodo_prefetch(FILE *fp); |
709a9861 | 19 | uint32_t komodo_heightstamp(int32_t height); |
c88fa588 | 20 | void 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 | 21 | void komodo_init(int32_t height); |
51dab149 | 22 | int32_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 | 23 | int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp); |
0ded57c8 | 24 | char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port); |
cf0ace4a | 25 | void komodo_init(int32_t height); |
8683bd8d | 26 | int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp); |
48a3cd18 | 27 | int32_t komodo_isrealtime(int32_t *kmdheightp); |
b4116bb6 | 28 | uint64_t komodo_paxtotal(); |
439e76ae | 29 | int32_t komodo_longestchain(); |
afacf361 | 30 | uint64_t komodo_maxallowed(int32_t baseid); |
c2123afe | 31 | int32_t komodo_bannedset(int32_t *indallvoutsp,uint256 *array,int32_t max); |
cf0ace4a | 32 | |
3face669 | 33 | pthread_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 | 38 | struct pax_transaction *PAX; |
39 | int32_t NUM_PRICES; uint32_t *PVALS; | |
40 | struct knotaries_entry *Pubkeys; | |
0db8cd28 | 41 | |
2d116f01 | 42 | struct komodo_state KOMODO_STATES[34]; |
0db8cd28 | 43 | |
7e2cbee1 | 44 | #define _COINBASE_MATURITY 100 |
7a90b9dd | 45 | int COINBASE_MATURITY = _COINBASE_MATURITY;//100; |
1290fc05 | 46 | |
c8d6a51c | 47 | int32_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 | 48 | int32_t KOMODO_INSYNC,KOMODO_LASTMINED,prevKOMODO_LASTMINED,KOMODO_CCACTIVATE,JUMBLR_PAUSE = 1; |
6e62f837 | 49 | std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY; |
36f9e6d6 | 50 | uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE; |
5f63373e | 51 | bool VERUS_MINTBLOCKS; |
98f2e433 | 52 | |
7af5cf39 | 53 | char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN], ASSETCHAINS_USERPASS[4096]; |
b2a98c42 MT |
54 | |
55 | bool PBAAS_TESTMODE; | |
56 | std::string PBAAS_HOST; | |
57 | int32_t PBAAS_PORT; | |
58 | std::string PBAAS_USERPASS; | |
7af5cf39 | 59 | std::string ASSETCHAINS_RPCHOST, ASSETCHAINS_RPCCREDENTIALS; |
b2a98c42 MT |
60 | |
61 | uint160 ASSETCHAINS_CHAINID; | |
62 | uint160 VERUS_CHAINID; | |
7c8e5e18 | 63 | std::string VERUS_CHAINNAME = "VRSC"; |
346d96b9 | 64 | uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT; |
6d2fc290 | 65 | uint32_t ASSETCHAIN_INIT,ASSETCHAINS_CC,KOMODO_STOPAT; |
98f2e433 | 66 | uint32_t ASSETCHAINS_MAGIC = 2387029918; |
a0dd01bc | 67 | int64_t ASSETCHAINS_GENESISTXVAL = 5000000000; |
36647d52 | 68 | |
9feb4b9e | 69 | int64_t MAX_MONEY = 200000000 * 100000000LL; |
c8c684e9 | 70 | int64_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 | 78 | uint64_t ASSETCHAINS_TIMELOCKGTE = _ASSETCHAINS_TIMELOCKOFF, ASSETCHAINS_TIMEUNLOCKFROM = 0, ASSETCHAINS_TIMEUNLOCKTO = 0; |
d121e75b | 79 | |
6b78e01d | 80 | uint32_t ASSETCHAINS_LASTERA = 1; |
26a8d194 | 81 | uint64_t ASSETCHAINS_ENDSUBSIDY[ASSETCHAINS_MAX_ERAS],ASSETCHAINS_REWARD[ASSETCHAINS_MAX_ERAS],ASSETCHAINS_HALVING[ASSETCHAINS_MAX_ERAS],ASSETCHAINS_DECAY[ASSETCHAINS_MAX_ERAS]; |
d7bbd546 | 82 | uint64_t ASSETCHAINS_ERAOPTIONS[ASSETCHAINS_MAX_ERAS]; |
98f2e433 | 83 | |
42181656 | 84 | #define _ASSETCHAINS_EQUIHASH 0 |
85 | uint32_t ASSETCHAINS_NUMALGOS = 2; | |
86 | uint32_t ASSETCHAINS_EQUIHASH = _ASSETCHAINS_EQUIHASH; | |
87 | uint32_t ASSETCHAINS_VERUSHASH = 1; | |
88 | const char *ASSETCHAINS_ALGORITHMS[] = {"equihash", "verushash"}; | |
4dcb64c0 MT |
89 | uint64_t ASSETCHAINS_NONCEMASK[] = {0xffff,0xfffffff}; |
90 | uint32_t ASSETCHAINS_NONCESHIFT[] = {32,16}; | |
fa7fdbc6 | 91 | uint32_t ASSETCHAINS_HASHESPERROUND[] = {1,0x10000}; |
42181656 | 92 | uint32_t ASSETCHAINS_ALGO = _ASSETCHAINS_EQUIHASH; |
93 | ||
1f722359 MT |
94 | // Verus proof of stake controls |
95 | int32_t ASSETCHAINS_LWMAPOS = 0; // percentage of blocks should be PoS | |
dbe656fe | 96 | int32_t VERUS_BLOCK_POSUNITS = 1024; // one block is 1000 units |
1fae37f6 | 97 | int32_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 | 98 | int32_t VERUS_CONSECUTIVE_POS_THRESHOLD = 7; // this gives us 8 in a row |
598ba98b | 99 | int32_t VERUS_V2_CONSECUTIVE_POS_THRESHOLD = 5; // reduce to max 5 in a row |
dbe656fe | 100 | int32_t VERUS_NOPOS_THRESHHOLD = 150; // if we have no POS blocks in this many blocks, set to default difficulty |
68b309c0 MT |
101 | int32_t PBAAS_STARTBLOCK = 0; // the parent blockchain must be notarized at this value in block 1 for it to be accepted |
102 | int32_t PBAAS_ENDBLOCK = 0; // end of life block for the PBaaS blockchain | |
1f722359 | 103 | |
4b729ec5 | 104 | int32_t ASSETCHAINS_SAPLING; |
105 | int32_t ASSETCHAINS_OVERWINTER; | |
106 | ||
94d3d09d | 107 | uint64_t KOMODO_INTERESTSUM,KOMODO_WALLETBALANCE; |
56fe75cb | 108 | uint64_t ASSETCHAINS_COMMISSION, ASSETCHAINS_STAKED, ASSETCHAINS_SUPPLY = 10; |
98f2e433 | 109 | |
ab918767 | 110 | uint32_t KOMODO_INITDONE; |
4d068367 | 111 | char KMDUSERPASS[8192],BTCUSERPASS[8192]; uint16_t KMD_PORT = 7771,BITCOIND_RPCPORT = 7771; |
f846a857 | 112 | uint64_t PENDING_KOMODO_TX; |
e28e0df9 | 113 | extern int32_t KOMODO_LOADINGBLOCKS; |
9d657620 | 114 | unsigned int MAX_BLOCK_SIGOPS = 20000; |
15d0fbd4 | 115 | |
116 | struct komodo_kv *KOMODO_KV; | |
fb9c3652 | 117 | pthread_mutex_t KOMODO_KV_mutex,KOMODO_CC_mutex; |
48d800c2 | 118 | |
119 | #define MAX_CURRENCIES 32 | |
120 | char 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 | ||
124 | int32_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 | |
140 | int64_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 |