Browse Source

Merge pull request #1304 from xcthulhu/revendoring-ethash

Revendoring ethash
cl-refactor
Gav Wood 10 years ago
parent
commit
2fe051385a
  1. 1
      libethash/CMakeLists.txt
  2. 967
      libethash/data_sizes.h
  3. 71
      libethash/ethash.h
  4. 100
      libethash/internal.c
  5. 6
      libethash/internal.h
  6. 8
      libethash/sha3_cryptopp.cpp
  7. 8
      libethash/util.h

1
libethash/CMakeLists.txt

@ -2,7 +2,6 @@ set(LIBRARY ethash)
if (CPPETHEREUM) if (CPPETHEREUM)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
#else ()
endif () endif ()
set(CMAKE_BUILD_TYPE Release) set(CMAKE_BUILD_TYPE Release)

967
libethash/data_sizes.h

@ -20,8 +20,6 @@
* @date 2015 * @date 2015
*/ */
// TODO: Update this after ~3.5 years
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
@ -33,213 +31,780 @@ extern "C" {
#include <stdint.h> #include <stdint.h>
// 500 Epochs worth of tabulated DAG sizes (~3.5 Years) // 2048 Epochs (~20 years) worth of tabulated DAG sizes
// Generated with the following Mathematica Code: // Generated with the following Mathematica Code:
// GetDataSizes[n_] := Module[{
// DAGSizeBytesInit = 2^30, // GetCacheSizes[n_] := Module[{
// MixBytes = 128, // CacheSizeBytesInit = 2^24,
// DAGGrowth = 113000000, // CacheGrowth = 2^17,
// HashBytes = 64,
// j = 0}, // j = 0},
// Reap[ // Reap[
// While[j < n, // While[j < n,
// Module[{i = // Module[{i =
// Floor[(DAGSizeBytesInit + DAGGrowth * j) / MixBytes]}, // Floor[(CacheSizeBytesInit + CacheGrowth * j) / HashBytes]},
// While[! PrimeQ[i], i--]; // While[! PrimeQ[i], i--];
// Sow[i*MixBytes]; j++]]]][[2]][[1]] // Sow[i*HashBytes]; j++]]]][[2]][[1]]
static const size_t dag_sizes[] = {
1073739904U, 1186739584U, 1299741568U, 1412741248U, 1525741696U, static const size_t dag_sizes[2048] = {
1638736768U, 1751741312U, 1864740736U, 1977740672U, 2090740864U, 1073739904U, 1082130304U, 1090514816U, 1098906752U, 1107293056U,
2203740544U, 2316741248U, 2429739392U, 2542740352U, 2655741824U, 1115684224U, 1124070016U, 1132461952U, 1140849536U, 1149232768U,
2768739712U, 2881740416U, 2994741632U, 3107740544U, 3220741504U, 1157627776U, 1166013824U, 1174404736U, 1182786944U, 1191180416U,
3333738112U, 3446741632U, 3559741312U, 3672740224U, 3785740928U, 1199568512U, 1207958912U, 1216345216U, 1224732032U, 1233124736U,
3898738304U, 4011741824U, 4124739712U, 4237735808U, 4350740864U, 1241513344U, 1249902464U, 1258290304U, 1266673792U, 1275067264U,
4463741824U, 4576741504U, 4689741184U, 4802739328U, 4915741568U, 1283453312U, 1291844992U, 1300234112U, 1308619904U, 1317010048U,
5028740224U, 5141740672U, 5254738304U, 5367741824U, 5480737664U, 1325397376U, 1333787776U, 1342176128U, 1350561664U, 1358954368U,
5593738112U, 5706741632U, 5819740544U, 5932734592U, 6045739904U, 1367339392U, 1375731584U, 1384118144U, 1392507008U, 1400897408U,
6158740096U, 6271740032U, 6384731776U, 6497732992U, 6610740352U, 1409284736U, 1417673344U, 1426062464U, 1434451072U, 1442839168U,
6723741056U, 6836741504U, 6949740416U, 7062740096U, 7175741824U, 1451229056U, 1459615616U, 1468006016U, 1476394112U, 1484782976U,
7288740224U, 7401741184U, 7514741632U, 7627741568U, 7740739712U, 1493171584U, 1501559168U, 1509948032U, 1518337664U, 1526726528U,
7853739136U, 7966740352U, 8079741568U, 8192739712U, 8305738624U, 1535114624U, 1543503488U, 1551892096U, 1560278656U, 1568669056U,
8418740864U, 8531740288U, 8644740736U, 8757735808U, 8870738816U, 1577056384U, 1585446272U, 1593831296U, 1602219392U, 1610610304U,
8983739264U, 9096740992U, 9209740928U, 9322739584U, 9435741824U, 1619000192U, 1627386752U, 1635773824U, 1644164224U, 1652555648U,
9548741504U, 9661739392U, 9774738304U, 9887741312U, 10000738688U, 1660943488U, 1669332608U, 1677721216U, 1686109312U, 1694497664U,
10113739136U, 10226741632U, 10339739776U, 10452741248U, 10565740928U, 1702886272U, 1711274624U, 1719661184U, 1728047744U, 1736434816U,
10678736512U, 10791734656U, 10904741248U, 11017738112U, 11130741632U, 1744829056U, 1753218944U, 1761606272U, 1769995904U, 1778382464U,
11243741312U, 11356739456U, 11469740416U, 11582734976U, 11695739008U, 1786772864U, 1795157888U, 1803550592U, 1811937664U, 1820327552U,
11808741248U, 11921734784U, 12034739072U, 12147741568U, 12260737408U, 1828711552U, 1837102976U, 1845488768U, 1853879936U, 1862269312U,
12373741696U, 12486738304U, 12599740544U, 12712740224U, 12825741184U, 1870656896U, 1879048064U, 1887431552U, 1895825024U, 1904212096U,
12938736256U, 13051741312U, 13164737408U, 13277738368U, 13390738048U, 1912601216U, 1920988544U, 1929379456U, 1937765504U, 1946156672U,
13503741824U, 13616741504U, 13729737088U, 13842740096U, 13955741312U, 1954543232U, 1962932096U, 1971321728U, 1979707264U, 1988093056U,
14068741504U, 14181740416U, 14294741632U, 14407739776U, 14520740224U, 1996487552U, 2004874624U, 2013262208U, 2021653888U, 2030039936U,
14633740928U, 14746736512U, 14859741824U, 14972740736U, 15085740928U, 2038430848U, 2046819968U, 2055208576U, 2063596672U, 2071981952U,
15198738304U, 15311732096U, 15424740736U, 15537739904U, 15650741632U, 2080373632U, 2088762752U, 2097149056U, 2105539712U, 2113928576U,
15763741568U, 15876737152U, 15989741696U, 16102740608U, 16215741056U, 2122315136U, 2130700672U, 2139092608U, 2147483264U, 2155872128U,
16328741248U, 16441740416U, 16554737792U, 16667740288U, 16780740992U, 2164257664U, 2172642176U, 2181035392U, 2189426048U, 2197814912U,
16893738112U, 17006741632U, 17119739008U, 17232735616U, 17345739392U, 2206203008U, 2214587264U, 2222979712U, 2231367808U, 2239758208U,
17458740352U, 17571736192U, 17684739712U, 17797739392U, 17910740096U, 2248145024U, 2256527744U, 2264922752U, 2273312128U, 2281701248U,
18023741312U, 18136740736U, 18249738112U, 18362738816U, 18475735424U, 2290086272U, 2298476672U, 2306867072U, 2315251072U, 2323639168U,
18588740224U, 18701738368U, 18814736768U, 18927737216U, 19040739968U, 2332032128U, 2340420224U, 2348808064U, 2357196416U, 2365580416U,
19153739648U, 19266736768U, 19379737984U, 19492739456U, 19605738368U, 2373966976U, 2382363008U, 2390748544U, 2399139968U, 2407530368U,
19718740352U, 19831741312U, 19944736384U, 20057741696U, 20170741376U, 2415918976U, 2424307328U, 2432695424U, 2441084288U, 2449472384U,
20283741824U, 20396737408U, 20509741696U, 20622741376U, 20735739008U, 2457861248U, 2466247808U, 2474637184U, 2483026816U, 2491414144U,
20848741504U, 20961740672U, 21074739328U, 21187740032U, 21300739456U, 2499803776U, 2508191872U, 2516582272U, 2524970368U, 2533359232U,
21413741696U, 21526740608U, 21639741824U, 21752737408U, 21865741696U, 2541743488U, 2550134144U, 2558525056U, 2566913408U, 2575301504U,
21978741376U, 22091741824U, 22204738432U, 22317740672U, 22430740096U, 2583686528U, 2592073856U, 2600467328U, 2608856192U, 2617240448U,
22543736704U, 22656741248U, 22769739904U, 22882739584U, 22995740288U, 2625631616U, 2634022016U, 2642407552U, 2650796416U, 2659188352U,
23108740736U, 23221740928U, 23334741376U, 23447737216U, 23560740992U, 2667574912U, 2675965312U, 2684352896U, 2692738688U, 2701130624U,
23673741184U, 23786740864U, 23899737728U, 24012741248U, 24125734784U, 2709518464U, 2717907328U, 2726293376U, 2734685056U, 2743073152U,
24238736512U, 24351741824U, 24464740736U, 24577737088U, 24690741632U, 2751462016U, 2759851648U, 2768232832U, 2776625536U, 2785017728U,
24803739776U, 24916740736U, 25029740416U, 25142740864U, 25255741568U, 2793401984U, 2801794432U, 2810182016U, 2818571648U, 2826959488U,
25368741248U, 25481740672U, 25594741376U, 25707741568U, 25820741504U, 2835349376U, 2843734144U, 2852121472U, 2860514432U, 2868900992U,
25933730432U, 26046739072U, 26159741824U, 26272741504U, 26385740672U, 2877286784U, 2885676928U, 2894069632U, 2902451584U, 2910843008U,
26498740096U, 26611741568U, 26724740992U, 26837739904U, 26950735232U, 2919234688U, 2927622784U, 2936011648U, 2944400768U, 2952789376U,
27063738496U, 27176741248U, 27289741184U, 27402740864U, 27515740544U, 2961177728U, 2969565568U, 2977951616U, 2986338944U, 2994731392U,
27628737152U, 27741740672U, 27854741632U, 27967740544U, 28080739712U, 3003120256U, 3011508352U, 3019895936U, 3028287104U, 3036675968U,
28193738368U, 28306741376U, 28419737728U, 28532739968U, 28645739648U, 3045063808U, 3053452928U, 3061837696U, 3070228352U, 3078615424U,
28758740096U, 28871741312U, 28984739456U, 29097740416U, 29210740864U, 3087003776U, 3095394944U, 3103782272U, 3112173184U, 3120562048U,
29323741312U, 29436740224U, 29549741696U, 29662738304U, 29775741568U, 3128944768U, 3137339264U, 3145725056U, 3154109312U, 3162505088U,
29888741504U, 30001740928U, 30114737024U, 30227735168U, 30340737664U, 3170893184U, 3179280256U, 3187669376U, 3196056704U, 3204445568U,
30453738368U, 30566737024U, 30679733632U, 30792740224U, 30905740928U, 3212836736U, 3221224064U, 3229612928U, 3238002304U, 3246391168U,
31018740352U, 31131740032U, 31244738944U, 31357737344U, 31470741376U, 3254778496U, 3263165824U, 3271556224U, 3279944576U, 3288332416U,
31583740544U, 31696740224U, 31809738112U, 31922739328U, 32035737472U, 3296719232U, 3305110912U, 3313500032U, 3321887104U, 3330273152U,
32148740992U, 32261741696U, 32374740352U, 32487741824U, 32600740736U, 3338658944U, 3347053184U, 3355440512U, 3363827072U, 3372220288U,
32713739648U, 32826740608U, 32939729792U, 33052740992U, 33165740672U, 3380608384U, 3388997504U, 3397384576U, 3405774208U, 3414163072U,
33278739584U, 33391741312U, 33504739712U, 33617740928U, 33730740608U, 3422551936U, 3430937984U, 3439328384U, 3447714176U, 3456104576U,
33843738496U, 33956739968U, 34069741696U, 34182739328U, 34295741824U, 3464493952U, 3472883584U, 3481268864U, 3489655168U, 3498048896U,
34408739968U, 34521740672U, 34634736512U, 34747741568U, 34860741248U, 3506434432U, 3514826368U, 3523213952U, 3531603584U, 3539987072U,
34973739392U, 35086738304U, 35199741056U, 35312736896U, 35425741184U, 3548380288U, 3556763264U, 3565157248U, 3573545344U, 3581934464U,
35538741376U, 35651740288U, 35764737152U, 35877741184U, 35990739584U, 3590324096U, 3598712704U, 3607098752U, 3615488384U, 3623877248U,
36103740544U, 36216740992U, 36329739392U, 36442737536U, 36555741568U, 3632265856U, 3640646528U, 3649043584U, 3657430144U, 3665821568U,
36668740736U, 36781741184U, 36894737024U, 37007741312U, 37120739456U, 3674207872U, 3682597504U, 3690984832U, 3699367808U, 3707764352U,
37233741184U, 37346736256U, 37459736192U, 37572734336U, 37685739904U, 3716152448U, 3724541056U, 3732925568U, 3741318016U, 3749706368U,
37798740352U, 37911737728U, 38024741504U, 38137739648U, 38250740608U, 3758091136U, 3766481536U, 3774872704U, 3783260032U, 3791650432U,
38363741824U, 38476740992U, 38589741184U, 38702740096U, 38815741312U, 3800036224U, 3808427648U, 3816815488U, 3825204608U, 3833592704U,
38928741248U, 39041738368U, 39154739584U, 39267741824U, 39380739712U, 3841981568U, 3850370432U, 3858755968U, 3867147904U, 3875536256U,
39493735808U, 39606741632U, 39719741312U, 39832741504U, 39945739648U, 3883920512U, 3892313728U, 3900702592U, 3909087872U, 3917478784U,
40058740352U, 40171740032U, 40284740992U, 40397740672U, 40510740352U, 3925868416U, 3934256512U, 3942645376U, 3951032192U, 3959422336U,
40623740288U, 40736738176U, 40849737856U, 40962741376U, 41075739776U, 3967809152U, 3976200064U, 3984588416U, 3992974976U, 4001363584U,
41188737664U, 41301735808U, 41414738048U, 41527741312U, 41640740992U, 4009751168U, 4018141312U, 4026530432U, 4034911616U, 4043308928U,
41753739904U, 41866739072U, 41979738496U, 42092740736U, 42205739648U, 4051695488U, 4060084352U, 4068472448U, 4076862848U, 4085249408U,
42318740608U, 42431741312U, 42544738688U, 42657741184U, 42770738048U, 4093640576U, 4102028416U, 4110413696U, 4118805632U, 4127194496U,
42883741568U, 42996741248U, 43109740928U, 43222736512U, 43335741056U, 4135583104U, 4143971968U, 4152360832U, 4160746112U, 4169135744U,
43448730496U, 43561740416U, 43674741632U, 43787740544U, 43900741504U, 4177525888U, 4185912704U, 4194303616U, 4202691968U, 4211076736U,
44013739648U, 44126740864U, 44239740544U, 44352741248U, 44465738368U, 4219463552U, 4227855488U, 4236246656U, 4244633728U, 4253022848U,
44578735232U, 44691739264U, 44804741504U, 44917741696U, 45030741376U, 4261412224U, 4269799808U, 4278184832U, 4286578048U, 4294962304U,
45143741824U, 45256740992U, 45369739136U, 45482740096U, 45595739776U, 4303349632U, 4311743104U, 4320130432U, 4328521088U, 4336909184U,
45708739712U, 45821740672U, 45934741376U, 46047741056U, 46160741248U, 4345295488U, 4353687424U, 4362073472U, 4370458496U, 4378852736U,
46273737088U, 46386740864U, 46499739008U, 46612739968U, 46725735296U, 4387238528U, 4395630208U, 4404019072U, 4412407424U, 4420790656U,
46838740864U, 46951741568U, 47064737152U, 47177741696U, 47290741376U, 4429182848U, 4437571456U, 4445962112U, 4454344064U, 4462738048U,
47403738752U, 47516741248U, 47629739648U, 47742741632U, 47855737984U, 4471119232U, 4479516544U, 4487904128U, 4496289664U, 4504682368U,
47968740224U, 48081738368U, 48194741632U, 48307739264U, 48420739712U, 4513068416U, 4521459584U, 4529846144U, 4538232704U, 4546619776U,
48533739136U, 48646738304U, 48759741824U, 48872741504U, 48985739392U, 4555010176U, 4563402112U, 4571790208U, 4580174464U, 4588567936U,
49098741376U, 49211741056U, 49324740992U, 49437738368U, 49550740864U, 4596957056U, 4605344896U, 4613734016U, 4622119808U, 4630511488U,
49663735424U, 49776737408U, 49889740672U, 50002738816U, 50115738752U, 4638898816U, 4647287936U, 4655675264U, 4664065664U, 4672451968U,
50228739712U, 50341741696U, 50454736768U, 50567738752U, 50680739968U, 4680842624U, 4689231488U, 4697620352U, 4706007424U, 4714397056U,
50793736832U, 50906734976U, 51019741568U, 51132739456U, 51245741696U, 4722786176U, 4731173248U, 4739562368U, 4747951744U, 4756340608U,
51358741376U, 51471741056U, 51584738944U, 51697734272U, 51810739072U, 4764727936U, 4773114496U, 4781504384U, 4789894784U, 4798283648U,
51923736448U, 52036740736U, 52149741184U, 52262737024U, 52375738496U, 4806667648U, 4815059584U, 4823449472U, 4831835776U, 4840226176U,
52488740992U, 52601739136U, 52714740352U, 52827736448U, 52940738176U, 4848612224U, 4857003392U, 4865391488U, 4873780096U, 4882169728U,
53053741696U, 53166740864U, 53279741824U, 53392741504U, 53505739136U, 4890557312U, 4898946944U, 4907333248U, 4915722368U, 4924110976U,
53618739584U, 53731741312U, 53844741248U, 53957741696U, 54070741376U, 4932499328U, 4940889728U, 4949276032U, 4957666432U, 4966054784U,
54183740288U, 54296741504U, 54409741696U, 54522739072U, 54635737472U, 4974438016U, 4982831488U, 4991221376U, 4999607168U, 5007998848U,
54748741504U, 54861736064U, 54974740096U, 55087741568U, 55200733568U, 5016386432U, 5024763776U, 5033164672U, 5041544576U, 5049941888U,
55313741696U, 55426734464U, 55539741056U, 55652741504U, 55765741184U, 5058329728U, 5066717056U, 5075107456U, 5083494272U, 5091883904U,
55878741376U, 55991730304U, 56104740992U, 56217740672U, 56330731648U, 5100273536U, 5108662144U, 5117048192U, 5125436032U, 5133827456U,
56443737472U, 56556724352U, 56669740672U, 56782739072U, 56895740032U, 5142215296U, 5150605184U, 5158993024U, 5167382144U, 5175769472U,
57008741248U, 57121741696U, 57234740096U, 57347741312U, 57460741504U 5184157568U, 5192543872U, 5200936064U, 5209324928U, 5217711232U,
5226102656U, 5234490496U, 5242877312U, 5251263872U, 5259654016U,
5268040832U, 5276434304U, 5284819328U, 5293209728U, 5301598592U,
5309986688U, 5318374784U, 5326764416U, 5335151488U, 5343542144U,
5351929472U, 5360319872U, 5368706944U, 5377096576U, 5385484928U,
5393871232U, 5402263424U, 5410650496U, 5419040384U, 5427426944U,
5435816576U, 5444205952U, 5452594816U, 5460981376U, 5469367936U,
5477760896U, 5486148736U, 5494536832U, 5502925952U, 5511315328U,
5519703424U, 5528089984U, 5536481152U, 5544869504U, 5553256064U,
5561645696U, 5570032768U, 5578423936U, 5586811264U, 5595193216U,
5603585408U, 5611972736U, 5620366208U, 5628750464U, 5637143936U,
5645528192U, 5653921408U, 5662310272U, 5670694784U, 5679082624U,
5687474048U, 5695864448U, 5704251008U, 5712641408U, 5721030272U,
5729416832U, 5737806208U, 5746194304U, 5754583936U, 5762969984U,
5771358592U, 5779748224U, 5788137856U, 5796527488U, 5804911232U,
5813300608U, 5821692544U, 5830082176U, 5838468992U, 5846855552U,
5855247488U, 5863636096U, 5872024448U, 5880411008U, 5888799872U,
5897186432U, 5905576832U, 5913966976U, 5922352768U, 5930744704U,
5939132288U, 5947522432U, 5955911296U, 5964299392U, 5972688256U,
5981074304U, 5989465472U, 5997851008U, 6006241408U, 6014627968U,
6023015552U, 6031408256U, 6039796096U, 6048185216U, 6056574848U,
6064963456U, 6073351808U, 6081736064U, 6090128768U, 6098517632U,
6106906496U, 6115289216U, 6123680896U, 6132070016U, 6140459648U,
6148849024U, 6157237376U, 6165624704U, 6174009728U, 6182403712U,
6190792064U, 6199176064U, 6207569792U, 6215952256U, 6224345216U,
6232732544U, 6241124224U, 6249510272U, 6257899136U, 6266287744U,
6274676864U, 6283065728U, 6291454336U, 6299843456U, 6308232064U,
6316620928U, 6325006208U, 6333395584U, 6341784704U, 6350174848U,
6358562176U, 6366951296U, 6375337856U, 6383729536U, 6392119168U,
6400504192U, 6408895616U, 6417283456U, 6425673344U, 6434059136U,
6442444672U, 6450837376U, 6459223424U, 6467613056U, 6476004224U,
6484393088U, 6492781952U, 6501170048U, 6509555072U, 6517947008U,
6526336384U, 6534725504U, 6543112832U, 6551500672U, 6559888768U,
6568278656U, 6576662912U, 6585055616U, 6593443456U, 6601834112U,
6610219648U, 6618610304U, 6626999168U, 6635385472U, 6643777408U,
6652164224U, 6660552832U, 6668941952U, 6677330048U, 6685719424U,
6694107776U, 6702493568U, 6710882176U, 6719274112U, 6727662976U,
6736052096U, 6744437632U, 6752825984U, 6761213824U, 6769604224U,
6777993856U, 6786383488U, 6794770816U, 6803158144U, 6811549312U,
6819937664U, 6828326528U, 6836706176U, 6845101696U, 6853491328U,
6861880448U, 6870269312U, 6878655104U, 6887046272U, 6895433344U,
6903822208U, 6912212864U, 6920596864U, 6928988288U, 6937377152U,
6945764992U, 6954149248U, 6962544256U, 6970928768U, 6979317376U,
6987709312U, 6996093824U, 7004487296U, 7012875392U, 7021258624U,
7029652352U, 7038038912U, 7046427776U, 7054818944U, 7063207808U,
7071595136U, 7079980928U, 7088372608U, 7096759424U, 7105149824U,
7113536896U, 7121928064U, 7130315392U, 7138699648U, 7147092352U,
7155479168U, 7163865728U, 7172249984U, 7180648064U, 7189036672U,
7197424768U, 7205810816U, 7214196608U, 7222589824U, 7230975104U,
7239367552U, 7247755904U, 7256145536U, 7264533376U, 7272921472U,
7281308032U, 7289694848U, 7298088832U, 7306471808U, 7314864512U,
7323253888U, 7331643008U, 7340029568U, 7348419712U, 7356808832U,
7365196672U, 7373585792U, 7381973888U, 7390362752U, 7398750592U,
7407138944U, 7415528576U, 7423915648U, 7432302208U, 7440690304U,
7449080192U, 7457472128U, 7465860992U, 7474249088U, 7482635648U,
7491023744U, 7499412608U, 7507803008U, 7516192384U, 7524579968U,
7532967296U, 7541358464U, 7549745792U, 7558134656U, 7566524032U,
7574912896U, 7583300992U, 7591690112U, 7600075136U, 7608466816U,
7616854912U, 7625244544U, 7633629824U, 7642020992U, 7650410368U,
7658794112U, 7667187328U, 7675574912U, 7683961984U, 7692349568U,
7700739712U, 7709130368U, 7717519232U, 7725905536U, 7734295424U,
7742683264U, 7751069056U, 7759457408U, 7767849088U, 7776238208U,
7784626816U, 7793014912U, 7801405312U, 7809792128U, 7818179968U,
7826571136U, 7834957184U, 7843347328U, 7851732352U, 7860124544U,
7868512384U, 7876902016U, 7885287808U, 7893679744U, 7902067072U,
7910455936U, 7918844288U, 7927230848U, 7935622784U, 7944009344U,
7952400256U, 7960786048U, 7969176704U, 7977565312U, 7985953408U,
7994339968U, 8002730368U, 8011119488U, 8019508096U, 8027896192U,
8036285056U, 8044674688U, 8053062272U, 8061448832U, 8069838464U,
8078227328U, 8086616704U, 8095006592U, 8103393664U, 8111783552U,
8120171392U, 8128560256U, 8136949376U, 8145336704U, 8153726848U,
8162114944U, 8170503296U, 8178891904U, 8187280768U, 8195669632U,
8204058496U, 8212444544U, 8220834176U, 8229222272U, 8237612672U,
8246000768U, 8254389376U, 8262775168U, 8271167104U, 8279553664U,
8287944064U, 8296333184U, 8304715136U, 8313108352U, 8321497984U,
8329885568U, 8338274432U, 8346663296U, 8355052928U, 8363441536U,
8371828352U, 8380217984U, 8388606592U, 8396996224U, 8405384576U,
8413772672U, 8422161536U, 8430549376U, 8438939008U, 8447326592U,
8455715456U, 8464104832U, 8472492928U, 8480882048U, 8489270656U,
8497659776U, 8506045312U, 8514434944U, 8522823808U, 8531208832U,
8539602304U, 8547990656U, 8556378752U, 8564768384U, 8573154176U,
8581542784U, 8589933952U, 8598322816U, 8606705024U, 8615099264U,
8623487872U, 8631876992U, 8640264064U, 8648653952U, 8657040256U,
8665430656U, 8673820544U, 8682209152U, 8690592128U, 8698977152U,
8707374464U, 8715763328U, 8724151424U, 8732540032U, 8740928384U,
8749315712U, 8757704576U, 8766089344U, 8774480768U, 8782871936U,
8791260032U, 8799645824U, 8808034432U, 8816426368U, 8824812928U,
8833199488U, 8841591424U, 8849976448U, 8858366336U, 8866757248U,
8875147136U, 8883532928U, 8891923328U, 8900306816U, 8908700288U,
8917088384U, 8925478784U, 8933867392U, 8942250368U, 8950644608U,
8959032704U, 8967420544U, 8975809664U, 8984197504U, 8992584064U,
9000976256U, 9009362048U, 9017752448U, 9026141312U, 9034530688U,
9042917504U, 9051307904U, 9059694208U, 9068084864U, 9076471424U,
9084861824U, 9093250688U, 9101638528U, 9110027648U, 9118416512U,
9126803584U, 9135188096U, 9143581312U, 9151969664U, 9160356224U,
9168747136U, 9177134464U, 9185525632U, 9193910144U, 9202302848U,
9210690688U, 9219079552U, 9227465344U, 9235854464U, 9244244864U,
9252633472U, 9261021824U, 9269411456U, 9277799296U, 9286188928U,
9294574208U, 9302965888U, 9311351936U, 9319740032U, 9328131968U,
9336516736U, 9344907392U, 9353296768U, 9361685888U, 9370074752U,
9378463616U, 9386849408U, 9395239808U, 9403629184U, 9412016512U,
9420405376U, 9428795008U, 9437181568U, 9445570688U, 9453960832U,
9462346624U, 9470738048U, 9479121536U, 9487515008U, 9495903616U,
9504289664U, 9512678528U, 9521067904U, 9529456256U, 9537843584U,
9546233728U, 9554621312U, 9563011456U, 9571398784U, 9579788672U,
9588178304U, 9596567168U, 9604954496U, 9613343104U, 9621732992U,
9630121856U, 9638508416U, 9646898816U, 9655283584U, 9663675776U,
9672061312U, 9680449664U, 9688840064U, 9697230464U, 9705617536U,
9714003584U, 9722393984U, 9730772608U, 9739172224U, 9747561088U,
9755945344U, 9764338816U, 9772726144U, 9781116544U, 9789503872U,
9797892992U, 9806282624U, 9814670464U, 9823056512U, 9831439232U,
9839833984U, 9848224384U, 9856613504U, 9865000576U, 9873391232U,
9881772416U, 9890162816U, 9898556288U, 9906940544U, 9915333248U,
9923721088U, 9932108672U, 9940496512U, 9948888448U, 9957276544U,
9965666176U, 9974048384U, 9982441088U, 9990830464U, 9999219584U,
10007602816U, 10015996544U, 10024385152U, 10032774016U, 10041163648U,
10049548928U, 10057940096U, 10066329472U, 10074717824U, 10083105152U,
10091495296U, 10099878784U, 10108272256U, 10116660608U, 10125049216U,
10133437312U, 10141825664U, 10150213504U, 10158601088U, 10166991232U,
10175378816U, 10183766144U, 10192157312U, 10200545408U, 10208935552U,
10217322112U, 10225712768U, 10234099328U, 10242489472U, 10250876032U,
10259264896U, 10267656064U, 10276042624U, 10284429184U, 10292820352U,
10301209472U, 10309598848U, 10317987712U, 10326375296U, 10334763392U,
10343153536U, 10351541632U, 10359930752U, 10368318592U, 10376707456U,
10385096576U, 10393484672U, 10401867136U, 10410262144U, 10418647424U,
10427039104U, 10435425664U, 10443810176U, 10452203648U, 10460589952U,
10468982144U, 10477369472U, 10485759104U, 10494147712U, 10502533504U,
10510923392U, 10519313536U, 10527702656U, 10536091264U, 10544478592U,
10552867712U, 10561255808U, 10569642368U, 10578032768U, 10586423168U,
10594805632U, 10603200128U, 10611588992U, 10619976064U, 10628361344U,
10636754048U, 10645143424U, 10653531776U, 10661920384U, 10670307968U,
10678696832U, 10687086464U, 10695475072U, 10703863168U, 10712246144U,
10720639616U, 10729026688U, 10737414784U, 10745806208U, 10754190976U,
10762581376U, 10770971264U, 10779356288U, 10787747456U, 10796135552U,
10804525184U, 10812915584U, 10821301888U, 10829692288U, 10838078336U,
10846469248U, 10854858368U, 10863247232U, 10871631488U, 10880023424U,
10888412032U, 10896799616U, 10905188992U, 10913574016U, 10921964672U,
10930352768U, 10938742912U, 10947132544U, 10955518592U, 10963909504U,
10972298368U, 10980687488U, 10989074816U, 10997462912U, 11005851776U,
11014241152U, 11022627712U, 11031017344U, 11039403904U, 11047793024U,
11056184704U, 11064570752U, 11072960896U, 11081343872U, 11089737856U,
11098128256U, 11106514816U, 11114904448U, 11123293568U, 11131680128U,
11140065152U, 11148458368U, 11156845696U, 11165236864U, 11173624192U,
11182013824U, 11190402688U, 11198790784U, 11207179136U, 11215568768U,
11223957376U, 11232345728U, 11240734592U, 11249122688U, 11257511296U,
11265899648U, 11274285952U, 11282675584U, 11291065472U, 11299452544U,
11307842432U, 11316231296U, 11324616832U, 11333009024U, 11341395584U,
11349782656U, 11358172288U, 11366560384U, 11374950016U, 11383339648U,
11391721856U, 11400117376U, 11408504192U, 11416893568U, 11425283456U,
11433671552U, 11442061184U, 11450444672U, 11458837888U, 11467226752U,
11475611776U, 11484003968U, 11492392064U, 11500780672U, 11509169024U,
11517550976U, 11525944448U, 11534335616U, 11542724224U, 11551111808U,
11559500672U, 11567890304U, 11576277376U, 11584667008U, 11593056128U,
11601443456U, 11609830016U, 11618221952U, 11626607488U, 11634995072U,
11643387776U, 11651775104U, 11660161664U, 11668552576U, 11676940928U,
11685330304U, 11693718656U, 11702106496U, 11710496128U, 11718882688U,
11727273088U, 11735660416U, 11744050048U, 11752437376U, 11760824704U,
11769216128U, 11777604736U, 11785991296U, 11794381952U, 11802770048U,
11811157888U, 11819548544U, 11827932544U, 11836324736U, 11844713344U,
11853100928U, 11861486464U, 11869879936U, 11878268032U, 11886656896U,
11895044992U, 11903433088U, 11911822976U, 11920210816U, 11928600448U,
11936987264U, 11945375872U, 11953761152U, 11962151296U, 11970543488U,
11978928512U, 11987320448U, 11995708288U, 12004095104U, 12012486272U,
12020875136U, 12029255552U, 12037652096U, 12046039168U, 12054429568U,
12062813824U, 12071206528U, 12079594624U, 12087983744U, 12096371072U,
12104759936U, 12113147264U, 12121534592U, 12129924992U, 12138314624U,
12146703232U, 12155091584U, 12163481216U, 12171864704U, 12180255872U,
12188643968U, 12197034112U, 12205424512U, 12213811328U, 12222199424U,
12230590336U, 12238977664U, 12247365248U, 12255755392U, 12264143488U,
12272531584U, 12280920448U, 12289309568U, 12297694592U, 12306086528U,
12314475392U, 12322865024U, 12331253632U, 12339640448U, 12348029312U,
12356418944U, 12364805248U, 12373196672U, 12381580928U, 12389969024U,
12398357632U, 12406750592U, 12415138432U, 12423527552U, 12431916416U,
12440304512U, 12448692352U, 12457081216U, 12465467776U, 12473859968U,
12482245504U, 12490636672U, 12499025536U, 12507411584U, 12515801728U,
12524190592U, 12532577152U, 12540966272U, 12549354368U, 12557743232U,
12566129536U, 12574523264U, 12582911872U, 12591299456U, 12599688064U,
12608074624U, 12616463488U, 12624845696U, 12633239936U, 12641631616U,
12650019968U, 12658407296U, 12666795136U, 12675183232U, 12683574656U,
12691960192U, 12700350592U, 12708740224U, 12717128576U, 12725515904U,
12733906816U, 12742295168U, 12750680192U, 12759071872U, 12767460736U,
12775848832U, 12784236928U, 12792626816U, 12801014656U, 12809404288U,
12817789312U, 12826181504U, 12834568832U, 12842954624U, 12851345792U,
12859732352U, 12868122496U, 12876512128U, 12884901248U, 12893289088U,
12901672832U, 12910067584U, 12918455168U, 12926842496U, 12935232896U,
12943620736U, 12952009856U, 12960396928U, 12968786816U, 12977176192U,
12985563776U, 12993951104U, 13002341504U, 13010730368U, 13019115392U,
13027506304U, 13035895168U, 13044272512U, 13052673152U, 13061062528U,
13069446272U, 13077838976U, 13086227072U, 13094613632U, 13103000192U,
13111393664U, 13119782528U, 13128157568U, 13136559232U, 13144945024U,
13153329536U, 13161724288U, 13170111872U, 13178502784U, 13186884736U,
13195279744U, 13203667072U, 13212057472U, 13220445824U, 13228832128U,
13237221248U, 13245610624U, 13254000512U, 13262388352U, 13270777472U,
13279166336U, 13287553408U, 13295943296U, 13304331904U, 13312719488U,
13321108096U, 13329494656U, 13337885824U, 13346274944U, 13354663808U,
13363051136U, 13371439232U, 13379825024U, 13388210816U, 13396605056U,
13404995456U, 13413380224U, 13421771392U, 13430159744U, 13438546048U,
13446937216U, 13455326848U, 13463708288U, 13472103808U, 13480492672U,
13488875648U, 13497269888U, 13505657728U, 13514045312U, 13522435712U,
13530824576U, 13539210112U, 13547599232U, 13555989376U, 13564379008U,
13572766336U, 13581154432U, 13589544832U, 13597932928U, 13606320512U,
13614710656U, 13623097472U, 13631477632U, 13639874944U, 13648264064U,
13656652928U, 13665041792U, 13673430656U, 13681818496U, 13690207616U,
13698595712U, 13706982272U, 13715373184U, 13723762048U, 13732150144U,
13740536704U, 13748926592U, 13757316224U, 13765700992U, 13774090112U,
13782477952U, 13790869376U, 13799259008U, 13807647872U, 13816036736U,
13824425344U, 13832814208U, 13841202304U, 13849591424U, 13857978752U,
13866368896U, 13874754688U, 13883145344U, 13891533184U, 13899919232U,
13908311168U, 13916692096U, 13925085056U, 13933473152U, 13941866368U,
13950253696U, 13958643584U, 13967032192U, 13975417216U, 13983807616U,
13992197504U, 14000582272U, 14008973696U, 14017363072U, 14025752192U,
14034137984U, 14042528384U, 14050918016U, 14059301504U, 14067691648U,
14076083584U, 14084470144U, 14092852352U, 14101249664U, 14109635968U,
14118024832U, 14126407552U, 14134804352U, 14143188608U, 14151577984U,
14159968384U, 14168357248U, 14176741504U, 14185127296U, 14193521024U,
14201911424U, 14210301824U, 14218685056U, 14227067264U, 14235467392U,
14243855488U, 14252243072U, 14260630144U, 14269021568U, 14277409408U,
14285799296U, 14294187904U, 14302571392U, 14310961792U, 14319353728U,
14327738752U, 14336130944U, 14344518784U, 14352906368U, 14361296512U,
14369685376U, 14378071424U, 14386462592U, 14394848128U, 14403230848U,
14411627392U, 14420013952U, 14428402304U, 14436793472U, 14445181568U,
14453569664U, 14461959808U, 14470347904U, 14478737024U, 14487122816U,
14495511424U, 14503901824U, 14512291712U, 14520677504U, 14529064832U,
14537456768U, 14545845632U, 14554234496U, 14562618496U, 14571011456U,
14579398784U, 14587789184U, 14596172672U, 14604564608U, 14612953984U,
14621341312U, 14629724288U, 14638120832U, 14646503296U, 14654897536U,
14663284864U, 14671675264U, 14680061056U, 14688447616U, 14696835968U,
14705228416U, 14713616768U, 14722003328U, 14730392192U, 14738784128U,
14747172736U, 14755561088U, 14763947648U, 14772336512U, 14780725376U,
14789110144U, 14797499776U, 14805892736U, 14814276992U, 14822670208U,
14831056256U, 14839444352U, 14847836032U, 14856222848U, 14864612992U,
14872997504U, 14881388672U, 14889775744U, 14898165376U, 14906553472U,
14914944896U, 14923329664U, 14931721856U, 14940109696U, 14948497024U,
14956887424U, 14965276544U, 14973663616U, 14982053248U, 14990439808U,
14998830976U, 15007216768U, 15015605888U, 15023995264U, 15032385152U,
15040768384U, 15049154944U, 15057549184U, 15065939072U, 15074328448U,
15082715008U, 15091104128U, 15099493504U, 15107879296U, 15116269184U,
15124659584U, 15133042304U, 15141431936U, 15149824384U, 15158214272U,
15166602368U, 15174991232U, 15183378304U, 15191760512U, 15200154496U,
15208542592U, 15216931712U, 15225323392U, 15233708416U, 15242098048U,
15250489216U, 15258875264U, 15267265408U, 15275654528U, 15284043136U,
15292431488U, 15300819584U, 15309208192U, 15317596544U, 15325986176U,
15334374784U, 15342763648U, 15351151744U, 15359540608U, 15367929728U,
15376318336U, 15384706432U, 15393092992U, 15401481856U, 15409869952U,
15418258816U, 15426649984U, 15435037568U, 15443425664U, 15451815296U,
15460203392U, 15468589184U, 15476979328U, 15485369216U, 15493755776U,
15502146944U, 15510534272U, 15518924416U, 15527311232U, 15535699072U,
15544089472U, 15552478336U, 15560866688U, 15569254528U, 15577642624U,
15586031488U, 15594419072U, 15602809472U, 15611199104U, 15619586432U,
15627975296U, 15636364928U, 15644753792U, 15653141888U, 15661529216U,
15669918848U, 15678305152U, 15686696576U, 15695083136U, 15703474048U,
15711861632U, 15720251264U, 15728636288U, 15737027456U, 15745417088U,
15753804928U, 15762194048U, 15770582656U, 15778971008U, 15787358336U,
15795747712U, 15804132224U, 15812523392U, 15820909696U, 15829300096U,
15837691264U, 15846071936U, 15854466944U, 15862855808U, 15871244672U,
15879634816U, 15888020608U, 15896409728U, 15904799104U, 15913185152U,
15921577088U, 15929966464U, 15938354816U, 15946743424U, 15955129472U,
15963519872U, 15971907968U, 15980296064U, 15988684928U, 15997073024U,
16005460864U, 16013851264U, 16022241152U, 16030629248U, 16039012736U,
16047406976U, 16055794816U, 16064181376U, 16072571264U, 16080957824U,
16089346688U, 16097737856U, 16106125184U, 16114514816U, 16122904192U,
16131292544U, 16139678848U, 16148066944U, 16156453504U, 16164839552U,
16173236096U, 16181623424U, 16190012032U, 16198401152U, 16206790528U,
16215177344U, 16223567744U, 16231956352U, 16240344704U, 16248731008U,
16257117824U, 16265504384U, 16273898624U, 16282281856U, 16290668672U,
16299064192U, 16307449216U, 16315842176U, 16324230016U, 16332613504U,
16341006464U, 16349394304U, 16357783168U, 16366172288U, 16374561664U,
16382951296U, 16391337856U, 16399726208U, 16408116352U, 16416505472U,
16424892032U, 16433282176U, 16441668224U, 16450058624U, 16458448768U,
16466836864U, 16475224448U, 16483613056U, 16492001408U, 16500391808U,
16508779648U, 16517166976U, 16525555328U, 16533944192U, 16542330752U,
16550719616U, 16559110528U, 16567497088U, 16575888512U, 16584274816U,
16592665472U, 16601051008U, 16609442944U, 16617832064U, 16626218624U,
16634607488U, 16642996096U, 16651385728U, 16659773824U, 16668163712U,
16676552576U, 16684938112U, 16693328768U, 16701718144U, 16710095488U,
16718492288U, 16726883968U, 16735272832U, 16743661184U, 16752049792U,
16760436608U, 16768827008U, 16777214336U, 16785599104U, 16793992832U,
16802381696U, 16810768768U, 16819151744U, 16827542656U, 16835934848U,
16844323712U, 16852711552U, 16861101952U, 16869489536U, 16877876864U,
16886265728U, 16894653056U, 16903044736U, 16911431296U, 16919821696U,
16928207488U, 16936592768U, 16944987776U, 16953375616U, 16961763968U,
16970152832U, 16978540928U, 16986929536U, 16995319168U, 17003704448U,
17012096896U, 17020481152U, 17028870784U, 17037262208U, 17045649536U,
17054039936U, 17062426496U, 17070814336U, 17079205504U, 17087592064U,
17095978112U, 17104369024U, 17112759424U, 17121147776U, 17129536384U,
17137926016U, 17146314368U, 17154700928U, 17163089792U, 17171480192U,
17179864192U, 17188256896U, 17196644992U, 17205033856U, 17213423488U,
17221811072U, 17230198912U, 17238588032U, 17246976896U, 17255360384U,
17263754624U, 17272143232U, 17280530048U, 17288918912U, 17297309312U,
17305696384U, 17314085504U, 17322475136U, 17330863744U, 17339252096U,
17347640192U, 17356026496U, 17364413824U, 17372796544U, 17381190016U,
17389583488U, 17397972608U, 17406360704U, 17414748544U, 17423135872U,
17431527296U, 17439915904U, 17448303232U, 17456691584U, 17465081728U,
17473468288U, 17481857408U, 17490247552U, 17498635904U, 17507022464U,
17515409024U, 17523801728U, 17532189824U, 17540577664U, 17548966016U,
17557353344U, 17565741184U, 17574131584U, 17582519168U, 17590907008U,
17599296128U, 17607687808U, 17616076672U, 17624455808U, 17632852352U,
17641238656U, 17649630848U, 17658018944U, 17666403968U, 17674794112U,
17683178368U, 17691573376U, 17699962496U, 17708350592U, 17716739968U,
17725126528U, 17733517184U, 17741898112U, 17750293888U, 17758673024U,
17767070336U, 17775458432U, 17783848832U, 17792236928U, 17800625536U,
17809012352U, 17817402752U, 17825785984U, 17834178944U, 17842563968U,
17850955648U, 17859344512U, 17867732864U, 17876119424U, 17884511872U,
17892900224U, 17901287296U, 17909677696U, 17918058112U, 17926451072U,
17934843776U, 17943230848U, 17951609216U, 17960008576U, 17968397696U,
17976784256U, 17985175424U, 17993564032U, 18001952128U, 18010339712U,
18018728576U, 18027116672U, 18035503232U, 18043894144U, 18052283264U,
18060672128U, 18069056384U, 18077449856U, 18085837184U, 18094225792U,
18102613376U, 18111004544U, 18119388544U, 18127781248U, 18136170368U,
18144558976U, 18152947328U, 18161336192U, 18169724288U, 18178108544U,
18186498944U, 18194886784U, 18203275648U, 18211666048U, 18220048768U,
18228444544U, 18236833408U, 18245220736U
}; };
// 500 Epochs worth of tabulated DAG sizes (~3.5 Years)
// Generated with the following Mathematica Code: // Generated with the following Mathematica Code:
// GetCacheSizes[n_] := Module[{ // GetCacheSizes[n_] := Module[{
// DAGSizeBytesInit = 2^30, // DataSetSizeBytesInit = 2^30,
// MixBytes = 128, // MixBytes = 128,
// DAGGrowth = 113000000, // DataSetGrowth = 2^23,
// HashBytes = 64, // HashBytes = 64,
// DAGParents = 1024, // CacheMultiplier = 1024,
// j = 0}, // j = 0},
// Reap[ // Reap[
// While[j < n, // While[j < n,
// Module[{i = Floor[(DAGSizeBytesInit + DAGGrowth * j) / (DAGParents * HashBytes)]}, // Module[{i = Floor[(DataSetSizeBytesInit + DataSetGrowth * j) / (CacheMultiplier * HashBytes)]},
// While[! PrimeQ[i], i--]; // While[! PrimeQ[i], i--];
// Sow[i*HashBytes]; j++]]]][[2]][[1]] // Sow[i*HashBytes]; j++]]]][[2]][[1]]
const size_t cache_sizes[] = { const size_t cache_sizes[2048] = {
1048384U, 1158208U, 1268416U, 1377856U, 1489856U, 1599296U, 1710656U, 16776896U, 16907456U, 17039296U, 17170112U, 17301056U, 17432512U, 17563072U,
1820608U, 1930816U, 2041024U, 2151872U, 2261696U, 2371904U, 2482624U, 17693888U, 17824192U, 17955904U, 18087488U, 18218176U, 18349504U, 18481088U,
2593216U, 2703296U, 2814016U, 2924224U, 3034816U, 3144896U, 3255488U, 18611392U, 18742336U, 18874304U, 19004224U, 19135936U, 19267264U, 19398208U,
3365312U, 3475904U, 3586624U, 3696064U, 3806272U, 3917504U, 4027456U, 19529408U, 19660096U, 19791424U, 19922752U, 20053952U, 20184896U, 20315968U,
4138304U, 4248512U, 4359104U, 4469312U, 4579264U, 4689728U, 4797376U, 20446912U, 20576576U, 20709184U, 20840384U, 20971072U, 21102272U, 21233216U,
4909888U, 5020096U, 5131328U, 5241664U, 5351744U, 5461312U, 5572544U, 21364544U, 21494848U, 21626816U, 21757376U, 21887552U, 22019392U, 22151104U,
5683264U, 5793472U, 5903552U, 6014144U, 6121664U, 6235072U, 6344896U, 22281536U, 22412224U, 22543936U, 22675264U, 22806464U, 22935872U, 23068096U,
6454592U, 6565952U, 6675904U, 6786112U, 6896704U, 7006784U, 7117888U, 23198272U, 23330752U, 23459008U, 23592512U, 23723968U, 23854912U, 23986112U,
7228096U, 7338304U, 7448768U, 7557952U, 7669184U, 7779776U, 7889216U, 24116672U, 24247616U, 24378688U, 24509504U, 24640832U, 24772544U, 24903488U,
8000192U, 8110912U, 8220736U, 8331712U, 8441536U, 8552384U, 8662592U, 25034432U, 25165376U, 25296704U, 25427392U, 25558592U, 25690048U, 25820096U,
8772928U, 8883136U, 8993728U, 9103168U, 9214528U, 9323968U, 9434816U, 25951936U, 26081728U, 26214208U, 26345024U, 26476096U, 26606656U, 26737472U,
9545152U, 9655616U, 9766336U, 9876544U, 9986624U, 10097344U, 10207424U, 26869184U, 26998208U, 27131584U, 27262528U, 27393728U, 27523904U, 27655744U,
10316864U, 10427968U, 10538432U, 10649152U, 10758976U, 10869568U, 10979776U, 27786688U, 27917888U, 28049344U, 28179904U, 28311488U, 28441792U, 28573504U,
11089472U, 11200832U, 11309632U, 11420608U, 11531584U, 11641792U, 11751104U, 28700864U, 28835648U, 28966208U, 29096768U, 29228608U, 29359808U, 29490752U,
11862976U, 11973184U, 12083264U, 12193856U, 12304064U, 12414656U, 12524608U, 29621824U, 29752256U, 29882816U, 30014912U, 30144448U, 30273728U, 30406976U,
12635072U, 12745792U, 12855616U, 12965824U, 13076416U, 13187008U, 13297216U, 30538432U, 30670784U, 30799936U, 30932672U, 31063744U, 31195072U, 31325248U,
13407808U, 13518016U, 13627072U, 13738688U, 13848256U, 13959488U, 14069696U, 31456192U, 31588288U, 31719232U, 31850432U, 31981504U, 32110784U, 32243392U,
14180288U, 14290624U, 14399552U, 14511424U, 14621504U, 14732096U, 14841664U, 32372672U, 32505664U, 32636608U, 32767808U, 32897344U, 33029824U, 33160768U,
14951744U, 15062336U, 15172672U, 15283264U, 15393088U, 15504448U, 15614272U, 33289664U, 33423296U, 33554368U, 33683648U, 33816512U, 33947456U, 34076992U,
15723712U, 15834944U, 15945152U, 16055744U, 16165696U, 16277056U, 16387136U, 34208704U, 34340032U, 34471744U, 34600256U, 34734016U, 34864576U, 34993984U,
16494784U, 16607936U, 16718272U, 16828736U, 16938176U, 17048384U, 17159872U, 35127104U, 35258176U, 35386688U, 35518528U, 35650624U, 35782336U, 35910976U,
17266624U, 17380544U, 17490496U, 17600192U, 17711296U, 17821376U, 17931968U, 36044608U, 36175808U, 36305728U, 36436672U, 36568384U, 36699968U, 36830656U,
18041152U, 18152896U, 18261952U, 18373568U, 18483392U, 18594112U, 18703936U, 36961984U, 37093312U, 37223488U, 37355072U, 37486528U, 37617472U, 37747904U,
18814912U, 18924992U, 19034944U, 19145408U, 19256128U, 19366208U, 19477184U, 37879232U, 38009792U, 38141888U, 38272448U, 38403392U, 38535104U, 38660672U,
19587136U, 19696576U, 19808192U, 19916992U, 20028352U, 20137664U, 20249024U, 38795584U, 38925632U, 39059264U, 39190336U, 39320768U, 39452096U, 39581632U,
20358848U, 20470336U, 20580544U, 20689472U, 20801344U, 20911424U, 21020096U, 39713984U, 39844928U, 39974848U, 40107968U, 40238144U, 40367168U, 40500032U,
21130688U, 21242176U, 21352384U, 21462208U, 21573824U, 21683392U, 21794624U, 40631744U, 40762816U, 40894144U, 41023552U, 41155904U, 41286208U, 41418304U,
21904448U, 22013632U, 22125248U, 22235968U, 22344512U, 22456768U, 22566848U, 41547712U, 41680448U, 41811904U, 41942848U, 42073792U, 42204992U, 42334912U,
22677056U, 22786496U, 22897984U, 23008064U, 23118272U, 23228992U, 23338816U, 42467008U, 42597824U, 42729152U, 42860096U, 42991552U, 43122368U, 43253696U,
23449408U, 23560256U, 23670464U, 23780672U, 23891264U, 24001216U, 24110656U, 43382848U, 43515712U, 43646912U, 43777088U, 43907648U, 44039104U, 44170432U,
24221888U, 24332608U, 24442688U, 24552512U, 24662464U, 24773696U, 24884032U, 44302144U, 44433344U, 44564288U, 44694976U, 44825152U, 44956864U, 45088448U,
24994496U, 25105216U, 25215296U, 25324864U, 25435712U, 25546432U, 25655744U, 45219008U, 45350464U, 45481024U, 45612608U, 45744064U, 45874496U, 46006208U,
25767232U, 25876672U, 25986368U, 26098112U, 26207936U, 26318912U, 26428736U, 46136768U, 46267712U, 46399424U, 46529344U, 46660672U, 46791488U, 46923328U,
26539712U, 26650048U, 26760256U, 26869184U, 26979776U, 27091136U, 27201728U, 47053504U, 47185856U, 47316928U, 47447872U, 47579072U, 47710144U, 47839936U,
27311552U, 27422272U, 27532352U, 27642304U, 27752896U, 27863744U, 27973952U, 47971648U, 48103232U, 48234176U, 48365248U, 48496192U, 48627136U, 48757312U,
28082752U, 28194752U, 28305344U, 28415168U, 28524992U, 28636352U, 28746304U, 48889664U, 49020736U, 49149248U, 49283008U, 49413824U, 49545152U, 49675712U,
28857152U, 28967104U, 29077184U, 29187904U, 29298496U, 29408576U, 29518912U, 49807168U, 49938368U, 50069056U, 50200256U, 50331584U, 50462656U, 50593472U,
29628992U, 29739968U, 29850176U, 29960512U, 30070336U, 30180544U, 30290752U, 50724032U, 50853952U, 50986048U, 51117632U, 51248576U, 51379904U, 51510848U,
30398912U, 30512192U, 30622784U, 30732992U, 30842176U, 30953536U, 31063744U, 51641792U, 51773248U, 51903296U, 52035136U, 52164032U, 52297664U, 52427968U,
31174336U, 31284544U, 31395136U, 31504448U, 31615552U, 31725632U, 31835072U, 52557376U, 52690112U, 52821952U, 52952896U, 53081536U, 53213504U, 53344576U,
31946176U, 32057024U, 32167232U, 32277568U, 32387008U, 32497984U, 32608832U, 53475776U, 53608384U, 53738816U, 53870528U, 54000832U, 54131776U, 54263744U,
32719168U, 32829376U, 32939584U, 33050048U, 33160768U, 33271232U, 33381184U, 54394688U, 54525248U, 54655936U, 54787904U, 54918592U, 55049152U, 55181248U,
33491648U, 33601856U, 33712576U, 33822016U, 33932992U, 34042816U, 34153024U, 55312064U, 55442752U, 55574336U, 55705024U, 55836224U, 55967168U, 56097856U,
34263104U, 34373824U, 34485056U, 34594624U, 34704832U, 34816064U, 34926272U, 56228672U, 56358592U, 56490176U, 56621888U, 56753728U, 56884928U, 57015488U,
35036224U, 35146816U, 35255104U, 35367104U, 35478208U, 35588416U, 35698496U, 57146816U, 57278272U, 57409216U, 57540416U, 57671104U, 57802432U, 57933632U,
35808832U, 35918656U, 36029888U, 36139456U, 36250688U, 36360512U, 36471104U, 58064576U, 58195264U, 58326976U, 58457408U, 58588864U, 58720192U, 58849984U,
36581696U, 36691136U, 36802112U, 36912448U, 37022912U, 37132864U, 37242944U, 58981696U, 59113024U, 59243456U, 59375552U, 59506624U, 59637568U, 59768512U,
37354048U, 37464512U, 37574848U, 37684928U, 37794752U, 37904704U, 38015552U, 59897792U, 60030016U, 60161984U, 60293056U, 60423872U, 60554432U, 60683968U,
38125888U, 38236864U, 38345792U, 38457152U, 38567744U, 38678336U, 38787776U, 60817216U, 60948032U, 61079488U, 61209664U, 61341376U, 61471936U, 61602752U,
38897216U, 39009088U, 39117632U, 39230144U, 39340352U, 39450304U, 39560384U, 61733696U, 61865792U, 61996736U, 62127808U, 62259136U, 62389568U, 62520512U,
39671488U, 39781312U, 39891392U, 40002112U, 40112704U, 40223168U, 40332608U, 62651584U, 62781632U, 62910784U, 63045056U, 63176128U, 63307072U, 63438656U,
40443968U, 40553792U, 40664768U, 40774208U, 40884416U, 40993984U, 41105984U, 63569216U, 63700928U, 63831616U, 63960896U, 64093888U, 64225088U, 64355392U,
41215424U, 41326528U, 41436992U, 41546048U, 41655872U, 41768128U, 41878336U, 64486976U, 64617664U, 64748608U, 64879424U, 65009216U, 65142464U, 65273792U,
41988928U, 42098752U, 42209344U, 42319168U, 42429248U, 42540352U, 42649792U, 65402816U, 65535424U, 65666752U, 65797696U, 65927744U, 66060224U, 66191296U,
42761024U, 42871616U, 42981824U, 43092032U, 43201856U, 43312832U, 43423552U, 66321344U, 66453056U, 66584384U, 66715328U, 66846656U, 66977728U, 67108672U,
43533632U, 43643584U, 43753792U, 43864384U, 43974976U, 44084032U, 44195392U, 67239104U, 67370432U, 67501888U, 67631296U, 67763776U, 67895104U, 68026304U,
44306368U, 44415296U, 44526016U, 44637248U, 44746816U, 44858048U, 44967872U, 68157248U, 68287936U, 68419264U, 68548288U, 68681408U, 68811968U, 68942912U,
45078848U, 45188288U, 45299264U, 45409216U, 45518272U, 45630272U, 45740224U, 69074624U, 69205568U, 69337024U, 69467584U, 69599168U, 69729472U, 69861184U,
45850432U, 45960896U, 46069696U, 46182208U, 46292416U, 46402624U, 46512064U, 69989824U, 70122944U, 70253888U, 70385344U, 70515904U, 70647232U, 70778816U,
46623296U, 46733888U, 46843712U, 46953664U, 47065024U, 47175104U, 47285696U, 70907968U, 71040832U, 71171648U, 71303104U, 71432512U, 71564992U, 71695168U,
47395904U, 47506496U, 47615296U, 47726912U, 47837632U, 47947712U, 48055232U, 71826368U, 71958464U, 72089536U, 72219712U, 72350144U, 72482624U, 72613568U,
48168128U, 48277952U, 48387392U, 48499648U, 48609472U, 48720064U, 48830272U, 72744512U, 72875584U, 73006144U, 73138112U, 73268672U, 73400128U, 73530944U,
48940096U, 49050944U, 49160896U, 49271744U, 49381568U, 49492288U, 49602752U, 73662272U, 73793344U, 73924544U, 74055104U, 74185792U, 74316992U, 74448832U,
49712576U, 49822016U, 49934272U, 50042816U, 50154304U, 50264128U, 50374336U, 74579392U, 74710976U, 74841664U, 74972864U, 75102784U, 75233344U, 75364544U,
50484416U, 50596288U, 50706752U, 50816704U, 50927168U, 51035456U, 51146944U, 75497024U, 75627584U, 75759296U, 75890624U, 76021696U, 76152256U, 76283072U,
51258176U, 51366976U, 51477824U, 51589568U, 51699776U, 51809728U, 51920576U, 76414144U, 76545856U, 76676672U, 76806976U, 76937792U, 77070016U, 77200832U,
52030016U, 52140736U, 52251328U, 52361152U, 52470592U, 52582592U, 52691776U, 77331392U, 77462464U, 77593664U, 77725376U, 77856448U, 77987776U, 78118336U,
52803136U, 52912576U, 53020736U, 53132224U, 53242688U, 53354816U, 53465536U, 78249664U, 78380992U, 78511424U, 78642496U, 78773056U, 78905152U, 79033664U,
53575232U, 53685568U, 53796544U, 53906752U, 54016832U, 54126656U, 54236992U, 79166656U, 79297472U, 79429568U, 79560512U, 79690816U, 79822784U, 79953472U,
54347456U, 54457408U, 54569024U, 54679232U, 54789184U, 54899776U, 55008832U, 80084672U, 80214208U, 80346944U, 80477632U, 80608576U, 80740288U, 80870848U,
55119296U, 55231168U, 55341248U, 55451584U, 55562048U, 55672256U, 55782208U, 81002048U, 81133504U, 81264448U, 81395648U, 81525952U, 81657536U, 81786304U,
55893184U, 56002112U, 56113216U 81919808U, 82050112U, 82181312U, 82311616U, 82443968U, 82573376U, 82705984U,
82835776U, 82967744U, 83096768U, 83230528U, 83359552U, 83491264U, 83622464U,
83753536U, 83886016U, 84015296U, 84147776U, 84277184U, 84409792U, 84540608U,
84672064U, 84803008U, 84934336U, 85065152U, 85193792U, 85326784U, 85458496U,
85589312U, 85721024U, 85851968U, 85982656U, 86112448U, 86244416U, 86370112U,
86506688U, 86637632U, 86769344U, 86900672U, 87031744U, 87162304U, 87293632U,
87424576U, 87555392U, 87687104U, 87816896U, 87947968U, 88079168U, 88211264U,
88341824U, 88473152U, 88603712U, 88735424U, 88862912U, 88996672U, 89128384U,
89259712U, 89390272U, 89521984U, 89652544U, 89783872U, 89914816U, 90045376U,
90177088U, 90307904U, 90438848U, 90569152U, 90700096U, 90832832U, 90963776U,
91093696U, 91223744U, 91356992U, 91486784U, 91618496U, 91749824U, 91880384U,
92012224U, 92143552U, 92273344U, 92405696U, 92536768U, 92666432U, 92798912U,
92926016U, 93060544U, 93192128U, 93322816U, 93453632U, 93583936U, 93715136U,
93845056U, 93977792U, 94109504U, 94240448U, 94371776U, 94501184U, 94632896U,
94764224U, 94895552U, 95023424U, 95158208U, 95287744U, 95420224U, 95550016U,
95681216U, 95811904U, 95943872U, 96075328U, 96203584U, 96337856U, 96468544U,
96599744U, 96731072U, 96860992U, 96992576U, 97124288U, 97254848U, 97385536U,
97517248U, 97647808U, 97779392U, 97910464U, 98041408U, 98172608U, 98303168U,
98434496U, 98565568U, 98696768U, 98827328U, 98958784U, 99089728U, 99220928U,
99352384U, 99482816U, 99614272U, 99745472U, 99876416U, 100007104U,
100138048U, 100267072U, 100401088U, 100529984U, 100662592U, 100791872U,
100925248U, 101056064U, 101187392U, 101317952U, 101449408U, 101580608U,
101711296U, 101841728U, 101973824U, 102104896U, 102235712U, 102366016U,
102498112U, 102628672U, 102760384U, 102890432U, 103021888U, 103153472U,
103284032U, 103415744U, 103545152U, 103677248U, 103808576U, 103939648U,
104070976U, 104201792U, 104332736U, 104462528U, 104594752U, 104725952U,
104854592U, 104988608U, 105118912U, 105247808U, 105381184U, 105511232U,
105643072U, 105774784U, 105903296U, 106037056U, 106167872U, 106298944U,
106429504U, 106561472U, 106691392U, 106822592U, 106954304U, 107085376U,
107216576U, 107346368U, 107478464U, 107609792U, 107739712U, 107872192U,
108003136U, 108131392U, 108265408U, 108396224U, 108527168U, 108657344U,
108789568U, 108920384U, 109049792U, 109182272U, 109312576U, 109444928U,
109572928U, 109706944U, 109837888U, 109969088U, 110099648U, 110230976U,
110362432U, 110492992U, 110624704U, 110755264U, 110886208U, 111017408U,
111148864U, 111279296U, 111410752U, 111541952U, 111673024U, 111803456U,
111933632U, 112066496U, 112196416U, 112328512U, 112457792U, 112590784U,
112715968U, 112852672U, 112983616U, 113114944U, 113244224U, 113376448U,
113505472U, 113639104U, 113770304U, 113901376U, 114031552U, 114163264U,
114294592U, 114425536U, 114556864U, 114687424U, 114818624U, 114948544U,
115080512U, 115212224U, 115343296U, 115473472U, 115605184U, 115736128U,
115867072U, 115997248U, 116128576U, 116260288U, 116391488U, 116522944U,
116652992U, 116784704U, 116915648U, 117046208U, 117178304U, 117308608U,
117440192U, 117569728U, 117701824U, 117833024U, 117964096U, 118094656U,
118225984U, 118357312U, 118489024U, 118617536U, 118749632U, 118882112U,
119012416U, 119144384U, 119275328U, 119406016U, 119537344U, 119668672U,
119798464U, 119928896U, 120061376U, 120192832U, 120321728U, 120454336U,
120584512U, 120716608U, 120848192U, 120979136U, 121109056U, 121241408U,
121372352U, 121502912U, 121634752U, 121764416U, 121895744U, 122027072U,
122157632U, 122289088U, 122421184U, 122550592U, 122682944U, 122813888U,
122945344U, 123075776U, 123207488U, 123338048U, 123468736U, 123600704U,
123731264U, 123861952U, 123993664U, 124124608U, 124256192U, 124386368U,
124518208U, 124649024U, 124778048U, 124911296U, 125041088U, 125173696U,
125303744U, 125432896U, 125566912U, 125696576U, 125829056U, 125958592U,
126090304U, 126221248U, 126352832U, 126483776U, 126615232U, 126746432U,
126876608U, 127008704U, 127139392U, 127270336U, 127401152U, 127532224U,
127663552U, 127794752U, 127925696U, 128055232U, 128188096U, 128319424U,
128449856U, 128581312U, 128712256U, 128843584U, 128973632U, 129103808U,
129236288U, 129365696U, 129498944U, 129629888U, 129760832U, 129892288U,
130023104U, 130154048U, 130283968U, 130416448U, 130547008U, 130678336U,
130807616U, 130939456U, 131071552U, 131202112U, 131331776U, 131464384U,
131594048U, 131727296U, 131858368U, 131987392U, 132120256U, 132250816U,
132382528U, 132513728U, 132644672U, 132774976U, 132905792U, 133038016U,
133168832U, 133299392U, 133429312U, 133562048U, 133692992U, 133823296U,
133954624U, 134086336U, 134217152U, 134348608U, 134479808U, 134607296U,
134741056U, 134872384U, 135002944U, 135134144U, 135265472U, 135396544U,
135527872U, 135659072U, 135787712U, 135921472U, 136052416U, 136182848U,
136313792U, 136444864U, 136576448U, 136707904U, 136837952U, 136970048U,
137099584U, 137232064U, 137363392U, 137494208U, 137625536U, 137755712U,
137887424U, 138018368U, 138149824U, 138280256U, 138411584U, 138539584U,
138672832U, 138804928U, 138936128U, 139066688U, 139196864U, 139328704U,
139460032U, 139590208U, 139721024U, 139852864U, 139984576U, 140115776U,
140245696U, 140376512U, 140508352U, 140640064U, 140769856U, 140902336U,
141032768U, 141162688U, 141294016U, 141426496U, 141556544U, 141687488U,
141819584U, 141949888U, 142080448U, 142212544U, 142342336U, 142474432U,
142606144U, 142736192U, 142868288U, 142997824U, 143129408U, 143258944U,
143392448U, 143523136U, 143653696U, 143785024U, 143916992U, 144045632U,
144177856U, 144309184U, 144440768U, 144570688U, 144701888U, 144832448U,
144965056U, 145096384U, 145227584U, 145358656U, 145489856U, 145620928U,
145751488U, 145883072U, 146011456U, 146144704U, 146275264U, 146407232U,
146538176U, 146668736U, 146800448U, 146931392U, 147062336U, 147193664U,
147324224U, 147455936U, 147586624U, 147717056U, 147848768U, 147979456U,
148110784U, 148242368U, 148373312U, 148503232U, 148635584U, 148766144U,
148897088U, 149028416U, 149159488U, 149290688U, 149420224U, 149551552U,
149683136U, 149814976U, 149943616U, 150076352U, 150208064U, 150338624U,
150470464U, 150600256U, 150732224U, 150862784U, 150993088U, 151125952U,
151254976U, 151388096U, 151519168U, 151649728U, 151778752U, 151911104U,
152042944U, 152174144U, 152304704U, 152435648U, 152567488U, 152698816U,
152828992U, 152960576U, 153091648U, 153222976U, 153353792U, 153484096U,
153616192U, 153747008U, 153878336U, 154008256U, 154139968U, 154270912U,
154402624U, 154533824U, 154663616U, 154795712U, 154926272U, 155057984U,
155188928U, 155319872U, 155450816U, 155580608U, 155712064U, 155843392U,
155971136U, 156106688U, 156237376U, 156367424U, 156499264U, 156630976U,
156761536U, 156892352U, 157024064U, 157155008U, 157284416U, 157415872U,
157545536U, 157677248U, 157810496U, 157938112U, 158071744U, 158203328U,
158334656U, 158464832U, 158596288U, 158727616U, 158858048U, 158988992U,
159121216U, 159252416U, 159381568U, 159513152U, 159645632U, 159776192U,
159906496U, 160038464U, 160169536U, 160300352U, 160430656U, 160563008U,
160693952U, 160822208U, 160956352U, 161086784U, 161217344U, 161349184U,
161480512U, 161611456U, 161742272U, 161873216U, 162002752U, 162135872U,
162266432U, 162397888U, 162529216U, 162660032U, 162790976U, 162922048U,
163052096U, 163184576U, 163314752U, 163446592U, 163577408U, 163707968U,
163839296U, 163969984U, 164100928U, 164233024U, 164364224U, 164494912U,
164625856U, 164756672U, 164887616U, 165019072U, 165150016U, 165280064U,
165412672U, 165543104U, 165674944U, 165805888U, 165936832U, 166067648U,
166198336U, 166330048U, 166461248U, 166591552U, 166722496U, 166854208U,
166985408U, 167116736U, 167246656U, 167378368U, 167508416U, 167641024U,
167771584U, 167903168U, 168034112U, 168164032U, 168295744U, 168427456U,
168557632U, 168688448U, 168819136U, 168951616U, 169082176U, 169213504U,
169344832U, 169475648U, 169605952U, 169738048U, 169866304U, 169999552U,
170131264U, 170262464U, 170393536U, 170524352U, 170655424U, 170782016U,
170917696U, 171048896U, 171179072U, 171310784U, 171439936U, 171573184U,
171702976U, 171835072U, 171966272U, 172097216U, 172228288U, 172359232U,
172489664U, 172621376U, 172747712U, 172883264U, 173014208U, 173144512U,
173275072U, 173407424U, 173539136U, 173669696U, 173800768U, 173931712U,
174063424U, 174193472U, 174325696U, 174455744U, 174586816U, 174718912U,
174849728U, 174977728U, 175109696U, 175242688U, 175374272U, 175504832U,
175636288U, 175765696U, 175898432U, 176028992U, 176159936U, 176291264U,
176422592U, 176552512U, 176684864U, 176815424U, 176946496U, 177076544U,
177209152U, 177340096U, 177470528U, 177600704U, 177731648U, 177864256U,
177994816U, 178126528U, 178257472U, 178387648U, 178518464U, 178650176U,
178781888U, 178912064U, 179044288U, 179174848U, 179305024U, 179436736U,
179568448U, 179698496U, 179830208U, 179960512U, 180092608U, 180223808U,
180354752U, 180485696U, 180617152U, 180748096U, 180877504U, 181009984U,
181139264U, 181272512U, 181402688U, 181532608U, 181663168U, 181795136U,
181926592U, 182057536U, 182190016U, 182320192U, 182451904U, 182582336U,
182713792U, 182843072U, 182976064U, 183107264U, 183237056U, 183368384U,
183494848U, 183631424U, 183762752U, 183893824U, 184024768U, 184154816U,
184286656U, 184417984U, 184548928U, 184680128U, 184810816U, 184941248U,
185072704U, 185203904U, 185335616U, 185465408U, 185596352U, 185727296U,
185859904U, 185989696U, 186121664U, 186252992U, 186383552U, 186514112U,
186645952U, 186777152U, 186907328U, 187037504U, 187170112U, 187301824U,
187429184U, 187562048U, 187693504U, 187825472U, 187957184U, 188087104U,
188218304U, 188349376U, 188481344U, 188609728U, 188743616U, 188874304U,
189005248U, 189136448U, 189265088U, 189396544U, 189528128U, 189660992U,
189791936U, 189923264U, 190054208U, 190182848U, 190315072U, 190447424U,
190577984U, 190709312U, 190840768U, 190971328U, 191102656U, 191233472U,
191364032U, 191495872U, 191626816U, 191758016U, 191888192U, 192020288U,
192148928U, 192282176U, 192413504U, 192542528U, 192674752U, 192805952U,
192937792U, 193068608U, 193198912U, 193330496U, 193462208U, 193592384U,
193723456U, 193854272U, 193985984U, 194116672U, 194247232U, 194379712U,
194508352U, 194641856U, 194772544U, 194900672U, 195035072U, 195166016U,
195296704U, 195428032U, 195558592U, 195690304U, 195818176U, 195952576U,
196083392U, 196214336U, 196345792U, 196476736U, 196607552U, 196739008U,
196869952U, 197000768U, 197130688U, 197262784U, 197394368U, 197523904U,
197656384U, 197787584U, 197916608U, 198049472U, 198180544U, 198310208U,
198442432U, 198573632U, 198705088U, 198834368U, 198967232U, 199097792U,
199228352U, 199360192U, 199491392U, 199621696U, 199751744U, 199883968U,
200014016U, 200146624U, 200276672U, 200408128U, 200540096U, 200671168U,
200801984U, 200933312U, 201062464U, 201194944U, 201326144U, 201457472U,
201588544U, 201719744U, 201850816U, 201981632U, 202111552U, 202244032U,
202374464U, 202505152U, 202636352U, 202767808U, 202898368U, 203030336U,
203159872U, 203292608U, 203423296U, 203553472U, 203685824U, 203816896U,
203947712U, 204078272U, 204208192U, 204341056U, 204472256U, 204603328U,
204733888U, 204864448U, 204996544U, 205125568U, 205258304U, 205388864U,
205517632U, 205650112U, 205782208U, 205913536U, 206044736U, 206176192U,
206307008U, 206434496U, 206569024U, 206700224U, 206831168U, 206961856U,
207093056U, 207223616U, 207355328U, 207486784U, 207616832U, 207749056U,
207879104U, 208010048U, 208141888U, 208273216U, 208404032U, 208534336U,
208666048U, 208796864U, 208927424U, 209059264U, 209189824U, 209321792U,
209451584U, 209582656U, 209715136U, 209845568U, 209976896U, 210106432U,
210239296U, 210370112U, 210501568U, 210630976U, 210763712U, 210894272U,
211024832U, 211156672U, 211287616U, 211418176U, 211549376U, 211679296U,
211812032U, 211942592U, 212074432U, 212204864U, 212334016U, 212467648U,
212597824U, 212727616U, 212860352U, 212991424U, 213120832U, 213253952U,
213385024U, 213515584U, 213645632U, 213777728U, 213909184U, 214040128U,
214170688U, 214302656U, 214433728U, 214564544U, 214695232U, 214826048U,
214956992U, 215089088U, 215219776U, 215350592U, 215482304U, 215613248U,
215743552U, 215874752U, 216005312U, 216137024U, 216267328U, 216399296U,
216530752U, 216661696U, 216790592U, 216923968U, 217054528U, 217183168U,
217316672U, 217448128U, 217579072U, 217709504U, 217838912U, 217972672U,
218102848U, 218233024U, 218364736U, 218496832U, 218627776U, 218759104U,
218888896U, 219021248U, 219151936U, 219281728U, 219413056U, 219545024U,
219675968U, 219807296U, 219938624U, 220069312U, 220200128U, 220331456U,
220461632U, 220592704U, 220725184U, 220855744U, 220987072U, 221117888U,
221249216U, 221378368U, 221510336U, 221642048U, 221772736U, 221904832U,
222031808U, 222166976U, 222297536U, 222428992U, 222559936U, 222690368U,
222820672U, 222953152U, 223083968U, 223213376U, 223345984U, 223476928U,
223608512U, 223738688U, 223869376U, 224001472U, 224132672U, 224262848U,
224394944U, 224524864U, 224657344U, 224788288U, 224919488U, 225050432U,
225181504U, 225312704U, 225443776U, 225574592U, 225704768U, 225834176U,
225966784U, 226097216U, 226229824U, 226360384U, 226491712U, 226623424U,
226754368U, 226885312U, 227015104U, 227147456U, 227278528U, 227409472U,
227539904U, 227669696U, 227802944U, 227932352U, 228065216U, 228196288U,
228326464U, 228457792U, 228588736U, 228720064U, 228850112U, 228981056U,
229113152U, 229243328U, 229375936U, 229505344U, 229636928U, 229769152U,
229894976U, 230030272U, 230162368U, 230292416U, 230424512U, 230553152U,
230684864U, 230816704U, 230948416U, 231079616U, 231210944U, 231342016U,
231472448U, 231603776U, 231733952U, 231866176U, 231996736U, 232127296U,
232259392U, 232388672U, 232521664U, 232652608U, 232782272U, 232914496U,
233043904U, 233175616U, 233306816U, 233438528U, 233569984U, 233699776U,
233830592U, 233962688U, 234092224U, 234221888U, 234353984U, 234485312U,
234618304U, 234749888U, 234880832U, 235011776U, 235142464U, 235274048U,
235403456U, 235535936U, 235667392U, 235797568U, 235928768U, 236057152U,
236190272U, 236322752U, 236453312U, 236583616U, 236715712U, 236846528U,
236976448U, 237108544U, 237239104U, 237371072U, 237501632U, 237630784U,
237764416U, 237895232U, 238026688U, 238157632U, 238286912U, 238419392U,
238548032U, 238681024U, 238812608U, 238941632U, 239075008U, 239206336U,
239335232U, 239466944U, 239599168U, 239730496U, 239861312U, 239992384U,
240122816U, 240254656U, 240385856U, 240516928U, 240647872U, 240779072U,
240909632U, 241040704U, 241171904U, 241302848U, 241433408U, 241565248U,
241696192U, 241825984U, 241958848U, 242088256U, 242220224U, 242352064U,
242481856U, 242611648U, 242744896U, 242876224U, 243005632U, 243138496U,
243268672U, 243400384U, 243531712U, 243662656U, 243793856U, 243924544U,
244054592U, 244187072U, 244316608U, 244448704U, 244580032U, 244710976U,
244841536U, 244972864U, 245104448U, 245233984U, 245365312U, 245497792U,
245628736U, 245759936U, 245889856U, 246021056U, 246152512U, 246284224U,
246415168U, 246545344U, 246675904U, 246808384U, 246939584U, 247070144U,
247199552U, 247331648U, 247463872U, 247593536U, 247726016U, 247857088U,
247987648U, 248116928U, 248249536U, 248380736U, 248512064U, 248643008U,
248773312U, 248901056U, 249036608U, 249167552U, 249298624U, 249429184U,
249560512U, 249692096U, 249822784U, 249954112U, 250085312U, 250215488U,
250345792U, 250478528U, 250608704U, 250739264U, 250870976U, 251002816U,
251133632U, 251263552U, 251395136U, 251523904U, 251657792U, 251789248U,
251919424U, 252051392U, 252182464U, 252313408U, 252444224U, 252575552U,
252706624U, 252836032U, 252968512U, 253099712U, 253227584U, 253361728U,
253493056U, 253623488U, 253754432U, 253885504U, 254017216U, 254148032U,
254279488U, 254410432U, 254541376U, 254672576U, 254803264U, 254933824U,
255065792U, 255196736U, 255326528U, 255458752U, 255589952U, 255721408U,
255851072U, 255983296U, 256114624U, 256244416U, 256374208U, 256507712U,
256636096U, 256768832U, 256900544U, 257031616U, 257162176U, 257294272U,
257424448U, 257555776U, 257686976U, 257818432U, 257949632U, 258079552U,
258211136U, 258342464U, 258473408U, 258603712U, 258734656U, 258867008U,
258996544U, 259127744U, 259260224U, 259391296U, 259522112U, 259651904U,
259784384U, 259915328U, 260045888U, 260175424U, 260308544U, 260438336U,
260570944U, 260700992U, 260832448U, 260963776U, 261092672U, 261226304U,
261356864U, 261487936U, 261619648U, 261750592U, 261879872U, 262011968U,
262143424U, 262274752U, 262404416U, 262537024U, 262667968U, 262799296U,
262928704U, 263061184U, 263191744U, 263322944U, 263454656U, 263585216U,
263716672U, 263847872U, 263978944U, 264108608U, 264241088U, 264371648U,
264501184U, 264632768U, 264764096U, 264895936U, 265024576U, 265158464U,
265287488U, 265418432U, 265550528U, 265681216U, 265813312U, 265943488U,
266075968U, 266206144U, 266337728U, 266468032U, 266600384U, 266731072U,
266862272U, 266993344U, 267124288U, 267255616U, 267386432U, 267516992U,
267648704U, 267777728U, 267910592U, 268040512U, 268172096U, 268302784U,
268435264U, 268566208U, 268696256U, 268828096U, 268959296U, 269090368U,
269221312U, 269352256U, 269482688U, 269614784U, 269745856U, 269876416U,
270007616U, 270139328U, 270270272U, 270401216U, 270531904U, 270663616U,
270791744U, 270924736U, 271056832U, 271186112U, 271317184U, 271449536U,
271580992U, 271711936U, 271843136U, 271973056U, 272105408U, 272236352U,
272367296U, 272498368U, 272629568U, 272759488U, 272891456U, 273022784U,
273153856U, 273284672U, 273415616U, 273547072U, 273677632U, 273808448U,
273937088U, 274071488U, 274200896U, 274332992U, 274463296U, 274595392U,
274726208U, 274857536U, 274988992U, 275118656U, 275250496U, 275382208U,
275513024U, 275643968U, 275775296U, 275906368U, 276037184U, 276167872U,
276297664U, 276429376U, 276560576U, 276692672U, 276822976U, 276955072U,
277085632U, 277216832U, 277347008U, 277478848U, 277609664U, 277740992U,
277868608U, 278002624U, 278134336U, 278265536U, 278395328U, 278526784U,
278657728U, 278789824U, 278921152U, 279052096U, 279182912U, 279313088U,
279443776U, 279576256U, 279706048U, 279838528U, 279969728U, 280099648U,
280230976U, 280361408U, 280493632U, 280622528U, 280755392U, 280887104U,
281018176U, 281147968U, 281278912U, 281411392U, 281542592U, 281673152U,
281803712U, 281935552U, 282066496U, 282197312U, 282329024U, 282458816U,
282590272U, 282720832U, 282853184U, 282983744U, 283115072U, 283246144U,
283377344U, 283508416U, 283639744U, 283770304U, 283901504U, 284032576U,
284163136U, 284294848U, 284426176U, 284556992U, 284687296U, 284819264U,
284950208U, 285081536U
}; };
#ifdef __cplusplus #ifdef __cplusplus

71
libethash/ethash.h

@ -1,19 +1,20 @@
/* /*
This file is part of cpp-ethereum. This file is part of ethash.
cpp-ethereum is free software: you can redistribute it and/or modify ethash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful, ethash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>. along with ethash. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** @file ethash.h /** @file ethash.h
* @date 2015 * @date 2015
*/ */
@ -25,26 +26,17 @@
#include <stddef.h> #include <stddef.h>
#include "compiler.h" #include "compiler.h"
#define ETHASH_REVISION 19 #define REVISION 23
#define ETHASH_DAGSIZE_BYTES_INIT 1073741824U // 2**30 #define DATASET_BYTES_INIT 1073741824U // 2**30
#define ETHASH_DAG_GROWTH 113000000U #define DATASET_BYTES_GROWTH 8388608U // 2**23
#define ETHASH_EPOCH_LENGTH 30000U #define CACHE_BYTES_INIT 1073741824U // 2**24
#define ETHASH_MIX_BYTES 128 #define CACHE_BYTES_GROWTH 131072U // 2**17
#define ETHASH_DAG_PARENTS 256
#define ETHASH_CACHE_ROUNDS 3
#define ETHASH_ACCESSES 64
// *********************
// TODO: Remove once other code moved over to compliant naming scheme.
#define REVISION 19
#define DAGSIZE_BYTES_INIT 1073741824U // 2**30
#define DAG_GROWTH 113000000U
#define EPOCH_LENGTH 30000U #define EPOCH_LENGTH 30000U
#define MIX_BYTES 128 #define MIX_BYTES 128
#define DAG_PARENTS 256 #define HASH_BYTES 64
#define DATASET_PARENTS 256
#define CACHE_ROUNDS 3 #define CACHE_ROUNDS 3
#define ACCESSES 64 #define ACCESSES 64
// *********************
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -70,35 +62,54 @@ static inline void ethash_params_init(ethash_params *params, const uint32_t bloc
} }
typedef struct ethash_cache { typedef struct ethash_cache {
void *mem; void *mem;
} ethash_cache; } ethash_cache;
void ethash_mkcache(ethash_cache *cache, ethash_params const *params, const uint8_t seed[32]); void ethash_mkcache(ethash_cache *cache, ethash_params const *params, const uint8_t seed[32]);
void ethash_compute_full_data(void *mem, ethash_params const *params, ethash_cache const *cache); void ethash_compute_full_data(void *mem, ethash_params const *params, ethash_cache const *cache);
void ethash_full(ethash_return_value *ret, void const *full_mem, ethash_params const *params, const uint8_t header_hash[32], const uint64_t nonce); void ethash_full(ethash_return_value *ret, void const *full_mem, ethash_params const *params, const uint8_t header_hash[32], const uint64_t nonce);
void ethash_light(ethash_return_value *ret, ethash_cache const *cache, ethash_params const *params, const uint8_t header_hash[32], const uint64_t nonce); void ethash_light(ethash_return_value *ret, ethash_cache const *cache, ethash_params const *params, const uint8_t header_hash[32], const uint64_t nonce);
void ethash_get_seedhash(uint8_t seedhash[32], const uint32_t block_number);
static inline void ethash_prep_light(void *cache, ethash_params const *params, const uint8_t seed[32]) {
ethash_cache c;
c.mem = cache;
ethash_mkcache(&c, params, seed);
}
static inline void ethash_compute_light(ethash_return_value *ret, void const *cache, ethash_params const *params, const uint8_t header_hash[32], const uint64_t nonce) {
ethash_cache c;
c.mem = (void *) cache;
ethash_light(ret, &c, params, header_hash, nonce);
}
static inline void ethash_prep_full(void *full, ethash_params const *params, void const *cache) {
ethash_cache c;
c.mem = (void *) cache;
ethash_compute_full_data(full, params, &c);
}
static inline void ethash_prep_light(void *cache, ethash_params const *params, const uint8_t seed[32]) { ethash_cache c; c.mem = cache; ethash_mkcache(&c, params, seed); } static inline void ethash_compute_full(ethash_return_value *ret, void const *full, ethash_params const *params, const uint8_t header_hash[32], const uint64_t nonce) {
static inline void ethash_compute_light(ethash_return_value *ret, void const *cache, ethash_params const *params, const uint8_t header_hash[32], const uint64_t nonce) { ethash_cache c; c.mem = (void*)cache; ethash_light(ret, &c, params, header_hash, nonce); } ethash_full(ret, full, params, header_hash, nonce);
static inline void ethash_prep_full(void *full, ethash_params const *params, void const *cache) { ethash_cache c; c.mem = (void*)cache; ethash_compute_full_data(full, params, &c); } }
static inline void ethash_compute_full(ethash_return_value *ret, void const *full, ethash_params const *params, const uint8_t header_hash[32], const uint64_t nonce) { ethash_full(ret, full, params, header_hash, nonce); }
// Returns if hash is less than or equal to difficulty
static inline int ethash_check_difficulty( static inline int ethash_check_difficulty(
const uint8_t hash[32], const uint8_t hash[32],
const uint8_t difficulty[32]) { const uint8_t difficulty[32]) {
// Difficulty is big endian // Difficulty is big endian
for (int i = 0; i < 32; i++) { for (int i = 0; i < 32; i++) {
if (hash[i] == difficulty[i]) continue; if (hash[i] == difficulty[i]) continue;
return hash[i] < difficulty[i]; return hash[i] < difficulty[i];
} }
return 1; return 1;
} }
void ethash_quick_hash( int ethash_quick_check_difficulty(
uint8_t return_hash[32],
const uint8_t header_hash[32], const uint8_t header_hash[32],
const uint64_t nonce, const uint64_t nonce,
const uint8_t mix_hash[32]); const uint8_t mix_hash[32],
const uint8_t difficulty[32]);
#ifdef __cplusplus #ifdef __cplusplus
} }

100
libethash/internal.c

@ -1,12 +1,12 @@
/* /*
This file is part of cpp-ethereum. This file is part of ethash.
cpp-ethereum is free software: you can redistribute it and/or modify ethash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful, ethash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
@ -14,7 +14,7 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>. along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** @file dash.cpp /** @file internal.c
* @author Tim Hughes <tim@twistedfury.com> * @author Tim Hughes <tim@twistedfury.com>
* @author Matthew Wampler-Doty * @author Matthew Wampler-Doty
* @date 2015 * @date 2015
@ -38,12 +38,12 @@
#endif // WITH_CRYPTOPP #endif // WITH_CRYPTOPP
size_t ethash_get_datasize(const uint32_t block_number) { size_t ethash_get_datasize(const uint32_t block_number) {
assert(block_number / EPOCH_LENGTH < 500); assert(block_number / EPOCH_LENGTH < 2048);
return dag_sizes[block_number / EPOCH_LENGTH]; return dag_sizes[block_number / EPOCH_LENGTH];
} }
size_t ethash_get_cachesize(const uint32_t block_number) { size_t ethash_get_cachesize(const uint32_t block_number) {
assert(block_number / EPOCH_LENGTH < 500); assert(block_number / EPOCH_LENGTH < 2048);
return cache_sizes[block_number / EPOCH_LENGTH]; return cache_sizes[block_number / EPOCH_LENGTH];
} }
@ -55,7 +55,7 @@ void static ethash_compute_cache_nodes(
ethash_params const *params, ethash_params const *params,
const uint8_t seed[32]) { const uint8_t seed[32]) {
assert((params->cache_size % sizeof(node)) == 0); assert((params->cache_size % sizeof(node)) == 0);
uint32_t const num_nodes = (uint32_t)(params->cache_size / sizeof(node)); uint32_t const num_nodes = (uint32_t) (params->cache_size / sizeof(node));
SHA3_512(nodes[0].bytes, seed, 32); SHA3_512(nodes[0].bytes, seed, 32);
@ -68,10 +68,9 @@ void static ethash_compute_cache_nodes(
uint32_t const idx = nodes[i].words[0] % num_nodes; uint32_t const idx = nodes[i].words[0] % num_nodes;
node data; node data;
data = nodes[(num_nodes - 1 + i) % num_nodes]; data = nodes[(num_nodes - 1 + i) % num_nodes];
for (unsigned w = 0; w != NODE_WORDS; ++w) for (unsigned w = 0; w != NODE_WORDS; ++w) {
{ data.words[w] ^= nodes[idx].words[w];
data.words[w] ^= nodes[idx].words[w]; }
}
SHA3_512(nodes[i].bytes, data.bytes, sizeof(data)); SHA3_512(nodes[i].bytes, data.bytes, sizeof(data));
} }
} }
@ -86,7 +85,7 @@ void static ethash_compute_cache_nodes(
} }
void ethash_mkcache( void ethash_mkcache(
ethash_cache *cache, ethash_cache *cache,
ethash_params const *params, ethash_params const *params,
const uint8_t seed[32]) { const uint8_t seed[32]) {
node *nodes = (node *) cache->mem; node *nodes = (node *) cache->mem;
@ -99,13 +98,13 @@ void ethash_calculate_dag_item(
const struct ethash_params *params, const struct ethash_params *params,
const struct ethash_cache *cache) { const struct ethash_cache *cache) {
uint32_t num_parent_nodes = (uint32_t)(params->cache_size / sizeof(node)); uint32_t num_parent_nodes = (uint32_t) (params->cache_size / sizeof(node));
node const *cache_nodes = (node const *) cache->mem; node const *cache_nodes = (node const *) cache->mem;
node const *init = &cache_nodes[node_index % num_parent_nodes]; node const *init = &cache_nodes[node_index % num_parent_nodes];
memcpy(ret, init, sizeof(node)); memcpy(ret, init, sizeof(node));
ret->words[0] ^= node_index; ret->words[0] ^= node_index;
SHA3_512(ret->bytes, ret->bytes, sizeof(node)); SHA3_512(ret->bytes, ret->bytes, sizeof(node));
#if defined(_M_X64) && ENABLE_SSE #if defined(_M_X64) && ENABLE_SSE
__m128i const fnv_prime = _mm_set1_epi32(FNV_PRIME); __m128i const fnv_prime = _mm_set1_epi32(FNV_PRIME);
@ -115,12 +114,11 @@ void ethash_calculate_dag_item(
__m128i xmm3 = ret->xmm[3]; __m128i xmm3 = ret->xmm[3];
#endif #endif
for (unsigned i = 0; i != DAG_PARENTS; ++i) for (unsigned i = 0; i != DATASET_PARENTS; ++i) {
{ uint32_t parent_index = ((node_index ^ i) * FNV_PRIME ^ ret->words[i % NODE_WORDS]) % num_parent_nodes;
uint32_t parent_index = ((node_index ^ i)*FNV_PRIME ^ ret->words[i % NODE_WORDS]) % num_parent_nodes;
node const *parent = &cache_nodes[parent_index]; node const *parent = &cache_nodes[parent_index];
#if defined(_M_X64) && ENABLE_SSE #if defined(_M_X64) && ENABLE_SSE
{ {
xmm0 = _mm_mullo_epi32(xmm0, fnv_prime); xmm0 = _mm_mullo_epi32(xmm0, fnv_prime);
xmm1 = _mm_mullo_epi32(xmm1, fnv_prime); xmm1 = _mm_mullo_epi32(xmm1, fnv_prime);
@ -143,10 +141,10 @@ void ethash_calculate_dag_item(
ret->words[w] = fnv_hash(ret->words[w], parent->words[w]); ret->words[w] = fnv_hash(ret->words[w], parent->words[w]);
} }
} }
#endif #endif
} }
SHA3_512(ret->bytes, ret->bytes, sizeof(node)); SHA3_512(ret->bytes, ret->bytes, sizeof(node));
} }
void ethash_compute_full_data( void ethash_compute_full_data(
@ -164,7 +162,7 @@ void ethash_compute_full_data(
} }
static void ethash_hash( static void ethash_hash(
ethash_return_value * ret, ethash_return_value *ret,
node const *full_nodes, node const *full_nodes,
ethash_cache const *cache, ethash_cache const *cache,
ethash_params const *params, ethash_params const *params,
@ -174,7 +172,7 @@ static void ethash_hash(
assert((params->full_size % MIX_WORDS) == 0); assert((params->full_size % MIX_WORDS) == 0);
// pack hash and nonce together into first 40 bytes of s_mix // pack hash and nonce together into first 40 bytes of s_mix
assert(sizeof(node)*8 == 512); assert(sizeof(node) * 8 == 512);
node s_mix[MIX_NODES + 1]; node s_mix[MIX_NODES + 1];
memcpy(s_mix[0].bytes, header_hash, 32); memcpy(s_mix[0].bytes, header_hash, 32);
@ -193,23 +191,21 @@ static void ethash_hash(
} }
#endif #endif
node* const mix = s_mix + 1; node *const mix = s_mix + 1;
for (unsigned w = 0; w != MIX_WORDS; ++w) { for (unsigned w = 0; w != MIX_WORDS; ++w) {
mix->words[w] = s_mix[0].words[w % NODE_WORDS]; mix->words[w] = s_mix[0].words[w % NODE_WORDS];
} }
unsigned const unsigned const
page_size = sizeof(uint32_t) * MIX_WORDS, page_size = sizeof(uint32_t) * MIX_WORDS,
num_full_pages = (unsigned)(params->full_size / page_size); num_full_pages = (unsigned) (params->full_size / page_size);
for (unsigned i = 0; i != ACCESSES; ++i) for (unsigned i = 0; i != ACCESSES; ++i) {
{ uint32_t const index = ((s_mix->words[0] ^ i) * FNV_PRIME ^ mix->words[i % MIX_WORDS]) % num_full_pages;
uint32_t const index = ((s_mix->words[0] ^ i)*FNV_PRIME ^ mix->words[i % MIX_WORDS]) % num_full_pages;
for (unsigned n = 0; n != MIX_NODES; ++n) for (unsigned n = 0; n != MIX_NODES; ++n) {
{ const node *dag_node = &full_nodes[MIX_NODES * index + n];
const node * dag_node = &full_nodes[MIX_NODES * index + n];
if (!full_nodes) { if (!full_nodes) {
node tmp_node; node tmp_node;
@ -217,7 +213,7 @@ static void ethash_hash(
dag_node = &tmp_node; dag_node = &tmp_node;
} }
#if defined(_M_X64) && ENABLE_SSE #if defined(_M_X64) && ENABLE_SSE
{ {
__m128i fnv_prime = _mm_set1_epi32(FNV_PRIME); __m128i fnv_prime = _mm_set1_epi32(FNV_PRIME);
__m128i xmm0 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[0]); __m128i xmm0 = _mm_mullo_epi32(fnv_prime, mix[n].xmm[0]);
@ -235,20 +231,19 @@ static void ethash_hash(
mix[n].words[w] = fnv_hash(mix[n].words[w], dag_node->words[w]); mix[n].words[w] = fnv_hash(mix[n].words[w], dag_node->words[w]);
} }
} }
#endif #endif
} }
} }
// compress mix // compress mix
for (unsigned w = 0; w != MIX_WORDS; w += 4) for (unsigned w = 0; w != MIX_WORDS; w += 4) {
{ uint32_t reduction = mix->words[w + 0];
uint32_t reduction = mix->words[w+0]; reduction = reduction * FNV_PRIME ^ mix->words[w + 1];
reduction = reduction*FNV_PRIME ^ mix->words[w+1]; reduction = reduction * FNV_PRIME ^ mix->words[w + 2];
reduction = reduction*FNV_PRIME ^ mix->words[w+2]; reduction = reduction * FNV_PRIME ^ mix->words[w + 3];
reduction = reduction*FNV_PRIME ^ mix->words[w+3]; mix->words[w / 4] = reduction;
mix->words[w/4] = reduction; }
}
#if BYTE_ORDER != LITTLE_ENDIAN #if BYTE_ORDER != LITTLE_ENDIAN
for (unsigned w = 0; w != MIX_WORDS/4; ++w) { for (unsigned w = 0; w != MIX_WORDS/4; ++w) {
@ -258,7 +253,7 @@ static void ethash_hash(
memcpy(ret->mix_hash, mix->bytes, 32); memcpy(ret->mix_hash, mix->bytes, 32);
// final Keccak hash // final Keccak hash
SHA3_256(ret->result, s_mix->bytes, 64+32); // Keccak-256(s + compressed_mix) SHA3_256(ret->result, s_mix->bytes, 64 + 32); // Keccak-256(s + compressed_mix)
} }
void ethash_quick_hash( void ethash_quick_hash(
@ -267,7 +262,7 @@ void ethash_quick_hash(
const uint64_t nonce, const uint64_t nonce,
const uint8_t mix_hash[32]) { const uint8_t mix_hash[32]) {
uint8_t buf[64+32]; uint8_t buf[64 + 32];
memcpy(buf, header_hash, 32); memcpy(buf, header_hash, 32);
#if BYTE_ORDER != LITTLE_ENDIAN #if BYTE_ORDER != LITTLE_ENDIAN
nonce = fix_endian64(nonce); nonce = fix_endian64(nonce);
@ -275,7 +270,14 @@ void ethash_quick_hash(
memcpy(&(buf[32]), &nonce, 8); memcpy(&(buf[32]), &nonce, 8);
SHA3_512(buf, buf, 40); SHA3_512(buf, buf, 40);
memcpy(&(buf[64]), mix_hash, 32); memcpy(&(buf[64]), mix_hash, 32);
SHA3_256(return_hash, buf, 64+32); SHA3_256(return_hash, buf, 64 + 32);
}
void ethash_get_seedhash(uint8_t seedhash[32], const uint32_t block_number) {
memset(seedhash, 0, 32);
const uint32_t epochs = block_number / EPOCH_LENGTH;
for (uint32_t i = 0; i < epochs; ++i)
SHA3_256(seedhash, seedhash, 32);
} }
int ethash_quick_check_difficulty( int ethash_quick_check_difficulty(
@ -289,10 +291,10 @@ int ethash_quick_check_difficulty(
return ethash_check_difficulty(return_hash, difficulty); return ethash_check_difficulty(return_hash, difficulty);
} }
void ethash_full(ethash_return_value * ret, void const *full_mem, ethash_params const *params, const uint8_t previous_hash[32], const uint64_t nonce) { void ethash_full(ethash_return_value *ret, void const *full_mem, ethash_params const *params, const uint8_t previous_hash[32], const uint64_t nonce) {
ethash_hash(ret, (node const *) full_mem, NULL, params, previous_hash, nonce); ethash_hash(ret, (node const *) full_mem, NULL, params, previous_hash, nonce);
} }
void ethash_light(ethash_return_value * ret, ethash_cache const *cache, ethash_params const *params, const uint8_t previous_hash[32], const uint64_t nonce) { void ethash_light(ethash_return_value *ret, ethash_cache const *cache, ethash_params const *params, const uint8_t previous_hash[32], const uint64_t nonce) {
ethash_hash(ret, NULL, cache, params, previous_hash, nonce); ethash_hash(ret, NULL, cache, params, previous_hash, nonce);
} }

6
libethash/internal.h

@ -37,6 +37,12 @@ void ethash_calculate_dag_item(
ethash_cache const *cache ethash_cache const *cache
); );
void ethash_quick_hash(
uint8_t return_hash[32],
const uint8_t header_hash[32],
const uint64_t nonce,
const uint8_t mix_hash[32]);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

8
libethash/sha3_cryptopp.cpp

@ -1,18 +1,18 @@
/* /*
This file is part of cpp-ethereum. This file is part of ethash.
cpp-ethereum is free software: you can redistribute it and/or modify ethash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful, ethash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>. along with ethash. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** @file sha3.cpp /** @file sha3.cpp

8
libethash/util.h

@ -1,18 +1,18 @@
/* /*
This file is part of cpp-ethereum. This file is part of ethash.
cpp-ethereum is free software: you can redistribute it and/or modify ethash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful, ethash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>. along with ethash. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** @file util.h /** @file util.h
* @author Tim Hughes <tim@twistedfury.com> * @author Tim Hughes <tim@twistedfury.com>

Loading…
Cancel
Save