From 99de446490ade8de5965ede625cc75055cc7424d Mon Sep 17 00:00:00 2001 From: BeidouZ Date: Thu, 15 Nov 2018 19:43:03 -0500 Subject: [PATCH 01/24] add CfgFork --- .../org/aion/zero/impl/config/CfgAion.java | 19 +++++++++ modBoot/resource/mainnet/fork.properties | 1 + modBoot/resource/mastery/fork.properties | 1 + modMcf/src/org/aion/mcf/config/Cfg.java | 9 +++++ modMcf/src/org/aion/mcf/config/CfgFork.java | 40 +++++++++++++++++++ .../test/org/aion/mcf/config/CfgForkTest.java | 39 ++++++++++++++++++ 6 files changed, 109 insertions(+) create mode 100644 modBoot/resource/mainnet/fork.properties create mode 100644 modBoot/resource/mastery/fork.properties create mode 100644 modMcf/src/org/aion/mcf/config/CfgFork.java create mode 100644 modMcf/test/org/aion/mcf/config/CfgForkTest.java diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index 68e8c28f23..3c61c96afc 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import java.util.UUID; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; @@ -39,6 +40,7 @@ import org.aion.mcf.config.Cfg; import org.aion.mcf.config.CfgApi; import org.aion.mcf.config.CfgDb; +import org.aion.mcf.config.CfgFork; import org.aion.mcf.config.CfgGui; import org.aion.mcf.config.CfgLog; import org.aion.mcf.config.CfgNet; @@ -72,6 +74,7 @@ public CfgAion() { this.tx = new CfgTx(); this.reports = new CfgReports(); this.gui = new CfgGui(); + this.fork = new CfgFork(); initializeConfiguration(); } @@ -136,6 +139,22 @@ private void closeFileInputStream(final FileInputStream fis) { } } + public void setForkProperties() { + Properties properties = new Properties(); + FileInputStream fis = null; + try { + fis = new FileInputStream(getBasePath() + CfgFork.FORK_PROPERTIES_PATH); + properties.load(fis); + } catch (IOException e) { + System.out.println( + ""); + System.exit(1); + } finally { + closeFileInputStream(fis); + } + this.getFork().setProperties(properties); + } + public void dbFromXML() { File cfgFile = getInitialConfigFile(); XMLInputFactory input = XMLInputFactory.newInstance(); diff --git a/modBoot/resource/mainnet/fork.properties b/modBoot/resource/mainnet/fork.properties new file mode 100644 index 0000000000..ff36c591f3 --- /dev/null +++ b/modBoot/resource/mainnet/fork.properties @@ -0,0 +1 @@ +fork1=2000000 diff --git a/modBoot/resource/mastery/fork.properties b/modBoot/resource/mastery/fork.properties new file mode 100644 index 0000000000..ff36c591f3 --- /dev/null +++ b/modBoot/resource/mastery/fork.properties @@ -0,0 +1 @@ +fork1=2000000 diff --git a/modMcf/src/org/aion/mcf/config/Cfg.java b/modMcf/src/org/aion/mcf/config/Cfg.java index 93b400ed23..4bc6df8a32 100644 --- a/modMcf/src/org/aion/mcf/config/Cfg.java +++ b/modMcf/src/org/aion/mcf/config/Cfg.java @@ -53,6 +53,8 @@ public abstract class Cfg { protected CfgGui gui; + protected CfgFork fork; + public void setId(final String _id) { this.id = _id; } @@ -117,6 +119,10 @@ public CfgGui getGui() { return this.gui; } + public CfgFork getFork() { + return this.fork; + } + public String[] getNodes() { return this.net.getNodes(); } @@ -201,6 +207,7 @@ protected void initializeConfiguration() { execGenesisFile = baseGenesisFile; updateStoragePaths(); } + setForkProperties(); } /** @@ -428,6 +435,8 @@ public static void skipElement(final XMLStreamReader sr) throws XMLStreamExcepti public abstract void toXML(final String[] args, File file); + public abstract void setForkProperties(); + public abstract void setGenesis(); public abstract AbstractBlock getGenesis(); diff --git a/modMcf/src/org/aion/mcf/config/CfgFork.java b/modMcf/src/org/aion/mcf/config/CfgFork.java new file mode 100644 index 0000000000..016b6ec822 --- /dev/null +++ b/modMcf/src/org/aion/mcf/config/CfgFork.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017-2018 Aion foundation. + * + * This file is part of the aion network project. + * + * The aion network project is free software: you can redistribute it + * and/or modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or any later version. + * + * The aion network project is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the aion network project source files. + * If not, see . + * + * Contributors: + * Aion foundation. + */ +package org.aion.mcf.config; + +import java.util.Properties; + +public class CfgFork { + + public static final String FORK_PROPERTIES_PATH = "/fork.properties"; + + private static Properties forkProperties; + + public void setProperties(Properties properties) { + this.forkProperties = properties; + } + + public String getForkPropertyByNumber(final int forkNum) { + return forkProperties.getProperty("fork" + String.valueOf(forkNum)); + } +} diff --git a/modMcf/test/org/aion/mcf/config/CfgForkTest.java b/modMcf/test/org/aion/mcf/config/CfgForkTest.java new file mode 100644 index 0000000000..f0af130eae --- /dev/null +++ b/modMcf/test/org/aion/mcf/config/CfgForkTest.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017-2018 Aion foundation. + * + * This file is part of the aion network project. + * + * The aion network project is free software: you can redistribute it + * and/or modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or any later version. + * + * The aion network project is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the aion network project source files. + * If not, see . + * + * Contributors: + * Aion foundation. + */ +package org.aion.mcf.config; + +import static junit.framework.TestCase.assertEquals; + +import org.aion.zero.impl.config.CfgAion; +import org.junit.Test; + +public class CfgForkTest { + + @Test + public void getForkPropertyTest() { + CfgAion cfg = CfgAion.inst(); + cfg.setForkProperties(); + String forkProperty = cfg.getFork().getForkPropertyByNumber(1); + assertEquals("2000000", forkProperty); + } +} From 7ed73f0844553043518e3e2b9c1469009b4ca6c0 Mon Sep 17 00:00:00 2001 From: BeidouZ Date: Thu, 15 Nov 2018 19:49:16 -0500 Subject: [PATCH 02/24] add fork cases to getPrecompiledContract --- .../org/aion/precompiled/ContractFactory.java | 77 +++++++++++++------ 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java index 8b0b462a02..30cbf7b23c 100644 --- a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java +++ b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java @@ -25,6 +25,7 @@ import org.aion.base.db.IRepositoryCache; import org.aion.base.type.Address; import org.aion.base.vm.IDataWord; +import org.aion.mcf.config.CfgFork; import org.aion.mcf.core.AccountState; import org.aion.mcf.db.IBlockStoreBase; import org.aion.precompiled.contracts.ATB.TokenBridgeContract; @@ -78,30 +79,60 @@ public IPrecompiledContract getPrecompiledContract( ExecutionContext context, IRepositoryCache> track) { - switch (context.address().toString()) { - case ADDR_TOKEN_BRIDGE: - TokenBridgeContract contract = - new TokenBridgeContract( - context, - track, - Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER), - Address.wrap(ADDR_TOKEN_BRIDGE)); - - if (!context.origin().equals(Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER)) - && !contract.isInitialized()) { + CfgFork cfg = new CfgFork(); + String forkProperty = cfg.getForkPropertyByNumber(1); + boolean firstFork = + (forkProperty != null) && (context.blockNumber() > Long.valueOf(forkProperty)); + + if (firstFork) { + switch (context.address().toString()) { + case ADDR_TOKEN_BRIDGE: + TokenBridgeContract contract = + new TokenBridgeContract( + context, + track, + Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER), + Address.wrap(ADDR_TOKEN_BRIDGE)); + + if (!context.origin().equals(Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER)) + && !contract.isInitialized()) { + return null; + } + + return contract; + case ADDR_ED_VERIFY: + return PC_ED_VERIFY; + case ADDR_BLAKE2B_HASH: + return PC_BLAKE2B_HASH; + case ADDR_TX_HASH: + return new TXHashContract(context); + case ADDR_TOTAL_CURRENCY: + default: return null; - } - - return contract; - case ADDR_ED_VERIFY: - return PC_ED_VERIFY; - case ADDR_BLAKE2B_HASH: - return PC_BLAKE2B_HASH; - case ADDR_TX_HASH: - return new TXHashContract(context); - case ADDR_TOTAL_CURRENCY: - default: - return null; + } + } else { + switch (context.address().toString()) { + case ADDR_TOTAL_CURRENCY: + // return new TotalCurrencyContract(track, context.sender(), + // Address.wrap(OWNER)); + return null; + case ADDR_TOKEN_BRIDGE: + TokenBridgeContract contract = + new TokenBridgeContract( + context, + track, + Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER), + Address.wrap(ADDR_TOKEN_BRIDGE)); + + if (!context.origin().equals(Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER)) + && !contract.isInitialized()) { + return null; + } + + return contract; + default: + return null; + } } } From fc6fc9e58b84aada0c77236ef99ddcfa49703d4e Mon Sep 17 00:00:00 2001 From: BeidouZ Date: Fri, 16 Nov 2018 13:28:30 -0500 Subject: [PATCH 03/24] fix failing tests in modPrecompiled after adding fork-properties --- modMcf/src/org/aion/mcf/config/CfgFork.java | 1 + modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java | 5 +++-- modPrecompiled/test/org/aion/precompiled/TXHashTest.java | 4 +++- .../org/aion/precompiled/contracts/EDVerifyContractTest.java | 4 +++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modMcf/src/org/aion/mcf/config/CfgFork.java b/modMcf/src/org/aion/mcf/config/CfgFork.java index 016b6ec822..b102012912 100644 --- a/modMcf/src/org/aion/mcf/config/CfgFork.java +++ b/modMcf/src/org/aion/mcf/config/CfgFork.java @@ -35,6 +35,7 @@ public void setProperties(Properties properties) { } public String getForkPropertyByNumber(final int forkNum) { + if (forkProperties == null) return null; return forkProperties.getProperty("fork" + String.valueOf(forkNum)); } } diff --git a/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java b/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java index 991295a980..4ed0a0d7c6 100644 --- a/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java +++ b/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java @@ -27,6 +27,7 @@ import org.aion.mcf.vm.types.DataWord; import org.aion.vm.ExecutionContext; import org.aion.vm.IPrecompiledContract; +import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; import org.junit.Before; import org.junit.Test; @@ -48,12 +49,12 @@ public class BenchmarkTest { @Before public void setup() { cf = new ContractFactory(); - + CfgAion.inst().setForkProperties(); txHash = RandomUtils.nextBytes(32); origin = Address.wrap(RandomUtils.nextBytes(32)); caller = origin; blockCoinbase = Address.wrap(RandomUtils.nextBytes(32)); - blockNumber = 1; + blockNumber = 2000001; blockTimestamp = System.currentTimeMillis() / 1000; blockNrgLimit = 5000000; blockDifficulty = new DataWord(0x100000000L); diff --git a/modPrecompiled/test/org/aion/precompiled/TXHashTest.java b/modPrecompiled/test/org/aion/precompiled/TXHashTest.java index a7634665dd..895bff42a0 100644 --- a/modPrecompiled/test/org/aion/precompiled/TXHashTest.java +++ b/modPrecompiled/test/org/aion/precompiled/TXHashTest.java @@ -31,6 +31,7 @@ import org.aion.vm.ExecutionContext; import org.aion.vm.ExecutionResult; import org.aion.vm.IPrecompiledContract; +import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; import org.junit.Before; import org.junit.Test; @@ -44,10 +45,11 @@ public class TXHashTest { @Before public void setUp() { + CfgAion.inst().setForkProperties(); ExecutionContext ctx = new ExecutionContext(txHash, ContractFactory.getTxHashContractAddress(), null, null, null, 0L, null, null, 0, 0, 0, null, - 0L, 0L, 0L, + 2000001L, 0L, 0L, null); tXHashContract = new ContractFactory().getPrecompiledContract(ctx, null); diff --git a/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java b/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java index 011ada4b8a..69504c8efa 100644 --- a/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java +++ b/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java @@ -37,6 +37,7 @@ import org.aion.vm.ExecutionContext; import org.aion.vm.ExecutionResult; import org.aion.vm.IPrecompiledContract; +import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; import org.junit.Before; import org.junit.Test; @@ -49,7 +50,7 @@ public class EDVerifyContractTest { private Address caller = origin; private Address blockCoinbase = Address.wrap(RandomUtils.nextBytes(32)); - private long blockNumber = 1; + private long blockNumber = 2000001; private long blockTimestamp = System.currentTimeMillis() / 1000; private long blockNrgLimit = 5000000; private DataWord blockDifficulty = new DataWord(0x100000000L); @@ -69,6 +70,7 @@ public void setup() { nrgLimit = 20000; callValue = DataWord.ZERO; callData = new byte[0]; + CfgAion.inst().setForkProperties(); } @Test From 0dc8939cce48922071d1a46fa9c31d8e2c2c354a Mon Sep 17 00:00:00 2001 From: BeidouZ Date: Fri, 16 Nov 2018 13:28:30 -0500 Subject: [PATCH 04/24] fix failing tests in modPrecompiled after adding fork-properties --- modAionImpl/test/org/aion/zero/impl/cli/CliTest.java | 8 ++++++++ modMcf/src/org/aion/mcf/config/CfgFork.java | 1 + .../test/org/aion/precompiled/BenchmarkTest.java | 5 +++-- modPrecompiled/test/org/aion/precompiled/TXHashTest.java | 4 +++- .../aion/precompiled/contracts/EDVerifyContractTest.java | 4 +++- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java b/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java index bd284b79ac..958e6a0df8 100644 --- a/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java +++ b/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java @@ -85,6 +85,7 @@ public class CliTest { private static final String configFileName = "config.xml"; private static final String genesisFileName = "genesis.json"; + private static final String forkFileName = "fork.properties"; private static final String dataDirectory = "datadir"; private static final String alternativeDirectory = "random"; @@ -102,6 +103,11 @@ public class CliTest { private static final File mainnetGenesis = new File(MAIN_CONFIG_PATH, genesisFileName); private static final File testnetGenesis = new File(TEST_CONFIG_PATH, genesisFileName); + private static final File fork = new File(TEST_RESOURCE_DIR, forkFileName); + private static final File oldFork = new File(CONFIG_PATH, forkFileName); + private static final File mainnetFork = new File(MAIN_CONFIG_PATH, forkFileName); + private static final File testnetFork = new File(TEST_CONFIG_PATH, forkFileName); + /** @implNote set this to true to enable printing */ private static final boolean verbose = false; @@ -117,6 +123,7 @@ public void setup() { } Cli.copyRecursively(config, mainnetConfig); Cli.copyRecursively(genesis, mainnetGenesis); + Cli.copyRecursively(fork, mainnetFork); } if (BASE_PATH.contains(module) && !testnetConfig.exists()) { @@ -126,6 +133,7 @@ public void setup() { } Cli.copyRecursively(config, mainnetConfig); Cli.copyRecursively(genesis, testnetGenesis); + Cli.copyRecursively(fork, testnetFork); } cfg.resetInternal(); diff --git a/modMcf/src/org/aion/mcf/config/CfgFork.java b/modMcf/src/org/aion/mcf/config/CfgFork.java index 016b6ec822..b102012912 100644 --- a/modMcf/src/org/aion/mcf/config/CfgFork.java +++ b/modMcf/src/org/aion/mcf/config/CfgFork.java @@ -35,6 +35,7 @@ public void setProperties(Properties properties) { } public String getForkPropertyByNumber(final int forkNum) { + if (forkProperties == null) return null; return forkProperties.getProperty("fork" + String.valueOf(forkNum)); } } diff --git a/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java b/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java index 991295a980..4ed0a0d7c6 100644 --- a/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java +++ b/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java @@ -27,6 +27,7 @@ import org.aion.mcf.vm.types.DataWord; import org.aion.vm.ExecutionContext; import org.aion.vm.IPrecompiledContract; +import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; import org.junit.Before; import org.junit.Test; @@ -48,12 +49,12 @@ public class BenchmarkTest { @Before public void setup() { cf = new ContractFactory(); - + CfgAion.inst().setForkProperties(); txHash = RandomUtils.nextBytes(32); origin = Address.wrap(RandomUtils.nextBytes(32)); caller = origin; blockCoinbase = Address.wrap(RandomUtils.nextBytes(32)); - blockNumber = 1; + blockNumber = 2000001; blockTimestamp = System.currentTimeMillis() / 1000; blockNrgLimit = 5000000; blockDifficulty = new DataWord(0x100000000L); diff --git a/modPrecompiled/test/org/aion/precompiled/TXHashTest.java b/modPrecompiled/test/org/aion/precompiled/TXHashTest.java index a7634665dd..895bff42a0 100644 --- a/modPrecompiled/test/org/aion/precompiled/TXHashTest.java +++ b/modPrecompiled/test/org/aion/precompiled/TXHashTest.java @@ -31,6 +31,7 @@ import org.aion.vm.ExecutionContext; import org.aion.vm.ExecutionResult; import org.aion.vm.IPrecompiledContract; +import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; import org.junit.Before; import org.junit.Test; @@ -44,10 +45,11 @@ public class TXHashTest { @Before public void setUp() { + CfgAion.inst().setForkProperties(); ExecutionContext ctx = new ExecutionContext(txHash, ContractFactory.getTxHashContractAddress(), null, null, null, 0L, null, null, 0, 0, 0, null, - 0L, 0L, 0L, + 2000001L, 0L, 0L, null); tXHashContract = new ContractFactory().getPrecompiledContract(ctx, null); diff --git a/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java b/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java index 011ada4b8a..69504c8efa 100644 --- a/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java +++ b/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java @@ -37,6 +37,7 @@ import org.aion.vm.ExecutionContext; import org.aion.vm.ExecutionResult; import org.aion.vm.IPrecompiledContract; +import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; import org.junit.Before; import org.junit.Test; @@ -49,7 +50,7 @@ public class EDVerifyContractTest { private Address caller = origin; private Address blockCoinbase = Address.wrap(RandomUtils.nextBytes(32)); - private long blockNumber = 1; + private long blockNumber = 2000001; private long blockTimestamp = System.currentTimeMillis() / 1000; private long blockNrgLimit = 5000000; private DataWord blockDifficulty = new DataWord(0x100000000L); @@ -69,6 +70,7 @@ public void setup() { nrgLimit = 20000; callValue = DataWord.ZERO; callData = new byte[0]; + CfgAion.inst().setForkProperties(); } @Test From 74aded9121481403a1c3e7ec1a04815d2a9219a1 Mon Sep 17 00:00:00 2001 From: AionJayT Date: Mon, 19 Nov 2018 23:28:48 -0500 Subject: [PATCH 05/24] revise cfgFork class --- .../org/aion/zero/impl/config/CfgAion.java | 22 ++++++++++++++++--- .../test/org/aion/zero/impl/cli/CliTest.java | 8 ++++--- .../aion/gui/model/ConfigManipulatorTest.java | 1 - modMcf/src/org/aion/mcf/config/Cfg.java | 13 ++++++++++- modMcf/src/org/aion/mcf/config/CfgFork.java | 4 +++- .../test/org/aion/mcf/config/CfgForkTest.java | 1 - 6 files changed, 39 insertions(+), 10 deletions(-) diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index 3c61c96afc..bd8449e6d7 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -140,19 +140,35 @@ private void closeFileInputStream(final FileInputStream fis) { } public void setForkProperties() { + setForkProperties("mainnet"); + } + + public void setForkProperties(String networkName) { Properties properties = new Properties(); + + // old kernel doesn't support the fork feature. + if (networkName.equals("config")) { + return; + } + FileInputStream fis = null; try { - fis = new FileInputStream(getBasePath() + CfgFork.FORK_PROPERTIES_PATH); + fis = + new FileInputStream( + System.getProperty("user.dir") + + "/" + + networkName + + "/config" + + CfgFork.FORK_PROPERTIES_PATH); properties.load(fis); + this.getFork().setProperties(properties); } catch (IOException e) { System.out.println( ""); - System.exit(1); + // System.exit(1); } finally { closeFileInputStream(fis); } - this.getFork().setProperties(properties); } public void dbFromXML() { diff --git a/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java b/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java index 958e6a0df8..dbdebdc660 100644 --- a/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java +++ b/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java @@ -28,7 +28,6 @@ import static org.aion.zero.impl.cli.Cli.ReturnType.EXIT; import static org.aion.zero.impl.cli.Cli.ReturnType.RUN; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doReturn; @@ -1166,7 +1165,10 @@ private Object parametersForArgumentCheck() { skippedTasks.add("--db-compact"); parameters.add(new Object[] {input, TaskPriority.REVERT, skippedTasks}); - input = new String[] {"--state", "FULL", "--db-compact", "--dump-state-size", "--dump-state"}; + input = + new String[] { + "--state", "FULL", "--db-compact", "--dump-state-size", "--dump-state" + }; skippedTasks = new HashSet(); skippedTasks.add("--db-compact"); skippedTasks.add("--dump-state-size"); @@ -1194,7 +1196,7 @@ private Object parametersForArgumentCheck() { @Test @Parameters(method = "parametersForArgumentCheck") public void testCheckArguments( - String[] input, TaskPriority expectedPriority, Set expectedTasks) { + String[] input, TaskPriority expectedPriority, Set expectedTasks) { Arguments options = new Arguments(); CommandLine parser = new CommandLine(options); parser.parse(input); diff --git a/modGui/test/org/aion/gui/model/ConfigManipulatorTest.java b/modGui/test/org/aion/gui/model/ConfigManipulatorTest.java index 56564abaf9..0c8b9b6db5 100644 --- a/modGui/test/org/aion/gui/model/ConfigManipulatorTest.java +++ b/modGui/test/org/aion/gui/model/ConfigManipulatorTest.java @@ -51,7 +51,6 @@ public class ConfigManipulatorTest { @Before public void before() { jmxCaller = mock(ConfigManipulator.JmxCaller.class); - ; fileLoaderSaver = mock(ConfigManipulator.FileLoaderSaver.class); cfg = new CfgAion(); kernelLauncher = mock(KernelLauncher.class); diff --git a/modMcf/src/org/aion/mcf/config/Cfg.java b/modMcf/src/org/aion/mcf/config/Cfg.java index 4bc6df8a32..f7d69c2646 100644 --- a/modMcf/src/org/aion/mcf/config/Cfg.java +++ b/modMcf/src/org/aion/mcf/config/Cfg.java @@ -24,6 +24,7 @@ import com.google.common.annotations.VisibleForTesting; import java.io.File; +import java.io.IOException; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.aion.mcf.types.AbstractBlock; @@ -142,6 +143,7 @@ public void setConsensus(CfgConsensus _consensus) { private final String configFileName = "config.xml"; private final String genesisFileName = "genesis.json"; private final String keystoreDirName = "keystore"; + private final String forkFileName = "fork.properties"; // base path private final File INITIAL_PATH = new File(System.getProperty("user.dir")); @@ -153,6 +155,8 @@ public void setConsensus(CfgConsensus _consensus) { // base configuration: old kernel OR using network config private File baseConfigFile = null; private File baseGenesisFile = null; + private File baseForkFile = null; + // can be absolute in config file OR depend on execution path private File logDir = null; @@ -170,6 +174,7 @@ public void setConsensus(CfgConsensus _consensus) { private File execConfigDir = null; private File execConfigFile = null; private File execGenesisFile = null; + private File execForkFile = null; /** Resets internal data containing network and path. */ @VisibleForTesting @@ -177,6 +182,7 @@ public void resetInternal() { networkConfigDir = null; baseConfigFile = null; baseGenesisFile = null; + baseForkFile = null; logDir = null; databaseDir = null; absoluteLogDir = false; @@ -187,6 +193,7 @@ public void resetInternal() { execConfigDir = null; execConfigFile = null; execGenesisFile = null; + execForkFile = null; } /** @@ -207,7 +214,6 @@ protected void initializeConfiguration() { execGenesisFile = baseGenesisFile; updateStoragePaths(); } - setForkProperties(); } /** @@ -221,6 +227,7 @@ private void updateNetworkExecPaths() { networkConfigDir = new File(CONFIG_DIR, network); baseConfigFile = new File(networkConfigDir, configFileName); baseGenesisFile = new File(networkConfigDir, genesisFileName); + baseForkFile = new File(networkConfigDir, forkFileName); if (dataDir == null) { dataDir = INITIAL_PATH; @@ -229,8 +236,10 @@ private void updateNetworkExecPaths() { execConfigDir = new File(execDir, configDirName); execConfigFile = new File(execConfigDir, configFileName); execGenesisFile = new File(execConfigDir, genesisFileName); + execForkFile = new File(execConfigDir, forkFileName); updateStoragePaths(); + setForkProperties(network); } /** Updates the path to the log, database directories. */ @@ -437,6 +446,8 @@ public static void skipElement(final XMLStreamReader sr) throws XMLStreamExcepti public abstract void setForkProperties(); + public abstract void setForkProperties(String network); + public abstract void setGenesis(); public abstract AbstractBlock getGenesis(); diff --git a/modMcf/src/org/aion/mcf/config/CfgFork.java b/modMcf/src/org/aion/mcf/config/CfgFork.java index b102012912..33e02c3ac9 100644 --- a/modMcf/src/org/aion/mcf/config/CfgFork.java +++ b/modMcf/src/org/aion/mcf/config/CfgFork.java @@ -26,12 +26,14 @@ public class CfgFork { + public CfgFork() {} + public static final String FORK_PROPERTIES_PATH = "/fork.properties"; private static Properties forkProperties; public void setProperties(Properties properties) { - this.forkProperties = properties; + forkProperties = properties; } public String getForkPropertyByNumber(final int forkNum) { diff --git a/modMcf/test/org/aion/mcf/config/CfgForkTest.java b/modMcf/test/org/aion/mcf/config/CfgForkTest.java index f0af130eae..4f3602bb02 100644 --- a/modMcf/test/org/aion/mcf/config/CfgForkTest.java +++ b/modMcf/test/org/aion/mcf/config/CfgForkTest.java @@ -32,7 +32,6 @@ public class CfgForkTest { @Test public void getForkPropertyTest() { CfgAion cfg = CfgAion.inst(); - cfg.setForkProperties(); String forkProperty = cfg.getFork().getForkPropertyByNumber(1); assertEquals("2000000", forkProperty); } From d4e0ad18ec3e2493bc33999ec5384f7c849e61ca Mon Sep 17 00:00:00 2001 From: AionJayT Date: Tue, 20 Nov 2018 09:00:13 -0500 Subject: [PATCH 06/24] revise cgfFork implement --- modMcf/src/org/aion/mcf/config/CfgFork.java | 7 +++---- modMcf/test/org/aion/mcf/config/CfgForkTest.java | 2 +- .../src/org/aion/precompiled/ContractFactory.java | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modMcf/src/org/aion/mcf/config/CfgFork.java b/modMcf/src/org/aion/mcf/config/CfgFork.java index 33e02c3ac9..fbca022a83 100644 --- a/modMcf/src/org/aion/mcf/config/CfgFork.java +++ b/modMcf/src/org/aion/mcf/config/CfgFork.java @@ -30,14 +30,13 @@ public CfgFork() {} public static final String FORK_PROPERTIES_PATH = "/fork.properties"; - private static Properties forkProperties; + private static Properties forkProperties = new Properties(); public void setProperties(Properties properties) { forkProperties = properties; } - public String getForkPropertyByNumber(final int forkNum) { - if (forkProperties == null) return null; - return forkProperties.getProperty("fork" + String.valueOf(forkNum)); + public Properties getProperties() { + return forkProperties; } } diff --git a/modMcf/test/org/aion/mcf/config/CfgForkTest.java b/modMcf/test/org/aion/mcf/config/CfgForkTest.java index 4f3602bb02..ce5d7d6107 100644 --- a/modMcf/test/org/aion/mcf/config/CfgForkTest.java +++ b/modMcf/test/org/aion/mcf/config/CfgForkTest.java @@ -32,7 +32,7 @@ public class CfgForkTest { @Test public void getForkPropertyTest() { CfgAion cfg = CfgAion.inst(); - String forkProperty = cfg.getFork().getForkPropertyByNumber(1); + String forkProperty = cfg.getFork().getProperties().getProperty("fork1"); assertEquals("2000000", forkProperty); } } diff --git a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java index 30cbf7b23c..a9204ca6b0 100644 --- a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java +++ b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java @@ -80,7 +80,7 @@ public IPrecompiledContract getPrecompiledContract( IRepositoryCache> track) { CfgFork cfg = new CfgFork(); - String forkProperty = cfg.getForkPropertyByNumber(1); + String forkProperty = cfg.getProperties().getProperty("fork1"); boolean firstFork = (forkProperty != null) && (context.blockNumber() > Long.valueOf(forkProperty)); From 174754963dc6aedadebf521a11b154ad2878d11f Mon Sep 17 00:00:00 2001 From: AionJayT Date: Tue, 20 Nov 2018 11:55:41 -0500 Subject: [PATCH 07/24] revise fork implementation --- .../test/org/aion/zero/impl/AionHubTest.java | 2 - modBoot/resource/custom/fork.properties | 1 + modBoot/resource/mainnet/fork.properties | 2 +- modBoot/resource/mastery/fork.properties | 2 +- .../test/org/aion/mcf/config/CfgForkTest.java | 46 ++++++++++++++++++- .../org/aion/precompiled/ContractFactory.java | 2 +- 6 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 modBoot/resource/custom/fork.properties mode change 100644 => 100755 modBoot/resource/mastery/fork.properties diff --git a/modAionImpl/test/org/aion/zero/impl/AionHubTest.java b/modAionImpl/test/org/aion/zero/impl/AionHubTest.java index ba7091a21d..bd2c296231 100644 --- a/modAionImpl/test/org/aion/zero/impl/AionHubTest.java +++ b/modAionImpl/test/org/aion/zero/impl/AionHubTest.java @@ -40,10 +40,8 @@ import org.aion.zero.types.AionTransaction; import org.junit.After; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; -@Ignore public class AionHubTest { private void checkHubNullity(AionHub hub) { diff --git a/modBoot/resource/custom/fork.properties b/modBoot/resource/custom/fork.properties new file mode 100644 index 0000000000..4e52b895af --- /dev/null +++ b/modBoot/resource/custom/fork.properties @@ -0,0 +1 @@ +fork0.3.2=2000000 diff --git a/modBoot/resource/mainnet/fork.properties b/modBoot/resource/mainnet/fork.properties index ff36c591f3..4e52b895af 100644 --- a/modBoot/resource/mainnet/fork.properties +++ b/modBoot/resource/mainnet/fork.properties @@ -1 +1 @@ -fork1=2000000 +fork0.3.2=2000000 diff --git a/modBoot/resource/mastery/fork.properties b/modBoot/resource/mastery/fork.properties old mode 100644 new mode 100755 index ff36c591f3..4e52b895af --- a/modBoot/resource/mastery/fork.properties +++ b/modBoot/resource/mastery/fork.properties @@ -1 +1 @@ -fork1=2000000 +fork0.3.2=2000000 diff --git a/modMcf/test/org/aion/mcf/config/CfgForkTest.java b/modMcf/test/org/aion/mcf/config/CfgForkTest.java index ce5d7d6107..aafad250d2 100644 --- a/modMcf/test/org/aion/mcf/config/CfgForkTest.java +++ b/modMcf/test/org/aion/mcf/config/CfgForkTest.java @@ -23,16 +23,58 @@ package org.aion.mcf.config; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNull; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import org.aion.zero.impl.config.CfgAion; +import org.junit.After; +import org.junit.Before; import org.junit.Test; public class CfgForkTest { + private CfgAion cfg; + private File forkFile; + + @Before + public void setup() throws IOException { + new File(System.getProperty("user.dir") + "/mainnet/config").mkdirs(); + forkFile = + new File( + System.getProperty("user.dir") + + "/mainnet/config" + + CfgFork.FORK_PROPERTIES_PATH); + forkFile.createNewFile(); + + // Open given file in append mode. + BufferedWriter out = new BufferedWriter( + new FileWriter(forkFile, true)); + out.write("fork0.3.2=2000000"); + out.close(); + + cfg = CfgAion.inst(); + } + + @After + public void teardown() { + forkFile.delete(); + forkFile.getParentFile().delete(); + forkFile.getParentFile().getParentFile().delete(); + } + @Test public void getForkPropertyTest() { - CfgAion cfg = CfgAion.inst(); - String forkProperty = cfg.getFork().getProperties().getProperty("fork1"); + + String forkProperty = cfg.getFork().getProperties().getProperty("fork0.3.2"); assertEquals("2000000", forkProperty); } + + @Test + public void getForkPropertyTest2() { + String forkProperty = cfg.getFork().getProperties().getProperty("fork0.3.1"); + assertNull(forkProperty); + } } diff --git a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java index a9204ca6b0..d8c6292002 100644 --- a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java +++ b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java @@ -80,7 +80,7 @@ public IPrecompiledContract getPrecompiledContract( IRepositoryCache> track) { CfgFork cfg = new CfgFork(); - String forkProperty = cfg.getProperties().getProperty("fork1"); + String forkProperty = cfg.getProperties().getProperty("fork0.3.2"); boolean firstFork = (forkProperty != null) && (context.blockNumber() > Long.valueOf(forkProperty)); From 41da690176de49fdb5bfa7da0607260c1e57a6b6 Mon Sep 17 00:00:00 2001 From: AionJayT Date: Tue, 20 Nov 2018 12:11:52 -0500 Subject: [PATCH 08/24] revise testcase --- .../org/aion/precompiled/ContractFactory.java | 12 +++---- .../org/aion/precompiled/BenchmarkTest.java | 34 ++++++++++++++++-- .../org/aion/precompiled/Blake2bHashTest.java | 36 ++++++++++++++++--- .../test/org/aion/precompiled/TXHashTest.java | 34 ++++++++++++++++-- 4 files changed, 102 insertions(+), 14 deletions(-) diff --git a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java index d8c6292002..8a72ce5ef5 100644 --- a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java +++ b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java @@ -32,6 +32,7 @@ import org.aion.precompiled.contracts.Blake2bHashContract; import org.aion.precompiled.contracts.EDVerifyContract; import org.aion.precompiled.contracts.TXHashContract; +import org.aion.precompiled.contracts.TotalCurrencyContract; import org.aion.vm.ExecutionContext; import org.aion.vm.IContractFactory; import org.aion.vm.IPrecompiledContract; @@ -81,10 +82,10 @@ public IPrecompiledContract getPrecompiledContract( CfgFork cfg = new CfgFork(); String forkProperty = cfg.getProperties().getProperty("fork0.3.2"); - boolean firstFork = - (forkProperty != null) && (context.blockNumber() > Long.valueOf(forkProperty)); + boolean fork_032 = + (forkProperty != null) && (context.blockNumber() >= Long.valueOf(forkProperty)); - if (firstFork) { + if (fork_032) { switch (context.address().toString()) { case ADDR_TOKEN_BRIDGE: TokenBridgeContract contract = @@ -113,9 +114,8 @@ public IPrecompiledContract getPrecompiledContract( } else { switch (context.address().toString()) { case ADDR_TOTAL_CURRENCY: - // return new TotalCurrencyContract(track, context.sender(), - // Address.wrap(OWNER)); - return null; + return new TotalCurrencyContract( + track, context.sender(), Address.wrap(ADDR_OWNER)); case ADDR_TOKEN_BRIDGE: TokenBridgeContract contract = new TokenBridgeContract( diff --git a/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java b/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java index 4ed0a0d7c6..e7641c4a52 100644 --- a/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java +++ b/modPrecompiled/test/org/aion/precompiled/BenchmarkTest.java @@ -23,12 +23,18 @@ package org.aion.precompiled; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import org.aion.base.type.Address; +import org.aion.mcf.config.CfgFork; import org.aion.mcf.vm.types.DataWord; import org.aion.vm.ExecutionContext; import org.aion.vm.IPrecompiledContract; import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -45,11 +51,28 @@ public class BenchmarkTest { private static int WARMUP = 2000; private static int BENCH = 1000000; + private File forkFile; @Before - public void setup() { + public void setup() throws IOException { + + new File(System.getProperty("user.dir") + "/mainnet/config").mkdirs(); + forkFile = + new File( + System.getProperty("user.dir") + + "/mainnet/config" + + CfgFork.FORK_PROPERTIES_PATH); + forkFile.createNewFile(); + + // Open given file in append mode. + BufferedWriter out = new BufferedWriter( + new FileWriter(forkFile, true)); + out.write("fork0.3.2=2000000"); + out.close(); + + cf = new ContractFactory(); - CfgAion.inst().setForkProperties(); + CfgAion.inst(); txHash = RandomUtils.nextBytes(32); origin = Address.wrap(RandomUtils.nextBytes(32)); caller = origin; @@ -69,6 +92,13 @@ public void setup() { flags = 0; } + @After + public void teardown() { + forkFile.delete(); + forkFile.getParentFile().delete(); + forkFile.getParentFile().getParentFile().delete(); + } + @Test public void benchBlack2bHash() { diff --git a/modPrecompiled/test/org/aion/precompiled/Blake2bHashTest.java b/modPrecompiled/test/org/aion/precompiled/Blake2bHashTest.java index 81128cae0c..1bf20b3ca8 100644 --- a/modPrecompiled/test/org/aion/precompiled/Blake2bHashTest.java +++ b/modPrecompiled/test/org/aion/precompiled/Blake2bHashTest.java @@ -24,15 +24,19 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.assertTrue; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.nio.charset.StandardCharsets; import org.aion.base.util.ByteUtil; -import org.aion.crypto.hash.Blake2b; +import org.aion.mcf.config.CfgFork; import org.aion.precompiled.contracts.Blake2bHashContract; import org.aion.vm.AbstractExecutionResult.ResultCode; import org.aion.vm.ExecutionResult; -import org.junit.Assert; +import org.aion.zero.impl.config.CfgAion; +import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -47,10 +51,34 @@ public class Blake2bHashTest { private byte[] bigByteArray = new byte[2*1024*1024]; private byte[] bigByteArray2 = new byte[2*1024*1024+1]; private Blake2bHashContract blake2bHasher; + private File forkFile; @Before - public void setUp() { + public void setUp() throws IOException { blake2bHasher = new Blake2bHashContract(); + + new File(System.getProperty("user.dir") + "/mainnet/config").mkdirs(); + forkFile = + new File( + System.getProperty("user.dir") + + "/mainnet/config" + + CfgFork.FORK_PROPERTIES_PATH); + forkFile.createNewFile(); + + // Open given file in append mode. + BufferedWriter out = new BufferedWriter( + new FileWriter(forkFile, true)); + out.write("fork0.3.2=2000000"); + out.close(); + + CfgAion.inst(); + } + + @After + public void teardown() { + forkFile.delete(); + forkFile.getParentFile().delete(); + forkFile.getParentFile().getParentFile().delete(); } @Test diff --git a/modPrecompiled/test/org/aion/precompiled/TXHashTest.java b/modPrecompiled/test/org/aion/precompiled/TXHashTest.java index 895bff42a0..72d53129eb 100644 --- a/modPrecompiled/test/org/aion/precompiled/TXHashTest.java +++ b/modPrecompiled/test/org/aion/precompiled/TXHashTest.java @@ -26,13 +26,19 @@ import static junit.framework.TestCase.assertEquals; import static org.aion.precompiled.contracts.TXHashContract.COST; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.Arrays; +import org.aion.mcf.config.CfgFork; import org.aion.vm.AbstractExecutionResult.ResultCode; import org.aion.vm.ExecutionContext; import org.aion.vm.ExecutionResult; import org.aion.vm.IPrecompiledContract; import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -41,11 +47,28 @@ public class TXHashTest { private static final long INPUT_NRG = 1000; private IPrecompiledContract tXHashContract; private byte[] txHash = RandomUtils.nextBytes(32); + private File forkFile; + @Before - public void setUp() { - CfgAion.inst().setForkProperties(); + public void setUp() throws IOException { + + new File(System.getProperty("user.dir") + "/mainnet/config").mkdirs(); + forkFile = + new File( + System.getProperty("user.dir") + + "/mainnet/config" + + CfgFork.FORK_PROPERTIES_PATH); + forkFile.createNewFile(); + + // Open given file in append mode. + BufferedWriter out = new BufferedWriter( + new FileWriter(forkFile, true)); + out.write("fork0.3.2=2000000"); + out.close(); + + CfgAion.inst(); ExecutionContext ctx = new ExecutionContext(txHash, ContractFactory.getTxHashContractAddress(), null, null, null, 0L, null, null, 0, 0, 0, null, @@ -55,6 +78,13 @@ public void setUp() { tXHashContract = new ContractFactory().getPrecompiledContract(ctx, null); } + @After + public void teardown() { + forkFile.delete(); + forkFile.getParentFile().delete(); + forkFile.getParentFile().getParentFile().delete(); + } + @Test public void testgetTxHash() { ExecutionResult res = (ExecutionResult) tXHashContract.execute(null, INPUT_NRG); From fe2780bdf85c166751fd1371114ce1ecb46faf42 Mon Sep 17 00:00:00 2001 From: AionJayT Date: Tue, 20 Nov 2018 12:14:06 -0500 Subject: [PATCH 09/24] revise testcase --- .../contracts/EDVerifyContractTest.java | 173 ++++++++++++++---- 1 file changed, 133 insertions(+), 40 deletions(-) diff --git a/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java b/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java index 69504c8efa..972ddb18d5 100644 --- a/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java +++ b/modPrecompiled/test/org/aion/precompiled/contracts/EDVerifyContractTest.java @@ -26,12 +26,17 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertNotNull; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import org.aion.base.type.Address; import org.aion.base.type.IExecutionResult; import org.aion.crypto.ECKey; import org.aion.crypto.ECKeyFac; import org.aion.crypto.HashUtil; import org.aion.crypto.ISignature; +import org.aion.mcf.config.CfgFork; import org.aion.mcf.vm.types.DataWord; import org.aion.precompiled.ContractFactory; import org.aion.vm.ExecutionContext; @@ -39,6 +44,7 @@ import org.aion.vm.IPrecompiledContract; import org.aion.zero.impl.config.CfgAion; import org.apache.commons.lang3.RandomUtils; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.spongycastle.util.encoders.Hex; @@ -64,23 +70,59 @@ public class EDVerifyContractTest { private int kind = ExecutionContext.CREATE; private int flags = 0; + private File forkFile; + @Before - public void setup() { + public void setup() throws IOException { nrgPrice = DataWord.ONE; nrgLimit = 20000; callValue = DataWord.ZERO; callData = new byte[0]; - CfgAion.inst().setForkProperties(); + + new File(System.getProperty("user.dir") + "/mainnet/config").mkdirs(); + forkFile = + new File( + System.getProperty("user.dir") + + "/mainnet/config" + + CfgFork.FORK_PROPERTIES_PATH); + forkFile.createNewFile(); + + // Open given file in append mode. + BufferedWriter out = new BufferedWriter(new FileWriter(forkFile, true)); + out.write("fork0.3.2=2000000"); + out.close(); + + CfgAion.inst(); + } + + @After + public void teardown() { + forkFile.delete(); + forkFile.getParentFile().delete(); + forkFile.getParentFile().getParentFile().delete(); } @Test public void shouldReturnSuccessTestingWith256() { byte[] input = setupInput(); - ExecutionContext ctx = new ExecutionContext(txHash, - ContractFactory.getEdVerifyContractAddress(), origin, caller, nrgPrice, - nrgLimit, callValue, - callData, depth, kind, flags, blockCoinbase, blockNumber, blockTimestamp, blockNrgLimit, - blockDifficulty); + ExecutionContext ctx = + new ExecutionContext( + txHash, + ContractFactory.getEdVerifyContractAddress(), + origin, + caller, + nrgPrice, + nrgLimit, + callValue, + callData, + depth, + kind, + flags, + blockCoinbase, + blockNumber, + blockTimestamp, + blockNrgLimit, + blockDifficulty); IPrecompiledContract contract = new ContractFactory().getPrecompiledContract(ctx, null); assertNotNull(contract); @@ -90,14 +132,27 @@ public void shouldReturnSuccessTestingWith256() { } @Test - public void emptyInputTest(){ + public void emptyInputTest() { byte[] input = new byte[128]; - ExecutionContext ctx = new ExecutionContext(txHash, - ContractFactory.getEdVerifyContractAddress(), origin, caller, nrgPrice, - nrgLimit, callValue, - callData, depth, kind, flags, blockCoinbase, blockNumber, blockTimestamp, blockNrgLimit, - blockDifficulty); + ExecutionContext ctx = + new ExecutionContext( + txHash, + ContractFactory.getEdVerifyContractAddress(), + origin, + caller, + nrgPrice, + nrgLimit, + callValue, + callData, + depth, + kind, + flags, + blockCoinbase, + blockNumber, + blockTimestamp, + blockNrgLimit, + blockDifficulty); IPrecompiledContract contract = new ContractFactory().getPrecompiledContract(ctx, null); assertNotNull(contract); @@ -107,18 +162,31 @@ public void emptyInputTest(){ } @Test - public void incorrectInputTest(){ + public void incorrectInputTest() { byte[] input = setupInput(); - input[22] = (byte)((int)(input[32]) -10); // modify sig - input[33] = (byte)((int)(input[33]) + 4); // modify sig - input[99] = (byte)((int)(input[33]) - 40); // modify sig - - ExecutionContext ctx = new ExecutionContext(txHash, - ContractFactory.getEdVerifyContractAddress(), origin, caller, nrgPrice, - nrgLimit, callValue, - callData, depth, kind, flags, blockCoinbase, blockNumber, blockTimestamp, blockNrgLimit, - blockDifficulty); + input[22] = (byte) ((int) (input[32]) - 10); // modify sig + input[33] = (byte) ((int) (input[33]) + 4); // modify sig + input[99] = (byte) ((int) (input[33]) - 40); // modify sig + + ExecutionContext ctx = + new ExecutionContext( + txHash, + ContractFactory.getEdVerifyContractAddress(), + origin, + caller, + nrgPrice, + nrgLimit, + callValue, + callData, + depth, + kind, + flags, + blockCoinbase, + blockNumber, + blockTimestamp, + blockNrgLimit, + blockDifficulty); IPrecompiledContract contract = new ContractFactory().getPrecompiledContract(ctx, null); assertNotNull(contract); @@ -132,11 +200,24 @@ public void shouldFailIfNotEnoughEnergy() { nrgPrice = DataWord.ONE; byte[] input = setupInput(); - ExecutionContext ctx = new ExecutionContext(txHash, - ContractFactory.getEdVerifyContractAddress(), origin, caller, nrgPrice, - nrgLimit, callValue, - callData, depth, kind, flags, blockCoinbase, blockNumber, blockTimestamp, blockNrgLimit, - blockDifficulty); + ExecutionContext ctx = + new ExecutionContext( + txHash, + ContractFactory.getEdVerifyContractAddress(), + origin, + caller, + nrgPrice, + nrgLimit, + callValue, + callData, + depth, + kind, + flags, + blockCoinbase, + blockNumber, + blockTimestamp, + blockNrgLimit, + blockDifficulty); IPrecompiledContract contract = new ContractFactory().getPrecompiledContract(ctx, null); IExecutionResult result = contract.execute(input, 2999L); @@ -144,15 +225,28 @@ public void shouldFailIfNotEnoughEnergy() { } @Test - public void invalidInputLengthTest(){ + public void invalidInputLengthTest() { byte[] input = new byte[129]; // note the length is 129 input[128] = 0x1; - ExecutionContext ctx = new ExecutionContext(txHash, - ContractFactory.getEdVerifyContractAddress(), origin, caller, nrgPrice, - nrgLimit, callValue, - callData, depth, kind, flags, blockCoinbase, blockNumber, blockTimestamp, blockNrgLimit, - blockDifficulty); + ExecutionContext ctx = + new ExecutionContext( + txHash, + ContractFactory.getEdVerifyContractAddress(), + origin, + caller, + nrgPrice, + nrgLimit, + callValue, + callData, + depth, + kind, + flags, + blockCoinbase, + blockNumber, + blockTimestamp, + blockNrgLimit, + blockDifficulty); IPrecompiledContract contract = new ContractFactory().getPrecompiledContract(ctx, null); IExecutionResult result = contract.execute(input, 21000L); @@ -160,11 +254,13 @@ public void invalidInputLengthTest(){ assertThat(result.getCode()).isEqualTo(ExecutionResult.ResultCode.FAILURE.toInt()); } - private byte[] setupInput(){ + private byte[] setupInput() { ECKeyFac.setType(ECKeyFac.ECKeyType.ED25519); ECKey ecKey = ECKeyFac.inst().create(); - ecKey = ecKey.fromPrivate(Hex.decode( - "5a90d8e67da5d1dfbf17916ae83bae04ef334f53ce8763932eba2c1116a62426fff4317ae351bda5e4fa24352904a9366d3a89e38d1ffa51498ba9acfbc65724")); + ecKey = + ecKey.fromPrivate( + Hex.decode( + "5a90d8e67da5d1dfbf17916ae83bae04ef334f53ce8763932eba2c1116a62426fff4317ae351bda5e4fa24352904a9366d3a89e38d1ffa51498ba9acfbc65724")); byte[] pubKey = ecKey.getPubKey(); @@ -182,7 +278,4 @@ private byte[] setupInput(){ return input; } - } - - From 36a39c7285717ddf603ca744157bede2e895c19a Mon Sep 17 00:00:00 2001 From: AionJayT Date: Tue, 20 Nov 2018 13:45:23 -0500 Subject: [PATCH 10/24] update forkNumber --- modBoot/resource/custom/fork.properties | 2 +- modBoot/resource/mainnet/fork.properties | 2 +- modBoot/resource/mastery/fork.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modBoot/resource/custom/fork.properties b/modBoot/resource/custom/fork.properties index 4e52b895af..133c4462f3 100644 --- a/modBoot/resource/custom/fork.properties +++ b/modBoot/resource/custom/fork.properties @@ -1 +1 @@ -fork0.3.2=2000000 +fork0.3.2=1132000 diff --git a/modBoot/resource/mainnet/fork.properties b/modBoot/resource/mainnet/fork.properties index 4e52b895af..9bb58f3172 100644 --- a/modBoot/resource/mainnet/fork.properties +++ b/modBoot/resource/mainnet/fork.properties @@ -1 +1 @@ -fork0.3.2=2000000 +fork0.3.2=1902000 diff --git a/modBoot/resource/mastery/fork.properties b/modBoot/resource/mastery/fork.properties index 4e52b895af..133c4462f3 100755 --- a/modBoot/resource/mastery/fork.properties +++ b/modBoot/resource/mastery/fork.properties @@ -1 +1 @@ -fork0.3.2=2000000 +fork0.3.2=1132000 From 756b0c00d3025c4694f2196f9eba28961fa3dfdb Mon Sep 17 00:00:00 2001 From: AionJayT Date: Tue, 20 Nov 2018 13:54:46 -0500 Subject: [PATCH 11/24] print fork info --- .../src/org/aion/zero/impl/config/CfgAion.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index bd8449e6d7..e2fc518fc6 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -161,11 +161,24 @@ public void setForkProperties(String networkName) { + "/config" + CfgFork.FORK_PROPERTIES_PATH); properties.load(fis); + + properties.forEach( + (k, v) -> { + System.out.println( + ""); - // System.exit(1); + ", no protocol been updated."); + } finally { closeFileInputStream(fis); } From e0e7adf013b6dfb9cd1d4c3c7b2e3109a947325e Mon Sep 17 00:00:00 2001 From: AionJayT Date: Tue, 20 Nov 2018 18:32:17 -0500 Subject: [PATCH 12/24] fix pack --- .../src/org/aion/zero/impl/config/CfgAion.java | 10 ---------- modBoot/src/org/aion/Aion.java | 13 +++++++++++++ script/prepack.sh | 3 +++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index e2fc518fc6..60e2680101 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -162,16 +162,6 @@ public void setForkProperties(String networkName) { + CfgFork.FORK_PROPERTIES_PATH); properties.load(fis); - properties.forEach( - (k, v) -> { - System.out.println( - " { + System.out.println( + " Date: Tue, 20 Nov 2018 23:25:08 -0500 Subject: [PATCH 13/24] fix fork default settings logic in Cli and CfgAion --- .../src/org/aion/zero/impl/cli/Cli.java | 58 ++++++++++++------- .../org/aion/zero/impl/config/CfgAion.java | 26 ++++++--- modBoot/src/org/aion/Aion.java | 33 ++++++----- modMcf/src/org/aion/mcf/config/Cfg.java | 23 +++++++- 4 files changed, 96 insertions(+), 44 deletions(-) diff --git a/modAionImpl/src/org/aion/zero/impl/cli/Cli.java b/modAionImpl/src/org/aion/zero/impl/cli/Cli.java index a7b3b85855..1686942874 100644 --- a/modAionImpl/src/org/aion/zero/impl/cli/Cli.java +++ b/modAionImpl/src/org/aion/zero/impl/cli/Cli.java @@ -36,7 +36,11 @@ import java.io.File; import java.io.IOException; import java.io.InputStreamReader; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.aion.base.util.Hex; import org.aion.crypto.ECKey; import org.aion.crypto.ECKeyFac; @@ -170,6 +174,15 @@ public ReturnType call(final String[] args, Cfg cfg) { cfg.setReadConfigFiles(configFile, cfg.getExecGenesisFile()); } + // reading from correct fork file + File forkFile = cfg.getExecForkFile(); + if (forkFile == null || !forkFile.exists()) { + forkFile = cfg.getInitialForkFile(); + } + + if (forkFile != null && forkFile.exists()) { + cfg.setForkProperties(cfg.getNetwork(), forkFile); + } // true means the UUID must be set boolean overwrite = cfg.fromXML(configFile); @@ -564,6 +577,13 @@ private void makeDirs(File startConfigFile, Cfg cfg) { } } + // copy fork file + initial = cfg.getInitialForkFile(); + target = cfg.getExecForkFile(); + if (!initial.equals(target)) { + copyRecursively(initial, target); + } + // create target log directory file = cfg.getLogDir(); if (!file.exists()) { @@ -759,9 +779,10 @@ private void checkArguments(Arguments options) { if (skippedTasks.isEmpty()) { return; } - String errorMessage = String.format( - "Given arguments require incompatible tasks. Skipped arguments: %s.", - String.join(", ", skippedTasks)); + String errorMessage = + String.format( + "Given arguments require incompatible tasks. Skipped arguments: %s.", + String.join(", ", skippedTasks)); System.out.println(errorMessage); } @@ -838,56 +859,53 @@ Set getSkippedTasks(Arguments options, TaskPriority breakingTaskPriority skippedTasks.add("--config"); } } - if (breakingTaskPriority.compareTo(TaskPriority.INFO) < 0 - && options.isInfo()) { + if (breakingTaskPriority.compareTo(TaskPriority.INFO) < 0 && options.isInfo()) { skippedTasks.add("--info"); } if (breakingTaskPriority.compareTo(TaskPriority.CREATE_ACCOUNT) < 0 - && options.isCreateAccount()) { + && options.isCreateAccount()) { skippedTasks.add("--account create"); } if (breakingTaskPriority.compareTo(TaskPriority.LIST_ACCOUNTS) < 0 - && options.isListAccounts()) { + && options.isListAccounts()) { skippedTasks.add("--account list"); } if (breakingTaskPriority.compareTo(TaskPriority.EXPORT_ACCOUNT) < 0 - && options.getExportAccount() != null) { + && options.getExportAccount() != null) { skippedTasks.add("--account export"); } if (breakingTaskPriority.compareTo(TaskPriority.IMPORT_ACCOUNT) < 0 - && options.getImportAccount() != null) { + && options.getImportAccount() != null) { skippedTasks.add("--account import"); } - if (breakingTaskPriority.compareTo(TaskPriority.SSL) < 0 - && options.getSsl() != null) { + if (breakingTaskPriority.compareTo(TaskPriority.SSL) < 0 && options.getSsl() != null) { skippedTasks.add("-s create"); } if (breakingTaskPriority.compareTo(TaskPriority.PRUNE_BLOCKS) < 0 - && options.isRebuildBlockInfo()) { + && options.isRebuildBlockInfo()) { skippedTasks.add("--prune-blocks"); } if (breakingTaskPriority.compareTo(TaskPriority.REVERT) < 0 - && options.getRevertToBlock() != null) { + && options.getRevertToBlock() != null) { skippedTasks.add("--revert"); } if (breakingTaskPriority.compareTo(TaskPriority.PRUNE_STATE) < 0 - && options.getPruneStateOption() != null) { + && options.getPruneStateOption() != null) { skippedTasks.add("--state"); } if (breakingTaskPriority.compareTo(TaskPriority.DUMP_STATE_SIZE) < 0 - && options.getDumpStateSizeCount() != null) { + && options.getDumpStateSizeCount() != null) { skippedTasks.add("--dump-state-size"); } if (breakingTaskPriority.compareTo(TaskPriority.DUMP_STATE) < 0 - && options.getDumpStateCount() != null) { + && options.getDumpStateCount() != null) { skippedTasks.add("--dump-state"); } if (breakingTaskPriority.compareTo(TaskPriority.DUMP_BLOCKS) < 0 - && options.getDumpBlocksCount() != null) { + && options.getDumpBlocksCount() != null) { skippedTasks.add("--dump-blocks"); } - if (breakingTaskPriority.compareTo(TaskPriority.DB_COMPACT) < 0 - && options.isDbCompact()) { + if (breakingTaskPriority.compareTo(TaskPriority.DB_COMPACT) < 0 && options.isDbCompact()) { skippedTasks.add("--db-compact"); } return skippedTasks; diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index 60e2680101..00de226b1a 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -140,10 +140,10 @@ private void closeFileInputStream(final FileInputStream fis) { } public void setForkProperties() { - setForkProperties("mainnet"); + setForkProperties("mainnet", null); } - public void setForkProperties(String networkName) { + public void setForkProperties(String networkName, File forkFile) { Properties properties = new Properties(); // old kernel doesn't support the fork feature. @@ -153,13 +153,17 @@ public void setForkProperties(String networkName) { FileInputStream fis = null; try { - fis = - new FileInputStream( - System.getProperty("user.dir") - + "/" - + networkName - + "/config" - + CfgFork.FORK_PROPERTIES_PATH); + if (forkFile == null) { + fis = + new FileInputStream( + System.getProperty("user.dir") + + "/" + + networkName + + "/config" + + CfgFork.FORK_PROPERTIES_PATH); + } else { + fis = new FileInputStream(forkFile); + } properties.load(fis); this.getFork().setProperties(properties); @@ -174,6 +178,10 @@ public void setForkProperties(String networkName) { } } + public void setForkProperties(String networkName) { + setForkProperties(networkName, null); + } + public void dbFromXML() { File cfgFile = getInitialConfigFile(); XMLInputFactory input = XMLInputFactory.newInstance(); diff --git a/modBoot/src/org/aion/Aion.java b/modBoot/src/org/aion/Aion.java index 697c2c3d4a..a0e1205b9a 100644 --- a/modBoot/src/org/aion/Aion.java +++ b/modBoot/src/org/aion/Aion.java @@ -99,7 +99,6 @@ public static void main(String args[]) { CfgAion cfg = CfgAion.inst(); - ReturnType ret = new Cli().call(args, cfg); if (ret != ReturnType.RUN) { exit(ret.getValue()); @@ -107,14 +106,14 @@ public static void main(String args[]) { Properties p = cfg.getFork().getProperties(); p.forEach( - (k, v) -> { - System.out.println( - " { + System.out.println( + " Genesis write: " + filePath[4] + + "\n> Fork write: " + + filePath[5] + "\n----------------------------------------------------------------------------" + "\n> Config read: " - + filePath[5] - + "\n> Genesis read: " + filePath[6] + + "\n> Genesis read: " + + filePath[7] + + "\n> Fork read: " + + filePath[8] + "\n----------------------------------------------------------------------------\n\n"; String logo = diff --git a/modMcf/src/org/aion/mcf/config/Cfg.java b/modMcf/src/org/aion/mcf/config/Cfg.java index f7d69c2646..21e66d13db 100644 --- a/modMcf/src/org/aion/mcf/config/Cfg.java +++ b/modMcf/src/org/aion/mcf/config/Cfg.java @@ -239,7 +239,11 @@ private void updateNetworkExecPaths() { execForkFile = new File(execConfigDir, forkFileName); updateStoragePaths(); - setForkProperties(network); + if (execForkFile.exists()) { + setForkProperties(network, execForkFile); + } else if (baseForkFile.exists()) { + setForkProperties(network, baseForkFile); + } } /** Updates the path to the log, database directories. */ @@ -368,6 +372,14 @@ public File getExecGenesisFile() { return execGenesisFile; } + /** Returns the location where the fork file is saved for kernel execution. */ + public File getExecForkFile() { + if (execForkFile == null) { + initializeConfiguration(); + } + return execForkFile; + } + /** @implNote Maintains the old setup if the config file is present in the old location. */ public File getInitialConfigFile() { if (baseConfigFile == null) { @@ -393,6 +405,13 @@ public File getInitialGenesisFile() { return baseGenesisFile; } + public File getInitialForkFile() { + if (baseForkFile == null) { + initializeConfiguration(); + } + return baseForkFile; + } + public static String readValue(final XMLStreamReader sr) throws XMLStreamException { StringBuilder str = new StringBuilder(); readLoop: @@ -451,4 +470,6 @@ public static void skipElement(final XMLStreamReader sr) throws XMLStreamExcepti public abstract void setGenesis(); public abstract AbstractBlock getGenesis(); + + public abstract void setForkProperties(String network, File forkFile); } From 9f7348dddcc8510ab7736a1a6dc5a48bd1cc8b77 Mon Sep 17 00:00:00 2001 From: AionJayT Date: Wed, 21 Nov 2018 12:04:33 -0500 Subject: [PATCH 14/24] refactor fork properties settings by review comments --- .../org/aion/zero/impl/config/CfgAion.java | 22 +++++++------------ .../test/org/aion/zero/impl/AionHubTest.java | 2 ++ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index 00de226b1a..da6f240a8a 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -139,6 +139,7 @@ private void closeFileInputStream(final FileInputStream fis) { } } + /** @implNote the default fork settings is looking for the fork config of the mainnet. */ public void setForkProperties() { setForkProperties("mainnet", null); } @@ -151,30 +152,23 @@ public void setForkProperties(String networkName, File forkFile) { return; } - FileInputStream fis = null; - try { - if (forkFile == null) { - fis = - new FileInputStream( + try (FileInputStream fis = + (forkFile == null) + ? new FileInputStream( System.getProperty("user.dir") + "/" + networkName + "/config" - + CfgFork.FORK_PROPERTIES_PATH); - } else { - fis = new FileInputStream(forkFile); - } - properties.load(fis); + + CfgFork.FORK_PROPERTIES_PATH) + : new FileInputStream(forkFile)) { + properties.load(fis); this.getFork().setProperties(properties); - } catch (IOException e) { + } catch (Exception e) { System.out.println( ", no protocol been updated."); - - } finally { - closeFileInputStream(fis); } } diff --git a/modAionImpl/test/org/aion/zero/impl/AionHubTest.java b/modAionImpl/test/org/aion/zero/impl/AionHubTest.java index bd2c296231..ba7091a21d 100644 --- a/modAionImpl/test/org/aion/zero/impl/AionHubTest.java +++ b/modAionImpl/test/org/aion/zero/impl/AionHubTest.java @@ -40,8 +40,10 @@ import org.aion.zero.types.AionTransaction; import org.junit.After; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; +@Ignore public class AionHubTest { private void checkHubNullity(AionHub hub) { From 02f917aa24292dffa06c1c48ff1482935c87dc12 Mon Sep 17 00:00:00 2001 From: AionJayT Date: Wed, 21 Nov 2018 15:22:39 -0500 Subject: [PATCH 15/24] 1.) revise fork logic in cfgAion and test case 2.) refactoring the ContractFactory --- .../org/aion/zero/impl/config/CfgAion.java | 16 ++-- .../test/org/aion/zero/impl/AionHubTest.java | 2 - .../test/org/aion/zero/impl/cli/CliTest.java | 13 +++- modAionImpl/test_resources/fork.properties | 1 + modMcf/src/org/aion/mcf/config/Cfg.java | 5 +- .../org/aion/precompiled/ContractFactory.java | 74 +++++++------------ .../contracts/Blake2bHashTest.java | 2 - 7 files changed, 48 insertions(+), 65 deletions(-) create mode 100644 modAionImpl/test_resources/fork.properties diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index da6f240a8a..ffb0ff682b 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -139,16 +139,16 @@ private void closeFileInputStream(final FileInputStream fis) { } } - /** @implNote the default fork settings is looking for the fork config of the mainnet. */ - public void setForkProperties() { - setForkProperties("mainnet", null); - } +// /** @implNote the default fork settings is looking for the fork config of the mainnet. */ +// public void setForkProperties() { +// setForkProperties("mainnet", null); +// } public void setForkProperties(String networkName, File forkFile) { Properties properties = new Properties(); // old kernel doesn't support the fork feature. - if (networkName.equals("config")) { + if (networkName == null || networkName.equals("config")) { return; } @@ -172,9 +172,9 @@ public void setForkProperties(String networkName, File forkFile) { } } - public void setForkProperties(String networkName) { - setForkProperties(networkName, null); - } +// public void setForkProperties(String networkName) { +// setForkProperties(networkName, null); +// } public void dbFromXML() { File cfgFile = getInitialConfigFile(); diff --git a/modAionImpl/test/org/aion/zero/impl/AionHubTest.java b/modAionImpl/test/org/aion/zero/impl/AionHubTest.java index ba7091a21d..bd2c296231 100644 --- a/modAionImpl/test/org/aion/zero/impl/AionHubTest.java +++ b/modAionImpl/test/org/aion/zero/impl/AionHubTest.java @@ -40,10 +40,8 @@ import org.aion.zero.types.AionTransaction; import org.junit.After; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; -@Ignore public class AionHubTest { private void checkHubNullity(AionHub hub) { diff --git a/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java b/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java index dbdebdc660..e1da5d1577 100644 --- a/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java +++ b/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java @@ -103,7 +103,7 @@ public class CliTest { private static final File testnetGenesis = new File(TEST_CONFIG_PATH, genesisFileName); private static final File fork = new File(TEST_RESOURCE_DIR, forkFileName); - private static final File oldFork = new File(CONFIG_PATH, forkFileName); + private static final File mainnetFork = new File(MAIN_CONFIG_PATH, forkFileName); private static final File testnetFork = new File(TEST_CONFIG_PATH, forkFileName); @@ -130,7 +130,7 @@ public void setup() { if (!TEST_CONFIG_PATH.exists()) { assertThat(TEST_CONFIG_PATH.mkdirs()).isTrue(); } - Cli.copyRecursively(config, mainnetConfig); + Cli.copyRecursively(config, testnetConfig); Cli.copyRecursively(genesis, testnetGenesis); Cli.copyRecursively(fork, testnetFork); } @@ -299,6 +299,8 @@ public void testDirectoryAndNetwork( .isEqualTo(new File(expectedPath, "config" + File.separator + configFileName)); assertThat(cfg.getExecGenesisFile()) .isEqualTo(new File(expectedPath, "config" + File.separator + genesisFileName)); + assertThat(cfg.getExecForkFile()) + .isEqualTo(new File(expectedPath, "config" + File.separator + forkFileName)); assertThat(cfg.getDatabaseDir()).isEqualTo(new File(expectedPath, "database")); assertThat(cfg.getLogDir()).isEqualTo(new File(expectedPath, "log")); assertThat(cfg.getKeystoreDir()).isEqualTo(new File(expectedPath, "keystore")); @@ -321,11 +323,15 @@ private void printPaths(Cfg cfg) { + cfg.getExecConfigFile().getAbsolutePath() + "\n> Genesis write: " + cfg.getExecGenesisFile().getAbsolutePath() + + "\n> Fork write: " + + cfg.getExecForkFile().getAbsolutePath() + "\n----------------------------------------------------------------------------" + "\n> Config read: " + cfg.getInitialConfigFile().getAbsolutePath() + "\n> Genesis read: " + cfg.getInitialGenesisFile().getAbsolutePath() + + "\n> Fork read: " + + cfg.getInitialForkFile().getAbsolutePath() + "\n----------------------------------------------------------------------------\n\n"); } @@ -479,6 +485,8 @@ public void testConfig(String[] input, File expectedFile, String expectedPath) { .isEqualTo(new File(expectedPath, "config" + File.separator + configFileName)); assertThat(cfg.getExecGenesisFile()) .isEqualTo(new File(expectedPath, "config" + File.separator + genesisFileName)); + assertThat(cfg.getExecForkFile()) + .isEqualTo(new File(expectedPath, "config" + File.separator + forkFileName)); assertThat(expectedFile.exists()).isTrue(); assertThat(cfg.fromXML(expectedFile)).isFalse(); @@ -534,6 +542,7 @@ public void testConfig_oldLocation(String[] input, String expectedPath) { Cli.copyRecursively(genesis, oldGenesis); } + assertThat(cli.call(input, cfg)).isEqualTo(EXIT); assertThat(cfg.getBasePath()).isEqualTo(expectedPath); assertThat(cfg.getExecConfigFile()) diff --git a/modAionImpl/test_resources/fork.properties b/modAionImpl/test_resources/fork.properties new file mode 100644 index 0000000000..4a95d14d60 --- /dev/null +++ b/modAionImpl/test_resources/fork.properties @@ -0,0 +1 @@ +fork_0.3.2=2000000 \ No newline at end of file diff --git a/modMcf/src/org/aion/mcf/config/Cfg.java b/modMcf/src/org/aion/mcf/config/Cfg.java index 21e66d13db..f316d1addf 100644 --- a/modMcf/src/org/aion/mcf/config/Cfg.java +++ b/modMcf/src/org/aion/mcf/config/Cfg.java @@ -205,6 +205,7 @@ protected void initializeConfiguration() { baseConfigFile = new File(CONFIG_DIR, configFileName); baseGenesisFile = new File(CONFIG_DIR, genesisFileName); + if (!baseConfigFile.exists() || !baseGenesisFile.exists()) { updateNetworkExecPaths(); } else { @@ -463,10 +464,6 @@ public static void skipElement(final XMLStreamReader sr) throws XMLStreamExcepti public abstract void toXML(final String[] args, File file); - public abstract void setForkProperties(); - - public abstract void setForkProperties(String network); - public abstract void setGenesis(); public abstract AbstractBlock getGenesis(); diff --git a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java index 8a72ce5ef5..ebc791f535 100644 --- a/modPrecompiled/src/org/aion/precompiled/ContractFactory.java +++ b/modPrecompiled/src/org/aion/precompiled/ContractFactory.java @@ -85,54 +85,34 @@ public IPrecompiledContract getPrecompiledContract( boolean fork_032 = (forkProperty != null) && (context.blockNumber() >= Long.valueOf(forkProperty)); - if (fork_032) { - switch (context.address().toString()) { - case ADDR_TOKEN_BRIDGE: - TokenBridgeContract contract = - new TokenBridgeContract( - context, - track, - Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER), - Address.wrap(ADDR_TOKEN_BRIDGE)); - - if (!context.origin().equals(Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER)) - && !contract.isInitialized()) { - return null; - } - - return contract; - case ADDR_ED_VERIFY: - return PC_ED_VERIFY; - case ADDR_BLAKE2B_HASH: - return PC_BLAKE2B_HASH; - case ADDR_TX_HASH: - return new TXHashContract(context); - case ADDR_TOTAL_CURRENCY: - default: - return null; - } - } else { - switch (context.address().toString()) { - case ADDR_TOTAL_CURRENCY: - return new TotalCurrencyContract( - track, context.sender(), Address.wrap(ADDR_OWNER)); - case ADDR_TOKEN_BRIDGE: - TokenBridgeContract contract = - new TokenBridgeContract( - context, - track, - Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER), - Address.wrap(ADDR_TOKEN_BRIDGE)); - - if (!context.origin().equals(Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER)) - && !contract.isInitialized()) { - return null; - } - - return contract; - default: + switch (context.address().toString()) { + case ADDR_TOKEN_BRIDGE: + TokenBridgeContract contract = + new TokenBridgeContract( + context, + track, + Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER), + Address.wrap(ADDR_TOKEN_BRIDGE)); + + if (!context.origin().equals(Address.wrap(ADDR_TOKEN_BRIDGE_INITIAL_OWNER)) + && !contract.isInitialized()) { return null; - } + } + + return contract; + case ADDR_ED_VERIFY: + return fork_032 ? PC_ED_VERIFY : null; + case ADDR_BLAKE2B_HASH: + return fork_032 ? PC_BLAKE2B_HASH : null; + case ADDR_TX_HASH: + return fork_032 ? new TXHashContract(context) : null; + case ADDR_TOTAL_CURRENCY: + return fork_032 + ? null + : new TotalCurrencyContract( + track, context.sender(), Address.wrap(ADDR_OWNER)); + default: + return null; } } diff --git a/modPrecompiled/test/org/aion/precompiled/contracts/Blake2bHashTest.java b/modPrecompiled/test/org/aion/precompiled/contracts/Blake2bHashTest.java index 4df69f6ac8..041f5fbbe7 100644 --- a/modPrecompiled/test/org/aion/precompiled/contracts/Blake2bHashTest.java +++ b/modPrecompiled/test/org/aion/precompiled/contracts/Blake2bHashTest.java @@ -29,10 +29,8 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.nio.charset.StandardCharsets; import org.aion.base.util.ByteUtil; import org.aion.mcf.config.CfgFork; -import org.aion.precompiled.contracts.Blake2bHashContract; import org.aion.vm.AbstractExecutionResult.ResultCode; import org.aion.vm.ExecutionResult; import org.aion.zero.impl.config.CfgAion; From 8d49e96c4fce9aa3bea9b127917056d7fa4b1ed4 Mon Sep 17 00:00:00 2001 From: AionJayT Date: Wed, 21 Nov 2018 16:29:18 -0500 Subject: [PATCH 16/24] fix fork setting overwrite issue --- modAionImpl/src/org/aion/zero/impl/cli/Cli.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modAionImpl/src/org/aion/zero/impl/cli/Cli.java b/modAionImpl/src/org/aion/zero/impl/cli/Cli.java index 1686942874..d478b4b48b 100644 --- a/modAionImpl/src/org/aion/zero/impl/cli/Cli.java +++ b/modAionImpl/src/org/aion/zero/impl/cli/Cli.java @@ -239,7 +239,7 @@ public ReturnType call(final String[] args, Cfg cfg) { } // make directories for kernel execution - makeDirs(configFile, cfg); + makeDirs(configFile, forkFile, cfg); if (overwrite) { // only updating the file in case the user id was not set @@ -548,10 +548,11 @@ private void printInvalidNetwork() { * Creates the directories for persistence of the kernel data. Copies the config and genesis * files from the initial path for the execution directory. * + * @param forkFile * @param cfg the configuration for the runtime kernel environment */ @SuppressWarnings("ResultOfMethodCallIgnored") - private void makeDirs(File startConfigFile, Cfg cfg) { + private void makeDirs(File startConfigFile, File forkFile, Cfg cfg) { File file = cfg.getExecDir(); if (!file.exists()) { file.mkdirs(); @@ -578,7 +579,7 @@ private void makeDirs(File startConfigFile, Cfg cfg) { } // copy fork file - initial = cfg.getInitialForkFile(); + initial = forkFile; target = cfg.getExecForkFile(); if (!initial.equals(target)) { copyRecursively(initial, target); From a752293d30031e9cd7293f6ac19f79ba47d38f74 Mon Sep 17 00:00:00 2001 From: AionJayT Date: Wed, 21 Nov 2018 16:34:59 -0500 Subject: [PATCH 17/24] set default fork# to 0 in the custom network --- modBoot/resource/custom/fork.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modBoot/resource/custom/fork.properties b/modBoot/resource/custom/fork.properties index 133c4462f3..ae96f382e5 100644 --- a/modBoot/resource/custom/fork.properties +++ b/modBoot/resource/custom/fork.properties @@ -1 +1 @@ -fork0.3.2=1132000 +fork0.3.2=0 From a89e939a8f1960534183b2652aba9598d6aee85f Mon Sep 17 00:00:00 2001 From: Alexandra Date: Wed, 21 Nov 2018 16:58:49 -0500 Subject: [PATCH 18/24] introduced migration of old kernel configuration --- modMcf/src/org/aion/mcf/config/Cfg.java | 62 +++++++++++++++++++++---- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/modMcf/src/org/aion/mcf/config/Cfg.java b/modMcf/src/org/aion/mcf/config/Cfg.java index f316d1addf..fefdb3f901 100644 --- a/modMcf/src/org/aion/mcf/config/Cfg.java +++ b/modMcf/src/org/aion/mcf/config/Cfg.java @@ -24,7 +24,6 @@ import com.google.common.annotations.VisibleForTesting; import java.io.File; -import java.io.IOException; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.aion.mcf.types.AbstractBlock; @@ -157,7 +156,6 @@ public void setConsensus(CfgConsensus _consensus) { private File baseGenesisFile = null; private File baseForkFile = null; - // can be absolute in config file OR depend on execution path private File logDir = null; private File databaseDir = null; @@ -205,15 +203,63 @@ protected void initializeConfiguration() { baseConfigFile = new File(CONFIG_DIR, configFileName); baseGenesisFile = new File(CONFIG_DIR, genesisFileName); - if (!baseConfigFile.exists() || !baseGenesisFile.exists()) { updateNetworkExecPaths(); } else { - execDir = INITIAL_PATH; - execConfigDir = CONFIG_DIR; - execConfigFile = baseConfigFile; - execGenesisFile = baseGenesisFile; - updateStoragePaths(); + System.out.println("Migrating to the new configuration style for Aion kernels."); + + // reading the old config to get setup + this.fromXML(baseConfigFile); + + // determine the network from the read config + switch (this.net.getId()) { + case 256: + network = "mainnet"; + break; + case 128: + network = "conquest"; + break; + case 32: + network = "mastery"; + break; + default: + network = "custom"; + break; + } + + // delete old config + try { + baseConfigFile.delete(); + } catch (Exception e) { + System.out.println( + "Unable to delete old configuration file: " + + baseConfigFile.getAbsolutePath() + + ". Please do it manually!"); + } + + // delete old genesis + try { + baseGenesisFile.delete(); + } catch (Exception e) { + System.out.println( + "Unable to delete old genesis file: " + + baseGenesisFile.getAbsolutePath() + + ". Please do it manually!"); + } + + // using absolute path for database + absoluteDatabaseDir = true; + databaseDir = new File(INITIAL_PATH, getDb().getPath()); + + // using absolute path for log + absoluteLogDir = true; + logDir = new File(INITIAL_PATH, getLog().getLogPath()); + + // TODO: keystore + + updateNetworkExecPaths(); + + this.toXML(new String[] {}, baseConfigFile); } } From 21a51b1dc9658b048bbc2a5e652770eda5ca7123 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Wed, 21 Nov 2018 17:45:17 -0500 Subject: [PATCH 19/24] setting the keystore path from the config file --- .../org/aion/zero/impl/config/CfgAion.java | 29 +++++++--- modMcf/src/org/aion/mcf/config/Cfg.java | 54 +++++++++++++++++-- 2 files changed, 72 insertions(+), 11 deletions(-) diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index ffb0ff682b..0b07d5223b 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -65,6 +65,7 @@ public final class CfgAion extends Cfg { public CfgAion() { this.mode = "aion"; this.id = UUID.randomUUID().toString(); + this.keystorePath = null; this.net = new CfgNet(); this.consensus = new CfgConsensusPow(); this.sync = new CfgSync(); @@ -139,10 +140,10 @@ private void closeFileInputStream(final FileInputStream fis) { } } -// /** @implNote the default fork settings is looking for the fork config of the mainnet. */ -// public void setForkProperties() { -// setForkProperties("mainnet", null); -// } + // /** @implNote the default fork settings is looking for the fork config of the mainnet. */ + // public void setForkProperties() { + // setForkProperties("mainnet", null); + // } public void setForkProperties(String networkName, File forkFile) { Properties properties = new Properties(); @@ -172,9 +173,9 @@ public void setForkProperties(String networkName, File forkFile) { } } -// public void setForkProperties(String networkName) { -// setForkProperties(networkName, null); -// } + // public void setForkProperties(String networkName) { + // setForkProperties(networkName, null); + // } public void dbFromXML() { File cfgFile = getInitialConfigFile(); @@ -307,6 +308,13 @@ public boolean fromXML(File cfgFile) { this.setLogDir(log); } + if (keystorePath != null) { + File ks = new File(keystorePath); + if (ks.isAbsolute()) { + this.setKeystoreDir(ks); + } + } + return shouldWriteBackToFile; } @@ -387,6 +395,13 @@ public void toXML(final String[] args, File file) { sw.writeCharacters(this.getId()); sw.writeEndElement(); + if (keystorePath != null) { + sw.writeCharacters("\r\n\t"); + sw.writeStartElement("keystore"); + sw.writeCharacters(keystorePath); + sw.writeEndElement(); + } + sw.writeCharacters(this.getApi().toXML()); sw.writeCharacters(this.getNet().toXML()); sw.writeCharacters(this.getSync().toXML()); diff --git a/modMcf/src/org/aion/mcf/config/Cfg.java b/modMcf/src/org/aion/mcf/config/Cfg.java index fefdb3f901..a6e13d8aa4 100644 --- a/modMcf/src/org/aion/mcf/config/Cfg.java +++ b/modMcf/src/org/aion/mcf/config/Cfg.java @@ -35,6 +35,8 @@ public abstract class Cfg { protected String id; + protected String keystorePath = null; + protected CfgApi api; protected CfgNet net; @@ -159,8 +161,10 @@ public void setConsensus(CfgConsensus _consensus) { // can be absolute in config file OR depend on execution path private File logDir = null; private File databaseDir = null; + private File keystoreDir = null; private boolean absoluteLogDir = false; private boolean absoluteDatabaseDir = false; + private boolean absoluteKeystoreDir = false; // impact execution path private String network = null; @@ -183,8 +187,10 @@ public void resetInternal() { baseForkFile = null; logDir = null; databaseDir = null; + keystoreDir = null; absoluteLogDir = false; absoluteDatabaseDir = false; + absoluteKeystoreDir = false; network = null; dataDir = null; execDir = null; @@ -229,7 +235,12 @@ protected void initializeConfiguration() { // delete old config try { - baseConfigFile.delete(); + if (!baseConfigFile.delete()) { + System.out.println( + "Unable to delete old configuration file: " + + baseConfigFile.getAbsolutePath() + + ". Please do it manually!"); + } } catch (Exception e) { System.out.println( "Unable to delete old configuration file: " @@ -239,7 +250,12 @@ protected void initializeConfiguration() { // delete old genesis try { - baseGenesisFile.delete(); + if (!baseGenesisFile.delete()) { + System.out.println( + "Unable to delete old genesis file: " + + baseGenesisFile.getAbsolutePath() + + ". Please do it manually!"); + } } catch (Exception e) { System.out.println( "Unable to delete old genesis file: " @@ -255,7 +271,10 @@ protected void initializeConfiguration() { absoluteLogDir = true; logDir = new File(INITIAL_PATH, getLog().getLogPath()); - // TODO: keystore + // using absolute path for keystore + absoluteKeystoreDir = true; + keystoreDir = new File(INITIAL_PATH, keystoreDirName); + keystorePath = keystoreDir.getAbsolutePath(); updateNetworkExecPaths(); @@ -305,6 +324,18 @@ private void updateStoragePaths() { } else if (databaseDir == null) { databaseDir = new File(getDb().getPath()); } + if (!absoluteKeystoreDir) { + if (keystorePath != null) { + // absolute paths are set when reading the file + // so this must be a relative path + keystoreDir = new File(execDir, keystorePath); + } else { + // path not set so using defaults + keystoreDir = new File(execDir, keystoreDirName); + } + } else if (keystoreDir == null) { + keystoreDir = new File(keystorePath); + } } /** @@ -391,8 +422,23 @@ public void setDatabaseDir(File _databaseDirectory) { this.absoluteDatabaseDir = true; } + /** + * Used to set an absolute path for the keystore directory. + * + * @param _keystoreDirectory the path to be used for the keystore. + */ + public void setKeystoreDir(File _keystoreDirectory) { + this.keystoreDir = _keystoreDirectory; + this.absoluteKeystoreDir = true; + } + public File getKeystoreDir() { - return new File(getExecDir(), keystoreDirName); + if (keystoreDir == null) { + // was not updated with absolute path + keystoreDir = + new File(getExecDir(), keystorePath != null ? keystorePath : keystoreDirName); + } + return keystoreDir; } /** Returns the configuration directory location for the kernel execution. */ From 454f0db2cf7f409b092c76a05ad08f34d0f640dc Mon Sep 17 00:00:00 2001 From: Yulong Wu Date: Thu, 22 Nov 2018 11:44:10 +0800 Subject: [PATCH 20/24] Update the gitignore to exlucde network data folders --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index 7c03294db2..3905948ef2 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,12 @@ tmp/ # gradle .gradle/** + +# network data +mainnet/ +conquest/ +mastery/ + +# openjdk artifacts +openjdk*.tar.gz +openjfx*.zip From 3dbe09c506c686e282cc0a8c9801ede0c77afdfb Mon Sep 17 00:00:00 2001 From: Yulong Wu Date: Thu, 22 Nov 2018 11:51:01 +0800 Subject: [PATCH 21/24] Move the modBoot/resource to config --- .gitignore | 11 ++++------- {modBoot/resource => config}/conquest/config.xml | 0 {modBoot/resource => config}/conquest/genesis.json | 0 {modBoot/resource => config}/custom/config.xml | 0 {modBoot/resource => config}/custom/fork.properties | 0 {modBoot/resource => config}/custom/genesis.json | 0 {modBoot/resource => config}/mainnet/config.xml | 0 {modBoot/resource => config}/mainnet/fork.properties | 0 {modBoot/resource => config}/mainnet/genesis.json | 0 {modBoot/resource => config}/mastery/config.xml | 0 {modBoot/resource => config}/mastery/fork.properties | 0 {modBoot/resource => config}/mastery/genesis.json | 0 script/prepack.sh | 2 +- 13 files changed, 5 insertions(+), 8 deletions(-) rename {modBoot/resource => config}/conquest/config.xml (100%) rename {modBoot/resource => config}/conquest/genesis.json (100%) rename {modBoot/resource => config}/custom/config.xml (100%) rename {modBoot/resource => config}/custom/fork.properties (100%) rename {modBoot/resource => config}/custom/genesis.json (100%) rename {modBoot/resource => config}/mainnet/config.xml (100%) rename {modBoot/resource => config}/mainnet/fork.properties (100%) rename {modBoot/resource => config}/mainnet/genesis.json (100%) rename {modBoot/resource => config}/mastery/config.xml (100%) rename {modBoot/resource => config}/mastery/fork.properties (100%) rename {modBoot/resource => config}/mastery/genesis.json (100%) diff --git a/.gitignore b/.gitignore index 3905948ef2..1176767e38 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,8 @@ # aion -/config/ -/database/ -/keystore/ /pack/ /reports/ /cache/ /ssl_keystore/ -/log/ /rt/ /web3/ /zmq_keystore/ @@ -63,9 +59,10 @@ tmp/ .gradle/** # network data -mainnet/ -conquest/ -mastery/ +/mainnet/ +/conquest/ +/mastery/ +/custom/ # openjdk artifacts openjdk*.tar.gz diff --git a/modBoot/resource/conquest/config.xml b/config/conquest/config.xml similarity index 100% rename from modBoot/resource/conquest/config.xml rename to config/conquest/config.xml diff --git a/modBoot/resource/conquest/genesis.json b/config/conquest/genesis.json similarity index 100% rename from modBoot/resource/conquest/genesis.json rename to config/conquest/genesis.json diff --git a/modBoot/resource/custom/config.xml b/config/custom/config.xml similarity index 100% rename from modBoot/resource/custom/config.xml rename to config/custom/config.xml diff --git a/modBoot/resource/custom/fork.properties b/config/custom/fork.properties similarity index 100% rename from modBoot/resource/custom/fork.properties rename to config/custom/fork.properties diff --git a/modBoot/resource/custom/genesis.json b/config/custom/genesis.json similarity index 100% rename from modBoot/resource/custom/genesis.json rename to config/custom/genesis.json diff --git a/modBoot/resource/mainnet/config.xml b/config/mainnet/config.xml similarity index 100% rename from modBoot/resource/mainnet/config.xml rename to config/mainnet/config.xml diff --git a/modBoot/resource/mainnet/fork.properties b/config/mainnet/fork.properties similarity index 100% rename from modBoot/resource/mainnet/fork.properties rename to config/mainnet/fork.properties diff --git a/modBoot/resource/mainnet/genesis.json b/config/mainnet/genesis.json similarity index 100% rename from modBoot/resource/mainnet/genesis.json rename to config/mainnet/genesis.json diff --git a/modBoot/resource/mastery/config.xml b/config/mastery/config.xml similarity index 100% rename from modBoot/resource/mastery/config.xml rename to config/mastery/config.xml diff --git a/modBoot/resource/mastery/fork.properties b/config/mastery/fork.properties similarity index 100% rename from modBoot/resource/mastery/fork.properties rename to config/mastery/fork.properties diff --git a/modBoot/resource/mastery/genesis.json b/config/mastery/genesis.json similarity index 100% rename from modBoot/resource/mastery/genesis.json rename to config/mastery/genesis.json diff --git a/script/prepack.sh b/script/prepack.sh index 479176df04..a5f33e6b19 100755 --- a/script/prepack.sh +++ b/script/prepack.sh @@ -49,7 +49,7 @@ fi if [ ! -d "$CONFIG_PATH" ]; then mkdir $CONFIG_PATH mkdir -p "${PACK_PATH}/aion/${DEFAULT_NETWORK}/config" - cp -r ./modBoot/resource/** $CONFIG_PATH + cp -r ./config/** $CONFIG_PATH cp ${CONFIG_PATH}/${DEFAULT_NETWORK}/** "${PACK_PATH}/aion/${DEFAULT_NETWORK}/config" fi From 19e5f8ade35889524c4044f94350b4e79af3d2d4 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Thu, 22 Nov 2018 11:34:56 -0500 Subject: [PATCH 22/24] set the absolute path for db and log to be written back to file --- modMcf/src/org/aion/mcf/config/Cfg.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modMcf/src/org/aion/mcf/config/Cfg.java b/modMcf/src/org/aion/mcf/config/Cfg.java index a6e13d8aa4..2e503d3e13 100644 --- a/modMcf/src/org/aion/mcf/config/Cfg.java +++ b/modMcf/src/org/aion/mcf/config/Cfg.java @@ -266,10 +266,12 @@ protected void initializeConfiguration() { // using absolute path for database absoluteDatabaseDir = true; databaseDir = new File(INITIAL_PATH, getDb().getPath()); + getDb().setPath(databaseDir.getAbsolutePath()); // using absolute path for log absoluteLogDir = true; logDir = new File(INITIAL_PATH, getLog().getLogPath()); + getLog().setLogPath(logDir.getAbsolutePath()); // using absolute path for keystore absoluteKeystoreDir = true; From 74973367f5824c52810d05e46a5b304d3fd6b0d5 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Thu, 22 Nov 2018 12:06:32 -0500 Subject: [PATCH 23/24] updated unit tests for migration of old kernel config --- .../test/org/aion/zero/impl/cli/CliTest.java | 70 +++++++++++++++++-- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java b/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java index e1da5d1577..75600174f4 100644 --- a/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java +++ b/modAionImpl/test/org/aion/zero/impl/cli/CliTest.java @@ -498,15 +498,13 @@ public void testConfig(String[] input, File expectedFile, String expectedPath) { /** Parameters for testing {@link #testConfig_oldLocation(String[], String)}. */ @SuppressWarnings("unused") - private Object parametersWithConfigForOldLocation() { + private Object parametersWithoutMigration() { List parameters = new ArrayList<>(); String[] options = new String[] {"-c", "--config"}; String expected = MAIN_BASE_PATH.getAbsolutePath(); for (String op : options) { - // without parameter - parameters.add(new Object[] {new String[] {op}, BASE_PATH}); // invalid parameter parameters.add(new Object[] {new String[] {op, "invalid"}, expected}); // mainnet as parameter @@ -530,7 +528,7 @@ private Object parametersWithConfigForOldLocation() { * location. */ @Test - @Parameters(method = "parametersWithConfigForOldLocation") + @Parameters(method = "parametersWithoutMigration") public void testConfig_oldLocation(String[] input, String expectedPath) { // ensure config exists on disk at expected location for old kernel if (!oldConfig.exists()) { @@ -542,19 +540,69 @@ public void testConfig_oldLocation(String[] input, String expectedPath) { Cli.copyRecursively(genesis, oldGenesis); } - assertThat(cli.call(input, cfg)).isEqualTo(EXIT); + + // the config used it for mainnet, therefore will use the MAIN_BASE_PATH assertThat(cfg.getBasePath()).isEqualTo(expectedPath); + assertThat(cfg.getExecConfigFile()) .isEqualTo(new File(expectedPath, "config" + File.separator + configFileName)); assertThat(cfg.getExecGenesisFile()) .isEqualTo(new File(expectedPath, "config" + File.separator + genesisFileName)); + // database, keystore & log are absolute and at old location + assertThat(cfg.getDatabaseDir()).isEqualTo(new File(expectedPath, "database")); + assertThat(cfg.getLogDir()).isEqualTo(new File(expectedPath, "log")); + assertThat(cfg.getKeystoreDir()).isEqualTo(new File(expectedPath, "keystore")); + if (verbose) { printPaths(cfg); } } + /** + * Ensures that the { -c, --config } arguments work when using old config + * location. + */ + @Test + @Parameters({"-c", "--config"}) + public void testConfig_withMigration(String option) { + // ensure config exists on disk at expected location for old kernel + if (!oldConfig.exists()) { + File configPath = CONFIG_PATH; + if (!configPath.exists()) { + assertThat(configPath.mkdirs()).isTrue(); + } + cfg.toXML(null, oldConfig); + Cli.copyRecursively(genesis, oldGenesis); + } + + assertThat(cli.call(new String[] {option}, cfg)).isEqualTo(EXIT); + + // the config used it for mainnet, therefore will use the MAIN_BASE_PATH + assertThat(cfg.getBasePath()).isEqualTo(MAIN_BASE_PATH.getAbsolutePath()); + + assertThat(cfg.getInitialConfigFile()).isEqualTo(mainnetConfig); + assertThat(cfg.getInitialGenesisFile()).isEqualTo(mainnetGenesis); + + assertThat(cfg.getExecConfigFile()) + .isEqualTo(new File(MAIN_BASE_PATH, "config" + File.separator + configFileName)); + assertThat(cfg.getExecGenesisFile()) + .isEqualTo(new File(MAIN_BASE_PATH, "config" + File.separator + genesisFileName)); + + // database, keystore & log are absolute and at old location + assertThat(cfg.getDatabaseDir()).isEqualTo(new File(BASE_PATH, "database")); + assertThat(cfg.getLogDir()).isEqualTo(new File(BASE_PATH, "log")); + assertThat(cfg.getKeystoreDir()).isEqualTo(new File(BASE_PATH, "keystore")); + + if (verbose) { + printPaths(cfg); + } + + // cleanup: resetting the mainnet config to original + Cli.copyRecursively(config, mainnetConfig); + } + /** Parameters for testing {@link #testInfo(String[], ReturnType, String)}. */ @SuppressWarnings("unused") private Object parametersWithInfo() { @@ -659,7 +707,7 @@ public void testInfo(String[] input, ReturnType expectedReturn, String expectedP */ @Test @Parameters({"-i", "--info"}) - public void testInfo_oldLocation(String option) { + public void testInfoWithMigration(String option) { // ensure config exists on disk at expected location for old kernel if (!oldConfig.exists()) { File configPath = CONFIG_PATH; @@ -671,7 +719,15 @@ public void testInfo_oldLocation(String option) { } assertThat(cli.call(new String[] {option}, cfg)).isEqualTo(EXIT); - assertThat(cfg.getBasePath()).isEqualTo(BASE_PATH); + assertThat(cfg.getBasePath()).isEqualTo(MAIN_BASE_PATH.getAbsolutePath()); + + // database, keystore & log are absolute and at old location + assertThat(cfg.getDatabaseDir()).isEqualTo(new File(BASE_PATH, "database")); + assertThat(cfg.getLogDir()).isEqualTo(new File(BASE_PATH, "log")); + assertThat(cfg.getKeystoreDir()).isEqualTo(new File(BASE_PATH, "keystore")); + + // cleanup: resetting the mainnet config to original + Cli.copyRecursively(config, mainnetConfig); } /** From 2a19f3ec101b4daa122dac91704fdf7caa0807a9 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Thu, 22 Nov 2018 12:11:32 -0500 Subject: [PATCH 24/24] minor spacking adjustment --- modBoot/src/org/aion/Aion.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modBoot/src/org/aion/Aion.java b/modBoot/src/org/aion/Aion.java index a0e1205b9a..937cf0fdf5 100644 --- a/modBoot/src/org/aion/Aion.java +++ b/modBoot/src/org/aion/Aion.java @@ -191,14 +191,14 @@ public static void main(String args[]) { + filePath[3] + "\n> Genesis write: " + filePath[4] - + "\n> Fork write: " + + "\n> Fork write: " + filePath[5] + "\n----------------------------------------------------------------------------" + "\n> Config read: " + filePath[6] + "\n> Genesis read: " + filePath[7] - + "\n> Fork read: " + + "\n> Fork read: " + filePath[8] + "\n----------------------------------------------------------------------------\n\n";