From 33b5ea89aff6135e3e456cc87de09eec88528052 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Mon, 29 Apr 2019 18:46:46 +0300 Subject: [PATCH 01/42] test: bls tests moved to new format --- .../org/ethereum/beacon/test/BlsTests.java | 106 +++--- .../org/ethereum/beacon/test/TestUtils.java | 123 ++++-- .../test/runner/bls/BlsAggregatePubKeys.java | 14 +- .../test/runner/bls/BlsAggregateSigs.java | 18 +- .../test/runner/bls/BlsMessageHash.java | 27 +- .../runner/bls/BlsMessageHashCompressed.java | 18 +- .../test/runner/bls/BlsPrivateToPublic.java | 10 +- .../test/runner/bls/BlsSignMessage.java | 17 +- .../test/type/SpecConstantsDataMerged.java | 1 + .../beacon/test/type/TestSkeleton.java | 61 +-- .../type/bls/BlsAggregatePubKeysCase.java | 38 ++ .../type/bls/BlsAggregatePubKeysTest.java | 22 ++ .../test/type/bls/BlsAggregateSigsCase.java | 38 ++ .../test/type/bls/BlsAggregateSigsTest.java | 22 ++ .../test/type/bls/BlsMessageHashCase.java | 58 +++ .../bls/BlsMessageHashCompressedCase.java | 32 ++ .../bls/BlsMessageHashCompressedTest.java | 22 ++ .../test/type/bls/BlsMessageHashTest.java | 22 ++ .../test/type/bls/BlsPrivateToPublicCase.java | 30 ++ .../test/type/bls/BlsPrivateToPublicTest.java | 22 ++ .../test/type/bls/BlsSignMessageCase.java | 42 +++ .../test/type/bls/BlsSignMessageTest.java | 22 ++ .../beacon/test/type/bls/BlsTest.java | 353 ------------------ 23 files changed, 616 insertions(+), 502 deletions(-) create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregatePubKeysCase.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregatePubKeysTest.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregateSigsCase.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregateSigsTest.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCase.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCompressedCase.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCompressedTest.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashTest.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsPrivateToPublicCase.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsPrivateToPublicTest.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsSignMessageCase.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsSignMessageTest.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/type/bls/BlsTest.java diff --git a/test/src/test/java/org/ethereum/beacon/test/BlsTests.java b/test/src/test/java/org/ethereum/beacon/test/BlsTests.java index 83557d226..81c04e683 100644 --- a/test/src/test/java/org/ethereum/beacon/test/BlsTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/BlsTests.java @@ -1,14 +1,17 @@ package org.ethereum.beacon.test; -import org.ethereum.beacon.consensus.BeaconChainSpec; import org.ethereum.beacon.test.runner.bls.BlsAggregatePubKeys; import org.ethereum.beacon.test.runner.bls.BlsAggregateSigs; import org.ethereum.beacon.test.runner.bls.BlsMessageHash; import org.ethereum.beacon.test.runner.bls.BlsMessageHashCompressed; import org.ethereum.beacon.test.runner.bls.BlsPrivateToPublic; import org.ethereum.beacon.test.runner.bls.BlsSignMessage; -import org.ethereum.beacon.test.type.bls.BlsTest; -import org.ethereum.beacon.test.type.UniversalTest; +import org.ethereum.beacon.test.type.bls.BlsAggregatePubKeysTest; +import org.ethereum.beacon.test.type.bls.BlsAggregateSigsTest; +import org.ethereum.beacon.test.type.bls.BlsMessageHashCompressedTest; +import org.ethereum.beacon.test.type.bls.BlsMessageHashTest; +import org.ethereum.beacon.test.type.bls.BlsPrivateToPublicTest; +import org.ethereum.beacon.test.type.bls.BlsSignMessageTest; import org.junit.Ignore; import org.junit.Test; @@ -20,26 +23,23 @@ public class BlsTests extends TestUtils { private String TESTS_DIR = "bls"; - private String FILENAME = "test_bls.yml"; - private BeaconChainSpec spec; - - public BlsTests() { - this.spec = BeaconChainSpec.createWithDefaults(); - } @Test @Ignore("Fixtures uses Jacobian coordinates, testBlsMessageHashCompressed covers same cases") public void testBlsMessageHash() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, FILENAME); - BlsTest test = readTest(getResourceFile(testFilePath.toString()), BlsTest.class); + Path testFilePath = + Paths.get(PATH_TO_TESTS, TESTS_DIR, "msg_hash_g2_uncompressed", "g2_uncompressed.yaml"); + BlsMessageHashTest test = + readTest(getResourceFile(testFilePath.toString()), BlsMessageHashTest.class); Optional errors = runAllCasesInTest( - test.buildBlsMessageHashTest(), - testCase -> { - BlsMessageHash testRunner = new BlsMessageHash(testCase, spec); + test, + input -> { + BlsMessageHash testRunner = new BlsMessageHash(input.getValue0(), input.getValue1()); return testRunner.run(); }, - UniversalTest.class); + BlsMessageHashTest.class, + true); if (errors.isPresent()) { System.out.println(errors.get()); fail(); @@ -48,17 +48,20 @@ public void testBlsMessageHash() { @Test public void testBlsMessageHashCompressed() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, FILENAME); - BlsTest test = readTest(getResourceFile(testFilePath.toString()), BlsTest.class); + Path testFilePath = + Paths.get(PATH_TO_TESTS, TESTS_DIR, "msg_hash_g2_compressed", "g2_compressed.yaml"); + BlsMessageHashCompressedTest test = + readTest(getResourceFile(testFilePath.toString()), BlsMessageHashCompressedTest.class); Optional errors = runAllCasesInTest( - test.buildBlsMessageHashCompressedTest(), - testCase -> { + test, + input -> { BlsMessageHashCompressed testRunner = - new BlsMessageHashCompressed(testCase, spec); + new BlsMessageHashCompressed(input.getValue0(), input.getValue1()); return testRunner.run(); }, - UniversalTest.class); + BlsMessageHashCompressedTest.class, + true); if (errors.isPresent()) { System.out.println(errors.get()); fail(); @@ -67,16 +70,19 @@ public void testBlsMessageHashCompressed() { @Test public void testBlsPrivateToPublic() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, FILENAME); - BlsTest test = readTest(getResourceFile(testFilePath.toString()), BlsTest.class); + Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "priv_to_pub", "priv_to_pub.yaml"); + BlsPrivateToPublicTest test = + readTest(getResourceFile(testFilePath.toString()), BlsPrivateToPublicTest.class); Optional errors = runAllCasesInTest( - test.buildBlsPrivateToPublicTest(), - testCase -> { - BlsPrivateToPublic testRunner = new BlsPrivateToPublic(testCase, spec); + test, + input -> { + BlsPrivateToPublic testRunner = + new BlsPrivateToPublic(input.getValue0(), input.getValue1()); return testRunner.run(); }, - UniversalTest.class); + BlsPrivateToPublicTest.class, + true); if (errors.isPresent()) { System.out.println(errors.get()); fail(); @@ -85,16 +91,18 @@ public void testBlsPrivateToPublic() { @Test public void testBlsSignMessage() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, FILENAME); - BlsTest test = readTest(getResourceFile(testFilePath.toString()), BlsTest.class); + Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "sign_msg", "sign_msg.yaml"); + BlsSignMessageTest test = + readTest(getResourceFile(testFilePath.toString()), BlsSignMessageTest.class); Optional errors = runAllCasesInTest( - test.buildBlsSignMessageTest(), - testCase -> { - BlsSignMessage testRunner = new BlsSignMessage(testCase, spec); + test, + input -> { + BlsSignMessage testRunner = new BlsSignMessage(input.getValue0(), input.getValue1()); return testRunner.run(); }, - UniversalTest.class); + BlsSignMessageTest.class, + true); if (errors.isPresent()) { System.out.println(errors.get()); fail(); @@ -103,16 +111,20 @@ public void testBlsSignMessage() { @Test public void testBlsAggregateSigs() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, FILENAME); - BlsTest test = readTest(getResourceFile(testFilePath.toString()), BlsTest.class); + Path testFilePath = + Paths.get(PATH_TO_TESTS, TESTS_DIR, "aggregate_sigs", "aggregate_sigs.yaml"); + BlsAggregateSigsTest test = + readTest(getResourceFile(testFilePath.toString()), BlsAggregateSigsTest.class); Optional errors = runAllCasesInTest( - test.buildBlsAggregateSigsTest(), - testCase -> { - BlsAggregateSigs testRunner = new BlsAggregateSigs(testCase, spec); + test, + input -> { + BlsAggregateSigs testRunner = + new BlsAggregateSigs(input.getValue0(), input.getValue1()); return testRunner.run(); }, - UniversalTest.class); + BlsAggregateSigsTest.class, + true); if (errors.isPresent()) { System.out.println(errors.get()); fail(); @@ -121,16 +133,20 @@ public void testBlsAggregateSigs() { @Test public void testBlsAggregatePubKeys() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, FILENAME); - BlsTest test = readTest(getResourceFile(testFilePath.toString()), BlsTest.class); + Path testFilePath = + Paths.get(PATH_TO_TESTS, TESTS_DIR, "aggregate_pubkeys", "aggregate_pubkeys.yaml"); + BlsAggregatePubKeysTest test = + readTest(getResourceFile(testFilePath.toString()), BlsAggregatePubKeysTest.class); Optional errors = runAllCasesInTest( - test.buildBlsAggregatePubKeysTest(), - testCase -> { - BlsAggregatePubKeys testRunner = new BlsAggregatePubKeys(testCase, spec); + test, + input -> { + BlsAggregatePubKeys testRunner = + new BlsAggregatePubKeys(input.getValue0(), input.getValue1()); return testRunner.run(); }, - UniversalTest.class); + BlsAggregatePubKeysTest.class, + true); if (errors.isPresent()) { System.out.println(errors.get()); fail(); diff --git a/test/src/test/java/org/ethereum/beacon/test/TestUtils.java b/test/src/test/java/org/ethereum/beacon/test/TestUtils.java index 2daf4f9f0..fd16fc2a2 100644 --- a/test/src/test/java/org/ethereum/beacon/test/TestUtils.java +++ b/test/src/test/java/org/ethereum/beacon/test/TestUtils.java @@ -1,12 +1,23 @@ package org.ethereum.beacon.test; -import static org.junit.Assert.assertFalse; - import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.google.common.base.Charsets; import com.google.common.io.CharStreams; import com.google.common.io.Resources; +import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.emulator.config.chainspec.SpecBuilder; +import org.ethereum.beacon.emulator.config.chainspec.SpecConstantsData; +import org.ethereum.beacon.emulator.config.chainspec.SpecData; +import org.ethereum.beacon.emulator.config.chainspec.SpecDataUtils; +import org.ethereum.beacon.emulator.config.chainspec.SpecHelpersData; +import org.ethereum.beacon.test.type.NamedTestCase; +import org.ethereum.beacon.test.type.SpecConstantsDataMerged; +import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.TestSkeleton; +import org.ethereum.beacon.util.Objects; +import org.javatuples.Pair; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -27,14 +38,17 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; -import org.ethereum.beacon.test.type.NamedTestCase; -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.test.type.TestSkeleton; + +import static org.junit.Assert.assertFalse; public class TestUtils { + private static final String GIT_COMMAND = + "git submodule init & git submodule update --recursive --remote"; static ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory()); - String PATH_TO_TESTS = "eth2.0-tests"; - private static final String GIT_COMMAND = "git submodule init & git submodule update --recursive --remote"; + static String PATH_TO_TESTS = "eth2.0-spec-tests/tests"; + static String PATH_TO_CONFIGS = "eth2.0-spec-tests/configs"; + static String SPEC_CONFIG_DIR = "constant_presets"; + static String FORK_CONFIG_DIR = "fork_timelines"; static File getResourceFile(String relativePath) { try { @@ -68,6 +82,10 @@ static List getResourceFiles(String dir) { } static V readTest(File file, Class clazz) { + return readYamlFile(file, clazz); + } + + private static V readYamlFile(File file, Class clazz) { String content; try (InputStream inputStream = new FileInputStream(file); InputStreamReader streamReader = new InputStreamReader(inputStream, Charsets.UTF_8)) { @@ -79,45 +97,63 @@ static V readTest(File file, Class clazz) String.format("Error reading contents of file: %s", file.toPath().toString()), e); } - V test = readTest(content, clazz); - - return test; + return parseYamlData(content, clazz); } static Optional runAllTestsInFile( - File file, Function> testCaseRunner, Class clazz) { + File file, + Function, Optional> testCaseRunner, + Class clazz) { return runAllTestsInFile(file, testCaseRunner, clazz, Collections.emptySet()); } static Optional runAllTestsInFile( - File file, Function> testCaseRunner, Class clazz, + File file, + Function, Optional> testCaseRunner, + Class clazz, Collection exclusions) { V test = readTest(file, clazz); - return runAllCasesInTest(test, testCaseRunner, clazz, exclusions); + return runAllCasesInTest(test, testCaseRunner, clazz, exclusions, false); } + static Optional runAllCasesInTest( - V test, Function> testCaseRunner, Class clazz) { - return runAllCasesInTest(test, testCaseRunner, clazz, Collections.emptySet()); + V test, + Function, Optional> testCaseRunner, + Class clazz) { + return runAllCasesInTest(test, testCaseRunner, clazz, Collections.emptySet(), false); } static Optional runAllCasesInTest( - V test, Function> testCaseRunner, Class clazz, - Collection exclusions) { + V test, + Function, Optional> testCaseRunner, + Class clazz, + boolean isBlsVerified) { + return runAllCasesInTest(test, testCaseRunner, clazz, Collections.emptySet(), isBlsVerified); + } + + static Optional runAllCasesInTest( + V test, + Function, Optional> testCaseRunner, + Class clazz, + Collection exclusions, + boolean isBlsVerified) { StringBuilder errors = new StringBuilder(); AtomicInteger failed = new AtomicInteger(0); int total = 0; for (TestCase testCase : test.getTestCases()) { ++total; - String name = testCase instanceof NamedTestCase - ? ((NamedTestCase) testCase).getName() - : "Test #" + (total - 1); + String name = + testCase instanceof NamedTestCase + ? ((NamedTestCase) testCase).getName() + : "Test #" + (total - 1); if (exclusions.contains(name)) { System.out.println(String.format("[ ] %s ignored", name)); continue; } long s = System.nanoTime(); - Optional err = runTestCase(testCase, test, testCaseRunner); + BeaconChainSpec spec = loadSpecByName(test.getConfig(), isBlsVerified); + Optional err = runTestCase(testCase, spec, test, testCaseRunner); long completionTime = System.nanoTime() - s; if (err.isPresent()) { @@ -143,8 +179,11 @@ static Optional runAllCasesInTest( } static Optional runTestCase( - TestCase testCase, V test, Function> testCaseRunner) { - Optional testCaseErrors = testCaseRunner.apply(testCase); + TestCase testCase, + BeaconChainSpec spec, + V test, + Function, Optional> testCaseRunner) { + Optional testCaseErrors = testCaseRunner.apply(Pair.with(testCase, spec)); if (testCaseErrors.isPresent()) { StringBuilder errors = new StringBuilder(); errors @@ -163,7 +202,7 @@ static Optional runTestCase( return Optional.empty(); } - static V readTest(String content, Class clazz) { + static V parseYamlData(String content, Class clazz) { try { return yamlMapper.readValue(content, clazz); } catch (IOException e) { @@ -174,20 +213,50 @@ static V readTest(String content, Class clazz) { } static void runTestsInResourceDir( - Path dir, Class testsType, Function> testCaseRunner) { + Path dir, + Class testsType, + Function, Optional> testCaseRunner) { runTestsInResourceDirImpl(dir, testsType, testCaseRunner, Collections.emptySet()); } static void runTestsInResourceDir( Path dir, Class testsType, - Function> testCaseRunner, + Function, Optional> testCaseRunner, Ignored ignored) { runTestsInResourceDirImpl(dir, testsType, testCaseRunner, ignored.testCases); } + static BeaconChainSpec loadSpecByName(String name, boolean isBlsVerified) { + Path configPath = Paths.get(PATH_TO_CONFIGS, SPEC_CONFIG_DIR, name + ".yaml"); + File config = getResourceFile(configPath.toString()); + + SpecConstantsData specConstantsDataRaw = readYamlFile(config, SpecConstantsDataMerged.class); + // TODO: Is it required? Yaml should contain all the fields + SpecConstantsData specConstantsData; + try { + specConstantsData = + Objects.copyProperties( + SpecDataUtils.createSpecConstantsData(BeaconChainSpec.DEFAULT_CONSTANTS), + specConstantsDataRaw); + } catch (Exception ex) { + throw new RuntimeException("Cannot merge spec constants with default settings"); + } + + SpecHelpersData specHelpersData = new SpecHelpersData(); + specHelpersData.setBlsVerify(isBlsVerified); + + SpecData specData = new SpecData(); + specData.setSpecHelpersOptions(specHelpersData); + specData.setSpecConstants(specConstantsData); + + return new SpecBuilder().withSpec(specData).buildSpec(); + } + private static void runTestsInResourceDirImpl( - Path dir, Class testsType, Function> testCaseRunner, + Path dir, + Class testsType, + Function, Optional> testCaseRunner, Collection exclusions) { List files = getResourceFiles(dir.toString()); boolean failed = false; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java index 5d88e8ebb..3e3846dc9 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java @@ -3,8 +3,8 @@ import org.ethereum.beacon.consensus.BeaconChainSpec; import org.ethereum.beacon.core.types.BLSPubkey; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.bls.BlsTest; import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.bls.BlsAggregatePubKeysCase; import tech.pegasys.artemis.util.bytes.Bytes48; import java.util.ArrayList; @@ -14,19 +14,20 @@ import static org.ethereum.beacon.test.SilentAsserts.assertHexStrings; /** - * TestRunner for {@link BlsTest.BlsAggregatePubKeysCase} + * TestRunner for {@link BlsAggregatePubKeysCase} * *

Aggregates public keys */ public class BlsAggregatePubKeys implements Runner { - private BlsTest.BlsAggregatePubKeysCase testCase; + private BlsAggregatePubKeysCase testCase; private BeaconChainSpec spec; public BlsAggregatePubKeys(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof BlsTest.BlsAggregatePubKeysCase)) { + if (!(testCase instanceof BlsAggregatePubKeysCase)) { throw new RuntimeException("TestCase runner accepts only BlsAggregatePubKeysCase as input!"); } - this.testCase = (BlsTest.BlsAggregatePubKeysCase) testCase; + this.testCase = (BlsAggregatePubKeysCase) testCase; + assert spec.isBlsVerify(); this.spec = spec; } @@ -38,7 +39,6 @@ public Optional run() { } return assertHexStrings( - testCase.getOutput(), - spec.bls_aggregate_pubkeys(pubkeys).getEncodedBytes().toString()); + testCase.getOutput(), spec.bls_aggregate_pubkeys(pubkeys).getEncodedBytes().toString()); } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java index d23b82cd2..14e2b0a75 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java @@ -6,8 +6,8 @@ import org.ethereum.beacon.crypto.BLS381; import org.ethereum.beacon.crypto.bls.milagro.MilagroCodecs; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.bls.BlsTest; import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.bls.BlsAggregateSigsCase; import tech.pegasys.artemis.util.bytes.Bytes96; import java.util.ArrayList; @@ -17,19 +17,19 @@ import static org.ethereum.beacon.test.SilentAsserts.assertHexStrings; /** - * TestRunner for {@link BlsTest.BlsAggregateSigsCase} + * TestRunner for {@link BlsAggregateSigsCase} * *

Aggregates signatures */ public class BlsAggregateSigs implements Runner { - private BlsTest.BlsAggregateSigsCase testCase; + private BlsAggregateSigsCase testCase; private BeaconChainSpec spec; public BlsAggregateSigs(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof BlsTest.BlsAggregateSigsCase)) { + if (!(testCase instanceof BlsAggregateSigsCase)) { throw new RuntimeException("TestCase runner accepts only BlsAggregateSigsCase as input!"); } - this.testCase = (BlsTest.BlsAggregateSigsCase) testCase; + this.testCase = (BlsAggregateSigsCase) testCase; this.spec = spec; } @@ -40,8 +40,12 @@ public Optional run() { signatures.add(blsSignature); } ECP2 product = new ECP2(); - signatures.forEach((s) -> {product.add(MilagroCodecs.G2.decode(s));}); + signatures.forEach( + (s) -> { + product.add(MilagroCodecs.G2.decode(s)); + }); - return assertHexStrings(testCase.getOutput(), BLS381.Signature.create(product).getEncoded().toString()); + return assertHexStrings( + testCase.getOutput(), BLS381.Signature.create(product).getEncoded().toString()); } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHash.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHash.java index 17cf8482e..a540cc147 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHash.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHash.java @@ -6,8 +6,8 @@ import org.ethereum.beacon.crypto.MessageParameters; import org.ethereum.beacon.crypto.bls.milagro.MilagroMessageMapper; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.bls.BlsTest; import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.bls.BlsMessageHashCase; import tech.pegasys.artemis.ethereum.core.Hash32; import tech.pegasys.artemis.util.bytes.Bytes32; import tech.pegasys.artemis.util.bytes.Bytes8; @@ -19,24 +19,20 @@ import static org.ethereum.beacon.test.SilentAsserts.assertLists; /** - * TestRunner for {@link BlsTest.BlsMessageHashCase} + * TestRunner for {@link BlsMessageHashCase} * - *

Hash message - * Input: - * - Message as bytes - * - domain as uint64 - * Output: - * - Message hash as a G2 point (uncompressed) + *

Hash message Input: - Message as bytes - domain as uint64 Output: - Message hash as a G2 point + * (uncompressed) */ public class BlsMessageHash implements Runner { - private BlsTest.BlsMessageHashCase testCase; + private BlsMessageHashCase testCase; private BeaconChainSpec spec; public BlsMessageHash(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof BlsTest.BlsMessageHashCase)) { + if (!(testCase instanceof BlsMessageHashCase)) { throw new RuntimeException("TestCase runner accepts only BlsMessageHashCase as input!"); } - this.testCase = (BlsTest.BlsMessageHashCase) testCase; + this.testCase = (BlsMessageHashCase) testCase; this.spec = spec; } @@ -49,12 +45,9 @@ public Optional run() { MilagroMessageMapper milagroMessageMapper = new MilagroMessageMapper(); ECP2 point = milagroMessageMapper.map(messageParameters); - Optional compareX = - assertLists(testCase.getOutput().get(0), serialize(point.getX())); - Optional compareY = - assertLists(testCase.getOutput().get(1), serialize(point.getY())); - Optional compareZ = - assertLists(testCase.getOutput().get(2), serialize(point.getz())); + Optional compareX = assertLists(testCase.getOutput().get(0), serialize(point.getX())); + Optional compareY = assertLists(testCase.getOutput().get(1), serialize(point.getY())); + Optional compareZ = assertLists(testCase.getOutput().get(2), serialize(point.getz())); if (!compareX.isPresent() && !compareY.isPresent() && !compareZ.isPresent()) { return Optional.empty(); diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHashCompressed.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHashCompressed.java index 61b0e0aed..2b2d92b80 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHashCompressed.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHashCompressed.java @@ -6,8 +6,8 @@ import org.ethereum.beacon.crypto.bls.milagro.MilagroCodecs; import org.ethereum.beacon.crypto.bls.milagro.MilagroMessageMapper; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.bls.BlsTest; import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.bls.BlsMessageHashCompressedCase; import tech.pegasys.artemis.ethereum.core.Hash32; import tech.pegasys.artemis.util.bytes.Bytes32; import tech.pegasys.artemis.util.bytes.Bytes48; @@ -19,25 +19,21 @@ import static org.ethereum.beacon.test.SilentAsserts.assertHexStrings; /** - * TestRunner for {@link BlsTest.BlsMessageHashCompressedCase} + * TestRunner for {@link BlsMessageHashCompressedCase} * - *

Hash message - * Input: - * - Message as bytes - * - domain as uint64 - * Output: - * - Message hash as a compressed G2 point + *

Hash message Input: - Message as bytes - domain as uint64 Output: - Message hash as a + * compressed G2 point */ public class BlsMessageHashCompressed implements Runner { - private BlsTest.BlsMessageHashCompressedCase testCase; + private BlsMessageHashCompressedCase testCase; private BeaconChainSpec spec; public BlsMessageHashCompressed(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof BlsTest.BlsMessageHashCompressedCase)) { + if (!(testCase instanceof BlsMessageHashCompressedCase)) { throw new RuntimeException( "TestCase runner accepts only BlsMessageHashCompressedCase as input!"); } - this.testCase = (BlsTest.BlsMessageHashCompressedCase) testCase; + this.testCase = (BlsMessageHashCompressedCase) testCase; this.spec = spec; } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java index 07904ac1c..adae8dd03 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java @@ -3,8 +3,8 @@ import org.ethereum.beacon.consensus.BeaconChainSpec; import org.ethereum.beacon.crypto.BLS381; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.bls.BlsTest; import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.bls.BlsPrivateToPublicCase; import tech.pegasys.artemis.util.bytes.Bytes32; import java.util.Optional; @@ -12,19 +12,19 @@ import static org.ethereum.beacon.test.SilentAsserts.assertHexStrings; /** - * TestRunner for {@link BlsTest.BlsPrivateToPublicCase} + * TestRunner for {@link BlsPrivateToPublicCase} * *

Verifies public key creation using private key */ public class BlsPrivateToPublic implements Runner { - private BlsTest.BlsPrivateToPublicCase testCase; + private BlsPrivateToPublicCase testCase; private BeaconChainSpec spec; public BlsPrivateToPublic(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof BlsTest.BlsPrivateToPublicCase)) { + if (!(testCase instanceof BlsPrivateToPublicCase)) { throw new RuntimeException("TestCase runner accepts only BlsPrivateToPublicCase as input!"); } - this.testCase = (BlsTest.BlsPrivateToPublicCase) testCase; + this.testCase = (BlsPrivateToPublicCase) testCase; this.spec = spec; } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsSignMessage.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsSignMessage.java index f1baed81b..5ced460db 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsSignMessage.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsSignMessage.java @@ -1,34 +1,35 @@ package org.ethereum.beacon.test.runner.bls; -import static org.ethereum.beacon.test.SilentAsserts.assertEquals; - -import java.util.Optional; import org.ethereum.beacon.consensus.BeaconChainSpec; import org.ethereum.beacon.core.types.BLSSignature; import org.ethereum.beacon.crypto.BLS381; import org.ethereum.beacon.crypto.MessageParameters; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.bls.BlsTest; import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.bls.BlsSignMessageCase; import tech.pegasys.artemis.ethereum.core.Hash32; import tech.pegasys.artemis.util.bytes.Bytes32; import tech.pegasys.artemis.util.bytes.Bytes8; import tech.pegasys.artemis.util.bytes.Bytes96; +import java.util.Optional; + +import static org.ethereum.beacon.test.SilentAsserts.assertEquals; + /** - * TestRunner for {@link BlsTest.BlsSignMessageCase} + * TestRunner for {@link BlsSignMessageCase} * *

Signs message by signer defined by private key */ public class BlsSignMessage implements Runner { - private BlsTest.BlsSignMessageCase testCase; + private BlsSignMessageCase testCase; private BeaconChainSpec spec; public BlsSignMessage(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof BlsTest.BlsSignMessageCase)) { + if (!(testCase instanceof BlsSignMessageCase)) { throw new RuntimeException("TestCase runner accepts only BlsSignMessageCase as input!"); } - this.testCase = (BlsTest.BlsSignMessageCase) testCase; + this.testCase = (BlsSignMessageCase) testCase; this.spec = spec; } diff --git a/test/src/test/java/org/ethereum/beacon/test/type/SpecConstantsDataMerged.java b/test/src/test/java/org/ethereum/beacon/test/type/SpecConstantsDataMerged.java index 686cd332e..a80ed2b9d 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/SpecConstantsDataMerged.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/SpecConstantsDataMerged.java @@ -13,6 +13,7 @@ import org.ethereum.beacon.emulator.config.chainspec.StateListLengthsData; import org.ethereum.beacon.emulator.config.chainspec.TimeParametersData; +// TODO: ADD DOMAIN CONFIGS @JsonIgnoreProperties(ignoreUnknown = false) public class SpecConstantsDataMerged extends SpecConstantsData { @JsonUnwrapped private DepositContractParametersData depositContractParameters; diff --git a/test/src/test/java/org/ethereum/beacon/test/type/TestSkeleton.java b/test/src/test/java/org/ethereum/beacon/test/type/TestSkeleton.java index 86b700514..d968a3d50 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/TestSkeleton.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/TestSkeleton.java @@ -6,22 +6,23 @@ import java.util.List; /** - * Non-specific test from https://github.com/ethereum/eth2.0-tests/ - - * Eth2.0 community tests repository. Following fields, or a bit less are in any test. + * Common test suite format description: https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats#test-suite * *

Specific test cases are made by extension of this class. */ @JsonIgnoreProperties(ignoreUnknown = true) public abstract class TestSkeleton { - private String title; - private String summary; - private String version; - @JsonProperty("test_suite") - private String testSuite; - private String fork; @JsonProperty("test_cases") protected List testCases; + private String title; + private String summary; + @JsonProperty("forks_timeline") + private String forksTimeline; + private List forks; + private String config; + private String runner; + private String handler; public String getTitle() { return title; @@ -39,28 +40,44 @@ public void setSummary(String summary) { this.summary = summary; } - public String getTestSuite() { - return testSuite; + public String getForksTimeline() { + return forksTimeline; + } + + public void setForksTimeline(String forksTimeline) { + this.forksTimeline = forksTimeline; + } + + public List getForks() { + return forks; + } + + public void setForks(List forks) { + this.forks = forks; + } + + public String getConfig() { + return config; } - public void setTestSuite(String testSuite) { - this.testSuite = testSuite; + public void setConfig(String config) { + this.config = config; } - public String getFork() { - return fork; + public String getRunner() { + return runner; } - public void setFork(String fork) { - this.fork = fork; + public void setRunner(String runner) { + this.runner = runner; } - public String getVersion() { - return version; + public String getHandler() { + return handler; } - public void setVersion(String version) { - this.version = version; + public void setHandler(String handler) { + this.handler = handler; } public List getTestCases() { @@ -69,6 +86,6 @@ public List getTestCases() { @Override public String toString() { - return "Test \"" + title + " " + fork + '\"'; + return "Test \"" + title + " [" + String.join(",", forks) + "]\""; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregatePubKeysCase.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregatePubKeysCase.java new file mode 100644 index 000000000..3068546a2 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregatePubKeysCase.java @@ -0,0 +1,38 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; + +import java.util.List; + +/** BLS aggregate public keys case */ +public class BlsAggregatePubKeysCase implements TestCase { + private List input; + private String output; + + public List getInput() { + return input; + } + + public void setInput(List input) { + this.input = input; + } + + public String getOutput() { + return output; + } + + public void setOutput(String output) { + this.output = output; + } + + @Override + public String toString() { + return "Aggregate public keys {" + + "input=" + + input.get(0).substring(0, 18) + + "...(total: " + + input.size() + + " public keys)" + + '}'; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregatePubKeysTest.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregatePubKeysTest.java new file mode 100644 index 000000000..28c7a254e --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregatePubKeysTest.java @@ -0,0 +1,22 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.TestSkeleton; + +import java.util.List; + +/** Container for bls aggregate public keys tests */ +public class BlsAggregatePubKeysTest extends TestSkeleton { + public List getTestCases() { + return testCases; + } + + public void setTestCases(List testCases) { + this.testCases = (List) (List) testCases; + } + + @Override + public String toString() { + return "Test \"" + getTitle() + " [" + String.join(",", getForks()) + "]\""; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregateSigsCase.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregateSigsCase.java new file mode 100644 index 000000000..e665a2736 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregateSigsCase.java @@ -0,0 +1,38 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; + +import java.util.List; + +/** BLS aggregate signatures case */ +public class BlsAggregateSigsCase implements TestCase { + private List input; + private String output; + + public List getInput() { + return input; + } + + public void setInput(List input) { + this.input = input; + } + + public String getOutput() { + return output; + } + + public void setOutput(String output) { + this.output = output; + } + + @Override + public String toString() { + return "Aggregate signatures {" + + "input=" + + input.get(0).substring(0, 18) + + "...(total: " + + input.size() + + " signatures)" + + '}'; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregateSigsTest.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregateSigsTest.java new file mode 100644 index 000000000..ac4645251 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsAggregateSigsTest.java @@ -0,0 +1,22 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.TestSkeleton; + +import java.util.List; + +/** Container for bls aggregate signatures tests */ +public class BlsAggregateSigsTest extends TestSkeleton { + public List getTestCases() { + return testCases; + } + + public void setTestCases(List testCases) { + this.testCases = (List) (List) testCases; + } + + @Override + public String toString() { + return "Test \"" + getTitle() + " [" + String.join(",", getForks()) + "]\""; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCase.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCase.java new file mode 100644 index 000000000..96e6d0b0a --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCase.java @@ -0,0 +1,58 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; + +import java.util.List; + +/** BLS message hash uncompressed test case */ +public class BlsMessageHashCase implements TestCase { + private BlsMessageHashInput input; + private List> output; + + public BlsMessageHashInput getInput() { + return input; + } + + public void setInput(BlsMessageHashInput input) { + this.input = input; + } + + public List> getOutput() { + return output; + } + + public void setOutput(List> output) { + this.output = output; + } + + @Override + public String toString() { + return "Message hash as a G2 point (uncompressed) with input: " + input; + } + + public static class BlsMessageHashInput { + private String domain; + private String message; + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return "Input{" + "domain='" + domain + '\'' + ", message='" + message + '\'' + '}'; + } + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCompressedCase.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCompressedCase.java new file mode 100644 index 000000000..0b8fc33c6 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCompressedCase.java @@ -0,0 +1,32 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; + +import java.util.List; + +/** BLS message hash compressed test case */ +public class BlsMessageHashCompressedCase implements TestCase { + private BlsMessageHashCase.BlsMessageHashInput input; + private List output; + + public BlsMessageHashCase.BlsMessageHashInput getInput() { + return input; + } + + public void setInput(BlsMessageHashCase.BlsMessageHashInput input) { + this.input = input; + } + + public List getOutput() { + return output; + } + + public void setOutput(List output) { + this.output = output; + } + + @Override + public String toString() { + return "Message hash as a compressed G2 point with input: " + input; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCompressedTest.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCompressedTest.java new file mode 100644 index 000000000..353fd9a46 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashCompressedTest.java @@ -0,0 +1,22 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.TestSkeleton; + +import java.util.List; + +/** Container for bls message hash test cases, compressed */ +public class BlsMessageHashCompressedTest extends TestSkeleton { + public List getTestCases() { + return testCases; + } + + public void setTestCases(List testCases) { + this.testCases = (List) (List) testCases; + } + + @Override + public String toString() { + return "Test \"" + getTitle() + " [" + String.join(",", getForks()) + "]\""; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashTest.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashTest.java new file mode 100644 index 000000000..041fd7c15 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsMessageHashTest.java @@ -0,0 +1,22 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.TestSkeleton; + +import java.util.List; + +/** Container for bls message hash test cases, uncompressed */ +public class BlsMessageHashTest extends TestSkeleton { + public List getTestCases() { + return testCases; + } + + public void setTestCases(List testCases) { + this.testCases = (List) (List) testCases; + } + + @Override + public String toString() { + return "Test \"" + getTitle() + " [" + String.join(",", getForks()) + "]\""; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsPrivateToPublicCase.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsPrivateToPublicCase.java new file mode 100644 index 000000000..320ac90f2 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsPrivateToPublicCase.java @@ -0,0 +1,30 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; + +/** BLS private to public test case */ +public class BlsPrivateToPublicCase implements TestCase { + private String input; + private String output; + + public String getInput() { + return input; + } + + public void setInput(String input) { + this.input = input; + } + + public String getOutput() { + return output; + } + + public void setOutput(String output) { + this.output = output; + } + + @Override + public String toString() { + return "Private to public key with input: " + input; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsPrivateToPublicTest.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsPrivateToPublicTest.java new file mode 100644 index 000000000..49e654e34 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsPrivateToPublicTest.java @@ -0,0 +1,22 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.TestSkeleton; + +import java.util.List; + +/** Container for bls private to public test cases */ +public class BlsPrivateToPublicTest extends TestSkeleton { + public List getTestCases() { + return testCases; + } + + public void setTestCases(List testCases) { + this.testCases = (List) (List) testCases; + } + + @Override + public String toString() { + return "Test \"" + getTitle() + " [" + String.join(",", getForks()) + "]\""; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsSignMessageCase.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsSignMessageCase.java new file mode 100644 index 000000000..5abcbef46 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsSignMessageCase.java @@ -0,0 +1,42 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; + +/** BLS sign message test case */ +public class BlsSignMessageCase implements TestCase { + private BlsSignMessageInput input; + private String output; + + public BlsSignMessageInput getInput() { + return input; + } + + public void setInput(BlsSignMessageInput input) { + this.input = input; + } + + public String getOutput() { + return output; + } + + public void setOutput(String output) { + this.output = output; + } + + @Override + public String toString() { + return "Sign Message Test Case{" + "input=" + input + '}'; + } + + public static class BlsSignMessageInput extends BlsMessageHashCase.BlsMessageHashInput { + private String privkey; + + public String getPrivkey() { + return privkey; + } + + public void setPrivkey(String privkey) { + this.privkey = privkey; + } + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsSignMessageTest.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsSignMessageTest.java new file mode 100644 index 000000000..976bae44e --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsSignMessageTest.java @@ -0,0 +1,22 @@ +package org.ethereum.beacon.test.type.bls; + +import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.TestSkeleton; + +import java.util.List; + +/** Container for bls sign message tests */ +public class BlsSignMessageTest extends TestSkeleton { + public List getTestCases() { + return testCases; + } + + public void setTestCases(List testCases) { + this.testCases = (List) (List) testCases; + } + + @Override + public String toString() { + return "Test \"" + getTitle() + " [" + String.join(",", getForks()) + "]\""; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsTest.java b/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsTest.java deleted file mode 100644 index 7600aa2c2..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/type/bls/BlsTest.java +++ /dev/null @@ -1,353 +0,0 @@ -package org.ethereum.beacon.test.type.bls; - -import com.fasterxml.jackson.annotation.JsonProperty; -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.test.type.TestSkeleton; -import org.ethereum.beacon.test.type.UniversalTest; - -import java.util.List; - -/** - * Container for BLS tests https://github.com/ethereum/eth2.0-tests/tree/master/bls - */ -public class BlsTest extends TestSkeleton { - @JsonProperty("case01_message_hash_G2_uncompressed") - private List blsMessageHashCases; - - @JsonProperty("case02_message_hash_G2_compressed") - private List blsMessageHashCompressedCases; - - @JsonProperty("case03_private_to_public_key") - private List blsPrivateToPublicCases; - - @JsonProperty("case04_sign_messages") - private List blsSignMessageCases; - // XXX: 05 is too slow and is not a part of standard tests therefore - @JsonProperty("case06_aggregate_sigs") - private List blsAggregateSigsCases; - - @JsonProperty("case07_aggregate_pubkeys") - private List blsAggregatePubKeysCases; - - public UniversalTest buildBlsMessageHashTest() { - UniversalTest test = new UniversalTest(); - test.setFork(this.getFork()); - test.setSummary(this.getSummary()); - test.setTestSuite(this.getTestSuite()); - test.setTitle(this.getTitle()); - test.setTestCases(getBlsMessageHashCases()); - - return test; - } - - public UniversalTest buildBlsMessageHashCompressedTest() { - UniversalTest test = new UniversalTest(); - test.setFork(this.getFork()); - test.setSummary(this.getSummary()); - test.setTestSuite(this.getTestSuite()); - test.setTitle(this.getTitle()); - test.setTestCases(getBlsMessageHashCompressedCases()); - - return test; - } - - public UniversalTest buildBlsPrivateToPublicTest() { - UniversalTest test = new UniversalTest(); - test.setFork(this.getFork()); - test.setSummary(this.getSummary()); - test.setTestSuite(this.getTestSuite()); - test.setTitle(this.getTitle()); - test.setTestCases(getBlsPrivateToPublicCases()); - - return test; - } - - public UniversalTest buildBlsSignMessageTest() { - UniversalTest test = new UniversalTest(); - test.setFork(this.getFork()); - test.setSummary(this.getSummary()); - test.setTestSuite(this.getTestSuite()); - test.setTitle(this.getTitle()); - test.setTestCases(getBlsSignMessageCases()); - - return test; - } - - public UniversalTest buildBlsAggregateSigsTest() { - UniversalTest test = new UniversalTest(); - test.setFork(this.getFork()); - test.setSummary(this.getSummary()); - test.setTestSuite(this.getTestSuite()); - test.setTitle(this.getTitle()); - test.setTestCases(getBlsAggregateSigsCases()); - - return test; - } - - public UniversalTest buildBlsAggregatePubKeysTest() { - UniversalTest test = new UniversalTest(); - test.setFork(this.getFork()); - test.setSummary(this.getSummary()); - test.setTestSuite(this.getTestSuite()); - test.setTitle(this.getTitle()); - test.setTestCases(getBlsAggregatePubKeysCases()); - - return test; - } - - public List getBlsMessageHashCases() { - return blsMessageHashCases; - } - - public void setBlsMessageHashCases(List blsMessageHashCases) { - this.blsMessageHashCases = blsMessageHashCases; - } - - public List getBlsMessageHashCompressedCases() { - return blsMessageHashCompressedCases; - } - - public void setBlsMessageHashCompressedCases( - List blsMessageHashCompressedCases) { - this.blsMessageHashCompressedCases = blsMessageHashCompressedCases; - } - - public List getBlsPrivateToPublicCases() { - return blsPrivateToPublicCases; - } - - public void setBlsPrivateToPublicCases(List blsPrivateToPublicCases) { - this.blsPrivateToPublicCases = blsPrivateToPublicCases; - } - - public List getBlsSignMessageCases() { - return blsSignMessageCases; - } - - public void setBlsSignMessageCases(List blsSignMessageCases) { - this.blsSignMessageCases = blsSignMessageCases; - } - - public List getBlsAggregateSigsCases() { - return blsAggregateSigsCases; - } - - public void setBlsAggregateSigsCases(List blsAggregateSigsCases) { - this.blsAggregateSigsCases = blsAggregateSigsCases; - } - - public List getBlsAggregatePubKeysCases() { - return blsAggregatePubKeysCases; - } - - public void setBlsAggregatePubKeysCases(List blsAggregatePubKeysCases) { - this.blsAggregatePubKeysCases = blsAggregatePubKeysCases; - } - - public static class BlsMessageHashCase implements TestCase { - private BlsMessageHashInput input; - private List> output; - - public BlsMessageHashInput getInput() { - return input; - } - - public void setInput(BlsMessageHashInput input) { - this.input = input; - } - - public List> getOutput() { - return output; - } - - public void setOutput(List> output) { - this.output = output; - } - - @Override - public String toString() { - return "Message hash as a G2 point (uncompressed) with input: " + input; - } - } - - public static class BlsMessageHashCompressedCase implements TestCase { - private BlsMessageHashInput input; - private List output; - - public BlsMessageHashInput getInput() { - return input; - } - - public void setInput(BlsMessageHashInput input) { - this.input = input; - } - - public List getOutput() { - return output; - } - - public void setOutput(List output) { - this.output = output; - } - - @Override - public String toString() { - return "Message hash as a compressed G2 point with input: " + input; - } - } - - public static class BlsMessageHashInput { - private String domain; - private String message; - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public String toString() { - return "Input{" + "domain='" + domain + '\'' + ", message='" + message + '\'' + '}'; - } - } - - public static class BlsPrivateToPublicCase implements TestCase { - private String input; - private String output; - - public String getInput() { - return input; - } - - public void setInput(String input) { - this.input = input; - } - - public String getOutput() { - return output; - } - - public void setOutput(String output) { - this.output = output; - } - - @Override - public String toString() { - return "Private to public key with input: " + input; - } - } - - public static class BlsSignMessageCase implements TestCase { - private BlsSignMessageInput input; - private String output; - - public BlsSignMessageInput getInput() { - return input; - } - - public void setInput(BlsSignMessageInput input) { - this.input = input; - } - - public String getOutput() { - return output; - } - - public void setOutput(String output) { - this.output = output; - } - - @Override - public String toString() { - return "Sign Message Test Case{" + "input=" + input + '}'; - } - - public static class BlsSignMessageInput extends BlsMessageHashInput { - private String privkey; - - public String getPrivkey() { - return privkey; - } - - public void setPrivkey(String privkey) { - this.privkey = privkey; - } - } - } - - public static class BlsAggregateSigsCase implements TestCase { - private List input; - private String output; - - public List getInput() { - return input; - } - - public void setInput(List input) { - this.input = input; - } - - public String getOutput() { - return output; - } - - public void setOutput(String output) { - this.output = output; - } - - @Override - public String toString() { - return "Aggregate signatures {" - + "input=" - + input.get(0).substring(0, 18) - + "...(total: " - + input.size() - + " signatures)" - + '}'; - } - } - - public static class BlsAggregatePubKeysCase implements TestCase { - private List input; - private String output; - - public List getInput() { - return input; - } - - public void setInput(List input) { - this.input = input; - } - - public String getOutput() { - return output; - } - - public void setOutput(String output) { - this.output = output; - } - - @Override - public String toString() { - return "Aggregate public keys {" - + "input=" - + input.get(0).substring(0, 18) - + "...(total: " - + input.size() - + " public keys)" - + '}'; - } - } -} From 005c9941a28dcb33def17bb695a99bf754f1d98c Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 30 Apr 2019 16:58:06 +0300 Subject: [PATCH 02/42] test: added links to test format descriptions of various BLS tests --- test/src/test/java/org/ethereum/beacon/test/BlsTests.java | 4 ++++ .../ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java | 1 + .../org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java | 1 + .../org/ethereum/beacon/test/runner/bls/BlsMessageHash.java | 4 ++-- .../beacon/test/runner/bls/BlsMessageHashCompressed.java | 4 ++-- .../ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java | 1 + .../org/ethereum/beacon/test/runner/bls/BlsSignMessage.java | 1 + 7 files changed, 12 insertions(+), 4 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/BlsTests.java b/test/src/test/java/org/ethereum/beacon/test/BlsTests.java index 81c04e683..2aeaefe22 100644 --- a/test/src/test/java/org/ethereum/beacon/test/BlsTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/BlsTests.java @@ -21,6 +21,10 @@ import static org.junit.Assert.fail; +/** + * Tests for BLS methods. + * Test format description: https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats/bls + */ public class BlsTests extends TestUtils { private String TESTS_DIR = "bls"; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java index 3e3846dc9..d10d9de8e 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregatePubKeys.java @@ -17,6 +17,7 @@ * TestRunner for {@link BlsAggregatePubKeysCase} * *

Aggregates public keys + * Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/bls/aggregate_pubkeys.md */ public class BlsAggregatePubKeys implements Runner { private BlsAggregatePubKeysCase testCase; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java index 14e2b0a75..152e96ef5 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsAggregateSigs.java @@ -20,6 +20,7 @@ * TestRunner for {@link BlsAggregateSigsCase} * *

Aggregates signatures + * Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/bls/aggregate_sigs.md */ public class BlsAggregateSigs implements Runner { private BlsAggregateSigsCase testCase; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHash.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHash.java index a540cc147..1086fee82 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHash.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHash.java @@ -21,8 +21,8 @@ /** * TestRunner for {@link BlsMessageHashCase} * - *

Hash message Input: - Message as bytes - domain as uint64 Output: - Message hash as a G2 point - * (uncompressed) + *

Hash message as G2 point (uncompressed) + * Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/bls/msg_hash_g2_uncompressed.md */ public class BlsMessageHash implements Runner { private BlsMessageHashCase testCase; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHashCompressed.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHashCompressed.java index 2b2d92b80..e4aeec53c 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHashCompressed.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsMessageHashCompressed.java @@ -21,8 +21,8 @@ /** * TestRunner for {@link BlsMessageHashCompressedCase} * - *

Hash message Input: - Message as bytes - domain as uint64 Output: - Message hash as a - * compressed G2 point + *

Hash message as G2 point (compressed) + * Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/bls/msg_hash_g2_compressed.md */ public class BlsMessageHashCompressed implements Runner { private BlsMessageHashCompressedCase testCase; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java index adae8dd03..c071bd80b 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsPrivateToPublic.java @@ -15,6 +15,7 @@ * TestRunner for {@link BlsPrivateToPublicCase} * *

Verifies public key creation using private key + * Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/bls/priv_to_pub.md */ public class BlsPrivateToPublic implements Runner { private BlsPrivateToPublicCase testCase; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsSignMessage.java b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsSignMessage.java index 5ced460db..abeaa5ec0 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsSignMessage.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/bls/BlsSignMessage.java @@ -20,6 +20,7 @@ * TestRunner for {@link BlsSignMessageCase} * *

Signs message by signer defined by private key + * Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/bls/sign_msg.md */ public class BlsSignMessage implements Runner { private BlsSignMessageCase testCase; From 2e2be49ba76a4141e34392c4fb0ae0a49686eb5e Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 30 Apr 2019 17:14:56 +0300 Subject: [PATCH 03/42] test: generic ssz tests (for primitive values) updated for to new standard --- .../org/ethereum/beacon/test/SszTests.java | 26 +++++++------------ .../{SszRunner.java => SszGenericRunner.java} | 18 +++++++------ .../ssz/{SszTest.java => SszGenericTest.java} | 7 +++-- ...zTestCase.java => SszGenericTestCase.java} | 8 +++--- 4 files changed, 28 insertions(+), 31 deletions(-) rename test/src/test/java/org/ethereum/beacon/test/runner/ssz/{SszRunner.java => SszGenericRunner.java} (80%) rename test/src/test/java/org/ethereum/beacon/test/type/ssz/{SszTest.java => SszGenericTest.java} (54%) rename test/src/test/java/org/ethereum/beacon/test/type/ssz/{SszTestCase.java => SszGenericTestCase.java} (74%) diff --git a/test/src/test/java/org/ethereum/beacon/test/SszTests.java b/test/src/test/java/org/ethereum/beacon/test/SszTests.java index 46c36936b..0cf008acf 100644 --- a/test/src/test/java/org/ethereum/beacon/test/SszTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/SszTests.java @@ -1,30 +1,24 @@ package org.ethereum.beacon.test; -import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.test.runner.ssz.SszRunner; -import org.ethereum.beacon.test.type.ssz.SszTest; +import org.ethereum.beacon.test.runner.ssz.SszGenericRunner; +import org.ethereum.beacon.test.type.ssz.SszGenericTest; import org.junit.Test; import java.nio.file.Path; import java.nio.file.Paths; +/** SSZ tests, generic with primitive values and static, with known container types */ public class SszTests extends TestUtils { - private String TESTS_DIR = "ssz"; - private BeaconChainSpec spec; - - public SszTests() { - this.spec = BeaconChainSpec.createWithDefaults(); - } @Test - public void testSsz() { - Path sszTestsPath = Paths.get(PATH_TO_TESTS, TESTS_DIR); + public void testSszGeneric() { + Path testFileDir = Paths.get(PATH_TO_TESTS, "ssz_generic", "uint"); runTestsInResourceDir( - sszTestsPath, - SszTest.class, - testCase -> { - SszRunner testCaseRunner = new SszRunner(testCase, spec); - return testCaseRunner.run(); + testFileDir, + SszGenericTest.class, + input -> { + SszGenericRunner testRunner = new SszGenericRunner(input.getValue0(), input.getValue1()); + return testRunner.run(); }); } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszGenericRunner.java similarity index 80% rename from test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszRunner.java rename to test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszGenericRunner.java index 5fe164382..8cc8257c0 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszGenericRunner.java @@ -11,22 +11,24 @@ import org.ethereum.beacon.ssz.access.container.SSZSchemeBuilder; import org.ethereum.beacon.ssz.annotation.SSZSerializable; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.ssz.SszTestCase; +import org.ethereum.beacon.test.type.ssz.SszGenericTestCase; import org.ethereum.beacon.test.type.TestCase; import tech.pegasys.artemis.util.bytes.BytesValue; -/** TestRunner for {@link SszTestCase} */ -public class SszRunner implements Runner { - private SszTestCase testCase; +/** TestRunner for {@link SszGenericTestCase} + *

Test format description: https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats/ssz_generic + */ +public class SszGenericRunner implements Runner { + private SszGenericTestCase testCase; private BeaconChainSpec spec; private SSZSchemeBuilder.SSZScheme currentScheme; private SSZSerializer sszSerializer; - public SszRunner(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof SszTestCase)) { - throw new RuntimeException("TestCase runner accepts only SszTestCase.class as input!"); + public SszGenericRunner(TestCase testCase, BeaconChainSpec spec) { + if (!(testCase instanceof SszGenericTestCase)) { + throw new RuntimeException("TestCase runner accepts only SszGenericTestCase.class as input!"); } - this.testCase = (SszTestCase) testCase; + this.testCase = (SszGenericTestCase) testCase; this.spec = spec; SSZBuilder builder = new SSZBuilder(); builder.withSSZSchemeBuilder(clazz -> currentScheme); diff --git a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszTest.java b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTest.java similarity index 54% rename from test/src/test/java/org/ethereum/beacon/test/type/ssz/SszTest.java rename to test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTest.java index f5acef109..955dab2f4 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszTest.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTest.java @@ -6,15 +6,14 @@ import java.util.List; /** - * Container for ssz tests https://github.com/ethereum/eth2.0-tests/tree/master/ssz + * Container for generic ssz tests */ -public class SszTest extends TestSkeleton { +public class SszGenericTest extends TestSkeleton { public List getTestCases() { return testCases; } - public void setTestCases(List testCases) { + public void setTestCases(List testCases) { this.testCases = (List) (List) testCases; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszTestCase.java b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTestCase.java similarity index 74% rename from test/src/test/java/org/ethereum/beacon/test/type/ssz/SszTestCase.java rename to test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTestCase.java index 609688e52..346ccf427 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszTestCase.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTestCase.java @@ -5,10 +5,12 @@ import java.util.List; /** - * SSZ test case https://github.com/ethereum/eth2.0-tests/tree/master/ssz + * SSZ test case + * + *

Test format description: https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats/ssz_generic */ -public class SszTestCase implements TestCase { +public class SszGenericTestCase implements TestCase { private String type; private String valid; private String ssz; From 1f31c946495c17d32c2f2c332813bb8f405ecaed Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 14:18:13 +0300 Subject: [PATCH 04/42] test: ssz/hash tree/signing root static type tests added --- .../org/ethereum/beacon/test/SszTests.java | 14 ++ .../org/ethereum/beacon/test/TestUtils.java | 13 +- .../ethereum/beacon/test/TreeHashTests.java | 214 +++++++++--------- .../test/runner/hash/TreeHashBasicRunner.java | 89 -------- .../runner/hash/TreeHashContainerRunner.java | 184 --------------- .../test/runner/hash/TreeHashListRunner.java | 94 -------- .../runner/hash/TreeHashVectorRunner.java | 101 --------- .../test/runner/ssz/SszGenericRunner.java | 12 +- .../test/runner/ssz/SszStaticRunner.java | 133 +++++++++++ ...ttestationDataAndCustodyBitSerializer.java | 27 +++ .../ssz/mapper/AttestationDataSerializer.java | 32 +++ .../ssz/mapper/AttestationSerializer.java | 31 +++ .../mapper/AttesterSlashingSerializer.java | 28 +++ .../mapper/BeaconBlockHeaderSerializer.java | 30 +++ .../ssz/mapper/BeaconStateSerializer.java | 102 +++++++++ .../ssz/mapper/BlockBodySerializer.java | 61 +++++ .../runner/ssz/mapper/BlockSerializer.java | 35 +++ .../ssz/mapper/CrosslinkSerializer.java | 26 +++ .../ssz/mapper/DepositDataSerializer.java | 29 +++ .../runner/ssz/mapper/DepositSerializer.java | 33 +++ .../runner/ssz/mapper/Eth1DataSerializer.java | 27 +++ .../ssz/mapper/HistoricalBatchSerializer.java | 32 +++ .../mapper/IndexedAttestationSerializer.java | 34 +++ .../runner/ssz/mapper/ObjectSerializer.java | 45 ++++ .../mapper/PendingAttestationSerializer.java | 29 +++ .../mapper/ProposerSlashingSerializer.java | 32 +++ .../runner/ssz/mapper/TransferSerializer.java | 31 +++ .../ssz/mapper/ValidatorSerializer.java | 33 +++ .../ssz/mapper/VoluntaryExitSerializer.java | 27 +++ .../test/type/hash/TreeHashBasicTest.java | 22 -- .../test/type/hash/TreeHashBasicTestCase.java | 45 ---- .../type/hash/TreeHashContainerTestCase.java | 46 ---- .../test/type/hash/TreeHashListTest.java | 22 -- .../test/type/hash/TreeHashListTestCase.java | 45 ---- ...nericTestCase.java => SszGenericCase.java} | 2 +- .../beacon/test/type/ssz/SszGenericTest.java | 2 +- .../beacon/test/type/ssz/SszStaticCase.java | 62 +++++ .../SszStaticTest.java} | 10 +- .../pegasys/artemis/util/uint/UInt64.java | 6 + 39 files changed, 1071 insertions(+), 769 deletions(-) delete mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashBasicRunner.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashContainerRunner.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashListRunner.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashVectorRunner.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataAndCustodyBitSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttesterSlashingSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockBodySerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/HistoricalBatchSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ObjectSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ProposerSlashingSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/TransferSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/VoluntaryExitSerializer.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashBasicTest.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashBasicTestCase.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashContainerTestCase.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashListTest.java delete mode 100644 test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashListTestCase.java rename test/src/test/java/org/ethereum/beacon/test/type/ssz/{SszGenericTestCase.java => SszGenericCase.java} (95%) create mode 100644 test/src/test/java/org/ethereum/beacon/test/type/ssz/SszStaticCase.java rename test/src/test/java/org/ethereum/beacon/test/type/{hash/TreeHashContainerTest.java => ssz/SszStaticTest.java} (51%) diff --git a/test/src/test/java/org/ethereum/beacon/test/SszTests.java b/test/src/test/java/org/ethereum/beacon/test/SszTests.java index 0cf008acf..91e561313 100644 --- a/test/src/test/java/org/ethereum/beacon/test/SszTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/SszTests.java @@ -1,7 +1,9 @@ package org.ethereum.beacon.test; import org.ethereum.beacon.test.runner.ssz.SszGenericRunner; +import org.ethereum.beacon.test.runner.ssz.SszStaticRunner; import org.ethereum.beacon.test.type.ssz.SszGenericTest; +import org.ethereum.beacon.test.type.ssz.SszStaticTest; import org.junit.Test; import java.nio.file.Path; @@ -21,4 +23,16 @@ public void testSszGeneric() { return testRunner.run(); }); } + + @Test + public void testSszStatic() { + Path testFileDir = Paths.get(PATH_TO_TESTS, "ssz_static", "core"); + runTestsInResourceDir( + testFileDir, + SszStaticTest.class, + input -> { + SszStaticRunner testRunner = new SszStaticRunner(input.getValue0(), input.getValue1()); + return testRunner.run(); + }); + } } diff --git a/test/src/test/java/org/ethereum/beacon/test/TestUtils.java b/test/src/test/java/org/ethereum/beacon/test/TestUtils.java index fd16fc2a2..12ff99f49 100644 --- a/test/src/test/java/org/ethereum/beacon/test/TestUtils.java +++ b/test/src/test/java/org/ethereum/beacon/test/TestUtils.java @@ -24,6 +24,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.StringWriter; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; @@ -183,7 +185,16 @@ static Optional runTestCase( BeaconChainSpec spec, V test, Function, Optional> testCaseRunner) { - Optional testCaseErrors = testCaseRunner.apply(Pair.with(testCase, spec)); + Optional testCaseErrors; + try { + testCaseErrors = testCaseRunner.apply(Pair.with(testCase, spec)); + } catch (Exception ex) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + ex.printStackTrace(pw); + String error = String.format("Unexpected error when running case %s: %s", testCase, sw.toString()); + testCaseErrors = Optional.of(error); + } if (testCaseErrors.isPresent()) { StringBuilder errors = new StringBuilder(); errors diff --git a/test/src/test/java/org/ethereum/beacon/test/TreeHashTests.java b/test/src/test/java/org/ethereum/beacon/test/TreeHashTests.java index 45f7df270..30610d696 100644 --- a/test/src/test/java/org/ethereum/beacon/test/TreeHashTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/TreeHashTests.java @@ -1,107 +1,107 @@ -package org.ethereum.beacon.test; - -import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner; -import org.ethereum.beacon.test.runner.hash.TreeHashContainerRunner; -import org.ethereum.beacon.test.runner.hash.TreeHashListRunner; -import org.ethereum.beacon.test.runner.hash.TreeHashVectorRunner; -import org.ethereum.beacon.test.type.hash.TreeHashBasicTest; -import org.ethereum.beacon.test.type.hash.TreeHashContainerTest; -import org.ethereum.beacon.test.type.hash.TreeHashListTest; -import org.junit.Ignore; -import org.junit.Test; - -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Optional; - -import static org.junit.Assert.fail; - -public class TreeHashTests extends TestUtils { - private String TESTS_DIR = "tree_hash"; - private BeaconChainSpec spec; - - public TreeHashTests() { - this.spec = BeaconChainSpec.createWithDefaults(); - } - - @Test - @Ignore("Remove when yaml is added to `eth2.0-test` repository") - public void testBasicTypesTreeHash() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_types.yaml"); - TreeHashBasicTest test = - readTest(getResourceFile(testFilePath.toString()), TreeHashBasicTest.class); - Optional errors = - runAllCasesInTest( - test, - testCase -> { - TreeHashBasicRunner testRunner = new TreeHashBasicRunner(testCase, spec); - return testRunner.run(); - }, - TreeHashBasicTest.class); - if (errors.isPresent()) { - System.out.println(errors.get()); - fail(); - } - } - - @Test - @Ignore("Remove when yaml is added to `eth2.0-test` repository") - public void testListTypeTreeHash() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_lists.yaml"); - TreeHashListTest test = - readTest(getResourceFile(testFilePath.toString()), TreeHashListTest.class); - Optional errors = - runAllCasesInTest( - test, - testCase -> { - TreeHashListRunner testRunner = new TreeHashListRunner(testCase, spec); - return testRunner.run(); - }, - TreeHashListTest.class); - if (errors.isPresent()) { - System.out.println(errors.get()); - fail(); - } - } - - @Test - @Ignore("Remove when yaml is added to `eth2.0-test` repository") - public void testVectorTypeTreeHash() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_vectors.yaml"); - TreeHashListTest test = - readTest(getResourceFile(testFilePath.toString()), TreeHashListTest.class); - Optional errors = - runAllCasesInTest( - test, - testCase -> { - TreeHashVectorRunner testRunner = new TreeHashVectorRunner(testCase, spec); - return testRunner.run(); - }, - TreeHashListTest.class); - if (errors.isPresent()) { - System.out.println(errors.get()); - fail(); - } - } - - @Test - @Ignore("Remove when yaml is added to `eth2.0-test` repository") - public void testContainerTypeTreeHash() { - Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_containers.yaml"); - TreeHashContainerTest test = - readTest(getResourceFile(testFilePath.toString()), TreeHashContainerTest.class); - Optional errors = - runAllCasesInTest( - test, - testCase -> { - TreeHashContainerRunner testRunner = new TreeHashContainerRunner(testCase, spec); - return testRunner.run(); - }, - TreeHashContainerTest.class); - if (errors.isPresent()) { - System.out.println(errors.get()); - fail(); - } - } -} +//package org.ethereum.beacon.test; +// +//import org.ethereum.beacon.consensus.BeaconChainSpec; +//import org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner; +//import org.ethereum.beacon.test.runner.hash.TreeHashContainerRunner; +//import org.ethereum.beacon.test.runner.hash.TreeHashListRunner; +//import org.ethereum.beacon.test.runner.hash.TreeHashVectorRunner; +//import org.ethereum.beacon.test.type.hash.TreeHashBasicTest; +//import org.ethereum.beacon.test.type.hash.TreeHashContainerTest; +//import org.ethereum.beacon.test.type.hash.TreeHashListTest; +//import org.junit.Ignore; +//import org.junit.Test; +// +//import java.nio.file.Path; +//import java.nio.file.Paths; +//import java.util.Optional; +// +//import static org.junit.Assert.fail; +// +//public class TreeHashTests extends TestUtils { +// private String TESTS_DIR = "tree_hash"; +// private BeaconChainSpec spec; +// +// public TreeHashTests() { +// this.spec = BeaconChainSpec.createWithDefaults(); +// } +// +// @Test +// @Ignore("Remove when yaml is added to `eth2.0-test` repository") +// public void testBasicTypesTreeHash() { +// Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_types.yaml"); +// TreeHashBasicTest test = +// readTest(getResourceFile(testFilePath.toString()), TreeHashBasicTest.class); +// Optional errors = +// runAllCasesInTest( +// test, +// testCase -> { +// TreeHashBasicRunner testRunner = new TreeHashBasicRunner(testCase, spec); +// return testRunner.run(); +// }, +// TreeHashBasicTest.class); +// if (errors.isPresent()) { +// System.out.println(errors.get()); +// fail(); +// } +// } +// +// @Test +// @Ignore("Remove when yaml is added to `eth2.0-test` repository") +// public void testListTypeTreeHash() { +// Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_lists.yaml"); +// TreeHashListTest test = +// readTest(getResourceFile(testFilePath.toString()), TreeHashListTest.class); +// Optional errors = +// runAllCasesInTest( +// test, +// testCase -> { +// TreeHashListRunner testRunner = new TreeHashListRunner(testCase, spec); +// return testRunner.run(); +// }, +// TreeHashListTest.class); +// if (errors.isPresent()) { +// System.out.println(errors.get()); +// fail(); +// } +// } +// +// @Test +// @Ignore("Remove when yaml is added to `eth2.0-test` repository") +// public void testVectorTypeTreeHash() { +// Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_vectors.yaml"); +// TreeHashListTest test = +// readTest(getResourceFile(testFilePath.toString()), TreeHashListTest.class); +// Optional errors = +// runAllCasesInTest( +// test, +// testCase -> { +// TreeHashVectorRunner testRunner = new TreeHashVectorRunner(testCase, spec); +// return testRunner.run(); +// }, +// TreeHashListTest.class); +// if (errors.isPresent()) { +// System.out.println(errors.get()); +// fail(); +// } +// } +// +// @Test +// @Ignore("Remove when yaml is added to `eth2.0-test` repository") +// public void testContainerTypeTreeHash() { +// Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_containers.yaml"); +// TreeHashContainerTest test = +// readTest(getResourceFile(testFilePath.toString()), TreeHashContainerTest.class); +// Optional errors = +// runAllCasesInTest( +// test, +// testCase -> { +// TreeHashContainerRunner testRunner = new TreeHashContainerRunner(testCase, spec); +// return testRunner.run(); +// }, +// TreeHashContainerTest.class); +// if (errors.isPresent()) { +// System.out.println(errors.get()); +// fail(); +// } +// } +//} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashBasicRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashBasicRunner.java deleted file mode 100644 index 8c568e987..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashBasicRunner.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.ethereum.beacon.test.runner.hash; - -import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.consensus.hasher.SSZObjectHasher; -import org.ethereum.beacon.core.spec.SpecConstantsResolver; -import org.ethereum.beacon.crypto.Hashes; -import org.ethereum.beacon.ssz.SSZBuilder; -import org.ethereum.beacon.ssz.SSZHasher; -import org.ethereum.beacon.ssz.access.SSZField; -import org.ethereum.beacon.ssz.type.SimpleTypeResolver; -import org.ethereum.beacon.ssz.type.TypeResolver; -import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.test.type.hash.TreeHashBasicTestCase; -import tech.pegasys.artemis.ethereum.core.Hash32; -import tech.pegasys.artemis.util.bytes.BytesValue; - -import java.math.BigInteger; -import java.util.Optional; -import java.util.function.Function; - -import static org.ethereum.beacon.test.SilentAsserts.assertEquals; - -/** TestRunner for {@link TreeHashBasicTestCase} */ -public class TreeHashBasicRunner implements Runner { - private TreeHashBasicTestCase testCase; - private SSZObjectHasher hasher; - private SSZField field; - - public TreeHashBasicRunner(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof TreeHashBasicTestCase)) { - throw new RuntimeException( - "TestCase runner accepts only TreeHashBasicTestCase.class as input!"); - } - this.testCase = (TreeHashBasicTestCase) testCase; - Function hashFunction = Hashes::keccak256; - SSZHasher sszHasher = - new SSZBuilder().withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) - .withIncrementalHasher(true) - .withTypeResolverBuilder( - objects -> { - TypeResolver delegate = - new SimpleTypeResolver(objects.getValue0(), objects.getValue1()); - return descriptor -> delegate.resolveSSZType(field); - }) - .buildHasher(hashFunction); - this.hasher = new SSZObjectHasher(sszHasher); - } - - public static SSZField parseBasicFieldType(String type) { - if (type.equals("bool")) { - return new SSZField(Boolean.class, null, null, null, "value", "getValue"); - } else if (type.startsWith("uint")) { - return new SSZField( - BigInteger.class, null, "uint", Integer.valueOf(type.substring(4)), "value", "getValue"); - } else { - throw new RuntimeException("Type " + type + " is not supported"); - } - } - - public static Object instantiateValue(String value, String type) { - Object res; - if (type.equals("bool")) { - res = Boolean.valueOf(value); - } else if (type.startsWith("uint")) { - res = new BigInteger(value); - } else { - throw new RuntimeException("Type " + type + " is not supported"); - } - - return res; - } - - private void activateSchemeMock(String type) { - this.field = parseBasicFieldType(type); - } - - public Optional run() { - activateSchemeMock(testCase.getType()); - Object object = instantiateValue(testCase.getValue(), testCase.getType()); - Hash32 res = hasher.getHash(object); - String expected = testCase.getRoot(); - if (!expected.startsWith("0x")) { - expected = "0x" + expected; - } - String actual = res.toString(); - return assertEquals(expected, actual); - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashContainerRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashContainerRunner.java deleted file mode 100644 index c9f108115..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashContainerRunner.java +++ /dev/null @@ -1,184 +0,0 @@ -package org.ethereum.beacon.test.runner.hash; - -import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.consensus.hasher.SSZObjectHasher; -import org.ethereum.beacon.core.spec.SpecConstantsResolver; -import org.ethereum.beacon.crypto.Hashes; -import org.ethereum.beacon.ssz.ExternalVarResolver; -import org.ethereum.beacon.ssz.SSZBuilder; -import org.ethereum.beacon.ssz.SSZHasher; -import org.ethereum.beacon.ssz.access.AccessorResolver; -import org.ethereum.beacon.ssz.access.SSZContainerAccessor; -import org.ethereum.beacon.ssz.access.SSZField; -import org.ethereum.beacon.ssz.annotation.SSZSerializable; -import org.ethereum.beacon.ssz.type.SSZContainerType; -import org.ethereum.beacon.ssz.type.SSZType; -import org.ethereum.beacon.ssz.type.SimpleTypeResolver; -import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.test.type.hash.TreeHashContainerTestCase; -import tech.pegasys.artemis.ethereum.core.Hash32; -import tech.pegasys.artemis.util.bytes.BytesValue; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.ethereum.beacon.test.SilentAsserts.assertEquals; -import static org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner.instantiateValue; -import static org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner.parseBasicFieldType; - -/** TestRunner for {@link TreeHashContainerTestCase} */ -public class TreeHashContainerRunner implements Runner { - private TreeHashContainerTestCase testCase; - private SSZObjectHasher hasher; - private List fields; - - public TreeHashContainerRunner(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof TreeHashContainerTestCase)) { - throw new RuntimeException( - "TestCase runner accepts only TreeHashContainerTestCase.class as input!"); - } - this.testCase = (TreeHashContainerTestCase) testCase; - Function hashFunction = Hashes::keccak256; - SSZHasher sszHasher = - new SSZBuilder().withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) - .withIncrementalHasher(true) - .withTypeResolverBuilder( - objects -> { - return new CustomTypeResolver(objects.getValue0(), objects.getValue1()); - }) - .buildHasher(hashFunction); - - this.hasher = new SSZObjectHasher(sszHasher); - } - - public Optional run() { - // Guaranteeing order when matching type and value content maps - List entries = new ArrayList<>(); - Map entrySet = new HashMap<>(); - testCase - .getType() - .forEach( - (key, value) -> { - CustomTypeValue entry = new CustomTypeValue(); - entry.setType(value); - entrySet.put(key, entry); - }); - testCase - .getValue() - .forEach( - (key, value) -> { - CustomTypeValue entry = entrySet.get(key); - entry.setValue(value); - }); - entrySet.entrySet().stream() - .sorted( - Comparator.comparingInt( - (Map.Entry entry) -> { - return Integer.valueOf(entry.getKey().substring(5)); // "fieldXXX" - })) - .forEachOrdered(e -> entries.add(e.getValue())); - this.fields = entries; - - String expected = testCase.getRoot(); - if (!expected.startsWith("0x")) { - expected = "0x" + expected; - } - String actual = hasher.getHash(entries).toString(); - return assertEquals(expected, actual); - } - - static class TestContainerAccessor implements SSZContainerAccessor { - private List fields; - - public TestContainerAccessor(List fields) { - this.fields = fields; - } - - @Override - public ContainerAccessor getAccessor(SSZField containerDescriptor) { - return new ContainerAccessor() { - @Override - public List getChildDescriptors() { - return fields.stream() - .map( - field -> { - String type = field.getType(); - return parseBasicFieldType(type); - }) - .collect(Collectors.toList()); - } - - @Override - public Object getChildValue(Object compositeInstance, int childIndex) { - String value = fields.get(childIndex).getValue(); - String type = fields.get(childIndex).getType(); - return instantiateValue(value, type); - } - }; - } - - @Override - public ContainerInstanceBuilder createInstanceBuilder(SSZField containerDescriptor) { - return null; - } - - @Override - public boolean isSupported(SSZField field) { - return field.getRawClass().equals(SerializableContainerMock.class); - } - } - - static class CustomTypeValue { - private String type; - private String value; - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - } - - @SSZSerializable - public static class SerializableContainerMock {} - - class CustomTypeResolver extends SimpleTypeResolver { - private AccessorResolver accessorResolver; - - public CustomTypeResolver( - AccessorResolver accessorResolver, ExternalVarResolver externalVarResolver) { - super(accessorResolver, externalVarResolver); - this.accessorResolver = accessorResolver; - } - - @Override - public SSZType resolveSSZType(SSZField descriptor) { - if (new HashSet(Arrays.asList(descriptor.getRawClass().getInterfaces())) - .contains(List.class)) { - TestContainerAccessor containerAccessor = new TestContainerAccessor(fields); - return new SSZContainerType(this, descriptor, containerAccessor); - } else { - return super.resolveSSZType(descriptor); - } - } - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashListRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashListRunner.java deleted file mode 100644 index 3bd1ae0b5..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashListRunner.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.ethereum.beacon.test.runner.hash; - -import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.consensus.hasher.SSZObjectHasher; -import org.ethereum.beacon.core.spec.SpecConstantsResolver; -import org.ethereum.beacon.crypto.Hashes; -import org.ethereum.beacon.ssz.ExternalVarResolver; -import org.ethereum.beacon.ssz.SSZBuilder; -import org.ethereum.beacon.ssz.SSZHasher; -import org.ethereum.beacon.ssz.access.AccessorResolver; -import org.ethereum.beacon.ssz.access.SSZField; -import org.ethereum.beacon.ssz.type.SSZType; -import org.ethereum.beacon.ssz.type.SimpleTypeResolver; -import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.test.type.hash.TreeHashListTestCase; -import tech.pegasys.artemis.ethereum.core.Hash32; -import tech.pegasys.artemis.util.bytes.BytesValue; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.ethereum.beacon.test.SilentAsserts.assertEquals; -import static org.ethereum.beacon.test.SilentAsserts.assertTrue; -import static org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner.instantiateValue; -import static org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner.parseBasicFieldType; - -/** TestRunner for {@link TreeHashListTestCase} for list cases */ -public class TreeHashListRunner implements Runner { - private TreeHashListTestCase testCase; - private SSZObjectHasher hasher; - private SSZField field; - - public TreeHashListRunner(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof TreeHashListTestCase)) { - throw new RuntimeException( - "TestCase runner accepts only TreeHashListTestCase.class as input!"); - } - this.testCase = (TreeHashListTestCase) testCase; - Function hashFunction = Hashes::keccak256; - SSZHasher sszHasher = - new SSZBuilder().withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) - .withIncrementalHasher(true) - .withTypeResolverBuilder( - objects -> { - return new CustomTypeResolver(objects.getValue0(), objects.getValue1()); - }) - .buildHasher(hashFunction); - - this.hasher = new SSZObjectHasher(sszHasher); - } - - private void activateSchemeMock(String type) { - this.field = parseBasicFieldType(type); - } - - public Optional run() { - assertTrue("Only one type parameter lists are supported", testCase.getType().size() == 1); - String internalType = testCase.getType().get(0); - activateSchemeMock(internalType); - List input = - testCase.getValue().stream() - .map(v -> instantiateValue(v, internalType)) - .collect(Collectors.toList()); - Hash32 res = hasher.getHash(input); - String expected = testCase.getRoot(); - if (!expected.startsWith("0x")) { - expected = "0x" + expected; - } - String actual = res.toString(); - return assertEquals(expected, actual); - } - - class CustomTypeResolver extends SimpleTypeResolver { - public CustomTypeResolver( - AccessorResolver accessorResolver, ExternalVarResolver externalVarResolver) { - super(accessorResolver, externalVarResolver); - } - - @Override - public SSZType resolveSSZType(SSZField descriptor) { - if (new HashSet(Arrays.asList(descriptor.getRawClass().getInterfaces())) - .contains(List.class)) { - return super.resolveSSZType(descriptor); - } else { - return super.resolveSSZType(field); - } - } - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashVectorRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashVectorRunner.java deleted file mode 100644 index 434d58f2c..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/runner/hash/TreeHashVectorRunner.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.ethereum.beacon.test.runner.hash; - -import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.consensus.hasher.SSZObjectHasher; -import org.ethereum.beacon.core.spec.SpecConstantsResolver; -import org.ethereum.beacon.crypto.Hashes; -import org.ethereum.beacon.ssz.ExternalVarResolver; -import org.ethereum.beacon.ssz.SSZBuilder; -import org.ethereum.beacon.ssz.SSZHasher; -import org.ethereum.beacon.ssz.access.AccessorResolver; -import org.ethereum.beacon.ssz.access.SSZField; -import org.ethereum.beacon.ssz.type.SSZListType; -import org.ethereum.beacon.ssz.type.SSZType; -import org.ethereum.beacon.ssz.type.SimpleTypeResolver; -import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.test.type.hash.TreeHashListTestCase; -import tech.pegasys.artemis.ethereum.core.Hash32; -import tech.pegasys.artemis.util.bytes.BytesValue; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.ethereum.beacon.test.SilentAsserts.assertEquals; -import static org.ethereum.beacon.test.SilentAsserts.assertTrue; -import static org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner.instantiateValue; -import static org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner.parseBasicFieldType; - -/** TestRunner for {@link TreeHashListTestCase} for vector cases */ -public class TreeHashVectorRunner implements Runner { - private TreeHashListTestCase testCase; - private SSZObjectHasher hasher; - private SSZField field; - private int vectorSize; - - public TreeHashVectorRunner(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof TreeHashListTestCase)) { - throw new RuntimeException( - "TestCase runner accepts only TreeHashListTestCase.class as input!"); - } - this.testCase = (TreeHashListTestCase) testCase; - Function hashFunction = Hashes::keccak256; - SSZHasher sszHasher = - new SSZBuilder().withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) - .withIncrementalHasher(true) - .withTypeResolverBuilder( - objects -> { - return new CustomTypeResolver(objects.getValue0(), objects.getValue1()); - }) - .buildHasher(hashFunction); - this.hasher = new SSZObjectHasher(sszHasher); - } - - private void activateSchemeMock(String type, int vectorSize) { - this.vectorSize = vectorSize; - this.field = parseBasicFieldType(type); - } - - public Optional run() { - assertTrue("Only two type parameters vectors are supported", testCase.getType().size() == 2); - String internalType = testCase.getType().get(0); - String vectorSize = testCase.getType().get(1); - activateSchemeMock(internalType, Integer.valueOf(vectorSize)); - List input = - testCase.getValue().stream() - .map(v -> instantiateValue(v, internalType)) - .collect(Collectors.toList()); - Hash32 res = hasher.getHash(input); - String expected = testCase.getRoot(); - if (!expected.startsWith("0x")) { - expected = "0x" + expected; - } - String actual = res.toString(); - return assertEquals(expected, actual); - } - - class CustomTypeResolver extends SimpleTypeResolver { - private AccessorResolver accessorResolver; - - public CustomTypeResolver( - AccessorResolver accessorResolver, ExternalVarResolver externalVarResolver) { - super(accessorResolver, externalVarResolver); - this.accessorResolver = accessorResolver; - } - - @Override - public SSZType resolveSSZType(SSZField descriptor) { - if (new HashSet(Arrays.asList(descriptor.getRawClass().getInterfaces())) - .contains(List.class)) { - return new SSZListType( - descriptor, this, accessorResolver.resolveListAccessor(descriptor).get(), vectorSize); - } else { - return super.resolveSSZType(field); - } - } - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszGenericRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszGenericRunner.java index 8cc8257c0..3fe0d4d57 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszGenericRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszGenericRunner.java @@ -11,24 +11,24 @@ import org.ethereum.beacon.ssz.access.container.SSZSchemeBuilder; import org.ethereum.beacon.ssz.annotation.SSZSerializable; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.ssz.SszGenericTestCase; +import org.ethereum.beacon.test.type.ssz.SszGenericCase; import org.ethereum.beacon.test.type.TestCase; import tech.pegasys.artemis.util.bytes.BytesValue; -/** TestRunner for {@link SszGenericTestCase} +/** TestRunner for {@link SszGenericCase} *

Test format description: https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats/ssz_generic */ public class SszGenericRunner implements Runner { - private SszGenericTestCase testCase; + private SszGenericCase testCase; private BeaconChainSpec spec; private SSZSchemeBuilder.SSZScheme currentScheme; private SSZSerializer sszSerializer; public SszGenericRunner(TestCase testCase, BeaconChainSpec spec) { - if (!(testCase instanceof SszGenericTestCase)) { - throw new RuntimeException("TestCase runner accepts only SszGenericTestCase.class as input!"); + if (!(testCase instanceof SszGenericCase)) { + throw new RuntimeException("TestCase runner accepts only SszGenericCase.class as input!"); } - this.testCase = (SszGenericTestCase) testCase; + this.testCase = (SszGenericCase) testCase; this.spec = spec; SSZBuilder builder = new SSZBuilder(); builder.withSSZSchemeBuilder(clazz -> currentScheme); diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java new file mode 100644 index 000000000..e514a6de6 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java @@ -0,0 +1,133 @@ +package org.ethereum.beacon.test.runner.ssz; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.google.common.reflect.ClassPath; +import com.google.common.reflect.ClassPath.ClassInfo; +import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.consensus.hasher.SSZObjectHasher; +import org.ethereum.beacon.core.spec.SpecConstantsResolver; +import org.ethereum.beacon.crypto.Hashes; +import org.ethereum.beacon.ssz.SSZBuilder; +import org.ethereum.beacon.ssz.SSZHasher; +import org.ethereum.beacon.ssz.SSZSerializer; +import org.ethereum.beacon.ssz.creator.ConstructorObjCreator; +import org.ethereum.beacon.test.runner.Runner; +import org.ethereum.beacon.test.runner.ssz.mapper.ObjectSerializer; +import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.ssz.SszStaticCase; +import tech.pegasys.artemis.ethereum.core.Hash32; +import tech.pegasys.artemis.util.bytes.BytesValue; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static org.ethereum.beacon.test.SilentAsserts.assertEquals; +import static org.ethereum.beacon.test.SilentAsserts.assertHexStrings; + +/** + * SSZ, Hash root, signing root tests for known types + * + *

Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/ssz_static/core.md + */ +public class SszStaticRunner implements Runner { + private SszStaticCase testCase; + private SSZObjectHasher baseHasher; + private SSZObjectHasher incHasher; + private SSZSerializer sszSerializer; + private ObjectMapper yamlMapper; + private BeaconChainSpec spec; + private Map objectSerializers = new HashMap<>(); + + public SszStaticRunner(TestCase testCase, BeaconChainSpec spec) { + if (!(testCase instanceof SszStaticCase)) { + throw new RuntimeException( + "TestCase runner accepts only SszStaticCase.class as input!"); + } + this.testCase = (SszStaticCase) testCase; + Function hashFunction = Hashes::keccak256; + SSZBuilder builder = new SSZBuilder(); + this.sszSerializer = builder.buildSerializer(); + SSZHasher baseSszHasher = + new SSZBuilder().withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) + .withIncrementalHasher(false) + .buildHasher(hashFunction); + this.baseHasher = new SSZObjectHasher(baseSszHasher); + SSZHasher incSszHasher = + new SSZBuilder().withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) + .withIncrementalHasher(true) + .buildHasher(hashFunction); + this.incHasher = new SSZObjectHasher(incSszHasher); + this.yamlMapper = new ObjectMapper(new YAMLFactory()); + Set mappers = findClassesInPackage("org.ethereum.beacon.test.runner.ssz.mapper"); + mappers.stream().map(this::fromInfo).map((Class mapperType) -> createInstance(mapperType, yamlMapper)).forEach(m -> { + if (m == null) { + return; // Couldn't create instance, for example, for interface + } + ObjectSerializer mapper = (ObjectSerializer) m; + objectSerializers.put(mapper.accepts(), mapper); + }); + this.spec = spec; + } + + private ObjectSerializer createInstance(Class mapperType, ObjectMapper jacksonMapper) { + return ConstructorObjCreator.createInstanceWithConstructor( + mapperType, + new Class[] {ObjectMapper.class}, + new Object[] {jacksonMapper} + ); + } + + private Set findClassesInPackage(String packageName) { + ClassPath classPath = null; + try { + classPath = ClassPath.from(getClass().getClassLoader()); + } catch (IOException e) { + throw new RuntimeException(e); + } + Set classes = classPath.getTopLevelClassesRecursive(packageName); + + return classes; + } + + private Class fromInfo(ClassInfo classInfo) { + Class valueType = null; + try { + valueType = Class.forName(classInfo.getName()); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + + return valueType; + } + + public Optional run() { + Set coreTypes = findClassesInPackage("org.ethereum.beacon.core"); + List classes = coreTypes.stream().filter((type) -> type.getSimpleName().endsWith(testCase.getTypeName())).collect(Collectors.toList()); + if (classes.size() != 1) { + return Optional.of(String.format("Failed: should be only one appropriate core class for %s (%s classes found) ", testCase.getTypeName(), classes.size())); + } + ClassInfo valueTypeInfo = classes.get(0); + Class valueType = fromInfo(valueTypeInfo); + Object fromSerialized = sszSerializer.decode(BytesValue.fromHexString(testCase.getSerialized()), valueType); + Object simplified = objectSerializers.get(valueType).map(fromSerialized); + ObjectNode expectedValue = yamlMapper.convertValue(testCase.getValue(), ObjectNode.class); + // XXX: expected goes second as our constructed node contains with overridden `equals` operators + // which should be used in comparison + assertEquals(simplified, expectedValue); + assertHexStrings(testCase.getRoot(), baseHasher.getHash(fromSerialized).toString()); + assertHexStrings(testCase.getRoot(), incHasher.getHash(fromSerialized).toString()); + if (testCase.getSigningRoot() != null) { + assertHexStrings(testCase.getSigningRoot(), spec.signed_root(fromSerialized).toString()); + } + + return Optional.empty(); + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataAndCustodyBitSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataAndCustodyBitSerializer.java new file mode 100644 index 000000000..da922113b --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataAndCustodyBitSerializer.java @@ -0,0 +1,27 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.attestation.AttestationDataAndCustodyBit; + +public class AttestationDataAndCustodyBitSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private AttestationDataSerializer attestationDataSerializer; + + public AttestationDataAndCustodyBitSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.attestationDataSerializer = new AttestationDataSerializer(mapper); + } + + @Override + public Class accepts() { + return AttestationDataAndCustodyBit.class; + } + + @Override + public ObjectNode map(AttestationDataAndCustodyBit instance) { + ObjectNode attestationDataAndCustodyBit = mapper.createObjectNode(); + attestationDataAndCustodyBit.set("data", attestationDataSerializer.map(instance.getData())); + attestationDataAndCustodyBit.put("custody_bit", instance.isCustodyBit()); + return attestationDataAndCustodyBit; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java new file mode 100644 index 000000000..e4e8947c7 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java @@ -0,0 +1,32 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.attestation.AttestationData; +import org.ethereum.beacon.core.state.Eth1Data; + +public class AttestationDataSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public AttestationDataSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return AttestationData.class; + } + + @Override + public ObjectNode map(AttestationData instance) { + ObjectNode attestationData = mapper.createObjectNode(); + ObjectSerializer.setUint64Field(attestationData, "slot", instance.getSlot()); + attestationData.put("beacon_block_root", instance.getBeaconBlockRoot().toString()); + ObjectSerializer.setUint64Field(attestationData, "source_epoch", instance.getSourceEpoch()); + attestationData.put("source_root", instance.getSourceRoot().toString()); + attestationData.put("target_root", instance.getTargetRoot().toString()); + ObjectSerializer.setUint64Field(attestationData, "shard", instance.getShard()); + attestationData.put("previous_crosslink_root", instance.getPreviousCrosslink().toString()); + attestationData.put("crosslink_data_root", instance.getCrosslinkDataRoot().toString()); + return attestationData; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationSerializer.java new file mode 100644 index 000000000..e2d75f225 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationSerializer.java @@ -0,0 +1,31 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.Attestation; +import org.ethereum.beacon.core.operations.attestation.AttestationDataAndCustodyBit; +import tech.pegasys.artemis.util.bytes.BytesValue; + +public class AttestationSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private AttestationDataSerializer attestationDataSerializer; + + public AttestationSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.attestationDataSerializer = new AttestationDataSerializer(mapper); + } + + @Override + public Class accepts() { + return Attestation.class; + } + + @Override + public ObjectNode map(Attestation instance) { + ObjectNode attestation = mapper.createObjectNode(); + attestation.put("aggregation_bitfield", instance.getAggregationBitfield().toString()); + attestation.set("data", attestationDataSerializer.map(instance.getData())); + attestation.put("custody_bitfield", instance.getCustodyBitfield().toString()); + attestation.put("signature", BytesValue.wrap(instance.getAggregateSignature().getArrayUnsafe()).toString()); + return attestation; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttesterSlashingSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttesterSlashingSerializer.java new file mode 100644 index 000000000..b30989956 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttesterSlashingSerializer.java @@ -0,0 +1,28 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.ProposerSlashing; +import org.ethereum.beacon.core.operations.slashing.AttesterSlashing; + +public class AttesterSlashingSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private IndexedAttestationSerializer indexedAttestationSerializer; + + public AttesterSlashingSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.indexedAttestationSerializer = new IndexedAttestationSerializer(mapper); + } + + @Override + public Class accepts() { + return AttesterSlashing.class; + } + + @Override + public ObjectNode map(AttesterSlashing instance) { + ObjectNode attesterSlashing = mapper.createObjectNode(); + attesterSlashing.set("attestation_1", indexedAttestationSerializer.map(instance.getSlashableAttestation1())); + attesterSlashing.set("attestation_2", indexedAttestationSerializer.map(instance.getSlashableAttestation2())); + return attesterSlashing; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java new file mode 100644 index 000000000..b2efe1ecc --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java @@ -0,0 +1,30 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.BeaconBlockHeader; +import org.ethereum.beacon.core.operations.deposit.DepositData; +import tech.pegasys.artemis.util.bytes.BytesValue; + +public class BeaconBlockHeaderSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public BeaconBlockHeaderSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return BeaconBlockHeader.class; + } + + @Override + public ObjectNode map(BeaconBlockHeader instance) { + ObjectNode beaconBlockHeader = mapper.createObjectNode(); + ObjectSerializer.setUint64Field(beaconBlockHeader, "slot", instance.getSlot()); + beaconBlockHeader.put("previous_block_root", instance.getPreviousBlockRoot().toString()); + beaconBlockHeader.put("state_root", instance.getStateRoot().toString()); + beaconBlockHeader.put("block_body_root", instance.getBlockBodyRoot().toString()); + beaconBlockHeader.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); + return beaconBlockHeader; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java new file mode 100644 index 000000000..f2477765e --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java @@ -0,0 +1,102 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.BeaconBlockBody; +import org.ethereum.beacon.core.BeaconState; +import org.ethereum.beacon.core.types.Gwei; +import tech.pegasys.artemis.ethereum.core.Hash32; +import tech.pegasys.artemis.util.uint.UInt64; + +public class BeaconStateSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private ForkSerializer forkSerializer; + private ValidatorSerializer validatorSerializer; + private PendingAttestationSerializer pendingAttestationSerializer; + private CrosslinkSerializer crosslinkSerializer; + private BeaconBlockHeaderSerializer beaconBlockHeaderSerializer; + private Eth1DataSerializer eth1DataSerializer; + + public BeaconStateSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.forkSerializer = new ForkSerializer(mapper); + this.validatorSerializer = new ValidatorSerializer(mapper); + this.pendingAttestationSerializer = new PendingAttestationSerializer(mapper); + this.crosslinkSerializer = new CrosslinkSerializer(mapper); + this.beaconBlockHeaderSerializer = new BeaconBlockHeaderSerializer(mapper); + this.eth1DataSerializer = new Eth1DataSerializer(mapper); + } + + @Override + public Class accepts() { + return BeaconState.class; + } + + @Override + public ObjectNode map(BeaconState instance) { + ObjectNode beaconState = mapper.createObjectNode(); + ObjectSerializer.setUint64Field(beaconState, "slot", instance.getSlot()); + ObjectSerializer.setUint64Field(beaconState, "genesis_time", instance.getGenesisTime()); + beaconState.set("fork", forkSerializer.map(instance.getFork())); + + ArrayNode validatorRegistryNode = mapper.createArrayNode(); + instance.getValidatorRegistry().stream().map(o -> validatorSerializer.map(o)).forEachOrdered(validatorRegistryNode::add); + beaconState.set("validator_registry", validatorRegistryNode); + ArrayNode balancesNode = mapper.createArrayNode(); + instance.getValidatorBalances().stream().map(ObjectSerializer::convert).forEachOrdered(balancesNode::add); + beaconState.set("balances", balancesNode); + + ArrayNode latestRandaoMixes = mapper.createArrayNode(); + instance.getLatestRandaoMixes().stream() + .map(Hash32::toString) + .forEachOrdered(latestRandaoMixes::add); + beaconState.set("latest_randao_mixes", latestRandaoMixes); + ObjectSerializer.setUint64Field(beaconState, "latest_start_shard", instance.getCurrentShufflingStartShard());// TODO + + ArrayNode previousEpochAttestationNode = mapper.createArrayNode(); + instance.getPreviousEpochAttestations().stream().map(o -> pendingAttestationSerializer.map(o)).forEachOrdered(previousEpochAttestationNode::add); + beaconState.set("previous_epoch_attestations", previousEpochAttestationNode); + ArrayNode currentEpochAttestationsNode = mapper.createArrayNode(); + instance.getCurrentEpochAttestations().stream().map(o -> pendingAttestationSerializer.map(o)).forEachOrdered(currentEpochAttestationsNode::add); + beaconState.set("current_epoch_attestations", currentEpochAttestationsNode); + ObjectSerializer.setUint64Field(beaconState, "previous_justified_epoch", instance.getPreviousJustifiedEpoch()); + ObjectSerializer.setUint64Field(beaconState, "current_justified_epoch", instance.getCurrentJustifiedEpoch()); + beaconState.put("previous_justified_root", instance.getPreviousJustifiedRoot().toString()); + beaconState.put("current_justified_root", instance.getCurrentJustifiedRoot().toString()); + beaconState.put("justification_bitfield", instance.getJustificationBitfield().toString()); + ObjectSerializer.setUint64Field(beaconState, "finalized_epoch", instance.getFinalizedEpoch()); + beaconState.put("finalized_root", instance.getFinalizedRoot().toString()); + + ArrayNode currentCrosslinksNode = mapper.createArrayNode(); + instance.getCurrentCrosslinks().stream().map(o -> crosslinkSerializer.map(o)).forEachOrdered(currentCrosslinksNode::add); + beaconState.set("current_crosslinks", currentCrosslinksNode); + ArrayNode previousCrosslinksNode = mapper.createArrayNode(); + instance.getPreviousCrosslinks().stream().map(o -> crosslinkSerializer.map(o)).forEachOrdered(previousCrosslinksNode::add); + beaconState.set("previous_crosslinks", previousCrosslinksNode); + ArrayNode latestBlockRootsNode = mapper.createArrayNode(); + instance.getLatestBlockRoots().stream().map(Hash32::toString).forEachOrdered(latestBlockRootsNode::add); + beaconState.set("latest_block_roots", latestBlockRootsNode); + ArrayNode latestStateRootsNode = mapper.createArrayNode(); + instance.getLatestStateRoots().stream().map(Hash32::toString).forEachOrdered(latestStateRootsNode::add); + beaconState.set("latest_state_roots", latestStateRootsNode); + ArrayNode latestActiveIndexRootsNode = mapper.createArrayNode(); + instance.getLatestActiveIndexRoots().stream().map(Hash32::toString).forEachOrdered(latestActiveIndexRootsNode::add); + beaconState.set("latest_active_index_roots", latestActiveIndexRootsNode); + ArrayNode latestSlashedBalancesNode = mapper.createArrayNode(); + instance.getLatestSlashedBalances().stream() + .map(ObjectSerializer::convert) + .forEachOrdered(latestSlashedBalancesNode::add); + beaconState.set("latest_slashed_balances", latestSlashedBalancesNode); + beaconState.set("latest_block_header", beaconBlockHeaderSerializer.map(instance.getLatestBlockHeader())); + ArrayNode historicalRootsNode = mapper.createArrayNode(); + instance.getHistoricalRoots().stream().map(Hash32::toString).forEachOrdered(historicalRootsNode::add); + beaconState.set("historical_roots", historicalRootsNode); + + beaconState.set("latest_eth1_data", eth1DataSerializer.map(instance.getLatestEth1Data())); +// ArrayNode eth1DataVotesNode = mapper.createArrayNode(); TODO +// instance.getEth1DataVotes().stream().map(o -> eth1DataSerializer.map(o)).forEachOrdered(eth1DataVotesNode::add); +// beaconState.set("eth1_data_votes", eth1DataVotesNode); + ObjectSerializer.setUint64Field(beaconState, "deposit_index", instance.getDepositIndex()); + return beaconState; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockBodySerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockBodySerializer.java new file mode 100644 index 000000000..7fa9974ba --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockBodySerializer.java @@ -0,0 +1,61 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.BeaconBlockBody; +import org.ethereum.beacon.core.state.HistoricalBatch; + +import java.util.Objects; + +public class BlockBodySerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private Eth1DataSerializer eth1DataSerializer; + private ProposerSlashingSerializer proposerSlashingSerializer; + private AttesterSlashingSerializer attesterSlashingSerializer; + private AttestationSerializer attestationSerializer; + private DepositSerializer depositSerializer; + private VoluntaryExitSerializer voluntaryExitSerializer; + private TransferSerializer transferSerializer; + + public BlockBodySerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.eth1DataSerializer = new Eth1DataSerializer(mapper); + this.proposerSlashingSerializer = new ProposerSlashingSerializer(mapper); + this.attesterSlashingSerializer = new AttesterSlashingSerializer(mapper); + this.attestationSerializer = new AttestationSerializer(mapper); + this.depositSerializer = new DepositSerializer(mapper); + this.voluntaryExitSerializer = new VoluntaryExitSerializer(mapper); + this.transferSerializer = new TransferSerializer(mapper); + } + + @Override + public Class accepts() { + return BeaconBlockBody.class; + } + + @Override + public ObjectNode map(BeaconBlockBody instance) { + ObjectNode blockBody = mapper.createObjectNode(); + blockBody.put("randao_reveal", instance.getRandaoReveal().toString()); + blockBody.set("eth1_data", eth1DataSerializer.map(instance.getEth1Data())); + ArrayNode proposerSlashingNode = mapper.createArrayNode(); + instance.getProposerSlashings().stream().map(o -> proposerSlashingSerializer.map(o)).forEachOrdered(proposerSlashingNode::add); + blockBody.set("proposer_slashings", proposerSlashingNode); + ArrayNode attesterSlashingNode = mapper.createArrayNode(); + instance.getAttesterSlashings().stream().map(o -> attesterSlashingSerializer.map(o)).forEachOrdered(attesterSlashingNode::add); + blockBody.set("attester_slashings", attesterSlashingNode); + ArrayNode attestationsNode = mapper.createArrayNode(); + instance.getAttestations().stream().map(o -> attestationSerializer.map(o)).forEachOrdered(attestationsNode::add); + blockBody.set("attestations", attestationsNode); + ArrayNode depositsNode = mapper.createArrayNode(); + instance.getDeposits().stream().map(o -> depositSerializer.map(o)).forEachOrdered(depositsNode::add); + blockBody.set("deposits", depositsNode); + ArrayNode voluntaryExitsNode = mapper.createArrayNode(); + instance.getVoluntaryExits().stream().map(o -> voluntaryExitSerializer.map(o)).forEachOrdered(voluntaryExitsNode::add); + blockBody.set("voluntary_exits", voluntaryExitsNode); + ArrayNode transfersNode = mapper.createArrayNode(); + instance.getTransfers().stream().map(o -> transferSerializer.map(o)).forEachOrdered(transfersNode::add); + blockBody.set("transfers", transfersNode); + return blockBody; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java new file mode 100644 index 000000000..383bee82f --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java @@ -0,0 +1,35 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.BeaconBlock; +import org.ethereum.beacon.core.operations.Deposit; +import tech.pegasys.artemis.util.bytes.BytesValue; + +import java.util.Objects; + +public class BlockSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private BlockBodySerializer blockBodySerializer; + + public BlockSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.blockBodySerializer = new BlockBodySerializer(mapper); + } + + @Override + public Class accepts() { + return BeaconBlock.class; + } + + @Override + public ObjectNode map(BeaconBlock instance) { + ObjectNode beaconBlock = mapper.createObjectNode(); + ObjectSerializer.setUint64Field(beaconBlock, "slot", instance.getSlot()); + beaconBlock.put("previous_block_root", instance.getPreviousBlockRoot().toString()); + beaconBlock.put("state_root", instance.getStateRoot().toString()); + beaconBlock.set("body", blockBodySerializer.map(instance.getBody())); + beaconBlock.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); + return beaconBlock; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java new file mode 100644 index 000000000..7b6801ab3 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java @@ -0,0 +1,26 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.attestation.Crosslink; + +public class CrosslinkSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public CrosslinkSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return Crosslink.class; + } + + @Override + public ObjectNode map(Crosslink instance) { + ObjectNode crosslink = mapper.createObjectNode(); + ObjectSerializer.setUint64Field(crosslink, "epoch", instance.getEpoch()); +// crosslink.put("previous_crosslink_root", instance.get); TODO + crosslink.put("crosslink_data_root", instance.getCrosslinkDataRoot().toString()); + return crosslink; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java new file mode 100644 index 000000000..7808dcf27 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java @@ -0,0 +1,29 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.deposit.DepositData; +import org.ethereum.beacon.core.state.Fork; +import tech.pegasys.artemis.util.bytes.BytesValue; + +public class DepositDataSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public DepositDataSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return DepositData.class; + } + + @Override + public ObjectNode map(DepositData instance) { + ObjectNode depositData = mapper.createObjectNode(); + depositData.put("pubkey", BytesValue.wrap(instance.getDepositInput().getPubKey().getArrayUnsafe()).toString()); + depositData.put("withdrawal_credentials", instance.getDepositInput().getWithdrawalCredentials().toString()); + ObjectSerializer.setUint64Field(depositData, "amount", instance.getAmount()); + depositData.put("signature", BytesValue.wrap(instance.getDepositInput().getProofOfPossession().getArrayUnsafe()).toString()); + return depositData; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositSerializer.java new file mode 100644 index 000000000..2f4231267 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositSerializer.java @@ -0,0 +1,33 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.Deposit; + +import java.util.Objects; + +public class DepositSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private DepositDataSerializer depositDataSerializer; + + public DepositSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.depositDataSerializer = new DepositDataSerializer(mapper); + } + + @Override + public Class accepts() { + return Deposit.class; + } + + @Override + public ObjectNode map(Deposit instance) { + ObjectNode attestation = mapper.createObjectNode(); + ArrayNode proofNode = mapper.createArrayNode(); + instance.getProof().stream().map(Objects::toString).forEachOrdered(proofNode::add); + attestation.set("proof", proofNode); + attestation.put("index", instance.getIndex().getValue()); + attestation.set("data", depositDataSerializer.map(instance.getDepositData())); + return attestation; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java new file mode 100644 index 000000000..5203b2f0e --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java @@ -0,0 +1,27 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.attestation.Crosslink; +import org.ethereum.beacon.core.state.Eth1Data; + +public class Eth1DataSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public Eth1DataSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return Eth1Data.class; + } + + @Override + public ObjectNode map(Eth1Data instance) { + ObjectNode eth1Data = mapper.createObjectNode(); + eth1Data.put("deposit_root", instance.getDepositRoot().toString()); +// eth1Data.put("deposit_count", instance.get); TODO + eth1Data.put("block_hash", instance.getBlockHash().toString()); + return eth1Data; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/HistoricalBatchSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/HistoricalBatchSerializer.java new file mode 100644 index 000000000..949fc796b --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/HistoricalBatchSerializer.java @@ -0,0 +1,32 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.state.HistoricalBatch; + +import java.util.Objects; + +public class HistoricalBatchSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public HistoricalBatchSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return HistoricalBatch.class; + } + + @Override + public ObjectNode map(HistoricalBatch instance) { + ObjectNode historicalBatch = mapper.createObjectNode(); + ArrayNode blockRootsNode = mapper.createArrayNode(); + instance.getBlockRoots().stream().map(Objects::toString).forEachOrdered(blockRootsNode::add); + historicalBatch.set("block_roots", blockRootsNode); + ArrayNode stateRootsNode = mapper.createArrayNode(); + instance.getStateRoots().stream().map(Objects::toString).forEachOrdered(stateRootsNode::add); + historicalBatch.set("state_roots", stateRootsNode); + return historicalBatch; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java new file mode 100644 index 000000000..74e508322 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java @@ -0,0 +1,34 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.slashing.SlashableAttestation; +import tech.pegasys.artemis.util.bytes.BytesValue; +import tech.pegasys.artemis.util.uint.UInt64; +// TODO: should be IndexedAttestation +public class IndexedAttestationSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private AttestationDataSerializer attestationDataSerializer; + + public IndexedAttestationSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.attestationDataSerializer = new AttestationDataSerializer(mapper); + } + + @Override + public Class accepts() { + return SlashableAttestation.class; + } + + @Override + public ObjectNode map(SlashableAttestation instance) { + ObjectNode slashableAttestation = mapper.createObjectNode(); + ArrayNode indices0 = mapper.createArrayNode(); + instance.getValidatorIndices().stream().map(ObjectSerializer::convert).forEachOrdered(indices0::add); + slashableAttestation.set("custody_bit_0_indices", indices0); +// slashableAttestation.put("custody_bit_1_indices", instance.get); TODO + slashableAttestation.set("data", attestationDataSerializer.map(instance.getData())); + slashableAttestation.put("signature", BytesValue.wrap(instance.getAggregateSingature().getArrayUnsafe()).toString()); + return slashableAttestation; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ObjectSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ObjectSerializer.java new file mode 100644 index 000000000..53af52ec1 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ObjectSerializer.java @@ -0,0 +1,45 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.BigIntegerNode; +import com.fasterxml.jackson.databind.node.IntNode; +import com.fasterxml.jackson.databind.node.LongNode; +import com.fasterxml.jackson.databind.node.NumericNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import tech.pegasys.artemis.util.uint.UInt64; + +import java.math.BigInteger; + +public interface ObjectSerializer { + Class accepts(); + + Object map(V instance); + + static void setUint64Field(ObjectNode node, String fieldName, UInt64 value) { + node.set(fieldName, convert(value)); + } + + static JsonNode convert(UInt64 value) { + return new ComparableBigIntegerNode(value.toBI()); + } + + public static class ComparableBigIntegerNode extends BigIntegerNode { + ComparableBigIntegerNode(BigInteger v) { + super(v); + } + + @Override + public boolean equals(Object o) { + boolean superResult = super.equals(o); + if (superResult) { + return true; + } + + if (o instanceof IntNode || o instanceof LongNode) { + return ((NumericNode) o).bigIntegerValue().equals(this.bigIntegerValue()); + } + + return false; + } + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java new file mode 100644 index 000000000..c1c0405b9 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java @@ -0,0 +1,29 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.state.PendingAttestation; +import org.ethereum.beacon.core.state.ValidatorRecord; + +public class PendingAttestationSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private AttestationDataSerializer attestationDataSerializer; + + public PendingAttestationSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.attestationDataSerializer = new AttestationDataSerializer(mapper); + } + + @Override + public Class accepts() { + return PendingAttestation.class; + } + + @Override + public ObjectNode map(PendingAttestation instance) { + ObjectNode pendingAttestation = mapper.createObjectNode(); + pendingAttestation.put("aggregation_bitfield", instance.getAggregationBitfield().toString()); + pendingAttestation.set("data", attestationDataSerializer.map(instance.getData())); + ObjectSerializer.setUint64Field(pendingAttestation, "inclusion_slot", instance.getInclusionSlot()); + return pendingAttestation; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ProposerSlashingSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ProposerSlashingSerializer.java new file mode 100644 index 000000000..8e797d3de --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ProposerSlashingSerializer.java @@ -0,0 +1,32 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.ProposerSlashing; +import org.ethereum.beacon.core.state.HistoricalBatch; + +import java.util.Objects; + +public class ProposerSlashingSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + private BeaconBlockHeaderSerializer beaconBlockHeaderSerializer; + + public ProposerSlashingSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + this.beaconBlockHeaderSerializer = new BeaconBlockHeaderSerializer(mapper); + } + + @Override + public Class accepts() { + return ProposerSlashing.class; + } + + @Override + public ObjectNode map(ProposerSlashing instance) { + ObjectNode proposerSlashing = mapper.createObjectNode(); + proposerSlashing.put("proposer_index", instance.getProposerIndex().getValue()); + proposerSlashing.set("header_1", beaconBlockHeaderSerializer.map(instance.getHeader1())); + proposerSlashing.set("header_2", beaconBlockHeaderSerializer.map(instance.getHeader2())); + return proposerSlashing; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/TransferSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/TransferSerializer.java new file mode 100644 index 000000000..cfd1ca89f --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/TransferSerializer.java @@ -0,0 +1,31 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.Transfer; +import tech.pegasys.artemis.util.bytes.BytesValue; + +public class TransferSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public TransferSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return Transfer.class; + } + + @Override + public ObjectNode map(Transfer instance) { + ObjectNode transfer = mapper.createObjectNode(); + ObjectSerializer.setUint64Field(transfer, "sender", instance.getSender()); + ObjectSerializer.setUint64Field(transfer, "recipient", instance.getRecipient()); + ObjectSerializer.setUint64Field(transfer, "amount", instance.getAmount()); + ObjectSerializer.setUint64Field(transfer, "fee", instance.getFee()); + ObjectSerializer.setUint64Field(transfer, "slot", instance.getSlot()); + transfer.put("pubkey", BytesValue.wrap(instance.getPubkey().getArrayUnsafe()).toString()); + transfer.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); + return transfer; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java new file mode 100644 index 000000000..4fdec1784 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java @@ -0,0 +1,33 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.BeaconBlockHeader; +import org.ethereum.beacon.core.state.ValidatorRecord; +import tech.pegasys.artemis.util.bytes.BytesValue; + +public class ValidatorSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public ValidatorSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return ValidatorRecord.class; + } + + @Override + public ObjectNode map(ValidatorRecord instance) { + ObjectNode validatorRecord = mapper.createObjectNode(); + validatorRecord.put("pubkey", BytesValue.wrap(instance.getPubKey().getArrayUnsafe()).toString()); + validatorRecord.put("withdrawal_credentials", instance.getWithdrawalCredentials().toString()); +// ObjectSerializer.setUint64Field(validatorRecord, "activation_eligibility_epoch", instance.get()); TODO + ObjectSerializer.setUint64Field(validatorRecord, "activation_epoch", instance.getActivationEpoch()); + ObjectSerializer.setUint64Field(validatorRecord, "exit_epoch", instance.getExitEpoch()); + ObjectSerializer.setUint64Field(validatorRecord, "withdrawable_epoch", instance.getWithdrawableEpoch()); + validatorRecord.put("slashed", instance.getSlashed()); +// validatorRecord.put("high_balance", instance.get()); TODO + return validatorRecord; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/VoluntaryExitSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/VoluntaryExitSerializer.java new file mode 100644 index 000000000..e83e0580b --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/VoluntaryExitSerializer.java @@ -0,0 +1,27 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.operations.VoluntaryExit; +import tech.pegasys.artemis.util.bytes.BytesValue; + +public class VoluntaryExitSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public VoluntaryExitSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return VoluntaryExit.class; + } + + @Override + public ObjectNode map(VoluntaryExit instance) { + ObjectNode voluntaryExit = mapper.createObjectNode(); + ObjectSerializer.setUint64Field(voluntaryExit, "epoch", instance.getEpoch()); + ObjectSerializer.setUint64Field(voluntaryExit, "validator_index", instance.getValidatorIndex()); + voluntaryExit.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); + return voluntaryExit; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashBasicTest.java b/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashBasicTest.java deleted file mode 100644 index 09bf2f83c..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashBasicTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.ethereum.beacon.test.type.hash; - -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.test.type.TestSkeleton; - -import java.util.List; - -/** Container for basic types tree hash tests, no containers, lists etc. */ -public class TreeHashBasicTest extends TestSkeleton { - public List getTestCases() { - return testCases; - } - - public void setTestCases(List testCases) { - this.testCases = (List) (List) testCases; - } - - @Override - public String toString() { - return "Test \"" + getTitle() + " " + getVersion() + '\"'; - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashBasicTestCase.java b/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashBasicTestCase.java deleted file mode 100644 index ea77af823..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashBasicTestCase.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.ethereum.beacon.test.type.hash; - -import org.ethereum.beacon.test.type.TestCase; - -import java.util.List; - -/** Tree hash test case with basic value like number */ -public class TreeHashBasicTestCase implements TestCase { - private String type; - private String root; - private List tags; - private String value; - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getRoot() { - return root; - } - - public void setRoot(String root) { - this.root = root; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashContainerTestCase.java b/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashContainerTestCase.java deleted file mode 100644 index b495c7993..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashContainerTestCase.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.ethereum.beacon.test.type.hash; - -import org.ethereum.beacon.test.type.TestCase; - -import java.util.List; -import java.util.Map; - -/** Tree hash test case with container */ -public class TreeHashContainerTestCase implements TestCase { - private Map type; - private String root; - private List tags; - private Map value; - - public String getRoot() { - return root; - } - - public void setRoot(String root) { - this.root = root; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public Map getType() { - return type; - } - - public void setType(Map type) { - this.type = type; - } - - public Map getValue() { - return value; - } - - public void setValue(Map value) { - this.value = value; - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashListTest.java b/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashListTest.java deleted file mode 100644 index 90782e459..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashListTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.ethereum.beacon.test.type.hash; - -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.test.type.TestSkeleton; - -import java.util.List; - -/** Tree hash test with list/vector cases */ -public class TreeHashListTest extends TestSkeleton { - public List getTestCases() { - return testCases; - } - - public void setTestCases(List testCases) { - this.testCases = (List) (List) testCases; - } - - @Override - public String toString() { - return "Test \"" + getTitle() + " " + getVersion() + '\"'; - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashListTestCase.java b/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashListTestCase.java deleted file mode 100644 index ddc7e3e1c..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashListTestCase.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.ethereum.beacon.test.type.hash; - -import org.ethereum.beacon.test.type.TestCase; - -import java.util.List; - -/** Tree hash list/vector test case */ -public class TreeHashListTestCase implements TestCase { - private List type; - private String root; - private List tags; - private List value; - - public String getRoot() { - return root; - } - - public void setRoot(String root) { - this.root = root; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public List getType() { - return type; - } - - public void setType(List type) { - this.type = type; - } - - public List getValue() { - return value; - } - - public void setValue(List value) { - this.value = value; - } -} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTestCase.java b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericCase.java similarity index 95% rename from test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTestCase.java rename to test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericCase.java index 346ccf427..0aa301b76 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTestCase.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericCase.java @@ -10,7 +10,7 @@ *

Test format description: https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats/ssz_generic */ -public class SszGenericTestCase implements TestCase { +public class SszGenericCase implements TestCase { private String type; private String valid; private String ssz; diff --git a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTest.java b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTest.java index 955dab2f4..1119e64e6 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTest.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszGenericTest.java @@ -13,7 +13,7 @@ public List getTestCases() { return testCases; } - public void setTestCases(List testCases) { + public void setTestCases(List testCases) { this.testCases = (List) (List) testCases; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszStaticCase.java b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszStaticCase.java new file mode 100644 index 000000000..620711e9b --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszStaticCase.java @@ -0,0 +1,62 @@ +package org.ethereum.beacon.test.type.ssz; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.ethereum.beacon.test.type.TestCase; + +/** + * Ssz static tests with known containers. + * + *

Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/ssz_static/core.md + */ +public class SszStaticCase implements TestCase { + @JsonProperty("type_name") + private String typeName; + + private Object value; + private String serialized; + private String root; + + @JsonProperty("signing_root") + private String signingRoot; + + public String getTypeName() { + return typeName; + } + + public void setTypeName(String typeName) { + this.typeName = typeName; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public String getSerialized() { + return serialized; + } + + public void setSerialized(String serialized) { + this.serialized = serialized; + } + + public String getRoot() { + return root; + } + + public void setRoot(String root) { + this.root = root; + } + + public String getSigningRoot() { + return signingRoot; + } + + public void setSigningRoot(String signingRoot) { + this.signingRoot = signingRoot; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashContainerTest.java b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszStaticTest.java similarity index 51% rename from test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashContainerTest.java rename to test/src/test/java/org/ethereum/beacon/test/type/ssz/SszStaticTest.java index 7bdc53b44..983f44979 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/hash/TreeHashContainerTest.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/ssz/SszStaticTest.java @@ -1,22 +1,22 @@ -package org.ethereum.beacon.test.type.hash; +package org.ethereum.beacon.test.type.ssz; import org.ethereum.beacon.test.type.TestCase; import org.ethereum.beacon.test.type.TestSkeleton; import java.util.List; -/** Tree hash tests with containers */ -public class TreeHashContainerTest extends TestSkeleton { +/** Ssz static tests with known containers */ +public class SszStaticTest extends TestSkeleton { public List getTestCases() { return testCases; } - public void setTestCases(List testCases) { + public void setTestCases(List testCases) { this.testCases = (List) (List) testCases; } @Override public String toString() { - return "Test \"" + getTitle() + " " + getVersion() + '\"'; + return "Test \"" + getTitle() + " [" + String.join(",", getForks()) + "]\""; } } diff --git a/types/src/main/java/tech/pegasys/artemis/util/uint/UInt64.java b/types/src/main/java/tech/pegasys/artemis/util/uint/UInt64.java index ae2f434e9..dfe964d60 100644 --- a/types/src/main/java/tech/pegasys/artemis/util/uint/UInt64.java +++ b/types/src/main/java/tech/pegasys/artemis/util/uint/UInt64.java @@ -14,6 +14,8 @@ package tech.pegasys.artemis.util.uint; import com.google.common.primitives.UnsignedLongs; + +import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Objects; @@ -434,6 +436,10 @@ public long longValue() { return getValue(); } + public BigInteger toBI() { + return new BigInteger(1, toBytesBigEndian().extractArray()); + } + @Override public float floatValue() { return getValue(); From 6aae5fe8912e89de7a2943d056feff285b78c810 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 14:19:42 +0300 Subject: [PATCH 05/42] test: forgotten mapper for Fork class added to ssz tests --- .../runner/ssz/mapper/ForkSerializer.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ForkSerializer.java diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ForkSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ForkSerializer.java new file mode 100644 index 000000000..63533c334 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ForkSerializer.java @@ -0,0 +1,26 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.ethereum.beacon.core.state.Fork; + +public class ForkSerializer implements ObjectSerializer { + private com.fasterxml.jackson.databind.ObjectMapper mapper; + + public ForkSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public Class accepts() { + return Fork.class; + } + + @Override + public ObjectNode map(Fork instance) { + ObjectNode fork = mapper.createObjectNode(); + fork.put("previous_version", instance.getPreviousVersion().toString()); + fork.put("current_version", instance.getCurrentVersion().toString()); + ObjectSerializer.setUint64Field(fork, "epoch", instance.getEpoch()); + return fork; + } +} From ece8a8b62a3370fb4729acfc0977d014804b8f7f Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 16:37:35 +0300 Subject: [PATCH 06/42] test: update serializer/mappers according to models updated to v0.6.0 --- .../ssz/mapper/AttestationDataSerializer.java | 3 +-- .../ssz/mapper/AttestationSerializer.java | 3 +-- .../mapper/AttesterSlashingSerializer.java | 4 ++-- .../mapper/BeaconBlockHeaderSerializer.java | 1 - .../ssz/mapper/BeaconStateSerializer.java | 21 ++++++++----------- .../ssz/mapper/BlockBodySerializer.java | 3 --- .../runner/ssz/mapper/BlockSerializer.java | 4 ---- .../ssz/mapper/CrosslinkSerializer.java | 2 +- .../ssz/mapper/DepositDataSerializer.java | 6 +++--- .../runner/ssz/mapper/DepositSerializer.java | 2 +- .../runner/ssz/mapper/Eth1DataSerializer.java | 3 +-- .../mapper/IndexedAttestationSerializer.java | 19 +++++++++-------- .../mapper/PendingAttestationSerializer.java | 1 - .../mapper/ProposerSlashingSerializer.java | 4 ---- .../ssz/mapper/ValidatorSerializer.java | 5 ++--- 15 files changed, 31 insertions(+), 50 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java index e4e8947c7..a793766fc 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import org.ethereum.beacon.core.operations.attestation.AttestationData; -import org.ethereum.beacon.core.state.Eth1Data; public class AttestationDataSerializer implements ObjectSerializer { private com.fasterxml.jackson.databind.ObjectMapper mapper; @@ -25,7 +24,7 @@ public ObjectNode map(AttestationData instance) { attestationData.put("source_root", instance.getSourceRoot().toString()); attestationData.put("target_root", instance.getTargetRoot().toString()); ObjectSerializer.setUint64Field(attestationData, "shard", instance.getShard()); - attestationData.put("previous_crosslink_root", instance.getPreviousCrosslink().toString()); + attestationData.put("previous_crosslink_root", instance.getPreviousCrosslinkRoot().toString()); attestationData.put("crosslink_data_root", instance.getCrosslinkDataRoot().toString()); return attestationData; } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationSerializer.java index e2d75f225..1592a48f1 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationSerializer.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import org.ethereum.beacon.core.operations.Attestation; -import org.ethereum.beacon.core.operations.attestation.AttestationDataAndCustodyBit; import tech.pegasys.artemis.util.bytes.BytesValue; public class AttestationSerializer implements ObjectSerializer { @@ -25,7 +24,7 @@ public ObjectNode map(Attestation instance) { attestation.put("aggregation_bitfield", instance.getAggregationBitfield().toString()); attestation.set("data", attestationDataSerializer.map(instance.getData())); attestation.put("custody_bitfield", instance.getCustodyBitfield().toString()); - attestation.put("signature", BytesValue.wrap(instance.getAggregateSignature().getArrayUnsafe()).toString()); + attestation.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); return attestation; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttesterSlashingSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttesterSlashingSerializer.java index b30989956..82ab399b2 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttesterSlashingSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttesterSlashingSerializer.java @@ -21,8 +21,8 @@ public Class accepts() { @Override public ObjectNode map(AttesterSlashing instance) { ObjectNode attesterSlashing = mapper.createObjectNode(); - attesterSlashing.set("attestation_1", indexedAttestationSerializer.map(instance.getSlashableAttestation1())); - attesterSlashing.set("attestation_2", indexedAttestationSerializer.map(instance.getSlashableAttestation2())); + attesterSlashing.set("attestation_1", indexedAttestationSerializer.map(instance.getAttestation1())); + attesterSlashing.set("attestation_2", indexedAttestationSerializer.map(instance.getAttestation2())); return attesterSlashing; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java index b2efe1ecc..4094d7109 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import org.ethereum.beacon.core.BeaconBlockHeader; -import org.ethereum.beacon.core.operations.deposit.DepositData; import tech.pegasys.artemis.util.bytes.BytesValue; public class BeaconBlockHeaderSerializer implements ObjectSerializer { diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java index f2477765e..1729b2b97 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java @@ -2,13 +2,10 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import org.ethereum.beacon.core.BeaconBlockBody; -import org.ethereum.beacon.core.BeaconState; -import org.ethereum.beacon.core.types.Gwei; +import org.ethereum.beacon.core.state.BeaconStateImpl; import tech.pegasys.artemis.ethereum.core.Hash32; -import tech.pegasys.artemis.util.uint.UInt64; -public class BeaconStateSerializer implements ObjectSerializer { +public class BeaconStateSerializer implements ObjectSerializer { private com.fasterxml.jackson.databind.ObjectMapper mapper; private ForkSerializer forkSerializer; private ValidatorSerializer validatorSerializer; @@ -29,11 +26,11 @@ public BeaconStateSerializer(com.fasterxml.jackson.databind.ObjectMapper mapper) @Override public Class accepts() { - return BeaconState.class; + return BeaconStateImpl.class; } @Override - public ObjectNode map(BeaconState instance) { + public ObjectNode map(BeaconStateImpl instance) { ObjectNode beaconState = mapper.createObjectNode(); ObjectSerializer.setUint64Field(beaconState, "slot", instance.getSlot()); ObjectSerializer.setUint64Field(beaconState, "genesis_time", instance.getGenesisTime()); @@ -43,7 +40,7 @@ public ObjectNode map(BeaconState instance) { instance.getValidatorRegistry().stream().map(o -> validatorSerializer.map(o)).forEachOrdered(validatorRegistryNode::add); beaconState.set("validator_registry", validatorRegistryNode); ArrayNode balancesNode = mapper.createArrayNode(); - instance.getValidatorBalances().stream().map(ObjectSerializer::convert).forEachOrdered(balancesNode::add); + instance.getBalances().stream().map(ObjectSerializer::convert).forEachOrdered(balancesNode::add); beaconState.set("balances", balancesNode); ArrayNode latestRandaoMixes = mapper.createArrayNode(); @@ -51,7 +48,7 @@ public ObjectNode map(BeaconState instance) { .map(Hash32::toString) .forEachOrdered(latestRandaoMixes::add); beaconState.set("latest_randao_mixes", latestRandaoMixes); - ObjectSerializer.setUint64Field(beaconState, "latest_start_shard", instance.getCurrentShufflingStartShard());// TODO + ObjectSerializer.setUint64Field(beaconState, "latest_start_shard", instance.getLatestStartShard()); ArrayNode previousEpochAttestationNode = mapper.createArrayNode(); instance.getPreviousEpochAttestations().stream().map(o -> pendingAttestationSerializer.map(o)).forEachOrdered(previousEpochAttestationNode::add); @@ -93,9 +90,9 @@ public ObjectNode map(BeaconState instance) { beaconState.set("historical_roots", historicalRootsNode); beaconState.set("latest_eth1_data", eth1DataSerializer.map(instance.getLatestEth1Data())); -// ArrayNode eth1DataVotesNode = mapper.createArrayNode(); TODO -// instance.getEth1DataVotes().stream().map(o -> eth1DataSerializer.map(o)).forEachOrdered(eth1DataVotesNode::add); -// beaconState.set("eth1_data_votes", eth1DataVotesNode); + ArrayNode eth1DataVotesNode = mapper.createArrayNode(); + instance.getEth1DataVotes().stream().map(o -> eth1DataSerializer.map(o)).forEachOrdered(eth1DataVotesNode::add); + beaconState.set("eth1_data_votes", eth1DataVotesNode); ObjectSerializer.setUint64Field(beaconState, "deposit_index", instance.getDepositIndex()); return beaconState; } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockBodySerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockBodySerializer.java index 7fa9974ba..2e3b7b88c 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockBodySerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockBodySerializer.java @@ -3,9 +3,6 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.ethereum.beacon.core.BeaconBlockBody; -import org.ethereum.beacon.core.state.HistoricalBatch; - -import java.util.Objects; public class BlockBodySerializer implements ObjectSerializer { private com.fasterxml.jackson.databind.ObjectMapper mapper; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java index 383bee82f..c4553678d 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java @@ -1,13 +1,9 @@ package org.ethereum.beacon.test.runner.ssz.mapper; -import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.ethereum.beacon.core.BeaconBlock; -import org.ethereum.beacon.core.operations.Deposit; import tech.pegasys.artemis.util.bytes.BytesValue; -import java.util.Objects; - public class BlockSerializer implements ObjectSerializer { private com.fasterxml.jackson.databind.ObjectMapper mapper; private BlockBodySerializer blockBodySerializer; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java index 7b6801ab3..21707d5aa 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java @@ -19,7 +19,7 @@ public Class accepts() { public ObjectNode map(Crosslink instance) { ObjectNode crosslink = mapper.createObjectNode(); ObjectSerializer.setUint64Field(crosslink, "epoch", instance.getEpoch()); -// crosslink.put("previous_crosslink_root", instance.get); TODO + crosslink.put("previous_crosslink_root", instance.getPreviousCrosslinkRoot().toString()); crosslink.put("crosslink_data_root", instance.getCrosslinkDataRoot().toString()); return crosslink; } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java index 7808dcf27..915ff4308 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java @@ -20,10 +20,10 @@ public Class accepts() { @Override public ObjectNode map(DepositData instance) { ObjectNode depositData = mapper.createObjectNode(); - depositData.put("pubkey", BytesValue.wrap(instance.getDepositInput().getPubKey().getArrayUnsafe()).toString()); - depositData.put("withdrawal_credentials", instance.getDepositInput().getWithdrawalCredentials().toString()); + depositData.put("pubkey", BytesValue.wrap(instance.getPubKey().getArrayUnsafe()).toString()); + depositData.put("withdrawal_credentials", instance.getWithdrawalCredentials().toString()); ObjectSerializer.setUint64Field(depositData, "amount", instance.getAmount()); - depositData.put("signature", BytesValue.wrap(instance.getDepositInput().getProofOfPossession().getArrayUnsafe()).toString()); + depositData.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); return depositData; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositSerializer.java index 2f4231267..2b321a1bf 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositSerializer.java @@ -27,7 +27,7 @@ public ObjectNode map(Deposit instance) { instance.getProof().stream().map(Objects::toString).forEachOrdered(proofNode::add); attestation.set("proof", proofNode); attestation.put("index", instance.getIndex().getValue()); - attestation.set("data", depositDataSerializer.map(instance.getDepositData())); + attestation.set("data", depositDataSerializer.map(instance.getData())); return attestation; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java index 5203b2f0e..3e74a64d9 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java @@ -1,7 +1,6 @@ package org.ethereum.beacon.test.runner.ssz.mapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import org.ethereum.beacon.core.operations.attestation.Crosslink; import org.ethereum.beacon.core.state.Eth1Data; public class Eth1DataSerializer implements ObjectSerializer { @@ -20,7 +19,7 @@ public Class accepts() { public ObjectNode map(Eth1Data instance) { ObjectNode eth1Data = mapper.createObjectNode(); eth1Data.put("deposit_root", instance.getDepositRoot().toString()); -// eth1Data.put("deposit_count", instance.get); TODO + ObjectSerializer.setUint64Field(eth1Data, "deposit_count", instance.getDepositCount()); eth1Data.put("block_hash", instance.getBlockHash().toString()); return eth1Data; } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java index 74e508322..b75ab0bd1 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java @@ -2,11 +2,10 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import org.ethereum.beacon.core.operations.slashing.SlashableAttestation; +import org.ethereum.beacon.core.operations.slashing.IndexedAttestation; import tech.pegasys.artemis.util.bytes.BytesValue; -import tech.pegasys.artemis.util.uint.UInt64; -// TODO: should be IndexedAttestation -public class IndexedAttestationSerializer implements ObjectSerializer { + +public class IndexedAttestationSerializer implements ObjectSerializer { private com.fasterxml.jackson.databind.ObjectMapper mapper; private AttestationDataSerializer attestationDataSerializer; @@ -17,18 +16,20 @@ public IndexedAttestationSerializer(com.fasterxml.jackson.databind.ObjectMapper @Override public Class accepts() { - return SlashableAttestation.class; + return IndexedAttestation.class; } @Override - public ObjectNode map(SlashableAttestation instance) { + public ObjectNode map(IndexedAttestation instance) { ObjectNode slashableAttestation = mapper.createObjectNode(); ArrayNode indices0 = mapper.createArrayNode(); - instance.getValidatorIndices().stream().map(ObjectSerializer::convert).forEachOrdered(indices0::add); + instance.getCustodyBit0Indices().stream().map(ObjectSerializer::convert).forEachOrdered(indices0::add); slashableAttestation.set("custody_bit_0_indices", indices0); -// slashableAttestation.put("custody_bit_1_indices", instance.get); TODO + ArrayNode indices1 = mapper.createArrayNode(); + instance.getCustodyBit1Indices().stream().map(ObjectSerializer::convert).forEachOrdered(indices1::add); + slashableAttestation.set("custody_bit_1_indices", indices1); slashableAttestation.set("data", attestationDataSerializer.map(instance.getData())); - slashableAttestation.put("signature", BytesValue.wrap(instance.getAggregateSingature().getArrayUnsafe()).toString()); + slashableAttestation.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); return slashableAttestation; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java index c1c0405b9..65c679efc 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import org.ethereum.beacon.core.state.PendingAttestation; -import org.ethereum.beacon.core.state.ValidatorRecord; public class PendingAttestationSerializer implements ObjectSerializer { private com.fasterxml.jackson.databind.ObjectMapper mapper; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ProposerSlashingSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ProposerSlashingSerializer.java index 8e797d3de..b9d95f74d 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ProposerSlashingSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ProposerSlashingSerializer.java @@ -1,11 +1,7 @@ package org.ethereum.beacon.test.runner.ssz.mapper; -import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.ethereum.beacon.core.operations.ProposerSlashing; -import org.ethereum.beacon.core.state.HistoricalBatch; - -import java.util.Objects; public class ProposerSlashingSerializer implements ObjectSerializer { private com.fasterxml.jackson.databind.ObjectMapper mapper; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java index 4fdec1784..56285497c 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java @@ -1,7 +1,6 @@ package org.ethereum.beacon.test.runner.ssz.mapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import org.ethereum.beacon.core.BeaconBlockHeader; import org.ethereum.beacon.core.state.ValidatorRecord; import tech.pegasys.artemis.util.bytes.BytesValue; @@ -22,12 +21,12 @@ public ObjectNode map(ValidatorRecord instance) { ObjectNode validatorRecord = mapper.createObjectNode(); validatorRecord.put("pubkey", BytesValue.wrap(instance.getPubKey().getArrayUnsafe()).toString()); validatorRecord.put("withdrawal_credentials", instance.getWithdrawalCredentials().toString()); -// ObjectSerializer.setUint64Field(validatorRecord, "activation_eligibility_epoch", instance.get()); TODO + ObjectSerializer.setUint64Field(validatorRecord, "activation_eligibility_epoch", instance.getActivationEligibilityEpoch()); ObjectSerializer.setUint64Field(validatorRecord, "activation_epoch", instance.getActivationEpoch()); ObjectSerializer.setUint64Field(validatorRecord, "exit_epoch", instance.getExitEpoch()); ObjectSerializer.setUint64Field(validatorRecord, "withdrawable_epoch", instance.getWithdrawableEpoch()); validatorRecord.put("slashed", instance.getSlashed()); -// validatorRecord.put("high_balance", instance.get()); TODO + ObjectSerializer.setUint64Field(validatorRecord, "high_balance", instance.getEffectiveBalance()); return validatorRecord; } } From f923670974804b339e066f232e779143b35ce7b8 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 16:40:40 +0300 Subject: [PATCH 07/42] models updated to use vectors according to 0.6.0 --- .../consensus/spec/BlockProcessing.java | 2 +- .../consensus/spec/EpochProcessing.java | 2 +- .../transition/DelegateBeaconState.java | 4 +- .../org/ethereum/beacon/core/BeaconState.java | 6 ++- .../beacon/core/operations/Deposit.java | 9 +++-- .../slashing/IndexedAttestation.java | 39 +++++++++++++------ .../beacon/core/state/HistoricalBatch.java | 15 ++++--- .../beacon/pow/AbstractDepositContract.java | 4 +- .../ethereum/beacon/util/SimulateUtils.java | 14 ++++--- .../artemis/util/collections/ReadVector.java | 15 +++++++ 10 files changed, 76 insertions(+), 34 deletions(-) diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/BlockProcessing.java b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/BlockProcessing.java index 18f47f18f..2097c1459 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/BlockProcessing.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/BlockProcessing.java @@ -306,7 +306,7 @@ assert verify_merkle_branch( ) */ assertTrue(verify_merkle_branch( hash_tree_root(deposit.getData()), - deposit.getProof(), + deposit.getProof().listCopy(), getConstants().getDepositContractTreeDepth(), deposit.getIndex(), state.getLatestEth1Data().getDepositRoot() diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/EpochProcessing.java b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/EpochProcessing.java index 4439a461b..a0c9f6341 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/EpochProcessing.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/EpochProcessing.java @@ -686,7 +686,7 @@ default void process_final_updates(MutableBeaconState state) { if (next_epoch.modulo(getConstants().getSlotsPerHistoricalRoot().dividedBy(getConstants().getSlotsPerEpoch())) .equals(EpochNumber.ZERO)) { HistoricalBatch historical_batch = - new HistoricalBatch(state.getLatestBlockRoots().listCopy(), state.getLatestStateRoots().listCopy()); + new HistoricalBatch(state.getLatestBlockRoots().vectorCopy(), state.getLatestStateRoots().vectorCopy()); state.getHistoricalRoots().add(hash_tree_root(historical_batch)); } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/transition/DelegateBeaconState.java b/consensus/src/main/java/org/ethereum/beacon/consensus/transition/DelegateBeaconState.java index e8433aeaa..dbf5d712a 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/transition/DelegateBeaconState.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/transition/DelegateBeaconState.java @@ -128,12 +128,12 @@ public Hash32 getFinalizedRoot() { } @Override - public ReadList getPreviousCrosslinks() { + public ReadVector getPreviousCrosslinks() { return delegate.getPreviousCrosslinks(); } @Override - public ReadList getCurrentCrosslinks() { + public ReadVector getCurrentCrosslinks() { return delegate.getCurrentCrosslinks(); } diff --git a/core/src/main/java/org/ethereum/beacon/core/BeaconState.java b/core/src/main/java/org/ethereum/beacon/core/BeaconState.java index 256160d70..b102263bf 100644 --- a/core/src/main/java/org/ethereum/beacon/core/BeaconState.java +++ b/core/src/main/java/org/ethereum/beacon/core/BeaconState.java @@ -108,9 +108,11 @@ static BeaconState getEmpty(SpecConstants specConst) { /* ******* Recent state ********* */ /** Latest crosslink record for each shard. */ - @SSZ(order = 16) ReadList getCurrentCrosslinks(); + @SSZ(order = 16, vectorLengthVar = "spec.SHARD_COUNT") + ReadVector getCurrentCrosslinks(); - @SSZ(order = 17) ReadList getPreviousCrosslinks(); + @SSZ(order = 17, vectorLengthVar = "spec.SHARD_COUNT") + ReadVector getPreviousCrosslinks(); @SSZ(order = 18, vectorLengthVar = "spec.SLOTS_PER_HISTORICAL_ROOT") ReadVector getLatestBlockRoots(); diff --git a/core/src/main/java/org/ethereum/beacon/core/operations/Deposit.java b/core/src/main/java/org/ethereum/beacon/core/operations/Deposit.java index 69c1ba02e..47ff99db1 100644 --- a/core/src/main/java/org/ethereum/beacon/core/operations/Deposit.java +++ b/core/src/main/java/org/ethereum/beacon/core/operations/Deposit.java @@ -1,12 +1,12 @@ package org.ethereum.beacon.core.operations; import com.google.common.base.Objects; -import java.util.List; import org.ethereum.beacon.core.BeaconBlockBody; import org.ethereum.beacon.core.operations.deposit.DepositData; import org.ethereum.beacon.ssz.annotation.SSZ; import org.ethereum.beacon.ssz.annotation.SSZSerializable; import tech.pegasys.artemis.ethereum.core.Hash32; +import tech.pegasys.artemis.util.collections.ReadVector; import tech.pegasys.artemis.util.uint.UInt64; /** @@ -22,19 +22,20 @@ public class Deposit { /** A branch of receipt's Merkle trie of the deposit contract on PoW net. */ - @SSZ private final List proof; + @SSZ(vectorLengthVar = "spec.DEPOSIT_CONTRACT_TREE_DEPTH") + private final ReadVector proof; /** An index of receipt's entry in the trie. */ @SSZ private final UInt64 index; /** Deposit data. */ @SSZ private final DepositData data; - public Deposit(List proof, UInt64 index, DepositData data) { + public Deposit(ReadVector proof, UInt64 index, DepositData data) { this.proof = proof; this.index = index; this.data = data; } - public List getProof() { + public ReadVector getProof() { return proof; } diff --git a/core/src/main/java/org/ethereum/beacon/core/operations/slashing/IndexedAttestation.java b/core/src/main/java/org/ethereum/beacon/core/operations/slashing/IndexedAttestation.java index 2e9f074d5..a2f2c8d56 100644 --- a/core/src/main/java/org/ethereum/beacon/core/operations/slashing/IndexedAttestation.java +++ b/core/src/main/java/org/ethereum/beacon/core/operations/slashing/IndexedAttestation.java @@ -1,10 +1,6 @@ package org.ethereum.beacon.core.operations.slashing; import com.google.common.base.Objects; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; -import javax.annotation.Nullable; import org.ethereum.beacon.core.operations.attestation.AttestationData; import org.ethereum.beacon.core.spec.SpecConstants; import org.ethereum.beacon.core.types.BLSSignature; @@ -14,6 +10,10 @@ import org.ethereum.beacon.ssz.annotation.SSZSerializable; import tech.pegasys.artemis.util.collections.ReadList; +import javax.annotation.Nullable; +import java.util.List; +import java.util.function.Function; + /** * Slashable attestation data structure. * @@ -25,6 +25,7 @@ public class IndexedAttestation { /** Validator indices */ @SSZ private final ReadList custodyBit0Indices; + @SSZ private final ReadList custodyBit1Indices; /** Attestation data */ @SSZ private final AttestationData data; @@ -36,8 +37,20 @@ public IndexedAttestation( List custodyBit1Indices, AttestationData data, BLSSignature signature) { - this.custodyBit0Indices = ReadList.wrap(custodyBit0Indices, Function.identity()); - this.custodyBit1Indices = ReadList.wrap(custodyBit1Indices, Function.identity()); + this( + ReadList.wrap(custodyBit0Indices, Function.identity()), + ReadList.wrap(custodyBit1Indices, Function.identity()), + data, + signature); + } + + public IndexedAttestation( + ReadList custodyBit0Indices, + ReadList custodyBit1Indices, + AttestationData data, + BLSSignature signature) { + this.custodyBit0Indices = custodyBit0Indices; + this.custodyBit1Indices = custodyBit1Indices; this.data = data; this.signature = signature; } @@ -78,12 +91,16 @@ public String toString() { return toString(null, null); } - public String toString(@Nullable SpecConstants spec,@Nullable Time beaconStart) { + public String toString(@Nullable SpecConstants spec, @Nullable Time beaconStart) { return "IndexedAttestation[" - + "data=" + data.toString(spec, beaconStart) - + ", custodyBit0Indices=" + custodyBit0Indices - + ", custodyBit1Indices=" + custodyBit1Indices - + ", sig=" + signature + + "data=" + + data.toString(spec, beaconStart) + + ", custodyBit0Indices=" + + custodyBit0Indices + + ", custodyBit1Indices=" + + custodyBit1Indices + + ", sig=" + + signature + "]"; } } diff --git a/core/src/main/java/org/ethereum/beacon/core/state/HistoricalBatch.java b/core/src/main/java/org/ethereum/beacon/core/state/HistoricalBatch.java index a794be073..8e4aba3d3 100644 --- a/core/src/main/java/org/ethereum/beacon/core/state/HistoricalBatch.java +++ b/core/src/main/java/org/ethereum/beacon/core/state/HistoricalBatch.java @@ -1,9 +1,10 @@ package org.ethereum.beacon.core.state; -import java.util.List; +import org.ethereum.beacon.core.types.SlotNumber; import org.ethereum.beacon.ssz.annotation.SSZ; import org.ethereum.beacon.ssz.annotation.SSZSerializable; import tech.pegasys.artemis.ethereum.core.Hash32; +import tech.pegasys.artemis.util.collections.ReadVector; /** * A batch of historical data. @@ -16,20 +17,22 @@ public class HistoricalBatch { /** Block roots. */ - @SSZ private final List blockRoots; + @SSZ(vectorLengthVar = "spec.SLOTS_PER_HISTORICAL_ROOT") + private final ReadVector blockRoots;; /** State roots. */ - @SSZ private final List stateRoots; + @SSZ(vectorLengthVar = "spec.SLOTS_PER_HISTORICAL_ROOT") + private final ReadVector stateRoots;; - public HistoricalBatch(List blockRoots, List stateRoots) { + public HistoricalBatch(ReadVector blockRoots, ReadVector stateRoots) { this.blockRoots = blockRoots; this.stateRoots = stateRoots; } - public List getBlockRoots() { + public ReadVector getBlockRoots() { return blockRoots; } - public List getStateRoots() { + public ReadVector getStateRoots() { return stateRoots; } } diff --git a/pow/core/src/main/java/org/ethereum/beacon/pow/AbstractDepositContract.java b/pow/core/src/main/java/org/ethereum/beacon/pow/AbstractDepositContract.java index 5ac2d2fb9..b7fad35ae 100644 --- a/pow/core/src/main/java/org/ethereum/beacon/pow/AbstractDepositContract.java +++ b/pow/core/src/main/java/org/ethereum/beacon/pow/AbstractDepositContract.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.function.Function; import java.util.stream.Collectors; import org.ethereum.beacon.core.operations.Deposit; import org.ethereum.beacon.core.operations.deposit.DepositData; @@ -24,6 +25,7 @@ import tech.pegasys.artemis.util.bytes.Bytes48; import tech.pegasys.artemis.util.bytes.Bytes8; import tech.pegasys.artemis.util.bytes.Bytes96; +import tech.pegasys.artemis.util.collections.ReadVector; import tech.pegasys.artemis.util.uint.UInt64; public abstract class AbstractDepositContract implements DepositContract { @@ -110,7 +112,7 @@ private DepositInfo createDepositInfo(DepositEventData eventData, byte[] blockHa List merkleBranch = Arrays.stream(eventData.merkle_branch) .map(bytes -> Hash32.wrap(Bytes32.wrap(bytes))) .collect(Collectors.toList()); - Deposit deposit = new Deposit(merkleBranch, + Deposit deposit = new Deposit(ReadVector.wrap(merkleBranch, Function.identity()), UInt64.fromBytesBigEndian(Bytes8.wrap(eventData.merkle_tree_index)), parseDepositData(eventData.data)); return new DepositInfo(deposit, diff --git a/start/common/src/main/java/org/ethereum/beacon/util/SimulateUtils.java b/start/common/src/main/java/org/ethereum/beacon/util/SimulateUtils.java index 4f4aa0af4..288d73cdc 100644 --- a/start/common/src/main/java/org/ethereum/beacon/util/SimulateUtils.java +++ b/start/common/src/main/java/org/ethereum/beacon/util/SimulateUtils.java @@ -1,14 +1,9 @@ package org.ethereum.beacon.util; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; import org.ethereum.beacon.consensus.BeaconChainSpec; import org.ethereum.beacon.core.operations.Deposit; import org.ethereum.beacon.core.operations.deposit.DepositData; import org.ethereum.beacon.core.spec.SignatureDomains; -import org.ethereum.beacon.core.state.Fork; import org.ethereum.beacon.core.types.BLSPubkey; import org.ethereum.beacon.core.types.BLSSignature; import org.ethereum.beacon.crypto.BLS381; @@ -20,8 +15,15 @@ import tech.pegasys.artemis.util.bytes.Bytes4; import tech.pegasys.artemis.util.bytes.Bytes48; import tech.pegasys.artemis.util.bytes.Bytes96; +import tech.pegasys.artemis.util.collections.ReadVector; import tech.pegasys.artemis.util.uint.UInt64; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class SimulateUtils { private static Pair, List> cachedDeposits = @@ -62,7 +64,7 @@ public static synchronized Deposit getDepositForKeyPair( Deposit deposit = new Deposit( - Collections.singletonList(Hash32.random(rnd)), + ReadVector.wrap(Collections.singletonList(Hash32.random(rnd)), Function.identity()), UInt64.ZERO, new DepositData( BLSPubkey.wrap(Bytes48.leftPad(keyPair.getPublic().getEncodedBytes())), diff --git a/types/src/main/java/tech/pegasys/artemis/util/collections/ReadVector.java b/types/src/main/java/tech/pegasys/artemis/util/collections/ReadVector.java index 22ecbb84e..defac0505 100644 --- a/types/src/main/java/tech/pegasys/artemis/util/collections/ReadVector.java +++ b/types/src/main/java/tech/pegasys/artemis/util/collections/ReadVector.java @@ -1,6 +1,21 @@ package tech.pegasys.artemis.util.collections; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + public interface ReadVector extends ReadList { + /** Wraps with creating of new vector */ + static ReadVector wrap( + List srcList, Function indexConverter) { + return ListImpl.wrap(new ArrayList<>(srcList), indexConverter); + } + + default ReadVector vectorCopy() { + ReadVector res = createMutableCopy(); + return res; + } + } From 8723ca9b54e574fe97ec0a878e38c2a20a96107f Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 16:41:36 +0300 Subject: [PATCH 08/42] test: comment out tests to make not updated tests compile --- .../ethereum/beacon/test/ShuffleTests.java | 142 +++++++++--------- .../ethereum/beacon/test/StateTestUtils.java | 6 +- .../org/ethereum/beacon/test/StateTests.java | 48 +++--- 3 files changed, 97 insertions(+), 99 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java b/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java index 8d4a921fe..38ff36250 100644 --- a/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java @@ -1,64 +1,63 @@ -package org.ethereum.beacon.test; - -import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.core.spec.SpecConstants; -import org.ethereum.beacon.core.types.EpochNumber; -import org.ethereum.beacon.core.types.ShardNumber; -import org.ethereum.beacon.core.types.SlotNumber; -import org.ethereum.beacon.core.types.ValidatorIndex; -import org.ethereum.beacon.test.runner.shuffle.ShuffleRunner; -import org.ethereum.beacon.test.type.shuffle.ShuffleTest; -import org.junit.Test; -import tech.pegasys.artemis.ethereum.core.Hash32; -import tech.pegasys.artemis.util.collections.ReadList; -import tech.pegasys.artemis.util.uint.UInt64; - -import java.nio.file.Path; -import java.nio.file.Paths; - -public class ShuffleTests extends TestUtils { - private String TESTS_DIR = "shuffling"; - private BeaconChainSpec spec; - - public ShuffleTests() { - // xxx EPOCH_LENGTH = 2**6 # 64 slots, 6.4 minutes - // xxx FAR_FUTURE_EPOCH = 2**64 - 1 # uint64 max - // xxx SHARD_COUNT = 2**10 # 1024 - // xxx TARGET_COMMITTEE_SIZE = 2**7 # 128 validators - // xxx ENTRY_EXIT_DELAY = 2**2 # 4 epochs - SpecConstants specConstants = - new SpecConstants() { - @Override - public EpochNumber getFarFutureEpoch() { - return EpochNumber.castFrom(UInt64.MAX_VALUE); - } - - @Override - public ValidatorIndex getTargetCommitteeSize() { - return ValidatorIndex.of(128); - } - - @Override - public SlotNumber.EpochLength getSlotsPerEpoch() { - return new SlotNumber.EpochLength(UInt64.valueOf(1 << 6)); - } - - @Override - public ShardNumber getShardCount() { - return ShardNumber.of(1024); - } - - @Override - public EpochNumber getActivationExitDelay() { - return EpochNumber.of(4); - } - }; - this.spec = BeaconChainSpec.createWithDefaultHasher(specConstants); - } - - @Test - public void testShuffling() { - // TODO wait until tests are updated to v0.6.0 +//package org.ethereum.beacon.test; +// +//import org.ethereum.beacon.consensus.BeaconChainSpec; +//import org.ethereum.beacon.core.spec.SpecConstants; +//import org.ethereum.beacon.core.types.EpochNumber; +//import org.ethereum.beacon.core.types.ShardNumber; +//import org.ethereum.beacon.core.types.SlotNumber; +//import org.ethereum.beacon.core.types.ValidatorIndex; +//import org.ethereum.beacon.test.runner.shuffle.ShuffleRunner; +//import org.ethereum.beacon.test.type.shuffle.ShuffleTest; +//import org.junit.Test; +//import tech.pegasys.artemis.ethereum.core.Hash32; +//import tech.pegasys.artemis.util.collections.ReadList; +//import tech.pegasys.artemis.util.uint.UInt64; +// +//import java.nio.file.Path; +//import java.nio.file.Paths; +// +//public class ShuffleTests extends TestUtils { +// private String TESTS_DIR = "shuffling"; +// private BeaconChainSpec spec; +// +// public ShuffleTests() { +// // xxx EPOCH_LENGTH = 2**6 # 64 slots, 6.4 minutes +// // xxx FAR_FUTURE_EPOCH = 2**64 - 1 # uint64 max +// // xxx SHARD_COUNT = 2**10 # 1024 +// // xxx TARGET_COMMITTEE_SIZE = 2**7 # 128 validators +// // xxx ENTRY_EXIT_DELAY = 2**2 # 4 epochs +// SpecConstants specConstants = +// new SpecConstants() { +// @Override +// public EpochNumber getFarFutureEpoch() { +// return EpochNumber.castFrom(UInt64.MAX_VALUE); +// } +// +// @Override +// public ValidatorIndex getTargetCommitteeSize() { +// return ValidatorIndex.of(128); +// } +// +// @Override +// public SlotNumber.EpochLength getSlotsPerEpoch() { +// return new SlotNumber.EpochLength(UInt64.valueOf(1 << 6)); +// } +// +// @Override +// public ShardNumber getShardCount() { +// return ShardNumber.of(1024); +// } +// +// @Override +// public EpochNumber getActivationExitDelay() { +// return EpochNumber.of(4); +// } +// }; +// this.spec = BeaconChainSpec.createWithDefaultHasher(specConstants); +// } +// +// @Test +// public void testShuffling() { // Path sszTestsPath = Paths.get(PATH_TO_TESTS, TESTS_DIR); // runTestsInResourceDir( // sszTestsPath, @@ -73,15 +72,14 @@ public void testShuffling() { // objects.getValue0(), objects.getValue1(), objects.getValue2())); // return testCaseRunner.run(); // }); - } - - /** - * Runs tests on optimized version of get_shuffling, {@link BeaconChainSpec#get_shuffling2(Hash32, - * org.ethereum.beacon.core.BeaconState, EpochNumber)} - */ - @Test - public void testShuffling2() { - // TODO wait until tests are updated to v0.6.0 +// } +// +// /** +// * Runs tests on optimized version of get_shuffling, {@link BeaconChainSpec#get_shuffling2(Hash32, +// * ReadList, EpochNumber)} +// */ +// @Test +// public void testShuffling2() { // Path sszTestsPath = Paths.get(PATH_TO_TESTS, TESTS_DIR); // runTestsInResourceDir( // sszTestsPath, @@ -96,5 +94,5 @@ public void testShuffling2() { // objects.getValue0(), objects.getValue1(), objects.getValue2())); // return testCaseRunner.run(); // }); - } -} +// } +//} diff --git a/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java b/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java index 04be587c6..f76c61744 100644 --- a/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java +++ b/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.function.Function; import java.util.stream.Collectors; import org.ethereum.beacon.core.BeaconBlock; import org.ethereum.beacon.core.BeaconBlockBody; @@ -48,6 +49,7 @@ import tech.pegasys.artemis.util.bytes.Bytes4; import tech.pegasys.artemis.util.bytes.Bytes96; import tech.pegasys.artemis.util.bytes.BytesValue; +import tech.pegasys.artemis.util.collections.ReadVector; import tech.pegasys.artemis.util.uint.UInt64; /** Various utility methods aiding state tests development. */ @@ -86,9 +88,7 @@ public static Pair> parseBlockData( blockData.getBody().getDeposits()) { Deposit deposit = new Deposit( - depositData.getProof().stream() - .map(Hash32::fromHexString) - .collect(Collectors.toList()), + ReadVector.wrap(depositData.getProof().stream().map(Hash32::fromHexString).collect(Collectors.toList()), Function.identity()), UInt64.valueOf(depositData.getIndex()), new DepositData( BLSPubkey.fromHexString(depositData.getDepositData().getPubkey()), diff --git a/test/src/test/java/org/ethereum/beacon/test/StateTests.java b/test/src/test/java/org/ethereum/beacon/test/StateTests.java index 61b48b428..8c7d38eb4 100644 --- a/test/src/test/java/org/ethereum/beacon/test/StateTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/StateTests.java @@ -1,24 +1,24 @@ -package org.ethereum.beacon.test; - -import java.nio.file.Path; -import java.nio.file.Paths; -import org.ethereum.beacon.test.runner.state.StateRunner; -import org.ethereum.beacon.test.type.state.StateTest; -import org.junit.Ignore; -import org.junit.Test; - -public class StateTests extends TestUtils { - private String TESTS_DIR = "state"; - - public StateTests() {} - - @Test - @Ignore("signing_root and hash_tree_root results do not match") - public void testState() { - Path stateTestsPath = Paths.get(PATH_TO_TESTS, TESTS_DIR); - runTestsInResourceDir( - stateTestsPath, - StateTest.class, - testCase -> new StateRunner(testCase).run()); - } -} +//package org.ethereum.beacon.test; +// +//import java.nio.file.Path; +//import java.nio.file.Paths; +//import org.ethereum.beacon.test.runner.state.StateRunner; +//import org.ethereum.beacon.test.type.state.StateTest; +//import org.junit.Ignore; +//import org.junit.Test; +// +//public class StateTests extends TestUtils { +// private String TESTS_DIR = "state"; +// +// public StateTests() {} +// +// @Test +// @Ignore("signed_root and hash_tree_root results do not match") +// public void testState() { +// Path stateTestsPath = Paths.get(PATH_TO_TESTS, TESTS_DIR); +// runTestsInResourceDir( +// stateTestsPath, +// StateTest.class, +// testCase -> new StateRunner(testCase).run()); +// } +//} From 816ebe263188fb5ecde871f98a66549fa58e6d2c Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 16:42:20 +0300 Subject: [PATCH 09/42] test: fix ssz/hash tree/signing root tests with known model types --- .../test/runner/ssz/SszStaticRunner.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java index e514a6de6..85cf0806d 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java @@ -39,8 +39,6 @@ */ public class SszStaticRunner implements Runner { private SszStaticCase testCase; - private SSZObjectHasher baseHasher; - private SSZObjectHasher incHasher; private SSZSerializer sszSerializer; private ObjectMapper yamlMapper; private BeaconChainSpec spec; @@ -52,19 +50,10 @@ public SszStaticRunner(TestCase testCase, BeaconChainSpec spec) { "TestCase runner accepts only SszStaticCase.class as input!"); } this.testCase = (SszStaticCase) testCase; - Function hashFunction = Hashes::keccak256; SSZBuilder builder = new SSZBuilder(); - this.sszSerializer = builder.buildSerializer(); - SSZHasher baseSszHasher = - new SSZBuilder().withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) - .withIncrementalHasher(false) - .buildHasher(hashFunction); - this.baseHasher = new SSZObjectHasher(baseSszHasher); - SSZHasher incSszHasher = - new SSZBuilder().withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) - .withIncrementalHasher(true) - .buildHasher(hashFunction); - this.incHasher = new SSZObjectHasher(incSszHasher); + this.sszSerializer = builder + .withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) + .buildSerializer(); this.yamlMapper = new ObjectMapper(new YAMLFactory()); Set mappers = findClassesInPackage("org.ethereum.beacon.test.runner.ssz.mapper"); mappers.stream().map(this::fromInfo).map((Class mapperType) -> createInstance(mapperType, yamlMapper)).forEach(m -> { @@ -110,11 +99,21 @@ private Class fromInfo(ClassInfo classInfo) { public Optional run() { Set coreTypes = findClassesInPackage("org.ethereum.beacon.core"); - List classes = coreTypes.stream().filter((type) -> type.getSimpleName().endsWith(testCase.getTypeName())).collect(Collectors.toList()); + final String searchName; + if (testCase.getTypeName().equals("Validator")) { + searchName = "ValidatorRecord"; // XXX: we have different naming + } else if (testCase.getTypeName().equals("BeaconState")) { + searchName = "BeaconStateImpl"; // XXX: we have several implementations + } else { + searchName = testCase.getTypeName(); + } + List classes = coreTypes.stream().filter((type) -> type.getSimpleName().equals(searchName)).collect(Collectors.toList()); + ClassInfo valueTypeInfo; if (classes.size() != 1) { return Optional.of(String.format("Failed: should be only one appropriate core class for %s (%s classes found) ", testCase.getTypeName(), classes.size())); + } else { + valueTypeInfo = classes.get(0); } - ClassInfo valueTypeInfo = classes.get(0); Class valueType = fromInfo(valueTypeInfo); Object fromSerialized = sszSerializer.decode(BytesValue.fromHexString(testCase.getSerialized()), valueType); Object simplified = objectSerializers.get(valueType).map(fromSerialized); @@ -122,10 +121,9 @@ public Optional run() { // XXX: expected goes second as our constructed node contains with overridden `equals` operators // which should be used in comparison assertEquals(simplified, expectedValue); - assertHexStrings(testCase.getRoot(), baseHasher.getHash(fromSerialized).toString()); - assertHexStrings(testCase.getRoot(), incHasher.getHash(fromSerialized).toString()); + assertHexStrings(testCase.getRoot(), spec.hash_tree_root(fromSerialized).toString()); if (testCase.getSigningRoot() != null) { - assertHexStrings(testCase.getSigningRoot(), spec.signed_root(fromSerialized).toString()); + assertHexStrings(testCase.getSigningRoot(), spec.signing_root(fromSerialized).toString()); } return Optional.empty(); From 98bca29bce21efa5eb5284472c9b79cd5e2ca1cb Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 16:43:44 +0300 Subject: [PATCH 10/42] test: fix code style of SszStaticRunner --- .../test/runner/ssz/SszStaticRunner.java | 63 ++++++++++--------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java index 85cf0806d..91eaa71b6 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java @@ -6,18 +6,14 @@ import com.google.common.reflect.ClassPath; import com.google.common.reflect.ClassPath.ClassInfo; import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.consensus.hasher.SSZObjectHasher; import org.ethereum.beacon.core.spec.SpecConstantsResolver; -import org.ethereum.beacon.crypto.Hashes; import org.ethereum.beacon.ssz.SSZBuilder; -import org.ethereum.beacon.ssz.SSZHasher; import org.ethereum.beacon.ssz.SSZSerializer; import org.ethereum.beacon.ssz.creator.ConstructorObjCreator; import org.ethereum.beacon.test.runner.Runner; import org.ethereum.beacon.test.runner.ssz.mapper.ObjectSerializer; import org.ethereum.beacon.test.type.TestCase; import org.ethereum.beacon.test.type.ssz.SszStaticCase; -import tech.pegasys.artemis.ethereum.core.Hash32; import tech.pegasys.artemis.util.bytes.BytesValue; import java.io.IOException; @@ -26,7 +22,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.function.Function; import java.util.stream.Collectors; import static org.ethereum.beacon.test.SilentAsserts.assertEquals; @@ -35,7 +30,8 @@ /** * SSZ, Hash root, signing root tests for known types * - *

Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/ssz_static/core.md + *

Test format description: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/test_formats/ssz_static/core.md */ public class SszStaticRunner implements Runner { private SszStaticCase testCase; @@ -46,32 +42,34 @@ public class SszStaticRunner implements Runner { public SszStaticRunner(TestCase testCase, BeaconChainSpec spec) { if (!(testCase instanceof SszStaticCase)) { - throw new RuntimeException( - "TestCase runner accepts only SszStaticCase.class as input!"); + throw new RuntimeException("TestCase runner accepts only SszStaticCase.class as input!"); } this.testCase = (SszStaticCase) testCase; SSZBuilder builder = new SSZBuilder(); - this.sszSerializer = builder - .withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) - .buildSerializer(); + this.sszSerializer = + builder + .withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) + .buildSerializer(); this.yamlMapper = new ObjectMapper(new YAMLFactory()); Set mappers = findClassesInPackage("org.ethereum.beacon.test.runner.ssz.mapper"); - mappers.stream().map(this::fromInfo).map((Class mapperType) -> createInstance(mapperType, yamlMapper)).forEach(m -> { - if (m == null) { - return; // Couldn't create instance, for example, for interface - } - ObjectSerializer mapper = (ObjectSerializer) m; - objectSerializers.put(mapper.accepts(), mapper); - }); + mappers.stream() + .map(this::fromInfo) + .map((Class mapperType) -> createInstance(mapperType, yamlMapper)) + .forEach( + m -> { + if (m == null) { + return; // Couldn't create instance, for example, for interface + } + ObjectSerializer mapper = (ObjectSerializer) m; + objectSerializers.put(mapper.accepts(), mapper); + }); this.spec = spec; } - private ObjectSerializer createInstance(Class mapperType, ObjectMapper jacksonMapper) { + private ObjectSerializer createInstance( + Class mapperType, ObjectMapper jacksonMapper) { return ConstructorObjCreator.createInstanceWithConstructor( - mapperType, - new Class[] {ObjectMapper.class}, - new Object[] {jacksonMapper} - ); + mapperType, new Class[] {ObjectMapper.class}, new Object[] {jacksonMapper}); } private Set findClassesInPackage(String packageName) { @@ -101,21 +99,28 @@ public Optional run() { Set coreTypes = findClassesInPackage("org.ethereum.beacon.core"); final String searchName; if (testCase.getTypeName().equals("Validator")) { - searchName = "ValidatorRecord"; // XXX: we have different naming - } else if (testCase.getTypeName().equals("BeaconState")) { - searchName = "BeaconStateImpl"; // XXX: we have several implementations + searchName = "ValidatorRecord"; // XXX: we have different naming + } else if (testCase.getTypeName().equals("BeaconState")) { + searchName = "BeaconStateImpl"; // XXX: we have several implementations } else { searchName = testCase.getTypeName(); } - List classes = coreTypes.stream().filter((type) -> type.getSimpleName().equals(searchName)).collect(Collectors.toList()); + List classes = + coreTypes.stream() + .filter((type) -> type.getSimpleName().equals(searchName)) + .collect(Collectors.toList()); ClassInfo valueTypeInfo; if (classes.size() != 1) { - return Optional.of(String.format("Failed: should be only one appropriate core class for %s (%s classes found) ", testCase.getTypeName(), classes.size())); + return Optional.of( + String.format( + "Failed: should be only one appropriate core class for %s (%s classes found) ", + testCase.getTypeName(), classes.size())); } else { valueTypeInfo = classes.get(0); } Class valueType = fromInfo(valueTypeInfo); - Object fromSerialized = sszSerializer.decode(BytesValue.fromHexString(testCase.getSerialized()), valueType); + Object fromSerialized = + sszSerializer.decode(BytesValue.fromHexString(testCase.getSerialized()), valueType); Object simplified = objectSerializers.get(valueType).map(fromSerialized); ObjectNode expectedValue = yamlMapper.convertValue(testCase.getValue(), ObjectNode.class); // XXX: expected goes second as our constructed node contains with overridden `equals` operators From f75093be114e711be4c90d0a10de4287f076471b Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 18:15:55 +0300 Subject: [PATCH 11/42] update MiscParametersData to match 0.6.0 spec --- .../config/chainspec/MiscParametersData.java | 66 +++---------------- .../config/chainspec/SpecDataUtils.java | 5 +- 2 files changed, 11 insertions(+), 60 deletions(-) diff --git a/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/MiscParametersData.java b/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/MiscParametersData.java index 58f4a16c9..444145ded 100644 --- a/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/MiscParametersData.java +++ b/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/MiscParametersData.java @@ -13,20 +13,14 @@ public class MiscParametersData implements MiscParameters { private String SHARD_COUNT; @JsonProperty("TARGET_COMMITTEE_SIZE") private String TARGET_COMMITTEE_SIZE; - @JsonProperty("MAX_BALANCE_CHURN_QUOTIENT") - private String MAX_BALANCE_CHURN_QUOTIENT; - @JsonProperty("BEACON_CHAIN_SHARD_NUMBER") - private String BEACON_CHAIN_SHARD_NUMBER; @JsonProperty("MAX_INDICES_PER_ATTESTATION") private String MAX_INDICES_PER_ATTESTATION; @JsonProperty("MIN_PER_EPOCH_CHURN_LIMIT") private String MIN_PER_EPOCH_CHURN_LIMIT; @JsonProperty("CHURN_LIMIT_QUOTIENT") private String CHURN_LIMIT_QUOTIENT; - @JsonProperty("BASE_REWARDS_PER_EPOCH") - private String BASE_REWARDS_PER_EPOCH; - @JsonProperty("MAX_EXIT_DEQUEUES_PER_EPOCH") - private String MAX_EXIT_DEQUEUES_PER_EPOCH; + @JsonProperty("SHUFFLE_ROUND_COUNT") + private String SHUFFLE_ROUND_COUNT; @Override @JsonIgnore @@ -40,18 +34,6 @@ public ValidatorIndex getTargetCommitteeSize() { return new ValidatorIndex(UInt64.valueOf(getTARGET_COMMITTEE_SIZE())); } - @Override - @JsonIgnore - public UInt64 getMaxBalanceChurnQuotient() { - return UInt64.valueOf(getMAX_BALANCE_CHURN_QUOTIENT()); - } - - @Override - @JsonIgnore - public ShardNumber getBeaconChainShardNumber() { - return ShardNumber.of(UInt64.valueOf(getBEACON_CHAIN_SHARD_NUMBER())); - } - @Override @JsonIgnore public UInt64 getMaxIndicesPerAttestation() { @@ -70,15 +52,10 @@ public UInt64 getChurnLimitQuotient() { return UInt64.valueOf(getCHURN_LIMIT_QUOTIENT()); } - @Override - public UInt64 getBaseRewardsPerEpoch() { - return UInt64.valueOf(getBASE_REWARDS_PER_EPOCH()); - } - @Override @JsonIgnore - public UInt64 getMaxExitDequesPerEpoch() { - return UInt64.valueOf(getMAX_EXIT_DEQUEUES_PER_EPOCH()); + public int getShuffleRoundCount() { + return Integer.valueOf(getSHUFFLE_ROUND_COUNT()); } @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) @@ -99,24 +76,6 @@ public void setTARGET_COMMITTEE_SIZE(String TARGET_COMMITTEE_SIZE) { this.TARGET_COMMITTEE_SIZE = TARGET_COMMITTEE_SIZE; } - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - public String getMAX_BALANCE_CHURN_QUOTIENT() { - return MAX_BALANCE_CHURN_QUOTIENT; - } - - public void setMAX_BALANCE_CHURN_QUOTIENT(String MAX_BALANCE_CHURN_QUOTIENT) { - this.MAX_BALANCE_CHURN_QUOTIENT = MAX_BALANCE_CHURN_QUOTIENT; - } - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - public String getBEACON_CHAIN_SHARD_NUMBER() { - return BEACON_CHAIN_SHARD_NUMBER; - } - - public void setBEACON_CHAIN_SHARD_NUMBER(String BEACON_CHAIN_SHARD_NUMBER) { - this.BEACON_CHAIN_SHARD_NUMBER = BEACON_CHAIN_SHARD_NUMBER; - } - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) public String getMAX_INDICES_PER_ATTESTATION() { return MAX_INDICES_PER_ATTESTATION; @@ -145,20 +104,15 @@ public void setCHURN_LIMIT_QUOTIENT(String CHURN_LIMIT_QUOTIENT) { } @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - public String getBASE_REWARDS_PER_EPOCH() { - return BASE_REWARDS_PER_EPOCH; + public String getSHUFFLE_ROUND_COUNT() { + return SHUFFLE_ROUND_COUNT; } - public void setBASE_REWARDS_PER_EPOCH(String BASE_REWARDS_PER_EPOCH) { - this.BASE_REWARDS_PER_EPOCH = BASE_REWARDS_PER_EPOCH; - } - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - public String getMAX_EXIT_DEQUEUES_PER_EPOCH() { - return MAX_EXIT_DEQUEUES_PER_EPOCH; + public void setSHUFFLE_ROUND_COUNT(int SHUFFLE_ROUND_COUNT) { + this.SHUFFLE_ROUND_COUNT = String.valueOf(SHUFFLE_ROUND_COUNT); } - public void setMAX_EXIT_DEQUEUES_PER_EPOCH(String MAX_EXIT_DEQUEUES_PER_EPOCH) { - this.MAX_EXIT_DEQUEUES_PER_EPOCH = MAX_EXIT_DEQUEUES_PER_EPOCH; + public void setSHUFFLE_ROUND_COUNT(String SHUFFLE_ROUND_COUNT) { + this.SHUFFLE_ROUND_COUNT = SHUFFLE_ROUND_COUNT; } } diff --git a/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/SpecDataUtils.java b/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/SpecDataUtils.java index 860df841f..ac7e0662d 100644 --- a/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/SpecDataUtils.java +++ b/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/SpecDataUtils.java @@ -48,15 +48,12 @@ public static SpecConstantsData createSpecConstantsData(SpecConstants constants) MiscParametersData miscParameters = new MiscParametersData() { { - setBEACON_CHAIN_SHARD_NUMBER(constants.getBeaconChainShardNumber().toString()); - setMAX_BALANCE_CHURN_QUOTIENT(constants.getMaxBalanceChurnQuotient().toString()); setMAX_INDICES_PER_ATTESTATION(constants.getMaxIndicesPerAttestation().toString()); setMIN_PER_EPOCH_CHURN_LIMIT(constants.getMinPerEpochChurnLimit().toString()); setCHURN_LIMIT_QUOTIENT(constants.getChurnLimitQuotient().toString()); - setBASE_REWARDS_PER_EPOCH(constants.getBaseRewardsPerEpoch().toString()); setSHARD_COUNT(constants.getShardCount().toString()); setTARGET_COMMITTEE_SIZE(constants.getTargetCommitteeSize().toString()); - setMAX_EXIT_DEQUEUES_PER_EPOCH(constants.getMaxExitDequesPerEpoch().toString()); + setSHUFFLE_ROUND_COUNT(constants.getShuffleRoundCount()); } }; From 46fc0ea5916412868fe65e0074a16ba962ef53e9 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 18:16:45 +0300 Subject: [PATCH 12/42] test: fix shuffling tests --- .../ethereum/beacon/test/ShuffleTests.java | 176 ++++++++---------- .../test/runner/shuffle/ShuffleRunner.java | 63 ++----- .../test/type/shuffle/ShuffleTestCase.java | 118 ++---------- 3 files changed, 114 insertions(+), 243 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java b/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java index 38ff36250..5ca8106ab 100644 --- a/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java @@ -1,98 +1,78 @@ -//package org.ethereum.beacon.test; -// -//import org.ethereum.beacon.consensus.BeaconChainSpec; -//import org.ethereum.beacon.core.spec.SpecConstants; -//import org.ethereum.beacon.core.types.EpochNumber; -//import org.ethereum.beacon.core.types.ShardNumber; -//import org.ethereum.beacon.core.types.SlotNumber; -//import org.ethereum.beacon.core.types.ValidatorIndex; -//import org.ethereum.beacon.test.runner.shuffle.ShuffleRunner; -//import org.ethereum.beacon.test.type.shuffle.ShuffleTest; -//import org.junit.Test; -//import tech.pegasys.artemis.ethereum.core.Hash32; -//import tech.pegasys.artemis.util.collections.ReadList; -//import tech.pegasys.artemis.util.uint.UInt64; -// -//import java.nio.file.Path; -//import java.nio.file.Paths; -// -//public class ShuffleTests extends TestUtils { -// private String TESTS_DIR = "shuffling"; -// private BeaconChainSpec spec; -// -// public ShuffleTests() { -// // xxx EPOCH_LENGTH = 2**6 # 64 slots, 6.4 minutes -// // xxx FAR_FUTURE_EPOCH = 2**64 - 1 # uint64 max -// // xxx SHARD_COUNT = 2**10 # 1024 -// // xxx TARGET_COMMITTEE_SIZE = 2**7 # 128 validators -// // xxx ENTRY_EXIT_DELAY = 2**2 # 4 epochs -// SpecConstants specConstants = -// new SpecConstants() { -// @Override -// public EpochNumber getFarFutureEpoch() { -// return EpochNumber.castFrom(UInt64.MAX_VALUE); -// } -// -// @Override -// public ValidatorIndex getTargetCommitteeSize() { -// return ValidatorIndex.of(128); -// } -// -// @Override -// public SlotNumber.EpochLength getSlotsPerEpoch() { -// return new SlotNumber.EpochLength(UInt64.valueOf(1 << 6)); -// } -// -// @Override -// public ShardNumber getShardCount() { -// return ShardNumber.of(1024); -// } -// -// @Override -// public EpochNumber getActivationExitDelay() { -// return EpochNumber.of(4); -// } -// }; -// this.spec = BeaconChainSpec.createWithDefaultHasher(specConstants); -// } -// -// @Test -// public void testShuffling() { -// Path sszTestsPath = Paths.get(PATH_TO_TESTS, TESTS_DIR); -// runTestsInResourceDir( -// sszTestsPath, -// ShuffleTest.class, -// testCase -> { -// ShuffleRunner testCaseRunner = -// new ShuffleRunner( -// testCase, -// spec, -// objects -> -// spec.get_shuffling( -// objects.getValue0(), objects.getValue1(), objects.getValue2())); -// return testCaseRunner.run(); -// }); -// } -// -// /** -// * Runs tests on optimized version of get_shuffling, {@link BeaconChainSpec#get_shuffling2(Hash32, -// * ReadList, EpochNumber)} -// */ -// @Test -// public void testShuffling2() { -// Path sszTestsPath = Paths.get(PATH_TO_TESTS, TESTS_DIR); -// runTestsInResourceDir( -// sszTestsPath, -// ShuffleTest.class, -// testCase -> { -// ShuffleRunner testCaseRunner = -// new ShuffleRunner( -// testCase, -// spec, -// objects -> -// spec.get_shuffling2( -// objects.getValue0(), objects.getValue1(), objects.getValue2())); -// return testCaseRunner.run(); -// }); -// } -//} +package org.ethereum.beacon.test; + +import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.core.types.ValidatorIndex; +import org.ethereum.beacon.test.runner.shuffle.ShuffleRunner; +import org.ethereum.beacon.test.type.shuffle.ShuffleTest; +import org.junit.Test; +import tech.pegasys.artemis.ethereum.core.Hash32; +import tech.pegasys.artemis.util.uint.UInt64; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.IntStream; + +import static java.util.stream.Collectors.toList; + +public class ShuffleTests extends TestUtils { + private String TESTS_DIR = "shuffling"; + private String TESTS_SUBDIR = "core"; + + @Test + public void testShuffling() { + Path testFileDir = Paths.get(PATH_TO_TESTS, TESTS_DIR, TESTS_SUBDIR); + runTestsInResourceDir( + testFileDir, + ShuffleTest.class, + input -> { + ShuffleRunner testRunner = + new ShuffleRunner( + input.getValue0(), + input.getValue1(), + objects -> + IntStream.range(0, objects.getValue2()) + .mapToObj( + i -> { + UInt64 permuted_index = + input + .getValue1() + .get_permuted_index( + UInt64.valueOf(i), + UInt64.valueOf(objects.getValue2()), + objects.getValue1()); + return objects.getValue0().get(permuted_index.getIntValue()); + }) + .collect(toList())); + return testRunner.run(); + }); + } + + /** + * Runs tests on optimized version of get_shuffling, like in {@link + * BeaconChainSpec#compute_committee2(List, Hash32, int, int)} + */ + @Test + public void testShuffling2() { + Path testFileDir = Paths.get(PATH_TO_TESTS, TESTS_DIR, TESTS_SUBDIR); + runTestsInResourceDir( + testFileDir, + ShuffleTest.class, + input -> { + ShuffleRunner testRunner = + new ShuffleRunner( + input.getValue0(), + input.getValue1(), + objects -> { + List permuted_indices = + input + .getValue1() + .get_permuted_list(objects.getValue0(), objects.getValue1()); + return permuted_indices.subList(0, objects.getValue2()).stream() + .map(ValidatorIndex::new) + .collect(toList()); + }); + return testRunner.run(); + }); + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/shuffle/ShuffleRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/shuffle/ShuffleRunner.java index c7a9ef00d..7cf24c86d 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/shuffle/ShuffleRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/shuffle/ShuffleRunner.java @@ -1,23 +1,18 @@ package org.ethereum.beacon.test.runner.shuffle; import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.core.state.ValidatorRecord; -import org.ethereum.beacon.core.types.BLSPubkey; -import org.ethereum.beacon.core.types.EpochNumber; -import org.ethereum.beacon.core.types.Gwei; import org.ethereum.beacon.core.types.ValidatorIndex; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.type.shuffle.ShuffleTestCase; import org.ethereum.beacon.test.type.TestCase; +import org.ethereum.beacon.test.type.shuffle.ShuffleTestCase; import org.javatuples.Triplet; -import tech.pegasys.artemis.ethereum.core.Hash32; -import tech.pegasys.artemis.util.collections.ReadList; -import tech.pegasys.artemis.util.uint.UInt64; +import tech.pegasys.artemis.util.bytes.Bytes32; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static org.ethereum.beacon.test.SilentAsserts.assertLists; @@ -25,17 +20,13 @@ public class ShuffleRunner implements Runner { private ShuffleTestCase testCase; private BeaconChainSpec spec; - private Function< - Triplet, EpochNumber>, - List>> + private Function, Bytes32, Integer>, List> getShuffling; public ShuffleRunner( TestCase testCase, BeaconChainSpec spec, - Function< - Triplet, EpochNumber>, - List>> + Function, Bytes32, Integer>, List> getShuffling) { if (!(testCase instanceof ShuffleTestCase)) { throw new RuntimeException("TestCase runner accepts only ShuffleTestCase.class as input!"); @@ -46,40 +37,18 @@ public ShuffleRunner( } public Optional run() { - - EpochNumber currentEpoch = EpochNumber.castFrom(UInt64.valueOf(testCase.getInput().getEpoch())); - List validators = new ArrayList<>(); - for (ShuffleTestCase.ShuffleInput.ShuffleTestValidator testValidator : - testCase.getInput().getValidators()) { - ValidatorRecord validatorRecord = - new ValidatorRecord( - BLSPubkey.ZERO, - Hash32.ZERO, - spec.getConstants().getFarFutureEpoch(), - EpochNumber.castFrom(UInt64.valueOf(testValidator.getActivation_epoch())), - EpochNumber.castFrom(UInt64.valueOf(testValidator.getExit_epoch())), - EpochNumber.castFrom(UInt64.valueOf(testValidator.getActivation_epoch())) - .plus(spec.getConstants().getMinValidatorWithdrawabilityDelay()), - false, - spec.getConstants().getMaxEffectiveBalance()); - validators.add(validatorRecord); - } - - ReadList validatorReadList = - ReadList.wrap(validators, ValidatorIndex::of); - - List> expectedIndices = new ArrayList<>(); - for (List entry : testCase.getOutput()) { - List indices = new ArrayList<>(); - for (Integer index : entry) { - indices.add(ValidatorIndex.of(index)); - } - expectedIndices.add(indices); - } - List> validatorIndices = + List initialValidatorIndices = + IntStream.range(0, testCase.getCount()) + .mapToObj(ValidatorIndex::new) + .collect(Collectors.toList()); + List expectedIndices = + testCase.getShuffled().stream().map(ValidatorIndex::new).collect(Collectors.toList()); + List validatorIndices = getShuffling.apply( new Triplet<>( - Hash32.fromHexString(testCase.getSeed()), validatorReadList, currentEpoch)); + initialValidatorIndices, + Bytes32.fromHexString(testCase.getSeed()), + testCase.getCount())); return assertLists(expectedIndices, validatorIndices); } } diff --git a/test/src/test/java/org/ethereum/beacon/test/type/shuffle/ShuffleTestCase.java b/test/src/test/java/org/ethereum/beacon/test/type/shuffle/ShuffleTestCase.java index 2be6be261..4c1ba5b54 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/shuffle/ShuffleTestCase.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/shuffle/ShuffleTestCase.java @@ -6,125 +6,47 @@ /** * Shuffling test case https://github.com/ethereum/eth2.0-tests/tree/master/shuffling + * href="https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats/shuffling">https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats/shuffling */ public class ShuffleTestCase implements TestCase { - private ShuffleInput input; - private List> output; private String seed; + private Integer count; + private List shuffled; - public ShuffleInput getInput() { - return input; + public String getSeed() { + return seed; } - public void setInput(ShuffleInput input) { - this.input = input; + public void setSeed(String seed) { + this.seed = seed; } - public List> getOutput() { - return output; + public Integer getCount() { + return count; } - public void setOutput(List> output) { - this.output = output; + public void setCount(Integer count) { + this.count = count; } - public String getSeed() { - return seed; + public List getShuffled() { + return shuffled; } - public void setSeed(String seed) { - this.seed = seed; + public void setShuffled(List shuffled) { + this.shuffled = shuffled; } @Override public String toString() { return "ShuffleTestCase{" - + "input=" - + input - + ", output=[...]" - + ", seed='" + + "seed='" + seed + '\'' + + ", count=" + + count + + ", shuffled=" + + shuffled + '}'; } - - public static class ShuffleInput { - private String epoch; - private List validators; - - public String getEpoch() { - return epoch; - } - - public void setEpoch(String epoch) { - this.epoch = epoch; - } - - public List getValidators() { - return validators; - } - - public void setValidators(List validators) { - this.validators = validators; - } - - @Override - public String toString() { - return "Input{" - + "epoch='" - + epoch - + '\'' - + ", validators=" - + (validators.isEmpty() ? "" : validators.get(0)) - + " (total " - + validators.size() - + " validators)" - + '}'; - } - - public static class ShuffleTestValidator { - private String activation_epoch; - private String exit_epoch; - private Integer original_index; - - public String getActivation_epoch() { - return activation_epoch; - } - - public void setActivation_epoch(String activation_epoch) { - this.activation_epoch = activation_epoch; - } - - public String getExit_epoch() { - return exit_epoch; - } - - public void setExit_epoch(String exit_epoch) { - this.exit_epoch = exit_epoch; - } - - public Integer getOriginal_index() { - return original_index; - } - - public void setOriginal_index(Integer original_index) { - this.original_index = original_index; - } - - @Override - public String toString() { - return "Validator{" - + "activation_epoch='" - + activation_epoch - + '\'' - + ", exit_epoch='" - + exit_epoch - + '\'' - + ", original_index=" - + original_index - + '}'; - } - } - } } From 00644b4633d2374d2ae1c15acbf47b458135025a Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 1 May 2019 21:19:02 +0300 Subject: [PATCH 13/42] test: fix state tests --- .../config/chainspec/SpecBuilder.java | 2 +- .../ethereum/beacon/test/StateTestUtils.java | 20 +- .../org/ethereum/beacon/test/StateTests.java | 60 ++-- .../test/runner/state/StateComparator.java | 17 +- .../beacon/test/runner/state/StateRunner.java | 122 ++++---- .../beacon/test/type/state/StateTestCase.java | 269 ++++++++---------- 6 files changed, 227 insertions(+), 263 deletions(-) diff --git a/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/SpecBuilder.java b/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/SpecBuilder.java index 2e8e5cd94..b8a2afc05 100644 --- a/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/SpecBuilder.java +++ b/start/config/src/main/java/org/ethereum/beacon/emulator/config/chainspec/SpecBuilder.java @@ -268,7 +268,7 @@ public EpochNumber getMinValidatorWithdrawabilityDelay() { @Override public EpochNumber getGenesisEpoch() { - return initialValues.getGenesisEpoch(); + return getGenesisSlot().dividedBy(getSlotsPerEpoch()); } @Override diff --git a/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java b/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java index f76c61744..b74c3cecc 100644 --- a/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java +++ b/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java @@ -43,7 +43,7 @@ import org.ethereum.beacon.test.type.state.StateTestCase.BeaconStateData.ValidatorData; import org.ethereum.beacon.test.type.state.StateTestCase.BlockData.BlockBodyData.Eth1; import org.ethereum.beacon.test.type.state.StateTestCase.BlockData.BlockBodyData.ProposerSlashingData; -import org.ethereum.beacon.test.type.state.StateTestCase.BlockData.BlockBodyData.SlashableAttestationData; +import org.ethereum.beacon.test.type.state.StateTestCase.BlockData.BlockBodyData.IndexedAttestationData; import org.javatuples.Pair; import tech.pegasys.artemis.ethereum.core.Hash32; import tech.pegasys.artemis.util.bytes.Bytes4; @@ -70,7 +70,7 @@ public static Pair> parseBlockData( Bitfield.of(BytesValue.fromHexString(attestationData.getAggregationBitfield())), attestationData1, Bitfield.of(BytesValue.fromHexString(attestationData.getCustodyBitfield())), - BLSSignature.wrap(Bytes96.fromHexString(attestationData.getAggregateSignature()))); + BLSSignature.wrap(Bytes96.fromHexString(attestationData.getSignature()))); attestations.add(attestation); } @@ -91,11 +91,11 @@ public static Pair> parseBlockData( ReadVector.wrap(depositData.getProof().stream().map(Hash32::fromHexString).collect(Collectors.toList()), Function.identity()), UInt64.valueOf(depositData.getIndex()), new DepositData( - BLSPubkey.fromHexString(depositData.getDepositData().getPubkey()), - Hash32.fromHexString(depositData.getDepositData().getWithdrawalCredentials()), - Gwei.castFrom(UInt64.valueOf(depositData.getDepositData().getAmount())), + BLSPubkey.fromHexString(depositData.getData().getPubkey()), + Hash32.fromHexString(depositData.getData().getWithdrawalCredentials()), + Gwei.castFrom(UInt64.valueOf(depositData.getData().getAmount())), BLSSignature.wrap( - Bytes96.fromHexString(depositData.getDepositData().getSignature())))); + Bytes96.fromHexString(depositData.getData().getSignature())))); deposits.add(deposit); } @@ -172,7 +172,7 @@ public static Pair> parseBlockData( return Pair.with(block, Optional.empty()); } - public static IndexedAttestation parseSlashableAttestation(SlashableAttestationData data) { + public static IndexedAttestation parseSlashableAttestation(IndexedAttestationData data) { return new IndexedAttestation( data.getCustodyBit0Indices().stream().map(ValidatorIndex::of).collect(Collectors.toList()), data.getCustodyBit1Indices().stream().map(ValidatorIndex::of).collect(Collectors.toList()), @@ -202,18 +202,20 @@ public static MutableBeaconState parseBeaconState(SpecConstants specConstants, B state.setDepositIndex(UInt64.valueOf(data.getDepositIndex())); state.getValidatorRegistry().addAll(parseValidatorRegistry(data.getValidatorRegistry())); - state.getBalances().addAll(parseBalances(data.getValidatorBalances())); + state.getBalances().addAll(parseBalances(data.getBalances())); state.getLatestRandaoMixes().setAll(parseHashes(data.getLatestRandaoMixes())); state.getPreviousEpochAttestations().addAll( parsePendingAttestations(data.getPreviousEpochAttestations())); state.getCurrentEpochAttestations().addAll( parsePendingAttestations(data.getCurrentEpochAttestations())); - state.getCurrentCrosslinks().addAll(parseCrosslinks(data.getLatestCrosslinks())); + state.getCurrentCrosslinks().addAll(parseCrosslinks(data.getCurrentCrosslinks())); + state.getPreviousCrosslinks().addAll(parseCrosslinks(data.getPreviousCrosslinks())); state.getLatestBlockRoots().setAll(parseHashes(data.getLatestBlockRoots())); state.getLatestStateRoots().setAll(parseHashes(data.getLatestStateRoots())); state.getLatestActiveIndexRoots().setAll(parseHashes(data.getLatestActiveIndexRoots())); state.getHistoricalRoots().addAll(parseHashes(data.getHistoricalRoots())); state.getLatestSlashedBalances().setAll(parseBalances(data.getLatestSlashedBalances())); + state.setLatestStartShard(ShardNumber.of(UInt64.valueOf(data.getLatestStartShard()))); return state; } diff --git a/test/src/test/java/org/ethereum/beacon/test/StateTests.java b/test/src/test/java/org/ethereum/beacon/test/StateTests.java index 8c7d38eb4..cb92ced7d 100644 --- a/test/src/test/java/org/ethereum/beacon/test/StateTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/StateTests.java @@ -1,24 +1,36 @@ -//package org.ethereum.beacon.test; -// -//import java.nio.file.Path; -//import java.nio.file.Paths; -//import org.ethereum.beacon.test.runner.state.StateRunner; -//import org.ethereum.beacon.test.type.state.StateTest; -//import org.junit.Ignore; -//import org.junit.Test; -// -//public class StateTests extends TestUtils { -// private String TESTS_DIR = "state"; -// -// public StateTests() {} -// -// @Test -// @Ignore("signed_root and hash_tree_root results do not match") -// public void testState() { -// Path stateTestsPath = Paths.get(PATH_TO_TESTS, TESTS_DIR); -// runTestsInResourceDir( -// stateTestsPath, -// StateTest.class, -// testCase -> new StateRunner(testCase).run()); -// } -//} +package org.ethereum.beacon.test; + +import org.ethereum.beacon.test.runner.state.StateRunner; +import org.ethereum.beacon.test.type.state.StateTest; +import org.junit.Test; + +import java.nio.file.Path; +import java.nio.file.Paths; + +public class StateTests extends TestUtils { + private String OPERATIONS_TESTS_DIR = "operations"; + + @Test + public void testAttestationOperations() { + Path testFileDir = Paths.get(PATH_TO_TESTS, OPERATIONS_TESTS_DIR, "attestations"); + runTestsInResourceDir( + testFileDir, + StateTest.class, + input -> { + StateRunner testRunner = new StateRunner(input.getValue0(), input.getValue1()); + return testRunner.run(); + }); + } + + @Test + public void testDepositOperations() { + Path testFileDir = Paths.get(PATH_TO_TESTS, OPERATIONS_TESTS_DIR, "deposits"); + runTestsInResourceDir( + testFileDir, + StateTest.class, + input -> { + StateRunner testRunner = new StateRunner(input.getValue0(), input.getValue1()); + return testRunner.run(); + }); + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateComparator.java b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateComparator.java index 87ed60b9f..a74ecd4da 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateComparator.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateComparator.java @@ -7,8 +7,9 @@ import java.util.List; import java.util.Optional; import java.util.function.Supplier; -import org.ethereum.beacon.consensus.BeaconStateEx; + import org.ethereum.beacon.core.BeaconBlockHeader; +import org.ethereum.beacon.core.BeaconState; import org.ethereum.beacon.core.operations.attestation.Crosslink; import org.ethereum.beacon.core.state.Eth1Data; import org.ethereum.beacon.core.state.PendingAttestation; @@ -22,14 +23,14 @@ import tech.pegasys.artemis.util.uint.UInt64; public class StateComparator { - private BeaconStateEx actual; + private BeaconState actual; private StateTestCase.BeaconStateData expected; - public static Optional compare(StateTestCase.BeaconStateData expected, BeaconStateEx actual) { + public static Optional compare(StateTestCase.BeaconStateData expected, BeaconState actual) { return new StateComparator(expected, actual).compare(); } - private StateComparator(StateTestCase.BeaconStateData expected, BeaconStateEx actual) { + private StateComparator(StateTestCase.BeaconStateData expected, BeaconState actual) { this.expected = expected; this.actual = actual; } @@ -109,12 +110,12 @@ private Optional compareLatestBlockRoots() { } private Optional compareValidatorBalances() { - if (expected.getValidatorBalances() == null) { + if (expected.getBalances() == null) { return Optional.empty(); } return assertLists( - StateTestUtils.parseBalances(expected.getValidatorBalances()), + StateTestUtils.parseBalances(expected.getBalances()), actual.getBalances().listCopy()); } @@ -185,13 +186,13 @@ private Optional compareLatestActiveIndexRoots() { } private Optional compareLatestCrosslinks() { - if (expected.getLatestCrosslinks() == null) { + if (expected.getCurrentCrosslinks() == null) { return Optional.empty(); } // FIXME: already modified by Michael, it couldn't match the test fixtures List expectedCrosslinks = - StateTestUtils.parseCrosslinks(expected.getLatestCrosslinks()); + StateTestUtils.parseCrosslinks(expected.getCurrentCrosslinks()); return assertLists(expectedCrosslinks, actual.getCurrentCrosslinks().listCopy()); } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java index 2e0379400..1a262b585 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java @@ -1,103 +1,81 @@ package org.ethereum.beacon.test.runner.state; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.lang.reflect.InvocationTargetException; -import java.util.Optional; import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.consensus.BeaconStateEx; -import org.ethereum.beacon.consensus.BlockTransition; -import org.ethereum.beacon.consensus.StateTransitions; -import org.ethereum.beacon.consensus.TransitionType; -import org.ethereum.beacon.consensus.transition.BeaconStateExImpl; -import org.ethereum.beacon.consensus.transition.EmptySlotTransition; -import org.ethereum.beacon.core.BeaconBlock; +import org.ethereum.beacon.consensus.verifier.operation.AttestationVerifier; +import org.ethereum.beacon.consensus.verifier.operation.DepositVerifier; import org.ethereum.beacon.core.BeaconState; -import org.ethereum.beacon.emulator.config.chainspec.SpecBuilder; -import org.ethereum.beacon.emulator.config.chainspec.SpecConstantsData; -import org.ethereum.beacon.emulator.config.chainspec.SpecData; -import org.ethereum.beacon.emulator.config.chainspec.SpecDataUtils; -import org.ethereum.beacon.emulator.config.chainspec.SpecHelpersData; +import org.ethereum.beacon.core.MutableBeaconState; +import org.ethereum.beacon.core.operations.Attestation; +import org.ethereum.beacon.core.operations.Deposit; import org.ethereum.beacon.test.StateTestUtils; import org.ethereum.beacon.test.runner.Runner; -import org.ethereum.beacon.test.runner.state.StateComparator; +import org.ethereum.beacon.test.type.TestCase; import org.ethereum.beacon.test.type.state.StateTestCase; import org.ethereum.beacon.test.type.state.StateTestCase.BeaconStateData; -import org.ethereum.beacon.test.type.TestCase; -import org.ethereum.beacon.util.Objects; -import org.javatuples.Pair; -/** TestRunner for {@link StateTestCase} */ +import java.util.Optional; + +/** + * TestRunner for {@link StateTestCase} + * + *

Test format description: https://github.com/ethereum/eth2.0-specs/tree/dev/specs/test_formats/operations + */ public class StateRunner implements Runner { private StateTestCase testCase; + private BeaconChainSpec spec; - public StateRunner(TestCase testCase) { + public StateRunner(TestCase testCase, BeaconChainSpec spec) { if (!(testCase instanceof StateTestCase)) { throw new RuntimeException("TestCase runner accepts only StateTestCase.class as input!"); } this.testCase = (StateTestCase) testCase; + this.spec = spec; } public Optional run() { - BeaconChainSpec spec; - try { - spec = buildSpec(testCase); - } catch (Exception e) { - return Optional.of("Failed to build BeaconChainSpec: " + e.getMessage()); - } - - BeaconStateEx initialState = buildInitialState(spec, testCase.getInitialState()); - Optional err = StateComparator.compare(testCase.getInitialState(), initialState); + BeaconState initialState = buildInitialState(spec, testCase.getPre()); + Optional err = StateComparator.compare(testCase.getPre(), initialState); if (err.isPresent()) { return Optional.of("Initial state parsed incorrectly: " + err.get()); } - - EmptySlotTransition preBlockTransition = StateTransitions.preBlockTransition(spec); - BlockTransition blockTransition = StateTransitions.blockTransition(spec); - - BeaconStateEx latestState = initialState; - for (StateTestCase.BlockData blockData : testCase.getBlocks()) { - Pair> blockPair = StateTestUtils.parseBlockData(blockData); - if (blockPair.getValue1().isPresent()) { - return blockPair.getValue1(); - } - BeaconBlock block = blockPair.getValue0(); - - BeaconStateEx postBlockState; - try { - BeaconStateEx preBlockState = preBlockTransition.apply(latestState, block.getSlot()); - postBlockState = blockTransition.apply(preBlockState, block); - } catch (Exception ex) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - ex.printStackTrace(pw); - return Optional.of("Error happened during transition: " + sw.toString()); - } - latestState = postBlockState; + BeaconState latestState = initialState; + if (testCase.getDeposit() != null) { + processDeposit(testCase.getDepositOperation(), latestState); + } else if (testCase.getAttestation() != null) { + processAttestation(testCase.getAttestationOperation(), latestState); + } else { + throw new RuntimeException("Only Attestation and Deposit test cases are implemented!!!"); } - return StateComparator.compare(testCase.getExpectedState(), latestState); + if (testCase.getPost() == null) { // XXX: Not changed + return StateComparator.compare(testCase.getPre(), latestState); + } else { + return StateComparator.compare(testCase.getPost(), latestState); + } } - private BeaconStateEx buildInitialState(BeaconChainSpec spec, BeaconStateData stateData) { - BeaconState state = StateTestUtils.parseBeaconState(spec.getConstants(), stateData); - return new BeaconStateExImpl(state, TransitionType.BLOCK); + private void processDeposit(Deposit deposit, BeaconState state) { + try { + DepositVerifier depositVerifier = new DepositVerifier(spec); + assert depositVerifier.verify(deposit, state).isPassed(); + spec.process_deposit((MutableBeaconState) state, deposit); + } catch (Exception | AssertionError ex) { + // XXX: there could be invalid deposit, it's ok + } } - private BeaconChainSpec buildSpec(StateTestCase testCase) - throws InvocationTargetException, IllegalAccessException { - SpecConstantsData specConstantsData = - Objects.copyProperties( - SpecDataUtils.createSpecConstantsData(BeaconChainSpec.DEFAULT_CONSTANTS), - testCase.getConfig()); - - SpecHelpersData specHelpersData = new SpecHelpersData(); - specHelpersData.setBlsVerify(testCase.getVerifySignatures()); - - SpecData specData = new SpecData(); - specData.setSpecHelpersOptions(specHelpersData); - specData.setSpecConstants(specConstantsData); + private void processAttestation(Attestation attestation, BeaconState state) { + try { + AttestationVerifier attestationVerifier = new AttestationVerifier(spec); + assert attestationVerifier.verify(attestation, state).isPassed(); + spec.process_attestation((MutableBeaconState) state, attestation); + } catch (Exception | AssertionError ex) { + // XXX: there could be invalid attestation, it's ok + } + } - return new SpecBuilder().withSpec(specData).buildSpec(); + private BeaconState buildInitialState(BeaconChainSpec spec, BeaconStateData stateData) { + return StateTestUtils.parseBeaconState(spec.getConstants(), stateData); } } diff --git a/test/src/test/java/org/ethereum/beacon/test/type/state/StateTestCase.java b/test/src/test/java/org/ethereum/beacon/test/type/state/StateTestCase.java index 3c96ee01c..2f0e04e90 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/state/StateTestCase.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/state/StateTestCase.java @@ -4,82 +4,113 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; - +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.ethereum.beacon.core.operations.Attestation; +import org.ethereum.beacon.core.operations.Deposit; +import org.ethereum.beacon.core.operations.deposit.DepositData; +import org.ethereum.beacon.core.types.BLSPubkey; +import org.ethereum.beacon.core.types.BLSSignature; +import org.ethereum.beacon.core.types.Bitfield; +import org.ethereum.beacon.core.types.Gwei; import org.ethereum.beacon.test.type.NamedTestCase; -import org.ethereum.beacon.test.type.SpecConstantsDataMerged; import org.ethereum.beacon.test.type.state.StateTestCase.BeaconStateData.AttestationData.AttestationDataContainer; +import tech.pegasys.artemis.ethereum.core.Hash32; +import tech.pegasys.artemis.util.bytes.Bytes96; +import tech.pegasys.artemis.util.bytes.BytesValue; +import tech.pegasys.artemis.util.collections.ReadVector; +import tech.pegasys.artemis.util.uint.UInt64; + +import static org.ethereum.beacon.test.StateTestUtils.parseAttestationData; /** * State test case https://github.com/ethereum/eth2.0-tests/tree/master/state */ public class StateTestCase implements NamedTestCase { - private String name; - private SpecConstantsDataMerged config; - - @JsonProperty("verify_signatures") - private Boolean verifySignatures; - - @JsonProperty("initial_state") - private BeaconStateData initialState; - - private List blocks; - - @JsonProperty("expected_state") - private BeaconStateData expectedState; + private String description; + @JsonProperty + private BlockData.BlockBodyData.DepositData deposit; + @JsonProperty + private BeaconStateData.AttestationData attestation; + private BeaconStateData pre; + private BeaconStateData post; + + public String getDescription() { + return description; + } - @Override - public String getName() { - return name; + public void setDescription(String description) { + this.description = description; } - public void setName(String name) { - this.name = name; + public BlockData.BlockBodyData.DepositData getDeposit() { + return deposit; } - public SpecConstantsDataMerged getConfig() { - return config; + public Deposit getDepositOperation() { + Deposit deposit = + new Deposit( + ReadVector.wrap(getDeposit().getProof().stream().map(Hash32::fromHexString).collect(Collectors.toList()), Function.identity()), + UInt64.valueOf(getDeposit().getIndex()), + new DepositData( + BLSPubkey.fromHexString(getDeposit().getData().getPubkey()), + Hash32.fromHexString(getDeposit().getData().getWithdrawalCredentials()), + Gwei.castFrom(UInt64.valueOf(getDeposit().getData().getAmount())), + BLSSignature.wrap( + Bytes96.fromHexString(getDeposit().getData().getSignature())))); + + return deposit; } - public void setConfig(SpecConstantsDataMerged config) { - this.config = config; + public void setDeposit(BlockData.BlockBodyData.DepositData deposit) { + this.deposit = deposit; } - public Boolean getVerifySignatures() { - return verifySignatures; + public BeaconStateData.AttestationData getAttestation() { + return attestation; } - public void setVerifySignatures(Boolean verifySignatures) { - this.verifySignatures = verifySignatures; + public Attestation getAttestationOperation() { + Attestation attestation = + new Attestation( + Bitfield.of(BytesValue.fromHexString(getAttestation().getAggregationBitfield())), + parseAttestationData((getAttestation().getData())), + Bitfield.of(BytesValue.fromHexString(getAttestation().getCustodyBitfield())), + BLSSignature.wrap(Bytes96.fromHexString(getAttestation().getSignature()))); + + return attestation; } - public BeaconStateData getInitialState() { - return initialState; + public void setAttestation(BeaconStateData.AttestationData attestation) { + this.attestation = attestation; } - public void setInitialState(BeaconStateData initialState) { - this.initialState = initialState; + public BeaconStateData getPre() { + return pre; } - public List getBlocks() { - return blocks; + public void setPre(BeaconStateData pre) { + this.pre = pre; } - public void setBlocks(List blocks) { - this.blocks = blocks; + public BeaconStateData getPost() { + return post; } - public BeaconStateData getExpectedState() { - return expectedState; + public void setPost(BeaconStateData post) { + this.post = post; } - public void setExpectedState(BeaconStateData expectedState) { - this.expectedState = expectedState; + @Override + public String getName() { + return getDescription(); } @Override public String toString() { - return "StateTestCase{" + "name='" + name + '\'' + '}'; + return "StateTestCase{" + "description='" + description + '\'' + '}'; } public static class BeaconStateData { @@ -93,32 +124,13 @@ public static class BeaconStateData { @JsonProperty("validator_registry") private List validatorRegistry; - @JsonProperty("validator_balances") - private List validatorBalances; - - @JsonProperty("validator_registry_update_epoch") - private String validatorRegistryUpdateEpoch; + private List balances; @JsonProperty("latest_randao_mixes") private List latestRandaoMixes; - @JsonProperty("previous_shuffling_start_shard") - private Long previousShufflingStartShard; - - @JsonProperty("current_shuffling_start_shard") - private Long currentShufflingStartShard; - - @JsonProperty("previous_shuffling_epoch") - private String previousShufflingEpoch; - - @JsonProperty("current_shuffling_epoch") - private String currentShufflingEpoch; - - @JsonProperty("previous_shuffling_seed") - private String previousShufflingSeed; - - @JsonProperty("current_shuffling_seed") - private String currentShufflingSeed; + @JsonProperty("latest_start_shard") + private Long latestStartShard; @JsonProperty("previous_epoch_attestations") private List previousEpochAttestations; @@ -147,8 +159,11 @@ public static class BeaconStateData { @JsonProperty("finalized_root") private String finalizedRoot; - @JsonProperty("latest_crosslinks") - private List latestCrosslinks; + @JsonProperty("current_crosslinks") + private List currentCrosslinks; + + @JsonProperty("previous_crosslinks") + private List previousCrosslinks; @JsonProperty("latest_block_roots") private List latestBlockRoots; @@ -172,7 +187,7 @@ public static class BeaconStateData { private BlockData.BlockBodyData.Eth1 latestEth1Data; @JsonProperty("eth1_data_votes") - private List eth1DataVotes; + private List eth1DataVotes; @JsonProperty("deposit_index") private Long depositIndex; @@ -209,20 +224,12 @@ public void setValidatorRegistry(List validatorRegistry) { this.validatorRegistry = validatorRegistry; } - public List getValidatorBalances() { - return validatorBalances; - } - - public void setValidatorBalances(List validatorBalances) { - this.validatorBalances = validatorBalances; + public List getBalances() { + return balances; } - public String getValidatorRegistryUpdateEpoch() { - return validatorRegistryUpdateEpoch; - } - - public void setValidatorRegistryUpdateEpoch(String validatorRegistryUpdateEpoch) { - this.validatorRegistryUpdateEpoch = validatorRegistryUpdateEpoch; + public void setBalances(List balances) { + this.balances = balances; } public List getLatestRandaoMixes() { @@ -233,52 +240,12 @@ public void setLatestRandaoMixes(List latestRandaoMixes) { this.latestRandaoMixes = latestRandaoMixes; } - public Long getPreviousShufflingStartShard() { - return previousShufflingStartShard; - } - - public void setPreviousShufflingStartShard(Long previousShufflingStartShard) { - this.previousShufflingStartShard = previousShufflingStartShard; + public Long getLatestStartShard() { + return latestStartShard; } - public Long getCurrentShufflingStartShard() { - return currentShufflingStartShard; - } - - public void setCurrentShufflingStartShard(Long currentShufflingStartShard) { - this.currentShufflingStartShard = currentShufflingStartShard; - } - - public String getPreviousShufflingEpoch() { - return previousShufflingEpoch; - } - - public void setPreviousShufflingEpoch(String previousShufflingEpoch) { - this.previousShufflingEpoch = previousShufflingEpoch; - } - - public String getCurrentShufflingEpoch() { - return currentShufflingEpoch; - } - - public void setCurrentShufflingEpoch(String currentShufflingEpoch) { - this.currentShufflingEpoch = currentShufflingEpoch; - } - - public String getPreviousShufflingSeed() { - return previousShufflingSeed; - } - - public void setPreviousShufflingSeed(String previousShufflingSeed) { - this.previousShufflingSeed = previousShufflingSeed; - } - - public String getCurrentShufflingSeed() { - return currentShufflingSeed; - } - - public void setCurrentShufflingSeed(String currentShufflingSeed) { - this.currentShufflingSeed = currentShufflingSeed; + public void setLatestStartShard(Long latestStartShard) { + this.latestStartShard = latestStartShard; } public List getPreviousEpochAttestations() { @@ -353,12 +320,20 @@ public void setFinalizedRoot(String finalizedRoot) { this.finalizedRoot = finalizedRoot; } - public List getLatestCrosslinks() { - return latestCrosslinks; + public List getCurrentCrosslinks() { + return currentCrosslinks; + } + + public void setCurrentCrosslinks(List currentCrosslinks) { + this.currentCrosslinks = currentCrosslinks; } - public void setLatestCrosslinks(List latestCrosslinks) { - this.latestCrosslinks = latestCrosslinks; + public List getPreviousCrosslinks() { + return previousCrosslinks; + } + + public void setPreviousCrosslinks(List previousCrosslinks) { + this.previousCrosslinks = previousCrosslinks; } public List getLatestBlockRoots() { @@ -417,11 +392,11 @@ public void setLatestEth1Data(BlockData.BlockBodyData.Eth1 latestEth1Data) { this.latestEth1Data = latestEth1Data; } - public List getEth1DataVotes() { + public List getEth1DataVotes() { return eth1DataVotes; } - public void setEth1DataVotes(List eth1DataVotes) { + public void setEth1DataVotes(List eth1DataVotes) { this.eth1DataVotes = eth1DataVotes; } @@ -565,8 +540,7 @@ public static class AttestationData { @JsonProperty("custody_bitfield") private String custodyBitfield; - @JsonProperty("aggregate_signature") - private String aggregateSignature; + private String signature; @JsonProperty("inclusion_slot") private String inclusionSlot; @@ -606,12 +580,12 @@ public void setCustodyBitfield(String custodyBitfield) { this.custodyBitfield = custodyBitfield; } - public String getAggregateSignature() { - return aggregateSignature; + public String getSignature() { + return signature; } - public void setAggregateSignature(String aggregateSignature) { - this.aggregateSignature = aggregateSignature; + public void setSignature(String signature) { + this.signature = signature; } public Long getProposerIndex() { @@ -799,8 +773,6 @@ public void setSignature(String signature) { this.signature = signature; } } - - public static class Eth1Vote {} } public static class BlockData { @@ -1010,7 +982,7 @@ public void setHeader2(BeaconStateData.BlockHeaderData header2) { } } - public static class SlashableAttestationData { + public static class IndexedAttestationData { @JsonProperty("custody_bit_0_indices") private List custodyBit0Indices; @JsonProperty("custody_bit_1_indices") @@ -1063,25 +1035,25 @@ public void setAggregateSignature(String aggregateSignature) { public static class AttesterSlashingData { @JsonProperty("slashable_attestation_1") - private SlashableAttestationData slashableAttestation1; + private IndexedAttestationData slashableAttestation1; @JsonProperty("slashable_attestation_2") - private SlashableAttestationData slashableAttestation2; + private IndexedAttestationData slashableAttestation2; - public SlashableAttestationData getSlashableAttestation1() { + public IndexedAttestationData getSlashableAttestation1() { return slashableAttestation1; } public void setSlashableAttestation1( - SlashableAttestationData slashableAttestation1) { + IndexedAttestationData slashableAttestation1) { this.slashableAttestation1 = slashableAttestation1; } - public SlashableAttestationData getSlashableAttestation2() { + public IndexedAttestationData getSlashableAttestation2() { return slashableAttestation2; } public void setSlashableAttestation2( - SlashableAttestationData slashableAttestation2) { + IndexedAttestationData slashableAttestation2) { this.slashableAttestation2 = slashableAttestation2; } } @@ -1090,8 +1062,7 @@ public static class DepositData { private List proof; private Long index; - @JsonProperty("deposit_data") - private DepositDataContainer depositData; + private DepositDataContainer data; public List getProof() { return proof; @@ -1109,12 +1080,12 @@ public void setIndex(Long index) { this.index = index; } - public DepositDataContainer getDepositData() { - return depositData; + public DepositDataContainer getData() { + return data; } - public void setDepositData(DepositDataContainer depositData) { - this.depositData = depositData; + public void setData(DepositDataContainer data) { + this.data = data; } public static class DepositDataContainer { From 2a4640ba2b2e6c66eee78374f1cf584ea903d84d Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Thu, 2 May 2019 18:27:48 +0300 Subject: [PATCH 14/42] test: refactor compute_committee plus optimized version, so general github tests could use spec code --- .../beacon/consensus/spec/HelperFunction.java | 12 +++++++ .../ethereum/beacon/test/ShuffleTests.java | 36 +++++-------------- .../test/runner/shuffle/ShuffleRunner.java | 8 ++--- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java index abdae5ab5..a77569d7c 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java @@ -146,6 +146,12 @@ default List compute_committee( List validator_indices, Hash32 seed, int index, int total_committees) { int start_offset = get_split_offset(validator_indices.size(), total_committees, index); int end_offset = get_split_offset(validator_indices.size(), total_committees, index + 1); + + return compute_committee(validator_indices, start_offset, end_offset, seed); + } + + default List compute_committee( + List validator_indices, int start_offset, int end_offset, Hash32 seed) { return IntStream.range(start_offset, end_offset).mapToObj(i -> { UInt64 permuted_index = get_permuted_index(UInt64.valueOf(i), UInt64.valueOf(validator_indices.size()), seed); @@ -161,6 +167,12 @@ default List compute_committee2( List validator_indices, Hash32 seed, int index, int total_committees) { int start_offset = get_split_offset(validator_indices.size(), total_committees, index); int end_offset = get_split_offset(validator_indices.size(), total_committees, index + 1); + + return compute_committee2(validator_indices, start_offset, end_offset, seed); + } + + default List compute_committee2( + List validator_indices, int start_offset, int end_offset, Hash32 seed) { List permuted_indices = get_permuted_list(validator_indices, seed); return permuted_indices.subList(start_offset, end_offset).stream() diff --git a/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java b/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java index 5ca8106ab..dda220352 100644 --- a/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java @@ -1,19 +1,14 @@ package org.ethereum.beacon.test; import org.ethereum.beacon.consensus.BeaconChainSpec; -import org.ethereum.beacon.core.types.ValidatorIndex; import org.ethereum.beacon.test.runner.shuffle.ShuffleRunner; import org.ethereum.beacon.test.type.shuffle.ShuffleTest; import org.junit.Test; import tech.pegasys.artemis.ethereum.core.Hash32; -import tech.pegasys.artemis.util.uint.UInt64; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; -import java.util.stream.IntStream; - -import static java.util.stream.Collectors.toList; public class ShuffleTests extends TestUtils { private String TESTS_DIR = "shuffling"; @@ -31,19 +26,10 @@ public void testShuffling() { input.getValue0(), input.getValue1(), objects -> - IntStream.range(0, objects.getValue2()) - .mapToObj( - i -> { - UInt64 permuted_index = - input - .getValue1() - .get_permuted_index( - UInt64.valueOf(i), - UInt64.valueOf(objects.getValue2()), - objects.getValue1()); - return objects.getValue0().get(permuted_index.getIntValue()); - }) - .collect(toList())); + input + .getValue1() + .compute_committee( + objects.getValue0(), 0, objects.getValue2(), objects.getValue1())); return testRunner.run(); }); } @@ -63,15 +49,11 @@ public void testShuffling2() { new ShuffleRunner( input.getValue0(), input.getValue1(), - objects -> { - List permuted_indices = - input - .getValue1() - .get_permuted_list(objects.getValue0(), objects.getValue1()); - return permuted_indices.subList(0, objects.getValue2()).stream() - .map(ValidatorIndex::new) - .collect(toList()); - }); + objects -> + input + .getValue1() + .compute_committee2( + objects.getValue0(), 0, objects.getValue2(), objects.getValue1())); return testRunner.run(); }); } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/shuffle/ShuffleRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/shuffle/ShuffleRunner.java index 7cf24c86d..816bf92db 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/shuffle/ShuffleRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/shuffle/ShuffleRunner.java @@ -6,7 +6,7 @@ import org.ethereum.beacon.test.type.TestCase; import org.ethereum.beacon.test.type.shuffle.ShuffleTestCase; import org.javatuples.Triplet; -import tech.pegasys.artemis.util.bytes.Bytes32; +import tech.pegasys.artemis.ethereum.core.Hash32; import java.util.List; import java.util.Optional; @@ -20,13 +20,13 @@ public class ShuffleRunner implements Runner { private ShuffleTestCase testCase; private BeaconChainSpec spec; - private Function, Bytes32, Integer>, List> + private Function, Hash32, Integer>, List> getShuffling; public ShuffleRunner( TestCase testCase, BeaconChainSpec spec, - Function, Bytes32, Integer>, List> + Function, Hash32, Integer>, List> getShuffling) { if (!(testCase instanceof ShuffleTestCase)) { throw new RuntimeException("TestCase runner accepts only ShuffleTestCase.class as input!"); @@ -47,7 +47,7 @@ public Optional run() { getShuffling.apply( new Triplet<>( initialValidatorIndices, - Bytes32.fromHexString(testCase.getSeed()), + Hash32.fromHexString(testCase.getSeed()), testCase.getCount())); return assertLists(expectedIndices, validatorIndices); } From 419a2cd0339b08ed91de590d8c7365443d92bc79 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Thu, 2 May 2019 18:46:42 +0300 Subject: [PATCH 15/42] test: final cleanup and refactoring of general github test runners --- .../org/ethereum/beacon/test/TestUtils.java | 1 - .../ethereum/beacon/test/TreeHashTests.java | 107 ------------------ .../test/runner/ssz/SszStaticRunner.java | 38 +++++-- .../beacon/test/runner/state/StateRunner.java | 1 + .../test/type/SpecConstantsDataMerged.java | 1 - 5 files changed, 27 insertions(+), 121 deletions(-) delete mode 100644 test/src/test/java/org/ethereum/beacon/test/TreeHashTests.java diff --git a/test/src/test/java/org/ethereum/beacon/test/TestUtils.java b/test/src/test/java/org/ethereum/beacon/test/TestUtils.java index 12ff99f49..660cddd82 100644 --- a/test/src/test/java/org/ethereum/beacon/test/TestUtils.java +++ b/test/src/test/java/org/ethereum/beacon/test/TestUtils.java @@ -243,7 +243,6 @@ static BeaconChainSpec loadSpecByName(String name, boolean isBlsVerified) { File config = getResourceFile(configPath.toString()); SpecConstantsData specConstantsDataRaw = readYamlFile(config, SpecConstantsDataMerged.class); - // TODO: Is it required? Yaml should contain all the fields SpecConstantsData specConstantsData; try { specConstantsData = diff --git a/test/src/test/java/org/ethereum/beacon/test/TreeHashTests.java b/test/src/test/java/org/ethereum/beacon/test/TreeHashTests.java deleted file mode 100644 index 30610d696..000000000 --- a/test/src/test/java/org/ethereum/beacon/test/TreeHashTests.java +++ /dev/null @@ -1,107 +0,0 @@ -//package org.ethereum.beacon.test; -// -//import org.ethereum.beacon.consensus.BeaconChainSpec; -//import org.ethereum.beacon.test.runner.hash.TreeHashBasicRunner; -//import org.ethereum.beacon.test.runner.hash.TreeHashContainerRunner; -//import org.ethereum.beacon.test.runner.hash.TreeHashListRunner; -//import org.ethereum.beacon.test.runner.hash.TreeHashVectorRunner; -//import org.ethereum.beacon.test.type.hash.TreeHashBasicTest; -//import org.ethereum.beacon.test.type.hash.TreeHashContainerTest; -//import org.ethereum.beacon.test.type.hash.TreeHashListTest; -//import org.junit.Ignore; -//import org.junit.Test; -// -//import java.nio.file.Path; -//import java.nio.file.Paths; -//import java.util.Optional; -// -//import static org.junit.Assert.fail; -// -//public class TreeHashTests extends TestUtils { -// private String TESTS_DIR = "tree_hash"; -// private BeaconChainSpec spec; -// -// public TreeHashTests() { -// this.spec = BeaconChainSpec.createWithDefaults(); -// } -// -// @Test -// @Ignore("Remove when yaml is added to `eth2.0-test` repository") -// public void testBasicTypesTreeHash() { -// Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_types.yaml"); -// TreeHashBasicTest test = -// readTest(getResourceFile(testFilePath.toString()), TreeHashBasicTest.class); -// Optional errors = -// runAllCasesInTest( -// test, -// testCase -> { -// TreeHashBasicRunner testRunner = new TreeHashBasicRunner(testCase, spec); -// return testRunner.run(); -// }, -// TreeHashBasicTest.class); -// if (errors.isPresent()) { -// System.out.println(errors.get()); -// fail(); -// } -// } -// -// @Test -// @Ignore("Remove when yaml is added to `eth2.0-test` repository") -// public void testListTypeTreeHash() { -// Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_lists.yaml"); -// TreeHashListTest test = -// readTest(getResourceFile(testFilePath.toString()), TreeHashListTest.class); -// Optional errors = -// runAllCasesInTest( -// test, -// testCase -> { -// TreeHashListRunner testRunner = new TreeHashListRunner(testCase, spec); -// return testRunner.run(); -// }, -// TreeHashListTest.class); -// if (errors.isPresent()) { -// System.out.println(errors.get()); -// fail(); -// } -// } -// -// @Test -// @Ignore("Remove when yaml is added to `eth2.0-test` repository") -// public void testVectorTypeTreeHash() { -// Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_vectors.yaml"); -// TreeHashListTest test = -// readTest(getResourceFile(testFilePath.toString()), TreeHashListTest.class); -// Optional errors = -// runAllCasesInTest( -// test, -// testCase -> { -// TreeHashVectorRunner testRunner = new TreeHashVectorRunner(testCase, spec); -// return testRunner.run(); -// }, -// TreeHashListTest.class); -// if (errors.isPresent()) { -// System.out.println(errors.get()); -// fail(); -// } -// } -// -// @Test -// @Ignore("Remove when yaml is added to `eth2.0-test` repository") -// public void testContainerTypeTreeHash() { -// Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "basic_containers.yaml"); -// TreeHashContainerTest test = -// readTest(getResourceFile(testFilePath.toString()), TreeHashContainerTest.class); -// Optional errors = -// runAllCasesInTest( -// test, -// testCase -> { -// TreeHashContainerRunner testRunner = new TreeHashContainerRunner(testCase, spec); -// return testRunner.run(); -// }, -// TreeHashContainerTest.class); -// if (errors.isPresent()) { -// System.out.println(errors.get()); -// fail(); -// } -// } -//} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java index 91eaa71b6..d54892277 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/SszStaticRunner.java @@ -39,6 +39,7 @@ public class SszStaticRunner implements Runner { private ObjectMapper yamlMapper; private BeaconChainSpec spec; private Map objectSerializers = new HashMap<>(); + private Set coreTypes; public SszStaticRunner(TestCase testCase, BeaconChainSpec spec) { if (!(testCase instanceof SszStaticCase)) { @@ -51,21 +52,29 @@ public SszStaticRunner(TestCase testCase, BeaconChainSpec spec) { .withExternalVarResolver(new SpecConstantsResolver(spec.getConstants())) .buildSerializer(); this.yamlMapper = new ObjectMapper(new YAMLFactory()); - Set mappers = findClassesInPackage("org.ethereum.beacon.test.runner.ssz.mapper"); - mappers.stream() + this.spec = spec; + + // objectSerializers filling + Set availableSerializers = + findClassesInPackage("org.ethereum.beacon.test.runner.ssz.mapper"); + availableSerializers.stream() .map(this::fromInfo) .map((Class mapperType) -> createInstance(mapperType, yamlMapper)) .forEach( m -> { if (m == null) { - return; // Couldn't create instance, for example, for interface + return; // Couldn't create instance, for example, for interface, so it's not a + // serializer } ObjectSerializer mapper = (ObjectSerializer) m; objectSerializers.put(mapper.accepts(), mapper); }); - this.spec = spec; + + // Filling set with spec types + this.coreTypes = findClassesInPackage("org.ethereum.beacon.core"); } + /** Instantiating {@link ObjectSerializer} */ private ObjectSerializer createInstance( Class mapperType, ObjectMapper jacksonMapper) { return ConstructorObjCreator.createInstanceWithConstructor( @@ -84,6 +93,7 @@ private Set findClassesInPackage(String packageName) { return classes; } + /** {@link ClassInfo} -> {@link Class} mapper */ private Class fromInfo(ClassInfo classInfo) { Class valueType = null; try { @@ -95,15 +105,14 @@ private Class fromInfo(ClassInfo classInfo) { return valueType; } - public Optional run() { - Set coreTypes = findClassesInPackage("org.ethereum.beacon.core"); + private Class findSpecClassByName(String name) { final String searchName; - if (testCase.getTypeName().equals("Validator")) { + if (name.equals("Validator")) { searchName = "ValidatorRecord"; // XXX: we have different naming - } else if (testCase.getTypeName().equals("BeaconState")) { + } else if (name.equals("BeaconState")) { searchName = "BeaconStateImpl"; // XXX: we have several implementations } else { - searchName = testCase.getTypeName(); + searchName = name; } List classes = coreTypes.stream() @@ -111,14 +120,19 @@ public Optional run() { .collect(Collectors.toList()); ClassInfo valueTypeInfo; if (classes.size() != 1) { - return Optional.of( + throw new RuntimeException( String.format( "Failed: should be only one appropriate core class for %s (%s classes found) ", - testCase.getTypeName(), classes.size())); + name, classes.size())); } else { valueTypeInfo = classes.get(0); } - Class valueType = fromInfo(valueTypeInfo); + + return fromInfo(valueTypeInfo); + } + + public Optional run() { + Class valueType = findSpecClassByName(testCase.getTypeName()); Object fromSerialized = sszSerializer.decode(BytesValue.fromHexString(testCase.getSerialized()), valueType); Object simplified = objectSerializers.get(valueType).map(fromSerialized); diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java index 1a262b585..073cb4f72 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java @@ -40,6 +40,7 @@ public Optional run() { return Optional.of("Initial state parsed incorrectly: " + err.get()); } BeaconState latestState = initialState; + if (testCase.getDeposit() != null) { processDeposit(testCase.getDepositOperation(), latestState); } else if (testCase.getAttestation() != null) { diff --git a/test/src/test/java/org/ethereum/beacon/test/type/SpecConstantsDataMerged.java b/test/src/test/java/org/ethereum/beacon/test/type/SpecConstantsDataMerged.java index a80ed2b9d..686cd332e 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/SpecConstantsDataMerged.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/SpecConstantsDataMerged.java @@ -13,7 +13,6 @@ import org.ethereum.beacon.emulator.config.chainspec.StateListLengthsData; import org.ethereum.beacon.emulator.config.chainspec.TimeParametersData; -// TODO: ADD DOMAIN CONFIGS @JsonIgnoreProperties(ignoreUnknown = false) public class SpecConstantsDataMerged extends SpecConstantsData { @JsonUnwrapped private DepositContractParametersData depositContractParameters; From b782eae4e5f947b78a8711094f1aca611da0de14 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Mon, 6 May 2019 20:52:29 +0300 Subject: [PATCH 16/42] fix convert_to_indexed according to v0.6.1 spec --- .../java/org/ethereum/beacon/consensus/spec/HelperFunction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java index 6d989df17..d33ffd5be 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java @@ -937,7 +937,7 @@ default IndexedAttestation convert_to_indexed(BeaconState state, Attestation att List attesting_indices = get_attesting_indices(state, attestation.getData(), attestation.getAggregationBitfield()); List custody_bit_1_indices = - get_attesting_indices(state, attestation.getData(), attestation.getAggregationBitfield()); + get_attesting_indices(state, attestation.getData(), attestation.getCustodyBitfield()); List custody_bit_0_indices = attesting_indices.stream() .filter(index -> !custody_bit_1_indices.contains(index)).collect(toList()); From 311274c99e8250fc058c07473e3c2e29a53bac78 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 7 May 2019 18:40:02 +0300 Subject: [PATCH 17/42] Merge branch 'spec/v0.6.1' into test/spec # Conflicts: # consensus/src/main/java/org/ethereum/beacon/consensus/spec/HelperFunction.java # test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java --- start/common/src/main/resources/config/spec-constants.yml | 4 +--- start/config/src/test/resources/chainSpec.yml | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/start/common/src/main/resources/config/spec-constants.yml b/start/common/src/main/resources/config/spec-constants.yml index 7a733d775..08ddb8329 100644 --- a/start/common/src/main/resources/config/spec-constants.yml +++ b/start/common/src/main/resources/config/spec-constants.yml @@ -20,13 +20,11 @@ specConstants: miscParameters: SHARD_COUNT: 1024 TARGET_COMMITTEE_SIZE: 128 - MAX_BALANCE_CHURN_QUOTIENT: 32 - BEACON_CHAIN_SHARD_NUMBER: 18446744073709551615 MAX_INDICES_PER_ATTESTATION: 4096 MIN_PER_EPOCH_CHURN_LIMIT: 4 CHURN_LIMIT_QUOTIENT: 65536 BASE_REWARDS_PER_EPOCH: 5 - MAX_EXIT_DEQUEUES_PER_EPOCH: 4 + SHUFFLE_ROUND_COUNT: 90 gweiValues: MIN_DEPOSIT_AMOUNT: 1000000000 MAX_EFFECTIVE_BALANCE: 32000000000 diff --git a/start/config/src/test/resources/chainSpec.yml b/start/config/src/test/resources/chainSpec.yml index 7a733d775..08ddb8329 100644 --- a/start/config/src/test/resources/chainSpec.yml +++ b/start/config/src/test/resources/chainSpec.yml @@ -20,13 +20,11 @@ specConstants: miscParameters: SHARD_COUNT: 1024 TARGET_COMMITTEE_SIZE: 128 - MAX_BALANCE_CHURN_QUOTIENT: 32 - BEACON_CHAIN_SHARD_NUMBER: 18446744073709551615 MAX_INDICES_PER_ATTESTATION: 4096 MIN_PER_EPOCH_CHURN_LIMIT: 4 CHURN_LIMIT_QUOTIENT: 65536 BASE_REWARDS_PER_EPOCH: 5 - MAX_EXIT_DEQUEUES_PER_EPOCH: 4 + SHUFFLE_ROUND_COUNT: 90 gweiValues: MIN_DEPOSIT_AMOUNT: 1000000000 MAX_EFFECTIVE_BALANCE: 32000000000 From 446f1e606f03b9ba759c01e1359262a5b054935c Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 7 May 2019 18:46:48 +0300 Subject: [PATCH 18/42] test: add replaceAll in WriteList --- .../consensus/spec/EpochProcessing.java | 6 ++---- .../ethereum/beacon/test/StateTestUtils.java | 21 +++++++------------ .../artemis/util/collections/WriteList.java | 5 +++++ 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/EpochProcessing.java b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/EpochProcessing.java index 46b278a22..fa7983a4c 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/EpochProcessing.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/EpochProcessing.java @@ -306,8 +306,7 @@ def process_crosslinks(state: BeaconState) -> None: state.current_crosslinks[shard] = winning_crosslink */ default void process_crosslinks(MutableBeaconState state) { - state.getPreviousCrosslinks().clear(); - state.getPreviousCrosslinks().addAll(state.getCurrentCrosslinks().listCopy()); + state.getPreviousCrosslinks().replaceAll(state.getCurrentCrosslinks().listCopy()); for (EpochNumber epoch : get_previous_epoch(state).iterateTo(get_current_epoch(state))) { for (UInt64 offset : UInt64s.iterate(UInt64.ZERO, get_epoch_committee_count(state, epoch))) { @@ -703,8 +702,7 @@ default void process_final_updates(MutableBeaconState state) { /* Rotate current/previous epoch attestations state.previous_epoch_attestations = state.current_epoch_attestations state.current_epoch_attestations = [] */ - state.getPreviousEpochAttestations().clear(); - state.getPreviousEpochAttestations().addAll(state.getCurrentEpochAttestations().listCopy()); + state.getPreviousEpochAttestations().replaceAll(state.getCurrentEpochAttestations().listCopy()); state.getCurrentEpochAttestations().clear(); } } diff --git a/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java b/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java index 68b083401..03910717e 100644 --- a/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java +++ b/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java @@ -204,26 +204,19 @@ public static MutableBeaconState parseBeaconState(SpecConstants specConstants, B state.setLatestEth1Data(parseEth1Data(data.getLatestEth1Data())); state.setDepositIndex(UInt64.valueOf(data.getDepositIndex())); - state.getValidatorRegistry().clear(); - state.getValidatorRegistry().addAll(parseValidatorRegistry(data.getValidatorRegistry())); - state.getBalances().clear(); - state.getBalances().addAll(parseBalances(data.getBalances())); + state.getValidatorRegistry().replaceAll(parseValidatorRegistry(data.getValidatorRegistry())); + state.getBalances().replaceAll(parseBalances(data.getBalances())); state.getLatestRandaoMixes().setAll(parseHashes(data.getLatestRandaoMixes())); - state.getPreviousEpochAttestations().clear(); - state.getPreviousEpochAttestations().addAll( + state.getPreviousEpochAttestations().replaceAll( parsePendingAttestations(data.getPreviousEpochAttestations())); - state.getCurrentEpochAttestations().clear(); - state.getCurrentEpochAttestations().addAll( + state.getCurrentEpochAttestations().replaceAll( parsePendingAttestations(data.getCurrentEpochAttestations())); - state.getCurrentCrosslinks().clear(); - state.getCurrentCrosslinks().addAll(parseCrosslinks(data.getCurrentCrosslinks())); - state.getPreviousCrosslinks().clear(); - state.getPreviousCrosslinks().addAll(parseCrosslinks(data.getPreviousCrosslinks())); + state.getCurrentCrosslinks().replaceAll(parseCrosslinks(data.getCurrentCrosslinks())); + state.getPreviousCrosslinks().replaceAll(parseCrosslinks(data.getPreviousCrosslinks())); state.getLatestBlockRoots().setAll(parseHashes(data.getLatestBlockRoots())); state.getLatestStateRoots().setAll(parseHashes(data.getLatestStateRoots())); state.getLatestActiveIndexRoots().setAll(parseHashes(data.getLatestActiveIndexRoots())); - state.getHistoricalRoots().clear(); - state.getHistoricalRoots().addAll(parseHashes(data.getHistoricalRoots())); + state.getHistoricalRoots().replaceAll(parseHashes(data.getHistoricalRoots())); state.getLatestSlashedBalances().setAll(parseBalances(data.getLatestSlashedBalances())); state.setLatestStartShard(ShardNumber.of(UInt64.valueOf(data.getLatestStartShard()))); diff --git a/types/src/main/java/tech/pegasys/artemis/util/collections/WriteList.java b/types/src/main/java/tech/pegasys/artemis/util/collections/WriteList.java index 917766b40..abaab6a83 100644 --- a/types/src/main/java/tech/pegasys/artemis/util/collections/WriteList.java +++ b/types/src/main/java/tech/pegasys/artemis/util/collections/WriteList.java @@ -29,6 +29,11 @@ public interface WriteList boolean addAll(IndexType index, @NotNull Collection c); + default void replaceAll(@NotNull Collection c) { + this.clear(); + this.addAll(c); + } + void sort(Comparator c); void clear(); From 7f318416467eb1b202bdc50ae395a19bf377aa3a Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 7 May 2019 19:01:34 +0300 Subject: [PATCH 19/42] test: catch only certain exceptions, so we could be able to catch bugs in operations state tests --- .../consensus/verifier/operation/AttestationVerifier.java | 6 ++++-- .../verifier/operation/AttesterSlashingVerifier.java | 6 ++++-- .../consensus/verifier/operation/DepositVerifier.java | 6 ++++-- .../verifier/operation/ProposerSlashingVerifier.java | 6 ++++-- .../consensus/verifier/operation/TransferVerifier.java | 6 ++++-- .../consensus/verifier/operation/VoluntaryExitVerifier.java | 6 ++++-- .../org/ethereum/beacon/test/runner/state/StateRunner.java | 5 +++-- 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttestationVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttestationVerifier.java index 3ca30c59f..4683d2de5 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttestationVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttestationVerifier.java @@ -1,6 +1,7 @@ package org.ethereum.beacon.consensus.verifier.operation; import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.consensus.spec.SpecCommons; import org.ethereum.beacon.consensus.verifier.OperationVerifier; import org.ethereum.beacon.consensus.verifier.VerificationResult; import org.ethereum.beacon.core.BeaconState; @@ -27,8 +28,9 @@ public VerificationResult verify(Attestation attestation, BeaconState state) { try { spec.verify_attestation(state, attestation); return VerificationResult.PASSED; - } catch (Exception e) { - return VerificationResult.failedResult(e.getMessage()); + } catch (SpecCommons.SpecAssertionFailed e) { + String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; + return VerificationResult.failedResult(error); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttesterSlashingVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttesterSlashingVerifier.java index 929de44eb..cfa65533a 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttesterSlashingVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttesterSlashingVerifier.java @@ -1,6 +1,7 @@ package org.ethereum.beacon.consensus.verifier.operation; import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.consensus.spec.SpecCommons; import org.ethereum.beacon.consensus.verifier.OperationVerifier; import org.ethereum.beacon.consensus.verifier.VerificationResult; import org.ethereum.beacon.core.BeaconState; @@ -27,8 +28,9 @@ public VerificationResult verify(AttesterSlashing attesterSlashing, BeaconState try { spec.verify_attester_slashing(state, attesterSlashing); return VerificationResult.PASSED; - } catch (Exception e) { - return VerificationResult.failedResult(e.getMessage()); + } catch (SpecCommons.SpecAssertionFailed e) { + String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; + return VerificationResult.failedResult(error); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/DepositVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/DepositVerifier.java index b61a4916e..8570991a0 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/DepositVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/DepositVerifier.java @@ -1,6 +1,7 @@ package org.ethereum.beacon.consensus.verifier.operation; import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.consensus.spec.SpecCommons; import org.ethereum.beacon.consensus.verifier.OperationVerifier; import org.ethereum.beacon.consensus.verifier.VerificationResult; import org.ethereum.beacon.core.BeaconState; @@ -30,8 +31,9 @@ public VerificationResult verify(Deposit deposit, BeaconState state) { try { spec.verify_deposit(state, deposit); return VerificationResult.PASSED; - } catch (Exception e) { - return VerificationResult.failedResult(e.getMessage()); + } catch (SpecCommons.SpecAssertionFailed e) { + String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; + return VerificationResult.failedResult(error); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/ProposerSlashingVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/ProposerSlashingVerifier.java index 7ef290870..0d19f2d08 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/ProposerSlashingVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/ProposerSlashingVerifier.java @@ -1,6 +1,7 @@ package org.ethereum.beacon.consensus.verifier.operation; import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.consensus.spec.SpecCommons; import org.ethereum.beacon.consensus.verifier.OperationVerifier; import org.ethereum.beacon.consensus.verifier.VerificationResult; import org.ethereum.beacon.core.BeaconState; @@ -27,8 +28,9 @@ public VerificationResult verify(ProposerSlashing proposerSlashing, BeaconState try { spec.verify_proposer_slashing(state, proposerSlashing); return VerificationResult.PASSED; - } catch (Exception e) { - return VerificationResult.failedResult(e.getMessage()); + } catch (SpecCommons.SpecAssertionFailed e) { + String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; + return VerificationResult.failedResult(error); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/TransferVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/TransferVerifier.java index e4efdba96..52d392e4b 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/TransferVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/TransferVerifier.java @@ -1,6 +1,7 @@ package org.ethereum.beacon.consensus.verifier.operation; import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.consensus.spec.SpecCommons; import org.ethereum.beacon.consensus.verifier.OperationVerifier; import org.ethereum.beacon.consensus.verifier.VerificationResult; import org.ethereum.beacon.core.BeaconState; @@ -26,8 +27,9 @@ public VerificationResult verify(Transfer transfer, BeaconState state) { try { spec.verify_transfer(state, transfer); return VerificationResult.PASSED; - } catch (Exception e) { - return VerificationResult.failedResult(e.getMessage()); + } catch (SpecCommons.SpecAssertionFailed e) { + String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; + return VerificationResult.failedResult(error); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/VoluntaryExitVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/VoluntaryExitVerifier.java index 502d488d7..d76140754 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/VoluntaryExitVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/VoluntaryExitVerifier.java @@ -1,6 +1,7 @@ package org.ethereum.beacon.consensus.verifier.operation; import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.consensus.spec.SpecCommons; import org.ethereum.beacon.consensus.verifier.OperationVerifier; import org.ethereum.beacon.consensus.verifier.VerificationResult; import org.ethereum.beacon.core.BeaconState; @@ -27,8 +28,9 @@ public VerificationResult verify(VoluntaryExit voluntaryExit, BeaconState state) try { spec.verify_voluntary_exit(state, voluntaryExit); return VerificationResult.PASSED; - } catch (Exception e) { - return VerificationResult.failedResult(e.getMessage()); + } catch (SpecCommons.SpecAssertionFailed e) { + String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; + return VerificationResult.failedResult(error); } } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java index 073cb4f72..4541c34b1 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java @@ -1,6 +1,7 @@ package org.ethereum.beacon.test.runner.state; import org.ethereum.beacon.consensus.BeaconChainSpec; +import org.ethereum.beacon.consensus.spec.SpecCommons; import org.ethereum.beacon.consensus.verifier.operation.AttestationVerifier; import org.ethereum.beacon.consensus.verifier.operation.DepositVerifier; import org.ethereum.beacon.core.BeaconState; @@ -61,7 +62,7 @@ private void processDeposit(Deposit deposit, BeaconState state) { DepositVerifier depositVerifier = new DepositVerifier(spec); assert depositVerifier.verify(deposit, state).isPassed(); spec.process_deposit((MutableBeaconState) state, deposit); - } catch (Exception | AssertionError ex) { + } catch (SpecCommons.SpecAssertionFailed | AssertionError ex) { // XXX: there could be invalid deposit, it's ok } } @@ -71,7 +72,7 @@ private void processAttestation(Attestation attestation, BeaconState state) { AttestationVerifier attestationVerifier = new AttestationVerifier(spec); assert attestationVerifier.verify(attestation, state).isPassed(); spec.process_attestation((MutableBeaconState) state, attestation); - } catch (Exception | AssertionError ex) { + } catch (SpecCommons.SpecAssertionFailed | AssertionError ex) { // XXX: there could be invalid attestation, it's ok } } From 534858a64b346600fe6e951614b0abfe679b0d58 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 7 May 2019 20:40:17 +0300 Subject: [PATCH 20/42] test: refactor ComparableBigIntegerNode --- .../ssz/mapper/AttestationDataSerializer.java | 6 +-- .../mapper/BeaconBlockHeaderSerializer.java | 2 +- .../ssz/mapper/BeaconStateSerializer.java | 18 ++++---- .../runner/ssz/mapper/BlockSerializer.java | 2 +- .../ssz/mapper/ComparableBigIntegerNode.java | 41 +++++++++++++++++++ .../ssz/mapper/CrosslinkSerializer.java | 2 +- .../ssz/mapper/DepositDataSerializer.java | 2 +- .../runner/ssz/mapper/Eth1DataSerializer.java | 2 +- .../runner/ssz/mapper/ForkSerializer.java | 2 +- .../mapper/IndexedAttestationSerializer.java | 4 +- .../runner/ssz/mapper/ObjectSerializer.java | 28 ------------- .../mapper/PendingAttestationSerializer.java | 4 +- .../runner/ssz/mapper/TransferSerializer.java | 10 ++--- .../ssz/mapper/ValidatorSerializer.java | 10 ++--- .../ssz/mapper/VoluntaryExitSerializer.java | 4 +- 15 files changed, 75 insertions(+), 62 deletions(-) create mode 100644 test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ComparableBigIntegerNode.java diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java index 2270130a6..90da6ff76 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/AttestationDataSerializer.java @@ -19,11 +19,11 @@ public Class accepts() { public ObjectNode map(AttestationData instance) { ObjectNode attestationData = mapper.createObjectNode(); attestationData.put("beacon_block_root", instance.getBeaconBlockRoot().toString()); - ObjectSerializer.setUint64Field(attestationData, "source_epoch", instance.getSourceEpoch()); + attestationData.set("source_epoch", ComparableBigIntegerNode.valueOf(instance.getSourceEpoch())); attestationData.put("source_root", instance.getSourceRoot().toString()); - ObjectSerializer.setUint64Field(attestationData, "target_epoch", instance.getTargetEpoch()); + attestationData.set("target_epoch", ComparableBigIntegerNode.valueOf(instance.getTargetEpoch())); attestationData.put("target_root", instance.getTargetRoot().toString()); - ObjectSerializer.setUint64Field(attestationData, "shard", instance.getShard()); + attestationData.set("shard", ComparableBigIntegerNode.valueOf(instance.getShard())); attestationData.put("previous_crosslink_root", instance.getPreviousCrosslinkRoot().toString()); attestationData.put("crosslink_data_root", instance.getCrosslinkDataRoot().toString()); return attestationData; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java index 4094d7109..26f25c685 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconBlockHeaderSerializer.java @@ -19,7 +19,7 @@ public Class accepts() { @Override public ObjectNode map(BeaconBlockHeader instance) { ObjectNode beaconBlockHeader = mapper.createObjectNode(); - ObjectSerializer.setUint64Field(beaconBlockHeader, "slot", instance.getSlot()); + beaconBlockHeader.set("slot", ComparableBigIntegerNode.valueOf(instance.getSlot())); beaconBlockHeader.put("previous_block_root", instance.getPreviousBlockRoot().toString()); beaconBlockHeader.put("state_root", instance.getStateRoot().toString()); beaconBlockHeader.put("block_body_root", instance.getBlockBodyRoot().toString()); diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java index 1729b2b97..fc7c6f479 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BeaconStateSerializer.java @@ -32,15 +32,15 @@ public Class accepts() { @Override public ObjectNode map(BeaconStateImpl instance) { ObjectNode beaconState = mapper.createObjectNode(); - ObjectSerializer.setUint64Field(beaconState, "slot", instance.getSlot()); - ObjectSerializer.setUint64Field(beaconState, "genesis_time", instance.getGenesisTime()); + beaconState.set("slot", ComparableBigIntegerNode.valueOf(instance.getSlot())); + beaconState.set("genesis_time", ComparableBigIntegerNode.valueOf(instance.getGenesisTime())); beaconState.set("fork", forkSerializer.map(instance.getFork())); ArrayNode validatorRegistryNode = mapper.createArrayNode(); instance.getValidatorRegistry().stream().map(o -> validatorSerializer.map(o)).forEachOrdered(validatorRegistryNode::add); beaconState.set("validator_registry", validatorRegistryNode); ArrayNode balancesNode = mapper.createArrayNode(); - instance.getBalances().stream().map(ObjectSerializer::convert).forEachOrdered(balancesNode::add); + instance.getBalances().stream().map(ComparableBigIntegerNode::valueOf).forEachOrdered(balancesNode::add); beaconState.set("balances", balancesNode); ArrayNode latestRandaoMixes = mapper.createArrayNode(); @@ -48,7 +48,7 @@ public ObjectNode map(BeaconStateImpl instance) { .map(Hash32::toString) .forEachOrdered(latestRandaoMixes::add); beaconState.set("latest_randao_mixes", latestRandaoMixes); - ObjectSerializer.setUint64Field(beaconState, "latest_start_shard", instance.getLatestStartShard()); + beaconState.set("latest_start_shard", ComparableBigIntegerNode.valueOf(instance.getLatestStartShard())); ArrayNode previousEpochAttestationNode = mapper.createArrayNode(); instance.getPreviousEpochAttestations().stream().map(o -> pendingAttestationSerializer.map(o)).forEachOrdered(previousEpochAttestationNode::add); @@ -56,12 +56,12 @@ public ObjectNode map(BeaconStateImpl instance) { ArrayNode currentEpochAttestationsNode = mapper.createArrayNode(); instance.getCurrentEpochAttestations().stream().map(o -> pendingAttestationSerializer.map(o)).forEachOrdered(currentEpochAttestationsNode::add); beaconState.set("current_epoch_attestations", currentEpochAttestationsNode); - ObjectSerializer.setUint64Field(beaconState, "previous_justified_epoch", instance.getPreviousJustifiedEpoch()); - ObjectSerializer.setUint64Field(beaconState, "current_justified_epoch", instance.getCurrentJustifiedEpoch()); + beaconState.set("previous_justified_epoch", ComparableBigIntegerNode.valueOf(instance.getPreviousJustifiedEpoch())); + beaconState.set("current_justified_epoch", ComparableBigIntegerNode.valueOf(instance.getCurrentJustifiedEpoch())); beaconState.put("previous_justified_root", instance.getPreviousJustifiedRoot().toString()); beaconState.put("current_justified_root", instance.getCurrentJustifiedRoot().toString()); beaconState.put("justification_bitfield", instance.getJustificationBitfield().toString()); - ObjectSerializer.setUint64Field(beaconState, "finalized_epoch", instance.getFinalizedEpoch()); + beaconState.set("finalized_epoch", ComparableBigIntegerNode.valueOf(instance.getFinalizedEpoch())); beaconState.put("finalized_root", instance.getFinalizedRoot().toString()); ArrayNode currentCrosslinksNode = mapper.createArrayNode(); @@ -81,7 +81,7 @@ public ObjectNode map(BeaconStateImpl instance) { beaconState.set("latest_active_index_roots", latestActiveIndexRootsNode); ArrayNode latestSlashedBalancesNode = mapper.createArrayNode(); instance.getLatestSlashedBalances().stream() - .map(ObjectSerializer::convert) + .map(ComparableBigIntegerNode::valueOf) .forEachOrdered(latestSlashedBalancesNode::add); beaconState.set("latest_slashed_balances", latestSlashedBalancesNode); beaconState.set("latest_block_header", beaconBlockHeaderSerializer.map(instance.getLatestBlockHeader())); @@ -93,7 +93,7 @@ public ObjectNode map(BeaconStateImpl instance) { ArrayNode eth1DataVotesNode = mapper.createArrayNode(); instance.getEth1DataVotes().stream().map(o -> eth1DataSerializer.map(o)).forEachOrdered(eth1DataVotesNode::add); beaconState.set("eth1_data_votes", eth1DataVotesNode); - ObjectSerializer.setUint64Field(beaconState, "deposit_index", instance.getDepositIndex()); + beaconState.set("deposit_index", ComparableBigIntegerNode.valueOf(instance.getDepositIndex())); return beaconState; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java index c4553678d..59af1ed88 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/BlockSerializer.java @@ -21,7 +21,7 @@ public Class accepts() { @Override public ObjectNode map(BeaconBlock instance) { ObjectNode beaconBlock = mapper.createObjectNode(); - ObjectSerializer.setUint64Field(beaconBlock, "slot", instance.getSlot()); + beaconBlock.set("slot", ComparableBigIntegerNode.valueOf(instance.getSlot())); beaconBlock.put("previous_block_root", instance.getPreviousBlockRoot().toString()); beaconBlock.put("state_root", instance.getStateRoot().toString()); beaconBlock.set("body", blockBodySerializer.map(instance.getBody())); diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ComparableBigIntegerNode.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ComparableBigIntegerNode.java new file mode 100644 index 000000000..b0645a614 --- /dev/null +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ComparableBigIntegerNode.java @@ -0,0 +1,41 @@ +package org.ethereum.beacon.test.runner.ssz.mapper; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.BigIntegerNode; +import com.fasterxml.jackson.databind.node.IntNode; +import com.fasterxml.jackson.databind.node.LongNode; +import com.fasterxml.jackson.databind.node.NumericNode; +import tech.pegasys.artemis.util.uint.UInt64; + +import java.math.BigInteger; + +/** + * {@link BigIntegerNode} with overridden {@link #equals(Object)} method which ignores type of + * {@link NumericNode} when comparing to another {@link NumericNode}, so only contents is compared. + * Please note, as {@link #equals(Object)} method is called from the first object when comparing + * like `a.equals(b)`, Object `a` should be of type {@link ComparableBigIntegerNode} + */ +public class ComparableBigIntegerNode extends BigIntegerNode { + + private ComparableBigIntegerNode(BigInteger v) { + super(v); + } + + static JsonNode valueOf(UInt64 value) { + return new ComparableBigIntegerNode(value.toBI()); + } + + @Override + public boolean equals(Object o) { + boolean superResult = super.equals(o); + if (superResult) { + return true; + } + + if (o instanceof IntNode || o instanceof LongNode) { + return ((NumericNode) o).bigIntegerValue().equals(this.bigIntegerValue()); + } + + return false; + } +} diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java index 21707d5aa..21d078631 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/CrosslinkSerializer.java @@ -18,7 +18,7 @@ public Class accepts() { @Override public ObjectNode map(Crosslink instance) { ObjectNode crosslink = mapper.createObjectNode(); - ObjectSerializer.setUint64Field(crosslink, "epoch", instance.getEpoch()); + crosslink.set("epoch", ComparableBigIntegerNode.valueOf(instance.getEpoch())); crosslink.put("previous_crosslink_root", instance.getPreviousCrosslinkRoot().toString()); crosslink.put("crosslink_data_root", instance.getCrosslinkDataRoot().toString()); return crosslink; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java index 915ff4308..e3933db43 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/DepositDataSerializer.java @@ -22,7 +22,7 @@ public ObjectNode map(DepositData instance) { ObjectNode depositData = mapper.createObjectNode(); depositData.put("pubkey", BytesValue.wrap(instance.getPubKey().getArrayUnsafe()).toString()); depositData.put("withdrawal_credentials", instance.getWithdrawalCredentials().toString()); - ObjectSerializer.setUint64Field(depositData, "amount", instance.getAmount()); + depositData.set("amount", ComparableBigIntegerNode.valueOf(instance.getAmount())); depositData.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); return depositData; } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java index 3e74a64d9..3bb3f00af 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/Eth1DataSerializer.java @@ -19,7 +19,7 @@ public Class accepts() { public ObjectNode map(Eth1Data instance) { ObjectNode eth1Data = mapper.createObjectNode(); eth1Data.put("deposit_root", instance.getDepositRoot().toString()); - ObjectSerializer.setUint64Field(eth1Data, "deposit_count", instance.getDepositCount()); + eth1Data.set("deposit_count", ComparableBigIntegerNode.valueOf(instance.getDepositCount())); eth1Data.put("block_hash", instance.getBlockHash().toString()); return eth1Data; } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ForkSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ForkSerializer.java index 63533c334..67c072e8e 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ForkSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ForkSerializer.java @@ -20,7 +20,7 @@ public ObjectNode map(Fork instance) { ObjectNode fork = mapper.createObjectNode(); fork.put("previous_version", instance.getPreviousVersion().toString()); fork.put("current_version", instance.getCurrentVersion().toString()); - ObjectSerializer.setUint64Field(fork, "epoch", instance.getEpoch()); + fork.set("epoch", ComparableBigIntegerNode.valueOf(instance.getEpoch())); return fork; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java index b75ab0bd1..1a5e86690 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/IndexedAttestationSerializer.java @@ -23,10 +23,10 @@ public Class accepts() { public ObjectNode map(IndexedAttestation instance) { ObjectNode slashableAttestation = mapper.createObjectNode(); ArrayNode indices0 = mapper.createArrayNode(); - instance.getCustodyBit0Indices().stream().map(ObjectSerializer::convert).forEachOrdered(indices0::add); + instance.getCustodyBit0Indices().stream().map(ComparableBigIntegerNode::valueOf).forEachOrdered(indices0::add); slashableAttestation.set("custody_bit_0_indices", indices0); ArrayNode indices1 = mapper.createArrayNode(); - instance.getCustodyBit1Indices().stream().map(ObjectSerializer::convert).forEachOrdered(indices1::add); + instance.getCustodyBit1Indices().stream().map(ComparableBigIntegerNode::valueOf).forEachOrdered(indices1::add); slashableAttestation.set("custody_bit_1_indices", indices1); slashableAttestation.set("data", attestationDataSerializer.map(instance.getData())); slashableAttestation.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ObjectSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ObjectSerializer.java index 53af52ec1..8ac7c93df 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ObjectSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ObjectSerializer.java @@ -14,32 +14,4 @@ public interface ObjectSerializer { Class accepts(); Object map(V instance); - - static void setUint64Field(ObjectNode node, String fieldName, UInt64 value) { - node.set(fieldName, convert(value)); - } - - static JsonNode convert(UInt64 value) { - return new ComparableBigIntegerNode(value.toBI()); - } - - public static class ComparableBigIntegerNode extends BigIntegerNode { - ComparableBigIntegerNode(BigInteger v) { - super(v); - } - - @Override - public boolean equals(Object o) { - boolean superResult = super.equals(o); - if (superResult) { - return true; - } - - if (o instanceof IntNode || o instanceof LongNode) { - return ((NumericNode) o).bigIntegerValue().equals(this.bigIntegerValue()); - } - - return false; - } - } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java index e1171da7c..f2a79f5eb 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/PendingAttestationSerializer.java @@ -22,8 +22,8 @@ public ObjectNode map(PendingAttestation instance) { ObjectNode pendingAttestation = mapper.createObjectNode(); pendingAttestation.put("aggregation_bitfield", instance.getAggregationBitfield().toString()); pendingAttestation.set("data", attestationDataSerializer.map(instance.getData())); - ObjectSerializer.setUint64Field(pendingAttestation, "inclusion_delay", instance.getInclusionDelay()); - ObjectSerializer.setUint64Field(pendingAttestation, "proposer_index", instance.getProposerIndex()); + pendingAttestation.set("inclusion_delay", ComparableBigIntegerNode.valueOf(instance.getInclusionDelay())); + pendingAttestation.set("proposer_index", ComparableBigIntegerNode.valueOf(instance.getProposerIndex())); return pendingAttestation; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/TransferSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/TransferSerializer.java index cfd1ca89f..8e5492816 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/TransferSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/TransferSerializer.java @@ -19,11 +19,11 @@ public Class accepts() { @Override public ObjectNode map(Transfer instance) { ObjectNode transfer = mapper.createObjectNode(); - ObjectSerializer.setUint64Field(transfer, "sender", instance.getSender()); - ObjectSerializer.setUint64Field(transfer, "recipient", instance.getRecipient()); - ObjectSerializer.setUint64Field(transfer, "amount", instance.getAmount()); - ObjectSerializer.setUint64Field(transfer, "fee", instance.getFee()); - ObjectSerializer.setUint64Field(transfer, "slot", instance.getSlot()); + transfer.set("sender", ComparableBigIntegerNode.valueOf(instance.getSender())); + transfer.set("recipient", ComparableBigIntegerNode.valueOf(instance.getRecipient())); + transfer.set("amount", ComparableBigIntegerNode.valueOf(instance.getAmount())); + transfer.set("fee", ComparableBigIntegerNode.valueOf(instance.getFee())); + transfer.set("slot", ComparableBigIntegerNode.valueOf(instance.getSlot())); transfer.put("pubkey", BytesValue.wrap(instance.getPubkey().getArrayUnsafe()).toString()); transfer.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); return transfer; diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java index 56285497c..918bec6a3 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/ValidatorSerializer.java @@ -21,12 +21,12 @@ public ObjectNode map(ValidatorRecord instance) { ObjectNode validatorRecord = mapper.createObjectNode(); validatorRecord.put("pubkey", BytesValue.wrap(instance.getPubKey().getArrayUnsafe()).toString()); validatorRecord.put("withdrawal_credentials", instance.getWithdrawalCredentials().toString()); - ObjectSerializer.setUint64Field(validatorRecord, "activation_eligibility_epoch", instance.getActivationEligibilityEpoch()); - ObjectSerializer.setUint64Field(validatorRecord, "activation_epoch", instance.getActivationEpoch()); - ObjectSerializer.setUint64Field(validatorRecord, "exit_epoch", instance.getExitEpoch()); - ObjectSerializer.setUint64Field(validatorRecord, "withdrawable_epoch", instance.getWithdrawableEpoch()); + validatorRecord.set("activation_eligibility_epoch", ComparableBigIntegerNode.valueOf(instance.getActivationEligibilityEpoch())); + validatorRecord.set("activation_epoch", ComparableBigIntegerNode.valueOf(instance.getActivationEpoch())); + validatorRecord.set("exit_epoch", ComparableBigIntegerNode.valueOf(instance.getExitEpoch())); + validatorRecord.set("withdrawable_epoch", ComparableBigIntegerNode.valueOf(instance.getWithdrawableEpoch())); validatorRecord.put("slashed", instance.getSlashed()); - ObjectSerializer.setUint64Field(validatorRecord, "high_balance", instance.getEffectiveBalance()); + validatorRecord.set("high_balance", ComparableBigIntegerNode.valueOf(instance.getEffectiveBalance())); return validatorRecord; } } diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/VoluntaryExitSerializer.java b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/VoluntaryExitSerializer.java index e83e0580b..ec89de027 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/VoluntaryExitSerializer.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/ssz/mapper/VoluntaryExitSerializer.java @@ -19,8 +19,8 @@ public Class accepts() { @Override public ObjectNode map(VoluntaryExit instance) { ObjectNode voluntaryExit = mapper.createObjectNode(); - ObjectSerializer.setUint64Field(voluntaryExit, "epoch", instance.getEpoch()); - ObjectSerializer.setUint64Field(voluntaryExit, "validator_index", instance.getValidatorIndex()); + voluntaryExit.set("epoch", ComparableBigIntegerNode.valueOf(instance.getEpoch())); + voluntaryExit.set("validator_index", ComparableBigIntegerNode.valueOf(instance.getValidatorIndex())); voluntaryExit.put("signature", BytesValue.wrap(instance.getSignature().getArrayUnsafe()).toString()); return voluntaryExit; } From 95d0590de595217a0e7dbcf975c4c7175df6ae01 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 8 May 2019 16:33:05 +0300 Subject: [PATCH 21/42] refactor SpecAssertion error --- .../beacon/consensus/spec/SpecCommons.java | 17 +++++++++++++++-- .../verifier/operation/AttestationVerifier.java | 3 +-- .../operation/AttesterSlashingVerifier.java | 3 +-- .../verifier/operation/DepositVerifier.java | 3 +-- .../operation/ProposerSlashingVerifier.java | 3 +-- .../verifier/operation/TransferVerifier.java | 3 +-- .../operation/VoluntaryExitVerifier.java | 3 +-- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/SpecCommons.java b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/SpecCommons.java index e14d135b3..0e1b8636c 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/spec/SpecCommons.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/spec/SpecCommons.java @@ -1,6 +1,5 @@ package org.ethereum.beacon.consensus.spec; -import java.util.function.Function; import org.ethereum.beacon.consensus.hasher.ObjectHasher; import org.ethereum.beacon.core.BeaconState; import org.ethereum.beacon.core.spec.SpecConstants; @@ -9,6 +8,8 @@ import tech.pegasys.artemis.ethereum.core.Hash32; import tech.pegasys.artemis.util.bytes.BytesValue; +import java.util.function.Function; + /** * A common part of the spec that is shared by all its components. */ @@ -42,5 +43,17 @@ default void checkShardRange(ShardNumber shard) { assertTrue(shard.less(getConstants().getShardCount())); } - class SpecAssertionFailed extends RuntimeException {} + class SpecAssertionFailed extends RuntimeException { + @Override + public String getMessage() { + return toString(); + } + + @Override + public String toString() { + return String.format( + "SpecAssertionFailed{%s}", + getStackTrace().length > 1 ? getStackTrace()[1].toString() : ""); + } + } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttestationVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttestationVerifier.java index 4683d2de5..7655aafdd 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttestationVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttestationVerifier.java @@ -29,8 +29,7 @@ public VerificationResult verify(Attestation attestation, BeaconState state) { spec.verify_attestation(state, attestation); return VerificationResult.PASSED; } catch (SpecCommons.SpecAssertionFailed e) { - String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; - return VerificationResult.failedResult(error); + return VerificationResult.failedResult(e.getMessage()); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttesterSlashingVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttesterSlashingVerifier.java index cfa65533a..519371ce0 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttesterSlashingVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/AttesterSlashingVerifier.java @@ -29,8 +29,7 @@ public VerificationResult verify(AttesterSlashing attesterSlashing, BeaconState spec.verify_attester_slashing(state, attesterSlashing); return VerificationResult.PASSED; } catch (SpecCommons.SpecAssertionFailed e) { - String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; - return VerificationResult.failedResult(error); + return VerificationResult.failedResult(e.getMessage()); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/DepositVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/DepositVerifier.java index 8570991a0..02dec9d8b 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/DepositVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/DepositVerifier.java @@ -32,8 +32,7 @@ public VerificationResult verify(Deposit deposit, BeaconState state) { spec.verify_deposit(state, deposit); return VerificationResult.PASSED; } catch (SpecCommons.SpecAssertionFailed e) { - String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; - return VerificationResult.failedResult(error); + return VerificationResult.failedResult(e.getMessage()); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/ProposerSlashingVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/ProposerSlashingVerifier.java index 0d19f2d08..b902eed14 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/ProposerSlashingVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/ProposerSlashingVerifier.java @@ -29,8 +29,7 @@ public VerificationResult verify(ProposerSlashing proposerSlashing, BeaconState spec.verify_proposer_slashing(state, proposerSlashing); return VerificationResult.PASSED; } catch (SpecCommons.SpecAssertionFailed e) { - String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; - return VerificationResult.failedResult(error); + return VerificationResult.failedResult(e.getMessage()); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/TransferVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/TransferVerifier.java index 52d392e4b..b9dba002b 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/TransferVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/TransferVerifier.java @@ -28,8 +28,7 @@ public VerificationResult verify(Transfer transfer, BeaconState state) { spec.verify_transfer(state, transfer); return VerificationResult.PASSED; } catch (SpecCommons.SpecAssertionFailed e) { - String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; - return VerificationResult.failedResult(error); + return VerificationResult.failedResult(e.getMessage()); } } } diff --git a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/VoluntaryExitVerifier.java b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/VoluntaryExitVerifier.java index d76140754..5fd4595d6 100644 --- a/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/VoluntaryExitVerifier.java +++ b/consensus/src/main/java/org/ethereum/beacon/consensus/verifier/operation/VoluntaryExitVerifier.java @@ -29,8 +29,7 @@ public VerificationResult verify(VoluntaryExit voluntaryExit, BeaconState state) spec.verify_voluntary_exit(state, voluntaryExit); return VerificationResult.PASSED; } catch (SpecCommons.SpecAssertionFailed e) { - String error = e.getStackTrace().length > 0 ? e.getStackTrace()[1].toString() : "SpecAssertion"; - return VerificationResult.failedResult(error); + return VerificationResult.failedResult(e.getMessage()); } } } From 85a24e54267614692b8262e90ecdddcead6d06ca Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 8 May 2019 17:07:07 +0300 Subject: [PATCH 22/42] test: state test runner refactor + add processing error where needed --- .../beacon/test/runner/state/StateRunner.java | 67 ++++++++++++++----- 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java index 4541c34b1..fa2712bc1 100644 --- a/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java +++ b/test/src/test/java/org/ethereum/beacon/test/runner/state/StateRunner.java @@ -2,6 +2,8 @@ import org.ethereum.beacon.consensus.BeaconChainSpec; import org.ethereum.beacon.consensus.spec.SpecCommons; +import org.ethereum.beacon.consensus.verifier.OperationVerifier; +import org.ethereum.beacon.consensus.verifier.VerificationResult; import org.ethereum.beacon.consensus.verifier.operation.AttestationVerifier; import org.ethereum.beacon.consensus.verifier.operation.DepositVerifier; import org.ethereum.beacon.core.BeaconState; @@ -13,8 +15,10 @@ import org.ethereum.beacon.test.type.TestCase; import org.ethereum.beacon.test.type.state.StateTestCase; import org.ethereum.beacon.test.type.state.StateTestCase.BeaconStateData; +import org.javatuples.Pair; import java.util.Optional; +import java.util.function.Consumer; /** * TestRunner for {@link StateTestCase} @@ -41,11 +45,12 @@ public Optional run() { return Optional.of("Initial state parsed incorrectly: " + err.get()); } BeaconState latestState = initialState; + Optional processingError; if (testCase.getDeposit() != null) { - processDeposit(testCase.getDepositOperation(), latestState); + processingError = processDeposit(testCase.getDepositOperation(), latestState); } else if (testCase.getAttestation() != null) { - processAttestation(testCase.getAttestationOperation(), latestState); + processingError = processAttestation(testCase.getAttestationOperation(), latestState); } else { throw new RuntimeException("Only Attestation and Deposit test cases are implemented!!!"); } @@ -53,27 +58,55 @@ public Optional run() { if (testCase.getPost() == null) { // XXX: Not changed return StateComparator.compare(testCase.getPre(), latestState); } else { - return StateComparator.compare(testCase.getPost(), latestState); + Optional compareResult = StateComparator.compare(testCase.getPost(), latestState); + if (!compareResult.isPresent()) { + return Optional.empty(); + } + + String processingErrorMessage = "Processing error: "; + if (processingError.isPresent()) { + processingErrorMessage += processingError.get(); + } + return Optional.of(compareResult.get() + processingErrorMessage); } } - private void processDeposit(Deposit deposit, BeaconState state) { - try { - DepositVerifier depositVerifier = new DepositVerifier(spec); - assert depositVerifier.verify(deposit, state).isPassed(); - spec.process_deposit((MutableBeaconState) state, deposit); - } catch (SpecCommons.SpecAssertionFailed | AssertionError ex) { - // XXX: there could be invalid deposit, it's ok - } + private Optional processDeposit(Deposit deposit, BeaconState state) { + DepositVerifier depositVerifier = new DepositVerifier(spec); + return processOperation( + deposit, + state, + depositVerifier, + objects -> + spec.process_deposit((MutableBeaconState) objects.getValue1(), objects.getValue0())); + } + + private Optional processAttestation(Attestation attestation, BeaconState state) { + AttestationVerifier attestationVerifier = new AttestationVerifier(spec); + return processOperation( + attestation, + state, + attestationVerifier, + objects -> + spec.process_attestation( + (MutableBeaconState) objects.getValue1(), objects.getValue0())); } - private void processAttestation(Attestation attestation, BeaconState state) { + private Optional processOperation( + O operation, + BeaconState state, + OperationVerifier verifier, + Consumer> operationProcessor) { try { - AttestationVerifier attestationVerifier = new AttestationVerifier(spec); - assert attestationVerifier.verify(attestation, state).isPassed(); - spec.process_attestation((MutableBeaconState) state, attestation); - } catch (SpecCommons.SpecAssertionFailed | AssertionError ex) { - // XXX: there could be invalid attestation, it's ok + VerificationResult verificationResult = verifier.verify(operation, state); + if (verificationResult.isPassed()) { + operationProcessor.accept(Pair.with(operation, state)); + return Optional.empty(); + } else { + return Optional.of(verificationResult.getMessage()); + } + } catch (SpecCommons.SpecAssertionFailed ex) { + return Optional.of(ex.getMessage()); } } From 7fd6d11083b9830e01889283d8a051d8a39141f9 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Sat, 11 May 2019 17:59:06 +0300 Subject: [PATCH 23/42] test: fix AttestationData according to v0.6.1 --- .../ethereum/beacon/test/StateTestUtils.java | 2 +- .../beacon/test/type/state/StateTestCase.java | 21 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java b/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java index 03910717e..473839a7d 100644 --- a/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java +++ b/test/src/test/java/org/ethereum/beacon/test/StateTestUtils.java @@ -302,7 +302,7 @@ public static AttestationData parseAttestationData(AttestationDataContainer data Hash32.fromHexString(data.getBeaconBlockRoot()), EpochNumber.castFrom(UInt64.valueOf(data.getSourceEpoch())), Hash32.fromHexString(data.getSourceRoot()), - EpochNumber.castFrom(UInt64.valueOf(data.getSourceEpoch())), + EpochNumber.castFrom(UInt64.valueOf(data.getTargetEpoch())), Hash32.fromHexString(data.getTargetRoot()), ShardNumber.of(data.getShard()), Hash32.fromHexString(data.getPreviousCrosslinkRoot()), diff --git a/test/src/test/java/org/ethereum/beacon/test/type/state/StateTestCase.java b/test/src/test/java/org/ethereum/beacon/test/type/state/StateTestCase.java index 2f0e04e90..7b9945f28 100644 --- a/test/src/test/java/org/ethereum/beacon/test/type/state/StateTestCase.java +++ b/test/src/test/java/org/ethereum/beacon/test/type/state/StateTestCase.java @@ -597,8 +597,6 @@ public void setProposerIndex(Long proposerIndex) { } public static class AttestationDataContainer { - private String slot; - @JsonProperty("beacon_block_root") private String beaconBlockRoot; @@ -608,6 +606,9 @@ public static class AttestationDataContainer { @JsonProperty("source_root") private String sourceRoot; + @JsonProperty("target_epoch") + private String targetEpoch; + @JsonProperty("target_root") private String targetRoot; @@ -619,14 +620,6 @@ public static class AttestationDataContainer { @JsonProperty("crosslink_data_root") private String crosslinkDataRoot; - public String getSlot() { - return slot; - } - - public void setSlot(String slot) { - this.slot = slot; - } - public String getBeaconBlockRoot() { return beaconBlockRoot; } @@ -682,6 +675,14 @@ public String getCrosslinkDataRoot() { public void setCrosslinkDataRoot(String crosslinkDataRoot) { this.crosslinkDataRoot = crosslinkDataRoot; } + + public String getTargetEpoch() { + return targetEpoch; + } + + public void setTargetEpoch(String targetEpoch) { + this.targetEpoch = targetEpoch; + } } } From fde9c97a7b05106e9726a9f66d571519c47b2130 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Sat, 11 May 2019 18:00:12 +0300 Subject: [PATCH 24/42] test: operations/attestations state tests are ignored until fixtures are updated to the latest spec --- test/src/test/java/org/ethereum/beacon/test/StateTests.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/test/java/org/ethereum/beacon/test/StateTests.java b/test/src/test/java/org/ethereum/beacon/test/StateTests.java index cb92ced7d..a7828b0c1 100644 --- a/test/src/test/java/org/ethereum/beacon/test/StateTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/StateTests.java @@ -2,6 +2,7 @@ import org.ethereum.beacon.test.runner.state.StateRunner; import org.ethereum.beacon.test.type.state.StateTest; +import org.junit.Ignore; import org.junit.Test; import java.nio.file.Path; @@ -11,6 +12,7 @@ public class StateTests extends TestUtils { private String OPERATIONS_TESTS_DIR = "operations"; @Test + @Ignore("Postponed till generator updates") public void testAttestationOperations() { Path testFileDir = Paths.get(PATH_TO_TESTS, OPERATIONS_TESTS_DIR, "attestations"); runTestsInResourceDir( From a75d7d54407baf24f723f06039f6d89ead160d49 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Thu, 16 May 2019 10:32:36 +0300 Subject: [PATCH 25/42] test: added @ignore to 2 bls tests which fails because of old hashing algo used in fixtures generation --- test/src/test/java/org/ethereum/beacon/test/BlsTests.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/test/java/org/ethereum/beacon/test/BlsTests.java b/test/src/test/java/org/ethereum/beacon/test/BlsTests.java index 2aeaefe22..9b12280b9 100644 --- a/test/src/test/java/org/ethereum/beacon/test/BlsTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/BlsTests.java @@ -51,6 +51,7 @@ public void testBlsMessageHash() { } @Test + @Ignore("Fixtures should be updated with sha256 as hasher instead of keccak256") public void testBlsMessageHashCompressed() { Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "msg_hash_g2_compressed", "g2_compressed.yaml"); @@ -94,6 +95,7 @@ public void testBlsPrivateToPublic() { } @Test + @Ignore("Fixtures should be updated with sha256 as hasher instead of keccak256") public void testBlsSignMessage() { Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "sign_msg", "sign_msg.yaml"); BlsSignMessageTest test = From a7ec1acb4e34856d08775e9ae4a13d65e7e1b9cb Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 13:39:07 +0300 Subject: [PATCH 26/42] test: removed old tests repository --- .gitmodules | 3 --- test/src/test/resources/eth2.0-tests | 1 - 2 files changed, 4 deletions(-) delete mode 160000 test/src/test/resources/eth2.0-tests diff --git a/.gitmodules b/.gitmodules index de4e57278..bda7a3360 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "test/src/test/resources/eth2.0-tests"] - path = test/src/test/resources/eth2.0-tests - url = https://github.com/ethereum/eth2.0-tests.git [submodule "crypto/src/main/resources/bls-key-pairs"] path = crypto/src/main/resources/bls-key-pairs url = https://github.com/harmony-dev/bls-key-pairs diff --git a/test/src/test/resources/eth2.0-tests b/test/src/test/resources/eth2.0-tests deleted file mode 160000 index 33e762c76..000000000 --- a/test/src/test/resources/eth2.0-tests +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 33e762c76e0a9458d9d89fa4f9c696e769fb2e2f From 57850b65817fd923dd0ccf726e2bf0ac78f025b4 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 13:59:47 +0300 Subject: [PATCH 27/42] test: update tests to use eth2.0-spec-tests repository with temp copied configs --- .gitmodules | 3 + .../org/ethereum/beacon/test/TestUtils.java | 2 +- test/src/test/resources/eth2.0-spec-tests | 1 + .../constant_presets/README.md | 20 +++ .../constant_presets/mainnet.yaml | 123 ++++++++++++++++++ .../constant_presets/minimal.yaml | 123 ++++++++++++++++++ .../fork_timelines/README.md | 18 +++ .../fork_timelines/mainnet.yaml | 12 ++ .../fork_timelines/testing.yaml | 6 + 9 files changed, 307 insertions(+), 1 deletion(-) create mode 160000 test/src/test/resources/eth2.0-spec-tests create mode 100644 test/src/test/resources/eth2.0-temp-test-configs/constant_presets/README.md create mode 100644 test/src/test/resources/eth2.0-temp-test-configs/constant_presets/mainnet.yaml create mode 100644 test/src/test/resources/eth2.0-temp-test-configs/constant_presets/minimal.yaml create mode 100644 test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/README.md create mode 100644 test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/mainnet.yaml create mode 100644 test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/testing.yaml diff --git a/.gitmodules b/.gitmodules index bda7a3360..0b4451122 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "crypto/src/main/resources/bls-key-pairs"] path = crypto/src/main/resources/bls-key-pairs url = https://github.com/harmony-dev/bls-key-pairs +[submodule "test/src/test/resources/eth2.0-spec-tests"] + path = test/src/test/resources/eth2.0-spec-tests + url = https://github.com/ethereum/eth2.0-spec-tests.git diff --git a/test/src/test/java/org/ethereum/beacon/test/TestUtils.java b/test/src/test/java/org/ethereum/beacon/test/TestUtils.java index 660cddd82..fd1fba23e 100644 --- a/test/src/test/java/org/ethereum/beacon/test/TestUtils.java +++ b/test/src/test/java/org/ethereum/beacon/test/TestUtils.java @@ -48,7 +48,7 @@ public class TestUtils { "git submodule init & git submodule update --recursive --remote"; static ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory()); static String PATH_TO_TESTS = "eth2.0-spec-tests/tests"; - static String PATH_TO_CONFIGS = "eth2.0-spec-tests/configs"; + static String PATH_TO_CONFIGS = "eth2.0-temp-test-configs"; static String SPEC_CONFIG_DIR = "constant_presets"; static String FORK_CONFIG_DIR = "fork_timelines"; diff --git a/test/src/test/resources/eth2.0-spec-tests b/test/src/test/resources/eth2.0-spec-tests new file mode 160000 index 000000000..161a36ee6 --- /dev/null +++ b/test/src/test/resources/eth2.0-spec-tests @@ -0,0 +1 @@ +Subproject commit 161a36ee6232d8d251d798c8262638ed0c34c9c6 diff --git a/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/README.md b/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/README.md new file mode 100644 index 000000000..45148862e --- /dev/null +++ b/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/README.md @@ -0,0 +1,20 @@ +# Constant Presets + +This directory contains a set of constants presets used for testing, testnets, and mainnet. + +A preset file contains all the constants known for its target. +Later-fork constants can be ignored, e.g. ignore phase1 constants as a client that only supports phase 0 currently. + +## Format + +Each preset is a key-value mapping. + +**Key**: an `UPPER_SNAKE_CASE` (a.k.a. "macro case") formatted string, name of the constant. +**Value**: can be any of: + - an unsigned integer number, can be up to 64 bits (incl.) + - a hexadecimal string, prefixed with `0x` + +Presets may contain comments to describe the values. + +See `mainnet.yaml` for a complete example. + diff --git a/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/mainnet.yaml b/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/mainnet.yaml new file mode 100644 index 000000000..d63c617b7 --- /dev/null +++ b/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/mainnet.yaml @@ -0,0 +1,123 @@ +# Mainnet preset +# Note: the intention of this file (for now) is to illustrate what a mainnet configuration could look like. +# Some of these constants may still change before the launch of Phase 0. + + +# Misc +# --------------------------------------------------------------- +# 2**10 (= 1,024) +SHARD_COUNT: 1024 +# 2**7 (= 128) +TARGET_COMMITTEE_SIZE: 128 +# 2**12 (= 4,096) +MAX_INDICES_PER_ATTESTATION: 4096 +# 2**2 (= 4) +MIN_PER_EPOCH_CHURN_LIMIT: 4 +# 2**16 (= 65,536) +CHURN_LIMIT_QUOTIENT: 65536 +# See issue 563 +SHUFFLE_ROUND_COUNT: 90 + + +# Deposit contract +# --------------------------------------------------------------- +# **TBD** +DEPOSIT_CONTRACT_ADDRESS: 0x1234567890123456789012345678901234567890 +# 2**5 (= 32) +DEPOSIT_CONTRACT_TREE_DEPTH: 32 + + +# Gwei values +# --------------------------------------------------------------- +# 2**0 * 10**9 (= 1,000,000,000) Gwei +MIN_DEPOSIT_AMOUNT: 1000000000 +# 2**5 * 10**9 (= 32,000,000,000) Gwei +MAX_EFFECTIVE_BALANCE: 32000000000 +# 2**4 * 10**9 (= 16,000,000,000) Gwei +EJECTION_BALANCE: 16000000000 +# 2**0 * 10**9 (= 1,000,000,000) Gwei +HIGH_BALANCE_INCREMENT: 1000000000 + + +# Initial values +# --------------------------------------------------------------- +GENESIS_FORK_VERSION: 0x00000000 +# 0, GENESIS_EPOCH is derived from this constant +GENESIS_SLOT: 0 +# 2**64 - 1 +FAR_FUTURE_EPOCH: 18446744073709551615 +BLS_WITHDRAWAL_PREFIX_BYTE: 0x00 + + +# Time parameters +# --------------------------------------------------------------- +# 6 seconds 6 seconds +SECONDS_PER_SLOT: 6 +# 2**2 (= 4) slots 24 seconds +MIN_ATTESTATION_INCLUSION_DELAY: 4 +# 2**6 (= 64) slots 6.4 minutes +SLOTS_PER_EPOCH: 64 +# 2**0 (= 1) epochs 6.4 minutes +MIN_SEED_LOOKAHEAD: 1 +# 2**2 (= 4) epochs 25.6 minutes +ACTIVATION_EXIT_DELAY: 4 +# 2**10 (= 1,024) slots ~1.7 hours +SLOTS_PER_ETH1_VOTING_PERIOD: 1024 +# 2**13 (= 8,192) slots ~13 hours +SLOTS_PER_HISTORICAL_ROOT: 8192 +# 2**8 (= 256) epochs ~27 hours +MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256 +# 2**11 (= 2,048) epochs 9 days +PERSISTENT_COMMITTEE_PERIOD: 2048 +# 2**6 (= 64) epochs ~7 hours +MAX_CROSSLINK_EPOCHS: 64 + + +# State list lengths +# --------------------------------------------------------------- +# 2**13 (= 8,192) epochs ~36 days +LATEST_RANDAO_MIXES_LENGTH: 8192 +# 2**13 (= 8,192) epochs ~36 days +LATEST_ACTIVE_INDEX_ROOTS_LENGTH: 8192 +# 2**13 (= 8,192) epochs ~36 days +LATEST_SLASHED_EXIT_LENGTH: 8192 + + +# Reward and penalty quotients +# --------------------------------------------------------------- +# 2**5 (= 32) +BASE_REWARD_QUOTIENT: 32 +# 2**9 (= 512) +WHISTLEBLOWING_REWARD_QUOTIENT: 512 +# 2**3 (= 8) +PROPOSER_REWARD_QUOTIENT: 8 +# 2**24 (= 16,777,216) +INACTIVITY_PENALTY_QUOTIENT: 16777216 + + +# Max operations per block +# --------------------------------------------------------------- +# 2**5 (= 32) +MIN_PENALTY_QUOTIENT: 32 +# 2**4 (= 16) +MAX_PROPOSER_SLASHINGS: 16 +# 2**0 (= 1) +MAX_ATTESTER_SLASHINGS: 1 +# 2**7 (= 128) +MAX_ATTESTATIONS: 128 +# 2**4 (= 16) +MAX_DEPOSITS: 16 +# 2**4 (= 16) +MAX_VOLUNTARY_EXITS: 16 +# Originally 2**4 (= 16), disabled for now. +MAX_TRANSFERS: 0 + + +# Signature domains +# --------------------------------------------------------------- +DOMAIN_BEACON_PROPOSER: 0 +DOMAIN_RANDAO: 1 +DOMAIN_ATTESTATION: 2 +DOMAIN_DEPOSIT: 3 +DOMAIN_VOLUNTARY_EXIT: 4 +DOMAIN_TRANSFER: 5 \ No newline at end of file diff --git a/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/minimal.yaml b/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/minimal.yaml new file mode 100644 index 000000000..711f6737d --- /dev/null +++ b/test/src/test/resources/eth2.0-temp-test-configs/constant_presets/minimal.yaml @@ -0,0 +1,123 @@ +# Minimal preset + + +# Misc +# --------------------------------------------------------------- + +# [customized] Just 8 shards for testing purposes +SHARD_COUNT: 8 + +# [customized] unsecure, but fast +TARGET_COMMITTEE_SIZE: 4 +# 2**12 (= 4,096) +MAX_INDICES_PER_ATTESTATION: 4096 +# 2**2 (= 4) +MIN_PER_EPOCH_CHURN_LIMIT: 4 +# 2**16 (= 65,536) +CHURN_LIMIT_QUOTIENT: 65536 +# [customized] Faster, but unsecure. +SHUFFLE_ROUND_COUNT: 10 + + +# Deposit contract +# --------------------------------------------------------------- +# **TBD** +DEPOSIT_CONTRACT_ADDRESS: 0x1234567890123456789012345678901234567890 +# 2**5 (= 32) +DEPOSIT_CONTRACT_TREE_DEPTH: 32 + + +# Gwei values +# --------------------------------------------------------------- +# 2**0 * 10**9 (= 1,000,000,000) Gwei +MIN_DEPOSIT_AMOUNT: 1000000000 +# 2**5 * 10**9 (= 32,000,000,000) Gwei +MAX_EFFECTIVE_BALANCE: 32000000000 +# 2**4 * 10**9 (= 16,000,000,000) Gwei +EJECTION_BALANCE: 16000000000 +# 2**0 * 10**9 (= 1,000,000,000) Gwei +HIGH_BALANCE_INCREMENT: 1000000000 + + +# Initial values +# --------------------------------------------------------------- +GENESIS_FORK_VERSION: 0x00000000 +# 0, GENESIS_EPOCH is derived from this constant +GENESIS_SLOT: 0 +# 2**64 - 1 +FAR_FUTURE_EPOCH: 18446744073709551615 +BLS_WITHDRAWAL_PREFIX_BYTE: 0x00 + + +# Time parameters +# --------------------------------------------------------------- +# 6 seconds 6 seconds +SECONDS_PER_SLOT: 6 +# [customized] 2 slots +MIN_ATTESTATION_INCLUSION_DELAY: 2 +# [customized] fast epochs +SLOTS_PER_EPOCH: 8 +# 2**0 (= 1) epochs 6.4 minutes +MIN_SEED_LOOKAHEAD: 1 +# 2**2 (= 4) epochs 25.6 minutes +ACTIVATION_EXIT_DELAY: 4 +# [customized] higher frequency new deposits from eth1 for testing +SLOTS_PER_ETH1_VOTING_PERIOD: 16 +# [customized] smaller state +SLOTS_PER_HISTORICAL_ROOT: 64 +# 2**8 (= 256) epochs ~27 hours +MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256 +# 2**11 (= 2,048) epochs 9 days +PERSISTENT_COMMITTEE_PERIOD: 2048 +# 2**6 (= 64) epochs ~7 hours +MAX_CROSSLINK_EPOCHS: 64 + + +# State list lengths +# --------------------------------------------------------------- +# [customized] smaller state +LATEST_RANDAO_MIXES_LENGTH: 64 +# [customized] smaller state +LATEST_ACTIVE_INDEX_ROOTS_LENGTH: 64 +# [customized] smaller state +LATEST_SLASHED_EXIT_LENGTH: 64 + + +# Reward and penalty quotients +# --------------------------------------------------------------- +# 2**5 (= 32) +BASE_REWARD_QUOTIENT: 32 +# 2**9 (= 512) +WHISTLEBLOWING_REWARD_QUOTIENT: 512 +# 2**3 (= 8) +PROPOSER_REWARD_QUOTIENT: 8 +# 2**24 (= 16,777,216) +INACTIVITY_PENALTY_QUOTIENT: 16777216 + + +# Max operations per block +# --------------------------------------------------------------- +# 2**5 (= 32) +MIN_PENALTY_QUOTIENT: 32 +# 2**4 (= 16) +MAX_PROPOSER_SLASHINGS: 16 +# 2**0 (= 1) +MAX_ATTESTER_SLASHINGS: 1 +# 2**7 (= 128) +MAX_ATTESTATIONS: 128 +# 2**4 (= 16) +MAX_DEPOSITS: 16 +# 2**4 (= 16) +MAX_VOLUNTARY_EXITS: 16 +# Originally 2**4 (= 16), disabled for now. +MAX_TRANSFERS: 0 + + +# Signature domains +# --------------------------------------------------------------- +DOMAIN_BEACON_PROPOSER: 0 +DOMAIN_RANDAO: 1 +DOMAIN_ATTESTATION: 2 +DOMAIN_DEPOSIT: 3 +DOMAIN_VOLUNTARY_EXIT: 4 +DOMAIN_TRANSFER: 5 \ No newline at end of file diff --git a/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/README.md b/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/README.md new file mode 100644 index 000000000..c93b415f5 --- /dev/null +++ b/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/README.md @@ -0,0 +1,18 @@ +# Fork timelines + +This directory contains a set of fork timelines used for testing, testnets, and mainnet. + +A timeline file contains all the forks known for its target. +Later forks can be ignored, e.g. ignore fork `phase1` as a client that only supports phase 0 currently. + +## Format + +Each preset is a key-value mapping. + +**Key**: an `lower_snake_case` (a.k.a. "python case") formatted string, name of the fork. +**Value**: an unsigned integer number, epoch number of activation of the fork + +Timelines may contain comments to describe the values. + +See `mainnet.yaml` for a complete example. + diff --git a/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/mainnet.yaml b/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/mainnet.yaml new file mode 100644 index 000000000..8d51d6582 --- /dev/null +++ b/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/mainnet.yaml @@ -0,0 +1,12 @@ +# Mainnet fork timeline + +# Equal to GENESIS_EPOCH +phase0: 67108864 + +# Example 1: +# phase0_funny_fork_name: 67116000 + +# Example 2: +# Should be equal to PHASE_1_GENESIS_EPOCH +# (placeholder in example value here) +# phase1: 67163000 diff --git a/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/testing.yaml b/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/testing.yaml new file mode 100644 index 000000000..957a53b8c --- /dev/null +++ b/test/src/test/resources/eth2.0-temp-test-configs/fork_timelines/testing.yaml @@ -0,0 +1,6 @@ +# Testing fork timeline + +# Equal to GENESIS_EPOCH +phase0: 536870912 + +# No other forks considered in testing yet (to be implemented) From 181973f54e3963e02cea7e7068f8529fc8a1a4e3 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 16:25:44 +0300 Subject: [PATCH 28/42] test: added lfs install on tests task --- test/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/test/build.gradle b/test/build.gradle index 54db7f41a..f6d18e70c 100644 --- a/test/build.gradle +++ b/test/build.gradle @@ -17,6 +17,7 @@ dependencies { task submodulesUpdate(type:Exec) { description 'Updates (and inits) git submodules' + commandLine 'git', 'lfs', 'install' commandLine 'git', 'submodule', 'update', '--init', '--recursive' group 'Build Setup' } From c04e77d01c992b3ed4beddc2b9b2e926fc33372d Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 20:19:28 +0300 Subject: [PATCH 29/42] add git-lfs install on Circle CI --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0e3bca25b..c940cf93f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,7 +18,9 @@ jobs: keys: - v1-gradle-dir-{{ checksum "build.gradle" }} - v1-gradle-dir- - + - run: + name: Install git-lfs for submodules with large files + command: sudo apt-get update && sudo apt-get install -y git-lfs - run: name: Downloading dependencies command: ./gradlew allDependencies From 50bfa01a5aea715e4ae002a371051a52c81e5b4e Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 20:32:57 +0300 Subject: [PATCH 30/42] add apt-get repository to ci --- .circleci/config.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c940cf93f..8098483ba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -20,7 +20,10 @@ jobs: - v1-gradle-dir- - run: name: Install git-lfs for submodules with large files - command: sudo apt-get update && sudo apt-get install -y git-lfs + command: | + echo 'deb http://http.debian.net/debian wheezy-backports main' > /etc/apt/sources.list.d/wheezy-backports-main.list + curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash + sudo apt-get update && sudo apt-get install -y git-lfs - run: name: Downloading dependencies command: ./gradlew allDependencies From 75425b3f24aa6efabed535af54ee4cce7d94e185 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 20:45:14 +0300 Subject: [PATCH 31/42] fix circle ci command to install git-lfs --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8098483ba..5701e3a50 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ jobs: - run: name: Install git-lfs for submodules with large files command: | - echo 'deb http://http.debian.net/debian wheezy-backports main' > /etc/apt/sources.list.d/wheezy-backports-main.list + sudo echo 'deb http://http.debian.net/debian wheezy-backports main' > /etc/apt/sources.list.d/wheezy-backports-main.list curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get update && sudo apt-get install -y git-lfs - run: From aa7b67c804239b8ec9c437cca3fa7130a442ef50 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 21:07:42 +0300 Subject: [PATCH 32/42] fixed circle ci sources.list update --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5701e3a50..0e936f7bb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ jobs: - run: name: Install git-lfs for submodules with large files command: | - sudo echo 'deb http://http.debian.net/debian wheezy-backports main' > /etc/apt/sources.list.d/wheezy-backports-main.list + sudo sh -c 'echo \'deb http://http.debian.net/debian wheezy-backports main\' >> /etc/apt/sources.list' curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get update && sudo apt-get install -y git-lfs - run: From 81ecd2f27550fc2423827eb5e3d455725c286bcc Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 21:13:52 +0300 Subject: [PATCH 33/42] fixed quotes in ci command --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0e936f7bb..1f6a48b6f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ jobs: - run: name: Install git-lfs for submodules with large files command: | - sudo sh -c 'echo \'deb http://http.debian.net/debian wheezy-backports main\' >> /etc/apt/sources.list' + sudo sh -c "echo 'deb http://http.debian.net/debian wheezy-backports main' >> /etc/apt/sources.list" curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get update && sudo apt-get install -y git-lfs - run: From 85257f6c7b660e51a61543e2b4f4715a4538d851 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 21:20:12 +0300 Subject: [PATCH 34/42] added trusted --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1f6a48b6f..3358f7f36 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ jobs: - run: name: Install git-lfs for submodules with large files command: | - sudo sh -c "echo 'deb http://http.debian.net/debian wheezy-backports main' >> /etc/apt/sources.list" + sudo sh -c "echo 'deb [trusted=yes] http://http.debian.net/debian wheezy-backports main' >> /etc/apt/sources.list" curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get update && sudo apt-get install -y git-lfs - run: From 495665a0a36e41281573992f8a79a5f8f742bb23 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Tue, 21 May 2019 21:24:59 +0300 Subject: [PATCH 35/42] ci: updated apt-get repo to latest --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3358f7f36..ee523c98d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,7 +21,7 @@ jobs: - run: name: Install git-lfs for submodules with large files command: | - sudo sh -c "echo 'deb [trusted=yes] http://http.debian.net/debian wheezy-backports main' >> /etc/apt/sources.list" + sudo sh -c "echo 'deb http://ftp.debian.org/debian stretch-backports main' >> /etc/apt/sources.list" curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get update && sudo apt-get install -y git-lfs - run: From 3eb2c3012f4bc46003ae489e96a51bd3f9cf1d9b Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 22 May 2019 15:29:43 +0300 Subject: [PATCH 36/42] ci: trying ssh url --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 0b4451122..ddb5af60a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = https://github.com/harmony-dev/bls-key-pairs [submodule "test/src/test/resources/eth2.0-spec-tests"] path = test/src/test/resources/eth2.0-spec-tests - url = https://github.com/ethereum/eth2.0-spec-tests.git + url = git@github.com:ethereum/eth2.0-spec-tests.git From a699cdd7fe128b913d192941350e8e46685ec0bf Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 22 May 2019 16:10:56 +0300 Subject: [PATCH 37/42] Revert "ci: trying ssh url" This reverts commit 3eb2c301 --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index ddb5af60a..0b4451122 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = https://github.com/harmony-dev/bls-key-pairs [submodule "test/src/test/resources/eth2.0-spec-tests"] path = test/src/test/resources/eth2.0-spec-tests - url = git@github.com:ethereum/eth2.0-spec-tests.git + url = https://github.com/ethereum/eth2.0-spec-tests.git From 0f22fbb53c811823086571e129f5bb1f5c276c9e Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 22 May 2019 20:52:52 +0300 Subject: [PATCH 38/42] empty commit From c91495f81e69e7bff6f30773802a63554e9dda39 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 22 May 2019 20:55:19 +0300 Subject: [PATCH 39/42] test: add javadoc --- test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java b/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java index f60cac755..6786ff7ae 100644 --- a/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/ShuffleTests.java @@ -11,6 +11,7 @@ import java.nio.file.Paths; import java.util.List; +/** Committee shuffle test */ public class ShuffleTests extends TestUtils { private String TESTS_DIR = "shuffling"; private String TESTS_SUBDIR = "core"; From 834f925fa53e9b0a9753edf6e84ade3598ad2f84 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 22 May 2019 20:59:52 +0300 Subject: [PATCH 40/42] empty commit From 3d1d07abb02da9630ed5346b5f8039a66be7ca62 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 22 May 2019 21:11:02 +0300 Subject: [PATCH 41/42] empty commit From ae0afcb945ddfeb42a5d0c0c57c5a103bb2d3652 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Wed, 22 May 2019 21:19:02 +0300 Subject: [PATCH 42/42] test: ignore lines updated --- test/src/test/java/org/ethereum/beacon/test/BlsTests.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/test/java/org/ethereum/beacon/test/BlsTests.java b/test/src/test/java/org/ethereum/beacon/test/BlsTests.java index 9b12280b9..1ec480566 100644 --- a/test/src/test/java/org/ethereum/beacon/test/BlsTests.java +++ b/test/src/test/java/org/ethereum/beacon/test/BlsTests.java @@ -51,7 +51,7 @@ public void testBlsMessageHash() { } @Test - @Ignore("Fixtures should be updated with sha256 as hasher instead of keccak256") + @Ignore("Fixtures should be updated with sha256 as hash function instead of keccak256") public void testBlsMessageHashCompressed() { Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "msg_hash_g2_compressed", "g2_compressed.yaml"); @@ -95,7 +95,7 @@ public void testBlsPrivateToPublic() { } @Test - @Ignore("Fixtures should be updated with sha256 as hasher instead of keccak256") + @Ignore("Fixtures should be updated with sha256 as hash function instead of keccak256") public void testBlsSignMessage() { Path testFilePath = Paths.get(PATH_TO_TESTS, TESTS_DIR, "sign_msg", "sign_msg.yaml"); BlsSignMessageTest test =