From 49cab4a3334eeda4c3b8652cf59ae151457c6476 Mon Sep 17 00:00:00 2001 From: dogukan Date: Wed, 8 Nov 2017 23:38:55 +0100 Subject: [PATCH] Added Comments And Tests --- .../PA193_test_parser_SixEleven.java | 37 ++++++----- .../SixElevenBlock.java | 62 +++++++++++++++++-- src/pa193_test_parser_sixeleven/Utils.java | 31 +++++++--- testblk.txt | 4 +- 4 files changed, 104 insertions(+), 30 deletions(-) diff --git a/src/pa193_test_parser_sixeleven/PA193_test_parser_SixEleven.java b/src/pa193_test_parser_sixeleven/PA193_test_parser_SixEleven.java index 650fa38..7891d4c 100644 --- a/src/pa193_test_parser_sixeleven/PA193_test_parser_SixEleven.java +++ b/src/pa193_test_parser_sixeleven/PA193_test_parser_SixEleven.java @@ -8,6 +8,7 @@ import java.io.BufferedReader; +import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; @@ -24,25 +25,29 @@ public class PA193_test_parser_SixEleven { /** * @param args the command line arguments */ - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws IOException { - - Utils util = new Utils(); - //SixElevenBlock s = new SixElevenBlock("f9beb611d700000001000100524c85a744672dd9a3c2e794c5ed473f1d98c6d493801572529bc8c3960000006e318b64ee63ac50723af6ccb324a4a84f1fcd8e25f185a7e527b3568f1daca2c86fd655f0ff0f1e000351520101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704f0ff0f1e0108ffffffff010003d8390e0000004341043d85d6355c84738ca498482525e6ac032a4bce87ec3b4d97104eaa8be708591d5acdfca0fc1d0c940e5a33223bf4b158816ee3492fbc00b2a26ba9ef12b44cbfac00000000"); - //SixElevenBlock s2 = new SixElevenBlock("11beb611d700000001000100524c85a744672dd9a3c2e794c5ed473f1d98c6d493801572529bc8c3960000006e318b64ee63ac50723af6ccb324a4a84f1fcd8e25f185a7e527b3568f1daca2c86fd655f0ff0f1e000351520101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704f0ff0f1e0108ffffffff010003d8390e0000004341043d85d6355c84738ca498482525e6ac032a4bce87ec3b4d97104eaa8be708591d5acdfca0fc1d0394045a33223bf4b158816ee3492fbc00b2a26ba9ef12b44cbfac00000000"); - ArrayList elements = new ArrayList<>(); - - BufferedReader br = new BufferedReader (new FileReader ("testblk.txt")); + ArrayList blocklist = new ArrayList<>(); + File file = new File("testblk.txt"); + if(file.exists() && !file.isDirectory()) // Simple Check If File Is Exists + { + BufferedReader br = new BufferedReader (new FileReader (file)); String line; - while( (line = br.readLine() ) != null) { - elements.add(new SixElevenBlock(line)); - } + while( (line = br.readLine() ) != null) + { + blocklist.add(new SixElevenBlock(line)); + } + util.displayBlock(blocklist); + } - util.displayBlock(elements); - - } - - + else + { + System.out.println("testblk.txt could not find....."); + } + } } +//To produce random inputs, we used: cat /dev/urandom | tr -dc '0-9a-fA-F' | fold -w 446 | head -n 1 +// This produces random data with the same size +// Also we concatenated the date with correct block magic id"f9beb611" diff --git a/src/pa193_test_parser_sixeleven/SixElevenBlock.java b/src/pa193_test_parser_sixeleven/SixElevenBlock.java index 20f3f3f..128bfc8 100644 --- a/src/pa193_test_parser_sixeleven/SixElevenBlock.java +++ b/src/pa193_test_parser_sixeleven/SixElevenBlock.java @@ -68,7 +68,14 @@ public int getHeader_length() { } public void setHeader_length(int header_length) { + + if(header_length == -1) + { + blockvalid = false; + } + this.header_length = header_length; + } public int getVersion() { @@ -76,6 +83,11 @@ public int getVersion() { } public void setVersion(int version) { + if(version == -1) + { + blockvalid = false; + } + this.version = version; } @@ -116,6 +128,10 @@ public int getNonce() { } public void setNonce(int nonce) { + if(nonce == -1) + { + blockvalid = false; + } this.nonce = nonce; } @@ -124,6 +140,10 @@ public int getTransaction_count() { } public void setTransaction_count(int transaction_count) { + if(transaction_count == -1) + { + blockvalid = false; + } this.transaction_count = transaction_count; } @@ -140,6 +160,10 @@ public int getInput_count() { } public void setInput_count(int input_count) { + if(input_count == -1) + { + blockvalid = false; + } this.input_count = input_count; } @@ -164,6 +188,10 @@ public int getvNumber() { } public void setvNumber(int vNumber) { + if(vNumber == -1) + { + blockvalid = false; + } this.vNumber = vNumber; } @@ -172,6 +200,10 @@ public int getScript_length() { } public void setScript_length(int script_length) { + if(script_length == -1) + { + blockvalid = false; + } this.script_length = script_length; } @@ -204,6 +236,10 @@ public double getValue() { } public void setValue(double value) { + if(value == -1) + { + blockvalid = false; + } this.value = value; } @@ -212,6 +248,10 @@ public int getOutput_script_length() { } public void setOutput_script_length(int output_script_length) { + if(output_script_length == -1) + { + blockvalid = false; + } this.output_script_length = output_script_length; } @@ -228,10 +268,14 @@ public int getTransaction_lock_time() { } public void setTransaction_lock_time(int transaction_lock_time) { + if(transaction_lock_time == -1) + { + blockvalid = false; + } this.transaction_lock_time = transaction_lock_time; } - public void Parse_Hex(String hexstring) + public void Parse_Hex(String hexstring) // Actual Parser Method { if(hexValid(hexstring)) @@ -239,7 +283,7 @@ public void Parse_Hex(String hexstring) { System.out.println("Parsing the block..."); setMagic_id(blockhexstring.substring(0, 8)); - setHeader_length(utils.hexToInt(blockhexstring.substring(8, 16))); + setHeader_length(utils.hexToInt(blockhexstring.substring(8, 16))); setVersion(utils.hexToInt(blockhexstring.substring(16, 24))); setPrevious_hash(utils.reverseHex(blockhexstring.substring(24, 24 + 64))); setPrevious_hash(utils.reverseHex(blockhexstring.substring(24, 24 + 64))); @@ -258,9 +302,17 @@ public void Parse_Hex(String hexstring) setRaw_script(utils.reverseHex(blockhexstring.substring(274, 274 + 2))); setSequence_number(utils.reverseHex(blockhexstring.substring(276, 276 + 8))); setNumber_of_outputs(utils.hexToInt(blockhexstring.substring(284, 284 + 2))); - setValue(utils.hexToLong(blockhexstring.substring(286, 286 + 16)) / 100000000); //mili + setValue(utils.hexToLong(blockhexstring.substring(286, 286 + 16)) / 100000000.0); //mili setOutput_script_length(utils.hexToInt(blockhexstring.substring(302, 302 + 2))); - int x = 2*getOutput_script_length(); + int x=0; + if(getOutput_script_length() == -1) + { + setOutput_script("Invalid"); + } + else + { + x = 2 * getOutput_script_length(); + } setOutput_script(utils.reverseHex(blockhexstring.substring(304, 304 + x))); setTransaction_lock_time(utils.hexToInt(blockhexstring.substring(304 + x, 304 + x + 8))); } @@ -269,7 +321,7 @@ public void Parse_Hex(String hexstring) private boolean hexValid(String hexstring) { - String pattern = "f9beb611[0-9a-fA-F]+"; + String pattern = "f9beb611[0-9a-fA-F]+0000"; // Checks if the block is in the correct format // Create a Pattern object Pattern r = Pattern.compile(pattern); // Now create matcher object. diff --git a/src/pa193_test_parser_sixeleven/Utils.java b/src/pa193_test_parser_sixeleven/Utils.java index 8b6afef..79d03d2 100644 --- a/src/pa193_test_parser_sixeleven/Utils.java +++ b/src/pa193_test_parser_sixeleven/Utils.java @@ -6,17 +6,32 @@ public class Utils { -public int hexToInt(String hex){ - return Integer.parseInt(reverseHex(hex), 16); - +public int hexToInt(String hex){ // Converts Hex to Int Value + try + { + return Integer.parseInt(reverseHex(hex), 16); + } + catch(Exception e) + { + System.err.println("Block Format is Invalid"); + return -1; + } } -public long hexToLong(String hex){ +public long hexToLong(String hex){ // Converts Hex to Long Value + try + { return Long.parseLong(reverseHex(hex), 16); + } + catch(Exception e) + { + System.err.println("Block Format is Invalid"); + return -1; + } } -public String reverseHex(String hex) +public String reverseHex(String hex) // Converts Hex Values From Reverse Order { String reverse=""; int i; for(i = hex.length() - 2; i >= 0 ; i -= 2){ @@ -28,7 +43,7 @@ public String reverseHex(String hex) } -public String timestampToDate(String hex){ +public String timestampToDate(String hex){ // Convert Hex Value To TimeStamp long ts = hexToLong(hex); Date date = new Date(ts * 1000); //to convert Unix time to date time SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); @@ -36,7 +51,7 @@ public String timestampToDate(String hex){ } -public void displayBlock(SixElevenBlock block) +public void displayBlock(SixElevenBlock block) // For Only Single { if(block != null) { @@ -69,7 +84,7 @@ public void displayBlock(SixElevenBlock block) } -public void displayBlock(ArrayList blockarray) +public void displayBlock(ArrayList blockarray) // Get List of Blocks and Parse Them { for(SixElevenBlock block:blockarray) { diff --git a/testblk.txt b/testblk.txt index d7feeb0..40f88f9 100644 --- a/testblk.txt +++ b/testblk.txt @@ -1,5 +1,7 @@ f9beb611d700000001000100524c85a744672dd9a3c2e794c5ed473f1d98c6d493801572529bc8c3960000006e318b64ee63ac50723af6ccb324a4a84f1fcd8e25f185a7e527b3568f1daca2c86fd655f0ff0f1e000351520101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704f0ff0f1e0108ffffffff010003d8390e0000004341043d85d6355c84738ca498482525e6ac032a4bce87ec3b4d97104eaa8be708591d5acdfca0fc1d0c940e5a33223bf4b158816ee3492fbc00b2a26ba9ef12b44cbfac00000000 -0c9Ba2cB4DbdDdD5a7EDD3a96615ECfE1eEbbbEEe89758eea1baFeD9b4b46BeDD2dFEB1852fABACd42A99DDE5E35fEEE03E36BA2FE444E7aEEC5F2Ae43DC40E01C14bE02CdFb47B5358fdBf2483CFb10d813c3e39656F7Ed9ABCD7cB572B39F7EDFb9A7b0e0eaE9ecDBf45d32dF83169Df96f3AbC24ABcB32534d99774a636D27CcdcBaEcEFbad62BECb8C0b007dec06a2e64BeC0FB1Dce41ea0376ddFe9Ca7afd018977FE7A038dA5593dE61DA69eCaaed3bb5e5Db4388B1DEce57F1Dd6abD2f9EF7cA34604a988a030431e2bAdDE34a04B2ed7FddCCc03e5C5EEE7bC0d32 +f9beb6114DbdDdD5a7EDD3a96615ECfE1eEbbbEEe89758eea1baFeD9b4b46BeDD2dFEB1852fABACd42A99DDE5E35fEEE03E36BA2FE444E7aEEC5F2Ae43DC40E01C14bE02CdFb47B5358fdBf2483CFb10d813c3e39656F7Ed9ABCD7cB572B39F7EDFb9A7b0e0eaE9ecDBf45d32dF83169Df96f3AbC24ABcB32534d99774a636D27CcdcBaEcEFbad62BECb8C0b007dec06a2e64BeC0FB1Dce41ea0376ddFe9Ca7afd018977FE7A038dA5593dE61DA69eCaaed3bb5e5Db4388B1DEce57F1Dd6abD2f9EF7cA34604a988a030431e2bAdDE34a04B2ed7FddCCc03e5C5EEE7bC0d32 eBffBbAd2d3EfC95a75cA2665Eb42CEF041b9F873Ad78B4A43De170B4070CBde408ab5a29B39b8cb84aC79b1aEFF4a62fcbfEc49f2ebbe83d3A9c8A926F144c20CC9ae86920aa0E43FDD1f4238Bc5F5beD5B6156cFd2a7EbFdF8DdCD7ECb062bA7DF6BbdBE78fD80d8F7B7315ca24AdB5f69e7cEd8f4C7E4BC34d25A3489DFAd2B3a129da4ebeC1E8fD95f061A90d673CBa632B0c692AdEb40b2AcE1a06b5AE73A20285faaCFCF5bAbAF1cbB90dd1CceB89dA2B1C5a1dF70520fBD937a816D59EBB6eC1CE79FCbee23E2A02da7FAE3eeB2E6617511dEF1619ea00A0Ccd5DF3 Ec8D3a7F73b48fafFEeEf3Fe5d09E3De90D35c3aB8fCf4d840eD7F4c8FEbDECdD1e0d0198730eB2E52BB71893CCB92aDaaCdDb3F2ddbd4EbCFCa2e6D97116D0eC3873c1f79436ABd578cAf885D2D0bDcf0e71E7a3fEADc7699264e2D2B3fe3d01Cb58fCD3ECe3FCbAEe12aE21FEBDFabdf9bc6c1BA05b4Efcc5EdDDEC78eb50067dc98363DEeB061715eBA6Bb7dA7cA3cA5A3F986eC7c0CB47E8Fafb5C576F6D3b8c2710E760f2Ab2b2eCAd920aEDf788750Ba2bca6da1E230d66Cba5C2fdb6E359f5d96BBA596A7AA5248e3165bc1FfbEAc4bcdf76E34888B2187f100b037 f9be611AE905e85838Eb0aD35C8BbEaCEFcEa742b9a65F85e2578E88b76A68F6616Bb2A4F5a67bcE74b1b7EBAcEca3FAf62eE7b0FfB9bfeDBC3ebcf380A930Cc2dD56809FA5cDbdFddAf114dEAdb9D7D0eFdc696cf3133DA1EDA58C7E2DbeE4AACFC5f8cdaA8c34B4f1E2C44d5Dcaac9BB02868FBAc4ef0bfd3cb7AF2A31Fb762C306c06FBc299A15f9FdAD227263BFc7117d8E4aC5d8Ae54faEC90f7C30f612801DFB1ADB93f766b735b2Db0ebCab7BDA70eeC1ea252B3A4Be29b7E1518a3ffF3a8CAB44adfcEc0f7869ffD4ad6faACDeaDe9EdB6FF32AaBa54d56687Ce9 +f9beb611d700000001000100558b4ea5d60708270d6b8b11d020fd613a7a96794bbfd2325651d5a606000000039fde6cbb510057ff6056e9e300b7bc9e3aeac3852e8ee5e70acda199872a43f9ebd755b973081d082509490101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704b973081d0106ffffffff0180332f6c01000000434104577ab3294160349317359e7d093fa9a2656a484654a4999d09495b3d12e4df0d1a2aed1dbadd3fc5992a6e5017cdc840e70b4c14afdf9400a141ce01c669ed6aac00000000 +f9beb611d70000000100010006b92f2dc3521b760875436aa4c6154913a335f7f11f59aacb1ed369050000006186241119eff736eaeaa3637c5e60c6cf49e3665ea9e2380c8cf28e3db566cccceed755b973081d2a403c170101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704b973081d0117ffffffff0180332f6c010000004341042b864ea49522dd69bd6225693b38c435d42dffac53a4a68f307e6d952622a6030bd3919a5757957336b4588afb016c750ccf130a297f78fec2feb26d30d68cd9ac00000000