]> Git Repo - VerusCoin.git/blame - src/komodo_utils.h
test
[VerusCoin.git] / src / komodo_utils.h
CommitLineData
d019c447 1/******************************************************************************
2 * Copyright © 2014-2016 The SuperNET Developers. *
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 ******************************************************************************/
3eea72f2 15
453e1052 16#define SATOSHIDEN ((uint64_t)100000000L)
32b1b443 17#define dstr(x) ((double)(x) / SATOSHIDEN)
b67b154f 18#define portable_mutex_t pthread_mutex_t
19#define portable_mutex_init(ptr) pthread_mutex_init(ptr,NULL)
20#define portable_mutex_lock pthread_mutex_lock
21#define portable_mutex_unlock pthread_mutex_unlock
32b1b443 22
2552dbb4 23struct allocitem { uint32_t allocsize,type; };
0a912c89 24struct queueitem { struct queueitem *next,*prev; uint32_t allocsize,type; };
25
a18fbdc5 26typedef struct queue
27{
28 struct queueitem *list;
0a912c89 29 pthread_mutex_t mutex;
a18fbdc5 30 char name[64],initflag;
31} queue_t;
32
48fa27d9 33union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; };
34typedef union _bits256 bits256;
35
d019c447 36#include "mini-gmp.c"
3eea72f2 37
38#define CRYPTO777_PUBSECPSTR "020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9"
b62d7030 39#define CRYPTO777_KMDADDR "RXL3YXG2ceaB6C5hfJcN4fvmLH2C34knhA"
878412df 40#define CRYPTO777_RMD160STR "f1dce4182fce875748c4986b240ff7d7bc3fffb0"
b62d7030 41
d019c447 42#define KOMODO_PUBTYPE 60
43
d019c447 44struct sha256_vstate { uint64_t length; uint32_t state[8],curlen; uint8_t buf[64]; };
45struct rmd160_vstate { uint64_t length; uint8_t buf[64]; uint32_t curlen, state[5]; };
46
47// following is ported from libtom
48
49#define STORE32L(x, y) \
50{ (y)[3] = (uint8_t)(((x)>>24)&255); (y)[2] = (uint8_t)(((x)>>16)&255); \
51(y)[1] = (uint8_t)(((x)>>8)&255); (y)[0] = (uint8_t)((x)&255); }
52
53#define LOAD32L(x, y) \
54{ x = (uint32_t)(((uint64_t)((y)[3] & 255)<<24) | \
55((uint32_t)((y)[2] & 255)<<16) | \
56((uint32_t)((y)[1] & 255)<<8) | \
57((uint32_t)((y)[0] & 255))); }
58
59#define STORE64L(x, y) \
60{ (y)[7] = (uint8_t)(((x)>>56)&255); (y)[6] = (uint8_t)(((x)>>48)&255); \
61(y)[5] = (uint8_t)(((x)>>40)&255); (y)[4] = (uint8_t)(((x)>>32)&255); \
62(y)[3] = (uint8_t)(((x)>>24)&255); (y)[2] = (uint8_t)(((x)>>16)&255); \
63(y)[1] = (uint8_t)(((x)>>8)&255); (y)[0] = (uint8_t)((x)&255); }
64
65#define LOAD64L(x, y) \
66{ x = (((uint64_t)((y)[7] & 255))<<56)|(((uint64_t)((y)[6] & 255))<<48)| \
67(((uint64_t)((y)[5] & 255))<<40)|(((uint64_t)((y)[4] & 255))<<32)| \
68(((uint64_t)((y)[3] & 255))<<24)|(((uint64_t)((y)[2] & 255))<<16)| \
69(((uint64_t)((y)[1] & 255))<<8)|(((uint64_t)((y)[0] & 255))); }
70
71#define STORE32H(x, y) \
72{ (y)[0] = (uint8_t)(((x)>>24)&255); (y)[1] = (uint8_t)(((x)>>16)&255); \
73(y)[2] = (uint8_t)(((x)>>8)&255); (y)[3] = (uint8_t)((x)&255); }
74
75#define LOAD32H(x, y) \
76{ x = (uint32_t)(((uint64_t)((y)[0] & 255)<<24) | \
77((uint32_t)((y)[1] & 255)<<16) | \
78((uint32_t)((y)[2] & 255)<<8) | \
79((uint32_t)((y)[3] & 255))); }
80
81#define STORE64H(x, y) \
82{ (y)[0] = (uint8_t)(((x)>>56)&255); (y)[1] = (uint8_t)(((x)>>48)&255); \
83(y)[2] = (uint8_t)(((x)>>40)&255); (y)[3] = (uint8_t)(((x)>>32)&255); \
84(y)[4] = (uint8_t)(((x)>>24)&255); (y)[5] = (uint8_t)(((x)>>16)&255); \
85(y)[6] = (uint8_t)(((x)>>8)&255); (y)[7] = (uint8_t)((x)&255); }
86
87#define LOAD64H(x, y) \
88{ x = (((uint64_t)((y)[0] & 255))<<56)|(((uint64_t)((y)[1] & 255))<<48) | \
89(((uint64_t)((y)[2] & 255))<<40)|(((uint64_t)((y)[3] & 255))<<32) | \
90(((uint64_t)((y)[4] & 255))<<24)|(((uint64_t)((y)[5] & 255))<<16) | \
91(((uint64_t)((y)[6] & 255))<<8)|(((uint64_t)((y)[7] & 255))); }
92
93// Various logical functions
94#define RORc(x, y) ( ((((uint32_t)(x)&0xFFFFFFFFUL)>>(uint32_t)((y)&31)) | ((uint32_t)(x)<<(uint32_t)(32-((y)&31)))) & 0xFFFFFFFFUL)
95#define Ch(x,y,z) (z ^ (x & (y ^ z)))
96#define Maj(x,y,z) (((x | y) & z) | (x & y))
97#define S(x, n) RORc((x),(n))
98#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
99#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
100#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
101#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
102#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
103#define MIN(x, y) ( ((x)<(y))?(x):(y) )
104
105static inline int32_t sha256_vcompress(struct sha256_vstate * md,uint8_t *buf)
106{
107 uint32_t S[8],W[64],t0,t1,i;
108 for (i=0; i<8; i++) // copy state into S
109 S[i] = md->state[i];
110 for (i=0; i<16; i++) // copy the state into 512-bits into W[0..15]
111 LOAD32H(W[i],buf + (4*i));
112 for (i=16; i<64; i++) // fill W[16..63]
113 W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
114
115#define RND(a,b,c,d,e,f,g,h,i,ki) \
116t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \
117t1 = Sigma0(a) + Maj(a, b, c); \
118d += t0; \
119h = t0 + t1;
120
121 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98);
122 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491);
123 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf);
124 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5);
125 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b);
126 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1);
127 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4);
128 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5);
129 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98);
130 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01);
131 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be);
132 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3);
133 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74);
134 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe);
135 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7);
136 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174);
137 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1);
138 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786);
139 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6);
140 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc);
141 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f);
142 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa);
143 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc);
144 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da);
145 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152);
146 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d);
147 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8);
148 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7);
149 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3);
150 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147);
151 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351);
152 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967);
153 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85);
154 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138);
155 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc);
156 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13);
157 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354);
158 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb);
159 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e);
160 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85);
161 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1);
162 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b);
163 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70);
164 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3);
165 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819);
166 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624);
167 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585);
168 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070);
169 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116);
170 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08);
171 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c);
172 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5);
173 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3);
174 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a);
175 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f);
176 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3);
177 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee);
178 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f);
179 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814);
180 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208);
181 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa);
182 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb);
183 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7);
184 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2);
185#undef RND
186 for (i=0; i<8; i++) // feedback
187 md->state[i] = md->state[i] + S[i];
188 return(0);
189}
190
191#undef RORc
192#undef Ch
193#undef Maj
194#undef S
195#undef R
196#undef Sigma0
197#undef Sigma1
198#undef Gamma0
199#undef Gamma1
200
201static inline void sha256_vinit(struct sha256_vstate * md)
202{
203 md->curlen = 0;
204 md->length = 0;
205 md->state[0] = 0x6A09E667UL;
206 md->state[1] = 0xBB67AE85UL;
207 md->state[2] = 0x3C6EF372UL;
208 md->state[3] = 0xA54FF53AUL;
209 md->state[4] = 0x510E527FUL;
210 md->state[5] = 0x9B05688CUL;
211 md->state[6] = 0x1F83D9ABUL;
212 md->state[7] = 0x5BE0CD19UL;
213}
214
215static inline int32_t sha256_vprocess(struct sha256_vstate *md,const uint8_t *in,uint64_t inlen)
216{
217 uint64_t n; int32_t err;
218 if ( md->curlen > sizeof(md->buf) )
219 return(-1);
220 while ( inlen > 0 )
221 {
222 if ( md->curlen == 0 && inlen >= 64 )
223 {
224 if ( (err= sha256_vcompress(md,(uint8_t *)in)) != 0 )
225 return(err);
226 md->length += 64 * 8, in += 64, inlen -= 64;
227 }
228 else
229 {
230 n = MIN(inlen,64 - md->curlen);
231 memcpy(md->buf + md->curlen,in,(size_t)n);
232 md->curlen += n, in += n, inlen -= n;
233 if ( md->curlen == 64 )
234 {
235 if ( (err= sha256_vcompress(md,md->buf)) != 0 )
236 return(err);
237 md->length += 8*64;
238 md->curlen = 0;
239 }
240 }
241 }
242 return(0);
243}
244
245static inline int32_t sha256_vdone(struct sha256_vstate *md,uint8_t *out)
246{
247 int32_t i;
248 if ( md->curlen >= sizeof(md->buf) )
249 return(-1);
250 md->length += md->curlen * 8; // increase the length of the message
251 md->buf[md->curlen++] = (uint8_t)0x80; // append the '1' bit
252 // if len > 56 bytes we append zeros then compress. Then we can fall back to padding zeros and length encoding like normal.
253 if ( md->curlen > 56 )
254 {
255 while ( md->curlen < 64 )
256 md->buf[md->curlen++] = (uint8_t)0;
257 sha256_vcompress(md,md->buf);
258 md->curlen = 0;
259 }
260 while ( md->curlen < 56 ) // pad upto 56 bytes of zeroes
261 md->buf[md->curlen++] = (uint8_t)0;
262 STORE64H(md->length,md->buf+56); // store length
263 sha256_vcompress(md,md->buf);
264 for (i=0; i<8; i++) // copy output
265 STORE32H(md->state[i],out+(4*i));
266 return(0);
267}
268
269void vcalc_sha256(char deprecated[(256 >> 3) * 2 + 1],uint8_t hash[256 >> 3],uint8_t *src,int32_t len)
270{
271 struct sha256_vstate md;
272 sha256_vinit(&md);
273 sha256_vprocess(&md,src,len);
274 sha256_vdone(&md,hash);
275}
276
277bits256 bits256_doublesha256(char *deprecated,uint8_t *data,int32_t datalen)
278{
279 bits256 hash,hash2; int32_t i;
280 vcalc_sha256(0,hash.bytes,data,datalen);
281 vcalc_sha256(0,hash2.bytes,hash.bytes,sizeof(hash));
282 for (i=0; i<sizeof(hash); i++)
283 hash.bytes[i] = hash2.bytes[sizeof(hash) - 1 - i];
284 return(hash);
285}
286
287// rmd160: the five basic functions F(), G() and H()
288#define F(x, y, z) ((x) ^ (y) ^ (z))
289#define G(x, y, z) (((x) & (y)) | (~(x) & (z)))
290#define H(x, y, z) (((x) | ~(y)) ^ (z))
291#define I(x, y, z) (((x) & (z)) | ((y) & ~(z)))
292#define J(x, y, z) ((x) ^ ((y) | ~(z)))
293#define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
294
295/* the ten basic operations FF() through III() */
296#define FF(a, b, c, d, e, x, s) \
297(a) += F((b), (c), (d)) + (x);\
298(a) = ROLc((a), (s)) + (e);\
299(c) = ROLc((c), 10);
300
301#define GG(a, b, c, d, e, x, s) \
302(a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
303(a) = ROLc((a), (s)) + (e);\
304(c) = ROLc((c), 10);
305
306#define HH(a, b, c, d, e, x, s) \
307(a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
308(a) = ROLc((a), (s)) + (e);\
309(c) = ROLc((c), 10);
310
311#define II(a, b, c, d, e, x, s) \
312(a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
313(a) = ROLc((a), (s)) + (e);\
314(c) = ROLc((c), 10);
315
316#define JJ(a, b, c, d, e, x, s) \
317(a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL;\
318(a) = ROLc((a), (s)) + (e);\
319(c) = ROLc((c), 10);
320
321#define FFF(a, b, c, d, e, x, s) \
322(a) += F((b), (c), (d)) + (x);\
323(a) = ROLc((a), (s)) + (e);\
324(c) = ROLc((c), 10);
325
326#define GGG(a, b, c, d, e, x, s) \
327(a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\
328(a) = ROLc((a), (s)) + (e);\
329(c) = ROLc((c), 10);
330
331#define HHH(a, b, c, d, e, x, s) \
332(a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL;\
333(a) = ROLc((a), (s)) + (e);\
334(c) = ROLc((c), 10);
335
336#define III(a, b, c, d, e, x, s) \
337(a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL;\
338(a) = ROLc((a), (s)) + (e);\
339(c) = ROLc((c), 10);
340
341#define JJJ(a, b, c, d, e, x, s) \
342(a) += J((b), (c), (d)) + (x) + 0x50a28be6UL;\
343(a) = ROLc((a), (s)) + (e);\
344(c) = ROLc((c), 10);
345
346static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
347{
348 uint32_t aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16];
349 int i;
350
351 /* load words X */
352 for (i = 0; i < 16; i++){
353 LOAD32L(X[i], buf + (4 * i));
354 }
355
356 /* load state */
357 aa = aaa = md->state[0];
358 bb = bbb = md->state[1];
359 cc = ccc = md->state[2];
360 dd = ddd = md->state[3];
361 ee = eee = md->state[4];
362
363 /* round 1 */
364 FF(aa, bb, cc, dd, ee, X[ 0], 11);
365 FF(ee, aa, bb, cc, dd, X[ 1], 14);
366 FF(dd, ee, aa, bb, cc, X[ 2], 15);
367 FF(cc, dd, ee, aa, bb, X[ 3], 12);
368 FF(bb, cc, dd, ee, aa, X[ 4], 5);
369 FF(aa, bb, cc, dd, ee, X[ 5], 8);
370 FF(ee, aa, bb, cc, dd, X[ 6], 7);
371 FF(dd, ee, aa, bb, cc, X[ 7], 9);
372 FF(cc, dd, ee, aa, bb, X[ 8], 11);
373 FF(bb, cc, dd, ee, aa, X[ 9], 13);
374 FF(aa, bb, cc, dd, ee, X[10], 14);
375 FF(ee, aa, bb, cc, dd, X[11], 15);
376 FF(dd, ee, aa, bb, cc, X[12], 6);
377 FF(cc, dd, ee, aa, bb, X[13], 7);
378 FF(bb, cc, dd, ee, aa, X[14], 9);
379 FF(aa, bb, cc, dd, ee, X[15], 8);
380
381 /* round 2 */
382 GG(ee, aa, bb, cc, dd, X[ 7], 7);
383 GG(dd, ee, aa, bb, cc, X[ 4], 6);
384 GG(cc, dd, ee, aa, bb, X[13], 8);
385 GG(bb, cc, dd, ee, aa, X[ 1], 13);
386 GG(aa, bb, cc, dd, ee, X[10], 11);
387 GG(ee, aa, bb, cc, dd, X[ 6], 9);
388 GG(dd, ee, aa, bb, cc, X[15], 7);
389 GG(cc, dd, ee, aa, bb, X[ 3], 15);
390 GG(bb, cc, dd, ee, aa, X[12], 7);
391 GG(aa, bb, cc, dd, ee, X[ 0], 12);
392 GG(ee, aa, bb, cc, dd, X[ 9], 15);
393 GG(dd, ee, aa, bb, cc, X[ 5], 9);
394 GG(cc, dd, ee, aa, bb, X[ 2], 11);
395 GG(bb, cc, dd, ee, aa, X[14], 7);
396 GG(aa, bb, cc, dd, ee, X[11], 13);
397 GG(ee, aa, bb, cc, dd, X[ 8], 12);
398
399 /* round 3 */
400 HH(dd, ee, aa, bb, cc, X[ 3], 11);
401 HH(cc, dd, ee, aa, bb, X[10], 13);
402 HH(bb, cc, dd, ee, aa, X[14], 6);
403 HH(aa, bb, cc, dd, ee, X[ 4], 7);
404 HH(ee, aa, bb, cc, dd, X[ 9], 14);
405 HH(dd, ee, aa, bb, cc, X[15], 9);
406 HH(cc, dd, ee, aa, bb, X[ 8], 13);
407 HH(bb, cc, dd, ee, aa, X[ 1], 15);
408 HH(aa, bb, cc, dd, ee, X[ 2], 14);
409 HH(ee, aa, bb, cc, dd, X[ 7], 8);
410 HH(dd, ee, aa, bb, cc, X[ 0], 13);
411 HH(cc, dd, ee, aa, bb, X[ 6], 6);
412 HH(bb, cc, dd, ee, aa, X[13], 5);
413 HH(aa, bb, cc, dd, ee, X[11], 12);
414 HH(ee, aa, bb, cc, dd, X[ 5], 7);
415 HH(dd, ee, aa, bb, cc, X[12], 5);
416
417 /* round 4 */
418 II(cc, dd, ee, aa, bb, X[ 1], 11);
419 II(bb, cc, dd, ee, aa, X[ 9], 12);
420 II(aa, bb, cc, dd, ee, X[11], 14);
421 II(ee, aa, bb, cc, dd, X[10], 15);
422 II(dd, ee, aa, bb, cc, X[ 0], 14);
423 II(cc, dd, ee, aa, bb, X[ 8], 15);
424 II(bb, cc, dd, ee, aa, X[12], 9);
425 II(aa, bb, cc, dd, ee, X[ 4], 8);
426 II(ee, aa, bb, cc, dd, X[13], 9);
427 II(dd, ee, aa, bb, cc, X[ 3], 14);
428 II(cc, dd, ee, aa, bb, X[ 7], 5);
429 II(bb, cc, dd, ee, aa, X[15], 6);
430 II(aa, bb, cc, dd, ee, X[14], 8);
431 II(ee, aa, bb, cc, dd, X[ 5], 6);
432 II(dd, ee, aa, bb, cc, X[ 6], 5);
433 II(cc, dd, ee, aa, bb, X[ 2], 12);
434
435 /* round 5 */
436 JJ(bb, cc, dd, ee, aa, X[ 4], 9);
437 JJ(aa, bb, cc, dd, ee, X[ 0], 15);
438 JJ(ee, aa, bb, cc, dd, X[ 5], 5);
439 JJ(dd, ee, aa, bb, cc, X[ 9], 11);
440 JJ(cc, dd, ee, aa, bb, X[ 7], 6);
441 JJ(bb, cc, dd, ee, aa, X[12], 8);
442 JJ(aa, bb, cc, dd, ee, X[ 2], 13);
443 JJ(ee, aa, bb, cc, dd, X[10], 12);
444 JJ(dd, ee, aa, bb, cc, X[14], 5);
445 JJ(cc, dd, ee, aa, bb, X[ 1], 12);
446 JJ(bb, cc, dd, ee, aa, X[ 3], 13);
447 JJ(aa, bb, cc, dd, ee, X[ 8], 14);
448 JJ(ee, aa, bb, cc, dd, X[11], 11);
449 JJ(dd, ee, aa, bb, cc, X[ 6], 8);
450 JJ(cc, dd, ee, aa, bb, X[15], 5);
451 JJ(bb, cc, dd, ee, aa, X[13], 6);
452
453 /* parallel round 1 */
454 JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
455 JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
456 JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9);
457 JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
458 JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
459 JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
460 JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
461 JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5);
462 JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7);
463 JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7);
464 JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8);
465 JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
466 JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
467 JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
468 JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
469 JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
470
471 /* parallel round 2 */
472 III(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
473 III(ddd, eee, aaa, bbb, ccc, X[11], 13);
474 III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
475 III(bbb, ccc, ddd, eee, aaa, X[ 7], 7);
476 III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
477 III(eee, aaa, bbb, ccc, ddd, X[13], 8);
478 III(ddd, eee, aaa, bbb, ccc, X[ 5], 9);
479 III(ccc, ddd, eee, aaa, bbb, X[10], 11);
480 III(bbb, ccc, ddd, eee, aaa, X[14], 7);
481 III(aaa, bbb, ccc, ddd, eee, X[15], 7);
482 III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
483 III(ddd, eee, aaa, bbb, ccc, X[12], 7);
484 III(ccc, ddd, eee, aaa, bbb, X[ 4], 6);
485 III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
486 III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
487 III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
488
489 /* parallel round 3 */
490 HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
491 HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
492 HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
493 HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
494 HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8);
495 HHH(ddd, eee, aaa, bbb, ccc, X[14], 6);
496 HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6);
497 HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
498 HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
499 HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
500 HHH(ddd, eee, aaa, bbb, ccc, X[12], 5);
501 HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
502 HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
503 HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
504 HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
505 HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
506
507 /* parallel round 4 */
508 GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
509 GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
510 GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8);
511 GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
512 GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
513 GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
514 GGG(bbb, ccc, ddd, eee, aaa, X[15], 6);
515 GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
516 GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6);
517 GGG(ddd, eee, aaa, bbb, ccc, X[12], 9);
518 GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
519 GGG(bbb, ccc, ddd, eee, aaa, X[13], 9);
520 GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
521 GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
522 GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
523 GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
524
525 /* parallel round 5 */
526 FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8);
527 FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5);
528 FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
529 FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9);
530 FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
531 FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5);
532 FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
533 FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6);
534 FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8);
535 FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
536 FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6);
537 FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5);
538 FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
539 FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
540 FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
541 FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
542
543 /* combine results */
544 ddd += cc + md->state[1]; /* final result for md->state[0] */
545 md->state[1] = md->state[2] + dd + eee;
546 md->state[2] = md->state[3] + ee + aaa;
547 md->state[3] = md->state[4] + aa + bbb;
548 md->state[4] = md->state[0] + bb + ccc;
549 md->state[0] = ddd;
550
551 return 0;
552}
553
554/**
555 Initialize the hash state
556 @param md The hash state you wish to initialize
557 @return 0 if successful
558 */
559int rmd160_vinit(struct rmd160_vstate * md)
560{
561 md->state[0] = 0x67452301UL;
562 md->state[1] = 0xefcdab89UL;
563 md->state[2] = 0x98badcfeUL;
564 md->state[3] = 0x10325476UL;
565 md->state[4] = 0xc3d2e1f0UL;
566 md->curlen = 0;
567 md->length = 0;
568 return 0;
569}
570#define HASH_PROCESS(func_name, compress_name, state_var, block_size) \
571int func_name (struct rmd160_vstate * md, const unsigned char *in, unsigned long inlen) \
572{ \
573unsigned long n; \
574int err; \
575if (md->curlen > sizeof(md->buf)) { \
576return -1; \
577} \
578while (inlen > 0) { \
579if (md->curlen == 0 && inlen >= block_size) { \
580if ((err = compress_name (md, (unsigned char *)in)) != 0) { \
581return err; \
582} \
583md->length += block_size * 8; \
584in += block_size; \
585inlen -= block_size; \
586} else { \
587n = MIN(inlen, (block_size - md->curlen)); \
588memcpy(md->buf + md->curlen, in, (size_t)n); \
589md->curlen += n; \
590in += n; \
591inlen -= n; \
592if (md->curlen == block_size) { \
593if ((err = compress_name (md, md->buf)) != 0) { \
594return err; \
595} \
596md->length += 8*block_size; \
597md->curlen = 0; \
598} \
599} \
600} \
601return 0; \
602}
603
604/**
605 Process a block of memory though the hash
606 @param md The hash state
607 @param in The data to hash
608 @param inlen The length of the data (octets)
609 @return 0 if successful
610 */
611HASH_PROCESS(rmd160_vprocess, rmd160_vcompress, rmd160, 64)
612
613/**
614 Terminate the hash to get the digest
615 @param md The hash state
616 @param out [out] The destination of the hash (20 bytes)
617 @return 0 if successful
618 */
619int rmd160_vdone(struct rmd160_vstate * md, unsigned char *out)
620{
621 int i;
622 if (md->curlen >= sizeof(md->buf)) {
623 return -1;
624 }
625 /* increase the length of the message */
626 md->length += md->curlen * 8;
627
628 /* append the '1' bit */
629 md->buf[md->curlen++] = (unsigned char)0x80;
630
631 /* if the length is currently above 56 bytes we append zeros
632 * then compress. Then we can fall back to padding zeros and length
633 * encoding like normal.
634 */
635 if (md->curlen > 56) {
636 while (md->curlen < 64) {
637 md->buf[md->curlen++] = (unsigned char)0;
638 }
639 rmd160_vcompress(md, md->buf);
640 md->curlen = 0;
641 }
642 /* pad upto 56 bytes of zeroes */
643 while (md->curlen < 56) {
644 md->buf[md->curlen++] = (unsigned char)0;
645 }
646 /* store length */
647 STORE64L(md->length, md->buf+56);
648 rmd160_vcompress(md, md->buf);
649 /* copy output */
650 for (i = 0; i < 5; i++) {
651 STORE32L(md->state[i], out+(4*i));
652 }
653 return 0;
654}
655
656void calc_rmd160(char deprecated[41],uint8_t buf[20],uint8_t *msg,int32_t len)
657{
658 struct rmd160_vstate md;
659 rmd160_vinit(&md);
660 rmd160_vprocess(&md,msg,len);
661 rmd160_vdone(&md, buf);
662}
3eea72f2 663
1e81ccb7 664static const uint32_t crc32_tab[] = {
665 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
666 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
667 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
668 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
669 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
670 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
671 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
672 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
673 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
674 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
675 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
676 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
677 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
678 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
679 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
680 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
681 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
682 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
683 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
684 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
685 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
686 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
687 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
688 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
689 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
690 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
691 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
692 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
693 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
694 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
695 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
696 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
697 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
698 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
699 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
700 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
701 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
702 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
703 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
704 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
705 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
706 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
707 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
708};
709
710uint32_t calc_crc32(uint32_t crc,const void *buf,size_t size)
711{
712 const uint8_t *p;
713
714 p = (const uint8_t *)buf;
715 crc = crc ^ ~0U;
716
717 while (size--)
718 crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
719
720 return crc ^ ~0U;
721}
722
d019c447 723void calc_rmd160_sha256(uint8_t rmd160[20],uint8_t *data,int32_t datalen)
724{
725 bits256 hash;
726 vcalc_sha256(0,hash.bytes,data,datalen);
727 calc_rmd160(0,rmd160,hash.bytes,sizeof(hash));
728}
729
730int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr)
731{
732 bits256 hash; uint8_t *buf,_buf[25]; int32_t len;
733 memset(rmd160,0,20);
734 *addrtypep = 0;
735 buf = _buf;
736 if ( (len= bitcoin_base58decode(buf,coinaddr)) >= 4 )
737 {
738 // validate with trailing hash, then remove hash
739 hash = bits256_doublesha256(0,buf,21);
740 *addrtypep = *buf;
741 memcpy(rmd160,buf+1,20);
742 if ( (buf[21]&0xff) == hash.bytes[31] && (buf[22]&0xff) == hash.bytes[30] &&(buf[23]&0xff) == hash.bytes[29] && (buf[24]&0xff) == hash.bytes[28] )
743 {
744 //printf("coinaddr.(%s) valid checksum addrtype.%02x\n",coinaddr,*addrtypep);
745 return(20);
746 }
747 else
748 {
749 int32_t i;
750 if ( len > 20 )
751 {
752 hash = bits256_doublesha256(0,buf,len);
753 }
754 for (i=0; i<len; i++)
755 printf("%02x ",buf[i]);
7637aa7f 756 printf("\nhex checkhash.(%s) len.%d mismatch %02x %02x %02x %02x vs %02x %02x %02x %02x\n",coinaddr,len,buf[len-1]&0xff,buf[len-2]&0xff,buf[len-3]&0xff,buf[len-4]&0xff,hash.bytes[31],hash.bytes[30],hash.bytes[29],hash.bytes[28]);
d019c447 757 }
758 }
759 return(0);
760}
761
762char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160,int32_t len)
763{
764 int32_t i; uint8_t data[25]; bits256 hash;// char checkaddr[65];
765 if ( len != 20 )
766 calc_rmd160_sha256(data+1,pubkey_or_rmd160,len);
767 else memcpy(data+1,pubkey_or_rmd160,20);
768 //btc_convrmd160(checkaddr,addrtype,data+1);
769 data[0] = addrtype;
770 hash = bits256_doublesha256(0,data,21);
771 for (i=0; i<4; i++)
772 data[21+i] = hash.bytes[31-i];
773 if ( (coinaddr= bitcoin_base58encode(coinaddr,data,25)) != 0 )
774 {
775 //uint8_t checktype,rmd160[20];
776 //bitcoin_addr2rmd160(&checktype,rmd160,coinaddr);
777 //if ( strcmp(checkaddr,coinaddr) != 0 )
778 // printf("checkaddr.(%s) vs coinaddr.(%s) %02x vs [%02x] memcmp.%d\n",checkaddr,coinaddr,addrtype,checktype,memcmp(rmd160,data+1,20));
779 }
780 return(coinaddr);
781}
782
dfa036b6 783#define MAX_CURRENCIES 32
18d9697a 784char CURRENCIES[][8] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies
785 "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK",
786 "KMD" };
787
788int32_t komodo_baseid(char *origbase)
789{
790 int32_t i; char base[64];
791 for (i=0; origbase[i]!=0&&i<sizeof(base); i++)
792 base[i] = toupper((int32_t)(origbase[i] & 0xff));
793 base[i] = 0;
794 for (i=0; i<=MAX_CURRENCIES; i++)
795 if ( strcmp(CURRENCIES[i],base) == 0 )
796 return(i);
dd051793 797 //printf("illegal base.(%s) %s\n",origbase,base);
18d9697a 798 return(-1);
799}
800
8e3430ee 801int32_t komodo_is_issuer()
802{
654dfaaf 803 if ( ASSETCHAINS_SYMBOL[0] != 0 && komodo_baseid(ASSETCHAINS_SYMBOL) >= 0 )
8e3430ee 804 return(1);
805 else return(0);
806}
807
d2a115d8 808int32_t bitweight(uint64_t x)
809{
810 int i,wt = 0;
811 for (i=0; i<64; i++)
812 if ( (1LL << i) & x )
813 wt++;
814 return(wt);
815}
816
1e81ccb7 817int32_t _unhex(char c)
818{
819 if ( c >= '0' && c <= '9' )
820 return(c - '0');
821 else if ( c >= 'a' && c <= 'f' )
822 return(c - 'a' + 10);
823 else if ( c >= 'A' && c <= 'F' )
824 return(c - 'A' + 10);
825 return(-1);
826}
827
828int32_t is_hexstr(char *str,int32_t n)
829{
830 int32_t i;
831 if ( str == 0 || str[0] == 0 )
832 return(0);
833 for (i=0; str[i]!=0; i++)
834 {
835 if ( n > 0 && i >= n )
836 break;
837 if ( _unhex(str[i]) < 0 )
838 break;
839 }
840 if ( n == 0 )
841 return(i);
842 return(i == n);
843}
844
845int32_t unhex(char c)
846{
847 int32_t hex;
848 if ( (hex= _unhex(c)) < 0 )
849 {
850 //printf("unhex: illegal hexchar.(%c)\n",c);
851 }
852 return(hex);
853}
854
855unsigned char _decode_hex(char *hex) { return((unhex(hex[0])<<4) | unhex(hex[1])); }
856
857int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex)
858{
859 int32_t adjust,i = 0;
860 //printf("decode.(%s)\n",hex);
4f569c79 861 if ( is_hexstr(hex,n) <= 0 )
1e81ccb7 862 {
863 memset(bytes,0,n);
864 return(n);
865 }
e37f280f 866 if ( hex[n-1] == '\n' || hex[n-1] == '\r' )
4f569c79 867 hex[--n] = 0;
1e81ccb7 868 if ( n == 0 || (hex[n*2+1] == 0 && hex[n*2] != 0) )
869 {
870 if ( n > 0 )
871 {
872 bytes[0] = unhex(hex[0]);
873 printf("decode_hex n.%d hex[0] (%c) -> %d hex.(%s) [n*2+1: %d] [n*2: %d %c] len.%ld\n",n,hex[0],bytes[0],hex,hex[n*2+1],hex[n*2],hex[n*2],(long)strlen(hex));
874 }
875 bytes++;
876 hex++;
877 adjust = 1;
878 } else adjust = 0;
879 if ( n > 0 )
880 {
881 for (i=0; i<n; i++)
882 bytes[i] = _decode_hex(&hex[i*2]);
883 }
884 //bytes[i] = 0;
885 return(n + adjust);
886}
887
32b1b443 888char hexbyte(int32_t c)
889{
890 c &= 0xf;
891 if ( c < 10 )
892 return('0'+c);
893 else if ( c < 16 )
894 return('a'+c-10);
895 else return(0);
896}
897
898int32_t init_hexbytes_noT(char *hexbytes,unsigned char *message,long len)
899{
900 int32_t i;
901 if ( len <= 0 )
902 {
903 hexbytes[0] = 0;
904 return(1);
905 }
906 for (i=0; i<len; i++)
907 {
908 hexbytes[i*2] = hexbyte((message[i]>>4) & 0xf);
909 hexbytes[i*2 + 1] = hexbyte(message[i] & 0xf);
910 //printf("i.%d (%02x) [%c%c]\n",i,message[i],hexbytes[i*2],hexbytes[i*2+1]);
911 }
912 hexbytes[len*2] = 0;
913 //printf("len.%ld\n",len*2+1);
914 return((int32_t)len*2+1);
915}
916
917char *bits256_str(char hexstr[65],bits256 x)
918{
919 init_hexbytes_noT(hexstr,x.bytes,sizeof(x));
920 return(hexstr);
921}
922
1e81ccb7 923int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp)
924{
925 int32_t i; uint64_t x;
926 if ( rwflag == 0 )
927 {
928 x = 0;
929 for (i=len-1; i>=0; i--)
930 {
931 x <<= 8;
932 x |= serialized[i];
933 }
934 switch ( len )
935 {
936 case 1: *(uint8_t *)endianedp = (uint8_t)x; break;
937 case 2: *(uint16_t *)endianedp = (uint16_t)x; break;
938 case 4: *(uint32_t *)endianedp = (uint32_t)x; break;
939 case 8: *(uint64_t *)endianedp = (uint64_t)x; break;
940 }
941 }
942 else
943 {
944 x = 0;
945 switch ( len )
946 {
947 case 1: x = *(uint8_t *)endianedp; break;
948 case 2: x = *(uint16_t *)endianedp; break;
949 case 4: x = *(uint32_t *)endianedp; break;
950 case 8: x = *(uint64_t *)endianedp; break;
951 }
952 for (i=0; i<len; i++,x >>= 8)
953 serialized[i] = (uint8_t)(x & 0xff);
954 }
955 return(len);
956}
957
958int32_t iguana_rwbignum(int32_t rwflag,uint8_t *serialized,int32_t len,uint8_t *endianedp)
959{
960 int32_t i;
961 if ( rwflag == 0 )
962 {
963 for (i=0; i<len; i++)
964 endianedp[i] = serialized[i];
965 }
966 else
967 {
968 for (i=0; i<len; i++)
969 serialized[i] = endianedp[i];
970 }
971 return(len);
972}
973
64bb0834 974int32_t komodo_scriptitemlen(int32_t *opretlenp,uint8_t *script)
975{
976 int32_t opretlen,len = 0;
977 if ( (opretlen= script[len++]) >= 0x4c )
978 {
979 if ( opretlen == 0x4c )
980 opretlen = script[len++];
981 else if ( opretlen == 0x4d )
982 {
983 opretlen = script[len++];
984 opretlen = (opretlen << 8) | script[len++];
985 }
986 }
987 *opretlenp = opretlen;
988 return(len);
989}
990
1e81ccb7 991int32_t komodo_opreturnscript(uint8_t *script,uint8_t type,uint8_t *opret,int32_t opretlen)
992{
993 int32_t offset = 0;
994 script[offset++] = 0x6a;
995 opretlen++;
996 if ( opretlen >= 0x4c )
997 {
998 if ( opretlen > 0xff )
999 {
1000 script[offset++] = 0x4d;
1001 script[offset++] = opretlen & 0xff;
1002 script[offset++] = (opretlen >> 8) & 0xff;
1003 }
1004 else
1005 {
1006 script[offset++] = 0x4c;
1007 script[offset++] = opretlen;
1008 }
1009 } else script[offset++] = opretlen;
795751ec 1010 script[offset++] = type; // covered by opretlen
1011 memcpy(&script[offset],opret,opretlen-1);
1012 return(offset + opretlen - 1);
1e81ccb7 1013}
438d3f35 1014
fd1799a6 1015long _stripwhite(char *buf,int accept)
1016{
1017 int32_t i,j,c;
1018 if ( buf == 0 || buf[0] == 0 )
1019 return(0);
1020 for (i=j=0; buf[i]!=0; i++)
1021 {
1022 buf[j] = c = buf[i];
1023 if ( c == accept || (c != ' ' && c != '\n' && c != '\r' && c != '\t' && c != '\b') )
1024 j++;
1025 }
1026 buf[j] = 0;
1027 return(j);
1028}
1029
2c36c760 1030char *clonestr(char *str)
1031{
1032 char *clone;
1033 if ( str == 0 || str[0] == 0 )
1034 {
1035 printf("warning cloning nullstr.%p\n",str);
1036#ifdef __APPLE__
1037 while ( 1 ) sleep(1);
1038#endif
1039 str = (char *)"<nullstr>";
1040 }
1041 clone = (char *)malloc(strlen(str)+16);
1042 strcpy(clone,str);
1043 return(clone);
1044}
1045
f3d5295c 1046int32_t safecopy(char *dest,char *src,long len)
1047{
1048 int32_t i = -1;
1049 if ( src != 0 && dest != 0 && src != dest )
1050 {
1051 if ( dest != 0 )
1052 memset(dest,0,len);
1053 for (i=0; i<len&&src[i]!=0; i++)
1054 dest[i] = src[i];
1055 if ( i == len )
1056 {
1057 printf("safecopy: %s too long %ld\n",src,len);
1058#ifdef __APPLE__
1059 //getchar();
1060#endif
1061 return(-1);
1062 }
1063 dest[i] = 0;
1064 }
1065 return(i);
1066}
1067
fd1799a6 1068char *parse_conf_line(char *line,char *field)
1069{
1070 line += strlen(field);
1071 for (; *line!='='&&*line!=0; line++)
1072 break;
1073 if ( *line == 0 )
1074 return(0);
1075 if ( *line == '=' )
1076 line++;
83c2d095 1077 while ( line[strlen(line)-1] == '\r' || line[strlen(line)-1] == '\n' || line[strlen(line)-1] == ' ' )
5ae7efc1 1078 line[strlen(line)-1] = 0;
e78fb5d3 1079 //printf("LINE.(%s)\n",line);
fd1799a6 1080 _stripwhite(line,0);
1081 return(clonestr(line));
1082}
1083
38550ae9 1084double OS_milliseconds()
1085{
1086 struct timeval tv; double millis;
1087 gettimeofday(&tv,NULL);
1088 millis = ((double)tv.tv_sec * 1000. + (double)tv.tv_usec / 1000.);
1089 //printf("tv_sec.%ld usec.%d %f\n",tv.tv_sec,tv.tv_usec,millis);
1090 return(millis);
1091}
1092
f9557624 1093void OS_randombytes(unsigned char *x,long xlen)
5e39a3aa 1094{
1095 static int fd = -1;
1096 int32_t i;
1097 if (fd == -1) {
1098 for (;;) {
1099 fd = open("/dev/urandom",O_RDONLY);
1100 if (fd != -1) break;
1101 sleep(1);
1102 }
1103 }
1104 while (xlen > 0) {
1105 if (xlen < 1048576) i = (int32_t)xlen; else i = 1048576;
1106 i = (int32_t)read(fd,x,i);
1107 if (i < 1) {
1108 sleep(1);
1109 continue;
1110 }
1111 if ( 0 )
1112 {
1113 int32_t j;
1114 for (j=0; j<i; j++)
1115 printf("%02x ",x[j]);
1116 printf("-> %p\n",x);
1117 }
1118 x += i;
1119 xlen -= i;
1120 }
1121}
1122
429dabb5 1123void lock_queue(queue_t *queue)
1124{
1125 if ( queue->initflag == 0 )
1126 {
1127 portable_mutex_init(&queue->mutex);
1128 queue->initflag = 1;
1129 }
1130 portable_mutex_lock(&queue->mutex);
1131}
1132
5fa92ab2 1133void queue_enqueue(char *name,queue_t *queue,struct queueitem *item)
429dabb5 1134{
429dabb5 1135 if ( queue->name[0] == 0 && name != 0 && name[0] != 0 )
5fa92ab2 1136 strcpy(queue->name,name);
1137 if ( item == 0 )
429dabb5 1138 {
5fa92ab2 1139 printf("FATAL type error: queueing empty value\n");
429dabb5 1140 return;
1141 }
429dabb5 1142 lock_queue(queue);
429dabb5 1143 DL_APPEND(queue->list,item);
1144 portable_mutex_unlock(&queue->mutex);
429dabb5 1145}
1146
5fa92ab2 1147struct queueitem *queue_dequeue(queue_t *queue)
429dabb5 1148{
1149 struct queueitem *item = 0;
1150 lock_queue(queue);
1151 if ( queue->list != 0 )
1152 {
1153 item = queue->list;
429dabb5 1154 DL_DELETE(queue->list,item);
1155 }
1156 portable_mutex_unlock(&queue->mutex);
5fa92ab2 1157 return(item);
429dabb5 1158}
1159
405e2bdd 1160void *queue_delete(queue_t *queue,struct queueitem *copy,int32_t copysize)
429dabb5 1161{
429dabb5 1162 struct queueitem *item = 0;
1163 lock_queue(queue);
1164 if ( queue->list != 0 )
1165 {
1166 DL_FOREACH(queue->list,item)
1167 {
5fa92ab2 1168 if ( item == copy || (item->allocsize == copysize && memcmp((void *)((long)item + sizeof(struct queueitem)),(void *)((long)copy + sizeof(struct queueitem)),copysize) == 0) )
429dabb5 1169 {
1170 DL_DELETE(queue->list,item);
1171 portable_mutex_unlock(&queue->mutex);
5fa92ab2 1172 printf("name.(%s) deleted item.%p list.%p\n",queue->name,item,queue->list);
429dabb5 1173 return(item);
1174 }
1175 }
1176 }
1177 portable_mutex_unlock(&queue->mutex);
1178 return(0);
1179}
1180
1181void *queue_free(queue_t *queue)
1182{
1183 struct queueitem *item = 0;
1184 lock_queue(queue);
1185 if ( queue->list != 0 )
1186 {
1187 DL_FOREACH(queue->list,item)
1188 {
1189 DL_DELETE(queue->list,item);
5fa92ab2 1190 free(item);
429dabb5 1191 }
1192 //printf("name.(%s) dequeue.%p list.%p\n",queue->name,item,queue->list);
1193 }
1194 portable_mutex_unlock(&queue->mutex);
1195 return(0);
1196}
1197
1198void *queue_clone(queue_t *clone,queue_t *queue,int32_t size)
1199{
1200 struct queueitem *ptr,*item = 0;
1201 lock_queue(queue);
1202 if ( queue->list != 0 )
1203 {
1204 DL_FOREACH(queue->list,item)
1205 {
5fa92ab2 1206 ptr = (struct queueitem *)calloc(1,sizeof(*ptr));
429dabb5 1207 memcpy(ptr,item,size);
a856c56a 1208 queue_enqueue(queue->name,clone,ptr);
429dabb5 1209 }
1210 //printf("name.(%s) dequeue.%p list.%p\n",queue->name,item,queue->list);
1211 }
1212 portable_mutex_unlock(&queue->mutex);
1213 return(0);
1214}
1215
1216int32_t queue_size(queue_t *queue)
1217{
1218 int32_t count = 0;
1219 struct queueitem *tmp;
1220 lock_queue(queue);
1221 DL_COUNT(queue->list,tmp,count);
1222 portable_mutex_unlock(&queue->mutex);
1223 return count;
1224}
a18fbdc5 1225
1226void iguana_initQ(queue_t *Q,char *name)
1227{
25314868 1228 struct queueitem *item,*I;
a18fbdc5 1229 memset(Q,0,sizeof(*Q));
96d1da77 1230 I = (struct queueitem *)calloc(1,sizeof(*I));
a18fbdc5 1231 strcpy(Q->name,name);
25314868 1232 queue_enqueue(name,Q,I);
5fa92ab2 1233 if ( (item= queue_dequeue(Q)) != 0 )
1234 free(item);
a18fbdc5 1235}
561ff778 1236
1237void komodo_userpass(char *username,char *password,FILE *fp)
1238{
1239 char *rpcuser,*rpcpassword,*str,line[8192];
1240 rpcuser = rpcpassword = 0;
1241 username[0] = password[0] = 0;
1242 while ( fgets(line,sizeof(line),fp) != 0 )
1243 {
1244 if ( line[0] == '#' )
1245 continue;
1246 //printf("line.(%s) %p %p\n",line,strstr(line,(char *)"rpcuser"),strstr(line,(char *)"rpcpassword"));
1247 if ( (str= strstr(line,(char *)"rpcuser")) != 0 )
1248 rpcuser = parse_conf_line(str,(char *)"rpcuser");
1249 else if ( (str= strstr(line,(char *)"rpcpassword")) != 0 )
1250 rpcpassword = parse_conf_line(str,(char *)"rpcpassword");
1251 }
1252 if ( rpcuser != 0 && rpcpassword != 0 )
1253 {
1254 strcpy(username,rpcuser);
1255 strcpy(password,rpcpassword);
1256 }
1257 //printf("rpcuser.(%s) rpcpassword.(%s) KMDUSERPASS.(%s) %u\n",rpcuser,rpcpassword,KMDUSERPASS,port);
1258 if ( rpcuser != 0 )
1259 free(rpcuser);
1260 if ( rpcpassword != 0 )
1261 free(rpcpassword);
1262}
1263
ab918767 1264void komodo_statefname(char *fname,char *symbol)
1265{
1266 int32_t n,len;
1267 sprintf(fname,"%s",GetDataDir(false).string().c_str());
1268 if ( (n= (int32_t)strlen(ASSETCHAINS_SYMBOL)) != 0 )
1269 {
1270 len = (int32_t)strlen(fname);
1271 if ( strcmp(ASSETCHAINS_SYMBOL,&fname[len - n]) == 0 )
1272 {
1273 fname[len - n] = 0;
1274 if ( symbol[0] != 0 )
1275 {
1276 strcpy(&fname[len - n],symbol);
1277#ifdef WIN32
1278 strcat(fname,"\\");
1279#else
1280 strcat(fname,"//");
1281#endif
1282 }
1283 }
1284 else
1285 {
1286 printf("unexpected fname.(%s) vs %s\n",fname,ASSETCHAINS_SYMBOL);
1287 return;
1288 }
1289 }
1290 strcat(fname,(char *)"komodostate");
1291 printf("statename.(%s) %s\n",symbol,fname);
1292}
1293
561ff778 1294void komodo_configfile(char *symbol,uint16_t port)
1295{
1296 static char myusername[512],mypassword[8192];
7a4c01c9 1297 FILE *fp; uint8_t buf2[33]; char fname[512],buf[128],username[512],password[8192]; uint32_t crc,r,r2,i;
561ff778 1298 r = (uint32_t)time(NULL);
1299 r2 = OS_milliseconds();
1300 memcpy(buf,&r,sizeof(r));
1301 memcpy(&buf[sizeof(r)],&r2,sizeof(r2));
1302 memcpy(&buf[sizeof(r)+sizeof(r2)],symbol,strlen(symbol));
1303 crc = calc_crc32(0,(uint8_t *)buf,(int32_t)(sizeof(r)+sizeof(r2)+strlen(symbol)));
1304 OS_randombytes(buf2,sizeof(buf2));
1305 for (i=0; i<sizeof(buf2); i++)
1306 sprintf(&password[i*2],"%02x",buf2[i]);
1307 password[i*2] = 0;
1308 sprintf(buf,"%s.conf",symbol);
1309 BITCOIND_PORT = port;
1310#ifdef WIN32
1311 sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),buf);
1312#else
1313 sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),buf);
1314#endif
1315 if ( (fp= fopen(fname,"rb")) == 0 )
1316 {
1317 if ( (fp= fopen(fname,"wb")) != 0 )
1318 {
eda3ca93 1319 fprintf(fp,"rpcuser=user%u\nrpcpassword=pass%s\nrpcport=%u\nserver=1\ntxindex=1\n\n",crc,password,port);
561ff778 1320 fclose(fp);
1321 printf("Created (%s)\n",fname);
1322 } else printf("Couldnt create (%s)\n",fname);
1323 }
1324 else
1325 {
1326 komodo_userpass(myusername,mypassword,fp);
1327 mapArgs["-rpcpassword"] = mypassword;
1328 mapArgs["-rpcusername"] = myusername;
935fc055 1329 //fprintf(stderr,"myusername.(%s)\n",myusername);
561ff778 1330 fclose(fp);
1331 }
cad9f4c8 1332 strcpy(fname,GetDataDir().string().c_str());
561ff778 1333#ifdef WIN32
1334 while ( fname[strlen(fname)-1] != '\\' )
1335 fname[strlen(fname)-1] = 0;
323832c3 1336 strcat(fname,"komodo.conf");
561ff778 1337#else
1338 while ( fname[strlen(fname)-1] != '/' )
1339 fname[strlen(fname)-1] = 0;
323832c3 1340 strcat(fname,"komodo.conf");
561ff778 1341#endif
935fc055 1342 //printf("KOMODO.(%s)\n",fname);
561ff778 1343 if ( (fp= fopen(fname,"rb")) != 0 )
1344 {
1345 komodo_userpass(username,password,fp);
1346 sprintf(KMDUSERPASS,"%s:%s",username,password);
1347 fclose(fp);
1348 } else printf("couldnt open.(%s)\n",fname);
1349}
1350
3aca2705 1351uint32_t komodo_assetmagic(char *symbol,uint64_t supply)
1352{
1353 uint8_t buf[512]; int32_t len = 0;
1354 len = iguana_rwnum(1,&buf[len],sizeof(supply),(void *)&supply);
1355 strcpy((char *)&buf[len],symbol);
1356 len += strlen(symbol);
1357 return(calc_crc32(0,buf,len));
1358}
1359
ab918767 1360/*int32_t komodo_shortflag(char *symbol)
3aca2705 1361{
1362 int32_t i,shortflag = 0;
1363 if ( symbol[0] == '-' )
1364 {
1365 shortflag = 1;
1366 for (i=0; symbol[i+1]!=0; i++)
1367 symbol[i] = symbol[i+1];
1368 symbol[i] = 0;
1369 }
1370 return(shortflag);
ab918767 1371}*/
3aca2705 1372
e7a90cf9 1373uint16_t komodo_assetport(uint32_t magic)
3aca2705 1374{
e7a90cf9 1375 return(8000 + (magic % 7777));
3aca2705 1376}
1377
ab918767 1378uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp)
3aca2705 1379{
1380 *magicp = komodo_assetmagic(symbol,supply);
3aca2705 1381 return(komodo_assetport(*magicp,*shortflagp));
1382}
1383
1384void komodo_ports(uint16_t ports[MAX_CURRENCIES])
1385{
e7a90cf9 1386 int32_t i; uint32_t magic;
3aca2705 1387 for (i=0; i<MAX_CURRENCIES; i++)
1388 {
e7a90cf9 1389 ports[i] = komodo_port(CURRENCIES[i],10,&magic);
3aca2705 1390 printf("%u ",ports[i]);
1391 }
1392 printf("ports\n");
1393}
1394
4a4e912b 1395char *iguanafmtstr = (char *)"curl --url \"http://127.0.0.1:7778\" --data \"{\\\"conf\\\":\\\"%s.conf\\\",\\\"path\\\":\\\"${HOME#\"/\"}/.komodo/%s\\\",\\\"unitval\\\":\\\"20\\\",\\\"zcash\\\":1,\\\"RELAY\\\":1,\\\"VALIDATE\\\":1,\\\"prefetchlag\\\":-1,\\\"poll\\\":100,\\\"active\\\":1,\\\"agent\\\":\\\"iguana\\\",\\\"method\\\":\\\"addcoin\\\",\\\"startpend\\\":4,\\\"endpend\\\":4,\\\"services\\\":129,\\\"maxpeers\\\":8,\\\"newcoin\\\":\\\"%s\\\",\\\"name\\\":\\\"%s\\\",\\\"hasheaders\\\":1,\\\"useaddmultisig\\\":0,\\\"netmagic\\\":\\\"%s\\\",\\\"p2p\\\":%u,\\\"rpc\\\":%u,\\\"pubval\\\":60,\\\"p2shval\\\":85,\\\"wifval\\\":188,\\\"txfee_satoshis\\\":\\\"10000\\\",\\\"isPoS\\\":0,\\\"minoutput\\\":10000,\\\"minconfirms\\\":2,\\\"genesishash\\\":\\\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\\\",\\\"protover\\\":170002,\\\"genesisblock\\\":\\\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\\\",\\\"debug\\\":0,\\\"seedipaddr\\\":\\\"%s\\\"}\"";
7b7049d3 1396
ab8ef450 1397
561ff778 1398void komodo_args()
1399{
b6a7cb2c 1400 std::string name,addn; char *dirname,fname[512],magicstr[9]; uint8_t magic[4]; FILE *fp; int32_t i,len;
0e1af8a8 1401 IS_KOMODO_NOTARY = GetBoolArg("-notary", false);
1402 NOTARY_PUBKEY = GetArg("-pubkey", "");
1403 if ( strlen(NOTARY_PUBKEY.c_str()) == 66 )
1404 USE_EXTERNAL_PUBKEY = 1;
0e1af8a8 1405 name = GetArg("-ac_name","");
1406 if ( name.c_str()[0] != 0 )
561ff778 1407 {
0e1af8a8 1408 ASSETCHAINS_SUPPLY = GetArg("-ac_supply",10);
6ed911ff 1409 addn = GetArg("-seednode","");
1410 if ( strlen(addn.c_str()) > 0 )
b6a7cb2c 1411 ASSETCHAINS_SEED = 1;
0e1af8a8 1412 strncpy(ASSETCHAINS_SYMBOL,name.c_str(),sizeof(ASSETCHAINS_SYMBOL)-1);
ab918767 1413 ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC);
0e1af8a8 1414 while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 )
1415 {
1416 fprintf(stderr,"waiting for datadir\n");
1417 sleep(3);
1418 }
935fc055 1419 //fprintf(stderr,"Got datadir.(%s)\n",dirname);
0e1af8a8 1420 if ( ASSETCHAINS_SYMBOL[0] != 0 )
eda3ca93 1421 {
6051a4bc 1422 int32_t komodo_baseid(char *origbase);
eda3ca93 1423 extern int COINBASE_MATURITY;
0e1af8a8 1424 komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT + 1);
dc5bef26 1425 //if ( komodo_baseid(ASSETCHAINS_SYMBOL) >= 0 )
ab918767 1426 COINBASE_MATURITY = 1;
eda3ca93 1427 }
f9d9dc4b 1428 ASSETCHAINS_NOTARIES = GetArg("-ac_notaries","");
1429 komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str());
6e575e43 1430 iguana_rwnum(1,magic,sizeof(ASSETCHAINS_MAGIC),(void *)&ASSETCHAINS_MAGIC);
1431 for (i=0; i<4; i++)
1432 sprintf(&magicstr[i<<1],"%02x",magic[i]);
1433 magicstr[8] = 0;
1434 sprintf(fname,"gen%s",ASSETCHAINS_SYMBOL);
1435 if ( (fp= fopen(fname,"wb")) != 0 )
1436 {
4a4e912b 1437 fprintf(fp,iguanafmtstr,name.c_str(),name.c_str(),name.c_str(),name.c_str(),magicstr,ASSETCHAINS_PORT,ASSETCHAINS_PORT+1,"78.47.196.146");
6e575e43 1438 fclose(fp);
b6a7cb2c 1439 //printf("created (%s)\n",fname);
6e575e43 1440 } else printf("error creating (%s)\n",fname);
935fc055 1441 }
1442 else
1443 {
1444 ASSETCHAINS_PORT = 8777;
4cea9147 1445 //fprintf(stderr,"IS_KOMODO_NOTARY %d %s\n",IS_KOMODO_NOTARY,NOTARY_PUBKEY.c_str());
935fc055 1446 }
1447 //fprintf(stderr,"%s chain params initialized\n",ASSETCHAINS_SYMBOL);
1bfdde1d 1448}
1449
ab918767 1450void komodo_nameset(char *symbol,char *dest,char *source)
1bfdde1d 1451{
ab918767 1452 if ( source[0] == 0 )
1bfdde1d 1453 {
1454 strcpy(symbol,"KMD");
1455 strcpy(dest,"BTC");
1bfdde1d 1456 }
1457 else
1458 {
ab918767 1459 strcpy(symbol,source);
1bfdde1d 1460 strcpy(dest,"KMD");
ab918767 1461 }
1462}
1463
1464struct komodo_state *komodo_stateptr(char *symbol,char *dest)
1465{
1466 int32_t baseid; struct komodo_state *sp;
1467 komodo_nameset(symbol,dest,ASSETCHAINS_SYMBOL);
1468 if ( ASSETCHAINS_SYMBOL[0] == 0 )
1469 sp = &KOMODO_STATES[0];
1470 else
1471 {
1bfdde1d 1472 if ( (baseid= komodo_baseid(ASSETCHAINS_SYMBOL)) >= 0 )
ab918767 1473 sp = &KOMODO_STATES[baseid+1];
1bfdde1d 1474 else
1475 {
1476 fprintf(stderr,"komodo_stateupdate.(%s) not supported\n",ASSETCHAINS_SYMBOL);
1477 return(0);
1478 }
1479 }
1480 return(sp);
1481}
ab918767 1482
1483struct komodo_state *komodo_stateptrget(char *base)
1484{
1485 int32_t baseid;
1486 if ( base == 0 || base[0] == 0 || strcmp(base,"KMD") == 0 )
e7a90cf9 1487 return(&KOMODO_STATES[0]);
ab918767 1488 else if ( (baseid= komodo_baseid(base)) >= 0 )
1489 return(&KOMODO_STATES[baseid+1]);
1490 else return(0);
1491}
1492
1493int32_t komodo_isrealtime(int32_t *kmdheightp,char *target)
1494{
1495 char symbol[16],dest[16]; struct komodo_state *sp;
1496 *kmdheightp = 0;
1497 if ( (sp= komodo_stateptrget(target)) != 0 )
1498 {
1499 *kmdheightp = sp->CURRENT_HEIGHT;
1500 return(sp->KOMODO_REALTIME);
1501 }
1502 return(0);
1503}
This page took 0.289592 seconds and 4 git commands to generate.