diff --git a/src/main/antlr/EVMBLexer.g4 b/src/main/antlr/EVMBLexer.g4 index e6bf9cd17..ab31fbf8b 100644 --- a/src/main/antlr/EVMBLexer.g4 +++ b/src/main/antlr/EVMBLexer.g4 @@ -269,129 +269,129 @@ PUSH1 ; PUSH2 - : 'PUSH2' Head Hexs Hexs + : 'PUSH2' Head Hexs ; PUSH3 - : 'PUSH3' Head Hexs Hexs Hexs + : 'PUSH3' Head Hexs ; PUSH4 - : 'PUSH4' Head Hexs Hexs Hexs Hexs + : 'PUSH4' Head Hexs ; PUSH5 - : 'PUSH5' Head Hexs Hexs Hexs Hexs Hexs + : 'PUSH5' Head Hexs ; PUSH6 - : 'PUSH6' Head Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH6' Head Hexs ; PUSH7 - : 'PUSH7' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH7' Head Hexs ; PUSH8 - : 'PUSH8' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH8' Head Hexs ; PUSH9 - : 'PUSH9' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH9' Head Hexs ; PUSH10 - : 'PUSH10' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH10' Head Hexs ; PUSH11 - : 'PUSH11' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH11' Head Hexs ; PUSH12 - : 'PUSH12' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH12' Head Hexs ; PUSH13 - : 'PUSH13' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH13' Head Hexs ; PUSH14 - : 'PUSH14' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH14' Head Hexs ; PUSH15 - : 'PUSH15' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH15' Head Hexs ; PUSH16 - : 'PUSH16' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH16' Head Hexs ; PUSH17 - : 'PUSH17' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH17' Head Hexs ; PUSH18 - : 'PUSH18' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH18' Head Hexs ; PUSH19 - : 'PUSH19' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH19' Head Hexs ; PUSH20 - : 'PUSH20' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH20' Head Hexs ; PUSH21 - : 'PUSH21' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH21' Head Hexs ; PUSH22 - : 'PUSH22' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH22' Head Hexs ; PUSH23 - : 'PUSH23' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH23' Head Hexs ; PUSH24 - : 'PUSH24' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH24' Head Hexs ; PUSH25 - : 'PUSH25' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH25' Head Hexs ; PUSH26 - : 'PUSH26' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH26' Head Hexs ; PUSH27 - : 'PUSH27' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH27' Head Hexs ; PUSH28 - : 'PUSH28' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH28' Head Hexs ; - + PUSH29 - : 'PUSH29' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH29' Head Hexs ; PUSH30 - : 'PUSH30' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH30' Head Hexs ; PUSH31 - : 'PUSH31' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH31' Head Hexs ; PUSH32 - : 'PUSH32' Head Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs Hexs + : 'PUSH32' Head Hexs ; - + DUP1 : 'DUP1' ; @@ -653,10 +653,9 @@ fragment Hex ; fragment Hexs - : Hex Hex + : Hex+ ; WS : [ \n\t\r] -> skip ; - diff --git a/src/main/java/it/unipr/frontend/EVMFrontend.java b/src/main/java/it/unipr/frontend/EVMFrontend.java index 5931015a6..faa3b4562 100644 --- a/src/main/java/it/unipr/frontend/EVMFrontend.java +++ b/src/main/java/it/unipr/frontend/EVMFrontend.java @@ -34,14 +34,14 @@ public class EVMFrontend { /** * TODO: Refactor these strings and understand if they are still needed. */ - private static String FROM_0417_TO_058 = "a165627a7a72305820"; - private static String FROM_0417_TO_058_EXPERIMENTAL = "a265627a7a72305820"; - private static String FROM_059_TO_0511 = "a265627a7a72305820"; - private static String FROM_059_TO_0511_EXPERIMENTAL = "a365627a7a72305820"; - private static String FROM_0512_TO_0515 = "a265627a7a72315820"; - private static String FROM_0512_TO_0515_EXPERIMENTAL = "a365627a7a72315820"; - private static String FROM_060_TO_061 = "a264697066735822"; - private static String FROM_062_TO_LATEST = "a264697066735822"; + // private static String FROM_0417_TO_058 = "a165627a7a72305820"; + // private static String FROM_0417_TO_058_EXPERIMENTAL = "a265627a7a72305820"; + // private static String FROM_059_TO_0511 = "a265627a7a72305820"; + // private static String FROM_059_TO_0511_EXPERIMENTAL = "a365627a7a72305820"; + // private static String FROM_0512_TO_0515 = "a265627a7a72315820"; + // private static String FROM_0512_TO_0515_EXPERIMENTAL = "a365627a7a72315820"; + // private static String FROM_060_TO_061 = "a264697066735822"; + // private static String FROM_062_TO_LATEST = "a264697066735822"; /** * Verifies the syntactic correctness of the smart contract bytecode stored @@ -95,50 +95,55 @@ public static boolean parseContractFromEtherscan(String address, String output) for (int i = 2; i < bytecode.length(); i += 2) { - if (bytecode.substring(i, (i + 18)).equals(FROM_0417_TO_058) - || bytecode.substring(i, (i + 18)).equals(FROM_0417_TO_058_EXPERIMENTAL) - || bytecode.substring(i, (i + 18)).equals(FROM_059_TO_0511) - || bytecode.substring(i, (i + 18)).equals(FROM_059_TO_0511_EXPERIMENTAL) - || bytecode.substring(i, (i + 18)).equals(FROM_0512_TO_0515) - || bytecode.substring(i, (i + 18)).equals(FROM_0512_TO_0515_EXPERIMENTAL) - || bytecode.substring(i, (i + 16)).equals(FROM_060_TO_061) - || bytecode.substring(i, (i + 16)).equals(FROM_062_TO_LATEST)) { - - writer.close(); - return true; - } + // if (bytecode.substring(i, (i + 18)).equals(FROM_0417_TO_058) + // || bytecode.substring(i, (i + 18)).equals(FROM_0417_TO_058_EXPERIMENTAL) + // || bytecode.substring(i, (i + 18)).equals(FROM_059_TO_0511) + // || bytecode.substring(i, (i + 18)).equals(FROM_059_TO_0511_EXPERIMENTAL) + // || bytecode.substring(i, (i + 18)).equals(FROM_0512_TO_0515) + // || bytecode.substring(i, (i + 18)).equals(FROM_0512_TO_0515_EXPERIMENTAL) + // || bytecode.substring(i, (i + 16)).equals(FROM_060_TO_061) + // || bytecode.substring(i, (i + 16)).equals(FROM_062_TO_LATEST)) { + // + // writer.close(); + // return true; + // } String opcode = bytecode.substring(i, i + 2); int t = pushTest(opcode); if (t != 0) { - String push = bytecode.substring(i + 2, (i + 2 + 2 * t)); - - for (int j = i + 2; j < (i + 2 + 2 * t); j += 2) { - - if (bytecode.substring(j, (j + 18)).equals(FROM_0417_TO_058) - || bytecode.substring(j, (j + 18)).equals(FROM_0417_TO_058_EXPERIMENTAL) - || bytecode.substring(j, (j + 18)).equals(FROM_059_TO_0511) - || bytecode.substring(j, (j + 18)).equals(FROM_059_TO_0511_EXPERIMENTAL) - || bytecode.substring(j, (j + 18)).equals(FROM_0512_TO_0515) - || bytecode.substring(j, (j + 18)).equals(FROM_0512_TO_0515_EXPERIMENTAL) - || bytecode.substring(j, (j + 16)).equals(FROM_060_TO_061) - || bytecode.substring(j, (j + 16)).equals(FROM_062_TO_LATEST)) { - - writer.close(); - return true; - } - } + String push; + int offset = (i + 2 + 2 * t); + if (offset > bytecode.length()) { + push = bytecode.substring(i + 2); + } else + push = bytecode.substring(i + 2, (i + 2 + 2 * t)); + + // for (int j = i + 2; j < (i + 2 + 2 * t); j += 2) { + // + // if (bytecode.substring(j, (j + 18)).equals(FROM_0417_TO_058) + // || bytecode.substring(j, (j + 18)).equals(FROM_0417_TO_058_EXPERIMENTAL) + // || bytecode.substring(j, (j + 18)).equals(FROM_059_TO_0511) + // || bytecode.substring(j, (j + 18)).equals(FROM_059_TO_0511_EXPERIMENTAL) + // || bytecode.substring(j, (j + 18)).equals(FROM_0512_TO_0515) + // || bytecode.substring(j, (j + 18)).equals(FROM_0512_TO_0515_EXPERIMENTAL) + // || bytecode.substring(j, (j + 16)).equals(FROM_060_TO_061) + // || bytecode.substring(j, (j + 16)).equals(FROM_062_TO_LATEST)) { + // + // writer.close(); + // return true; + // } + // } addPush(push, t, writer); i += 2 * t; } else { - addOpcode(opcode, writer); + addOpcode(opcode, writer); } - } + } writer.close(); @@ -367,7 +372,9 @@ private static void addOpcode(String opcode, Writer writer) throws IOException { break; case "49": case "4f": - writer.write("INVALID\n"); + writer.write("" + + "" + + "\n"); break; case "50": writer.write("POP\n"); @@ -545,14 +552,13 @@ private static void addOpcode(String opcode, Writer writer) throws IOException { break; case "fe": writer.write("INVALID\n"); - break; case "ff": writer.write("SELFDESTRUCT\n"); break; default: writer.write("'" + opcode + "'" + "(Unknown Opcode)\n"); break; - } + } } private static int pushTest(String opcode) { @@ -697,4 +703,4 @@ private static boolean errorInResponse(String content) { return false; } } -} +} \ No newline at end of file diff --git a/src/test/java/it/unipr/analysis/cron/EVMBytecodeTest.java b/src/test/java/it/unipr/analysis/cron/EVMBytecodeTest.java index 04dff0538..44b606d25 100644 --- a/src/test/java/it/unipr/analysis/cron/EVMBytecodeTest.java +++ b/src/test/java/it/unipr/analysis/cron/EVMBytecodeTest.java @@ -43,14 +43,14 @@ public class EVMBytecodeTest extends EVMBytecodeAnalysisExecutor { private final static boolean APPEND = true; // Regenerates the smart contracts source code in the case - private final static boolean REGENERATE = false; + private final static boolean REGENERATE = true; // Path private final String STATISTICS_FULLPATH = ACTUAL_RESULTS_DIR + "/statistics.csv"; private final String STATISTICSZEROJUMP_FULLPATH = ACTUAL_RESULTS_DIR + "/statisticsZeroJumps.csv"; private final String FAILURE_FULLPATH = ACTUAL_RESULTS_DIR + "/failure.csv"; private final String LOGS_FULLPATH = ACTUAL_RESULTS_DIR + "/logs.txt"; - private final String SMARTCONTRACTS_FULLPATH = "benchmark/ethersolve-comparison.txt"; + private final String SMARTCONTRACTS_FULLPATH = "benchmark/new-bench100.txt"; // Statistics private int numberOfAPIEtherscanRequest = 0; @@ -59,12 +59,12 @@ public class EVMBytecodeTest extends EVMBytecodeAnalysisExecutor { private final int CORES = Runtime.getRuntime().availableProcessors(); private long startOfExecutionTime = 0; - @Test public void testSCFromEtherscan() throws Exception { String SC_ADDRESS = "0xD4Abd907Bfead0825FE21631A4dC5B99C6fA8875"; toFileStatistics(newAnalysis(SC_ADDRESS).toString()); } + @Test public void testEVMBytecodeAnalysisMultiThread() throws Exception { clean(); startOfExecutionTime = System.currentTimeMillis();