diff --git a/.gitignore b/.gitignore index ed976ac6..3ebd1e1a 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,34 @@ tests/thunder-tests/backup/thunderEnvironment.db .project .settings/org.eclipse.jdt.core.prefs java-rubix-core.iml +pom.xml +.idea/codeStyles/codeStyleConfig.xml +.idea/codeStyles/Project.xml +.idea/compiler.xml +.idea/jarRepositories.xml +.idea/libraries/Maven__com_did_core_did_8_8.xml +.idea/libraries/Maven__com_github_ipfs_java_ipfs_api_v1_3_3.xml +.idea/libraries/Maven__com_github_ipld_java_cid_v1_1_0.xml +.idea/libraries/Maven__com_github_multiformats_java_multiaddr_v1_3_1.xml +.idea/libraries/Maven__com_github_multiformats_java_multibase_v1_1_0.xml +.idea/libraries/Maven__com_github_multiformats_java_multihash_v1_1_0.xml +.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml +.idea/libraries/Maven__commons_codec_commons_codec_1_15.xml +.idea/libraries/Maven__javax_json_javax_json_api_1_0.xml +.idea/libraries/Maven__junit_junit_4_10.xml +.idea/libraries/Maven__log4j_log4j_1_2_17.xml +.idea/libraries/Maven__org_bouncycastle_bcpkix_jdk18on_1_71.xml +.idea/libraries/Maven__org_bouncycastle_bcprov_jdk15to18_1_71.xml +.idea/libraries/Maven__org_bouncycastle_bcprov_jdk18on_1_71.xml +.idea/libraries/Maven__org_bouncycastle_bcutil_jdk18on_1_71.xml +.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml +.idea/libraries/Maven__org_json_json_20220924.xml +.idea/misc.xml +.idea/modules.xml +KATI.iml +.idea/misc.xml +.idea/modules.xml +KATI.iml +.idea/misc.xml +.idea/modules.xml +KATI.iml diff --git a/src/com/rubix/Consensus/InitiatorConsensus.java b/src/com/rubix/Consensus/InitiatorConsensus.java index f661334f..0a839b72 100644 --- a/src/com/rubix/Consensus/InitiatorConsensus.java +++ b/src/com/rubix/Consensus/InitiatorConsensus.java @@ -110,7 +110,7 @@ private static synchronized void quorumSign(String quorumDID, String hash, Strin PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); synchronized (signLock) { try { - if (quorumSignature.length() < (minQuorum(alphaSize) + 2 * minQuorum(7)) + if (quorumSignature.length() < (minQuorum(alphaSize)) && quorumResponse[index] <= minQuorum(quorumSize)) { JSONObject jsonObject = new JSONObject(); JSONObject quorumMemberSign = new JSONObject(); @@ -147,7 +147,7 @@ private static synchronized void nftQuorumSign(String quorumDID, String hash, St PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); synchronized (nftSignLock) { try { - if (nftQuorumSignature.length() < (minQuorum(alphaSize) + 2 * minQuorum(7)) + if (nftQuorumSignature.length() < (minQuorum(alphaSize)) && nftQuorumResponse[index] <= minQuorum(quorumSize)) { JSONObject jsonObject = new JSONObject(); jsonObject.put("did", quorumDID); @@ -290,7 +290,7 @@ public static JSONArray start(String data, IPFS ipfs, int PORT, int index, Strin alphaSize); quorumWithShares.add(quorumPeersObject.getString(j)); while (quorumSignature - .length() < (minQuorum(alphaSize) + 2 * minQuorum(7))) { + .length() < (minQuorum(alphaSize))) { } InitiatorConsensusLogger.debug("sending Qsign of length " + quorumSignature.length() + "at index " + index); @@ -400,7 +400,7 @@ public static JSONArray start(String data, IPFS ipfs, int PORT, int index, Strin alphaSize); nftQuorumWithShares.add(quorumPeersObject.getString(j)); while (nftQuorumSignature - .length() < (minQuorum(alphaSize) + 2 * minQuorum(7))) { + .length() < (minQuorum(alphaSize))) { } InitiatorConsensusLogger.debug("NFT :sending Qsign of length " + nftQuorumSignature.length() + "at index " + index); @@ -429,7 +429,7 @@ public static JSONArray start(String data, IPFS ipfs, int PORT, int index, Strin while ((nftQuorumResponse[index] < minQuorum(quorumSize) || nftQuorumSignature - .length() < (minQuorum(alphaSize) + 2 * minQuorum(7)))) { + .length() < (minQuorum(alphaSize)))) { } } else { @@ -506,7 +506,7 @@ public static JSONArray start(String data, IPFS ipfs, int PORT, int index, Strin quorumSign(didHash, hash, quorumsPrivateShareSign, quorumsPrivateKeySign, index, quorumSize, alphaSize); quorumWithShares.add(quorumPeersObject.getString(j)); while (quorumSignature - .length() < (minQuorum(alphaSize) + 2 * minQuorum(7))) { + .length() < (minQuorum(alphaSize))) { } InitiatorConsensusLogger.debug("sending Qsign of length " + quorumSignature.length() + "at index " + index); @@ -545,7 +545,7 @@ public static JSONArray start(String data, IPFS ipfs, int PORT, int index, Strin } while (quorumResponse[index] < minQuorum(quorumSize) - || quorumSignature.length() < (minQuorum(alphaSize) + 2 * minQuorum(7))) { + || quorumSignature.length() < (minQuorum(alphaSize))) { } repo(ipfs); } catch (JSONException e) { diff --git a/src/com/rubix/Consensus/InitiatorProcedure.java b/src/com/rubix/Consensus/InitiatorProcedure.java index cdbb05f9..2d3c4d09 100644 --- a/src/com/rubix/Consensus/InitiatorProcedure.java +++ b/src/com/rubix/Consensus/InitiatorProcedure.java @@ -25,7 +25,7 @@ public class InitiatorProcedure { public static String essential; public static String senderSignQ; public static JSONObject payload = new JSONObject(); - public static JSONArray alphaReply, betaReply, gammaReply; + public static JSONArray alphaReply; public static Logger InitiatorProcedureLogger = Logger.getLogger(InitiatorProcedure.class); @@ -168,38 +168,20 @@ public static void consensusSetUp( } }); - Thread betaThread = new Thread(() -> { - try { - betaReply = InitiatorConsensus.start(dataSend.toString(), ipfs, PORT + 100, 1, "beta", betaList, - alphaSize, 7, operation); - } catch (JSONException e) { - e.printStackTrace(); - } - }); - Thread gammaThread = new Thread(() -> { - try { - gammaReply = InitiatorConsensus.start(dataSend.toString(), ipfs, PORT + 107, 2, "gamma", gammaList, - alphaSize, 7, operation); - } catch (JSONException e) { - e.printStackTrace(); - } - }); InitiatorConsensus.quorumSignature = new JSONArray(); InitiatorConsensus.finalQuorumSignsArray = new JSONArray(); alphaThread.start(); - betaThread.start(); - gammaThread.start(); if (operation.equals("NFT")) { - while ((InitiatorConsensus.nftQuorumSignature.length() < ((minQuorum(alphaSize) + 2 * minQuorum(7))))) { + while ((InitiatorConsensus.nftQuorumSignature.length() < ((minQuorum(alphaSize))))) { } InitiatorProcedureLogger.debug( "ABG NFT Consensus completed with length for NFT :" + InitiatorConsensus.nftQuorumSignature.length() + " RBT " + InitiatorConsensus.quorumSignature.length()); } else { - while (InitiatorConsensus.quorumSignature.length() < (minQuorum(alphaSize) + 2 * minQuorum(7))) { + while (InitiatorConsensus.quorumSignature.length() < (minQuorum(alphaSize))) { } InitiatorProcedureLogger .debug("ABG Consensus completed with length " + InitiatorConsensus.quorumSignature.length()); diff --git a/src/com/rubix/Ping/PingReceive.java b/src/com/rubix/Ping/PingReceive.java index 43f28818..ef09aaa4 100644 --- a/src/com/rubix/Ping/PingReceive.java +++ b/src/com/rubix/Ping/PingReceive.java @@ -93,8 +93,7 @@ public static String receive(String userType,int port) throws JSONException { PingReceiverLogger.info(userType + " Pong Sent "+currentVersion); } - else - if(pingRequest.contains("Get-TokenChain-Height")) { + else if(pingRequest.contains("Get-TokenChain-Height")) { String tokenHash; try { tokenHash = input.readLine(); @@ -125,9 +124,43 @@ public static String receive(String userType,int port) throws JSONException { height = chainArray.length()-1; PingReceiverLogger.info("Chain height: " + height); } + output.println(height); } } + else if(pingRequest.contains("Get-TokenChain")){ + String tokenHash; + try { + tokenHash = input.readLine(); + } catch (SocketException e) { + PingReceiverLogger.warn("Sender Stream Null - tokenHash"); + APIResponse.put("did", ""); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender Stream Null - tokenHash"); + + output.close(); + input.close(); + sk.close(); + ss.close(); + return APIResponse.toString(); + + } + if (tokenHash != null && tokenHash.startsWith("Qm") && tokenHash.length() == 46) { + JSONArray tokenChain; + PingReceiverLogger.info("Token chain height requested for: " + tokenHash); + File tokenChainFile = new File(TOKENCHAIN_PATH.concat(tokenHash).concat(".json")); + if(!tokenChainFile.exists()) { + PingReceiverLogger.info("Token chain file not found"); + tokenChain = new JSONArray(); + } + else{ + String tokenChainFileContent = readFile(TOKENCHAIN_PATH.concat(tokenHash).concat(".json")); + tokenChain = new JSONArray(tokenChainFileContent); + } + output.println(tokenChain); + } + } else{ APIResponse.put("status", "Failed"); APIResponse.put("message", "Request Failed"); diff --git a/src/com/rubix/Ping/VerifyStakedToken.java b/src/com/rubix/Ping/VerifyStakedToken.java index bd599f54..8939e26c 100644 --- a/src/com/rubix/Ping/VerifyStakedToken.java +++ b/src/com/rubix/Ping/VerifyStakedToken.java @@ -18,6 +18,7 @@ import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -26,8 +27,9 @@ public class VerifyStakedToken { private static final Logger PingSenderLogger = Logger.getLogger(VerifyStakedToken.class); public static IPFS ipfs = new IPFS("/ip4/127.0.0.1/tcp/" + IPFS_PORT); + public static JSONArray tokenChain; - public static boolean Contact(String pid, int port, String tokenHash, String tokenContent) + public static boolean Contact(String pid, int port, String tokenHash, String tokenContent, String pingMessage) throws IOException, JSONException { repo(ipfs); PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); @@ -42,78 +44,123 @@ public static boolean Contact(String pid, int port, String tokenHash, String tok BufferedReader input = new BufferedReader(new InputStreamReader(senderSocket.getInputStream())); PrintStream output = new PrintStream(senderSocket.getOutputStream()); - output.println("Get-TokenChain-Height"); - output.println(tokenHash); - String heightResponse; - try { - heightResponse = input.readLine(); - } catch (SocketException e) { - PingSenderLogger.warn("Quorum " + pid + " is unable to Respond! - Credits Ping"); - executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); - output.close(); - input.close(); - senderSocket.close(); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Quorum " + pid + "is unable to respond! - Credits Ping"); - - return false; - } + output.println(pingMessage); + + if(pingMessage.equals("Get-TokenChain-Height")) { + output.println(tokenHash); + String heightResponse; + try { + heightResponse = input.readLine(); + } catch (SocketException e) { + PingSenderLogger.warn("Quorum " + pid + " is unable to Respond! - Credits Ping"); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); + output.close(); + input.close(); + senderSocket.close(); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Quorum " + pid + "is unable to respond! - Credits Ping"); + + return false; + } - int height = 0; - if (heightResponse == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); - PingSenderLogger.info("TokenChain height not received"); - output.close(); - input.close(); - senderSocket.close(); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "TokenChain height not received"); - - } else { - PingSenderLogger.info("TokenChain height received from " + pid); - PingSenderLogger.info("TokenChain height: " + heightResponse); - executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); - output.close(); - input.close(); - senderSocket.close(); - APIResponse.put("status", "Success"); - APIResponse.put("message", Integer.parseInt(heightResponse)); - height = Integer.parseInt(heightResponse); - } + int height = 0; + if (heightResponse == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); + PingSenderLogger.info("TokenChain height not received"); + output.close(); + input.close(); + senderSocket.close(); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "TokenChain height not received"); + + } else { + PingSenderLogger.info("TokenChain height received from " + pid); + PingSenderLogger.info("TokenChain height: " + heightResponse); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); + output.close(); + input.close(); + senderSocket.close(); + APIResponse.put("status", "Success"); + APIResponse.put("message", Integer.parseInt(heightResponse)); + height = Integer.parseInt(heightResponse); + } - String tokenLevel = tokenContent.substring(0, 3); - int tokenLevelInt = Integer.parseInt(tokenLevel); - int tokenLevelValue = (int) Math.pow(2, tokenLevelInt + 2); - int requiredMinedTokenHeight = tokenLevelValue * 4; - - String GET_URL_credit = SYNC_IP + "/getCurrentLevel"; - URL URLobj_credit = new URL(GET_URL_credit); - HttpURLConnection con_credit = (HttpURLConnection) URLobj_credit.openConnection(); - con_credit.setRequestMethod("GET"); - int responseCode_credit = con_credit.getResponseCode(); - System.out.println("GET Response Code :: " + responseCode_credit); - if (responseCode_credit == HttpURLConnection.HTTP_OK) { - BufferedReader in_credit = new BufferedReader( - new InputStreamReader(con_credit.getInputStream())); - String inputLine_credit; - StringBuffer response_credit = new StringBuffer(); - while ((inputLine_credit = in_credit.readLine()) != null) { - response_credit.append(inputLine_credit); + String tokenLevel = tokenContent.substring(0, 3); + int tokenLevelInt = Integer.parseInt(tokenLevel); + int tokenLevelValue = (int) Math.pow(2, tokenLevelInt + 2); + int requiredMinedTokenHeight = tokenLevelValue * 4; + + String GET_URL_credit = SYNC_IP + "/getCurrentLevel"; + URL URLobj_credit = new URL(GET_URL_credit); + HttpURLConnection con_credit = (HttpURLConnection) URLobj_credit.openConnection(); + con_credit.setRequestMethod("GET"); + int responseCode_credit = con_credit.getResponseCode(); + System.out.println("GET Response Code :: " + responseCode_credit); + if (responseCode_credit == HttpURLConnection.HTTP_OK) { + BufferedReader in_credit = new BufferedReader( + new InputStreamReader(con_credit.getInputStream())); + String inputLine_credit; + StringBuffer response_credit = new StringBuffer(); + while ((inputLine_credit = in_credit.readLine()) != null) { + response_credit.append(inputLine_credit); + } + in_credit.close(); + // QuorumConsensusLogger.debug("response from service " + + // response_credit.toString()); + JSONObject resJsonData_credit = new JSONObject(response_credit.toString()); + int level_credit = resJsonData_credit.getInt("level"); + + // ! release staked token if the mined token is from previous level(s) + if (level_credit > tokenLevelInt) { + return true; + } + + } else + PingSenderLogger.debug("GET request not worked"); + + return height > requiredMinedTokenHeight; + } + else{ + tokenChain = new JSONArray(); + output.println(tokenHash); + String tokenChainResponse; + try { + tokenChainResponse = input.readLine(); + } catch (SocketException e) { + PingSenderLogger.warn("Node " + pid + " is unable to Respond! - Token Chain Ping"); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); + output.close(); + input.close(); + senderSocket.close(); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Node " + pid + "is unable to respond! - Token Chain Ping"); + + return false; } - in_credit.close(); - // QuorumConsensusLogger.debug("response from service " + - // response_credit.toString()); - JSONObject resJsonData_credit = new JSONObject(response_credit.toString()); - int level_credit = resJsonData_credit.getInt("level"); - - // ! release staked token if the mined token is from previous level(s) - if (level_credit > tokenLevelInt) { + + if (tokenChainResponse == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); + PingSenderLogger.info("TokenChain not received"); + output.close(); + input.close(); + senderSocket.close(); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "TokenChain not received"); + return false; + + } else { + tokenChain = new JSONArray(tokenChainResponse); + PingSenderLogger.info("TokenChain received from " + pid); + PingSenderLogger.info("TokenChain: " + tokenChainResponse); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + pid); + output.close(); + input.close(); + senderSocket.close(); + APIResponse.put("status", "Success"); + APIResponse.put("message", "Tokenchain Received"); return true; } + } - } else - PingSenderLogger.debug("GET request not worked"); - - return height > requiredMinedTokenHeight; } } \ No newline at end of file diff --git a/src/com/rubix/Resources/APIHandler.java b/src/com/rubix/Resources/APIHandler.java index 75d7dde6..92804a02 100644 --- a/src/com/rubix/Resources/APIHandler.java +++ b/src/com/rubix/Resources/APIHandler.java @@ -1024,6 +1024,7 @@ public static boolean proofGeneration(List tokenList) throws NoSuchAlgor hashMatchList.add(tokenList.get(0).concat(receiverString)); APILogger.debug("Hashmatch list is "+hashMatchList.toString()); status = Unpledge.generateProof(lastObject.getString("tid"), hashMatchList, tokenList); + return status; }else { APILogger.debug(tokenList.get(0)+"is not found in staked token list"); } diff --git a/src/com/rubix/Resources/Functions.java b/src/com/rubix/Resources/Functions.java index 6dc300f2..4804fb81 100644 --- a/src/com/rubix/Resources/Functions.java +++ b/src/com/rubix/Resources/Functions.java @@ -1237,43 +1237,43 @@ public static void correctPartToken() throws JSONException { } } - public static void tokenBank() throws JSONException { - pathSet(); - String bank = readFile(PAYMENTS_PATH.concat("BNK00.json")); - JSONArray bankArray = new JSONArray(bank); - - ArrayList bankDuplicates = new ArrayList<>(); - for (int i = 0; i < bankArray.length(); i++) { - if (!bankDuplicates.contains(bankArray.getJSONObject(i).getString("tokenHash"))) - bankDuplicates.add(bankArray.getJSONObject(i).getString("tokenHash")); - } - - if (bankDuplicates.size() < bankArray.length()) { - FunctionsLogger.debug("Duplicates Found. Cleaning up ..."); - - JSONArray newBank = new JSONArray(); - for (int i = 0; i < bankDuplicates.size(); i++) { - JSONObject tokenObject = new JSONObject(); - tokenObject.put("tokenHash", bankDuplicates.get(i)); - newBank.put(tokenObject); - } - writeToFile(PAYMENTS_PATH.concat("BNK00.json"), newBank.toString(), false); - } - - File tokensPath = new File(TOKENS_PATH); - String contents[] = tokensPath.list(); - ArrayList tokenFiles = new ArrayList(); - for (int i = 0; i < contents.length; i++) { - if (!contents[i].contains("PARTS")) - tokenFiles.add(contents[i]); - } - - for (int i = 0; i < tokenFiles.size(); i++) { - if (!bankDuplicates.contains(tokenFiles.get(i).toString())) - deleteFile(TOKENS_PATH.concat(tokenFiles.get(i).toString())); - } - - } +// public static void tokenBank() throws JSONException { +// pathSet(); +// String bank = readFile(PAYMENTS_PATH.concat("BNK00.json")); +// JSONArray bankArray = new JSONArray(bank); +// +// ArrayList bankDuplicates = new ArrayList<>(); +// for (int i = 0; i < bankArray.length(); i++) { +// if (!bankDuplicates.contains(bankArray.getJSONObject(i).getString("tokenHash"))) +// bankDuplicates.add(bankArray.getJSONObject(i).getString("tokenHash")); +// } +// +// if (bankDuplicates.size() < bankArray.length()) { +// FunctionsLogger.debug("Duplicates Found. Cleaning up ..."); +// +// JSONArray newBank = new JSONArray(); +// for (int i = 0; i < bankDuplicates.size(); i++) { +// JSONObject tokenObject = new JSONObject(); +// tokenObject.put("tokenHash", bankDuplicates.get(i)); +// newBank.put(tokenObject); +// } +// writeToFile(PAYMENTS_PATH.concat("BNK00.json"), newBank.toString(), false); +// } +// +// File tokensPath = new File(TOKENS_PATH); +// String contents[] = tokensPath.list(); +// ArrayList tokenFiles = new ArrayList(); +// for (int i = 0; i < contents.length; i++) { +// if (!contents[i].contains("PARTS")) +// tokenFiles.add(contents[i]); +// } +// +// for (int i = 0; i < tokenFiles.size(); i++) { +// if (!bankDuplicates.contains(tokenFiles.get(i).toString())) +// deleteFile(TOKENS_PATH.concat(tokenFiles.get(i).toString())); +// } +// +// } public static Double getPartsBalance() throws JSONException { pathSet(); @@ -1553,25 +1553,25 @@ public static void clearParts() throws JSONException { writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), partsArray.toString(), false); } - public static void backgroundChecks() { - try { - Functions.tokenBank(); - } catch (JSONException e) { - e.printStackTrace(); - } - - try { - Functions.clearParts(); - } catch (JSONException e) { - e.printStackTrace(); - } - - IPFS ipfs = new IPFS("/ip4/127.0.0.1/tcp/" + IPFS_PORT); - IPFSNetwork.repo(ipfs); - - addPublicData(); - - } +// public static void backgroundChecks() { +// try { +// Functions.tokenBank(); +// } catch (JSONException e) { +// e.printStackTrace(); +// } +// +// try { +// Functions.clearParts(); +// } catch (JSONException e) { +// e.printStackTrace(); +// } +// +// IPFS ipfs = new IPFS("/ip4/127.0.0.1/tcp/" + IPFS_PORT); +// IPFSNetwork.repo(ipfs); +// +// addPublicData(); +// +// } public static String sanityMessage; diff --git a/src/com/rubix/TokenTransfer/ForkResolution.java b/src/com/rubix/TokenTransfer/ForkResolution.java new file mode 100644 index 00000000..c5742fa0 --- /dev/null +++ b/src/com/rubix/TokenTransfer/ForkResolution.java @@ -0,0 +1,209 @@ +package com.rubix.TokenTransfer; + +import com.rubix.Ping.VerifyStakedToken; +import com.rubix.Resources.IPFSNetwork; +import org.apache.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; + +import static com.rubix.Resources.Functions.*; + +public class ForkResolution { + public static Logger ForkResolutionLogger = Logger.getLogger(ForkResolution.class); + public static String resolutionMessage; + public static ArrayList pinOwnersArrayTransferToken = new ArrayList(); + public static ArrayList pinOwnersArrayPledgedToken = new ArrayList(); + + public static boolean check(JSONObject tokenDetails) throws IOException, InterruptedException, JSONException { + /** + * 1. Check number of pins on the token + * 2. If number of pins < 2 - Pass the token + * 3. Else check if the token has any tokens pledged for it + * 4. If Pledged - Check the number of pins on that token + * 5. Else reject the transfer token + * 6. If number of pins on the pledged token == 1 - Pass the transfer token + * 7. Else Reject the transfer token + * 8. Check if the transfer token is a recently unpledged token + * 9. If it is - Contact the node owning token [Ct] it pledged for and ask for the tokenchain height + * 10.Make sure Ct has genuine pins or match the height of the pledging + */ + + boolean resolution = true; + +// ForkResolutionLogger.debug("Token Details:" + tokenDetails); + + ArrayList previousSender = new ArrayList(); + JSONArray ownersReceived = new JSONArray(); + + JSONArray previousSendersArray = tokenDetails.getJSONArray("previousSendersArray"); + String token = tokenDetails.getString("token"); + JSONArray tokenChain = tokenDetails.getJSONArray("tokenChain"); + + ForkResolutionLogger.debug("Unpledged Token Check: " + token); + boolean tokenOwners = true; + + ForkResolutionLogger.debug("Checking owners for " + token + " Please wait..."); + pinOwnersArrayTransferToken = IPFSNetwork.dhtOwnerCheck(token); + + if (pinOwnersArrayTransferToken.size() > 2) { + ForkResolutionLogger.debug("Multiple pins found"); + for (int j = 0; j < previousSendersArray.length(); j++) { + if (previousSendersArray.getJSONObject(j).getString("token").equals(token)) + ownersReceived = previousSendersArray.getJSONObject(j).getJSONArray("sender"); + } + + for (int j = 0; j < ownersReceived.length(); j++) { + previousSender.add(ownersReceived.getString(j)); + } + + for (int j = 0; j < pinOwnersArrayTransferToken.size(); j++) { + if (!previousSender.contains(pinOwnersArrayTransferToken.get(j).toString())) { + ForkResolutionLogger.debug("Multiple pins of " + pinOwnersArrayTransferToken.get(j).toString() + " not contained in history"); + tokenOwners = false; + }else{ + ForkResolutionLogger.debug("Multiple pins of " + pinOwnersArrayTransferToken.get(j).toString() + " contained in history"); + } + } + } else + ForkResolutionLogger.debug("Token " + token + " has not multiple pins. Passed !!!"); + + + if (!tokenOwners) { + ForkResolutionLogger.debug("Multiple pins found for token " + token + ". Checking for pledged details "); + + JSONObject lastObject = tokenChain.getJSONObject(tokenChain.length() - 1); +// ForkResolutionLogger.debug("Last Object of token " + token + ": " + lastObject); + if (lastObject.has("tokensPledgedWith")) { + if (lastObject.getJSONArray("tokensPledgedWith") != null) { + JSONArray pledgeTokens = lastObject.getJSONArray("tokensPledgedWith"); + for (int i = 0; i < pledgeTokens.length(); i++) { + ForkResolutionLogger.debug("Checking owners for pledgeToken" + pledgeTokens.getString(i) + " Please wait..."); + pinOwnersArrayPledgedToken = IPFSNetwork.dhtOwnerCheck(pledgeTokens.getString(i)); + if (pinOwnersArrayPledgedToken.size() != 1) { + resolution = false; + resolutionMessage = "Pledge token has more than one owner"; + } else { + ForkResolutionLogger.debug("Pledged Token " + pledgeTokens.getString(i) + " has not multiple pins. Passed !!!"); + return true; + } + } + } + } else { + resolution = false; + resolutionMessage = "Transfer token has more owner and no token pledged for"; + } + } + + return resolution; + + } + + public static boolean verifyUnpledgedToken(String transferToken, String pledgedToken) throws IOException, InterruptedException, JSONException { + ForkResolutionLogger.debug("Pledged Token Check: " + transferToken); + + ArrayList pinListTransferToken = IPFSNetwork.dhtOwnerCheck(transferToken); + if(pinListTransferToken.size() > 2) { + ForkResolutionLogger.debug("Transfer token " + transferToken + " has multiple pins. Checking pledged details"); + ArrayList pinListPledgeToken = IPFSNetwork.dhtOwnerCheck(pledgedToken); + if (pinListPledgeToken.size() > 1) { + ForkResolutionLogger.debug("Pledged token has multiple pins. Verifying token chain height details"); + JSONArray tokenChainsList = new JSONArray(); + for (int i = 0; i < pinListPledgeToken.size(); i++) { + boolean listStatus = VerifyStakedToken.Contact(pinListPledgeToken.get(i).toString(), SEND_PORT + 16, pledgedToken, "", "Get-TokenChain"); + if (listStatus) { + JSONObject chainObject = new JSONObject(); + chainObject.put("node", pinListPledgeToken.get(i).toString()); + chainObject.put("chain", VerifyStakedToken.tokenChain); + chainObject.put("hash", calculateHash(VerifyStakedToken.tokenChain.toString(), "SHA3-256")); + chainObject.put("length", VerifyStakedToken.tokenChain.length()); + + tokenChainsList.put(chainObject); + } else { + ForkResolutionLogger.debug("Node " + pinListPledgeToken.get(i).toString() + " have not responded with token chain"); + } + } + ForkResolutionLogger.debug("Token chain details from pinned nodes received"); + + /** + * Remove token chains that do not contain transfer token + */ + for (int i = 0; i < tokenChainsList.length(); i++) { + String chainString = tokenChainsList.getJSONObject(i).getJSONArray("chain").toString(); + if(!chainString.contains(transferToken)) + tokenChainsList.remove(i); + } + + ForkResolutionLogger.debug("Token chains to be iterated:"); + for (int i = 0; i < tokenChainsList.length(); i++) { + ForkResolutionLogger.debug(tokenChainsList.getJSONObject(i).getString("node")); + } + + /** + * Create hashes and verify remaining token chains + */ + + /** + * Iterate through chains until transfer token found in the object with correct receiver + */ + boolean includedCheck = true; + for (int i = 0; i < tokenChainsList.length(); i++) { + JSONArray chain = tokenChainsList.getJSONObject(i).getJSONArray("chain"); + includedCheck = true; + for (int j = chain.length() - 1; j > 0; j--) { + ForkResolutionLogger.debug("Object " + j); + JSONObject chainIndexObject = chain.getJSONObject(j); + if (chainIndexObject.has("tokensPledgedWith")) { + String tokensPledgedWithString = chainIndexObject.get("tokensPledgedWith").toString(); + ForkResolutionLogger.debug("tokensPledgedWithString: " + tokensPledgedWithString + " pledgedToken: " + pledgedToken); + if (tokensPledgedWithString.contains(transferToken)) { + ForkResolutionLogger.debug("tokensPledgedWithString.contains(pledgedToken)"); + String receiverPID = getValues(DATA_PATH.concat("DataTable.json"), "peerid", "didHash", chainIndexObject.getString("receiver")); + ForkResolutionLogger.debug("Receiver: " + receiverPID + " Node: " + tokenChainsList.getJSONObject(i).getString("node")); + if(receiverPID.equals(tokenChainsList.getJSONObject(i).getString("node"))) { + ForkResolutionLogger.debug("Receiver IDs match"); + if (j < chain.length() - 1) { + resolutionMessage = "<1> Token Pledged correctly in the appropriate level"; + ForkResolutionLogger.debug(" <1> Token Pledged correctly in the appropriate level"); + includedCheck = true; + break; + } else { + resolutionMessage = "<2> Token Pledged maliciously. Present in the current level"; + ForkResolutionLogger.debug(" <2> Token Pledged maliciously. Present in the current level"); + includedCheck = false; + } + } else{ + resolutionMessage = "<3> Wrong pledge object"; + ForkResolutionLogger.debug("<3> Wrong pledge object"); + includedCheck = false; + } + } else { + resolutionMessage = " <4> Token Chain object does not contain the pledged token details"; + ForkResolutionLogger.debug(" <4> Token Chain object does not contain the pledged token details"); + includedCheck = false; + } + } else { + resolutionMessage = "<5> Token Chain Object does not have pledge details"; + ForkResolutionLogger.debug(" <5> Token Chain Object does not have pledge details"); + includedCheck = false; + } + } + ForkResolutionLogger.debug("Token " + transferToken + " was pledged for " + pledgedToken + " and check status for token chain of " + tokenChainsList.getJSONObject(i).getString("node") + " is " + includedCheck); + } + if (includedCheck) + return true; + ForkResolutionLogger.debug("Transfer token " + transferToken + " not found in any pledged token chains"); + return false; + } else { + ForkResolutionLogger.debug("Pledged token has no pins. Passed !!!"); + return true; + } + }else { + ForkResolutionLogger.debug("Transfer token " + transferToken + " has no multiple pins. Passed !!!"); + return true; + } + } +} diff --git a/src/com/rubix/TokenTransfer/TokenReceiver.java b/src/com/rubix/TokenTransfer/TokenReceiver.java index 2174d2bc..9252182f 100644 --- a/src/com/rubix/TokenTransfer/TokenReceiver.java +++ b/src/com/rubix/TokenTransfer/TokenReceiver.java @@ -6,7 +6,6 @@ import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; @@ -30,14 +29,9 @@ import com.rubix.Resources.Functions; import com.rubix.Resources.IPFSNetwork; import com.rubix.TokenTransfer.TransferPledge.Unpledge; -import com.rubix.Constants.MiningConstants.*; import static com.rubix.Resources.APIHandler.getPubKeyIpfsHash_DIDserver; import static com.rubix.NFTResources.NFTFunctions.*; -import static com.rubix.TokenTransfer.TransferPledge.Unpledge.verifyProof; - -import java.lang.reflect.Field; -import java.util.LinkedHashMap; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; @@ -199,6 +193,7 @@ public static String receive() { JSONObject partTokenChains = TokenDetails.getJSONObject("part-tokenChains"); JSONObject partTokenChainsForVerification = TokenDetails.getJSONObject("part-tokenChains-PrevState"); JSONArray partTokenChainsHash = TokenDetails.getJSONArray("hashSender"); + JSONObject distributedObject = TokenDetails.getJSONObject("distributedObject"); if (TokenDetails.optJSONArray("proof") != null) { JSONArray proofArray = TokenDetails.getJSONArray("proof"); @@ -211,81 +206,96 @@ public static String receive() { if (!proofFile.exists()) { proofFile.mkdirs(); } - //TOKENCHAIN_PATH + "Proof/"+ token + ".proof" - writeToFile(proofFile.getAbsolutePath()+"/"+ token + ".proof", proof, false); + // TOKENCHAIN_PATH + "Proof/"+ token + ".proof" + writeToFile(proofFile.getAbsolutePath() + "/" + token + ".proof", proof, false); TokenReceiverLogger.debug(proofFile.getAbsolutePath()); } } JSONArray previousSendersArray = tokenObject.getJSONArray("previousSender"); -// JSONArray positionsArray = tokenObject.getJSONArray("positions"); + // JSONArray positionsArray = tokenObject.getJSONArray("positions"); Double amount = tokenObject.getDouble("amount"); JSONObject amountLedger = tokenObject.getJSONObject("amountLedger"); TokenReceiverLogger.debug("Amount Ledger: " + amountLedger); int intPart = wholeTokens.length(); - // ? multiple pin check starts + Double decimalPart = formatAmount(amount - intPart); JSONArray doubleSpentToken = new JSONArray(); boolean tokenOwners = true; ArrayList pinOwnersArray = new ArrayList(); ArrayList previousSender = new ArrayList(); JSONArray ownersReceived = new JSONArray(); - //TokenReceiverLogger.debug("previousSendersArray is " + previousSendersArray.toString()); - //TokenReceiverLogger.debug("tokenObject is " + tokenObject.toString()); - //TokenReceiverLogger.debug("tokenDetails(base for tokenObj) is " + tokenDetails.toString()); - - // previoussenderarray - // tokenobject - for (int i = 0; i < wholeTokens.length(); ++i) { - try { - TokenReceiverLogger.debug("Checking owners for " + wholeTokens.getString(i) + " Please wait..."); - pinOwnersArray = IPFSNetwork.dhtOwnerCheck(wholeTokens.getString(i)); - - if (pinOwnersArray.size() > 2) { - - for (int j = 0; j < previousSendersArray.length(); j++) { - if (previousSendersArray.getJSONObject(j).getString("token") - .equals(wholeTokens.getString(i))) - ownersReceived = previousSendersArray.getJSONObject(j).getJSONArray("sender"); - } + // TokenReceiverLogger.debug("previousSendersArray is " + + // previousSendersArray.toString()); + // TokenReceiverLogger.debug("tokenObject is " + tokenObject.toString()); + // TokenReceiverLogger.debug("tokenDetails(base for tokenObj) is " + + // tokenDetails.toString()); - for (int j = 0; j < ownersReceived.length(); j++) { - previousSender.add(ownersReceived.getString(j)); - } - TokenReceiverLogger.debug("Previous Owners: " + previousSender); - - for (int j = 0; j < pinOwnersArray.size(); j++) { - if (!previousSender.contains(pinOwnersArray.get(j).toString())) - tokenOwners = false; - } - } - } catch (IOException e) { - - TokenReceiverLogger.debug("Ipfs dht find did not execute"); - } - } - if (!tokenOwners) { - JSONArray owners = new JSONArray(); - for (int i = 0; i < pinOwnersArray.size(); i++) - owners.put(pinOwnersArray.get(i).toString()); - TokenReceiverLogger.debug("Multiple Owners for " + doubleSpentToken); - TokenReceiverLogger.debug("Owners: " + owners); - output.println("420"); - output.println(doubleSpentToken.toString()); - output.println(owners.toString()); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Multiple Owners for " + doubleSpentToken + " " + owners); - IPFSNetwork.executeIPFSCommands(" ipfs p2p close -t /p2p/" + senderPeerID); - output.close(); - input.close(); - sk.close(); - ss.close(); - return APIResponse.toString(); - } + // ? multiple pin check starts + // JSONArray doubleSpentToken = new JSONArray(); + // boolean tokenOwners = true; + // ArrayList pinOwnersArray = new ArrayList(); + // ArrayList previousSender = new ArrayList(); + // JSONArray ownersReceived = new JSONArray(); + // TokenReceiverLogger.debug("previousSendersArray is " + + // previousSendersArray.toString()); + // TokenReceiverLogger.debug("tokenObject is " + tokenObject.toString()); + // TokenReceiverLogger.debug("tokenDetails(base for tokenObj) is " + + // tokenDetails.toString()); + // for (int i = 0; i < wholeTokens.length(); ++i) { + // try { + // TokenReceiverLogger.debug("Checking owners for " + wholeTokens.getString(i) + + // " Please wait..."); + // pinOwnersArray = IPFSNetwork.dhtOwnerCheck(wholeTokens.getString(i)); + // + // if (pinOwnersArray.size() > 2) { + // + // for (int j = 0; j < previousSendersArray.length(); j++) { + // if (previousSendersArray.getJSONObject(j).getString("token") + // .equals(wholeTokens.getString(i))) + // ownersReceived = + // previousSendersArray.getJSONObject(j).getJSONArray("sender"); + // } + // + // for (int j = 0; j < ownersReceived.length(); j++) { + // previousSender.add(ownersReceived.getString(j)); + // } + // TokenReceiverLogger.debug("Previous Owners: " + previousSender); + // + // for (int j = 0; j < pinOwnersArray.size(); j++) { + // if (!previousSender.contains(pinOwnersArray.get(j).toString())) + // tokenOwners = false; + // } + // } + // } catch (IOException e) { + // + // TokenReceiverLogger.debug("Ipfs dht find did not execute"); + // } + // } + // if (!tokenOwners) { + // JSONArray owners = new JSONArray(); + // for (int i = 0; i < pinOwnersArray.size(); i++) + // owners.put(pinOwnersArray.get(i).toString()); + // TokenReceiverLogger.debug("Multiple Owners for " + doubleSpentToken); + // TokenReceiverLogger.debug("Owners: " + owners); + // output.println("420"); + // output.println(doubleSpentToken.toString()); + // output.println(owners.toString()); + // APIResponse.put("did", senderDidIpfsHash); + // APIResponse.put("tid", "null"); + // APIResponse.put("status", "Failed"); + // APIResponse.put("message", "Multiple Owners for " + doubleSpentToken + " " + + // owners); + // IPFSNetwork.executeIPFSCommands(" ipfs p2p close -t /p2p/" + senderPeerID); + // output.close(); + // input.close(); + // sk.close(); + // ss.close(); + // return APIResponse.toString(); + // } // ? multiple pin check ends + String senderToken = TokenDetails.toString(); String consensusID = calculateHash(senderToken, "SHA3-256"); TokenReceiverLogger.debug("consensusID is " + consensusID); @@ -333,9 +343,65 @@ public static String receive() { tokenDetailMap.put(tokenNumberHash, -1); } + if (intPart > 0) { + + boolean forkResolution = true; + TokenReceiverLogger.debug("Fork Checking version 3: "); + TokenReceiverLogger.debug("Whole Token Chains: " + wholeTokenChainContent.get(0)); + TokenReceiverLogger.debug("Whole Token Chains: " + new JSONArray(wholeTokenChainContent.get(0))); + JSONArray forkedTokens = new JSONArray(); + for (int i = 0; i < wholeTokens.length(); ++i) { + TokenReceiverLogger.debug("Fork Checking for token: " + wholeTokens.getString(i)); + + JSONArray tokenChain = new JSONArray(wholeTokenChainContent.get(i)); + JSONObject forkObject = new JSONObject(); + forkObject.put("token", wholeTokens.getString(i)); + forkObject.put("tokenChain", tokenChain); + forkObject.put("previousSendersArray", previousSendersArray); + + if (tokenChain.getJSONObject(tokenChain.length() - 1).has("pledgeToken")) { + TokenReceiverLogger + .debug("Token " + wholeTokens.getString(i) + " is a new token (SHAG structure)"); + if (!tokenChain.getJSONObject(tokenChain.length() - 1).getString("pledgeToken").equals("")) { + TokenReceiverLogger.debug("Token " + wholeTokens.getString(i) + " is a pledged token"); + forkResolution = ForkResolution.verifyUnpledgedToken(wholeTokens.getString(i), + tokenChain.getJSONObject(tokenChain.length() - 1).getJSONArray("tokensPledgedFor") + .get(0).toString()); - //QmWcmK38g9XcrCwhoEq3rQjNseJW2HyscoG66DWF62X6bK.proof - //BNK00.json -- unpledge + } else { + TokenReceiverLogger.debug("Token " + wholeTokens.getString(i) + + " is a new token (SHAG structure) and not pledged"); + forkResolution = ForkResolution.check(forkObject); + } + } else { + TokenReceiverLogger.debug("Token " + wholeTokens.getString(i) + " is an Eismeer Token"); + forkResolution = ForkResolution.check(forkObject); + } + if (!forkResolution) { + TokenReceiverLogger.debug("Fork found and not resolved for token: " + wholeTokens.getString(i)); + TokenReceiverLogger.debug("Message: " + ForkResolution.resolutionMessage); + forkedTokens.put(wholeTokens.getString(i)); + } + } + if (!forkResolution) { + TokenReceiverLogger.debug("Fork not resolved for " + forkedTokens); + output.println("418"); + output.println(forkedTokens.toString()); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Fork not resolved"); + IPFSNetwork.executeIPFSCommands(" ipfs p2p close -t /p2p/" + senderPeerID); + output.close(); + input.close(); + sk.close(); + ss.close(); + return APIResponse.toString(); + } + } + // + // QmWcmK38g9XcrCwhoEq3rQjNseJW2HyscoG66DWF62X6bK.proof + // BNK00.json -- unpledge // repo(ipfs); String pledgeErrorMessage = ""; @@ -346,7 +412,7 @@ public static String receive() { JSONArray chain = new JSONArray(wholeTokenChainContent.get(i)); if (chain.length() > 0) { JSONObject pledgeBlock = chain.getJSONObject(chain.length() - 1); - //TokenReceiverLogger.debug("pledgeBlock object " + pledgeBlock.toString()); + // TokenReceiverLogger.debug("pledgeBlock object " + pledgeBlock.toString()); // if (pledgeBlock.has("pledgeToken")) { if (pledgeBlock.optString("pledgeToken").length() > 0) { @@ -354,9 +420,9 @@ public static String receive() { String tokenName = chain.getJSONObject(chain.length() - 1).getString("pledgeToken"); String did = chain.getJSONObject(chain.length() - 1).getString("receiver"); String tid = chain.getJSONObject(chain.length() - 1).getString("tid"); - String path = TOKENCHAIN_PATH + "Proof/"+ tokenName + ".proof"; + String path = TOKENCHAIN_PATH + "Proof/" + tokenName + ".proof"; File proofFile = new File(path); - if(proofFile.exists()){ + if (proofFile.exists()) { pledged = Unpledge.verifyProof(tokenName, did, tid); } JSONObject pledgedTokenObject = new JSONObject(); @@ -418,9 +484,9 @@ public static String receive() { return APIResponse.toString(); } else { for (String tokenContent : tokenDetailMap.keySet()) { - //TokenReceiverLogger.debug(tokenContent); - //TokenReceiverLogger.debug(tokenDetailMap.get(tokenContent)); - //TokenReceiverLogger.debug(tokenMaxLimitMap.get(tokenContent)); + // TokenReceiverLogger.debug(tokenContent); + // TokenReceiverLogger.debug(tokenDetailMap.get(tokenContent)); + // TokenReceiverLogger.debug(tokenMaxLimitMap.get(tokenContent)); if (tokenDetailMap.get(tokenContent) != null && tokenDetailMap.get(tokenContent) > tokenMaxLimitMap.get(tokenContent)) { @@ -455,7 +521,8 @@ public static String receive() { TokenReceiverLogger.debug("Verifying whole token chains.. "); for (int i = 0; i < intPart; i++) { - //TokenReceiverLogger.debug("Verifying whole Token Chain : " + wholeTokenChains.getString(i)); + // TokenReceiverLogger.debug("Verifying whole Token Chain : " + + // wholeTokenChains.getString(i)); String TokenChainContent = get(wholeTokenChains.getString(i), ipfs); @@ -467,7 +534,8 @@ public static String receive() { JSONObject forNLSScheck = new JSONObject(); -// if(lastValueOnChain.has("hash") && lastValueOnChain.has("pvtShareBits") && lastValueOnChain.has("pvtKeySign")){ + // if(lastValueOnChain.has("hash") && lastValueOnChain.has("pvtShareBits") && + // lastValueOnChain.has("pvtKeySign")){ if (lastValueOnChain.has("hash") && lastValueOnChain.has("pvtShareBits")) { @@ -496,7 +564,7 @@ public static String receive() { TokenReceiverLogger.debug("@@@@@@ Calculated Hash(hashtocheck) : " + hashToCheck); - //TokenReceiverLogger.debug("@@@@@@ ReCalc tokenchain: " + TokenChainArray); + // TokenReceiverLogger.debug("@@@@@@ ReCalc tokenchain: " + TokenChainArray); // Check 1 : Hash comaprison check if (hashToCheck.equals(hash)) { @@ -540,7 +608,8 @@ public static String receive() { break; } else { TokenReceiverLogger.debug("Previous sender's sign also authenticated."); - //TokenReceiverLogger.debug("Token chain " + wholeTokenChains.getString(i) + "verified"); + // TokenReceiverLogger.debug("Token chain " + wholeTokenChains.getString(i) + + // "verified"); } // Check 2: prev Sender authenticity check (Signature) @@ -699,7 +768,8 @@ public static String receive() { partTokenChainToVerify.put(lastObj2); - //TokenReceiverLogger.debug("Token Chain to be hashed : " + partTokenChainToVerify); + // TokenReceiverLogger.debug("Token Chain to be hashed : " + + // partTokenChainToVerify); String hashToCheck = calculateHash(partTokenChainToVerify.toString(), "SHA3-256"); TokenReceiverLogger.debug("Calculated Hash(hashToCheck) : " + hashToCheck); @@ -816,7 +886,8 @@ public static String receive() { // "+TokenChainArray); String hashToCheck = calculateHash(partTokenChainToVerify.toString(), "SHA3-256"); - //TokenReceiverLogger.debug("hashToCheck(partTokenChainToVerify.toString()) is " + hashToCheck); + // TokenReceiverLogger.debug("hashToCheck(partTokenChainToVerify.toString()) is + // " + hashToCheck); if (hashToCheck.equals(hash)) { @@ -859,7 +930,8 @@ public static String receive() { break; } else { TokenReceiverLogger.debug("Previous sender's sign also authenticated."); - //TokenReceiverLogger.debug("Token chain " + wholeTokenChains.getString(i) + "verified"); + // TokenReceiverLogger.debug("Token chain " + wholeTokenChains.getString(i) + + // "verified"); } /* @@ -1029,7 +1101,7 @@ public static String receive() { * APIResponse.toString(); } */ -// boolean ownerCheck = true; + // boolean ownerCheck = true; JSONArray allTokens = new JSONArray(); for (int i = 0; i < wholeTokens.length(); i++) @@ -1043,17 +1115,18 @@ public static String receive() { for (int i = 0; i < partTokenChainContent.length(); i++) allTokensChains.put(partTokenChainContent.get(i)); - //TokenReceiverLogger.debug("allTokenChain is " + allTokensChains.toString()); + // TokenReceiverLogger.debug("allTokenChain is " + allTokensChains.toString()); JSONArray invalidTokens = new JSONArray(); // TODO for (int count = 0; count < wholeTokens.length(); count++) { String tokens = null; - //TokenReceiverLogger.debug("Json array tokenChain value is " + wholeTokens.get(count).toString()); + // TokenReceiverLogger.debug("Json array tokenChain value is " + + // wholeTokens.get(count).toString()); JSONArray tokenChain = new JSONArray(allTokensChains.get(count).toString()); - //TokenReceiverLogger.debug("tokenchain is " + tokenChain); - //TokenReceiverLogger.debug("tokenchain size is " + tokenChain.length()); + // TokenReceiverLogger.debug("tokenchain is " + tokenChain); + // TokenReceiverLogger.debug("tokenchain size is " + tokenChain.length()); String tokenContent = get(wholeTokens.getString(count), ipfs).trim(); String tokenLevel = tokenContent.substring(0, tokenContent.length() - 64); @@ -1073,36 +1146,39 @@ public static String receive() { lastObject = tokenChain.getJSONObject(tokenChain.length() - 1); } - //TokenReceiverLogger.debug("Last Object = " + lastObject.toString()); + // TokenReceiverLogger.debug("Last Object = " + lastObject.toString()); -// if (tokenChain.length() > 0 && lastObject.has("owner") && !lastObject.has(MiningConstants.STAKED_TOKEN) && -// ( (tokenLevelInt == 4 && (tokenDetailMap.get(tokenNumberHash) >= 1204400)) || (tokenLevelInt >= 5)) ) { + // if (tokenChain.length() > 0 && lastObject.has("owner") && + // !lastObject.has(MiningConstants.STAKED_TOKEN) && + // ( (tokenLevelInt == 4 && (tokenDetailMap.get(tokenNumberHash) >= 1204400)) || + // (tokenLevelInt >= 5)) ) { if (tokenChain.length() > 0 && !lastObject.has(MiningConstants.STAKED_TOKEN) && ((tokenLevelInt == 4 && (tokenDetailMap.get(tokenNumberHash) >= 1204400)) || (tokenLevelInt >= 5))) { -// TokenReceiverLogger.debug("Checking ownership"); -// String owner = lastObject.getString("owner"); -// tokens = allTokens.getString(count); -// String hashString = tokens.concat(senderDidIpfsHash); -// String hashForPositions = calculateHash(hashString, "SHA3-256"); -// String ownerIdentity = hashForPositions.concat(positionsArray.getString(count)); -// String ownerRecalculated = calculateHash(ownerIdentity, "SHA3-256"); -// -// TokenReceiverLogger.debug("Ownership Here Sender Calculation"); -// TokenReceiverLogger.debug("tokens: " + tokens); -// TokenReceiverLogger.debug("hashString: " + hashString); -// TokenReceiverLogger.debug("hashForPositions: " + hashForPositions); -// TokenReceiverLogger.debug("p1: " + positionsArray.getString(count)); -// TokenReceiverLogger.debug("ownerIdentity: " + ownerIdentity); -// TokenReceiverLogger.debug("ownerIdentityHash: " + ownerRecalculated); -// -// if (!owner.equals(ownerRecalculated)) { -// ownerCheck = false; -// invalidTokens.put(tokens); -// } - -// if (ownerCheck && (tokenChain.length() < minumumStakeHeight)) { + // TokenReceiverLogger.debug("Checking ownership"); + // String owner = lastObject.getString("owner"); + // tokens = allTokens.getString(count); + // String hashString = tokens.concat(senderDidIpfsHash); + // String hashForPositions = calculateHash(hashString, "SHA3-256"); + // String ownerIdentity = + // hashForPositions.concat(positionsArray.getString(count)); + // String ownerRecalculated = calculateHash(ownerIdentity, "SHA3-256"); + // + // TokenReceiverLogger.debug("Ownership Here Sender Calculation"); + // TokenReceiverLogger.debug("tokens: " + tokens); + // TokenReceiverLogger.debug("hashString: " + hashString); + // TokenReceiverLogger.debug("hashForPositions: " + hashForPositions); + // TokenReceiverLogger.debug("p1: " + positionsArray.getString(count)); + // TokenReceiverLogger.debug("ownerIdentity: " + ownerIdentity); + // TokenReceiverLogger.debug("ownerIdentityHash: " + ownerRecalculated); + // + // if (!owner.equals(ownerRecalculated)) { + // ownerCheck = false; + // invalidTokens.put(tokens); + // } + + // if (ownerCheck && (tokenChain.length() < minumumStakeHeight)) { if (tokenChain.length() < minumumStakeHeight) { // && (tokenNumber > 1204400) if (tokenChain.length() > 0) { @@ -1244,7 +1320,7 @@ public static String receive() { if (!minedTokenStatus) { TokenReceiverLogger.debug("Staked token is not found with staker DID: " + stakerDIDTC[stakeCount]); -// ownerCheck = false; + // ownerCheck = false; invalidTokens.put(tokens); } @@ -1252,7 +1328,7 @@ public static String receive() { TokenReceiverLogger.debug( "Staking check (2) failed - unable to verify mine ID signature by staker: " + stakerDIDTC[stakeCount]); -// ownerCheck = false; + // ownerCheck = false; invalidTokens.put(tokens); } @@ -1260,7 +1336,7 @@ public static String receive() { + stakerDIDTC[stakeCount]); } else { TokenReceiverLogger.debug("Staking check (2) failed"); -// ownerCheck = false; + // ownerCheck = false; invalidTokens.put(tokens); } @@ -1275,7 +1351,7 @@ public static String receive() { // } } else { -// ownerCheck = false; + // ownerCheck = false; TokenReceiverLogger.debug("Staked Token is not available!"); } @@ -1298,19 +1374,19 @@ public static String receive() { for (int i = 0; i < ownersArray.size(); i++) { if (!VerifyStakedToken.Contact(ownersArray.get(i), SEND_PORT + 16, stakeData.getString(MiningConstants.STAKED_TOKEN), - mineIDContentJSON.getString("tokenContent"))) { + mineIDContentJSON.getString("tokenContent"), "Get-TokenChain-Height")) { minedTokenStatus = false; } } if (!minedTokenStatus) { TokenReceiverLogger.debug("Staking check failed: Found staked token but token height < 46"); -// ownerCheck = false; + // ownerCheck = false; invalidTokens.put(tokens); } TokenReceiverLogger.debug( "Staking check failed: Found staked token but unable to transfer while mined token height is not satisfied for the network"); -// ownerCheck = false; + // ownerCheck = false; invalidTokens.put(tokens); // JSONObject tokenToVerify = new JSONObject(); @@ -1361,24 +1437,24 @@ public static String receive() { } -// if (!ownerCheck) { -// TokenReceiverLogger.debug("Ownership Check Failed"); -// String errorMessage = "Ownership Check Failed"; -// output.println("424"); -// output.println(invalidTokens.toString()); -// APIResponse.put("did", senderDidIpfsHash); -// APIResponse.put("tid", "null"); -// APIResponse.put("status", "Failed"); -// APIResponse.put("message", errorMessage); -// TokenReceiverLogger.debug(errorMessage); -// executeIPFSCommands(" ipfs p2p close -t /p2p/" + senderPeerID); -// output.close(); -// input.close(); -// sk.close(); -// ss.close(); -// return APIResponse.toString(); -// } else -// TokenReceiverLogger.debug("Ownership Check Passed"); + // if (!ownerCheck) { + // TokenReceiverLogger.debug("Ownership Check Failed"); + // String errorMessage = "Ownership Check Failed"; + // output.println("424"); + // output.println(invalidTokens.toString()); + // APIResponse.put("did", senderDidIpfsHash); + // APIResponse.put("tid", "null"); + // APIResponse.put("status", "Failed"); + // APIResponse.put("message", errorMessage); + // TokenReceiverLogger.debug(errorMessage); + // executeIPFSCommands(" ipfs p2p close -t /p2p/" + senderPeerID); + // output.close(); + // input.close(); + // sk.close(); + // ss.close(); + // return APIResponse.toString(); + // } else + // TokenReceiverLogger.debug("Ownership Check Passed"); // ------------------------------------------------------- @@ -1406,7 +1482,7 @@ public static String receive() { availableParts = formatAmount(availableParts); if (availableParts > 1.000D) { - //TokenReceiverLogger.debug("Token wholly spent: " + partTokens.getString(i)); + // TokenReceiverLogger.debug("Token wholly spent: " + partTokens.getString(i)); TokenReceiverLogger.debug("Parts: " + availableParts); partsAvailable = false; } @@ -1455,7 +1531,7 @@ public static String receive() { String Status = SenderDetails.getString("status"); String QuorumDetails = SenderDetails.getString("quorumsign"); JSONArray pledgedDetails = SenderDetails.getJSONArray("pledgeDetails"); - //TokenReceiverLogger.debug("pledged details is " + pledgedDetails); + // TokenReceiverLogger.debug("pledged details is " + pledgedDetails); String BlockHash = new String(); if (SenderDetails.toString().contains("blockHash")) { BlockHash = SenderDetails.getString("blockHash"); @@ -1617,7 +1693,8 @@ public static String receive() { // JSONArray arrLastObjects = new JSONArray(); JSONObject lastObject = new JSONObject(); - //TokenReceiverLogger.debug("%%%%% WholeTokenChainsWithAppendedBlock before lastobj"+ WholeTokenChainsWithAppendedBlock.toString()); + // TokenReceiverLogger.debug("%%%%% WholeTokenChainsWithAppendedBlock before + // lastobj"+ WholeTokenChainsWithAppendedBlock.toString()); JSONArray lastObjectArray = new JSONArray(); if (request.equals("Request for new blocks being added to the Token Chains")) { @@ -1640,7 +1717,7 @@ public static String receive() { arrToken.put(objectToken); JSONArray arr = new JSONArray(wholeTokenChainContent.get(i)); - //TokenReceiverLogger.debug("%%%%% Current tokenchain: " + arr); + // TokenReceiverLogger.debug("%%%%% Current tokenchain: " + arr); // lastObject.put("senderSign", senderPvtShareBits); lastObject.put("sender", senderDidIpfsHash); @@ -1652,13 +1729,14 @@ public static String receive() { lastObject.put("pledgeToken", ""); lastObject.put("tokensPledgedFor", allTokens); lastObject.put("tokensPledgedWith", pledgedDetails); + lastObject.put("distributedObject", distributedObject); if (!BlockHash.isEmpty()) { lastObject.put("blockHash", BlockHash); } arr.put(lastObject); - //TokenReceiverLogger.debug("%%%%% Last BLock added tokenchain: " + arr); + // TokenReceiverLogger.debug("%%%%% Last BLock added tokenchain: " + arr); WholeTokenChainsWithAppendedBlock.add(arr.toString()); @@ -1669,14 +1747,15 @@ public static String receive() { } } - //TokenReceiverLogger.debug("Last object for sender is " + lastObjectArray.toString()); + // TokenReceiverLogger.debug("Last object for sender is " + + // lastObjectArray.toString()); output.println(lastObjectArray.toString()); String hashAndSignsforTokenChains; try { hashAndSignsforTokenChains = input.readLine(); - //TokenReceiverLogger.info("!!!" + hashAndSignsforTokenChains); + // TokenReceiverLogger.info("!!!" + hashAndSignsforTokenChains); if (hashAndSignsforTokenChains.contains("Token chains Not Matching")) { TokenReceiverLogger.warn("Token chains Not Matching"); @@ -1693,7 +1772,8 @@ public static String receive() { } hash_Signs_ForTokenChains = new JSONArray(hashAndSignsforTokenChains); - //TokenReceiverLogger.debug("%%%%% hash_Signs_ForTokenChains: " + hash_Signs_ForTokenChains); + // TokenReceiverLogger.debug("%%%%% hash_Signs_ForTokenChains: " + + // hash_Signs_ForTokenChains); } catch (SocketException e) { TokenReceiverLogger.warn("Sender Stream Null - Token Chain Updation status"); @@ -1710,27 +1790,30 @@ public static String receive() { } -// //To accecpt sender req for new Part Token chain blocks, and provide the same -// String request_parttokenchains; -// try { -// request_parttokenchains = input.readLine(); -// } catch (SocketException e) { -// TokenReceiverLogger.warn("Sender Stream Null, receiver unable to accept senders request to get new part Token chain block for hashing"); -// APIResponse.put("did", ""); -// APIResponse.put("tid", "null"); -// APIResponse.put("status", "Failed"); -// APIResponse.put("message", "Sender Stream Null, receiver unable to accept senders request to get new part Token chain block for hashing"); -// -// output.close(); -// input.close(); -// sk.close(); -// ss.close(); -// return APIResponse.toString(); -// -// } + // //To accecpt sender req for new Part Token chain blocks, and provide the same + // String request_parttokenchains; + // try { + // request_parttokenchains = input.readLine(); + // } catch (SocketException e) { + // TokenReceiverLogger.warn("Sender Stream Null, receiver unable to accept + // senders request to get new part Token chain block for hashing"); + // APIResponse.put("did", ""); + // APIResponse.put("tid", "null"); + // APIResponse.put("status", "Failed"); + // APIResponse.put("message", "Sender Stream Null, receiver unable to accept + // senders request to get new part Token chain block for hashing"); + // + // output.close(); + // input.close(); + // sk.close(); + // ss.close(); + // return APIResponse.toString(); + // + // } JSONObject parttokenchainsToBeHashed = new JSONObject(); -// if(request_parttokenchains.equals("Request for Part Token Chains to be hashed")){ + // if(request_parttokenchains.equals("Request for Part Token Chains to be + // hashed")){ // TODO for (int i = 0; i < partTokens.length(); i++) { @@ -1751,26 +1834,27 @@ public static String receive() { String hashString = tokens.concat(receiverDidIpfsHash); String hashForPositions = calculateHash(hashString, "SHA3-256"); -// BufferedImage pvt1 = ImageIO -// .read(new File(DATA_PATH.concat(receiverDidIpfsHash).concat("/PrivateShare.png"))); -// String firstPrivate = PropImage.img2bin(pvt1); -// int[] privateIntegerArray1 = strToIntArray(firstPrivate); -// String privateBinary = Functions.intArrayToStr(privateIntegerArray1); -// String positions = ""; -// for (int j = 0; j < privateIntegerArray1.length; j += 49152) { -// positions += privateBinary.charAt(j); -// } -// -// String ownerIdentity = hashForPositions.concat(positions); -// String ownerIdentityHash = calculateHash(ownerIdentity, "SHA3-256"); -// -// TokenReceiverLogger.debug("Ownership Here"); -// TokenReceiverLogger.debug("tokens: " + partTokens.getString(i)); -// TokenReceiverLogger.debug("hashString: " + hashString); -// TokenReceiverLogger.debug("hashForPositions: " + hashForPositions); -// TokenReceiverLogger.debug("p1: " + positions); -// TokenReceiverLogger.debug("ownerIdentity: " + ownerIdentity); -// TokenReceiverLogger.debug("ownerIdentityHash: " + ownerIdentityHash); + // BufferedImage pvt1 = ImageIO + // .read(new + // File(DATA_PATH.concat(receiverDidIpfsHash).concat("/PrivateShare.png"))); + // String firstPrivate = PropImage.img2bin(pvt1); + // int[] privateIntegerArray1 = strToIntArray(firstPrivate); + // String privateBinary = Functions.intArrayToStr(privateIntegerArray1); + // String positions = ""; + // for (int j = 0; j < privateIntegerArray1.length; j += 49152) { + // positions += privateBinary.charAt(j); + // } + // + // String ownerIdentity = hashForPositions.concat(positions); + // String ownerIdentityHash = calculateHash(ownerIdentity, "SHA3-256"); + // + // TokenReceiverLogger.debug("Ownership Here"); + // TokenReceiverLogger.debug("tokens: " + partTokens.getString(i)); + // TokenReceiverLogger.debug("hashString: " + hashString); + // TokenReceiverLogger.debug("hashForPositions: " + hashForPositions); + // TokenReceiverLogger.debug("p1: " + positions); + // TokenReceiverLogger.debug("ownerIdentity: " + ownerIdentity); + // TokenReceiverLogger.debug("ownerIdentityHash: " + ownerIdentityHash); JSONObject newPartObject = new JSONObject(); // newPartObject.put("senderSign", senderSignature); @@ -1778,8 +1862,12 @@ public static String receive() { newPartObject.put("receiver", receiverDidIpfsHash); newPartObject.put("comment", comment); newPartObject.put("tid", tid); + lastObject.put("pledgeToken", ""); + lastObject.put("tokensPledgedFor", allTokens); + lastObject.put("tokensPledgedWith", pledgedDetails); + lastObject.put("distributedObject", distributedObject); // newPartObject.put("nextHash", ""); -// newPartObject.put("owner", ownerIdentityHash); + // newPartObject.put("owner", ownerIdentityHash); /* * if (partTokenChainContent.getJSONArray(i).length() == 0) * newPartObject.put("previousHash", ""); else newPartObject.put("previousHash", @@ -1831,30 +1919,32 @@ public static String receive() { } } -// } - -// output.println(parttokenchainsToBeHashed.toString()); - -// String req_hashesAndSignsPartTokenChains; -// try { -// req_hashesAndSignsPartTokenChains = input.readLine(); -// hashes_Signs_PartTokenChains = new JSONArray(req_hashesAndSignsPartTokenChains); -// -// -// }catch (SocketException e) { -// TokenReceiverLogger.warn("Sender Stream Null - Token Chain Updation status"); -// APIResponse.put("did", ""); -// APIResponse.put("tid", "null"); -// APIResponse.put("status", "Failed"); -// APIResponse.put("message", "Sender Stream Null - Token Chain Updation Status"); -// -// output.close(); -// input.close(); -// sk.close(); -// ss.close(); -// return APIResponse.toString(); -// -// } + // } + + // output.println(parttokenchainsToBeHashed.toString()); + + // String req_hashesAndSignsPartTokenChains; + // try { + // req_hashesAndSignsPartTokenChains = input.readLine(); + // hashes_Signs_PartTokenChains = new + // JSONArray(req_hashesAndSignsPartTokenChains); + // + // + // }catch (SocketException e) { + // TokenReceiverLogger.warn("Sender Stream Null - Token Chain Updation status"); + // APIResponse.put("did", ""); + // APIResponse.put("tid", "null"); + // APIResponse.put("status", "Failed"); + // APIResponse.put("message", "Sender Stream Null - Token Chain Updation + // Status"); + // + // output.close(); + // input.close(); + // sk.close(); + // ss.close(); + // return APIResponse.toString(); + // + // } String pinDetails; try { @@ -1922,11 +2012,13 @@ public static String receive() { // Writing Whole and part token chains to receiver's local storage. for (int i = 0; i < intPart; i++) { - //TokenReceiverLogger.debug("%%%%% WholeTokenChainsWithAppendedBlock: " + WholeTokenChainsWithAppendedBlock); + // TokenReceiverLogger.debug("%%%%% WholeTokenChainsWithAppendedBlock: " + + // WholeTokenChainsWithAppendedBlock); String tokenChainContent_WithoutHashAndSign = WholeTokenChainsWithAppendedBlock.get(i); JSONArray tokenChain = new JSONArray(tokenChainContent_WithoutHashAndSign); - //TokenReceiverLogger.debug("%%%%% Initial Tokenchain last object: " + tokenChain); + // TokenReceiverLogger.debug("%%%%% Initial Tokenchain last object: " + + // tokenChain); JSONObject lastObj = new JSONObject(); lastObj = tokenChain.getJSONObject(tokenChain.length() - 1); @@ -1937,11 +2029,12 @@ public static String receive() { // lastObj.put("pvtKeySign", // hash_Signs_ForTokenChains.getJSONObject(i).getString("pvtKeySign")); - //TokenReceiverLogger.debug("%%%%% Tokenchain last object: " + lastObj); + // TokenReceiverLogger.debug("%%%%% Tokenchain last object: " + lastObj); tokenChain.put(lastObj); - //TokenReceiverLogger.debug("%%%%% Writing to file tokenChain: " + tokenChain.toString()); + // TokenReceiverLogger.debug("%%%%% Writing to file tokenChain: " + + // tokenChain.toString()); writeToFile(TOKENCHAIN_PATH + wholeTokens.getString(i) + ".json", tokenChain.toString(), false); } @@ -1950,15 +2043,16 @@ public static String receive() { JSONArray finalPartTokenChain = final_parttokenchains.getJSONArray(partTokens.getString(i)); -// JSONObject last = new JSONObject(); -// last = finalPartTokenChain.getJSONObject(finalPartTokenChain.length()-1); -// finalPartTokenChain.remove(finalPartTokenChain.length()-1); -// -// last.put("hash",hashes_Signs_PartTokenChains.getJSONObject(i).getString("hash")); -// last.put("pvtShareBits",hashes_Signs_PartTokenChains.getJSONObject(i).getString("pvtShareBits")); -// //last.put("pvtKeySign", hashes_Signs_PartTokenChains.getJSONObject(i).getString("pvtKeySign")); -// -// finalPartTokenChain.put(last); + // JSONObject last = new JSONObject(); + // last = finalPartTokenChain.getJSONObject(finalPartTokenChain.length()-1); + // finalPartTokenChain.remove(finalPartTokenChain.length()-1); + // + // last.put("hash",hashes_Signs_PartTokenChains.getJSONObject(i).getString("hash")); + // last.put("pvtShareBits",hashes_Signs_PartTokenChains.getJSONObject(i).getString("pvtShareBits")); + // //last.put("pvtKeySign", + // hashes_Signs_PartTokenChains.getJSONObject(i).getString("pvtKeySign")); + // + // finalPartTokenChain.put(last); writeToFile(PART_TOKEN_CHAIN_PATH + partTokens.getString(i) + ".json", finalPartTokenChain.toString(), false); @@ -2039,7 +2133,7 @@ public static String receive() { } - //TokenReceiverLogger.debug("!@#$% 2: " + parttokenchains_req); + // TokenReceiverLogger.debug("!@#$% 2: " + parttokenchains_req); if (parttokenchains_req.equals("New part token chain to be hashed")) { String PartTokenChainToBeHashed_1_string; @@ -2063,7 +2157,7 @@ public static String receive() { } - //TokenReceiverLogger.debug("!@#$% 3: " + PartTokenChainToBeHashed_1_string); + // TokenReceiverLogger.debug("!@#$% 3: " + PartTokenChainToBeHashed_1_string); JSONArray partTokenChainToBeHashed = new JSONArray(PartTokenChainToBeHashed_1_string); @@ -2081,7 +2175,7 @@ public static String receive() { output.println(partTokenChainToBeHashed.toString()); - //TokenReceiverLogger.debug("!@#$% 4: " + partTokenChainToBeHashed); + // TokenReceiverLogger.debug("!@#$% 4: " + partTokenChainToBeHashed); } @@ -2107,7 +2201,7 @@ public static String receive() { return APIResponse.toString(); } - //TokenReceiverLogger.debug("!@#$% 5: " + PartTokenChainToBeHashed_2_string); + // TokenReceiverLogger.debug("!@#$% 5: " + PartTokenChainToBeHashed_2_string); JSONObject PartTokenChainsToBeHashed = new JSONObject( PartTokenChainToBeHashed_2_string); @@ -2135,7 +2229,7 @@ public static String receive() { output.println(hashedAndSigned_partTokenChains.toString()); - //TokenReceiverLogger.debug("!@#$% 6: " + hashedAndSigned_partTokenChains); + // TokenReceiverLogger.debug("!@#$% 6: " + hashedAndSigned_partTokenChains); } } diff --git a/src/com/rubix/TokenTransfer/TokenSender.java b/src/com/rubix/TokenTransfer/TokenSender.java index f4a3c480..fe1ff77f 100644 --- a/src/com/rubix/TokenTransfer/TokenSender.java +++ b/src/com/rubix/TokenTransfer/TokenSender.java @@ -5,13 +5,9 @@ import com.rubix.Resources.Functions; import com.rubix.Resources.IPFSNetwork; import com.rubix.TokenTransfer.TransferPledge.Initiator; -import com.rubix.TokenTransfer.TransferPledge.Unpledge; - import io.ipfs.api.IPFS; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; -import org.bouncycastle.cert.cmp.CertificateConfirmationContent; -import org.bouncycastle.crypto.engines.ISAACEngine; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -29,7 +25,8 @@ import java.util.List; import java.util.Map; -import static com.rubix.NFTResources.NFTFunctions.*; +import static com.rubix.NFTResources.NFTFunctions.getPvtKey; +import static com.rubix.NFTResources.NFTFunctions.privateKeyAlgorithm; import static com.rubix.Resources.Functions.*; import static com.rubix.Resources.IPFSNetwork.*; @@ -37,19 +34,18 @@ public class TokenSender { private static final Logger TokenSenderLogger = Logger.getLogger(TokenSender.class); private static final Logger eventLogger = Logger.getLogger("eventLogger"); public static BufferedReader serverInput; + public static JSONArray lastObJsonArray = new JSONArray(); + public static String authSenderByRecHash; private static JSONObject detailsObject = new JSONObject(); private static JSONArray quorumArray = new JSONArray(); public static String tid = null; private static JSONArray partTokens = new JSONArray(); private static JSONArray wholeTokens = new JSONArray(); private static ArrayList alphaPeersList; - private static ArrayList betaPeersList; - private static ArrayList gammaPeersList; private static int alphaSize = -1; private static JSONArray tokenPreviousSender = new JSONArray(); private static JSONArray wholeTokenChainHash = new JSONArray(); private static JSONArray partTokenChainHash = new JSONArray(); - public static JSONArray lastObJsonArray = new JSONArray(); private static JSONObject partTokenChainsPrevState = new JSONObject(); private static String tokenChainPath = "", tokenPath = ""; private static JSONObject amountLedger = new JSONObject(); @@ -65,17 +61,16 @@ public class TokenSender { private static BufferedReader input; private static Socket senderSocket; private static boolean senderMutex = false; - public static String authSenderByRecHash; - + private static int numberOfTokensToPledge; + public static void resetVariables() { + numberOfTokensToPledge = 0; detailsObject = new JSONObject(); quorumArray = new JSONArray(); tid = null; partTokens = new JSONArray(); wholeTokens = new JSONArray(); alphaPeersList = new ArrayList<>(); - betaPeersList = new ArrayList<>(); - gammaPeersList = new ArrayList<>(); alphaSize = -1; tokenPreviousSender = new JSONArray(); wholeTokenChainHash = new JSONArray(); @@ -170,28 +165,28 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce writeToFile(partTokensFile.toString(), "[]", false); } - TokenSenderLogger.debug("Requested Part: " + requestedAmount); //2 - TokenSenderLogger.debug("Int Part: " + intPart); //2 + TokenSenderLogger.debug("Requested Part: " + requestedAmount); // 2 + TokenSenderLogger.debug("Int Part: " + intPart); // 2 String bankFile = readFile(PAYMENTS_PATH.concat("BNK00.json")); - JSONArray bankArray = new JSONArray(bankFile); //18 - - //wholeAmount =2 ; + JSONArray bankArray = new JSONArray(bankFile); // 18 + + // wholeAmount =2 ; if (intPart <= bankArray.length()) - wholeAmount = intPart; + wholeAmount = intPart; else wholeAmount = bankArray.length(); - TokenSenderLogger.debug("wholeAmount is "+wholeAmount); + TokenSenderLogger.debug("wholeAmount is " + wholeAmount); for (int i = 0; i < wholeAmount; i++) { - wholeTokens.put(bankArray.getJSONObject(i).getString("tokenHash")); //2 + wholeTokens.put(bankArray.getJSONObject(i).getString("tokenHash")); // 2 } - TokenSenderLogger.debug("wholeTokens legnth is "+wholeTokens.length()); - //TokenSenderLogger.debug("wholeTokens is "+wholeTokens.toString()); - - //TokenSenderLogger.debug("wholeTokens length is "+wholeTokens.length()); - for (int i = 0; i < wholeTokens.length(); i++) { //2 + TokenSenderLogger.debug("wholeTokens legnth is " + wholeTokens.length()); + // TokenSenderLogger.debug("wholeTokens is "+wholeTokens.toString()); + + // TokenSenderLogger.debug("wholeTokens length is "+wholeTokens.length()); + for (int i = 0; i < wholeTokens.length(); i++) { // 2 String tokenRemove = wholeTokens.getString(i); for (int j = 0; j < bankArray.length(); j++) { if (bankArray.getJSONObject(j).getString("tokenHash").equals(tokenRemove)) @@ -228,7 +223,7 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce TokenSenderLogger.debug("Reading TokenChain file : " + TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); for (int j = 0; j < tokenChainFileArray.length(); j++) { -// TokenSenderLogger.debug("Reading token chain block = "+j); + // TokenSenderLogger.debug("Reading token chain block = "+j); String peerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", tokenChainFileArray.getJSONObject(j).getString("sender")); previousSenderArray.put(peerID); @@ -381,7 +376,7 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce wholeTokens.toString() + wholeTokenChainHash.toString() + partTokens.toString() + partTokenChainHash.toString() + receiverDidIpfsHash + senderDidIpfsHash + comment, "SHA3-256"); - //TokenSenderLogger.debug("Hash to verify Sender: " + authSenderByRecHash); + // TokenSenderLogger.debug("Hash to verify Sender: " + authSenderByRecHash); tid = calculateHash(authSenderByRecHash, "SHA3-256"); TokenSenderLogger.debug("Sender by Receiver Hash " + authSenderByRecHash); TokenSenderLogger.debug("TID on sender " + tid); @@ -394,56 +389,53 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce allTokens.put(partTokens.getString(i)); JSONArray alphaQuorum = new JSONArray(); - JSONArray betaQuorum = new JSONArray(); - JSONArray gammaQuorum = new JSONArray(); switch (type) { - case 1: { - writeToFile(LOGGER_PATH + "tempbeta", tid.concat(senderDidIpfsHash), false); - String betaHash = IPFSNetwork.add(LOGGER_PATH + "tempbeta", ipfs); - deleteFile(LOGGER_PATH + "tempbeta"); - - writeToFile(LOGGER_PATH + "tempgamma", tid.concat(receiverDidIpfsHash), false); - String gammaHash = IPFSNetwork.add(LOGGER_PATH + "tempgamma", ipfs); - deleteFile(LOGGER_PATH + "tempgamma"); - - quorumArray = getQuorum(senderDidIpfsHash, receiverDidIpfsHash, allTokens.length()); - break; - } + case 1: { + quorumArray = getQuorum(senderDidIpfsHash, receiverDidIpfsHash, allTokens.length()); + break; + } - case 2: { - File quorumFile = new File(DATA_PATH.concat("quorumlist.json")); - if (!quorumFile.exists()) { - TokenSenderLogger.error("Quorum List for Subnet not found"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Quorum List for Subnet not found"); - return APIResponse; - } else { - String quorumList = readFile(DATA_PATH + "quorumlist.json"); - if (quorumList != null) { - quorumArray = new JSONArray(readFile(DATA_PATH + "quorumlist.json")); - } else { - TokenSenderLogger.error("File for Quorum List for Subnet is empty"); + case 2: { + File quorumFile = new File(DATA_PATH.concat("quorumlist.json")); + if (!quorumFile.exists()) { + TokenSenderLogger.error("Quorum List for Subnet not found"); APIResponse.put("status", "Failed"); - APIResponse.put("message", "File for Quorum List for Subnet is empty"); + APIResponse.put("message", "Quorum List for Subnet not found"); return APIResponse; + } else { + String quorumList = readFile(DATA_PATH + "quorumlist.json"); + if (quorumList != null) { + quorumArray = new JSONArray(readFile(DATA_PATH + "quorumlist.json")); + JSONArray finArray = new JSONArray(); + if (quorumArray.length() > 7) { + for (int i = 0; i < 7; i++) { + finArray.put(quorumArray.get(i)); + } + quorumArray = finArray; + } + } else { + TokenSenderLogger.error("File for Quorum List for Subnet is empty"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "File for Quorum List for Subnet is empty"); + return APIResponse; + } + } + break; } + case 3: { + quorumArray = detailsObject.getJSONArray("quorum"); + break; + } + default: { + TokenSenderLogger.error("Unknown quorum type input, cancelling transaction"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Unknown quorum type input, cancelling transaction"); + return APIResponse; - break; - } - case 3: { - quorumArray = detailsObject.getJSONArray("quorum"); - break; - } - default: { - TokenSenderLogger.error("Unknown quorum type input, cancelling transaction"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Unknown quorum type input, cancelling transaction"); - return APIResponse; - - } + } } String errMessage = null; @@ -470,8 +462,8 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce TokenSenderLogger.debug("Updated quorumlist is " + quorumArray.toString()); -// //sanity check for Quorum - starts - int alphaCheck = 0, betaCheck = 0, gammaCheck = 0; + // //sanity check for Quorum - starts + int alphaCheck = 0; JSONArray sanityFailedQuorum = new JSONArray(); for (int i = 0; i < quorumArray.length(); i++) { String quorumPeerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", @@ -482,14 +474,11 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce sanityFailedQuorum.put(quorumPeerID); if (i <= 6) alphaCheck++; - if (i >= 7 && i <= 13) - betaCheck++; - if (i >= 14 && i <= 20) - gammaCheck++; + } } - if (alphaCheck > 2 || betaCheck > 2 || gammaCheck > 2) { + if (alphaCheck > 2) { APIResponse.put("did", senderDidIpfsHash); APIResponse.put("tid", "null"); APIResponse.put("status", "Failed"); @@ -498,31 +487,25 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce TokenSenderLogger.warn("Quorum: ".concat(message.concat(sanityMessage))); return APIResponse; } -// //sanity check for Quorum - Ends + // //sanity check for Quorum - Ends long startTime, endTime, totalTime; QuorumSwarmConnect(quorumArray, ipfs); - alphaSize = quorumArray.length() - 14; + alphaSize = quorumArray.length(); for (int i = 0; i < alphaSize; i++) alphaQuorum.put(quorumArray.getString(i)); - for (int i = 0; i < 7; i++) { - betaQuorum.put(quorumArray.getString(alphaSize + i)); - gammaQuorum.put(quorumArray.getString(alphaSize + 7 + i)); - } startTime = System.currentTimeMillis(); alphaPeersList = QuorumCheck(alphaQuorum, alphaSize); - betaPeersList = QuorumCheck(betaQuorum, 7); - gammaPeersList = QuorumCheck(gammaQuorum, 7); endTime = System.currentTimeMillis(); totalTime = endTime - startTime; eventLogger.debug("Quorum Check " + totalTime); - if (alphaPeersList.size() < minQuorum(alphaSize) || betaPeersList.size() < 5 || gammaPeersList.size() < 5) { + if (alphaPeersList.size() < minQuorum(alphaSize)) { updateQuorum(quorumArray, null, false, type); APIResponse.put("did", senderDidIpfsHash); APIResponse.put("tid", "null"); @@ -539,10 +522,10 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce alphaList.put(alphaPeersList.get(i)); } - int numberOfTokensToPledge = 0; - if (wholeAmount > 0) { - numberOfTokensToPledge += wholeAmount; - if (decimalAmount > 0) + numberOfTokensToPledge = 0; + if (wholeTokens.length() > 0) { + numberOfTokensToPledge += wholeTokens.length(); + if (partTokens.length() > 0) numberOfTokensToPledge += 1; } else numberOfTokensToPledge = 1; @@ -560,7 +543,8 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce dataToSendToInitiator.put("sender", senderDidIpfsHash); dataToSendToInitiator.put("receiver", receiverDidIpfsHash); - //TokenSenderLogger.debug("Details being sent to Initiator: " + dataToSendToInitiator); + // TokenSenderLogger.debug("Details being sent to Initiator: " + + // dataToSendToInitiator); boolean abort = Initiator.pledgeSetUp(dataToSendToInitiator.toString(), ipfs, 22143); if (abort) { @@ -584,8 +568,6 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce } - TokenSenderLogger.debug("Nodes that pledged tokens: " + Initiator.pledgedNodes); - /** * Send the array without sender sign calculated */ @@ -600,7 +582,8 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce lastObject.put("receiver", receiverDidIpfsHash); lastObject.put("pledgeToken", ""); lastObject.put("tokensPledgedFor", allTokens); - lastObject.put("tokensPledgedWith", Initiator.pledgedTokensArray); + lastObject.put("tokensPledgedWith", Initiator.pledgedTokensWithNodesArray); + lastObject.put("distributedObject", Initiator.distributedObject); String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); JSONArray tokenChain = new JSONArray(tokenChainFileContent); @@ -622,8 +605,9 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce file.write(challengeObject.toString()); file.close(); - TokenSenderLogger.info("Challenge Payload for txnId "+tid); - TokenSenderLogger.info("generated and saved to path "+WALLET_DATA_PATH.concat("/ChallengePayload").concat(tid).concat(".json")); + TokenSenderLogger.info("Challenge Payload for txnId " + tid); + TokenSenderLogger.info("generated and saved to path " + + WALLET_DATA_PATH.concat("/ChallengePayload").concat(tid).concat(".json")); JSONArray signedChains = new JSONArray(); JSONObject payloadSigned = new JSONObject(); @@ -665,12 +649,12 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce return APIResponse; } - //TokenSenderLogger.debug("pledge object is " + pledgeArray.toString()); + // TokenSenderLogger.debug("pledge object is " + pledgeArray.toString()); for (int i = 0; i < Initiator.quorumWithHashesArray.length(); i++) { JSONObject jsonObject = Initiator.quorumWithHashesArray.getJSONObject(i); Iterator keys = jsonObject.keys(); - //TokenSenderLogger.debug("jsonObject is " + jsonObject.toString()); + // TokenSenderLogger.debug("jsonObject is " + jsonObject.toString()); JSONObject pledgeSignedObject = new JSONObject(); String key = ""; JSONArray hashAndSignsArray = new JSONArray(); @@ -682,7 +666,7 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce JSONArray hashArray = new JSONArray(jsonObject.get(key).toString()); TokenSenderLogger.debug("@@@@@ Calculating hash for: " + hashArray); - //String hashString = calculateHash(hashArray.toString(), "SHA3-256"); + // String hashString = calculateHash(hashArray.toString(), "SHA3-256"); for (int j = 0; j < hashArray.length(); j++) { String sign = getSignFromShares(pvt, hashArray.get(j).toString()); pledgeSignedObject.put("hash", hashArray.get(j)); @@ -693,43 +677,43 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce } JSONObject signObject = new JSONObject(); signObject.put(key, hashAndSignsArray); - //TokenSenderLogger.debug("signObject is " + signObject); + // TokenSenderLogger.debug("signObject is " + signObject); quorumWithSignsArray.put(signObject); } -// for (int i = 0; i < intPart; i++) { -// JSONObject jsonObject = new JSONObject(Initiator.quorumWithHashesArray); -// TokenSenderLogger.debug("jsonObject " + jsonObject.toString()); -// Iterator keys = jsonObject.keys(); -// -// TokenSenderLogger.debug("iteratir keys is " + keys.next().toString()); -// -// String key = ""; -// while (keys.hasNext()) { -// key = keys.next(); -// TokenSenderLogger.debug("key of quorumn is " + key); -// if (jsonObject.get(key) instanceof JSONObject) { -// // do something with jsonObject here -// JSONArray hashArray = jsonObject.getJSONArray(key); -// for (int j = 0; j < hashArray.length(); j++) { -// String sign = getSignFromShares(pvt, hashArray.getString(j)); -// signsArray.put(sign); -// } -// -// } -// } -// -// TokenSenderLogger.debug("sign array is " + signsArray.toString()); -// -// JSONObject signObject = new JSONObject(); -// signObject.put("quorum", key); -// signObject.put("sign", signsArray); -// quorumWithSignsArray.put(signObject); -// } + // for (int i = 0; i < intPart; i++) { + // JSONObject jsonObject = new JSONObject(Initiator.quorumWithHashesArray); + // TokenSenderLogger.debug("jsonObject " + jsonObject.toString()); + // Iterator keys = jsonObject.keys(); + // + // TokenSenderLogger.debug("iteratir keys is " + keys.next().toString()); + // + // String key = ""; + // while (keys.hasNext()) { + // key = keys.next(); + // TokenSenderLogger.debug("key of quorumn is " + key); + // if (jsonObject.get(key) instanceof JSONObject) { + // // do something with jsonObject here + // JSONArray hashArray = jsonObject.getJSONArray(key); + // for (int j = 0; j < hashArray.length(); j++) { + // String sign = getSignFromShares(pvt, hashArray.getString(j)); + // signsArray.put(sign); + // } + // + // } + // } + // + // TokenSenderLogger.debug("sign array is " + signsArray.toString()); + // + // JSONObject signObject = new JSONObject(); + // signObject.put("quorum", key); + // signObject.put("sign", signsArray); + // quorumWithSignsArray.put(signObject); + // } payloadSigned.put("pledgeDetails", quorumWithSignsArray); - //TokenSenderLogger.debug("pledgeDetails: " + quorumWithSignsArray); + // TokenSenderLogger.debug("pledgeDetails: " + quorumWithSignsArray); FileWriter spfile = new FileWriter(WALLET_DATA_PATH.concat("/signedPayload").concat(tid).concat(".json")); spfile.write(payloadSigned.toString()); @@ -745,7 +729,7 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) throws JSONException, IOException, InterruptedException, ParseException { - //TokenSenderLogger.debug("PartB - signPayload " + signPayload); + // TokenSenderLogger.debug("PartB - signPayload " + signPayload); String senderSign = signPayload.getString("authSenderByRecHash"); JSONObject APIResponse = new JSONObject(); @@ -782,7 +766,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) } senderMutex = true; - Initiator.pledge(quorumWithSignsArray, requestedAmount, port); + Initiator.pledge(quorumWithSignsArray, numberOfTokensToPledge, port); boolean sanityCheck = sanityCheck("Receiver", receiverPeerId, ipfs, port + 10); if (!sanityCheck) { @@ -790,7 +774,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) APIResponse.put("tid", "null"); APIResponse.put("status", "Failed"); APIResponse.put("message", sanityMessage); - //TokenSenderLogger.warn(sanityMessage); + // TokenSenderLogger.warn(sanityMessage); senderMutex = false; return APIResponse; } @@ -907,7 +891,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) JSONObject newLastObject = new JSONObject(); /* * if (chainArray.length() == 0) { newLastObject.put("previousHash", ""); - * + * * } else { JSONObject secondLastObject = * chainArray.getJSONObject(chainArray.length() - 1); * secondLastObject.put("nextHash", calculateHash(tid, "SHA3-256")); @@ -949,9 +933,10 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) tokenDetails.put("part-tokenChains-PrevState", partTokenChainsPrevState); tokenDetails.put("sender", senderDidIpfsHash); tokenDetails.put("proof", proofOfWork); + tokenDetails.put("distributedObject", Initiator.distributedObject); String doubleSpendString = tokenDetails.toString(); - - //TokenSenderLogger.debug("tokenDetails is "+tokenDetails.toString()); + + // TokenSenderLogger.debug("tokenDetails is "+tokenDetails.toString()); String doubleSpend = calculateHash(doubleSpendString, "SHA3-256"); writeToFile(LOGGER_PATH + "doubleSpend", doubleSpend, false); @@ -965,13 +950,15 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) tokenObject.put("amount", requestedAmount); tokenObject.put("amountLedger", amountLedger); - if (Functions.multiplePinCheck(senderDidIpfsHash, tokenObject, ipfs) == 420) { - APIResponse.put("message", "Multiple Owners Found. Kindly re-initiate transaction"); - senderMutex = false; - return APIResponse; - } else { - TokenSenderLogger.debug("No Multiple Pins found, initating transcation"); - } + // if (Functions.multiplePinCheck(senderDidIpfsHash, tokenObject, ipfs) == 420) + // { + // APIResponse.put("message", "Multiple Owners Found. Kindly re-initiate + // transaction"); + // senderMutex = false; + // return APIResponse; + // } else { + // TokenSenderLogger.debug("No Multiple Pins found, initating transcation"); + // } /** * Sending Token Details to Receiver Receiver to authenticate Tokens (Double @@ -1013,69 +1000,78 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) return APIResponse; } else if (tokenAuth != null && (tokenAuth.startsWith("4"))) { switch (tokenAuth) { - case "419": - String pledgedTokens = input.readLine(); - JSONArray pledgedTokensArray = new JSONArray(pledgedTokens); - TokenSenderLogger.info("These tokens are pledged " + pledgedTokensArray); - TokenSenderLogger.info("Kindly re-initiate transaction"); - APIResponse.put("message", "Pledged Tokens " + pledgedTokensArray + ". Kindly re-initiate transaction"); - File pledgeFile = new File(PAYMENTS_PATH.concat("PledgedTokens.json")); - if (!pledgeFile.exists()) { - pledgeFile.createNewFile(); - writeToFile(PAYMENTS_PATH.concat("PledgedTokens.json"), pledgedTokensArray.toString(), false); - } else { - String pledgedContent = readFile(PAYMENTS_PATH.concat("PledgedTokens.json")); - JSONArray pledgedArray = new JSONArray(pledgedContent); - for (int i = 0; i < pledgedTokensArray.length(); i++) { - pledgedArray.put(pledgedTokensArray.getJSONObject(i)); + case "418": + String forkedTokens = input.readLine(); + JSONArray forkedTokensArray = new JSONArray(forkedTokens); + TokenSenderLogger.info("These tokens are forked " + forkedTokensArray); + TokenSenderLogger.info("Kindly re-initiate transaction"); + APIResponse.put("message", + "Pledged Tokens " + forkedTokensArray + ". Kindly re-initiate transaction"); + break; + case "419": + String pledgedTokens = input.readLine(); + JSONArray pledgedTokensArray = new JSONArray(pledgedTokens); + TokenSenderLogger.info("These tokens are pledged " + pledgedTokensArray); + TokenSenderLogger.info("Kindly re-initiate transaction"); + APIResponse.put("message", + "Pledged Tokens " + pledgedTokensArray + ". Kindly re-initiate transaction"); + File pledgeFile = new File(PAYMENTS_PATH.concat("PledgedTokens.json")); + if (!pledgeFile.exists()) { + pledgeFile.createNewFile(); + writeToFile(PAYMENTS_PATH.concat("PledgedTokens.json"), pledgedTokensArray.toString(), false); + } else { + String pledgedContent = readFile(PAYMENTS_PATH.concat("PledgedTokens.json")); + JSONArray pledgedArray = new JSONArray(pledgedContent); + for (int i = 0; i < pledgedTokensArray.length(); i++) { + pledgedArray.put(pledgedTokensArray.getJSONObject(i)); + } + writeToFile(PAYMENTS_PATH.concat("PledgedTokens.json"), pledgedArray.toString(), false); } - writeToFile(PAYMENTS_PATH.concat("PledgedTokens.json"), pledgedArray.toString(), false); - } - break; - case "420": - String doubleSpent = input.readLine(); - String owners = input.readLine(); - JSONArray ownersArray = new JSONArray(owners); - TokenSenderLogger.info("Multiple Owners for " + doubleSpent); - TokenSenderLogger.info("Owners " + ownersArray); - TokenSenderLogger.info("Kindly re-initiate transaction"); - APIResponse.put("message", "Multiple Owners for " + doubleSpent + " Owners: " + ownersArray - + ". Kindly re-initiate transaction"); - break; - case "421": - TokenSenderLogger.info("Consensus ID not unique. Kindly re-initiate transaction"); - APIResponse.put("message", "Consensus ID not unique. Kindly re-initiate transaction"); - break; - case "422": - TokenSenderLogger.info("Tokens Not Verified. Kindly re-initiate transaction"); - APIResponse.put("message", "Tokens Not Verified. Kindly re-initiate transaction"); - break; - case "423": - TokenSenderLogger.info("Broken Cheque Chain. Kindly re-initiate transaction"); - APIResponse.put("message", "Broken Cheque Chain. Kindly re-initiate transaction"); - break; - - case "425": - TokenSenderLogger.info("Token wholly spent already. Kindly re-initiate transaction"); - APIResponse.put("message", "Token wholly spent already. Kindly re-initiate transaction"); - break; - - case "426": - TokenSenderLogger.info("Contains Invalid Tokens. Kindly check tokens in your wallet"); - APIResponse.put("message", "Contains Invalid Tokens. Kindly check tokens in your wallet"); - break; - - case "430": - TokenSenderLogger - .info("Token chain verification has failed. Whole token chain/chains could not be verified."); - APIResponse.put("message", "Token Chain/(s) could not be verified."); - break; - - case "431": - TokenSenderLogger - .info("Token chain verification has failed. Part token chain/chains could not be verified."); - APIResponse.put("message", "Token Chain/(s) could not be verified."); - break; + break; + case "420": + String doubleSpent = input.readLine(); + String owners = input.readLine(); + JSONArray ownersArray = new JSONArray(owners); + TokenSenderLogger.info("Multiple Owners for " + doubleSpent); + TokenSenderLogger.info("Owners " + ownersArray); + TokenSenderLogger.info("Kindly re-initiate transaction"); + APIResponse.put("message", "Multiple Owners for " + doubleSpent + " Owners: " + ownersArray + + ". Kindly re-initiate transaction"); + break; + case "421": + TokenSenderLogger.info("Consensus ID not unique. Kindly re-initiate transaction"); + APIResponse.put("message", "Consensus ID not unique. Kindly re-initiate transaction"); + break; + case "422": + TokenSenderLogger.info("Tokens Not Verified. Kindly re-initiate transaction"); + APIResponse.put("message", "Tokens Not Verified. Kindly re-initiate transaction"); + break; + case "423": + TokenSenderLogger.info("Broken Cheque Chain. Kindly re-initiate transaction"); + APIResponse.put("message", "Broken Cheque Chain. Kindly re-initiate transaction"); + break; + + case "425": + TokenSenderLogger.info("Token wholly spent already. Kindly re-initiate transaction"); + APIResponse.put("message", "Token wholly spent already. Kindly re-initiate transaction"); + break; + + case "426": + TokenSenderLogger.info("Contains Invalid Tokens. Kindly check tokens in your wallet"); + APIResponse.put("message", "Contains Invalid Tokens. Kindly check tokens in your wallet"); + break; + + case "430": + TokenSenderLogger + .info("Token chain verification has failed. Whole token chain/chains could not be verified."); + APIResponse.put("message", "Token Chain/(s) could not be verified."); + break; + + case "431": + TokenSenderLogger + .info("Token chain verification has failed. Part token chain/chains could not be verified."); + APIResponse.put("message", "Token Chain/(s) could not be verified."); + break; } executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); @@ -1101,14 +1097,12 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) dataObject.put("senderDidIpfs", senderDidIpfsHash); dataObject.put("token", wholeTokens.toString()); dataObject.put("alphaList", alphaPeersList); - dataObject.put("betaList", betaPeersList); - dataObject.put("gammaList", gammaPeersList); dataObject.put("sign", signPayload.getString("authSenderByRecHash")); dataObject.put("hash", authSenderByRecHash); InitiatorProcedure.consensusSetUp(dataObject.toString(), ipfs, SEND_PORT + 100, alphaSize, ""); - if (InitiatorConsensus.quorumSignature.length() < (minQuorum(alphaSize) + 2 * minQuorum(7))) { + if (InitiatorConsensus.quorumSignature.length() < (minQuorum(alphaSize))) { TokenSenderLogger.debug("Consensus Failed"); senderDetails2Receiver.put("status", "Consensus Failed"); output.println(senderDetails2Receiver); @@ -1129,10 +1123,8 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) TokenSenderLogger.debug("Consensus Reached"); senderDetails2Receiver.put("status", "Consensus Reached"); senderDetails2Receiver.put("quorumsign", InitiatorConsensus.quorumSignature.toString()); - senderDetails2Receiver.put("pledgeDetails", Initiator.pledgedTokensArray); + senderDetails2Receiver.put("pledgeDetails", Initiator.pledgedTokensWithNodesArray); - - output.println(senderDetails2Receiver); TokenSenderLogger.debug("Quorum Signatures length " + InitiatorConsensus.quorumSignature.length()); @@ -1211,10 +1203,11 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) return APIResponse; } - //TokenSenderLogger.debug("newBlocksForTokenChains is " + newBlocksForTokenChains); - //TokenSenderLogger.debug(""); + // TokenSenderLogger.debug("newBlocksForTokenChains is " + + // newBlocksForTokenChains); + // TokenSenderLogger.debug(""); - //TokenSenderLogger.debug("lastObJsonArray is " + lastObJsonArray.toString()); + // TokenSenderLogger.debug("lastObJsonArray is " + lastObJsonArray.toString()); JSONArray newTokenChainBlocks = new JSONArray(newBlocksForTokenChains); JSONArray hashAndSigns = new JSONArray(); @@ -1228,19 +1221,24 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) senderChainMap.remove("pledgeToken"); receiverChainMap.remove("pledgeToken"); - //TokenSenderLogger.debug("--------"); - //TokenSenderLogger.debug("senderChainMap " + senderChainMap.keySet().toString()); - //TokenSenderLogger.debug("senderChainMap " + senderChainMap.values().toString()); + // TokenSenderLogger.debug("--------"); + // TokenSenderLogger.debug("senderChainMap " + + // senderChainMap.keySet().toString()); + // TokenSenderLogger.debug("senderChainMap " + + // senderChainMap.values().toString()); - //TokenSenderLogger.debug("--------"); - //TokenSenderLogger.debug("receiverChainMap " + receiverChainMap.keySet().toString()); - //TokenSenderLogger.debug("receiverChainMap " + receiverChainMap.values().toString()); + // TokenSenderLogger.debug("--------"); + // TokenSenderLogger.debug("receiverChainMap " + + // receiverChainMap.keySet().toString()); + // TokenSenderLogger.debug("receiverChainMap " + + // receiverChainMap.values().toString()); - //TokenSenderLogger.debug("--------"); + // TokenSenderLogger.debug("--------"); - //TokenSenderLogger.debug(senderChainMap.equals(receiverChainMap) + " is the chainmap status"); + // TokenSenderLogger.debug(senderChainMap.equals(receiverChainMap) + " is the + // chainmap status"); - //TokenSenderLogger.debug("signedChains is " + signedChains.toString()); + // TokenSenderLogger.debug("signedChains is " + signedChains.toString()); if (senderChainMap.equals(receiverChainMap)) { // String PvtKeySign = @@ -1273,32 +1271,35 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) output.println(hashAndSigns.toString()); // Sender requests for new block that is going to be added to the part Token // chains. -// output.println("Request for Part Token Chains to be hashed"); - -// String req_newPartTokenChains; -// try { -// req_newPartTokenChains = input.readLine(); -// TokenSenderLogger.debug("Hashing and Signing Part Token Chains."); -// } catch (SocketException e) { -// TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " could'nt send part token chain blocks for hashing and signing"); -// executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); -// output.close(); -// input.close(); -// senderSocket.close(); -// senderMutex = false; -// updateQuorum(quorumArray, null, false, type); -// APIResponse.put("did", senderDidIpfsHash); -// APIResponse.put("tid", "null"); -// APIResponse.put("status", "Failed"); -// APIResponse.put("message", "Receiver " + receiverDidIpfsHash + "could'nt send part token chain blocks for hashing and signing"); -// -// return APIResponse; -// } -// -// JSONObject newPartTokenChains= new JSONObject(req_newPartTokenChains); -// - -// output.println(hashesAndSigns_partTokenChains.toString()); //Sending the hashes and signs for the part token chains sent by receiver. + // output.println("Request for Part Token Chains to be hashed"); + + // String req_newPartTokenChains; + // try { + // req_newPartTokenChains = input.readLine(); + // TokenSenderLogger.debug("Hashing and Signing Part Token Chains."); + // } catch (SocketException e) { + // TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " could'nt send + // part token chain blocks for hashing and signing"); + // executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + // output.close(); + // input.close(); + // senderSocket.close(); + // senderMutex = false; + // updateQuorum(quorumArray, null, false, type); + // APIResponse.put("did", senderDidIpfsHash); + // APIResponse.put("tid", "null"); + // APIResponse.put("status", "Failed"); + // APIResponse.put("message", "Receiver " + receiverDidIpfsHash + "could'nt send + // part token chain blocks for hashing and signing"); + // + // return APIResponse; + // } + // + // JSONObject newPartTokenChains= new JSONObject(req_newPartTokenChains); + // + + // output.println(hashesAndSigns_partTokenChains.toString()); //Sending the + // hashes and signs for the part token chains sent by receiver. TokenSenderLogger.debug("Unpinned Tokens"); output.println("Unpinned"); @@ -1353,8 +1354,8 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) } TokenSenderLogger.debug("3"); - //TokenSenderLogger.debug("Whole tokens: " + wholeTokens); - //TokenSenderLogger.debug("Part tokens: " + partTokens); + // TokenSenderLogger.debug("Whole tokens: " + wholeTokens); + // TokenSenderLogger.debug("Part tokens: " + partTokens); output.println(InitiatorProcedure.essential); String respAuth; @@ -1479,7 +1480,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) JSONObject newLastObject = new JSONObject(); /* * if (chainArray.length() == 0) { newLastObject.put("previousHash", ""); - * + * * } else { JSONObject secondLastObject = * chainArray.getJSONObject(chainArray.length() - 1); * secondLastObject.put("nextHash", calculateHash(tid, "SHA3-256")); @@ -1503,7 +1504,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) output.println("New part token chain to be hashed"); output.println(chainArray.toString()); - //TokenSenderLogger.debug("!@#$% 1: " + chainArray); + // TokenSenderLogger.debug("!@#$% 1: " + chainArray); String finalPartTokenChain_string; try { @@ -1525,7 +1526,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) return APIResponse; } - //TokenSenderLogger.debug("!@#$% 2: " + finalPartTokenChain_string); + // TokenSenderLogger.debug("!@#$% 2: " + finalPartTokenChain_string); JSONArray newPartTokenChain = new JSONArray(finalPartTokenChain_string); writeToFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json", newPartTokenChain.toString(), false); @@ -1561,9 +1562,9 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) /* * if (chainArray.length() == 0) { newLastObject.put("previousHash", ""); - * + * * } else { - * + * * JSONObject secondLastObject = chainArray.getJSONObject(chainArray.length() - * 1); secondLastObject.put("nextHash", calculateHash(tid, "SHA3-256")); * newLastObject.put("previousHash", calculateHash( @@ -1605,7 +1606,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) } output.println("Old part token chains to be hashed"); output.println(partTokenChainsToBeSentForHashing.toString()); - //TokenSenderLogger.debug("!@#$% 3: " + partTokenChainsToBeSentForHashing); + // TokenSenderLogger.debug("!@#$% 3: " + partTokenChainsToBeSentForHashing); String hashedPartTokenChains_string; try { @@ -1628,7 +1629,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) return APIResponse; } - //TokenSenderLogger.debug("!@#$% 4: " + hashedPartTokenChains_string); + // TokenSenderLogger.debug("!@#$% 4: " + hashedPartTokenChains_string); JSONObject finalPartTokenChains = new JSONObject(hashedPartTokenChains_string); for (int i = 0; i < partTokens.length(); i++) { @@ -1719,7 +1720,7 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) TokenSenderLogger.debug(response.toString()); } - + senderMutex = false; resetVariables(); return APIResponse; diff --git a/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java b/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java index 6cbf06a6..c3d705a2 100644 --- a/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java +++ b/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java @@ -4,525 +4,529 @@ import io.ipfs.api.IPFS; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; -import org.bouncycastle.LICENSE; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintStream; +import java.io.*; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import java.security.PrivateKey; -import java.util.HashMap; import java.util.Iterator; -import java.util.List; -import static com.rubix.NFTResources.NFTFunctions.*; +import static com.rubix.NFTResources.NFTFunctions.getPvtKey; import static com.rubix.Resources.Functions.*; import static com.rubix.Resources.IPFSNetwork.forward; import static com.rubix.Resources.IPFSNetwork.swarmConnectP2P; public class Initiator { - public static Logger PledgeInitiatorLogger = Logger.getLogger(Initiator.class); - public static JSONArray pledgedNodes = new JSONArray(); - public static JSONObject abortReason = new JSONObject(); - public static JSONArray tokenList = new JSONArray(); - - public static JSONArray nodesToPledgeTokens = new JSONArray(); - public static JSONObject quorumDetails = new JSONObject(); - public static JSONArray quorumWithHashesArray = new JSONArray(); - public static String sender; - public static String receiver; - public static String pvt; - public static String tid; - public static String keyPass; - public static JSONObject quorumHashObject = new JSONObject(); - public static boolean pledged = false; - - - public static JSONArray pledgedTokensArray = new JSONArray(); - - public static boolean abort = false; - - public static void resetVariables() { - - pledgedNodes = new JSONArray(); - abortReason = new JSONObject(); - tokenList = new JSONArray(); - nodesToPledgeTokens = new JSONArray(); - quorumDetails = new JSONObject(); - quorumWithHashesArray = new JSONArray(); - sender = ""; - receiver = ""; - pvt = ""; - tid = ""; - keyPass = ""; - quorumHashObject = new JSONObject(); - pledgedTokensArray = new JSONArray(); - abort = false; - pledged = false; - - } - - public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONException, IOException { - resetVariables(); - PledgeInitiatorLogger.debug("Initiator Calling"); - abortReason = new JSONObject(); - abort = false; - pledgedNodes = new JSONArray(); - JSONObject dataObject = new JSONObject(data); - // PledgeInitiatorLogger.debug("pledgeSetUp dataObject is - // "+dataObject.toString()); - - JSONArray alphaList = dataObject.getJSONArray("alphaList"); - pvt = dataObject.getString("pvt"); - tid = dataObject.getString("tid"); - String keyPass = dataObject.getString("pvtKeyPass"); - sender = dataObject.getString("sender"); - receiver = dataObject.getString("receiver"); - // HashMap> tokenList = (HashMap>) - // dataObject.get("tokenList"); - tokenList = dataObject.getJSONArray("tokenList"); - - Socket qSocket = null; - int tokensCount = dataObject.getInt("amount"); - for (int i = 0; i < alphaList.length(); i++) { - PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); - String quorumID = alphaList.getString(i); - swarmConnectP2P(quorumID, ipfs); - syncDataTable(null, quorumID); - String quorumDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", quorumID); - String quorumWidIpfsHash = getValues(DATA_PATH + "DataTable.json", "walletHash", "peerid", quorumID); - nodeData(quorumDidIpfsHash, quorumWidIpfsHash, ipfs); - String appName = quorumID.concat("alphaPledge"); - - PledgeInitiatorLogger.debug("Quorum ID " + quorumID + " AppName " + appName); - forward(appName, PORT, quorumID); - PledgeInitiatorLogger.debug("Connected to " + quorumID + "on port " + (PORT) + "with AppName" + appName); - - qSocket = new Socket("127.0.0.1", PORT); - BufferedReader qIn = new BufferedReader(new InputStreamReader(qSocket.getInputStream())); - PrintStream qOut = new PrintStream(qSocket.getOutputStream()); - - JSONObject dataArray = new JSONObject(); - dataArray.put("amount", tokensCount); - dataArray.put("senderPID", getPeerID(DATA_PATH.concat("DID.json"))); - qOut.println(dataArray.toString()); - PledgeInitiatorLogger.debug("Sent request to alpha node: " + quorumID); - - String qResponse = ""; - try { - qResponse = qIn.readLine(); - } catch (SocketException e) { - PledgeInitiatorLogger.warn("Quorum " + quorumID + " is unable to respond!"); - IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); - qSocket.close(); - } - - if (qResponse != null) { - JSONObject pledgeObject = new JSONObject(qResponse); - if (pledgeObject.getString("pledge").equals("Tokens")) { - PledgeInitiatorLogger.debug("Quorum " + quorumID + " is pledging Tokens"); - JSONArray tokenDetails = pledgeObject.getJSONArray("tokenDetails"); - - JSONArray hashesArray = new JSONArray(); - for (int k = 0; k < tokenDetails.length(); k++) { - - JSONObject tokenObject = tokenDetails.getJSONObject(k); - JSONArray tokenChain = tokenObject.getJSONArray("chain"); - JSONObject lasObject = tokenChain.getJSONObject(tokenChain.length() - 1); - if (lasObject.optString("pledgeToken").length() > 0) { - - /* - * added code block to verify unpledged tokens proof - */ - if (tokenObject.has("cid")) { - String token = tokenObject.getString("token"); - String cid = tokenObject.getString("cid"); - String proof = IPFSNetwork.get(cid, ipfs); - File proofFile = new File(TOKENCHAIN_PATH + "Proof/"); - if (!proofFile.exists()) { - proofFile.mkdirs(); - } - writeToFile(proofFile.getAbsolutePath() + "/" + token + ".proof", proof, false); - - String tokenName = lasObject.getString("pledgeToken"); - String did = lasObject.getString("receiver"); - String tidForProof = lasObject.getString("tid"); +<<<<<<< HEAD + public static Logger PledgeInitiatorLogger = Logger.getLogger(Initiator.class); + public static JSONArray pledgedNodes = new JSONArray(); + public static JSONObject abortReason = new JSONObject(); + public static JSONArray tokenList = new JSONArray(); + public static JSONObject distributedObject; + public static JSONArray nodesToPledgeTokens = new JSONArray(); + public static JSONObject quorumDetails = new JSONObject(); + public static JSONArray quorumWithHashesArray = new JSONArray(); + public static String sender; + public static String receiver; + public static String pvt; + public static String tid; + public static String keyPass; + public static JSONObject quorumHashObject = new JSONObject(); + public static boolean pledged = false; + public static JSONArray pledgedTokensWithNodesArray = new JSONArray(); + public static JSONArray alphaList = new JSONArray(); + + + public static JSONArray pledgedTokensArray = new JSONArray(); + + public static boolean abort = false; + + public static void resetVariables() { + alphaList = new JSONArray(); + pledgedTokensWithNodesArray = new JSONArray(); + distributedObject = new JSONObject(); + pledgedNodes = new JSONArray(); + abortReason = new JSONObject(); + tokenList = new JSONArray(); + nodesToPledgeTokens = new JSONArray(); + quorumDetails = new JSONObject(); + quorumWithHashesArray = new JSONArray(); + sender = ""; + receiver = ""; + pvt = ""; + tid = ""; + keyPass = ""; + quorumHashObject = new JSONObject(); + pledgedTokensArray = new JSONArray(); + abort = false; + pledged = false; + + } + + public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONException, IOException { + resetVariables(); + PledgeInitiatorLogger.debug("Initiator Calling"); + pledgedNodes = new JSONArray(); + JSONObject dataObject = new JSONObject(data); + + alphaList = dataObject.getJSONArray("alphaList"); + pvt = dataObject.getString("pvt"); + tid = dataObject.getString("tid"); + String keyPass = dataObject.getString("pvtKeyPass"); + sender = dataObject.getString("sender"); + receiver = dataObject.getString("receiver"); + tokenList = dataObject.getJSONArray("tokenList"); + + Socket qSocket = null; + int tokensCount = dataObject.getInt("amount"); + PledgeInitiatorLogger.debug("Amount Received; " + tokensCount); + for (int i = 0; i < alphaList.length(); i++) { + PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); + String quorumID = alphaList.getString(i); + swarmConnectP2P(quorumID, ipfs); + syncDataTable(null, quorumID); + String quorumDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", quorumID); + String quorumWidIpfsHash = getValues(DATA_PATH + "DataTable.json", "walletHash", "peerid", quorumID); + nodeData(quorumDidIpfsHash, quorumWidIpfsHash, ipfs); + String appName = quorumID.concat("alphaPledge"); + + PledgeInitiatorLogger.debug("Quorum ID " + quorumID + " AppName " + appName); + forward(appName, PORT, quorumID); + PledgeInitiatorLogger.debug("Connected to " + quorumID + "on port " + (PORT) + "with AppName" + appName); + + qSocket = new Socket("127.0.0.1", PORT); + BufferedReader qIn = new BufferedReader(new InputStreamReader(qSocket.getInputStream())); + PrintStream qOut = new PrintStream(qSocket.getOutputStream()); + + JSONObject dataArray = new JSONObject(); + dataArray.put("amount", tokensCount); + dataArray.put("senderPID", getPeerID(DATA_PATH.concat("DID.json"))); + qOut.println(dataArray.toString()); + PledgeInitiatorLogger.debug("Sent request to alpha node: " + quorumID); + + String qResponse = ""; + try { + qResponse = qIn.readLine(); + } catch (SocketException e) { + PledgeInitiatorLogger.warn("Quorum " + quorumID + " is unable to respond!"); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); + qSocket.close(); + } + + if (qResponse != null) { + JSONObject pledgeObject = new JSONObject(qResponse); + if (pledgeObject.getString("pledge").equals("Tokens")) { + JSONArray tokenDetails = pledgeObject.getJSONArray("tokenDetails"); + PledgeInitiatorLogger.debug("Quorum " + quorumID + " is pledging Tokens: " + tokenDetails); + + JSONArray hashesArray = new JSONArray(); + for (int k = 0; k < tokenDetails.length(); k++) { + + JSONObject tokenObject = tokenDetails.getJSONObject(k); + JSONArray tokenChain = tokenObject.getJSONArray("chain"); + JSONObject lasObject = tokenChain.getJSONObject(tokenChain.length() - 1); + if (lasObject.optString("pledgeToken").length() > 0) { + PledgeInitiatorLogger.debug(tokenObject.getString("tokenHash") +" is a recently unpledged token"); + /** + * code block to verify unpledged tokens proof + */ + if (tokenObject.has("cid")) { + String token = tokenObject.getString("token"); + String cid = tokenObject.getString("cid"); + String proof = IPFSNetwork.get(cid, ipfs); + File proofFile = new File(TOKENCHAIN_PATH + "Proof/"); + if (!proofFile.exists()) { + proofFile.mkdirs(); + } + writeToFile(proofFile.getAbsolutePath() + "/" + token + ".proof", proof, false); + + String tokenName = lasObject.getString("pledgeToken"); + String did = lasObject.getString("receiver"); + String tidForProof = lasObject.getString("tid"); PledgeInitiatorLogger.debug("tid for Proof verification "+ tidForProof); - pledged = Unpledge.verifyProof(tokenName, did, tidForProof); - - if (!pledged) { - PledgeInitiatorLogger.debug("This token has already been pledged - Aborting"); - PledgeInitiatorLogger.debug("4. Setting abort to true"); - abortReason.put("Quorum", quorumID); - abortReason.put("Reason", - "Token " + tokenObject.getString("tokenHash") - + " has already been pledged"); - //abort = true; - qSocket.close(); - //return abort; - } - - PledgeInitiatorLogger.debug("tid for current txn "+tid); - JSONObject pledgeNewObject = new JSONObject(); - pledgeNewObject.put("sender", sender); - pledgeNewObject.put("receiver", receiver); - pledgeNewObject.put("tid", tid); - pledgeNewObject.put("pledgeToken", tokenObject.getString("tokenHash")); - pledgeNewObject.put("tokensPledgedFor", tokenList); - pledgeNewObject.put("tokensPledgedWith", tokenObject.getString("tokenHash")); - - // pledgedTokensArray.put(tokenObject.getString("tokenHash")); - - tokenChain.put(pledgeNewObject); - //PledgeInitiatorLogger.debug("@@@@@ Chain to hash: " + tokenChain); - - //PledgeInitiatorLogger.debug("pledgeNewObject is " + pledgeNewObject); - String chainHashString = calculateHash(tokenChain.toString(), "SHA3-256"); - - //PledgeInitiatorLogger.debug("chainHashString calculated in partA "+chainHashString); - hashesArray.put(chainHashString); - - if (proofFile.exists() && pledged) { - proofFile.delete(); - } - - } else { - PledgeInitiatorLogger.debug("This token has already been pledged - Aborting"); - PledgeInitiatorLogger.debug("4. Setting abort to true"); - abortReason.put("Quorum", quorumID); - abortReason.put("Reason", - "Token " + tokenObject.getString("tokenHash") + " has already been pledged"); - //abort = true; - qSocket.close(); - //return abort; - } - } else { - JSONObject pledgeNewObject = new JSONObject(); - pledgeNewObject.put("sender", sender); - pledgeNewObject.put("receiver", receiver); - pledgeNewObject.put("tid", tid); - pledgeNewObject.put("pledgeToken", tokenObject.getString("tokenHash")); - pledgeNewObject.put("tokensPledgedFor", tokenList); - pledgeNewObject.put("tokensPledgedWith", tokenObject.getString("tokenHash")); - - // pledgedTokensArray.put(tokenObject.getString("tokenHash")); - - tokenChain.put(pledgeNewObject); - //PledgeInitiatorLogger.debug("@@@@@ Chain to hash: " + tokenChain); - - //PledgeInitiatorLogger.debug("pledgeNewObject is " + pledgeNewObject); - String chainHashString = calculateHash(tokenChain.toString(), "SHA3-256"); - hashesArray.put(chainHashString); - - } - } - quorumHashObject.put(quorumID, hashesArray); - quorumWithHashesArray.put(quorumHashObject); - quorumDetails.put("tokenDetails", tokenDetails); - - //PledgeInitiatorLogger.debug("quorumHashObject: " + quorumHashObject.toString()); - //PledgeInitiatorLogger.debug("quorumWithHashesArray is " + quorumWithHashesArray.toString()); - - PledgeInitiatorLogger.debug("tokensCount: " + tokensCount); - quorumDetails.put("ID", quorumID); - quorumDetails.put("count", tokenDetails.length()); - nodesToPledgeTokens.put(quorumDetails); - tokensCount -= tokenDetails.length(); - PledgeInitiatorLogger - .debug("Contacted Node " + quorumID + " for Pledging - Over with abort status: " + abort); - IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); - qSocket.close(); - PledgeInitiatorLogger.debug("tokensCount: " + tokensCount); - if (tokensCount == 0) - break; - - } else { - IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); - qSocket.close(); - PledgeInitiatorLogger.debug(quorumID+ " no tokens to pledge. next quorm Id"); - - } - } else { - PledgeInitiatorLogger.debug("6. Setting abort to true"); - abortReason.put("Quorum", quorumID); - abortReason.put("Reason", "Response is null"); - abort = true; - PledgeInitiatorLogger.debug("Response is null"); - IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); - qSocket.close(); - return abort; - } - //return abort; - } - - PledgeInitiatorLogger.debug("Closing all connections..."); - for (int i = 0; i < alphaList.length(); i++) { - String quorumID = alphaList.getString(i); - IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); - qSocket.close(); - } - - PledgeInitiatorLogger.debug("Token Count: " + tokensCount); - if (tokensCount > 0) { - PledgeInitiatorLogger.debug("Quorum Nodes cannot Pledge, Aborting..."); - abortReason.put("Reason", "Quorum Nodes cannot Pledge, Aborting..."); - abort = true; - return true; - } - return abort; - } - - public static boolean pledge(JSONArray pledgeDetails, double amount, int PORT) - throws JSONException, UnknownHostException, IOException { - - Double tokensPledged = amount; - //PledgeInitiatorLogger.debug("pledgeDetails in pledge is " + pledgeDetails.toString()); - - if (!abort) { - PledgeInitiatorLogger.debug("Initating pledging"); - // PledgeInitiatorLogger.debug("Tokens can be pledged from " + - // nodesToPledgeTokens); - for (int j = 0; j < nodesToPledgeTokens.length(); j++) { - String quorumID = nodesToPledgeTokens.getJSONObject(j).getString("ID"); - String appName = quorumID.concat("alphaPledge"); - - PledgeInitiatorLogger.debug("Quorum " + quorumID + " pledging"); - PledgeInitiatorLogger.debug("Quorum ID " + quorumID + " AppName " + appName); - forward(appName, PORT, quorumID); - PledgeInitiatorLogger - .debug("Connected to " + quorumID + "on port " + (PORT) + "with AppName" + appName); - - Socket qSocket1 = new Socket("127.0.0.1", PORT); - BufferedReader qIn = new BufferedReader(new InputStreamReader(qSocket1.getInputStream())); - PrintStream qOut = new PrintStream(qSocket1.getOutputStream()); - - JSONObject object = new JSONObject(); - object.put("PledgeTokens", true); - object.put("amount", nodesToPledgeTokens.getJSONObject(j).getInt("count")); - object.put("senderPID", getPeerID(DATA_PATH.concat("DID.json"))); - qOut.println(object.toString()); - PledgeInitiatorLogger.debug("Sent request to alpha node: " + quorumID + ": " + object.toString()); - - String qResponse = ""; - try { - qResponse = qIn.readLine(); - } catch (SocketException e) { - PledgeInitiatorLogger.warn("Quorum " + quorumID + " is unable to respond!"); - IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); - } - - JSONArray tokens = new JSONArray(); - if (qResponse != null) { - JSONArray tokenDetails = new JSONArray(qResponse); - //PledgeInitiatorLogger.debug("TokenDetails is " + tokenDetails.toString()); - JSONArray newChains = new JSONArray(); - for (int k = 0; k < tokenDetails.length(); k++) { - JSONObject tokenObject = tokenDetails.getJSONObject(k); - JSONArray tokenChain = tokenObject.getJSONArray("chain"); - String tokenHash = tokenObject.getString("tokenHash"); - PledgeInitiatorLogger.debug(tokenHash); - PledgeInitiatorLogger.debug("in json " + tokenObject.getString("tokenHash")); - - JSONObject lastObject = tokenChain.getJSONObject(tokenChain.length() - 1); - PledgeInitiatorLogger.debug("tokenHash is " + tokenHash); - - if (lastObject.optString("pledgeToken").length() > 0 && !pledged) { - PledgeInitiatorLogger - .debug("Quorum " + quorumID + " sent a token which is already pledged"); - abortReason.put("Quorum", quorumID); - abortReason.put("Reason", "Token " + tokenHash + " has been already pledged"); - abort = true; - qSocket1.close(); - return abort; - - } else { - JSONObject pledgeObject = new JSONObject(); - pledgeObject.put("sender", sender); - pledgeObject.put("receiver", receiver); - pledgeObject.put("tid", tid); - pledgeObject.put("pledgeToken", tokenHash); - pledgeObject.put("tokensPledgedFor", tokenList); - pledgeObject.put("tokensPledgedWith", tokenObject.getString("tokenHash")); - tokenChain.put(pledgeObject); - - pledgedTokensArray.put(tokenObject.getString("tokenHash")); - - // lastObject.put("pledgeToken", dataObject.getString("tid")); - // - // tokenChain.remove(0); - // JSONArray newTokenChain = new JSONArray(); - // newTokenChain.put(lastObject); - // for (int l = 0; l < tokenChain.length(); l++) { - // newTokenChain.put(tokenChain.getJSONObject(l)); - // } - PrivateKey pvtKey = getPvtKey(keyPass, 1); - - String hashForTokenChain = calculateHash(tokenChain.toString(), "SHA3-256"); - /* FileWriter spfile = new FileWriter( - WALLET_DATA_PATH.concat("/hashForTokenChain").concat(tid).concat(".json")); - spfile.write(tokenChain.toString()); - spfile.close(); */ - - - // for (int i = 0; i < pledgeDetails.length(); i++) { - - //PledgeInitiatorLogger.debug("!@#$%^& pledgeDetails is " + pledgeDetails.getJSONObject(j)); - - //PledgeInitiatorLogger.debug("!@#$%^& hashForTokenChain is "+ hashForTokenChain); - - tokenChain.remove(tokenChain.length() - 1); - /* FileWriter pfile = new FileWriter( - WALLET_DATA_PATH.concat("/hashForTokenChainRemoved").concat(tid).concat(".json")); - pfile.write(tokenChain.toString()); - pfile.close(); */ - - - //PledgeInitiatorLogger.debug("!@#$%^& hashForTokenChain after removing new last object "+ calculateHash(tokenChain.toString(), "SHA3-256")); - - pledgeObject.put("hash", hashForTokenChain); - pledgeObject.put("pvtShareBits", fetchSign(pledgeDetails, hashForTokenChain)); - - //PledgeInitiatorLogger.debug("pledgeObject is " + pledgeObject.toString()); - - // pledgeObject.put("pvtKeySign", PvtKeySign); - - tokenChain.put(pledgeObject); - newChains.put(tokenChain); - - tokensPledged -= nodesToPledgeTokens.getJSONObject(j).getInt("count"); - tokens.put(tokenHash); - - //PledgeInitiatorLogger.debug("newChains length is " + newChains.length()); - //PledgeInitiatorLogger.debug("newChains is " + newChains.toString()); - } - } - - /* - * JSONObject jsonObject = pledgeDetails.getJSONObject(j); Iterator keys - * = jsonObject.keys(); - * - * PledgeInitiatorLogger.debug("!@#$%^& The object is " + - * jsonObject.toString()); String key = ""; while (keys.hasNext()) { key = - * keys.next(); PledgeInitiatorLogger.debug("!@#$%^& key of quorumn is " + key); - * if (jsonObject.get(key) instanceof JSONArray) { // do something with - * jsonObject here - * - * JSONArray hashArray = new JSONArray(jsonObject.get(key).toString()); - * PledgeInitiatorLogger.debug("!@#$%^& hash array: " + hashArray); - * - * for(int l = 0; l < hashArray.length(); l++) { JSONObject hashObject = - * hashArray.getJSONObject(k); - * PledgeInitiatorLogger.debug("!@#$%^& hash object: " + hashObject); - * - * - * signString = hashObject.getString("sign"); hashString = - * hashObject.getString("hash"); - * - * PledgeInitiatorLogger.debug("signString is " + signString); - * PledgeInitiatorLogger.debug("hashString is " + hashString); - * - * // TODO tokenChain.remove(tokenChain.length() - 1); pledgeObject.put("hash", - * hashString); pledgeObject.put("pvtShareBits", signString); // - * pledgeObject.put("pvtKeySign", PvtKeySign); - * - * tokenChain.put(pledgeObject); newChains.put(tokenChain); - * - * tokensPledged -= nodesToPledgeTokens.getJSONObject(j).getInt("count"); - * tokens.put(tokenHash); - * - * } PledgeInitiatorLogger.debug("newChains length is "+newChains.length()); - * PledgeInitiatorLogger.debug("newChains is "+newChains.toString()); } } - */ - - // } - - // } - // } - JSONObject pledgeObjectDetails = new JSONObject(); - pledgeObjectDetails.put("did", quorumID); - pledgeObjectDetails.put("tokens", tokens); - pledgeDetails.put(pledgeObjectDetails); - pledgedNodes = nodesToPledgeTokens; - // for (int i = 0; i < tokenObject.getString("tokenHash"); i++) { - // } - if (abort) { - qOut.println("Abort"); - PledgeInitiatorLogger.debug("Quorum " + quorumID + " Aborted as already Pledged"); - return abort; - } else { - qOut.println(newChains.toString()); - PledgeInitiatorLogger.debug("Quorum " + quorumID + " Pledged"); - } - } else { - PledgeInitiatorLogger.debug("8. Setting abort to true"); - abortReason.put("Quorum", quorumID); - abortReason.put("Reason", "Response is null"); - abort = true; - qSocket1.close(); - PledgeInitiatorLogger.debug("Alpha Quorum " + quorumID + " Replied Null (abort status true)"); - return abort; - } - - IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); - qSocket1.close(); - - } - - } - if (tokensPledged > 0) - abort = true; - - PledgeInitiatorLogger.debug("Quorum Verification with Tokens or Credits with Abort Status:" + Initiator.abort); - return abort; - } - - public static String fetchSign(JSONArray pledgeArray, String hash) throws JSONException { - - String str = ""; - - for (int i = 0; i < pledgeArray.length(); i++) { - JSONObject pledgeObject = pledgeArray.getJSONObject(i); - Iterator keys = pledgeObject.keys(); - - //PledgeInitiatorLogger.debug("!@#$%^& The object is " + pledgeObject.toString()); - String key = ""; - while (keys.hasNext()) { - key = keys.next(); - PledgeInitiatorLogger.debug("!@#$%^& key of quorumn is " + key); - if (pledgeObject.get(key) instanceof JSONArray) { - // do something with jsonObject here - - JSONArray hashArray = new JSONArray(pledgeObject.get(key).toString()); - PledgeInitiatorLogger.debug("!@#$%^& hash array: " + hashArray); - - for (int l = 0; l < hashArray.length(); l++) { - JSONObject hashObject = hashArray.getJSONObject(l); - PledgeInitiatorLogger.debug("!@#$%^& hash object: " + hashObject); - String signString = hashObject.getString("sign"); - String hashString = hashObject.getString("hash"); - - if (hashString.equals(hash)) { - str = signString; - return str; - } - PledgeInitiatorLogger.debug("signString is " + signString); - PledgeInitiatorLogger.debug("hashString is " + hashString); - } - } - } - - } - - return str; - } + pledged = Unpledge.verifyProof(tokenName, did, tidForProof); + + if (!pledged) { + PledgeInitiatorLogger.debug("PoW not Verified"); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); + qSocket.close(); + }else { + PledgeInitiatorLogger.debug("PoW verified"); + JSONObject pledgeNewObject = new JSONObject(); + pledgeNewObject.put("sender", sender); + pledgeNewObject.put("receiver", receiver); + pledgeNewObject.put("tid", tid); + pledgeNewObject.put("pledgeToken", tokenObject.getString("tokenHash")); + pledgeNewObject.put("tokensPledgedFor", tokenList); + pledgeNewObject.put("tokensPledgedWith", tokenObject.getString("tokenHash")); + pledgeNewObject.put("distributedObject", new JSONObject()); + + pledgedTokensArray.put(tokenObject.getString("tokenHash")); + + tokenChain.put(pledgeNewObject); + String chainHashString = calculateHash(tokenChain.toString(), "SHA3-256"); + hashesArray.put(chainHashString); + } + + } else { + PledgeInitiatorLogger.debug("The token does not have PoW"); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); + qSocket.close(); + } + } else { + JSONObject pledgeNewObject = new JSONObject(); + pledgeNewObject.put("sender", sender); + pledgeNewObject.put("receiver", receiver); + pledgeNewObject.put("tid", tid); + pledgeNewObject.put("pledgeToken", tokenObject.getString("tokenHash")); + pledgeNewObject.put("tokensPledgedFor", tokenList); + pledgeNewObject.put("tokensPledgedWith", tokenObject.getString("tokenHash")); + pledgeNewObject.put("distributedObject", new JSONObject()); + + + pledgedTokensArray.put(tokenObject.getString("tokenHash")); + tokenChain.put(pledgeNewObject); + String chainHashString = calculateHash(tokenChain.toString(), "SHA3-256"); + hashesArray.put(chainHashString); + + } + } + quorumHashObject.put(quorumID, hashesArray); + quorumWithHashesArray.put(quorumHashObject); + quorumDetails.put("tokenDetails", tokenDetails); + + PledgeInitiatorLogger.debug("tokensCount: " + tokensCount); + quorumDetails.put("ID", quorumID); + quorumDetails.put("count", tokenDetails.length()); + nodesToPledgeTokens.put(quorumDetails); + tokensCount -= tokenDetails.length(); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); + qSocket.close(); + PledgeInitiatorLogger.debug("tokensCount: " + tokensCount); + if (tokensCount == 0) + break; + + } else { + PledgeInitiatorLogger.debug("Quorum " + quorumID + " is not pledging tokens"); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); + qSocket.close(); + + } + } else { + PledgeInitiatorLogger.debug("Quorum " + quorumID + " Response is null"); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); + qSocket.close(); + } + } + + closeAllConnections(alphaList); + PledgeInitiatorLogger.debug("Token Count: " + tokensCount); + if (tokensCount > 0) { + PledgeInitiatorLogger.debug("Quorum nodes with lesser tokens to pledge, Exiting..."); + return true; + }else { + distributePledgeTokens(tokenList, pledgedTokensArray); + return false; + } + } + + public static boolean pledge(JSONArray pledgeDetails, double amount, int PORT) + throws JSONException, UnknownHostException, IOException { + pledgedTokensArray = new JSONArray(); + + Double tokensPledged = amount; + //PledgeInitiatorLogger.debug("pledgeDetails in pledge is " + pledgeDetails.toString()); + + if (!abort) { + PledgeInitiatorLogger.debug("Initating pledging"); + // PledgeInitiatorLogger.debug("Tokens can be pledged from " + + // nodesToPledgeTokens); + for (int j = 0; j < nodesToPledgeTokens.length(); j++) { + String quorumID = nodesToPledgeTokens.getJSONObject(j).getString("ID"); + String appName = quorumID.concat("alphaPledge"); + + PledgeInitiatorLogger.debug("Quorum " + quorumID + " pledging"); + PledgeInitiatorLogger.debug("Quorum ID " + quorumID + " AppName " + appName); + forward(appName, PORT, quorumID); + PledgeInitiatorLogger + .debug("Connected to " + quorumID + "on port " + (PORT) + "with AppName" + appName); + + Socket qSocket1 = new Socket("127.0.0.1", PORT); + BufferedReader qIn = new BufferedReader(new InputStreamReader(qSocket1.getInputStream())); + PrintStream qOut = new PrintStream(qSocket1.getOutputStream()); + + JSONObject object = new JSONObject(); + object.put("PledgeTokens", true); + object.put("amount", nodesToPledgeTokens.getJSONObject(j).getInt("count")); + object.put("senderPID", getPeerID(DATA_PATH.concat("DID.json"))); + qOut.println(object.toString()); + PledgeInitiatorLogger.debug("Sent request to alpha node: " + quorumID + ": " + object.toString()); + + String qResponse = ""; + try { + qResponse = qIn.readLine(); + } catch (SocketException e) { + PledgeInitiatorLogger.warn("Quorum " + quorumID + " is unable to respond!"); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); + } + + JSONArray tokens = new JSONArray(); + if (qResponse != null) { + JSONArray tokenDetails = new JSONArray(qResponse); + //PledgeInitiatorLogger.debug("TokenDetails is " + tokenDetails.toString()); + JSONArray newChains = new JSONArray(); + for (int k = 0; k < tokenDetails.length(); k++) { + JSONObject tokenObject = tokenDetails.getJSONObject(k); + JSONArray tokenChain = tokenObject.getJSONArray("chain"); + String tokenHash = tokenObject.getString("tokenHash"); + PledgeInitiatorLogger.debug(tokenHash); + PledgeInitiatorLogger.debug("in json " + tokenObject.getString("tokenHash")); + + JSONObject lastObject = tokenChain.getJSONObject(tokenChain.length() - 1); + PledgeInitiatorLogger.debug("tokenHash is " + tokenHash); + + if (lastObject.optString("pledgeToken").length() > 0 && !pledged) { + PledgeInitiatorLogger + .debug("Quorum " + quorumID + " sent a token which is already pledged"); + abortReason.put("Quorum", quorumID); + abortReason.put("Reason", "Token " + tokenHash + " has been already pledged"); + abort = true; + qSocket1.close(); + return abort; + + } else { + JSONObject pledgeObject = new JSONObject(); + pledgeObject.put("sender", sender); + pledgeObject.put("receiver", receiver); + pledgeObject.put("tid", tid); + pledgeObject.put("pledgeToken", tokenHash); + pledgeObject.put("tokensPledgedFor", tokenList); + pledgeObject.put("tokensPledgedWith", tokenObject.getString("tokenHash")); + pledgeObject.put("distributedObject", new JSONObject()); + tokenChain.put(pledgeObject); + + pledgedTokensArray.put(tokenObject.getString("tokenHash")); + + // lastObject.put("pledgeToken", dataObject.getString("tid")); + // + // tokenChain.remove(0); + // JSONArray newTokenChain = new JSONArray(); + // newTokenChain.put(lastObject); + // for (int l = 0; l < tokenChain.length(); l++) { + // newTokenChain.put(tokenChain.getJSONObject(l)); + // } + PrivateKey pvtKey = getPvtKey(keyPass, 1); + + String hashForTokenChain = calculateHash(tokenChain.toString(), "SHA3-256"); + /* FileWriter spfile = new FileWriter( + WALLET_DATA_PATH.concat("/hashForTokenChain").concat(tid).concat(".json")); + spfile.write(tokenChain.toString()); + spfile.close(); */ + + + // for (int i = 0; i < pledgeDetails.length(); i++) { + + //PledgeInitiatorLogger.debug("!@#$%^& pledgeDetails is " + pledgeDetails.getJSONObject(j)); + + //PledgeInitiatorLogger.debug("!@#$%^& hashForTokenChain is "+ hashForTokenChain); + + tokenChain.remove(tokenChain.length() - 1); + /* FileWriter pfile = new FileWriter( + WALLET_DATA_PATH.concat("/hashForTokenChainRemoved").concat(tid).concat(".json")); + pfile.write(tokenChain.toString()); + pfile.close(); */ + + + //PledgeInitiatorLogger.debug("!@#$%^& hashForTokenChain after removing new last object "+ calculateHash(tokenChain.toString(), "SHA3-256")); + + pledgeObject.put("hash", hashForTokenChain); + pledgeObject.put("pvtShareBits", fetchSign(pledgeDetails, hashForTokenChain)); + + //PledgeInitiatorLogger.debug("pledgeObject is " + pledgeObject.toString()); + + // pledgeObject.put("pvtKeySign", PvtKeySign); + + tokenChain.put(pledgeObject); + newChains.put(tokenChain); + + tokensPledged -= nodesToPledgeTokens.getJSONObject(j).getInt("count"); + tokens.put(tokenHash); + + //PledgeInitiatorLogger.debug("newChains length is " + newChains.length()); +// //PledgeInitiatorLogger.debug("newChains is " + newChains.toString()); + } + } + JSONObject nodesWithTokensObject = new JSONObject(); + nodesWithTokensObject.put("node", nodesToPledgeTokens.getJSONObject(j).getString("ID")); + nodesWithTokensObject.put("tokens", pledgedTokensArray); + pledgedTokensWithNodesArray.put(nodesWithTokensObject); + + /* + * JSONObject jsonObject = pledgeDetails.getJSONObject(j); Iterator keys + * = jsonObject.keys(); + * + * PledgeInitiatorLogger.debug("!@#$%^& The object is " + + * jsonObject.toString()); String key = ""; while (keys.hasNext()) { key = + * keys.next(); PledgeInitiatorLogger.debug("!@#$%^& key of quorumn is " + key); + * if (jsonObject.get(key) instanceof JSONArray) { // do something with + * jsonObject here + * + * JSONArray hashArray = new JSONArray(jsonObject.get(key).toString()); + * PledgeInitiatorLogger.debug("!@#$%^& hash array: " + hashArray); + * + * for(int l = 0; l < hashArray.length(); l++) { JSONObject hashObject = + * hashArray.getJSONObject(k); + * PledgeInitiatorLogger.debug("!@#$%^& hash object: " + hashObject); + * + * + * signString = hashObject.getString("sign"); hashString = + * hashObject.getString("hash"); + * + * PledgeInitiatorLogger.debug("signString is " + signString); + * PledgeInitiatorLogger.debug("hashString is " + hashString); + * + * // TODO tokenChain.remove(tokenChain.length() - 1); pledgeObject.put("hash", + * hashString); pledgeObject.put("pvtShareBits", signString); // + * pledgeObject.put("pvtKeySign", PvtKeySign); + * + * tokenChain.put(pledgeObject); newChains.put(tokenChain); + * + * tokensPledged -= nodesToPledgeTokens.getJSONObject(j).getInt("count"); + * tokens.put(tokenHash); + * + * } PledgeInitiatorLogger.debug("newChains length is "+newChains.length()); + * PledgeInitiatorLogger.debug("newChains is "+newChains.toString()); } } + */ + + // } + + // } + // } + JSONObject pledgeObjectDetails = new JSONObject(); + pledgeObjectDetails.put("did", quorumID); + pledgeObjectDetails.put("tokens", tokens); + pledgeDetails.put(pledgeObjectDetails); + pledgedNodes = nodesToPledgeTokens; + // for (int i = 0; i < tokenObject.getString("tokenHash"); i++) { + // } + if (abort) { + qOut.println("Abort"); + PledgeInitiatorLogger.debug("Quorum " + quorumID + " Aborted as already Pledged"); + return abort; + } else { + qOut.println(newChains.toString()); + PledgeInitiatorLogger.debug("Quorum " + quorumID + " Pledged"); + } + } else { + PledgeInitiatorLogger.debug("8. Setting abort to true"); + abortReason.put("Quorum", quorumID); + abortReason.put("Reason", "Response is null"); + abort = true; + qSocket1.close(); + PledgeInitiatorLogger.debug("Alpha Quorum " + quorumID + " Replied Null (abort status true)"); + return abort; + } + + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); + qSocket1.close(); + + } + + } + closeAllConnections(alphaList); + distributePledgeTokens(tokenList, pledgedTokensArray); + if (tokensPledged > 0) + abort = true; + + PledgeInitiatorLogger.debug("Quorum Verification with Tokens or Credits with Abort Status:" + Initiator.abort); + return abort; + } + + public static void closeAllConnections(JSONArray nodes){ + for(int i = 0; i < nodes.length(); i++){ + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + nodes.getString(i)); + } + } + + public static boolean distributePledgeTokens(JSONArray transferTokens, JSONArray pledgedTokens){ + distributedObject = new JSONObject(); + + PledgeInitiatorLogger.debug("<1> Transfer tokens: " + transferTokens); + PledgeInitiatorLogger.debug("<1> Pledge tokens: " + pledgedTokens); + + if(transferTokens.length() > pledgedTokens.length()) { + PledgeInitiatorLogger.debug("Only Whole Tokens"); + String partPledgedTokenString = pledgedTokens.getString(pledgedTokens.length()-1); + pledgedTokens.remove(pledgedTokens.length()-1); + + PledgeInitiatorLogger.debug("<2> Transfer tokens: " + transferTokens); + PledgeInitiatorLogger.debug("<2> Pledge tokens: " + pledgedTokens); + for(int i = 0; i < transferTokens.length(); i++) { + distributedObject.put(transferTokens.getString(i), pledgedTokens.getString(i)); + transferTokens.remove(i); + } + + PledgeInitiatorLogger.debug("<3> Transfer tokens: " + transferTokens); + PledgeInitiatorLogger.debug("<3> Pledge tokens: " + pledgedTokens); + + for (int i = 0; i < transferTokens.length(); i++) + distributedObject.put(transferTokens.getString(i), partPledgedTokenString); + + }else { + PledgeInitiatorLogger.debug("Parts Tokens Included"); + for(int i = 0; i < transferTokens.length(); i++) { + distributedObject.put(transferTokens.getString(i), pledgedTokens.getString(i)); + } + PledgeInitiatorLogger.debug("<4> Transfer tokens: " + transferTokens); + PledgeInitiatorLogger.debug("<4> Pledge tokens: " + pledgedTokens); + } + + return true; + } + + public static String fetchSign(JSONArray pledgeArray, String hash) throws JSONException { + + String str = ""; + + for (int i = 0; i < pledgeArray.length(); i++) { + JSONObject pledgeObject = pledgeArray.getJSONObject(i); + Iterator keys = pledgeObject.keys(); + + //PledgeInitiatorLogger.debug("!@#$%^& The object is " + pledgeObject.toString()); + String key = ""; + while (keys.hasNext()) { + key = keys.next(); + PledgeInitiatorLogger.debug("!@#$%^& key of quorumn is " + key); + if (pledgeObject.get(key) instanceof JSONArray) { + // do something with jsonObject here + + JSONArray hashArray = new JSONArray(pledgeObject.get(key).toString()); + PledgeInitiatorLogger.debug("!@#$%^& hash array: " + hashArray); + + for (int l = 0; l < hashArray.length(); l++) { + JSONObject hashObject = hashArray.getJSONObject(l); + PledgeInitiatorLogger.debug("!@#$%^& hash object: " + hashObject); + String signString = hashObject.getString("sign"); + String hashString = hashObject.getString("hash"); + + if (hashString.equals(hash)) { + str = signString; + return str; + } + PledgeInitiatorLogger.debug("signString is " + signString); + PledgeInitiatorLogger.debug("hashString is " + hashString); + } + } + } + + } + + return str; + } }