]> Git Repo - VerusCoin.git/blame - src/komodo.h
test
[VerusCoin.git] / src / komodo.h
CommitLineData
fcd36118 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 ******************************************************************************/
15
16#ifndef H_KOMODO_H
17#define H_KOMODO_H
18
01cc012f 19int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp)
20{
21 int32_t i; uint64_t x;
22 if ( rwflag == 0 )
23 {
24 x = 0;
25 for (i=len-1; i>=0; i--)
26 {
27 x <<= 8;
28 x |= serialized[i];
29 }
30 switch ( len )
31 {
32 case 1: *(uint8_t *)endianedp = (uint8_t)x; break;
33 case 2: *(uint16_t *)endianedp = (uint16_t)x; break;
34 case 4: *(uint32_t *)endianedp = (uint32_t)x; break;
35 case 8: *(uint64_t *)endianedp = (uint64_t)x; break;
36 }
37 }
38 else
39 {
40 x = 0;
41 switch ( len )
42 {
43 case 1: x = *(uint8_t *)endianedp; break;
44 case 2: x = *(uint16_t *)endianedp; break;
45 case 4: x = *(uint32_t *)endianedp; break;
46 case 8: x = *(uint64_t *)endianedp; break;
47 }
48 for (i=0; i<len; i++,x >>= 8)
49 serialized[i] = (uint8_t)(x & 0xff);
50 }
51 return(len);
52}
53
54int32_t iguana_rwbignum(int32_t rwflag,uint8_t *serialized,int32_t len,uint8_t *endianedp)
55{
56 int32_t i;
57 if ( rwflag == 0 )
58 {
59 for (i=0; i<len; i++)
53b58ced 60 endianedp[i] = serialized[i];
01cc012f 61 }
62 else
63 {
64 for (i=0; i<len; i++)
53b58ced 65 serialized[i] = endianedp[i];
01cc012f 66 }
67 return(len);
68}
69
70int32_t _unhex(char c)
71{
72 if ( c >= '0' && c <= '9' )
73 return(c - '0');
74 else if ( c >= 'a' && c <= 'f' )
75 return(c - 'a' + 10);
76 else if ( c >= 'A' && c <= 'F' )
77 return(c - 'A' + 10);
78 return(-1);
79}
80
81int32_t is_hexstr(char *str,int32_t n)
82{
83 int32_t i;
84 if ( str == 0 || str[0] == 0 )
85 return(0);
86 for (i=0; str[i]!=0; i++)
87 {
88 if ( n > 0 && i >= n )
89 break;
90 if ( _unhex(str[i]) < 0 )
91 break;
92 }
93 if ( n == 0 )
94 return(i);
95 return(i == n);
96}
97
98int32_t unhex(char c)
99{
100 int32_t hex;
101 if ( (hex= _unhex(c)) < 0 )
102 {
103 //printf("unhex: illegal hexchar.(%c)\n",c);
104 }
105 return(hex);
106}
107
108unsigned char _decode_hex(char *hex) { return((unhex(hex[0])<<4) | unhex(hex[1])); }
109
110int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex)
111{
112 int32_t adjust,i = 0;
113 //printf("decode.(%s)\n",hex);
114 if ( is_hexstr(hex,n) == 0 )
115 {
116 memset(bytes,0,n);
117 return(n);
118 }
119 if ( n == 0 || (hex[n*2+1] == 0 && hex[n*2] != 0) )
120 {
121 if ( n > 0 )
122 {
123 bytes[0] = unhex(hex[0]);
124 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));
125 }
126 bytes++;
127 hex++;
128 adjust = 1;
129 } else adjust = 0;
130 if ( n > 0 )
131 {
132 for (i=0; i<n; i++)
133 bytes[i] = _decode_hex(&hex[i*2]);
134 }
135 //bytes[i] = 0;
136 return(n + adjust);
137}
138
93b5c955 139#include <stdint.h>
778ca57b 140#include <stdio.h>
93b5c955 141
44c4fbbd 142#define CRYPTO777_PUBSECPSTR "020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9"
143
acb1f4f1 144const char *Notaries[64][2] =
df1620e2 145{
146 { "jl777_testA", "03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828" },
147 { "jl777_testB", "02ebfc784a4ba768aad88d44d1045d240d47b26e248cafaf1c5169a42d7a61d344" },
148 { "pondsea_SH", "02209073bc0943451498de57f802650311b1f12aa6deffcd893da198a544c04f36" },
149 { "crackers_EU", "0340c66cf2c41c41efb420af57867baa765e8468c12aa996bfd816e1e07e410728" },
150 { "pondsea_EU", "0225aa6f6f19e543180b31153d9e6d55d41bc7ec2ba191fd29f19a2f973544e29d" },
151 { "locomb_EU", "025c6d26649b9d397e63323d96db42a9d3caad82e1d6076970efe5056c00c0779b" },
152 { "fullmoon_AE", "0204a908350b8142698fdb6fabefc97fe0e04f537adc7522ba7a1e8f3bec003d4a" },
153 { "movecrypto_EU", "021ab53bc6cf2c46b8a5456759f9d608966eff87384c2b52c0ac4cc8dd51e9cc42" },
154 { "badass_EU", "0209d48554768dd8dada988b98aca23405057ac4b5b46838a9378b95c3e79b9b9e" },
155 { "crackers_NA", "029e1c01131974f4cd3f564cc0c00eb87a0f9721043fbc1ca60f9bd0a1f73f64a1" },
156 { "proto_EU", "03681ffdf17c8f4f0008cefb7fa0779c5e888339cdf932f0974483787a4d6747c1" },
157 { "jeezy_EU", "023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6" },
158 { "farl4web_EU", "035caa40684ace968677dca3f09098aa02b70e533da32390a7654c626e0cf908e1" },
159 { "nxtswe_EU", "032fb104e5eaa704a38a52c126af8f67e870d70f82977e5b2f093d5c1c21ae5899" },
160 { "traderbill_EU", "03196e8de3e2e5d872f31d79d6a859c8704a2198baf0af9c7b21e29656a7eb455f" },
161 { "vanbreuk_EU", "024f3cad7601d2399c131fd070e797d9cd8533868685ddbe515daa53c2e26004c3" },
162 { "titomane_EU", "03517fcac101fed480ae4f2caf775560065957930d8c1facc83e30077e45bdd199" },
163 { "supernet_AE", "029d93ef78197dc93892d2a30e5a54865f41e0ca3ab7eb8e3dcbc59c8756b6e355" },
164 { "supernet_EU", "02061c6278b91fd4ac5cab4401100ffa3b2d5a277e8f71db23401cc071b3665546" },
21cc1d3e 165 { "supernet_NA", "033c073366152b6b01535e15dd966a3a8039169584d06e27d92a69889b720d44e1" },
df1620e2 166 { "yassin_EU", "033fb7231bb66484081952890d9a03f91164fb27d392d9152ec41336b71b15fbd0" },
167 { "durerus_EU", "02bcbd287670bdca2c31e5d50130adb5dea1b53198f18abeec7211825f47485d57" },
168 { "badass_SH", "026b49dd3923b78a592c1b475f208e23698d3f085c4c3b4906a59faf659fd9530b" },
bafc61f3 169 { "badass_NA", "02afa1a9f948e1634a29dc718d218e9d150c531cfa852843a1643a02184a63c1a7" },
df1620e2 170 { "pondsea_NA", "031bcfdbb62268e2ff8dfffeb9ddff7fe95fca46778c77eebff9c3829dfa1bb411" },
171 { "rnr_EU", "0287aa4b73988ba26cf6565d815786caf0d2c4af704d7883d163ee89cd9977edec" },
172 { "crackers_SH", "02313d72f9a16055737e14cfc528dcd5d0ef094cfce23d0348fe974b6b1a32e5f0" },
173 { "grewal_SH", "03212a73f5d38a675ee3cdc6e82542a96c38c3d1c79d25a1ed2e42fcf6a8be4e68" },
174 { "polycryptoblock_NA", "02708dcda7c45fb54b78469673c2587bfdd126e381654819c4c23df0e00b679622" },
175 { "titomane_NA", "0387046d9745414fb58a0fa3599078af5073e10347e4657ef7259a99cb4f10ad47" },
176 { "titomane_AE", "03cda6ca5c2d02db201488a54a548dbfc10533bdc275d5ea11928e8d6ab33c2185" },
52275d67 177 { "kolo_EU", "03f5c08dadffa0ffcafb8dd7ffc38c22887bd02702a6c9ac3440deddcf2837692b" },
bc6fd011 178 { "artik_NA", "0224e31f93eff0cc30eaf0b2389fbc591085c0e122c4d11862c1729d090106c842" },
bafc61f3 179 { "eclips_EU", "0339369c1f5a2028d44be7be6f8ec3b907fdec814f87d2dead97cab4edb71a42e9" },
df1620e2 180};
181
352f8081 182int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,NOTARIZED_HEIGHT,Num_nutxos;
998397aa 183std::string NOTARY_PUBKEY;
d6202b40 184uint256 NOTARIZED_HASH,NOTARIZED_BTCHASH;
352f8081 185struct nutxo_entry { uint256 txhash; uint64_t voutmask; int32_t notaryid; };
186struct nutxo_entry NUTXOS[10000];
187
6f3bcbea 188int32_t komodo_threshold(uint64_t signedmask)
189{
190 return(1); // N/2+1 || N/3 + devsig
191}
192
bafc61f3 193int32_t komodo_stateupdate(uint8_t notarypubs[][33],uint8_t numnotaries)
194{
52ed4002 195 static FILE *fp; static int32_t errs; char fname[512]; uint8_t func,num,pubkeys[64][33];
0534c5cb 196 sprintf(fname,"%s/%s",GetDataDir(false).string(),(char *)"komodostate");
bafc61f3 197 if ( fp == 0 )
198 {
199 if ( (fp= fopen(fname,"rb+")) != 0 )
200 {
201 while ( (func= fgetc(fp)) != EOF )
202 {
203 if ( func == 'P' )
204 {
205 if ( (num= fgetc(fp)) < 64 )
dd7b22ad 206 {
52ed4002 207 if ( fread(pubkeys,33,num,fp) != num )
208 errs++;
dd7b22ad 209 else printf("updated %d pubkeys\n",num);
210 }
bafc61f3 211 else printf("illegal num.%d\n",num);
212 }
213 else if ( func == 'N' )
214 {
52ed4002 215 if ( fread(&NOTARIZED_HEIGHT,1,sizeof(NOTARIZED_HEIGHT),fp) != sizeof(NOTARIZED_HEIGHT) )
216 errs++;
217 if ( fread(&NOTARIZED_HASH,1,sizeof(NOTARIZED_HASH),fp) != sizeof(NOTARIZED_HASH) )
218 errs++;
219 if ( fread(&NOTARIZED_BTCHASH,1,sizeof(NOTARIZED_BTCHASH),fp) != sizeof(NOTARIZED_BTCHASH) )
220 errs++;
bafc61f3 221 }
222 else printf("illegal func.(%d %c)\n",func,func);
223 }
224 } else fp = fopen(fname,"wb+");
225 printf("fname.(%s) fpos.%ld\n",fname,ftell(fp));
226 }
227 if ( fp != 0 )
228 {
229 if ( notarypubs != 0 && numnotaries > 0 )
230 {
231 fputc('P',fp);
232 fputc(numnotaries,fp);
52ed4002 233 if ( fwrite(notarypubs,33,numnotaries,fp) != numnotaries )
234 errs++;
bafc61f3 235 }
d35e50a7 236 fputc('N',fp);
52ed4002 237 if ( fwrite(&NOTARIZED_HEIGHT,1,sizeof(NOTARIZED_HEIGHT),fp) != sizeof(NOTARIZED_HEIGHT) )
238 errs++;
239 if ( fwrite(&NOTARIZED_HASH,1,sizeof(NOTARIZED_HASH),fp) != sizeof(NOTARIZED_HASH) )
240 errs++;
241 if ( fwrite(&NOTARIZED_BTCHASH,1,sizeof(NOTARIZED_BTCHASH),fp) != sizeof(NOTARIZED_BTCHASH) )
242 errs++;
bafc61f3 243 }
244}
245
b9bfc77d 246void komodo_nutxoadd(int32_t notaryid,uint256 txhash,uint64_t voutmask,int32_t numvouts)
352f8081 247{
6f3bcbea 248 if ( numvouts > 1 && notaryid < 64 )
b9bfc77d 249 {
250 NUTXOS[Num_nutxos].txhash = txhash;
251 NUTXOS[Num_nutxos].voutmask = voutmask;
252 NUTXOS[Num_nutxos].notaryid = notaryid;
21cc1d3e 253 printf("Add NUTXO[%d] <- %s notaryid.%d %s %llx\n",Num_nutxos,Notaries[notaryid][0],notaryid,txhash.ToString().c_str(),(long long)voutmask);
b9bfc77d 254 Num_nutxos++;
255 }
352f8081 256}
257
84e843cd 258int32_t komodo_nutxofind(uint256 txhash,int32_t vout) // change to ADD_HASH() and file based
352f8081 259{
260 int32_t i;
261 for (i=0; i<Num_nutxos; i++)
262 {
263 if ( memcmp(&txhash,&NUTXOS[i].txhash,sizeof(txhash)) == 0 && ((1LL << vout) & NUTXOS[i].voutmask) != 0 )
264 return(NUTXOS[i].notaryid);
265 }
266 return(-1);
267}
50027f06 268
84e843cd 269int32_t komodo_notaryfind(uint8_t *pubkey) // change to ADD_HASH()
1390456b 270{
6f3bcbea 271 static int didinit; static uint8_t notarypubs[64][33];
272 int32_t i,k; uint8_t notarypub[33];
273 if ( didinit == 0 )
274 {
275 for (k=0; k<64; k++)
276 {
277 if ( Notaries[k][0] == 0 || Notaries[k][1] == 0 || Notaries[k][0][0] == 0 || Notaries[k][1][0] == 0 )
278 break;
279 decode_hex(notarypubs[k],33,(char *)Notaries[k][1]);
d6202b40 280 printf("k.%d (%s) (%s) ",k,Notaries[k][0],Notaries[k][1]);
6f3bcbea 281 for (i=0; i<33; i++)
282 printf("%02x",notarypubs[k][i]);
283 printf(" notarypubs.[%d]\n",k);
284 }
285 didinit = 1;
286 }
1390456b 287 for (k=0; k<64; k++)
288 {
6f3bcbea 289 if ( memcmp(notarypubs[k],pubkey,33) == 0 )
1390456b 290 return(k);
1390456b 291 }
292 return(-1);
293}
294
295int32_t komodo_voutupdate(int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp)
296{
550fcab6 297 int32_t k,opretlen,len = 0; uint256 kmdtxid,btctxid; uint8_t crypto777[33];
9c406099 298 if ( scriptlen == 35 && scriptbuf[0] == 33 && scriptbuf[34] == 0xac )
1390456b 299 {
c23dd601 300 decode_hex(crypto777,33,(char *)CRYPTO777_PUBSECPSTR);
986d3459 301 /*for (k=0; k<33; k++)
e1be360e 302 printf("%02x",crypto777[k]);
303 printf(" crypto777 ");
304 for (k=0; k<scriptlen; k++)
305 printf("%02x",scriptbuf[k]);
986d3459 306 printf(" <- script ht.%d i.%d j.%d cmp.%d\n",height,i,j,memcmp(crypto777,scriptbuf+1,33));*/
1390456b 307 if ( memcmp(crypto777,scriptbuf+1,33) == 0 )
308 {
309 *specialtxp = 1;
310 printf(">>>>>>>> ");
311 }
312 else if ( (k= komodo_notaryfind(scriptbuf + 1)) >= 0 )
313 {
84e843cd 314 //printf("found notary.k%d\n",k);
315 if ( notaryid < 64 )
1390456b 316 {
84e843cd 317 if ( notaryid < 0 )
318 {
319 notaryid = k;
320 *voutmaskp |= (1LL << j);
321 }
322 else if ( notaryid != k )
323 {
324 printf("mismatch notaryid.%d k.%d\n",notaryid,k);
325 notaryid = 64;
326 *voutmaskp = 0;
327 }
328 else *voutmaskp |= (1LL << j);
1390456b 329 }
1390456b 330 }
331 }
332 if ( j == 1 && scriptbuf[len++] == 0x6a )
333 {
334 if ( (opretlen= scriptbuf[len++]) == 0x4c )
335 opretlen = scriptbuf[len++];
336 else if ( opretlen == 0x4d )
337 {
338 opretlen = scriptbuf[len++];
339 opretlen = (opretlen << 8) + scriptbuf[len++];
340 }
341 if ( opretlen >= 32*2+4 )
342 {
343 len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&kmdtxid);
344 len += iguana_rwnum(0,&scriptbuf[len],4,(uint8_t *)notarizedheightp);
345 len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&btctxid);
5b760d3f 346 //for (k=0; k<scriptlen; k++)
347 // printf("%02x",scriptbuf[k]);
348 //printf(" <- script ht.%d i.%d j.%d\n",height,i,j);
c23dd601 349 printf("ht.%d NOTARIZED.%d KMD.%s BTC.%s\n",height,*notarizedheightp,kmdtxid.ToString().c_str(),btctxid.ToString().c_str());
1390456b 350 if ( *notarizedheightp > NOTARIZED_HEIGHT )
351 {
352 NOTARIZED_HEIGHT = *notarizedheightp;
353 NOTARIZED_HASH = kmdtxid;
d6202b40 354 NOTARIZED_BTCHASH = btctxid;
bafc61f3 355 komodo_stateupdate(0,0);
1390456b 356 }
357 }
358 }
359 return(notaryid);
360}
361
651989c7 362void komodo_connectblock(CBlockIndex *pindex,CBlock& block)
50027f06 363{
bafc61f3 364 static int32_t didinit;
acb3f1d8 365 char *scriptstr,*opreturnstr; uint64_t signedmask,voutmask;
dd7b22ad 366 uint8_t scriptbuf[4096],pubkeys[64][33]; uint256 kmdtxid,btctxid,txhash;
29e69b85 367 int32_t i,j,k,numvalid,specialtx,notarizedheight,notaryid,len,numvouts,numvins,height,txn_count,flag;
bafc61f3 368 if ( didinit == 0 )
369 {
370 komodo_stateupdate(0,0);
371 didinit = 1;
372 }
3d35aa5b 373 // update voting results and official (height, notaries[])
68916cc6 374 if ( pindex != 0 )
b501ded2 375 {
656eddcd 376 height = pindex->nHeight;
01cc012f 377 txn_count = block.vtx.size();
378 for (i=0; i<txn_count; i++)
dc64de68 379 {
352f8081 380 txhash = block.vtx[i].GetHash();
01cc012f 381 numvouts = block.vtx[i].vout.size();
352f8081 382 notaryid = -1;
1390456b 383 voutmask = specialtx = notarizedheight = 0;
01cc012f 384 for (j=0; j<numvouts; j++)
dc64de68 385 {
1390456b 386 len = block.vtx[i].vout[j].scriptPubKey.size();
387 if ( len <= sizeof(scriptbuf) )
01cc012f 388 {
1390456b 389 memcpy(scriptbuf,block.vtx[i].vout[j].scriptPubKey.data(),len);
acb3f1d8 390 notaryid = komodo_voutupdate(notaryid,scriptbuf,len,height,txhash,i,j,&voutmask,&specialtx,&notarizedheight);
a01acef4 391 if ( 0 && i > 0 )
e69a0833 392 {
393 for (k=0; k<len; k++)
394 printf("%02x",scriptbuf[k]);
a8832194 395 printf(" <- notaryid.%d ht.%d i.%d j.%d numvouts.%d numvins.%d voutmask.%llx txid.(%s)\n",notaryid,height,i,j,numvouts,numvins,(long long)voutmask,txhash.ToString().c_str());
e69a0833 396 }
01cc012f 397 }
352f8081 398 }
1390456b 399 if ( notaryid >= 0 && voutmask != 0 )
400 komodo_nutxoadd(notaryid,txhash,voutmask,numvouts);
401 signedmask = 0;
402 numvins = block.vtx[i].vin.size();
5bdebffe 403 for (j=0; j<numvins; j++)
352f8081 404 {
1390456b 405 if ( (k= komodo_nutxofind(block.vtx[i].vin[j].prevout.hash,block.vtx[i].vin[j].prevout.n)) >= 0 )
406 signedmask |= (1LL << k);
21cc1d3e 407 else if ( 0 && signedmask != 0 )
bc6fd011 408 printf("signedmask.%llx but ht.%d i.%d j.%d not found (%s %d)\n",(long long)signedmask,height,i,j,block.vtx[i].vin[j].prevout.hash.ToString().c_str(),block.vtx[i].vin[j].prevout.n);
1390456b 409 }
06f0ed43 410 if ( signedmask != 0 && (notarizedheight != 0 || specialtx != 0) )
1390456b 411 {
e69a0833 412 printf("NOTARY SIGNED.%llx numvins.%d ht.%d txi.%d notaryht.%d specialtx.%d\n",(long long)signedmask,numvins,height,i,notarizedheight,specialtx);
29a14325 413 if ( specialtx != 0 && numvouts > 2 && komodo_threshold(signedmask) > 0 )
84e843cd 414 {
29e69b85 415 numvalid = 0;
dd7b22ad 416 memset(pubkeys,0,sizeof(pubkeys));
84e843cd 417 for (j=1; j<numvouts; j++)
418 {
419 len = block.vtx[i].vout[j].scriptPubKey.size();
420 if ( len <= sizeof(scriptbuf) )
421 {
422 memcpy(scriptbuf,block.vtx[i].vout[j].scriptPubKey.data(),len);
423 if ( len == 35 && scriptbuf[0] == 33 && scriptbuf[34] == 0xac )
424 {
29e69b85 425 memcpy(pubkeys[numvalid++],scriptbuf+1,33);
e7f99312 426 for (k=0; k<33; k++)
84e843cd 427 printf("%02x",scriptbuf[k+1]);
428 printf(" <- new notary.[%d]\n",j-1);
429 }
430 }
431 }
29e69b85 432 if ( numvalid > 13 )
433 komodo_stateupdate(pubkeys,numvalid);
84e843cd 434 printf("new notaries.%d newheight.%d from height.%d\n",numvouts-1,(((height+500)/1000)+1)*1000,height);
435 }
a96439f5 436 }
656eddcd 437 }
44c4fbbd 438 } else printf("komodo_connectblock: unexpected null pindex\n");
3d35aa5b 439}
440
e1be360e 441int32_t komodo_blockindexcheck(CBlockIndex *pindex,uint32_t *nBitsp)
442{
443 // 1 -> valid notary block, change nBits to KOMODO_MINDIFF_NBITS
444 // -1 -> invalid, ie, prior to notarized block
445 CBlock block; int32_t i,height; char *coinbasestr;
446 if ( pindex == 0 )
447 return(0);
448 if ( ReadBlockFromDisk(block,pindex,1) == 0 )
449 return(0);
450 if ( block.vtx.size() > 0 )
451 {
452 height = pindex->nHeight;
453 coinbasestr = (char *)block.vtx[0].vout[0].scriptPubKey.ToString().c_str();
454 for (i=0; i<64; i++)
455 {
456 if ( Notaries[i][0] == 0 || Notaries[i][1] == 0 || Notaries[i][0][0] == 0 || Notaries[i][1][0] == 0 )
457 break;
458 if ( strncmp(Notaries[i][1],coinbasestr,66) == 0 )
459 {
460 //printf("Notary.[%d] %s ht.%d (%s)\n",i,Notaries[i][0],height,coinbasestr);
461 //*nBitsp = KOMODO_MINDIFF_NBITS;
462 return(1);
463 }
464 }
465 }
466 // compare against elected notary pubkeys as of height
467 return(0);
468}
469
0570045c 470int32_t komodo_is_notaryblock(CBlockHeader& blockhdr)
3d35aa5b 471{
68916cc6 472 //uint32_t nBits = 0;
473 //return(komodo_blockindexcheck(mapBlockIndex[blockhdr.GetHash()],&nBits));
474 return(0);
3d35aa5b 475}
476
0570045c 477int32_t komodo_blockhdrcheck(CBlockHeader& blockhdr,uint32_t *nBitsp)
3d35aa5b 478{
aa8b56ea 479 int32_t retval;
480 if ( (retval= komodo_is_notaryblock(blockhdr)) > 0 )
0570045c 481 *nBitsp = KOMODO_MINDIFF_NBITS;
aa8b56ea 482 return(retval);
3d35aa5b 483}
484
0570045c 485int32_t komodo_blockcheck(CBlock& block,uint32_t *nBitsp)
d27afb07 486{
c9b8b8b0 487 return(komodo_blockhdrcheck(block,nBitsp));
d27afb07 488}
fcd36118 489
490#endif
This page took 0.118962 seconds and 4 git commands to generate.