-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathMinerTest.java
More file actions
127 lines (101 loc) · 12.1 KB
/
Copy pathMinerTest.java
File metadata and controls
127 lines (101 loc) · 12.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package com.iota.curl;
import org.junit.Assert;
import org.junit.Test;
import java.math.BigInteger;
import java.util.Arrays;
/**
* Created by gianluigi.davassi on 13.10.16.
*/
public class MinerTest {
private static String in = "XWGITHVPWBSPFRNQUEYLQETIVCJKRIIDKUZ9CSXBH9BKKUZCOGNLPKZXZHEGGPPWLMQHKDDAHZBSFQTNCOEJMSOLMHRPRHNWEUUAEHJURKTFWZQPSBOJGCJHWUPQSYKTVLVFKFMNQWQ9DJPBFJGXKKPYRDXDRYFBY9BIGHEYNTX9VGJTCIRVYIQHPCMCIESIUCGKMMIWHBLNC9BC9JR9CLYCPZTXPNQJOXPUDJUZEQTGWVOIEWCHPAY9EPZYCHFRQPHRZ9UZACWRJBSMRKBC9JJQSHJHPPEEYBFPHTZRGVVLJHDZ9JGLXJARNHMLWIYSUXNXRALYCMPMYOAMCKWHKNNWZPYNFTOUQORGVJRTVUYG9MX9DHLGHXFATETWQJUFPL9FLVRKEXDMVWQJOLTIXHJKBDGAJPJAHPQHT9TMWIL9QNIUQ9FBIIFDA9GUPVKXRPDRHG9IAHPJI9JRMTBJYOGVP9HZM9PNWXNFKKBSFQCOEDPDAUNEZRAYCAMBZBDVTDCANUNGZTAOAXFEUMQMSCOQF9EEVXXTXEB9IVY9DVGHBEXHMDHGJXUMIDIDIPDIAPAOGEKLVBTUFTFRRSKSAXTONHVCLGYOUUKORNGKABDQBTDSPZOWK9QD9VCKTOGMYGIHZ9YT9WYHDONULDLLSILTEUGRLKRAQFXAXNDRGECKTAERXMYOMDADLSPIVLWWNMQQBY9FHRB9LOKZNVUNVHT9I9IOLGHXOTBGAVNMR9QFCDPLDGVFGTLAEOEIDXAPSFNHJIBLMXEDLQQBGEUYKLMKRGVFFJ9AFEFILQBRWHWOOVECRMRQTSEIUHDGXRJFVZXBXSTMQA9KDIEUF9HZXYRZVZYVVEPSKDGEYWBVSEVMUDJSGYIHTPNSPWWDFII9VHAPTJHWXOWTWWSVEEKIXXUPRTTIIOEOQHHROGJIZ9Y9DSQRUVDTDHFBZMIAFTYOBJUBCOFMDTOVDWRSGCIEE9YKJCTJFZGLTFNZHNNPSKDHZZUCNDSJN9RBUOR9MYHNVLTZR9ZPHLCGXUOMGLRXCNKYMPKUFITURZCHHRKNGUZHWV9EQGNEBEXPMIRAZC9JMQL9BMDWK9NXRDEVUETPKINKDQNIJ9GJNQZJEPBDIVBJIXQWYAZCMEKFD9RFA9HUXCUBHAAVPOBRVFXRNEXDNTAIFTYEZADSWMXWEHSUKDVCCMATIDCIOFUVQYNMOXKVIDNXLGUCKQN9WVJDMHRXTHVRSHJTYFUOGKTSTDXYLM9EGYYUPMBA9JASZKKPDATFKNGLUD9IQLWFRPYQYSENKYIVXICCIOTATRVUSDKCYUA9JRUMSTMMBBHFZVCPJICNRGQZIGHEFGFMXV9VBMBMLEFJSGRDNBVODMLKCOIGDIYGCQCAUDJNVBFZGMFBV9TGOWKIFIPUOKIMJNQEBWPYVFXHCKOULMPMBN9QKWGXNM9HOJOSBJDNJJKDJWKJUWVAHNJIORACILRICNHQOQNAA9UIUTABUYOCRHLSNEKKF9BJZKX9VCAOPXOUGYFLWDZYXRVMHAXTCGJFQFOMJMSHRICSYVLSHKYWPTRLXMN9TTNBZLUTLXIDHUDTOIJAYPJ9I9JRFAHT9WOLXSJ9LOKCFXGQFZWJKNEJWURGSNBVCZYAUOBDVANKBTDCEU9W9JDIYAYVGPNGAF9WFFJL9NEYEPMJQLIMDWDVNRXOSZQAGISZIBUKTNDUHVNHOCQ9EIMWSKLREYSAKEVPUYZKMSCEGCRZVBNXXXJSEBSESONCZDNKVKSPSUUYBTDRVAIFGFYXKYRSBOFHYSQNYBQWPRQV99GBRNXWNHBEWTEECUTWPYCEGNQVBXDHLTFLVROOWHYX9TVGZVVFAZJZONCLNTEFZRBPCWPGPIKNQLQMZE9Q9CPPROOMR9QSRSRBSGMFMQ9NX9DNOOGSYRECEADHOVEBOBJTVARVDQYV9PHSDFFQODUISDRWUTAFLGQJNFIAOHOMBNPVTILCSMRTZUTPHYV9NGLXCJKKUPBOJDBDG9OSBCFHUJDXZBSBNLEKWCYPVINVRNWSDDMDPRTYHOSTSADVDRWEXPROSUYPVYNVKOBZDXUAKKVIJQKZE9JZN9EVUG9LTFDANQMUBRXBHAPL9USL9INWZCVCBFPKACSNYSOITLJAWIMCTNSCHQ9JZMYMPRGKQLABOLIEORLCNBJQMFMEAUONZMWKAT9ECRHNIRFSFRIHMGZISIJMOT9HLMOVUOGNTBXHHFZNGFLITAQRCAGBFBFOBBSTYSZMQPV99999999999999999999DOMIOTATESTWOW9999999999999PUPOYVD99A99999999C99999999MZWEZVBGFKSBSHDXAVGAJEUHCSKSRJSHCGRGGOKIPWMPTKSIHRFBEBWWYOSUGME9THEKAFFOORCRADGAK999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999";
private static String out = "XWGITHVPWBSPFRNQUEYLQETIVCJKRIIDKUZ9CSXBH9BKKUZCOGNLPKZXZHEGGPPWLMQHKDDAHZBSFQTNCOEJMSOLMHRPRHNWEUUAEHJURKTFWZQPSBOJGCJHWUPQSYKTVLVFKFMNQWQ9DJPBFJGXKKPYRDXDRYFBY9BIGHEYNTX9VGJTCIRVYIQHPCMCIESIUCGKMMIWHBLNC9BC9JR9CLYCPZTXPNQJOXPUDJUZEQTGWVOIEWCHPAY9EPZYCHFRQPHRZ9UZACWRJBSMRKBC9JJQSHJHPPEEYBFPHTZRGVVLJHDZ9JGLXJARNHMLWIYSUXNXRALYCMPMYOAMCKWHKNNWZPYNFTOUQORGVJRTVUYG9MX9DHLGHXFATETWQJUFPL9FLVRKEXDMVWQJOLTIXHJKBDGAJPJAHPQHT9TMWIL9QNIUQ9FBIIFDA9GUPVKXRPDRHG9IAHPJI9JRMTBJYOGVP9HZM9PNWXNFKKBSFQCOEDPDAUNEZRAYCAMBZBDVTDCANUNGZTAOAXFEUMQMSCOQF9EEVXXTXEB9IVY9DVGHBEXHMDHGJXUMIDIDIPDIAPAOGEKLVBTUFTFRRSKSAXTONHVCLGYOUUKORNGKABDQBTDSPZOWK9QD9VCKTOGMYGIHZ9YT9WYHDONULDLLSILTEUGRLKRAQFXAXNDRGECKTAERXMYOMDADLSPIVLWWNMQQBY9FHRB9LOKZNVUNVHT9I9IOLGHXOTBGAVNMR9QFCDPLDGVFGTLAEOEIDXAPSFNHJIBLMXEDLQQBGEUYKLMKRGVFFJ9AFEFILQBRWHWOOVECRMRQTSEIUHDGXRJFVZXBXSTMQA9KDIEUF9HZXYRZVZYVVEPSKDGEYWBVSEVMUDJSGYIHTPNSPWWDFII9VHAPTJHWXOWTWWSVEEKIXXUPRTTIIOEOQHHROGJIZ9Y9DSQRUVDTDHFBZMIAFTYOBJUBCOFMDTOVDWRSGCIEE9YKJCTJFZGLTFNZHNNPSKDHZZUCNDSJN9RBUOR9MYHNVLTZR9ZPHLCGXUOMGLRXCNKYMPKUFITURZCHHRKNGUZHWV9EQGNEBEXPMIRAZC9JMQL9BMDWK9NXRDEVUETPKINKDQNIJ9GJNQZJEPBDIVBJIXQWYAZCMEKFD9RFA9HUXCUBHAAVPOBRVFXRNEXDNTAIFTYEZADSWMXWEHSUKDVCCMATIDCIOFUVQYNMOXKVIDNXLGUCKQN9WVJDMHRXTHVRSHJTYFUOGKTSTDXYLM9EGYYUPMBA9JASZKKPDATFKNGLUD9IQLWFRPYQYSENKYIVXICCIOTATRVUSDKCYUA9JRUMSTMMBBHFZVCPJICNRGQZIGHEFGFMXV9VBMBMLEFJSGRDNBVODMLKCOIGDIYGCQCAUDJNVBFZGMFBV9TGOWKIFIPUOKIMJNQEBWPYVFXHCKOULMPMBN9QKWGXNM9HOJOSBJDNJJKDJWKJUWVAHNJIORACILRICNHQOQNAA9UIUTABUYOCRHLSNEKKF9BJZKX9VCAOPXOUGYFLWDZYXRVMHAXTCGJFQFOMJMSHRICSYVLSHKYWPTRLXMN9TTNBZLUTLXIDHUDTOIJAYPJ9I9JRFAHT9WOLXSJ9LOKCFXGQFZWJKNEJWURGSNBVCZYAUOBDVANKBTDCEU9W9JDIYAYVGPNGAF9WFFJL9NEYEPMJQLIMDWDVNRXOSZQAGISZIBUKTNDUHVNHOCQ9EIMWSKLREYSAKEVPUYZKMSCEGCRZVBNXXXJSEBSESONCZDNKVKSPSUUYBTDRVAIFGFYXKYRSBOFHYSQNYBQWPRQV99GBRNXWNHBEWTEECUTWPYCEGNQVBXDHLTFLVROOWHYX9TVGZVVFAZJZONCLNTEFZRBPCWPGPIKNQLQMZE9Q9CPPROOMR9QSRSRBSGMFMQ9NX9DNOOGSYRECEADHOVEBOBJTVARVDQYV9PHSDFFQODUISDRWUTAFLGQJNFIAOHOMBNPVTILCSMRTZUTPHYV9NGLXCJKKUPBOJDBDG9OSBCFHUJDXZBSBNLEKWCYPVINVRNWSDDMDPRTYHOSTSADVDRWEXPROSUYPVYNVKOBZDXUAKKVIJQKZE9JZN9EVUG9LTFDANQMUBRXBHAPL9USL9INWZCVCBFPKACSNYSOITLJAWIMCTNSCHQ9JZMYMPRGKQLABOLIEORLCNBJQMFMEAUONZMWKAT9ECRHNIRFSFRIHMGZISIJMOT9HLMOVUOGNTBXHHFZNGFLITAQRCAGBFBFOBBSTYSZMQPV99999999999999999999DOMIOTATESTWOW9999999999999PUPOYVD99A99999999C99999999MZWEZVBGFKSBSHDXAVGAJEUHCSKSRJSHCGRGGOKIPWMPTKSIHRFBEBWWYOSUGME9THEKAFFOORCRADGAKAUA999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999";
@Test
public void singleThreadShouldMatchExpectedForDifficulty5() {
// Characterization: the single-thread search scans nonces in ascending
// order, so it returns the smallest valid nonce. If this equals the
// multithread expected string, then `out` already encodes the smallest
// nonce and the deterministic-minimum refactor will preserve it.
String mined = new IotaCurlMiner().doCurlPowSingleThread(in, 5);
Assert.assertEquals(out, mined);
}
@Test
public void shouldMine() {
final IotaCurlMiner iotacurl = new IotaCurlMiner();
String mined = iotacurl.iotaCurlProofOfWork(in, 5);
System.err.println("Mined: ");
System.err.println("in: " + in);
System.err.println("ou: " + mined);
Assert.assertEquals(out, mined);
}
@Test
public void shouldMine9() {
String out = "XWGITHVPWBSPFRNQUEYLQETIVCJKRIIDKUZ9CSXBH9BKKUZCOGNLPKZXZHEGGPPWLMQHKDDAHZBSFQTNCOEJMSOLMHRPRHNWEUUAEHJURKTFWZQPSBOJGCJHWUPQSYKTVLVFKFMNQWQ9DJPBFJGXKKPYRDXDRYFBY9BIGHEYNTX9VGJTCIRVYIQHPCMCIESIUCGKMMIWHBLNC9BC9JR9CLYCPZTXPNQJOXPUDJUZEQTGWVOIEWCHPAY9EPZYCHFRQPHRZ9UZACWRJBSMRKBC9JJQSHJHPPEEYBFPHTZRGVVLJHDZ9JGLXJARNHMLWIYSUXNXRALYCMPMYOAMCKWHKNNWZPYNFTOUQORGVJRTVUYG9MX9DHLGHXFATETWQJUFPL9FLVRKEXDMVWQJOLTIXHJKBDGAJPJAHPQHT9TMWIL9QNIUQ9FBIIFDA9GUPVKXRPDRHG9IAHPJI9JRMTBJYOGVP9HZM9PNWXNFKKBSFQCOEDPDAUNEZRAYCAMBZBDVTDCANUNGZTAOAXFEUMQMSCOQF9EEVXXTXEB9IVY9DVGHBEXHMDHGJXUMIDIDIPDIAPAOGEKLVBTUFTFRRSKSAXTONHVCLGYOUUKORNGKABDQBTDSPZOWK9QD9VCKTOGMYGIHZ9YT9WYHDONULDLLSILTEUGRLKRAQFXAXNDRGECKTAERXMYOMDADLSPIVLWWNMQQBY9FHRB9LOKZNVUNVHT9I9IOLGHXOTBGAVNMR9QFCDPLDGVFGTLAEOEIDXAPSFNHJIBLMXEDLQQBGEUYKLMKRGVFFJ9AFEFILQBRWHWOOVECRMRQTSEIUHDGXRJFVZXBXSTMQA9KDIEUF9HZXYRZVZYVVEPSKDGEYWBVSEVMUDJSGYIHTPNSPWWDFII9VHAPTJHWXOWTWWSVEEKIXXUPRTTIIOEOQHHROGJIZ9Y9DSQRUVDTDHFBZMIAFTYOBJUBCOFMDTOVDWRSGCIEE9YKJCTJFZGLTFNZHNNPSKDHZZUCNDSJN9RBUOR9MYHNVLTZR9ZPHLCGXUOMGLRXCNKYMPKUFITURZCHHRKNGUZHWV9EQGNEBEXPMIRAZC9JMQL9BMDWK9NXRDEVUETPKINKDQNIJ9GJNQZJEPBDIVBJIXQWYAZCMEKFD9RFA9HUXCUBHAAVPOBRVFXRNEXDNTAIFTYEZADSWMXWEHSUKDVCCMATIDCIOFUVQYNMOXKVIDNXLGUCKQN9WVJDMHRXTHVRSHJTYFUOGKTSTDXYLM9EGYYUPMBA9JASZKKPDATFKNGLUD9IQLWFRPYQYSENKYIVXICCIOTATRVUSDKCYUA9JRUMSTMMBBHFZVCPJICNRGQZIGHEFGFMXV9VBMBMLEFJSGRDNBVODMLKCOIGDIYGCQCAUDJNVBFZGMFBV9TGOWKIFIPUOKIMJNQEBWPYVFXHCKOULMPMBN9QKWGXNM9HOJOSBJDNJJKDJWKJUWVAHNJIORACILRICNHQOQNAA9UIUTABUYOCRHLSNEKKF9BJZKX9VCAOPXOUGYFLWDZYXRVMHAXTCGJFQFOMJMSHRICSYVLSHKYWPTRLXMN9TTNBZLUTLXIDHUDTOIJAYPJ9I9JRFAHT9WOLXSJ9LOKCFXGQFZWJKNEJWURGSNBVCZYAUOBDVANKBTDCEU9W9JDIYAYVGPNGAF9WFFJL9NEYEPMJQLIMDWDVNRXOSZQAGISZIBUKTNDUHVNHOCQ9EIMWSKLREYSAKEVPUYZKMSCEGCRZVBNXXXJSEBSESONCZDNKVKSPSUUYBTDRVAIFGFYXKYRSBOFHYSQNYBQWPRQV99GBRNXWNHBEWTEECUTWPYCEGNQVBXDHLTFLVROOWHYX9TVGZVVFAZJZONCLNTEFZRBPCWPGPIKNQLQMZE9Q9CPPROOMR9QSRSRBSGMFMQ9NX9DNOOGSYRECEADHOVEBOBJTVARVDQYV9PHSDFFQODUISDRWUTAFLGQJNFIAOHOMBNPVTILCSMRTZUTPHYV9NGLXCJKKUPBOJDBDG9OSBCFHUJDXZBSBNLEKWCYPVINVRNWSDDMDPRTYHOSTSADVDRWEXPROSUYPVYNVKOBZDXUAKKVIJQKZE9JZN9EVUG9LTFDANQMUBRXBHAPL9USL9INWZCVCBFPKACSNYSOITLJAWIMCTNSCHQ9JZMYMPRGKQLABOLIEORLCNBJQMFMEAUONZMWKAT9ECRHNIRFSFRIHMGZISIJMOT9HLMOVUOGNTBXHHFZNGFLITAQRCAGBFBFOBBSTYSZMQPV99999999999999999999DOMIOTATESTWOW9999999999999PUPOYVD99A99999999C99999999MZWEZVBGFKSBSHDXAVGAJEUHCSKSRJSHCGRGGOKIPWMPTKSIHRFBEBWWYOSUGME9THEKAFFOORCRADGAKADQA99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999";
String mined = new IotaCurlMiner().iotaCurlProofOfWork(in, 9);
Assert.assertEquals(out, mined);
}
@Test
public void singleThreadShouldMatchMultiThreadForDifficulty9() {
// Parity invariant: both strategies must return the smallest valid nonce.
String single = new IotaCurlMiner().doCurlPowSingleThread(in, 9);
String multi = new IotaCurlMiner().iotaCurlProofOfWork(in, 9);
Assert.assertEquals(single, multi);
}
@Test
public void shouldReturnSmallestNonceAtDifficultyZero() {
// At difficulty 0 every nonce satisfies the (empty) check, so the
// smallest valid nonce is 0 and the transaction is returned unchanged.
// The old behaviour returned nonce 32 because doWork used 0 as both a
// valid result and the "not found" sentinel.
String mined = new IotaCurlMiner().iotaCurlProofOfWork(in, 0);
Assert.assertEquals(in, mined);
}
@Test
public void multiThreadShouldBeDeterministicAcrossRuns() {
IotaCurlMiner a = new IotaCurlMiner();
IotaCurlMiner b = new IotaCurlMiner();
Assert.assertEquals(a.iotaCurlProofOfWork(in, 0), b.iotaCurlProofOfWork(in, 0));
}
@Test
public void workerCountShouldBeAtLeastOne() {
Assert.assertEquals(1, IotaCurlMiner.workerCount(1)); // single-core must still run
Assert.assertEquals(1, IotaCurlMiner.workerCount(2));
Assert.assertEquals(15, IotaCurlMiner.workerCount(16));
}
@Test(expected = IllegalArgumentException.class)
public void powShouldRejectTransactionShorterThanRequired() {
new IotaCurlMiner().doCurlPowSingleThread("ABC", 5);
}
@Test
public void shouldShift() {
// java: 3 << 62 = -4611686018427387904
// c: 3 << 62 = 13835058055282163712
System.err.println(BigInteger.valueOf(3).shiftLeft(62));
// only way to compare such big numbers (2 << 62) using literals is through strings.
Assert.assertEquals("13835058055282163712", BigInteger.valueOf(3).shiftLeft(62).toString());
}
private static final long [] doTransResult = {0, 708, 912, 340, 2336, 2668, 2384, 3224, 3968, 52, 868, 472, 1012, 1352, 3916, 3820, 3868, 2712, 140, 480};
@Test
public void shouldTransform() {
int SIZE = 729;
final IotaCurlMiner iotacurl = new IotaCurlMiner();
long[] state = new long[SIZE];
for (int i = 0; i<SIZE;i++) {
state[i] = (i << 2);
}
System.err.println(Arrays.toString(state));
iotacurl.doPowTransform(state);
System.err.println(Arrays.toString(state));
System.err.println(Arrays.toString(doTransResult));
// ref 0, 588, 3224, 3644, 4004, 3172, 780, 888, 844, 3328, 552, 980, 424,
Long[] arr = Arrays.stream(state)
.limit(20)
.map(Long::new)
.boxed()
.toArray(Long[]::new);
Long[] res = Arrays.stream(doTransResult)
.map(Long::new)
.boxed()
.toArray(Long[]::new);
Assert.assertTrue(Arrays.equals(arr, res));
}
}